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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.67
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
#1

цикл while(cin) - C++

07.01.2012, 17:09. Просмотров 4357. Ответов 18
Метки нет (Все метки)

когда цикл заканчивается, то cin >> j; не работает. почему?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    int c;
    vector<int> num;
    while(cin>>c) {num.push_back(c);}
    cout << "Вы ввели " << num.size() << " чисел.\n";
    cout << "Сколько чисел вы хотите просуммировать?\n";
    int j;
    cin >> j;
    if (j<=0) error("слишком мало");
    if (j>num.size()) error("нету так много чисел");
    int sum=0;
    for (int i=0; i<j; ++i) sum+=num[i];
    cout << "Сумма первых " << j << " чисел: " << sum << endl;
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 17:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос цикл while(cin) (C++):

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync - C++
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод. Не пойму предназначение cin.get() !=...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() - C++
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не изучал, поэтому возникали некоторые проблемы....

Цикл и cin - C++
Здравствуйте. Уже сталкивался с подобной проблемой и никак не могу снова разобраться. При втором проходе цикла в функции add_data()...

C++ Цикл не останавливается на cin >> n; - C++
Имею код: ....... int n; cout &lt;&lt; &quot;Enter the quantity of clients (up to 10)&quot; &lt;&lt; endl; cin &gt;&gt; n; for ( ; n &lt; 1 || n &gt;...

цикл после cin - C++
вешается простая программа. если убрать for - работает если убрать ввод cin - работает вместе не хотят ((( #include &lt;stdio.h&gt; ...

Ошибка ( cin.get и цикл ) - C++
Решал задачу, почти заработала но ... Есть 2 кода : 1 - моя задача 2 - сделал для проверки в задачи № 1 (код № 1) чет плохо...

18
-=ЮрА=-
Заблокирован
Автор FAQ
07.01.2012, 17:39 #2
ITTI, как вы хотетите чтобы программа поняла что вы ввод окнчили(она должна мысли прочесть?). Я думаю нужно заранее сообщить требуемое число элементов в векторе и осуществлять ввод, вот что вышло
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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
    
    system("chcp 1251");
    cout<<"Введите количество чисел в векторе : ";
    int n;cin>>n;
    cout<<"Вводите числа\n";
    int i, c;
    vector<int> num;
    for(i = 0; i < n; i++)
    {
        cin>>c; 
        num.push_back(c);
    }
    cout << "Вы ввели " << num.size() << " чисел.\n";
    cout << "Сколько чисел вы хотите просуммировать?\n";
    int j;
    cin >> j;
    if (j<=0) 
        cerr<<"слишком мало\n";
    if (j > num.size()) 
        cerr<<"слишком много\n";
    int sum=0;
    for (i=0; i<j; i++) 
        sum += num[i];
    cout << "Сумма первых " << j << " чисел: " << sum << endl;
    system("pause");
    return 0;
}
0
Миниатюры
цикл while(cin)  
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 12:01  [ТС] #3
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я думаю нужно заранее сообщить требуемое число элементов в векторе и осуществлять ввод.
спасибо.
допустим, пользователь не знает сколько чисел он хочет ввести. а для прекращения ввода нажимает ">" "<".
и "допустим" обязательное условие.
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 12:05 #4
Цитата Сообщение от ITTI Посмотреть сообщение
допустим, пользователь не знает сколько чисел он хочет ввести. а для прекращения ввода нажимает ">" "<".
и "допустим" обязательное условие.
- тогда нужно сразу это оговаривать, введите getchar и "закрывайте ввод" когда встретите этот символ или делайте ввод строк проверяйте strcmp на соответсвие или не соответсвие ">" "<" и если strcmp не выдаёт ноль то atoi преобразуйте строку в число и закидывайте в ваш вектор. Ещё одним вариантом может быть вопрос от программы на прекращение ввода после каждого введенного числа
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 12:11 #5
Вот реализация через строку
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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
    char str[16];
    system("chcp 1251");
    cout<<"Вводите числа\n";
    vector<int> num;
    bool bContinue = true;
    while(bContinue)
    {
        cin.getline(str,16); 
        if(strcmp(str,"<") == 0 || strcmp(str,">") == 0)
            bContinue = false;
        else
            num.push_back(atoi(str));
    }
    cout << "Вы ввели " << num.size() << " чисел.\n";
    cout << "Сколько чисел вы хотите просуммировать?\n";
    int i, j;
    cin >> j;
    if (j<=0) 
                cerr<<"слишком мало\n";
    if (j > num.size()) 
                cerr<<"слишком много\n";
    int sum=0;
    for (i=0; i<j; i++) 
                sum += num[i];
    cout << "Сумма первых " << j << " чисел: " << sum << endl;
    system("pause");
    return 0;
}
0
Миниатюры
цикл while(cin)  
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 12:12 #6
-=ЮрА=-, полагаю, имелось в виду что-то вроде этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
 
int main()
{
    int a;
    std::vector<int> v;
    while(std::cin >> a)
        v.push_back(a);
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    std::cin.clear();
    std::cin.ignore();
    int b;
    std::cin >> b;
    std::cout << b << std::endl;
    return 0;
}
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
09.01.2012, 13:51 #7
При проверке условия while(cin>>c) вызывается функция std::cin.operator void *(), вызов которой эквивалентен вызову !std::cin.fail().
Функция std::cin.fail() возвращает true при обнаружении ошибки, т.е. при установке в потоке флагов failbit или badbit.
При установке флага failbit последующие операции с потоком данных игнорируются, пока этот флаг не будет сброшен программой, т.е. в нашем случае нужно вызвать std::cin.clear().
0
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 14:37  [ТС] #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
делайте ввод строк проверяйте strcmp на соответсвие или не соответсвие ">" "<" и если ...
выбрала этот вариант. один вопрос: как прервать выполнение программы?

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Вот реализация через строку
я и не видела. у меня как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    char c[10]; char* a=">"; char* b="<";
    vector<int> num;
    while(cin>>c) {
                  if (strcmp(c,a)!= 0 && strcmp(c,b) != 0)  
                  num.push_back(atoi(c)); else break;}
    cout << "Вы ввели " << num.size() << " чисел.\n";
    cout << "Сколько хотите просуммировать?\n";
    int j;
    cin >> j;
    if (j<=0) error("мало");
    if (j>num.size()) error("много");
    int sum=0;
    for (int i=0; i<j; ++i)    
    sum+=num[i];
    cout << "Сумма первых " << j << " чисел: " << sum << endl;
    system("pause");
    return 0;
}
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 14:43 #9
Цитата Сообщение от ITTI Посмотреть сообщение
выбрала этот вариант. один вопрос: как прервать выполнение программы?
- ITTI, вы смотрели мой пост 5???Там рассмотрен именно вариант со строкой
0
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 14:52  [ТС] #10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ITTI, вы смотрели...???
смотрела, но ваш вариант увидела после.
как прервать выполнение программы?
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 14:56 #11
soon, полагаю что ввиду имелось следующее
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
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
    system("chcp 1251");
    cout<<"Вводите числа\n";
    vector<int> num;
    int c;
    while(!cin.fail())
    {
        cin>>c; 
        if(!cin.fail())
            num.push_back(c);
    }
    cin.clear();
    cin.ignore();
    cout << "Вы ввели " << num.size() << " чисел.\n";
    cout << "Сколько чисел вы хотите просуммировать?\n";
    int i, j;
    cin >> j;
    if (j<=0) 
                cerr<<"слишком мало\n";
    if (j > num.size()) 
                cerr<<"слишком много\n";
    int sum=0;
    for (i=0; i<j; i++) 
                sum += num[i];
    cout << "Сумма первых " << j << " чисел: " << sum << endl;
    system("pause");
    return 0;
}
0
Миниатюры
цикл while(cin)  
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 14:57 #12
Цитата Сообщение от ITTI Посмотреть сообщение
смотрела, но ваш вариант увидела после.
как прервать выполнение программы?
- ITTI, вы просто убили вопросом - абсолютно просто введите любой символ(например введите < т.е нажмите Shift+< и Enter)
Последний вариант(пост 11) думаю то что вы хотели никаких строк и прочего...
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 15:02 #13
-=ЮрА=-, А я разве не это показал? Ввел массив, вывел(дабы показать, что все корректно вводимое там сохранилось) очистил поток, убрал \n, ввел число и вывел его(опять-же, чтобы показать, что поток вновь можно использовать). Имхо, ТС именно это и просил.
0
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 15:19  [ТС] #14
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ITTI, вы просто убили вопросом - абсолютно просто введите любой символ(например введите < т.е нажмите Shift+< и Enter)
Последний вариант(пост 11) думаю то что вы хотели никаких строк и прочего...
да, пост 11 то самое. плохо убила. я не имела ввиду конкретный случай. к примеру, операторы, следующие за throw, никогда не выполнятся, как там прерывается программа?
0
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 15:50 #15
Цитата Сообщение от ITTI Посмотреть сообщение
к примеру, операторы, следующие за throw, никогда не выполнятся, как там прерывается программа?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!cin.fail())
- недопускаем добавление в вектор некорректной величины
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
- чистим поток (сбрасываем флаг ошибки потока ввода)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.ignore();
- пропускаем введенное ранее значение, которое осталось в буфере от ввода cin>>c;
PS: перефразируйте вопрос м.б. вы не то хотели узнать

Добавлено через 1 минуту

Не по теме:

PSPS:Ещё пару "выстрелов" и я просто "выпаду" из топика...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2012, 15:50
Привет! Вот еще темы с ответами:

Ввод данных используя цикл while (cin >> ) - C++
Здравствуйте, не могу разобрать, как работает одна из инструкций данной программы. Строка с циклом while ( inFile &gt;&gt; str1 ) В данном...

Ввод данных используя цикл while (cin >> ) - C++
Здравствуйте, не могу разобрать, как работает одна из инструкций данной программы. Строка с циклом while ( inFile &gt;&gt; str1 ) В данном...

Останавливается цикл и иногда пропускает второй cin - C++
Проблема в названии темы. Программа должна класть в переменную slovo все буквы из s1, но доходит до первой &quot;не буквы&quot; и цикл...

Безконечый цикл при использовании cin и getline() - C++
Здравствуйте, Есть вот такой простенький кусок кода: string tempid; string tempname; string tempa; ...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
09.01.2012, 15:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru