Форум программистов, компьютерный форум, киберфорум
QBasic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/67: Рейтинг темы: голосов - 67, средняя оценка - 4.90
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647

Оператор GOTO: за и против

20.11.2011, 16:38. Показов 15233. Ответов 146
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди, по ходу, газет не читают:
Оператор GOTO в языках высокого уровня является объектом критики, поскольку чрезмерное его применение приводит к созданию нечитаемого «спагетти-кода». Впервые эта точка зрения была отражена в статье Эдсгера Дейкстры «Доводы против оператора GOTO», который заметил, что качество программного кода обратно пропорционально количеству операторов GOTO в нём. Статья приобрела широкую известность как среди теоретиков, так и среди практиков программирования, в результате чего взгляды на использование оператора GOTO были существенно пересмотрены. В своей следующей работе Дейкстра обосновал тот факт, что для кода без GOTO намного легче проверить формальную корректность.

Код с GOTO трудно форматировать, так как он может нарушать иерархичность выполнения (то есть парадигму структурного программирования), и потому отступы, призванные отображать структуру программы, не всегда могут быть выставлены правильно. GOTO также аннулирует многие возможности компилятора по оптимизации управляющих структур

Доводы против оператора GOTO оказались столь серьёзны, что в структурном программировании его стали рассматривать как крайне нежелательный

Начало тут
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2011, 16:38
Ответы с готовыми решениями:

Оператор GOTO и его метки
Здесь я хотел раз и навсегда разобраться с метками оператора GOTO. 1) Если метка является идентификатором, то есть начинается с...

Goto - за и против
С удивлением обнаружил на форуме аж двух сторонников оператора goto. Посему объявляю опрос.

Оператор goto
Здравствуйте. Я в лабораторной работе проверяю введенные данные на различные ошибки. Я это все сделал, каждую ошибку мне выдает. То...

146
 Аватар для STAR WARS
34 / 40 / 3
Регистрация: 24.11.2016
Сообщений: 159
25.01.2017, 16:00
Студворк — интернет-сервис помощи студентам
Прерывание 9 индекс вне режима.Сообщение возникает при работе с массивами,когда индекс какого либо элемента массива превышает его объявленный в операторе DIM размер,а также в том случае,когда массив занимает в памяти объём более 64 Кбайт.Режим экрана SCREEN 13 320x200 имеет 256 цветов.
0
25.01.2017, 20:25

Не по теме:

Цитата Сообщение от STAR WARS Посмотреть сообщение
когда массив занимает в памяти объём более 64 Кбайт.
По современным меркам вообще ничего...

0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
26.01.2017, 01:16
Цитата Сообщение от locm Посмотреть сообщение
А корованы грабить можно?
Без асма нет, как-бы пробовал. Там всё вычислительное медленно работает.
Однако для 3D и работы с сетью ничего проще не видел, вообще в плане IDE там всё
концептуально очень красиво сделано, т.е. тот случай когда пофиг на отсутствие русской
справки мол и так всё понятно.

Добавлено через 1 минуту
Цитата Сообщение от STAR WARS Посмотреть сообщение
Прерывание 9 индекс вне режима.
Это код ошибки, не путаем.

Добавлено через 29 минут
Цитата Сообщение от STAR WARS Посмотреть сообщение
Режим экрана SCREEN 13 320x200 имеет 256 цветов.
Это очень мало, как по цветности так и по разрешающей способности.
13h программировали все кому не лень, потому что оно максимально просто. Это была целая
эпоха в развитии демосцены и геймдева.
Чтобы выводить полноцветную графику(и не морщиться) нужно минимум 1024x768 и 16бит.
Но 16 бит(565) не удобно программировать из-за того, что кол-во бит на канал разное,
в VESA конечно есть 555, но писать 2 байта и при этом терять 1 бит цветности - не айс.
Поэтому возьмём минимум 24бита. Под DOS-ом обработку всего этого добра делали
во FLAT режиме при помощи экстендеров, которые переводили проц в 32 битный режим
и осуществляли обработку исключений. А нормально с этим работали только C-- и BorlandPascal.
У PDS насколько помню по референсу была методология ISAM, "наслаждение" то ещё, кто работал
с EMS тот знает.
Поэтому STAR WARS лучше изучайте дельше Blitz, для начала оно полезнее чем
бестолковая возьня с DOS.
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.01.2017, 10:51
Я предлагаю вам, для сравнения, две абсолютно
одинаковые программы. Она без GOTO. Другая с GOTO.
Какая лучше? - Пусть решит каждый сам

