int WhileSchleife() { double input = 1 ; cout << "Расчет квадрата числа" << endl \ << "Введите число (0 выход из функции )" << endl; while ( input != 0 ) { cin >> input ; if ( input !=0 ) cout << "Величина квадрата " << input << " равна " << input*input << endl;
else cout << "Пока!" << endl;
}
}
Казалось бы никаких подводных камней, ввожу вместо одного числа несколько, и получаю корректный ответ:
Расчет квадрата числа Введите число (0 выход из функции ) 22 Величина квадрата 22 равна 484 23344 555 6677 778 7887 98272 Величина квадрата 23344 равна 5.44942e+08 Величина квадрата 555 равна 308025 Величина квадрата 6677 равна 4.45823e+07 Величина квадрата 778 равна 605284 Величина квадрата 7887 равна 6.22048e+07 Величина квадрата 98272 равна 9.65739e+09
Это как?
----------------------------------------------------------------------- Ответы с RSDN.ru: Очевидно, что консоль отдаёт в программу текст построчно.
Как только cin (или scanf, или getchar) обнаруживает, что входной буфер пуст, - передаётся управление операционной системе; та ведёт с пользователем диалог, слушая нажатия кнопок и показывая, что пользователь вводит; по нажатии кнопки enter или ctrl+z (в дос/виндоуз) или ctrl+d (в никсах) диалог завершается, и введённая строка уезжает в буфер входного потока.
Далее, cin или scanf разбирает поток, вычитывая оттуда число. Нашлось число - обработал, вывел результат, полез за следующим числом. И так далее, пока буфер не исчерпается.
Кстати говоря, совсем необязательно требовать от пользователя ввода специального числа (0). Более правильно - распознавать конец файла. Тогда, если пользователь направит в стандартный ввод что-либо из файла или из конвеера,
программа не зависнет и не засбоит в отсутствие этого самого 0, а штатным образом завершит работу.
Делается это очень просто
#ifdef THIS_IS_UNIX // надо смотреть документацию по компилятору, чтобы точно сказать, какое здесь условие #define EOF_CODE "Ctrl+D" // для юникс-среды (Linux, MacOS, Windows/MinGW, Windows/Cygwin) #else #define EOF_CODE "Ctrl+Z" // для виндоуза #endif
while(true) { if(isatty(0)) // если stdin подключён к консоли, а не направлен из файла или конвеера std::cout >> "введите число или нажмите " >> EOF_CODE >> " для выхода: "; // в противном случае нет смысла беседовать с пользователем, будем сразу читать и давать ответ
double number; std::cin >> number; if(!std::cin) // если конец файла или если введён мусор break; std::cout << "квадрат числа " << number << " = " << (number*number) << std::endl; }