1

Тема: Замовлення в столовій.

Потрібно написати програму:
Я замовляю якусь одну страву з трьох - картопля, паста, суп. Якщо немає перший раз, замовляю другу страву, якщо немає і третьої - тоді йду додому. Потрібна лише 1 страва.
Тільки треба якщо немає всіх страв видати повідомлення - йду додому голодний.
Програма чомусь не видає повідомлення. Допоможіть будь-ласка виправити цю помилку.
Треба використовувати if, else, while.

var count = 0;
(f1 = 'картопля'),
(hasF1 = Boolean(Math.floor(Math.random() * 2))),
(f2 = 'паста'),
(hasF2 = Boolean(Math.floor(Math.random() * 2))),
(f3 = 'суп'),
(hasF3 = Boolean(Math.floor(Math.random() * 2)));
foodchoice = prompt('виберіть страву');
if (hasF1 & (foodchoice == f1)) {
    alert('Є картопля. Смачного');
}
if ((foodchoice === f1) & !hasF1) {
    alert('картопля закінчилась');
    count++;
    window.location.reload();
}
if (hasF2 & (foodchoice === f2)) {
    alert('Є паста. Смачного');
}
if ((foodchoice === f2) & !hasF2) {
    alert('паста закінчилась');
    count++;

    window.location.reload();
}
if (hasF3 & (foodchoice === f3)) {
    alert('Є суп. Смачного');
}
if ((foodchoice === f3) & !hasF3) {
    alert('суп закінчився');
    count++;
    window.location.reload();
}
if (!hasF1 & !hasF2 & !hasF3 & (count === 3)) {
    alert('йду додому голодний');
}

2

Re: Замовлення в столовій.

В приведеному коді відсутній оператор вибору else.
Після першої умови мають бути else if

Приклад умовних операторів
if (Перша умова) {
  //  Блок з інструкціями що виконуються якщо перша умова істина
} else if (Друга умова) {
  //  блок з інструкціями що виконуються якщо перша умова не відповідає дійсності,
  //  а друга умова істина
} else {
  //  Блок з інструкціями що виконуються якщо всі попередні умови не відповідають
  //  дійсності (не виконані)
}
Посилання на англомовне джерело

3

Re: Замовлення в столовій.

Так має бути?

var count = 0;
(f1 = 'картопля'),
(hasF1 = Boolean(Math.floor(Math.random() * 2))),
(f2 = 'паста'),
(hasF2 = Boolean(Math.floor(Math.random() * 2))),
(f3 = 'суп'),
(hasF3 = Boolean(Math.floor(Math.random() * 2)));
foodchoice = prompt('виберіть страву');
if (hasF1 & (foodchoice == f1)) {
    alert('Є картопля. Смачного');
}
else if ((foodchoice === f1) & !hasF1) {
    alert('картопля закінчилась');
    count++;
    window.location.reload();
}
else if (hasF2 & (foodchoice === f2)) {
    alert('Є паста. Смачного');
}
else if ((foodchoice === f2) & !hasF2) {
    alert('паста закінчилась');
    count++;

    window.location.reload();
}
else if (hasF3 & (foodchoice === f3)) {
    alert('Є суп. Смачного');
}
else if ((foodchoice === f3) & !hasF3) {
    alert('суп закінчився');
    count++;
    window.location.reload();
}
else (!hasF1 & !hasF2 & !hasF3 & (count === 3)) {
    alert('йду додому голодний');
}

4

Re: Замовлення в столовій.

Ви не уважні. Останню умову можна не вказувати, інструкція після останнього else буде виконана якщо не виконані попередні.
Весь Ваш код не перевіряв. Відсутність else перше що привернуло увагу.

5

Re: Замовлення в столовій.

В JS є кілька способів проголошувати змінну.
Найгірший варіант - це проголошення без ключового слова. Таке проголошення створює глобальну змінну, яка потім впливає на весь код. Уникайте глобальних змінних, а особливо - створених десь глибоко в функціях. Не робіть так.
Другий варіант - var. Це створює локальну змінну в функції або, якщо проголошується на глобальному рівні - глобальні змінну.
Далі іде let. Це - найуживаніший варіант. Намагайтеся, як є можливість, використовувати або let, або const, бо вони живуть до кінця блоку і ви точно знаєте, коли вони зникнуть, і не будуть плутатися. const, як випливає з назви, проголошує константу, що вже не зміниться. Якщо не плануєте змінювати змінну - краще робіть її константою, це допоможе одразу виявити спробу її змінити замість довго шукати, чого ж якась залежна змінна неправильно обчислилася.
Наступне - булеві змінні. Перетворення цілого значення на булеве - цілком нормальна практика, але можна зробити це ще зрозумілішим, якщо використати якийсь із булевих операторів, наприклад

const hasF1 = (Math.random() > 0.5);