(суть решаемой задачи я думаю ясна, внутренний цикл
делает 500 оборотов и выход из всех циклов - там вывод
результата)

без GOTO.
QBasic/QuickBASIC
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
32
33
34
35
36
37
38
REM
REM   GOTO !
REM
 
CLS
 
FOR i1 = 0 TO 1
FOR i2 = 0 TO 1
FOR i3 = 0 TO 1
FOR i4 = 0 TO 1
FOR i5 = 0 TO 1
FOR i6 = 0 TO 1
FOR i7 = 0 TO 1
FOR i8 = 0 TO 1
FOR i9 = 0 TO 1
   S = S + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9
   n = n + 1
   IF n = 500 THEN EXIT FOR
NEXT i9
   IF n = 500 THEN EXIT FOR
NEXT i8
   IF n = 500 THEN EXIT FOR
NEXT i7
   IF n = 500 THEN EXIT FOR
NEXT i6
   IF n = 500 THEN EXIT FOR
NEXT i5
   IF n = 500 THEN EXIT FOR
NEXT i4
   IF n = 500 THEN EXIT FOR
NEXT i3
   IF n = 500 THEN EXIT FOR
NEXT i2
   IF n = 500 THEN EXIT FOR
NEXT i1
 
PRINT S
END
с GOTO.
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
REM
REM   GOTO !
REM
 
CLS
 
FOR i1 = 0 TO 1
FOR i2 = 0 TO 1
FOR i3 = 0 TO 1
FOR i4 = 0 TO 1
FOR i5 = 0 TO 1
FOR i6 = 0 TO 1
FOR i7 = 0 TO 1
FOR i8 = 0 TO 1
FOR i9 = 0 TO 1
   S = S + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9
   n = n + 1
   IF n = 500 THEN 100
NEXT i9, i8, i7, i6, i5, i4, i3, i2, i1
 
100
PRINT S
END
0
Заблокирован
27.01.2017, 13:54
Цитата Сообщение от echs Посмотреть сообщение
QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IF n = 500 THEN EXIT FOR
NEXT i9
* *IF n = 500 THEN EXIT FOR
NEXT i8
* *IF n = 500 THEN EXIT FOR
NEXT i7
* *IF n = 500 THEN EXIT FOR
NEXT i6
* *IF n = 500 THEN EXIT FOR
NEXT i5
* *IF n = 500 THEN EXIT FOR
NEXT i4
* *IF n = 500 THEN EXIT FOR
NEXT i3
* *IF n = 500 THEN EXIT FOR
NEXT i2
* *IF n = 500 THEN EXIT FOR
NEXT i1
PRINT S
END
меняй
QBasic/QuickBASIC
1
2
IF n = 500 THEN PRINT S : END
NEXT i9, i8, i7, i6, i5, i4, i3, i2, i1
и зачем в данном примере GOTO?
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.01.2017, 15:23
Shersh
Вы меня разочаровали. Ведь вы отлично знаете,
что я хотел сказать. Ведь после циклов я мог
добавить независимый код, который внутри уже
не исполнишь.
...
есть люди, которые очень хотят возразить...
вы доказали, что вы один из них... как жаль...
0
Эксперт по электронике
6825 / 3250 / 337
Регистрация: 28.10.2011
Сообщений: 12,705
Записей в блоге: 7
27.01.2017, 16:42
В современных бейсиках можно обойтись без Goto
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
For i1 = 0 To 1
  For i2 = 0 To 1
    For i3 = 0 To 1
      For i4 = 0 To 1
        For i5 = 0 To 1
          For i6 = 0 To 1
            For i7 = 0 To 1
              For i8 = 0 To 1
                For i9 = 0 To 1
                  S = S + i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9
                  n = n + 1
                  If n = 500 
                    Break 9
                  EndIf
                Next i9
              Next i8
            Next i7
          Next i6
        Next i5
      Next i4
    Next i3
  Next i2
