Модераторы: volvo877, Snowy, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Label, GOTO - можно ли использовать? 
:(
    Опции темы
Innuendo108
Дата 16.3.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 3.4.2008

Репутация: нет
Всего: 2



Я помню, когда школьником ходил на городские и республиканские олимпиады - там за использованием GOTO или аннулировали задание, или говорили переделать и не принимали задание пока там не будет GOTO...  Так же, потом когда я перешел на FreePascal - я заметил что там в настройках компилятора есть такая опция "Разрешать GOTO или нет" - т.е. всё-таки были какие-то споры у программистов насчёт GOTO в паскале.

Когда я готовился к экзаменам Бакалавра (после школы - у нас другая система образования) - я занимался в группе Паскаля. там преподаватель тоже очень резко относился к использованию label и GOTO, говорил что это пережитки basic'а =)


Сейчас, в университете, я вижу как нас чуть-ли не заставляют везде этот GOTO вставлять - который я уже считаю злом...

Так кто прав? Я в интернете искал информацию на эту тему, но так и не нашел. Кто решил что что GOTO нельзя и почему? Я уже сам за тех, кто против goto (привык уже как-то), но просто интересно. Это просто этикет программирования (в паскале), или есть какие-то стандарты?

Если есть таковые стандарты - то хотелось бы почитать. Может быть goto нельзя, потому что в настоящем паскале его нет, а потом доделали так сказать)
PM MAIL   Вверх
Kbl4AH
Дата 16.3.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Goto юзать можно, но не нужно...
1) гооврит о плохо продуманном алгоритме...
2) неудобства в чтении кода...
3) сложнее отлавливать ошибки
имхо юзать можно, но тока в крайнем, безвыходном случае... тем боле в основном юзают начинающие, не умеющие составлять свои подпрограммы... а при использовании подпрограмм мона и exit юзать, в циклах  - break, continue...
PM MAIL ICQ   Вверх
volvo877
Дата 16.3.2009, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Innuendo108 @  16.3.2009,  18:24 Найти цитируемый пост)
Может быть goto нельзя, потому что в настоящем паскале его нет
Goto изначально был в Стандарте Паскаля, как ISO10206 (Extended Pascal) так и ISO7185 (unextended Pascal).

Не надо догм. Используй то, что тебе нужно там, где оно тебе нужно. Естественно, если ты пишешь на Паскале в стиле Basic-а, ни к чему хорошему это не приведет. Но иногда Goto сильно облегчает задачу. В принципе, у меня основной язык - Ada, так что мне как-то и Goto не нужен, чтоб, скажем, выйти из нескольких циклов без усилий - на то у нас есть именованные циклы:
Код

   First_Loop:
   for i in 1 .. Last_I_Value loop
      for j in 1 .. Last_J_Value loop 
         for k in 1 .. Last_K_Value loop
            -- Тут какие-то вычисления

            -- Выходим изо всех циклов, как только нас устраивает результат 
            exit First_Loop when Func(i, j, k);

            -- Тут еще вычисления
         end loop;
      end loop;
   end loop First_Loop;

Попробуй то же самое сделать (так же просто и естественно) без Goto в Паскале (только не надо предлагать ввести еще переменную, и изменить циклы на While/Repeat, это раздует код, а зачем, если можно этого избежать?)...

Цитата(Innuendo108 @  16.3.2009,  18:24 Найти цитируемый пост)
Сейчас, в университете, я вижу как нас чуть-ли не заставляют везде этот GOTO вставлять
Пример программы, куда тебя заставили добавить Goto можно? Желательно, обе версии: ДО и ПОСЛЕ.

Цитата(Kbl4AH @  16.3.2009,  19:31 Найти цитируемый пост)
1) гооврит о плохо продуманном алгоритме...
Ни о чем это не говорит... Повторяю еще раз: не нравится (или не умеешь) - не используй. Другим не мешай.
PM MAIL   Вверх
Kbl4AH
Дата 16.3.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Цитата(volvo877 @  16.3.2009,  21:08 Найти цитируемый пост)
Другим не мешай.

И в мыслях мешать не было smile 
Щелковская гимназия
Цитата

Современная технология структурного программирования основана на принципе «программировать без GOTO»: считается, что злоупотребление операторами перехода затрудняет понимание программы, делает её запутанной и сложной в отладке. Тем не менее, в некоторых случаях использование операторов перехода может значительно упростить программу.

Википедия
Цитата

Диалект UCSD Pascal оказал большое влияние на развитие языка Паскаль, послужив, в частности, основой для диалекта Turbo Pascal фирмы Borland. 
...
Интересной особенностью диалекта UCSD Pascal был действовавший по умолчанию запрет на использование оператора goto (если не был указан специальный режим трансляции {$G+}, то оператор goto считался ошибкой).

Королевство Delphi
Цитата

А вообще, если Вы без меток обойтись не можете - пересмотрите алгоритм. Метки в языках высокого уровня - признак корявого алгоритма или его реализации.

Цитата

Мне кажеться, что про то, что Goto - это плохо говорил Дейкстра. И плохо вот в каком случае: использование goto разрушает структуру кода и его читабельность. Других противопоказаний действительно нет.


PS. Что-то вы, volvo877, как-то очень ревностно и категорично к большинству постов в вашем разделе относитесь... Оно и понятно - ваша епархия...

PM MAIL ICQ   Вверх
Metalex
Дата 16.3.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Меня тоже учили обходится без goto, если это не очень усложняет код, по нескольким причинам, одной из которых есть написание алгоритма к программе.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Innuendo108
Дата 17.3.2009, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 3.4.2008

Репутация: нет
Всего: 2



Цитата(volvo877 @  16.3.2009,  21:08 Найти цитируемый пост)
Пример программы, куда тебя заставили добавить Goto можно? Желательно, обе версии: ДО и ПОСЛЕ.

Вообщем стояло задача. Я не буду говорить всю задачу, упрощу до нельзя - нужно было 2 раза сгенерировать случайное число (от 1 до 5) - но чтоб оно не повторялось.
я сделал, как мне показалось, - очень просто:
Код

i:=random(5)+1;
{ ... }
j:=random(5)+1; while j=i do j:=random(5)+1;  {хотя можно записать и так: j:=i; while j=i do j:=random(5)+1;}

(программа выглядела больше, потому что между этими действиями ещё были выводы разные и кейсы. Но это не важно.
Преподаватель сказал что нужно обойтись БЕЗ ЦИКЛОВ.
И я сидел, и голову ломал, как же так random задать красиво, чтоб он не повторился... 
А в конце он говорит ответ: 
Код

i:=random(5)+1;
{ ... }
10: j:=random(5)+1; 
if  j=i then goto 10;


и что я вижу? помоему в данном случае - goto назад является своебразным циклом)) 
И это меня взбесило)) что мало того, где можно обойтись простым while-ом заставляют использовать ненужный goto, так ещё и "без циклов", хотя по-сути ответ с циклом.

ведь по-сути, если задать условие проверки и выполнять GOTO назад, то это как и repeat until =)

Это сообщение отредактировал(а) Innuendo108 - 17.3.2009, 01:38
PM MAIL   Вверх
Данкинг
Дата 17.3.2009, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Если в языке есть некий оператор, то глупо утверждать, что использование данного оператора - плохой тон.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
pompei
Дата 17.3.2009, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



В ядре linux-а, написаном на C, оператор goto используется очень часто - если грамотно, то использовать можно всё.
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
Metalex
Дата 17.3.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Также в плохом тоне еще обвиняют exit и подобные ему..


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
pompei
Дата 17.3.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 7.9.2007

Репутация: нет
Всего: 6



Пример грамотного использования goto на C.

Код


/* эта функция выделяет несколько ресурсов (например 
дескрипторов открытых файлов), работает с ними, и освобождает.
если функция вернула 0 - то все нормально, иначе вернулся код ошибки.
Примечание:
1) Принято, что если error_code == 0, то ни какой ошибки нет.
2) В любой ситуации, какие бы не возникали ошибки, функция должна
    освободить все занятые ресурсы, и при этом не быть запутанной, и быть
    хорошо читабельной
*/
#define IS_ERROR(x) ((x) != 0)
int do_something( EXAMPLE_TYPE arg ) {
    int error_code = 0; /* типа все нормально */
    
    DESCRIPTOR resource1, resource2, resource3;
    
    doOne();
    
    error_code = get_resource_A( &resource1, arg );
    if (IS_ERROR(error_code)) goto EXIT;
    
    doTwo( resource1 );
    if (.....) goto EXIT1; /*вдруг нам в какой-то ситуации не нужен ресурс В*/
    
    error_code = get_resource_B( &resource2, arg );
    if (IS_ERROR(error_code)) goto EXIT1;
    
    doThree( resource1, resource2 );
    if (.....) goto EXIT2; /*вдруг нам в какой-то ситуации не нужен ресурс C*/
    
    error_code = get_resource_C( &resource3, arg );
    if (IS_ERROR(error_code)) goto EXIT2;
    
    doFour( resource1, resource2, resource3 );
    
    .....
    if (...) goto EXIT3;
    .....
    if (...) goto EXIT3;
    .....
    if (...) goto EXIT3;
    .....
    if (...) goto EXIT3;
    ....
    
    EXIT3:
    free_resource_C( resource3 );
    
    EXIT2:
    free_resource( resource2 );
    
    EXIT1:
    free_resource_A( resource1 );
    
    EXIT:
    return error_code;
}



