Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Вниз

Программы без <B>GOTO</B>   Найти похожие ветки 

 
DelAlanPhi   (2003-01-11 23:45) [0]

Мастера, как, блин, доказать преподу что любую программу можно написать без GOTO???


 
Diamond Cat   (2003-01-12 00:03) [1]

во первых преподу ты никак ничего не докажешь (только гемор себе наживешь) , а во вторых если реально спускаться с языков высокого уровня типа паскаль к низкому типа asm то упираешься как ни странно в теже гоу-ту, по сути весь машинный код это джампы, все циклы и т.д. к этому и сводятся, поэтому amd и хавает математику быстрее у него конвейер короче и быстрее при джампах нулиться, так что препод прав, хотя если поставить вопрос так : да клал я на низкоуровневые языки и меня не морочит как там все работает, товобщем можно и без goto


 
Anatoly Podgoretsky   (2003-01-12 00:12) [2]

DelAlanPhi © (11.01.03 23:45)
А зачем?


 
Rouse_   (2003-01-12 00:40) [3]

Немного не стой стороны вопрос. Звучать он должен так.

Теорема: Любая программа в ООП пишется без использования операторов безусловного перехода GOTO.

2 DelAlanPhi ©
Вы кстати знаете почему программисты отказываются от GOTO?

Желаю успехов


 
MXA   (2003-01-12 01:29) [4]

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

и вообще на паскале, по-моему, можно обойтись без
любого незарезервированного слова...


 
Pardus   (2003-01-12 02:07) [5]

Чтобы убедить препода продемонстрируй ему язык Оберон http://www.oberon.ethz.ch/download.html ,
который является потомком Паскаля. В этом (максимально упрощеном) языке ВООБЩЕ нет понятия GOTO.
Кроме того, там нет такого понятия как STRING, POINTER, перечислимые типы и т.п.
Его создатель - Никлаус Вирт (надеюсь слышали про него), намеренно выкинул из языка всё, что является несущественным.
В первой версии был даже исключён цикл FOR (правда во второй версии его вернули, но без него тоже можно обойтись)

Оберон - самый простой язык, который не содержит излишеств, но является универсальным языком высокого уровня. Он относится сразу к трём категориям: модульный, структурный и объектно-ориентированный (хотя и не содержит ключевого слова OBJECT)
Описание его синтаксиса умещается на 1 листе, а полное описание языка на 16 листах (а вы можете себе представить нормальное описание паскаля на 16 листах?).

Но не думайте, что это игрушечный язык, на котором нельзя писать ничего серьёзного. Н.Вирт со своим коллегой за 3 года с нуля написали на нём одноимённую операционку и достаточное количество приложений под неё. При этом использовался ТОЛЬКО Оберон, без привлечения языков низкого уровня.
И не думайте, что программы получаются ужасно громоздкими.
Компилятор Оберона написаный на нём же самом занимает около 3000 строк текста. На машине с тактовой частотой 25МГц (двадцать пять мегагерц, то есть троечка) он компилируется 15с (пятнадцать секунд). А сколько там будет компилироваться компилятор написанный вами на паскале?
И код получается достаточно компактный. Так операционка, со встроенным туда текстовым редактором и компилятором занимает всего 200Кб (двести килобайт, бывают такие программы :) ).

Поэтому, если препод не "клинический случай", то ты его убедишь...


 
Rouse_   (2003-01-12 02:10) [6]

Вот я тут подумал немного. Реально оператор GOTO конечно же нужен, но в случае программирования для систем реального времени. В Windows все для чего раньше был предназнечен данный оператор делают обработчики ситемных сообщений, потоки, вариации мутексов и системных "защелок". Реально оператор GOTO применим для выхода из глубокого цикла в цикл - предок, но это также можно осуществить простым перестроением логики приложения. В своей практике имеется ввиду ООП я не применял ни разу данный оператор. Вообще бытует мнение: если программист применяет GOTO то он просто не способен реально построить логически правильный код, либо он недавно перешел с бейсика :)

Желаю успехов


 
Вот   (2003-01-12 04:34) [7]

тут:
>MXA (12.01.03 01:29)
>преподу можно объяснить, что использование GOTO делает текст
>программы более трудночитаемым и т.д