Next i1
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
27.01.2017, 16:57  [ТС]
echs, даже если дальше будет код, всегда можно обойтись без GOTO хотя бы командами
QBasic/QuickBASIC
1
DO WHILE i...>0 AND n<500
Добавлено через 11 минут
locm, команда
QBasic/QuickBASIC
1
break
- это завуалированное
QBasic/QuickBASIC
1
GOTO
В моём случае программа строго структурирована, она подчиняется всем нормам нормального программирования. Потому что я знаю аксиому: нет такой программы, где без GOTO нельзя было бы обойтись.
0
Заблокирован
27.01.2017, 17:29
echs, Вы представить себе не можете моих переживаний по поводу Ваших разочарований.
В оправдание могу лишь сказать - я не противник, но и не фанат GOTO (в отличие от Вас).
Однако использование GOTO при написании кода с нуля подчеркивает лишь то, что у программиста большие проблемы с логикой или не было изначально внятного ТЗ.
В Вашем конкретном случае все циклы можно было вынести в отдельную процедуру (функцию), использовать Exit Sub в нужный момент - и никаких претензий от фанатов структурного кода (к стыду оппонента) не возникло бы.
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.01.2017, 17:42
Shersh
Это ответ настоящего мужчины и программиста.
Сейчас вы вновь показали, что вы умеете решать
задачи и не вводить никого в заблуждение...
Спасибо вам за классный ответ!!
0
Эксперт по электронике
6825 / 3250 / 337
Регистрация: 28.10.2011
Сообщений: 12,705
Записей в блоге: 7
27.01.2017, 17:57
Цитата Сообщение от кот Бегемот Посмотреть сообщение
locm, команда
QBasic/QuickBASIC
1
break
- это завуалированное
QBasic/QuickBASIC
1
GOTO
В моём случае программа строго структурирована
С такой логикой можно считать GOTO также
QBasic/QuickBASIC
1
EXIT FOR
и
QBasic/QuickBASIC
1
EXIT SUB
Если копнуть глубже, то в программе очень много GOTO хотя бы потому что в ассемблере есть инструкции JMP подобные. Подобные "GOTO" присутствуют во всех IF и т. д.
2
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
27.01.2017, 18:08
locm
Вы правы. Вы тысячу раз правы. Во многих языках
стараются "выдавить из употребления" оператор GOTO.
Вот и вводят операторы типа break, continue, exit....
и другие. А ведь эти все операторы изменяют линейную
структуру программы. К ним можно отнести и оператор
цикла и условный оператор и оператор выбора. Да всё.
только бы не GOTO.
0
Эксперт по электронике
6825 / 3250 / 337
Регистрация: 28.10.2011
Сообщений: 12,705
Записей в блоге: 7
27.01.2017, 19:41
Вводят новые операторы вместо Goto не просто так. К примеру break прерывает цикл, а EXIT SUB подпрограмму и это сразу понятно. В случае Goto это не очевидно и нужно смотреть где находится метка на которую указывает Goto.
Т. е. без Goto код более удобочитаемый и на его изучение нужно меньше времени.
0
Кормпилятор
 Аватар для Quiet Snow
5044 / 1718 / 409
Регистрация: 25.04.2010
Сообщений: 4,827
Записей в блоге: 2
27.01.2017, 21:45
Break выкидывающий из n вложенных циклов - это отличнейшая конструкция, которая позволяет
обходиться почти полностью без гот, но в старых бейсиках и паскалях её нет, а флаги в силу
неповоротливости этих диалектов, как-бы, понятно что отпадают.

Добавлено через 11 минут
Цитата Сообщение от echs Посмотреть сообщение
есть люди, которые очень хотят возразить...
вы доказали, что вы один из них... как жаль...
Ни разу не видел на практике в реальных задачах тонны вложенных циклов. Прямые переборы - это
первый признак некомпетентности программиста. Есть методологии, которые существенно эффективнее
позволяют найти решение.

Цитата Сообщение от Shersh Посмотреть сообщение
и зачем в данном примере GOTO?
Экстраполируя сие на толстые проги, то не стал бы это оборачивать в процедуру, так никакой
матрёшки не хватит, а количество нажиманий F2 превысит все мыслимые и немыслимые физиологические
пределы.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.01.2017, 07:43
Цитата Сообщение от Quiet Snow Посмотреть сообщение
Ни разу не видел на практике в реальных задачах тонны вложенных циклов. Прямые переборы - это первый признак некомпетентности программиста.
Как бы решил такую реальную задачу компетентный программист:
Есть набор символов цифры от 0 до 9 и английские буквы от a до z.
Составить программу, которая выведет все возможные комбинации этих символов в фиксированных
строках длинной по 6 символов.
1
6180 / 945 / 313
Регистрация: 25.02.2011
Сообщений: 1,381
Записей в блоге: 1
28.01.2017, 08:55
Цитата Сообщение от Pro_grammer Посмотреть сообщение
в фиксированных строках длинной по 6 символов
В данной постановке задачи, проще и быстрее реализовать шесть вложенных циклов.
но если строки не фиксированной длины, а, например, нужно перебрать пароли от 1го до 6ти символов, то легче реализовать преобразование десятичного числа в 36-ричную систему.
В зависимости от постановки задачи нужно применять тот или иной алгоритм, и если задача не требует полного перебора, то лучше его избегать или хотя бы отсекать не перспективные ветви решения методом ветвей и границ.

