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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 5.00
ProgressM
1 / 1 / 0
Регистрация: 13.10.2011
Сообщений: 5
#1

При использовании оператора GOTO зацикливается программа при введении букв. - C++

13.10.2011, 21:43. Просмотров 2800. Ответов 39
Метки нет (Все метки)

Приветствую всех новых знакомых в этом храме программирования. Я новичек, пытаюсь программировать в С++ недавно. У меня возник вопрос такого плана. При использовании оператора GOTO зацикливается программа при введении букв. Не могу узреть корень проблемы. Очень надеюсь на вашу помощь. Заранее благодарен .
Сама по себе программа простая:



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
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    double a, b;
l1:     
        cout << "Vvedi a b\n";
        cin >> a;
        cin >> b;
        
    if (cin.fail() || cin.bad() || a < 0 || b < 0 || a==0 || b==0)
    {
        //cin.clear();
        cout << "Error\n";
        goto l1;
    }
    else 
        {
            cout <<"S=" << a*b << "\n";
        }
        _getch();   
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 21:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При использовании оператора GOTO зацикливается программа при введении букв. (C++):

Вычислить функцию при использовании оператора for - C++
Вычислить f(x)=x^2+b, при x=-10,-9,...10 с использованием оператора for

При введении больше 20 чисел программа выдает странный результат - C++
#include &lt;iostream&gt; #include &lt;locale&gt; using namespace std; double t1, t2; int main() { setlocale(LC_ALL,...

Выход за пределы массива при использовании оператора new - C++
#include &lt;iostream&gt; using namespace std; int main() { int *i = new int; i= 1; cout &lt;&lt; i; return 0;

Выдается ошибка в std при использовании оператора for - C++
Написал программу с использованием оператора for на С++. Вот код: # include &lt;iosteam&gt; int main () { int sum = 0; for...

Ошибка при использовании оператора for в задаче с символьными строками - C++
При использовании оператора for, цикл почему-то первый раз дублируется, и вместо B раз получается b-1. Фэйл происходит в этом цикле. ...