Данный подход используется в ядре linux

Это сообщение отредактировал(а) pompei - 17.3.2009, 11:04
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап.
PM MAIL   Вверх
volvo877
Дата 17.3.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Innuendo108 @  17.3.2009,  00:33 Найти цитируемый пост)
А в конце он говорит ответ: 
Ну, здесь налицо явный дебилизм преподавателя. ТАК goto использовать не стОит... К тому же для столь искусственной задачи и еще более искусственного ограничения (ну, чем ему помешали циклы?) существует вариант и без циклов и без goto:
Код
var
  i, j: integer;

const
  s: string = '12345';

begin
  randomize;
  i := random(length(s)) + 1;
  writeln(s[i]);
  delete(s, i, 1);
  j := random(length(s)) + 1;
  writeln(s[j]);
end.

PM MAIL   Вверх
AXOXC
Дата 18.3.2009, 14:04 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.3.2009

Репутация: нет
Всего: нет



Цитата(volvo877 @  17.3.2009,  14:00 Найти цитируемый пост)
 j := random(length(s)) + 1;


А не  j := s[random(length(s))] + 1; ?

Обращаемся к элементу строки под номером "random(length(s))"?
Спсибо,данный способ вижу впервые, но а если нужен рандом из 100-150 чисел тогда будем строке присваивать значения в массиве? 

ИМХО идиальным вариантом является через while хотя и возможен бессконечный цикл(
PM MAIL ICQ   Вверх
Kbl4AH
Дата 18.3.2009, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: нет
Всего: 15



Цитата(AXOXC @  18.3.2009,  14:04 Найти цитируемый пост)
А не  j := s[random(length(s))] + 1; ?

 smile 
как это ты так буквы с числами складываешь?
PM MAIL ICQ   Вверх
AXOXC
Дата 18.3.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 17.3.2009

Репутация: нет
Всего: нет



Цитата(Kbl4AH @  18.3.2009,  14:12 Найти цитируемый пост)
как это ты так буквы с числами складываешь? 


косяк) забыл перевод)

 j := val(s[random(length(s))]) + 1; Если не ошибаюсь, но не суть важно.
PM MAIL ICQ   Вверх
volvo877
Дата 18.3.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(AXOXC @  18.3.2009,  13:40 Найти цитируемый пост)
но не суть важно. 
Конечно неважно, обвинить другого, что у него неверно, а потом рассмеяться и сказать: "Ну, это неважно"... 

Так вот иди и учи синтаксис. А потом будешь искать ошибки в чужих программах. Или (ХОТЯ БЫ) потрудись запустить то, что выложено. И посмотреть, что выдается...


Цитата(AXOXC @  18.3.2009,  13:04 Найти цитируемый пост)
но а если нужен рандом из 100-150 чисел тогда будем строке присваивать значения в массиве? 
Я, кажется, ясно написал: 
Цитата(volvo877 @  17.3.2009,  13:00 Найти цитируемый пост)
для столь искусственной задачи и еще более искусственного ограничения (ну, чем ему помешали циклы?) существует вариант и без циклов и без goto:
, т.е., решение приводилось для конкретной задачи, а не "если бы да кабы". Вот когда будет "если", тогда и будешь думать, как решить проблему.

Цитата(AXOXC @  18.3.2009,  13:04 Найти цитируемый пост)
идиальным вариантом является через while

Вообще-то не через While, а через Repeat. Потому что сначала надо сгенерировать новое число, и только потом проверять, а не повторилось ли оно.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.1228 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.