Форум программистов, компьютерный форум CyberForum.ru

Почему не останавливается цикл по требованию? - C++

Восстановить пароль Регистрация
 
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
20.08.2013, 20:39     Почему не останавливается цикл по требованию? #1
Здравствуйте!
Интересует вопрос по теме.
C++
1
2
3
4
5
6
7
8
9
10
for (int i = 2; !flag; ++i)
    {
            if (cin.get() == 'q')
                flag = true;
            else {
            cin.unget();
            cin>>p;
            price.push_back(p);
            cout<<"#"<<i<<":\n"; }
    }
При попадании q в поток cin цикл должен останавливаться.
Плз, не судите строго: я уже когда-то подобное спрашивал, но пока в учебнике до рассмотрения ввода/вывода не дошел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 20:39     Почему не останавливается цикл по требованию?
Посмотрите здесь:

C++ Почему цикл не заканчивается???
C++ Цикл почему-то не заканчивается.
Почему цикл выполняется бесконечно? C++
C++ Почему не работает цикл for
C++ Цикл не останавливается на cin >> n; C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fintt
 Аватар для Fintt
10 / 10 / 0
Регистрация: 13.02.2012
Сообщений: 94
20.08.2013, 20:41     Почему не останавливается цикл по требованию? #2
Мб после flag=true нужно "break"
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.08.2013, 20:58     Почему не останавливается цикл по требованию? #3
Цитата Сообщение от Fintt Посмотреть сообщение
Мб после flag=true нужно "break"
не надо

andrejap, а в чём выражена ошибка? Ты, когда вводишь q, enter нажимаешь?
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
20.08.2013, 21:15  [ТС]     Почему не останавливается цикл по требованию? #4
Если что, вся программа:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <std_lib_facilities.h>
#include <iostream>
 
 
double index (const vector<double>& pr, const vector<double>& we)
{
    double in = .0;
    if (we.size() > pr.size())
        throw runtime_error("We need pr.size() >= we.size()");
    else
    {
        for (int i = 0; i < we.size(); ++i)
            in+=pr[i]*we[i];
    }
    return in;
}
 
int main ()
{
    double p, w;
    vector<double> price, weight;
 
//==========================================
 
    cout << "Enter `price` value\n #1:\n";
    bool flag = false;
    for (int i = 2; !flag; ++i)
    {
            if (cin.get() == 'q')
                flag = true;
            else {
            cin.unget();
            cin>>p;
            price.push_back(p);
            cout<<"#"<<i<<":\n"; }
    }
    cout << "Yep, you just entered the data:";
    for (int i=0;i<price.size();++i)
        cout <<price[i] << ' ';
 
//==========================================
 
    cout << "\n\nNow, enter `weight` value\n #1:\n";
    for (int i = 2; cin.good(); ++i)
    {
            cin>>w;
            weight.push_back(w);
            cout<<"#"<<i<<":\n";
    }
    cout << "Yep, you just entered the data again:";
    for (int i=0;i<weight.size();++i)
        cout <<weight[i] << ' ';
 
//==========================================
 
    cout << index (price, weight);
}


Fintt, стоит условие прерывание - !flag, что аналогично flag == false.
Kuzia domovenok, нажимаю и тогда начинается перебор всего цикла, сейчас скрин покажу.

Добавлено через 13 минут
http://img835.imageshack.us/img835/2408/9bpa.png
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 21:58     Почему не останавливается цикл по требованию? #5
Если перед q стоит побел, то следующий непробельный символ для cin >> будет q (а ожидается цифра), поток ломается и cin.get() уже не считает q.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
20.08.2013, 23:19  [ТС]     Почему не останавливается цикл по требованию? #6
alsav22, эммм, может я чего не понял, но я пробелы не ставил при вводе.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
20.08.2013, 23:54     Почему не останавливается цикл по требованию? #7
Цитата Сообщение от andrejap Посмотреть сообщение
alsav22, эммм, может я чего не понял, но я пробелы не ставил при вводе.
Покажите как вводите.

Добавлено через 8 минут
Если не пробел, значит '\n'. Вот так если ввести:
123
234
345q
, то правильно отработает.
Если так:
123
234
345
q
, то нет.
Важно, что cin >> читает до пробельного символа (в данном случае до '\n') или, если чтение числа, до не цифры, далее cin.get() извлекает это символ, если q, то выход, если нет, то дальше cin >> должен читать цифру, идёт q. Поток ломается, cin.get() уже не будет работать.
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
21.08.2013, 00:40  [ТС]     Почему не останавливается цикл по требованию? #8
alsav22, спасибо! Понял примерно. Значит остановка реализовывается другим способом. Я могу предположить реализацию лишь через конвертацию содержимого потока, принимающего std::string, в double, но это не совсем рационально, наверное. Как проще поступить?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 00:43     Почему не останавливается цикл по требованию? #9
Цитата Сообщение от alsav22 Посмотреть сообщение
123
234
345
q
Ввод такой будет?
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
21.08.2013, 00:48  [ТС]     Почему не останавливается цикл по требованию? #10
да, предполагается такой.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 00:52     Почему не останавливается цикл по требованию? #11
Выход при вводе не числа:
C++
1
2
3
4
5
6
7
8
9
10
11
    double p, w;
    vector<double> price, weight;
    cout << "Enter `price` value\n #1:\n";
    
    for (int i = 2; cin >> p; ++i)
    {
            price.push_back(p);
            cout<<"#"<<i<<":\n";
    }
    cin.clear();
    while (cin.get() != '\n');
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
21.08.2013, 11:53  [ТС]     Почему не останавливается цикл по требованию? #12
Теперь, кажется, понял почему второй цикл у меня не отрабатывал: нужно было после первого поместить инструкцию "cin.clear();".

А зачем 12-я строчка Вашего листинга, alsav22?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.08.2013, 12:21     Почему не останавливается цикл по требованию? #13
Цитата Сообщение от andrejap Посмотреть сообщение
А зачем 12-я строчка Вашего листинга, alsav22?
Когда в потоке ввода возникает ошибка, то ввод прекращается, устанавливается флаг ошибки, невведённое остаётся в очереди ввода. cin.clear() сбрасывает фалаг ошибки (поток становится рабочим), а конструкция в 12 строке очищает очередь ввода: извлекает все символы, включая конечный '\n'. Это можно делать разными способами (например, используя cin.ignore()). Если этого не сделать, то, при следующей операции чтения, опять произойдёт ошибка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 15:46     Почему не останавливается цикл по требованию?
Еще ссылки по теме:

C++ Почему не выполняется цикл?
C++ Почему не входит в цикл?
C++ не понимаю почему цикл не заканчивается

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245
21.08.2013, 15:46  [ТС]     Почему не останавливается цикл по требованию? #14
Благодарю за разъяснения!
Yandex
Объявления
21.08.2013, 15:46     Почему не останавливается цикл по требованию?
Ответ Создать тему
Опции темы

Текущее время: 15:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru