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

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

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

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

13.10.2011, 21:43. Просмотров 2724. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 21:43     При использовании оператора GOTO зацикливается программа при введении букв.
Посмотрите здесь:
Вычислить функцию при использовании оператора for C++
C++ Выход за пределы массива при использовании оператора new
Выдается ошибка в std при использовании оператора for C++
При введении больше 20 чисел программа выдает странный результат C++
C++ Ошибка при использовании оператора for в задаче с символьными строками
C++ Программа зацикливается при изменении всех 2 на 2
C++ Ошибка при использовании оператора delete в Visual Studio 2010
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
14.10.2011, 05:17     При использовании оператора GOTO зацикливается программа при введении букв.
  #16

Не по теме:

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

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

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

 Комментарий модератора 
Следите за выражениями. Цитата из правил несколько постов назад была.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
14.10.2011, 11:24     При использовании оператора GOTO зацикливается программа при введении букв. #18
Цитата Сообщение от Напильнег Посмотреть сообщение
именно из соображений простоты и наглядности кода.
Цитата Сообщение от Напильнег Посмотреть сообщение
наглядности
а вот это уже кому как
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
14.10.2011, 11:52     При использовании оператора GOTO зацикливается программа при введении букв. #19
Цитата Сообщение от Nameless One Посмотреть сообщение
а вот это уже кому как
Угу - те, кто реально писал сложный реальный код, и, кстати, возвращался к нему для правки через год-полтора, прекрасно осведомлены, что "гоу-то-боязнь" - штука весьма вредная. А у экспертов по решению задач из букваря мнение, как правило, другое.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
14.10.2011, 12:01     При использовании оператора GOTO зацикливается программа при введении букв. #20
Цитата Сообщение от Напильнег Посмотреть сообщение
Угу - те, кто реально писал сложный реальный код
ну например (себя в пример можно не приводить)?
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";
        }
Ну такое-то действительно найдёшь разве-что в реальнопрогерском реальном коде...

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

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

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

Не по теме:

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


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

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

p.s.2: Напильнег если для вас такие авторы как Керниган и Ритчи имеют хоть какой-то незначительный авторитет то откройте их книгу. Глава 3.9. Оператор GOTO и метки
ProgressM
1 / 1 / 0
Регистрация: 13.10.2011
Сообщений: 5
14.10.2011, 21:05  [ТС]     При использовании оператора GOTO зацикливается программа при введении букв. #28
Спасибо!!!!
Напильнег
480 / 120 / 10
Регистрация: 30.09.2010
Сообщений: 473
19.10.2011, 13:12     При использовании оператора GOTO зацикливается программа при введении букв. #29
Цитата Сообщение от greeezz Посмотреть сообщение
Я был бы вам очень признателен, если бы вы пояснили как правильно применять cin.ignor(), в каких случаях это лучше всего делать и почему я использую ее неграмотно
Длина буфера ввода гораздо больше 100 символов, так что Ваш вызов cin.ignore(100, ...) не гарантирует его очистку. А уж сколько надо для Вашей системы, определяйте сами. Я ставлю 32k-1 - чтобы и запас на будущее был, и Борман при необходимости это тоже скушал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2011, 16:22     При использовании оператора GOTO зацикливается программа при введении букв.
Еще ссылки по теме:
C++ Ошибка при использовании перегруженного оператора вывода в поток: no match for 'operator<<'
При вводе в переменную нетипичного ей символа программа зацикливается C++
При вводе слишком большого числа программа зацикливается C++
Задание на ряды: программа зацикливается при вводе некоторых значений C++
Программа с массивами при использовании подпрограммы C++

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
19.10.2011, 16:22     При использовании оператора GOTO зацикливается программа при введении букв. #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') обосновано. т.к. в случе обсуждаемой программы так или иначе символ конца строки имеет основной смысл и нет надобности игнорировать буфер от начала и до конца.
Yandex
Объявления
19.10.2011, 16:22     При использовании оператора GOTO зацикливается программа при введении букв.
Ответ Создать тему
Опции темы

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