Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
1

цикл while(cin)

07.01.2012, 17:09. Просмотров 5874. Ответов 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
Ответы с готовыми решениями:

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

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

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

Цикл и cin
Здравствуйте. Уже сталкивался с подобной проблемой и никак не могу снова...

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

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
2546 / 1311 / 177
Регистрация: 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
Эксперт С++
3183 / 1710 / 435
Регистрация: 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
2546 / 1311 / 177
Регистрация: 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
ITTI
0 / 0 / 0
Регистрация: 02.01.2012
Сообщений: 25
09.01.2012, 16:10  [ТС] 16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- недопускаем добавление в вектор некорректной величины
- чистим поток (сбрасываем флаг ошибки потока ввода)
- пропускаем введенное ранее значение, которое осталось в буфере от ввода cin>>c;
PS: перефразируйте вопрос м.б. вы не то хотели узнать

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

Не по теме:

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

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

Не по теме:

выпал?

0
easybudda
Модератор
Эксперт CЭксперт С++
10152 / 6058 / 1523
Регистрация: 25.07.2009
Сообщений: 11,483
09.01.2012, 16:43 17
Вообще без циклов
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
09.01.2012, 18:12 18
Цитата Сообщение от ITTI Посмотреть сообщение
что засунуть после cerr, чтобы все "закрылось".
Если я вас правильно понял то
C++
1
2
3
4
5
if(some_error)
{
      cerr<<"Eror occured\n";
      return 1;//Завершили main и делов 0
}

Не по теме:

PS

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

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

Добавлено через 13 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Вообще без циклов
15. ...(std::numeric_limits<std::streamsize>::max(), '\n');
объясни, пожалуйста.
0
10.01.2012, 17:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2012, 17:43

цикл после cin
вешается простая программа. если убрать for - работает если убрать ввод cin -...

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

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