#javascript
#javascript
Вопрос:
У меня есть это упражнение, в котором я изо всех сил пытаюсь понять логику для достижения результата, когда qty
больше 3:
Приложение для расчета цены пиццы (перечисленных ниже), которые будут приобретены в течение рекламного периода. Количество пицц будет введено пользователем.
- Одна большая пицца будет стоить $ 6,45.
- Две большие пиццы будут стоить 12,00 долларов.
- Три большие пиццы будут стоить 14,00 долларов.
- Четыре или более пиццы будут использовать комбинацию вышеуказанных цен, чтобы обеспечить лучшую цену для клиента. Например, лучшая цена за пять пицц будет две пиццы ($ 12,00) три пиццы ($ 14,00).
Алгоритм также должен учитывать все возможные ситуации, используя структуры последовательности, выбора и итерации.
Ниже приведен мой код на данный момент:
let calcOrder = () => {
// get inputs
var qty = document.getElementById("quantity").value;
var price = 6.45;
var price2 = 12.0;
var price3 = 14.0;
var totalPrice;
// validate missing, non-digit, negative inputs
if (qty == "") {
document.getElementById("message").innerHTML = "Missing input";
} else if (isNaN(qty)) {
document.getElementById("message").innerHTML = "Numbers only";
} else if (qty < 0) {
document.getElementById("message").innerHTML =
"Negative numbers are not allowed";
} else {
//calc total
if (qty == 1)
{
totalPrice = price;
}
else if (qty == 2)
{
totalPrice = price2;
}
else if (qty == 3)
{
totalPrice = price3;
}
//output total
document.getElementById("message").innerHTML =
`Total price is $${totalPrice}`;
}
// prevent form from submission
return false;
};
Спасибо
Ответ №1:
вы можете использовать операции деления и модуляции для расчета цены:
(в этом примере предполагается, что все проверки правильности ввода уже выполнены)
const qte = document.getElementById("quantity").value;
const price = 6.45;
const price2 = 12.0;
const price3 = 14.0;
let totalPrice;
const total3 = parseInt("" qte / 3 "", 10) * price3;
const total2 = parseInt("" (qte % 3) / 2 "", 10) * price2;
const total1 = parseInt("" ((qte % 3) % 2) "", 10) * price;
totalPrice = total1 total2 total3;
document.getElementById("message").innerHTML =
`Total price is $${totalPrice}`;
что на самом деле происходит в коде
ну, это базовая математика, если вы хотите знать, сколько 3 в вашем числе вы делите на 3 и берете целую часть или пол результата, базовое деление. например, 10 = 3*3 1 итак, в результате этого деления у вас есть 3. поскольку вы хотите использовать цену только за 3 пиццы в качестве высшего приоритета, вы делаете это деление, а затем умножаете на цену за 3.
затем приходит приоритет для цены 2 пиццы, но вас не интересует общее количество пицц, только то, что осталось после того, как вы заплатили по цене 3 пиццы, поэтому вы выполняете оператор mod (%) с 3, чтобы получить, осталось неоплаченным, например 8 = 3 * 2 2, это дает нам 2 пиццы, оставшиеся неоплаченными, поэтому вы применяете цену за 2 пиццы.
вы проверяете, осталась ли одна пицца после того, как вы заплатили за 2 пиццы (что произойдет, только если после оплаты за 3 осталась только одна пицца). если есть одна пицца, вы платите за нее, иначе вы ничего не добавляете.
ps: после оплаты пиццы, кратной трем, вы добавляете цену только за 2 пиццы или одну, но никогда за обе, иначе вместо этого будет применяться цена за 3 пиццы.
надеюсь, объяснение понятно, если нет, оставьте комментарий, и я постараюсь исправить то, что было непонятно.
Комментарии:
1. Почему
""
в начале и в конце каждого вычисления есть итоговый расчет?parseInt(qte / 3, 10)
будет работать нормально. Или, может быть, более описательноMath.floor(qte / 3)
.2. Math.floor тоже может работать, но parseInt требует строку в качестве параметра.
3. @chawkichalladia Если вы передаете не строку
toString()
, вызывается аргумент.parseInt({toString: () => "42"}, 10) //=> 42