Странное, как бы массив, но откуда он взялся и каким образом обрабатывается?
От: jia http://falsche-jade.livejournal.com
Дата: 15.08.13 19:25
Оценка:
Допустим у нас функция:

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

Это как?
--------------------------------------------
Владение русской орфографией — это как владение кунфу,
настоящие мастера не применяют его без необходимости.
Re: Странное, как бы массив, но откуда он взялся и каким образом обрабатывается?
От: Кодт Россия  
Дата: 15.08.13 21:20
Оценка: 3 (1)
Здравствуйте, jia, Вы писали:

<>

Очевидно, что консоль отдаёт в программу текст построчно.

Как только cin (или scanf, или getchar) обнаруживает, что входной буфер пуст, — передаётся управление операционной системе;
та ведёт с пользователем диалог, слушая нажатия кнопок и показывая, что пользователь вводит;
по нажатии кнопки enter или ctrl+z (в дос/виндоуз) или ctrl+d (в никсах) диалог завершается, и введённая строка уезжает в буфер входного потока.

Далее, cin или scanf разбирает поток, вычитывая оттуда число.
Нашлось число — обработал, вывел результат, полез за следующим числом.
И так далее, пока буфер не исчерпается.

Кстати говоря, совсем необязательно требовать от пользователя ввода специального числа (0).
Более правильно — распознавать конец файла.
Тогда, если пользователь направит в стандартный ввод что-либо из файла или из конвеера,
c:\blablabla\> printsquares.exe < numbers.txt
c:\blablabla\> numbers.exe | printsquares.exe

программа не зависнет и не засбоит в отсутствие этого самого 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;
}
Перекуём баги на фичи!
Re: Странное, как бы массив, но откуда он взялся и каким образом обрабатывается?
От: jazzer Россия Skype: enerjazzer
Дата: 16.08.13 01:28
Оценка:
Здравствуйте, jia, Вы писали:

jia>Это как?


"cin >> input" выгребает поток до ближайшего пробела, после чего возвращается (и чтобы выгрести следующее, нужно опять позвать cin>>...).
Ну и дальше у тебя цикл
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Странное, как бы массив, но откуда он взялся и каким образом обрабатывает
От: jia http://falsche-jade.livejournal.com
Дата: 16.08.13 08:21
Оценка: :)
Здравствуйте, Кодт, Вы писали:

Спасибо за такой развёрнутый и подробный ответ,
не ожидал, тронут до глубины души.
--------------------------------------------
Владение русской орфографией — это как владение кунфу,
настоящие мастера не применяют его без необходимости.
Re[2]: Странное, как бы массив, но откуда он взялся и каким образом обрабатывает
От: jia http://falsche-jade.livejournal.com
Дата: 16.08.13 08:27
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, jia, Вы писали:


jia>>Это как?


J>"cin >> input" выгребает поток до ближайшего пробела, после чего возвращается (и чтобы выгрести следующее, нужно опять позвать cin>>...).

J>Ну и дальше у тебя цикл

Спасибо! Краткость сестра таланта!
--------------------------------------------
Владение русской орфографией — это как владение кунфу,
настоящие мастера не применяют его без необходимости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.