препод и не согласится, и правильно сделает, поскольку текст программы с GOTO скорее читается лучше, чем хуже или труднее.
Имхо ясно видно куда перейдет процесс в случае выполнения или не выполнения каких либо действий или условий.

>Rouse_ © (12.01.03 02:10)
>Вот я тут подумал немного. Реально оператор GOTO конечно же >нужен, но в случае программирования для систем реального >времени. В Windows все для чего раньше был предназнечен данный >оператор делают обработчики ситемных сообщений, потоки, >вариации мутексов и системных "защелок".

Причем тут системы реального или не реального времени? Или любые обработчики чего бы там ни было?

>Вообще бытует мнение: если программист применяет GOTO то он >просто не способен реально построить логически правильный код, >либо он недавно перешел с бейсика :)

А вот с этим согласен на все 100!





 
Rouse_   (2003-01-12 05:26) [8]

> Вот
Вот и объясню. В томже самом досе идет чистое линейное программирование. Никаких условий параллельного контроля не предвидится. Программа работает именно так как она написана, если стоит задержка то программа выполнит задержку и пойдет далее по коду. Отсутствуют варианты что до этого кода может выполнится другой (к примеру обработчик WM_TIME или WM_PAINT). В таких случаях оператор GOTO незаменим.

> поскольку текст программы с GOTO скорее читается лучше

Абсолютно не согласен. Оператор GOTO именно поэтому не пользуется уважением у программистов так как некоторые индивидуумы умудряются при помощи него так запутать код что сами не поймут, что, куда и зачем.

Желаю успехов

ЗЫ: а интересная дискусия, жду возражений :)


 
Вот   (2003-01-12 05:46) [9]

> Rouse_ © (12.01.03 05:26)
>Абсолютно не согласен. Оператор GOTO именно поэтому не >пользуется уважением у программистов так как некоторые >индивидуумы умудряются при помощи него так запутать код что >сами не поймут, что, куда и зачем.

Пардон, "некоторые индивидуумы" одинаково запутывает код как с GOTO, так и без него.

>Вот и объясню. В томже самом досе идет чистое линейное >программирование. Никаких условий параллельного контроля не >предвидится. Программа работает именно так как она написана, >если стоит задержка то программа выполнит задержку и пойдет >далее по коду. Отсутствуют варианты что до этого кода может >выполнится другой (к примеру обработчик WM_TIME или WM_PAINT). >В таких случаях оператор GOTO незаменим.

Ей богу, не вижу взаимосвязи (какой-либо) оператора GOTO и принципов ООП, многозадачности или еще чего-либо.



 
Моджахед   (2003-01-12 05:53) [10]

Дабы сей флейм был вечным ;)
> В томже самом досе идет чистое линейное программирование. Никаких условий параллельного контроля не предвидится. Программа работает именно так как она написана, если стоит задержка то программа выполнит задержку и пойдет далее по коду

Ну, это, батенька, никто в Досе никто не отменял программирование прерываний с его контролем на повторную входимость в обработчик и прочее. И не говорите мне, что это не паскаль, а всякие оффтопик asmы. ;-)

Всегда с уважением, остаюсь и проч.




 
Вот   (2003-01-12 06:01) [11]

Еще раз.
Да при чем тут Дос, линейное программирование и иже с ними?

if (условие1) then (действие1)
else (действие2) - гораздо менее ошибкоопаснее, чем конструкция
if (условие1) goto L1
else goto L2


 
Rouse_   (2003-01-12 06:14) [12]

