Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2014, 19:03   #1
Anakin Skyywalker
Новичок
Джуниор
 
Регистрация: 24.08.2014
Сообщений: 1
По умолчанию происходит зацикливание если вводить не число

Решил задачу "про лифт в двухэтажном доме, смысл ее в том что чел садится на 1 этаже и едет на 2, дальше вводится параметр на каком этаже садится другой человек и если лифт находится на этом же этаже человек садится в него и едет на другой.Если же лифт на другом этаже в данный момент, то сначало перемещается лифт на нужный этаж а потом уже в него садится человек.
с клавиатуры вводится этаж 1 или 2 , другое цифровое значение выводит "Нет такого этажа".Все бы не чего но если вводить букву или символ происходит зацикливание.Помогите понять почему оно происходит. Приму и критику к своему коду.

Код:
  #include<iostream>
#include<conio.h>
using namespace std;
int main()
{
	setlocale(LC_ALL, "Russian");
	
	int people,lift=1;
	
	cout << "Введите на каком этаже человек:  ";
	for (int i = 0; i = i + 1;)
	
	{
		cin >> people;
		if (people == 1)
		{  
			if (lift == 1)
			{
				cout << " человек сел в лифт на 1 этаже" << endl;
				lift=2;
				
			}
			else
			{
				cout << "Лифт переместился на 1 этаж" << endl;
				cout << " человек сел в лифт на 1 этаже" << endl;
				lift = 2;
			}
			cout << "Лифт переместился на " << lift << " этаж" << endl;
		}
		
		
		
		else if (people==2)
		{
			if (lift == 2)
			{
				cout << " человек сел в лифт на 2 этаже" << endl;
				lift = 1;

			}
			else 
			{
				cout << "Лифт переместился на 2 этаж" << endl;
				cout << " человек сел в лифт на 2 этаже" << endl;
				lift = 1;
			}
			cout << "Лифт переместился на " << lift << " этаж" << endl;
		
		}

		else if (people !=1 && people !=2)
		{
			cout << "Нет такого этажа!!!" << endl;
		}
		cout << "Введите на каком этаже человек: " ;
	}
	_getch();
	return 0;
}

Последний раз редактировалось Stilet; 24.08.2014 в 19:54.
Anakin Skyywalker вне форума Ответить с цитированием
Старый 24.08.2014, 22:49   #2
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Сам новичок, но насколько понимаю, то это стандартное поведение cin. Просто необходима дополнительная обработка, что-то вроде:
Код:
do 
{
    cin.clear();
    cin.sync();
    cin>>people;
} while ( cin.fail() );
Этот код вставить вместо
Код:
    cin>>people;
Но, по-моему, тут есть много другого, что можно подправить.
Например, вечный цикл можно записать так:
Код:
while (true)
{

}
Gekan вне форума Ответить с цитированием
Старый 25.08.2014, 01:50   #3
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Такое поведение неудивительно, поскольку Вы пытаетесь прочитать в переменную число, а возвращается буква, поток принимает в таком случае ошибочный статус и дальнейшая работа с ним не представляется возможной.

Что бы исправить эту ситуацию, Вам нужно перед командой cin >> people; вписать сброс статуса потока, это делает функция cin.clear().
Однако, сброс состояния не поможет, потому что при следующей итерации чтение cin >> people; опять столкнется с прошлой проблемой, ведь команда cin.clear() лишь сбрасывает статус потока, но не очищает его.
Соответственно, нужно очистить поток, это делает команда cin.sync().

Но, следует сказать, что это решение является лишь "заглушкой" и не приемлемо в маломальски профессиональных кодах.

А заместо использования cin.sync() лучше использовать такую команду, подключив библиотеку <limits>:
cin.ignore(numeric_limits<streamsiz e>::max(), '\n');

Либо такую:
cin.ignore(cin.rdbuf()->in_avail());

Можно переписать Вашу программу вот так, более эстетично и эффективно:
Код:
#include <iostream>

int floors = 10, start_point = 1;
int elevator_cfloor, target_floor;
void move_elevator(int to);
int main()
{
	setlocale(LC_ALL,"");
	
	std::cout << "Запуск программы Лифт 2.0 : Нажмите в любой момент сочетание CTRL + C что бы завершить работу программы." << std::endl;
	std::cout << "Этажей доступно : " << floors << std::endl;
	elevator_cfloor = start_point;//set elevator start point
	for(;;)
	{
		std::cout << "Лифт сейчас на : " << elevator_cfloor << " этаже." << std::endl;
		std::cout << "Лифт готов к работе, на каком Вы этаже? : ";
		std::cin.sync();
		std::cin.clear();
		std::cin >> target_floor;
		if(target_floor > floors || target_floor <= 0)
		{
			std::cout << "Извините, но " << target_floor << " этажа у нас нет." << std::endl;
			continue;
		}
		if(target_floor != elevator_cfloor)
		{
			std::cout << "Окей, отправляю к Вам лифт." << std::endl;
			move_elevator(target_floor);
		}
		else
			std::cout << "Вам повезло, лифт находится на Вашем этаже, заходите." << std::endl;
		do{
			std::cout << "Теперь Вы в лифте, куда едем? : ";
			std::cin.sync();
			std::cin.clear();
			std::cin >> target_floor;
			if(target_floor > floors || target_floor <= 0)
				std::cout << "Извините, но " << target_floor << " этажа у нас нет." << std::endl;
			} while(target_floor > floors || target_floor <= 0);
		std::cout << "Лифт направлен на " << target_floor << " этаж, приятного путешествия." << std::endl;
		move_elevator(target_floor);
		std::cout << "Вы достигли " << target_floor << " этажа, лифт теперь свободен, продолжаем работу." << std::endl;
	}
}

void move_elevator(int to)
{
	int it = to-elevator_cfloor;
	if(it < 0)
		it = -it;
	for(int i = 0; i < it; i++)
	{
		if(elevator_cfloor < to)
			elevator_cfloor++;
		else if(elevator_cfloor > to)
			elevator_cfloor--;
		std::cout << "Лифт доехал до " << elevator_cfloor << " этажа." << std::endl;
	}
}

Последний раз редактировалось DakotaZ; 25.08.2014 в 02:55.
DakotaZ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести число. Если оно положительное, найти его квадратный корень. Если отрицательное - возвести в квадратВвести число. Если оно п FYNZIK Паскаль, Turbo Pascal, PascalABC.NET 1 18.02.2014 16:29
У меня происходит зацикливание?(Оператор switch(),циклы) zaira001002 Общие вопросы C/C++ 7 01.10.2013 10:40
Почему происходит зацикливание? Arigato Общие вопросы Delphi 8 29.04.2013 19:06
Дано трехзначное число. Если в сумме его цифр присутствует число 7,то число записать в зеркальном виде ( Паскаль ) Эля777 Помощь студентам 5 22.04.2013 23:23
вводить только число kursant95 Microsoft Office Excel 8 16.02.2011 13:01