Программа зацикливается при изменении всех 2 на 2 - C++
void ExchangeWord(List **ListPtr, int pozition, char *word){ //заменяет слово на позиции if(*ListPtr!=NULL){ // условие завершения...

39
Nameless One
14.10.2011, 05:17     При использовании оператора GOTO зацикливается программа при введении букв.
  #16

Не по теме:

Цитата Сообщение от ProgressM Посмотреть сообщение
При использовании оператора GOTO зацикливается программа при введении букв.
использование оператора goto оправдано только в некоторых случаях. Но вот организовывать с его помощью циклические конструкции - это однозначно плохо

0
Напильнег
480 / 118 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.10.2011, 11:19 #17
Цитата Сообщение от greeezz Посмотреть сообщение
Уважаемый ProgressM. Попробуйте использовать циклы вместо go to. Например в вашем случае цикл while достаточно уместен.
Уважаемый, повторяю - исходный код не работает не из-за goto. И ваш код работает не из-за применения while, а из-за того, что вы чистите поток функцией ignore (кстати, неграмотно Вы ее используете, но для практического применения сойдет). И оператор goto пишется слитно, кстати.

Добавлено через 4 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
использование оператора goto оправдано только в некоторых случаях
Ввод данных со сложной поверкой - это как раз тот случай, когда использование goto зачастую предпочтительнее, чем while(1) - continue - именно из соображений простоты и наглядности кода.

 Комментарий модератора 
Следите за выражениями. Цитата из правил несколько постов назад была.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 11:24 #18
Цитата Сообщение от Напильнег Посмотреть сообщение
именно из соображений простоты и наглядности кода.
Цитата Сообщение от Напильнег Посмотреть сообщение
наглядности
а вот это уже кому как
0
Напильнег
480 / 118 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.10.2011, 11:52 #19
Цитата Сообщение от Nameless One Посмотреть сообщение
а вот это уже кому как
Угу - те, кто реально писал сложный реальный код, и, кстати, возвращался к нему для правки через год-полтора, прекрасно осведомлены, что "гоу-то-боязнь" - штука весьма вредная. А у экспертов по решению задач из букваря мнение, как правило, другое.
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 12:01 #20
Цитата Сообщение от Напильнег Посмотреть сообщение
Угу - те, кто реально писал сложный реальный код
ну например (себя в пример можно не приводить)?
0
easybudda
14.10.2011, 12:14
  #21

Не по теме:

Цитата Сообщение от Напильнег Посмотреть сообщение
те, кто реально писал сложный реальный код...
Цитата Сообщение от Напильнег Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        double a, b;
l1:             
        cout << "Vvedite a b\n";
        cin >> a;
        cin >> b;
                
        if (!cin || a < 0 || b < 0 || a==0 || b==0)
        {
                cin.clear();
                cin >> noskipws; 
                while (cin.get()!='\n') ;
                cin >> skipws;
                cout << "Error\n";
                goto l1;
        }
        else 
        {
                cout << "S = " << a*b << "\n";
        }
Ну такое-то действительно найдёшь разве-что в реальнопрогерском реальном коде...

0
Напильнег
480 / 118 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.10.2011, 12:14 #22
Цитата Сообщение от Nameless One Посмотреть сообщение
ну например (себя в пример можно не приводить)?
Это как? У нас что, общие знакомые есть вообще? Не говорю уже о том, что тут нужны известные обоим сторонам коллеги по цеху.

Мдя, сразу виден профессиональный подход... И ни разу не удивляет - анти-гоутушники они такие...
0
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
14.10.2011, 12:20 #23
Цитата Сообщение от Напильнег Посмотреть сообщение
Это как? У нас что, общие знакомые есть вообще? Не говорю уже о том, что тут нужны известные обоим сторонам коллеги по цеху.
мне бы подошла ссылка на высказывание какого-нибудь достаточно известного программиста, либо ссылка на coding-style guide крупного проекта на С/С++.

Цитата Сообщение от Напильнег Посмотреть сообщение
И ни разу не удивляет - анти-гоутушники они такие...
ну почему сразу "анти-"? Есть пару ситуаций, в которых, как считаю лично я, использование goto оправдано
0
Напильнег
480 / 118 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.10.2011, 12:35 #24
Цитата Сообщение от easybudda Посмотреть сообщение
Ну такое-то действительно найдёшь разве-что в реальнопрогерском реальном коде...
Жалкая попытка передернуть - даже если бы тут и был какой криминал, это минимальная правка исходного кода для доведения его до работоспособности в соответствии с установками на задачу - ИМХО, именно профессиональный подход. Через cin.get() сделано для того, чтобы показать, что именно происходит - cin.ignore(...) такого представления не дает. А вот твой вариант применительно к ситуации - интеллектуальное пижонство.
0
yariknarik
0 / 3 / 0
Регистрация: 02.06.2010
Сообщений: 36
14.10.2011, 12:58 #25
Ну так правельно, пока весит цикл пока програма будет зацикливаться... Убери цыкл и поставь оператор условия и все будет работать... Все зависит от того сколько раз ты хочешь прогнать работу программы и что получить на выходе, при ее разных значениях пераметров, при запусках...
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
14.10.2011, 14:45 #26
Цитата Сообщение от Напильнег Посмотреть сообщение
ИМХО, именно профессиональный подход.
В смысле - абы как, лишь бы заработало? Тот факт, что среди преподов (судя по постам на форуме) тоже "реальные профессионалы" встречаются, ещё не означает, что вот так и надо делать. Помимо goto там ещё числа double с целочисленной константой сравниваются, что само по себе тоже реально профессиональная затея. Ну ладно try/catch - пижонство, хотя по-моему это как-раз по стилю к С++ гораздо ближе, чем конструкции вроде if ( ! cin )... В любом случае ничего плохого в том, что человек увидит, как програмка может выглядеть. А быдлокодить его, видимо, и без нас с вами научат...
1
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
14.10.2011, 16:35 #27

Не по теме:

Цитата Сообщение от Напильнег Посмотреть сообщение
Уважаемый, повторяю - исходный код не работает не из-за goto. И ваш код работает не из-за применения while, а из-за того, что вы чистите поток функцией ignore (кстати, неграмотно Вы ее используете, но для практического применения сойдет). И оператор goto пишется слитно, кстати.
Вопрос риторический. Я что сказал что у него код не работает из за goto?


По моему мнению для новичка использование оператора goto, усложняет поиск ошибок и плюс в обсуждаемой программе он совершенно не нужен. К примеру здесь нет глубоко вложенной структуры, выполнение которой надо прервать. Однако даже в такой ситуации можно обойтись и без goto.

P.S. Я был бы вам очень признателен, если бы вы пояснили как правильно применять cin.ignor(), в каких случаях это лучше всего делать и почему я использую ее неграмотно. Заранее спасибо.

p.s.2: Напильнег если для вас такие авторы как Керниган и Ритчи имеют хоть какой-то незначительный авторитет то откройте их книгу. Глава 3.9. Оператор GOTO и метки
0
ProgressM
1 / 1 / 0
Регистрация: 13.10.2011
Сообщений: 5
14.10.2011, 21:05  [ТС] #28
Спасибо!!!!
0
Напильнег
480 / 118 / 10
Регистрация: 30.09.2010
Сообщений: 473
19.10.2011, 13:12 #29
Цитата Сообщение от greeezz Посмотреть сообщение
Я был бы вам очень признателен, если бы вы пояснили как правильно применять cin.ignor(), в каких случаях это лучше всего делать и почему я использую ее неграмотно
Длина буфера ввода гораздо больше 100 символов, так что Ваш вызов cin.ignore(100, ...) не гарантирует его очистку. А уж сколько надо для Вашей системы, определяйте сами. Я ставлю 32k-1 - чтобы и запас на будущее был, и Борман при необходимости это тоже скушал.
0
greeezz
273 / 166 / 4
Регистрация: 10.07.2011
Сообщений: 441
19.10.2011, 16:22 #30
Цитата Сообщение от Напильнег Посмотреть сообщение
Длина буфера ввода гораздо больше 100 символов, так что Ваш вызов cin.ignore(100, ...) не гарантирует его очистку. А уж сколько надо для Вашей системы, определяйте сами. Я ставлю 32k-1 - чтобы и запас на будущее был, и Борман при необходимости это тоже скушал.
istream& ignore ( streamsize n = 1, int delim = EOF );
Extracts characters from the input sequence and discards them.
The extraction ends when n characters have been extracted and discarded or when the character delim is found, whichever comes first. In the latter case, the delim character itself is also extracted.
источник

В связи с этим использование мной cin.ignore(100, '\n') обосновано. т.к. в случе обсуждаемой программы так или иначе символ конца строки имеет основной смысл и нет надобности игнорировать буфер от начала и до конца.
0
19.10.2011, 16:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 16:22
Привет! Вот еще темы с ответами:

Ошибка при использовании оператора delete в Visual Studio 2010 - C++
Изучаю указатели в C++. Есть следующий код: #include &lt;iostream&gt; #include &lt;locale&gt; using namespace std; int main() { ...

Ошибка при использовании перегруженного оператора вывода в поток: no match for 'operator<<' - C++
Пытаюсь написать класс комплексных чисел, но не могу сделать вот что: #include &lt;iostream&gt; #include &quot;head.h&quot; using namespace std; ...

При вводе в переменную нетипичного ей символа программа зацикливается - C++
Проблема в том, что если ввести в программу символ отличный от цифры то программа зацикливается, а необходимо чтобы вопрос задавался снова!...

При вводе слишком большого числа программа зацикливается - C++
При вводе слишком большого числа идет зацикливание(вроде так)помогите исправить #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include...


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

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

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