Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема считывания информации из входного потока 
V
    Опции темы
Compositum
Дата 13.5.2013, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Доброго времени суток.
Код

#include "../../std_lib_facilities.h"
int main(){
    try{
        vector<int>items;
        const string prompt1("Пожалуйста, введите несколько чисел (для прекращения ввода " 
            "нажмите клавишу <|>:\n");        
        cout << prompt1;
        int n = 0;
        while(cin >> n) items.push_back(n);
        if(!items.size()){
            cout << "Данные для обработки не были введены." << endl;
            return 0;
        }
        const string prompt2("Пожалуйста, укажите количество чисел, которые хотите " 
                      "просуммировать: ");
        cout << prompt2;
        while(cin >> n){
            if (n <= 0 || n > items.size()){
                cout << "Количество должно быть в интервале от 1 до " << items.size() << '.' 
                    << endl;
                cout << prompt2;
                continue;
            }
            int sum = 0;
            cout << endl << "Сумма первых " << n << " чисел: ";
            for(int i = 0; i < n; ++i){
                cout << items[i] << (i != n - 1) ? ", " : "";
                sum += items[i];
            }
            cout << " равна " << sum << "." << endl << endl;
            cout << prompt2;
        }
    }
    catch(exception& e){
        cout << e.what() << endl;
        return 1;
    }
    catch(...){
        cout << "Неизвестное исключение." << endl;
        return 2;
    }
    return 0;
}


В приведённом выше коде, после запроса "Пожалуйста, укажите количество чисел, которые хотите просуммировать: ", программа сразу же завершает свою работу. Подозреваю, что в следующей строке кода:
Код

while(cin >> n){

переменной n из потока повторно считывается символ "|", с помощью которого перед этим был завершён ввод исходных данных (возможно ошибаюсь). Как в C++ правильно обойти эту проблему?

Спасибо.
PM   Вверх
KaZepKa
Дата 13.5.2013, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



На первый взгляд не хватает break в цикле, continue же начинает след. виток цикла
PM MAIL   Вверх
Compositum
Дата 13.5.2013, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Цитата(KaZepKa @ 13.5.2013,  20:25)
На первый взгляд не хватает break в цикле, continue же начинает след. виток цикла

программа даже не входит в цикл, т.к. судя по всему условие входа в него изначально не выполнено. Мне нужен именно continue, поскольку я хочу не прервать цикл, а дать пользователю возможность повторно выполнить запрос.
PM   Вверх
KaZepKa
Дата 13.5.2013, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



а попробуй перед 2м циклом почисти cin
Вроде:
Код

 fflush(cin);

PM MAIL   Вверх
Compositum
Дата 14.5.2013, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Вопрос решён. Рабочий вариант такой:
Код

#include "../../std_lib_facilities.h"
int main(){
    try{
        vector<int>items;
        const string prompt1("Пожалуйста, введите несколько чисел (для прекращения ввода " 
            "нажмите клавишу <|>:\n");        
        cout << prompt1;
        int n = 0;
        while(cin >> n) items.push_back(n);
        if(!items.size()){
            cout << "Данные для обработки не были введены." << endl;
            return 0;
        }
        const string prompt2("Пожалуйста, укажите количество чисел, которые хотите "
             "просуммировать: ");
        cout << prompt2;
        cin.clear();
        char c = ' ';
        cin >> c;
        while(cin >> n){
            if (n <= 0 || n > items.size()){
                cout << "Количество должно быть в интервале от 1 до " << items.size() << '.' 
                    << endl;
                cout << prompt2;
                continue;
            }
            int sum = 0;
            cout << endl << "Сумма первых " << n << " чисел: ";
            for(int i = 0; i < n; ++i){
                cout << items[i] << ((i != n - 1) ? ", " : "");
                sum += items[i];
            }
            cout << " равна " << sum << "." << endl << endl;
            cout << prompt2;
        }
    }
    catch(exception& e){
        cout << e.what() << endl;
        return 1;
    }
    catch(...){
        cout << "Неизвестное исключение." << endl;
        return 2;
    }
    return 0;
}


Это сообщение отредактировал(а) Compositum - 14.5.2013, 11:16
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0766 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.