Бачите, як красиво? Порівняли випадкове число з 0.5 і результат порівняння записали в змінну. Дужки (необовз'язкові) підкреслюють, що нам потрібен саме результат порівняння.

Наступне питання - у вас є кілька значень, що відрізняються, фактично, лише цифрами в кінці. Що це таке? Це ж масив, а цифри - індекс. Зберіть страви в масив і в циклі порівнюйте із введеним значенням, якщо жодне не підійшло - виводьте про голодного. Ото й усе.

Подякували: Chemist-i1

6

Re: Замовлення в столовій.

В умовах if/else заміни & на &&

Подякували: koala1

7 Востаннє редагувалося koala (25.08.2021 10:09:45)

Re: Замовлення в столовій.

function ask_for_food()
{
    const FOODS = ['картопля','паста','суп'];
    let available_food = [];
    for(let food of FOODS)
        if(Math.random()>0.5)
            available_food.push(food);
    for(let retry=0;retry<3;retry++)
    {
        food_choice = prompt('виберіть страву');
        if(available_food.includes(food_choice))
        {
            alert('Є '+food_choice+'. Смачного');
            return;
        }
        else if(FOODS.includes(food_choice))
            alert(food_choice+' закінчилась.');
        else
            alert(food_choice+' у нас ніколи й не було.');
    }
    alert('йду додому голодний');
}
ask_for_food();

Якось так

8

Re: Замовлення в столовій.

Дуже дякую. А простіший приклад можна? Тільки з використанням умовних операторів і строки, без функцій.

9

Re: Замовлення в столовій.

Ну витягніть це все з функції. Тільки замість return доведеться ставити позначку, щоб не виводило про голодного.

10

Re: Замовлення в столовій.

і без масивів

11

Re: Замовлення в столовій.

Не вдячний. Даєш йому готовий код, а воно ще й читати код відмовляється.

Подякували: ch0r_t1

12 Востаннє редагувалося dot (25.08.2021 23:48:35)

Re: Замовлення в столовій.

Budj laska, podajte ctce makfri i kolu.

13

Re: Замовлення в столовій.

Тепер працює так як треба.

let f1 = 'картопля';
hasF1 = Math.floor(Math.random() * 2);
f2 = 'паста';
hasF2 = Math.floor(Math.random() * 2);
f3 = 'борщ';
hasF3 = Math.floor(Math.random() * 2);
foodchoice = prompt('виберіть страву');
if (foodchoice == f1) {
    if (hasF1) {
        alert('Є картопля.Смачного');
    } else {
        alert('немає картоплі');
    }
    window.location.reload();
} else if (foodchoice == f2) {
    if (hasF2) {
        alert('Є паста. Смачного');
    } else {
        alert('немає пасти');
    }
    window.location.reload();
} else if (foodchoice == f3) {
    if (hasF3) {
        alert('Є борщ. Смачного');
    } else {
        alert('борщу немає');
    }
    window.location.reload();
}
if (!hasF1 && !hasF2 && hasF3) {
    alert('буду голодний');
}

14 Востаннє редагувалося mamkin haker (27.08.2021 15:05:19)

Re: Замовлення в столовій.

koala написав:

В JS є кілька способів проголошувати змінну.
Найгірший варіант - це проголошення без ключового слова. Таке проголошення створює глобальну змінну, яка потім впливає на весь код. Уникайте глобальних змінних, а особливо - створених десь глибоко в функціях. Не робіть так.
Другий варіант - var. Це створює локальну змінну в функції або, якщо проголошується на глобальному рівні - глобальні змінну.
Далі іде let. Це - найуживаніший варіант. Намагайтеся, як є можливість, використовувати або let, або const, бо вони живуть до кінця блоку і ви точно знаєте, коли вони зникнуть, і не будуть плутатися. const, як випливає з назви, проголошує константу, що вже не зміниться. Якщо не плануєте змінювати змінну - краще робіть її константою, це допоможе одразу виявити спробу її змінити замість довго шукати, чого ж якась залежна змінна неправильно обчислилася.
Наступне - булеві змінні. Перетворення цілого значення на булеве - цілком нормальна практика, але можна зробити це ще зрозумілішим, якщо використати якийсь із булевих операторів, наприклад

const hasF1 = (Math.random() > 0.5);

Бачите, як красиво? Порівняли випадкове число з 0.5 і результат порівняння записали в змінну. Дужки (необовз'язкові) підкреслюють, що нам потрібен саме результат порівняння.

sasha87 написав:
let f1 = 'картопля';
hasF1 = Math.floor(Math.random() * 2);
f2 = 'паста';
hasF2 = Math.floor(Math.random() * 2);
f3 = 'борщ';
hasF3 = Math.floor(Math.random() * 2);
foodchoice = prompt('виберіть страву');
я написав:

????
невже так важко написати перед змінною let??
цеж не мова з статичною типізацією де потрібно тим даних писати