Как же нам без Goto?
Я программирую уже х. знает скока, но такая проблема встала у меня впервые.
Давайте разберемся, можно ли в следующем примере обойтись без goto, но так,
чтобы алгоритм получился более или менее прозрачным.
С данным проблемой я столкнулся при написании синтаксического анализатора
языка С.
Допустим мы имеем автоматную грамматику:
G(A):
1) A->aA
2) A->bB
3) B->bB
4) B->cC
5) B->aA
6) C->cC
7) C->d
Она порождает строки типа: abcd, aabbcсd, aaababcccd, ababсcd, aaabссссcd ну и т.д.
Разбор таких строк реализуется с помощью графа с вершинами A,B,C.
Т.е. из вершины А переходим в вершину В если текущий символ b, или опять в А
если символ а; из В снова в В, если текущий символ b и т.д. Разбор заканчивается
если мы встречаем символ d, находясь в вершине С. НАЧАЛЬНАЯ ВЕРШИНА
ВСЕГДА А!!
Мне кажется, что реализовать такой алгоритм движения по графу легче всего
таким путем.
bool razbor(char c) // c - первый символ строки
{
A:
if(c=='a')
{
c=next(); // функция перехода на следующий символ
goto A;
}
if(c=='b')
{
c=next();
goto B;
}
return false; //неудачное завершение;
B:
if(c=='a')
{
c=next();
goto A;
}
if(c=='b')
{
c=next();
goto B;
}
return false;
C:
if(c=='c')
{
c=next();
goto B;
}
if(c=='d') return true; //удачное завершение, строка соответствует грамматике
return false;
}
Конечно, это простой пример и здесь и без goto можно, а если у нас правил не 7,
а если их 50-100, как тогда наглядно спроектировать алгоритм без goto.
Ну давайте, борцы против goto, поспорте!
Привет всем противникам и сторонникам goto.
Я программирую уже х. знает скока, но такая проблема встала у меня впервые.
Давайте разберемся, можно ли в следующем примере обойтись без goto, но так,
чтобы алгоритм получился более или менее прозрачным.
С данным проблемой я столкнулся при написании синтаксического анализатора
языка С.
Допустим мы имеем автоматную грамматику:
G(A):
1) A->aA
2) A->bB
3) B->bB
4) B->cC
5) B->aA
6) C->cC
7) C->d
Она порождает строки типа: abcd, aabbcсd, aaababcccd, ababсcd, aaabссссcd ну и т.д.
Разбор таких строк реализуется с помощью графа с вершинами A,B,C.
Т.е. из вершины А переходим в вершину В если текущий символ b, или опять в А
если символ а; из В снова в В, если текущий символ b и т.д. Разбор заканчивается
если мы встречаем символ d, находясь в вершине С. НАЧАЛЬНАЯ ВЕРШИНА
ВСЕГДА А!!
Мне кажется, что реализовать такой алгоритм движения по графу легче всего
таким путем.
bool razbor(char c) // c - первый символ строки
{
A:
if(c=='a')
{
c=next(); // функция перехода на следующий символ
goto A;
}
if(c=='b')
{
c=next();
goto B;
}
return false; //неудачное завершение;
B:
if(c=='a')
{
c=next();
goto A;
}
if(c=='b')
{
c=next();
goto B;
}
return false;
C:
if(c=='c')
{
c=next();
goto B;
}
if(c=='d') return true; //удачное завершение, строка соответствует грамматике
return false;
}
Конечно, это простой пример и здесь и без goto можно, а если у нас правил не 7,
а если их 50-100, как тогда наглядно спроектировать алгоритм без goto.
Ну давайте, борцы против goto, поспорте!
Любителем флуда: http://www.rsdn.ru/Forum/?mid=79160 , там он был на эту тему где то месяц назад, ознакомся: http://www.rsdn.ru/search/?q=GoTo&mode=rank&site=simpl&page=0
А вообще мое мнение: юзай го у ту, где это облегчит читаемость, толлько не кому об этом не говори.. :)) Особенно если работаешь в группе..
(По русски это кажется что то вроде Иди ты???
Ну против чего тут бороться то ???)
а если серьезно то есть команды более или менее полезные... твое использование гото всего лишь показывает как можно создать автомат переходов действующий по определенным правилам... но вот тут ты возвращаешь нас к тому с чего пошли компьютеры...
Этап первый - создание компьютеров которые были способны выполнять одну программу и для ее изменения нужно было менять весь комп...
Этап второй - создание компьютера который был способен к загрузке и выполнению внешней программы
Ты создал направленный автомат а нужно по условиям задачи создать программу которая сможет воспринимать список инструкций перехода и воспринимая входящие буквы действовать соответственно этим инструкциям а не по пути предопределенному программным путем...
Загоняем все твои инструкции в массив
i[1]="A->aA";
i[2]="A->bB";
i[3]="B->bB";
i[4]="B->cC";
i[5]="B->aA";
i[6]="C->cC";
i[7]="C->d0";
int maxi=7;
Изначально текущий узел у тебя всегда
k="A";
Ну вот тебе вариант подачи исходных данных для работы универсального автомата...
Как думаешь долго дальше решать задачу???
Уверен что нет... у меня уже почти вся программа в голове...
нужно всего лишь написать функцию которая будет перебирать твои буковки и просматривать команды из массива подыскивая вариант изменения текущего узла...
если тебе эта задача кажется сложной то ты не программист...
если тебе нужно доказательство того что программка реализуема только скажи и я ее сделаю но уважать тебя перестану...
зато преимущества перед твоей программкой очевидны :-))))
Это будет уже не просто реализация одного из вариантов твоего анализатора а уже маленький робот способный анализировать по любой исходной грамматике ...
И при увеличении количества с 7, до 50,100,1000, и т.д. в моем варианте вырастет исходный массив комманд смены текущего узла, а в твоем прийдется писать новую программу черт его знает какой длинны (допустив в ней хотя бы одну опечатку сам знаешь что получишь)...
Теперь откуда пошла эта битва против гото ты хоть знаешь???
Если нет то послушай немного истории...
Жили были программисты которые создавали программы на ассемблере... неплохо жили... ночами не спали все искали баги в своих программах...
потом пришли ребята которые сказали : а не слабо ли нам забацать языки которые позволят создавать программы быстрее и проще...???
И забацали...
И с тех пор расплодилось немеряно-несчитано но очень много языков программирования...
И среди них появился язык такой BASIC, очень неплохой язык для обучения, но была в этом языке такая фишка ... очень даже многие примеры программ там были написаны с применением Гото да и большинство задач на этом языке решалось значительно проще при помощи этой самой зверушки по имени Гото... да и преподаватели которые использовали этот язык для обучения были матерыми бронтозаврами компьютерного мира... Откуда они пришли? На каких языках учились??? Да все на одном... любимом... на АСМе ... ну и что они считали главным в преподавании??? Правильно оператор безусловного перехода... и практически в любых программах на бейсике они старались показать его важность и необходимость... Ведь в ASSEMBLERе без него ни шагу...
А теперь поехали к ученикам... смотрят они на все невообразимое их умишкам количество команд и операторов и видят волшебный Гото который позволяет выучить несколько команд и писать большинство программ не изучая больше никаких команд... (я сам долгое время не хотел изучать другие варианты циклов кроме For Next, а зачем если вместе с Гото он дает возможность реализовать любой из вариантов цикла)
И писали эти новорощенные программисты программки с использованием чертовой уймы Гоутушек и появлением жуткого количества багушек...
Но профессионалы не топтались на месте...
Вы сами знаете что у профи всегда в 5point...
И выпускали они все новые языки программирования... В этих языках была куча возможностей, но поколение бэйсиковщины плевало на эти возможности и пыталось в первую очередь вставить в программу как можно больше готов...
Один из адептов даже сказал:
"Человек начавший изучение программирования с бэйсика навсегда потерян для мира как программист"
И преподаватели новых профессиональных языков сжали зубы и утвердили правило:
"Оператор GoTo снижает читаемость программы, служит водворению хаоса в мире программирования, пособствует лодырям не желающим учить синтаксис языков высокого уровня за что и приговаривается к всеобщей анафеме"
После этого при обучении С++ обычно даже не вспоминали о том что в этом языке то же есть свой GoTo...
Это как в математике... есть задачи которые можно решить без применения теорем... но если хочешь решать быстрее без головной боли и ошибок то лучше сначала выучить теоремы а не кричать во все горло: "А Я БЫ СМОГ РЕШИТЬ ЭТУ ЗАДАЧУ БЕЗ ВСЯКИХ ТЕОРЕМ ВОТ ЭТИМ СПОСОБОМ" ... Это всего лишь значит что преподаватель выбрал неудачный пример для демонстрации возможностей применения данной теоремы, но не демонстрирует ее бесполезность...
Как видишь нигде не говорится о том что нет случаев когда гото более удобен чем другие операторы...
Но любой преподаватель увидев в твоей программе гото там где без него можно было обойтись имеет право поставить тебе 2 (что бы отвадить от легких но непрофессиональных путей). Если ты использовав гото еще и ошибешся (все бывает) то упадешь в глазах препода ниже уровня плинтуса.... ну а если ты нашел случай где гото удобнее чем другие операторы то молодец ... это твое личное достижение ... ты вышел за общие рамки...
Но если научился ходить по канату это еще не значит что стоит тянуть на него путника спокойно идущего по ровной дороге :-))))))
И к тому же если ты разбираешься в программировании то вместо того что бы тратить время на метафизические вопросы лучше скажи мне где найти инфу по событиям возникающим при помещении своего компонента на форму, его перемещении и изменении размеров, я пока что разобрался только с Loaded да и то хуже чем хотелось бы... есть что то подробное и при этом русское на эту тему??? :D
Спасибо за более красивую реализацию.
Интересно, как же мне такое в голову не пришло,
наверное торопился побыстрее сдать ;), а потом это показалось таким прям очевидным, что захотелось написать, неподумав.
Ну да ладно.
А насчет твоего вопроса. Дык вроде же все написано
в хелпе. Я как понял, ты свой компонент пишешь, тогда смотри Component writer's guide. Нет? Если нет, тогда поясни. Ну а на русском мне кажется только в очень-очень умных книгах по Билдеру или по Дельфи на 2000 страниц, но таких у нас не издают. А вообще, я в хэлпе покапался - много чего интересного найти можно.
А насчет твоего вопроса. Дык вроде же все написано
в хелпе. Я как понял, ты свой компонент пишешь, тогда смотри Component writer's guide. Нет? Если нет, тогда поясни. Ну а на русском мне кажется только в очень-очень умных книгах по Билдеру или по Дельфи на 2000 страниц, но таких у нас не издают. А вообще, я в хэлпе покапался - много чего интересного найти можно.
Спасибки ... оказывается я тормоз надеюсь не по жизни :) Не догодался выйти за пределы основного Хелпа в билдере и посмотреть файлики в папке Help не думал что они этот вопрос вынесли в отдельный раздел...
Но все же если честно то переводить такой объем ... бррррр :x
Я например в БД в свое время долго мучался пока реализовывал возврат на текущую запись после коламбурчиков со сменой фильтров...
А потом нашел текстик где на чистом русском языке рассказывалось о том как просто поставить закладку в БД (не сложнее чем в книжке уголочек листа загнуть) а потом перейти к этой закладке...
К чему это я???
А к тому что обидно изобрести велосипед (сколько иногда помучаться приходится) а потом узнать что кто то это уже сделал да еще и в 10 раз лучше тебя... вот и тут может кто то уже рассмотрел этот вопрос и мне кажется ему тоже будет обидно если счетчик на его страничке не будет крутится
:D
К тому же сколько раз встречал мнение что русского хелпа к WinAPI не существует... а покапался в инете чуть подольше и нашел несколько русских описаний API конечно далеко неполных да еще и с вставками на инглише но все таки достаточно понятных ...
А хелпы переводить... хмммм.... иногда можно и в исходники залезть... а еще и самому реализовать можно... но ...
Вобщем буду жутко благодарен за ссылочку на русскую доку где хорошо объясняется написание компонентов :D