Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.68
Svid
5 / 5 / 1
Регистрация: 02.03.2011
Сообщений: 40
#1

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

21.03.2011, 13:41. Просмотров 3676. Ответов 4
Метки нет (Все метки)

Такая вот проблема: есть часто встречающаяся функция ввода вещественного массива (как правило, большого). При вводе не цифры приходится все начинать сначала, то есть, необходимо ввести проверку на число. А затем, необходимо (если введено не число) , чтобы цикл возобновился.
С проверкой разобрался, а вот как корректно возобновить цикл?
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;
}
         }
}
Этот вариант не работает - при вводе не числа, дальнейший ввод невозможен
Спасибо всем, кто поможет!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 13:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно прервать/возобновить цикл (C++):

Как корректно прервать цикл? - C++
Вот цикл.Я спрашиваю &quot;Добавить еще?&quot;,пользователь жмет y или n и у меня сразу весь цикл делается (т.е. 10 раз выводит cout без ввода).Как...

Как прервать цикл используя условия ? - C++
Есть цикл for(double i=1;i&lt;=?;i++) { s+=pow(((2*i)+1),4.0); }Мне нужно чтобы он останавливался когда я задам условие...

Как прервать цикл при вводе 0, и начать расчет - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() { setlocale(LC_ALL,...

Как правильно записывать условные операторы и как прервать проверку при достижении результата? - C++
доброго времени суток форумчане, подскажите пожалуйста как остановить условие после правильно выполненного условия.#include &quot;stdafx.h&quot; ...

Как корректно прервать цикл? (нюансы использования циклов, операторов ветвления и оператора break) - C++
Здравствуйте! такая форма работает...цикл нормально прерывается for(double i=1; i&lt;=10; i++){ if(i==8) break; ...

Прервать цикл из цикла, вложенного в него - C++
Приветствуют. Собственно, вопрос в названии темы. for(int i = 1; i &lt;= 10; i++) for(int j = 1; j &lt;= 5; j++) { if(/* здесь условие...

4
LaГushan
124 / 124 / 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;
}
1
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')?
0
LaГushan
124 / 124 / 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++, и тоже ещё не понимаю многих вещей, поэтому возможно где-то и ошибся в своём видении этих функций. Если что, надеюсь меня поправят более опытные форумчане)
1
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
22.03.2011, 07:59 #5
cin.fail() возвращает еденицу, если предыдущее чтение из потоко закончилось неудачей, но в потоке еще остались данные, которые можно попытаться обработать повторно.
cin.bad() возвращает еденицу, если чтение закончилось неудачей и оставшиеся символы повторно обработать невозможно.
cin.clear() сбрасывает флаги fail, bad, eof (при установленных флагах дальнейшая работа с потоком невозможна)
cin.ignore(count, delim) пропускает в потоке count символов или пока не встретит символ delim.
2
22.03.2011, 07:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2011, 07:59
Привет! Вот еще темы с ответами:

Как правильно объединить цикл? - C++
Доброго времени суток! Как правильно объединить цикл? while (!(cin &gt;&gt; value_one_) || value_one_ &lt; 0 || value_one_) { cout &lt;&lt;...

Как правильно записать цикл for? - C++
Как правильно записать цикл чтобы он шел не с начала на конец а с конца на начало? Конкретно к этой задаче чтобы заменяло не первое...

Как правильно использовать цикл? - C++
Задача с экспонентами. Нужно найти следующее: ...

Цикл, как правильно сформулировать условие выхода - C++
Сразу прошу прощения за простейшие вопросы, но книжка еще в пути, учусь самостоятельно, для себя. Скажите, почему не работает такой цикл? ...


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

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

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