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

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

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

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

07.01.2012, 17:09. Просмотров 3944. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 17:09     цикл while(cin)
Посмотрите здесь:

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

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

Не по теме:

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

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

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

Не по теме:

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

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

Не по теме:

выпал?

easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
09.01.2012, 16:43     цикл while(cin) #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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
09.01.2012, 18:12     цикл while(cin) #18
Цитата Сообщение от ITTI Посмотреть сообщение
что засунуть после cerr, чтобы все "закрылось".
Если я вас правильно понял то
C++
1
2
3
4
5
if(some_error)
{
      cerr<<"Eror occured\n";
      return 1;//Завершили main и делов 0
}

Не по теме:

PS

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2012, 17:43     цикл while(cin)
Еще ссылки по теме:

Что делает цикл "while(cin.getline(buf,l_buf))" ? C++
Cin.clear cin.ignore C++
C++ Останавливается цикл и иногда пропускает второй cin
C++ Выяснить почему после ввода первого элемента массива цикл не работает (std::cin в цикле for)
Безконечый цикл при использовании cin и getline() C++

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

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

Добавлено через 13 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Вообще без циклов
15. ...(std::numeric_limits<std::streamsize>::max(), '\n');
объясни, пожалуйста.
Yandex
Объявления
10.01.2012, 17:43     цикл while(cin)
Ответ Создать тему
Опции темы

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