по вопросу темы про goto:
В своих кодах, как правило, не использую goto, только для обработок ошибок и в редких случаях когда применение goto оправдано.
0
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
28.01.2017, 10:39  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Как бы решил такую реальную задачу компетентный программист:
Есть набор символов цифры от 0 до 9 и английские буквы от a до z.
Составить программу, которая выведет все возможные комбинации этих символов в фиксированных
строках длинной по 6 символов.
Вот здесь посмотрите:
Генератор всех возможных комбинаций символов из заданных
Есть прерывание цикла, но всё очень красиво смотрится
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.01.2017, 11:37
Цитата Сообщение от кот Бегемот Посмотреть сообщение
но всё очень красиво смотрится
Серьёзно?
Цитата Сообщение от кот Бегемот Посмотреть сообщение
команда
QBasic/QuickBASIC
Выделить код
1
break
- это завуалированное
QBasic/QuickBASIC
Выделить код
1
GOTO
По вашим словам, я в этом коде насчитал 4 раза завуалированное GOTO
Перепишите на Basic, может увижу красоту.

P.S. Красиво и понятно было во втором сообщении.
В 5-м всё запутано, непонятно и макаронно, но возможно я просто не понимаю Паскаль.
1
Платежеспособный зверь
 Аватар для кот Бегемот
8966 / 4389 / 1655
Регистрация: 28.10.2009
Сообщений: 11,647
28.01.2017, 11:51  [ТС]
Pro_grammer, беда GOTO не в том, что оно GOTO, а в том, куда оно GOTO. Циклы прерываются всегда и везде, и как справедливо замечено кем-то, в ассемблере тоже есть JMP. Но хают только Бейсик и это справедливо, потому, что "бейсикоиды" пользуются этим GOTO как дубинкой, круша логичное построение программы. Навскидку вот вам пример такой "талантливой" программы (echs будет с пеной у рта доказывать, что это отличная программа)

QBasic/QuickBASIC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INPUT a,b,c
10 
b=b+5
IF b>100 THEN GOTO 30
20 
b=b*2
IF b<50 THEN GOTO 10
c=100-b
IF c>0 THEN GOTO 50 ELSE GOTO 100
30
 c=c+b
GOTO 20
100 
PRINT a,b,c
50
END
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
28.01.2017, 12:41
Цитата Сообщение от кот Бегемот Посмотреть сообщение
пример такой "талантливой" программы
Я сейчас не про примитивные случаи. Разговор был про реальную программу, которую я бы написал без GOTO но с вложением циклов. Я за это высказывание:
Цитата Сообщение от m-ch Посмотреть сообщение
В данной постановке задачи, проще и быстрее реализовать шесть вложенных циклов.
Вы привели пример решения без множественных циклов, но с GOTO,и считаете этот пример более красивым.
Действительно ли это оправдано, написать макаронный код исключительно в угоду уменьшения кол-ва циклов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.01.2017, 12:41
Помогаю со студенческими работами здесь

Оператор GOTO
Дано 50 вещественных чисел. Определить наибольшую величину из них. С помощью оператора GOTO

Оператор goto
Как передать управление из одного класса в другой c помощью goto(или как то по другому)?

Оператор GOTO
GOTO в топку. В нормальных языках нужны только циклы, а GOTO пусть останется только для *.bat, и *.cmd файлов.

оператор GoTo
Ввести с клавиатуры произвольное целое число X в диапазоне от 80 до 500. Если введенное число X не соответствует указанному диапазону, с...

Безусловный оператор GoTo
Доказать (путем перебора возможных значений), что для любых величин А,В,С типа Boolean следующие пары логических выражений имеют одинаковые...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru