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

Как правильно прервать/возобновить цикл - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.68
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
21.03.2011, 13:41     Как правильно прервать/возобновить цикл #1
Такая вот проблема: есть часто встречающаяся функция ввода вещественного массива (как правило, большого). При вводе не цифры приходится все начинать сначала, то есть, необходимо ввести проверку на число. А затем, необходимо (если введено не число) , чтобы цикл возобновился.
С проверкой разобрался, а вот как корректно возобновить цикл?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void inputmas (float x[I] [J], char im)
{
  int i,j;
 
cout << "\n‚Вводим массив" << im << "\n";
  for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
cout << im << " [" << i << " ][ " << j << " ] = ";
if (cin >> x[i][j])
{}
else
{
    cout<<"Вводим только числа";
    continue;
}
         }
}
Этот вариант не работает - при вводе не числа, дальнейший ввод невозможен
Спасибо всем, кто поможет!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 13:41     Как правильно прервать/возобновить цикл
Посмотрите здесь:

Цикл: правильно или нет? C++
задать правильно цикл ) C++
C++ как прервать работу функции???
C++ Как правильно записать цикл for?
C++ как прервать поток ввода, введя определенный символ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LaГushan
123 / 123 / 14
Регистрация: 12.03.2011
Сообщений: 227
21.03.2011, 16:31     Как правильно прервать/возобновить цикл #2
Ну вот. Я немного себе для наглядности, переделал ваш код, но суть та же
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
#include<iostream>
using namespace std;
int main()
{
     int i,j;
     int x[10][20];
     int J = 20;
     int I = 10;
 char im='a';
 int u;
 
cout << "\n‚Вводим массив" << im << endl;
  for (i=0; i<I; i++)
    for ( j=0; j < J; j++)
    {
cout << im << " [" << i << " ][ " << j << " ] = ";
cin >> u;  //вводим число
if (!cin.fail())  //если это на самом деле число
{
    x[i][j] = u;  //то заносим в матрицу
}
else
{
    j=j-1;  //а если нет, то возвращаемся на то место, где были
    cout << "Error" << "\n";
    cin.clear(); //очищаем поток
    std::cin.ignore(INT_MAX, '\n'); //удерживаем от дальнейшего выполнения
}
             }
     return 0;
}
Svid
 Аватар для Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
21.03.2011, 23:04  [ТС]     Как правильно прервать/возобновить цикл #3
Большое спасибо!
Я пока еще не сталкивался с cin.fail(), сейчас буду смотреть, но, на всякий случай, - для вещественного числа это тоже подойдет?

Добавлено через 5 минут
Уже проверил, работает!
Еще раз - спасибо!!

Добавлено через 3 часа 9 минут
LaГushan, пару вопросов, если не возражаете.
Пытался найти что-нибудь по cin.fail(), cin.clear() и cin.ignore(INT_MAX, '\n'), но на русском мало что встречается, а с английским у меня плохо.
Я правильно понял, что:
cin.fail() - возвращает ложь при ошибке ввода (то есть, в Вашем случае, когда u не int)?
Что такое "очищаем поток" (cin.clear() и что значит cin.ignore(INT_MAX, '\n')?
LaГushan
123 / 123 / 14
Регистрация: 12.03.2011
Сообщений: 227
22.03.2011, 00:09     Как правильно прервать/возобновить цикл #4
Svid,
Цитата Сообщение от Svid Посмотреть сообщение
cin.fail() - возвращает ложь при ошибке ввода (то есть, в Вашем случае, когда u не int)?
Что такое "очищаем поток" (cin.clear() и что значит cin.ignore(INT_MAX, '\n')?
про fail, в принципе да, по крайней мере понимаю примерно так же. Если ещё проще, то cin.fail возвращает false, если значение которое вводят, не соответствует переменной.
cin.clear(). Тут немного поспешил, сказав, что она очищает поток. Она сбрасывает биты ошибок.
cin.ignore(INT_MAX, '\n'). Отбрасывает символы до новой строки. Это кстати к данном случае, помогает избежать.
Я всё-таки нахожусь в процессе изучения C++, и тоже ещё не понимаю многих вещей, поэтому возможно где-то и ошибся в своём видении этих функций. Если что, надеюсь меня поправят более опытные форумчане)
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
22.03.2011, 07:59     Как правильно прервать/возобновить цикл #5
cin.fail() возвращает еденицу, если предыдущее чтение из потоко закончилось неудачей, но в потоке еще остались данные, которые можно попытаться обработать повторно.
cin.bad() возвращает еденицу, если чтение закончилось неудачей и оставшиеся символы повторно обработать невозможно.
cin.clear() сбрасывает флаги fail, bad, eof (при установленных флагах дальнейшая работа с потоком невозможна)
cin.ignore(count, delim) пропускает в потоке count символов или пока не встретит символ delim.
Yandex
Объявления
22.03.2011, 07:59     Как правильно прервать/возобновить цикл
Ответ Создать тему
Опции темы

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