> Моджахед (12.01.03 05:53
Да вы правы, но вы не поняли идеи. зловещий оператор не требуется в сисмех псевдомультизадачтости, каковой является Windows. А прерывание... оно отработало... и программа пошла дальше. Да конечно тут можно перекинуть логику кода, но темже оператом, в просторечии JMP, я не думаю что вы до конца поняли смысл моего поста, но всеже беседа увлекательна.

> > Вот (12.01.03 06:01
while (условие1) do begin
if (действие1) then
(действие2)
if (условие1) goto L1 вы не описали L1 а так бы был код
else exit;
end;

Желаю успехов



 
Rouse_   (2003-01-12 06:59) [13]

Сори не до конца всмотрелся в пост вот как можно заменить

if (условие1) then (действие1)
else (действие2) - гораздо менее ошибкоопаснее, чем конструкция
if (условие1) (goto L1) = Наша процедура или функция либо Exit
else (goto L2) = Наша процедура или функция либо Exit

В противном случае просто пересматривается логика приложения.

Но могу вас уверить: Вы не сможете привести ни одного алгоритма (именно на Дельфи) в котором железно требуется оператор GOTO. Даже можно сделать вариант:
Пусть Ваш преподаватель его напишет и засечет время за сколько его можно будет переписать правильно

Желаю успехов


 
DelAlanPhi   (2003-01-12 09:27) [14]

Спасибо всем, после сессии поговорю с преподом.


 
drpass   (2003-01-12 14:29) [15]

Кстати, для программирования любого алгоритма из семи операторов ветвления (goto, if..then, for..to, repeat, while, case, procedure) достаточно одного-едиственного оператора while


 
MXA   (2003-01-15 00:26) [16]

наверное Вот и есть тот самый препод :)

2 drpass ©
ну да, остальные скорее для удобсва...
кстати интерестно, вот кто-нибудь из вас любит использовать
якобы "удобный" оператор IfThen ?


 
Вот   (2003-01-15 04:23) [17]

2 drpass © (12.01.03 14:29)
Не соглашусь!
Поскольку while требует "предусловие" для нормальной работы, в отличие от repeat, который вычисляет сие условие.
Представьте себе цикл, в котором нужно вычислить "неким сложным способом" результат и проверить его на истину.

Если "абстрагироваться от трудностей практической реализации" (цитата из Савченко), то достаточно любого из... Но кто измерит затраты на лечение геморроя?


 
Sha   (2003-01-15 08:44) [18]

2 Вот (15.01.03 04:23)

repeat...Res:=true/false;...until Res;
равно
Res:=false; while not Res do begin...Res:=true/false;...end;


 
Sha   (2003-01-15 08:53) [19]

GOTO, BREAK, CONTINUE в некоторых известных случаях делают логику программы яснее, позволяют оптимизировать время выполнения, избавиться от нагромождений BEGIN/END. Просто их надо использовать именно для этого, а не для противоположного.
Если программа пишется не для себя то эти операторы, разумеется, не стоит использовать.


 
Viktor Kushnir   (2003-01-15 08:59) [20]

Ладно, берем FAR заходим в папочку D6\Source и врубаем поиск файлов с фразой "goto " (кавычки не надо).
Находим 4 файлы, два из которых GOTO не используют, а просто имена констант и т.п. сдержат в себе GOTO.

GOTO используется только в файлах:
getmem.inc
MXDSSQRY.PAS

в обоих случаях для быстрого выхода из процедуры.
Так та.


 
Dok_3D   (2003-01-15 10:53) [21]

2DelAlanPhi

Доказать просто:
попроси его привести пример программы в которой (по мнению преподавателя), нельзя обойтись без этого оператора.
И на примере этой программы и доказывай.

Если, конечно сможешь (Dok_3D мрачно улыбается и подмигивает более опытным товарищам).


 
pasha676   (2003-01-15 11:13) [22]


> Кстати, для программирования любого алгоритма из семи операторов
> ветвления (goto, if..then, for..to, repeat, while, case,
> procedure) достаточно одного-едиственного оператора while


procedure ты сюда явно зря вставил. У нее совсем другая задача, совсем не ветвление (наверно можно обозвать задачу конструкции procedure - модульностью).
Самое интересное, что да можно. Но геморно. Для этого же в языке есть goto. Иногда с ним удобней. Необходимости в паскале goto конечно нет.



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.02.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.013 c
8-5085
som
2002-10-21 11:19
2003.02.03
.jpg в TBitmap


3-4810
Иксик
2003-01-17 13:15
2003.02.03
Фильтр в ADOQuery


1-4867
Someone
2003-01-24 18:23
2003.02.03
Посоветуйте с превью печати


4-5345
CAHO
2002-12-20 06:24
2003.02.03
Как поменять курсор при событии MouseDown


3-4805
pave1
2003-01-16 15:16
2003.02.03
Поменять кодировку в Table без создания алиаса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский