Не могу разобраться в цикле (Простая задачка)

Модератор: Модераторы разделов

Ответить
Аватара пользователя
SwapON
Сообщения: 155
ОС: Arch linux => Gentoo

Не могу разобраться в цикле

Сообщение SwapON »

Вроде бы простая задачка, но я залип. Необходимо предоставить выбор пользователю и если он выберет то, чего нет в списке, предоставить снова выбор. Почему не работает условие в цикле...?

Код: Выделить всё

#include <iostream>
#include <string>
using namespace std;

int main(){

	int x = 0;

	while(x != 1 || x != 2 || x != 3){

		cout << "\n\tМеню ресторана\n";
		cout << endl;
		cout << "1. Картошка жареная\n";
		cout << "2. Картофельное пюре\n";
		cout << "3. Суп картофельный\n";
		cout << endl;
		cout << "Сделайте выбор от 1 до 3\n\n";
		
		cin >> x;

		if(x == 1)
			cout << "Ваш выбор - картошка жареная\n";
		else if(x == 2)
			cout << "Ваш выбор - картофельное пюре\n";
		else if(x == 3)
			cout << "Ваш выбор - cуп картофельный\n";
		else
			cout << "Неправильный выбор\n";
		}

	cout << "Приятного аппетита!\n";
}
Спасибо сказали:
math
Сообщения: 276
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Не могу разобраться в цикле

Сообщение math »

Потому что

Код: Выделить всё

x != 1 || x != 2 || x != 3
всегда true, для любого числа x.
Спасибо сказали:
Аватара пользователя
SwapON
Сообщения: 155
ОС: Arch linux => Gentoo

Re: Не могу разобраться в цикле

Сообщение SwapON »

math писал:
10.11.2022 07:07
Потому что

Код: Выделить всё

x != 1 || x != 2 || x != 3
всегда true, для любого числа x.
Ну почему же?

Код: Выделить всё

Пока(х не равно 1 или х не равно 2 или х не равно 3){
	Выполняй это действие
	Введите х
	если х == 1 (тут уже выполнилось условие цикла. Значит он должен прекратиться)
}
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2660
ОС: Gentoo

Re: Не могу разобраться в цикле

Сообщение ormorph »

Не придумывайте, у вас используется оператор или. Т. е. Если x==1, то выполняется другое условие (x! =2), а оно возвращает True, следовательно цикл продолжается.
Спасибо сказали:
math
Сообщения: 276
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Не могу разобраться в цикле

Сообщение math »

Потому что математика. Попробуйте поподставлять в это выражения числа вместо переменной икс. Например, число 1.
Спасибо сказали:
Аватара пользователя
SwapON
Сообщения: 155
ОС: Arch linux => Gentoo

Re: Не могу разобраться в цикле

Сообщение SwapON »

Дошло!
Чтобы цикл выполнялся, в его условии должно быть true. Поменял логическое ИЛИ на И и всё стало понятно. Если мы вводим не 1 и не 2 и не 3, то цикл прекращается и код идёт дальше. Сопсна что и требовалось.
P.S. маленькая, но победа!
P.P.S в огромном ЯП
Спасибо сказали:
math
Сообщения: 276
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Не могу разобраться в цикле

Сообщение math »

SwapON писал:
10.11.2022 08:28
Если мы вводим не 1 и не 2 и не 3, то цикл прекращается и код идёт дальше.
Только наоборот: если мы вводим не 1 и не 2 и не 3, то цикл продолжается и мы запрашиваем номер снова.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20799
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не могу разобраться в цикле

Сообщение Bizdelnick »

Офтопик, но используйте switch, глаза же вытекают это читать. И не нужно дважды выполнять все эти сравнения, для меню из 100 блюд Вы же не будете прописывать их все в условии цикла.

Код: Выделить всё

#include <iostream>
using namespace std;

int main() {
	int x = 0;

	while (x == 0) {
		cout << "\n\tМеню ресторана\n";
		cout << endl;
		cout << "1. Картошка жареная\n";
		cout << "2. Картофельное пюре\n";
		cout << "3. Суп картофельный\n";
		cout << endl;
		cout << "Сделайте выбор от 1 до 3\n\n";
		
		cin >> x;

		switch (x) {
		case 1:
			cout << "Ваш выбор - картошка жареная\n";
			break;
		case 2:
			cout << "Ваш выбор - картофельное пюре\n";
			break;
		case 3:
			cout << "Ваш выбор - cуп картофельный\n";
			break;
		default:
			cout << "Неправильный выбор\n";
			x = 0;
		}
	}

	cout << "Приятного аппетита!\n";
	return 0;
}
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
SwapON
Сообщения: 155
ОС: Arch linux => Gentoo

Re: Не могу разобраться в цикле

Сообщение SwapON »

Bizdelnick писал:
10.11.2022 15:13
Офтопик, но используйте switch...
Отличное решение, но уже выявлен баг. Если нажать вместо цифры букву, то цикл уходит в бесконечность.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20799
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Не могу разобраться в цикле

Сообщение Bizdelnick »

SwapON писал:
11.11.2022 01:18
Отличное решение, но уже выявлен баг. Если нажать вместо цифры букву, то цикл уходит в бесконечность.
Этот баг в Вашем коде уже был. Читайте учебник дальше, про то, как работает форматированный ввод. ☺
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить