Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/140: Рейтинг темы: голосов - 140, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25

цикл while(cin)

07.01.2012, 17:09. Показов 28889. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.01.2012, 17:09
Ответы с готовыми решениями:

Как работает cin.peek, cin,get, cin.ignore, cin.clear?
Здравствуйте, товарищи и не товарищи!:) Я только начал изучать C++, а уже использую вещи, которые мне не понятны, и прошу объяснить, как...

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

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

18
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.01.2012, 17:39
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;
}
Миниатюры
цикл while(cin)  
0
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 12:01  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я думаю нужно заранее сообщить требуемое число элементов в векторе и осуществлять ввод.
спасибо.
допустим, пользователь не знает сколько чисел он хочет ввести. а для прекращения ввода нажимает ">" "<".
и "допустим" обязательное условие.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 12:05
Цитата Сообщение от ITTI Посмотреть сообщение
допустим, пользователь не знает сколько чисел он хочет ввести. а для прекращения ввода нажимает ">" "<".
и "допустим" обязательное условие.
- тогда нужно сразу это оговаривать, введите getchar и "закрывайте ввод" когда встретите этот символ или делайте ввод строк проверяйте strcmp на соответсвие или не соответсвие ">" "<" и если strcmp не выдаёт ноль то atoi преобразуйте строку в число и закидывайте в ваш вектор. Ещё одним вариантом может быть вопрос от программы на прекращение ввода после каждого введенного числа
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 12:11
Вот реализация через строку
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;
}
Миниатюры
цикл while(cin)  
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 12:12
-=ЮрА=-, полагаю, имелось в виду что-то вроде этого
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;
}
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
09.01.2012, 13:51
При проверке условия while(cin>>c) вызывается функция std::cin.operator void *(), вызов которой эквивалентен вызову !std::cin.fail().
Функция std::cin.fail() возвращает true при обнаружении ошибки, т.е. при установке в потоке флагов failbit или badbit.
При установке флага failbit последующие операции с потоком данных игнорируются, пока этот флаг не будет сброшен программой, т.е. в нашем случае нужно вызвать std::cin.clear().
1
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 14:37  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
делайте ввод строк проверяйте 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
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 14:43
Цитата Сообщение от ITTI Посмотреть сообщение
выбрала этот вариант. один вопрос: как прервать выполнение программы?
- ITTI, вы смотрели мой пост 5???Там рассмотрен именно вариант со строкой
0
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 14:52  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ITTI, вы смотрели...???
смотрела, но ваш вариант увидела после.
как прервать выполнение программы?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 14:56
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;
}
Миниатюры
цикл while(cin)  
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 14:57
Цитата Сообщение от ITTI Посмотреть сообщение
смотрела, но ваш вариант увидела после.
как прервать выполнение программы?
- ITTI, вы просто убили вопросом - абсолютно просто введите любой символ(например введите < т.е нажмите Shift+< и Enter)
Последний вариант(пост 11) думаю то что вы хотели никаких строк и прочего...
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.01.2012, 15:02
-=ЮрА=-, А я разве не это показал? Ввел массив, вывел(дабы показать, что все корректно вводимое там сохранилось) очистил поток, убрал \n, ввел число и вывел его(опять-же, чтобы показать, что поток вновь можно использовать). Имхо, ТС именно это и просил.
0
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 15:19  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- ITTI, вы просто убили вопросом - абсолютно просто введите любой символ(например введите < т.е нажмите Shift+< и Enter)
Последний вариант(пост 11) думаю то что вы хотели никаких строк и прочего...
да, пост 11 то самое. плохо убила. я не имела ввиду конкретный случай. к примеру, операторы, следующие за throw, никогда не выполнятся, как там прерывается программа?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 15:50
Цитата Сообщение от ITTI Посмотреть сообщение
к примеру, операторы, следующие за throw, никогда не выполнятся, как там прерывается программа?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!cin.fail())
- недопускаем добавление в вектор некорректной величины
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.clear();
- чистим поток (сбрасываем флаг ошибки потока ввода)
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.ignore();
- пропускаем введенное ранее значение, которое осталось в буфере от ввода cin>>c;
PS: перефразируйте вопрос м.б. вы не то хотели узнать

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

Не по теме:

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

0
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 16:10  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- недопускаем добавление в вектор некорректной величины
- чистим поток (сбрасываем флаг ошибки потока ввода)
- пропускаем введенное ранее значение, которое осталось в буфере от ввода cin>>c;
PS: перефразируйте вопрос м.б. вы не то хотели узнать

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

Не по теме:

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

спасибо за объяснения, я поняла, что было в программе, иначе спросила бы.
использую "std_lib_facilities.h"(стауструп "посоветовал"), там определена функция void error(string s) или как-то так, после ее выполнения программа прекращается.
вот в своей программе используешь "cerr" - сообщение появляется, но еще выполняется после цикла вот та часть, что уже не нужна. вот я и спрашиваю что засунуть после cerr, чтобы все "закрылось".

Не по теме:

выпал?

0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
09.01.2012, 16:43
Вообще без циклов
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
#include <iostream>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <limits>
#include <vector>
 
int main(){
    std::vector<int> vec;
    
    std::cout << "Enter some numbers (q for finish):" << std::endl;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(vec));
    
    std::cin.clear();
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
    int n;
    std::cout << "Number of elements to sum: ";
    std::cin >> n;
    
    if ( n < 1 || n > vec.size() )
        std::cerr << "Wrong value!" << std::endl;
    else
        std::cout << "Sum of first " << n << " elements: " << std::accumulate(vec.begin(), vec.begin() + n, 0) << std::endl;
    
    return 0;
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.01.2012, 18:12
Цитата Сообщение от ITTI Посмотреть сообщение
что засунуть после cerr, чтобы все "закрылось".
Если я вас правильно понял то
C++
1
2
3
4
5
if(some_error)
{
      cerr<<"Eror occured\n";
      return 1;//Завершили main и делов 0
}

Не по теме:

PS

Цитата Сообщение от ITTI Посмотреть сообщение
выпал?
- у вас общение какое-то потребительское, вам помогаешь а вам всё мало + требуете. Тут вам никто ничем не обязан запомните на будующее...

0
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
10.01.2012, 17:43  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если я вас правильно понял...
Спасибо.

Добавлено через 13 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Вообще без циклов
15. ...(std::numeric_limits<std::streamsize> ::max(), '\n');
объясни, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2012, 17:43
Помогаю со студенческими работами здесь

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

C++ Цикл не останавливается на cin >> n;
Имею код: ....... 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...

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru