Конечные Автоматы (специально для elan)
Меня расстраивает нагромождение нерационального кода, решение простых задач сложными, дико неэффективными способами.
Какой каток? В данный момент работаю над программой в которой КА с 43557 состояний и еще пару тысяч состояний добавится. В той КА только два состояния. Ну может кому то он каток...:)
А зачем вообще тут конечный автомат? Зачем?
Практически любую задачу программирования можно решить с помощью конечных автоматов, но это не значит, что любую задачу надо решать с помощью конечных автоматов.
Что касается 43557 состояний, ты этот автомат тоже оформил с помощью switch ? Тогда прими мои соболезнования!
Нагромождение и усложнение простых вещей - не признак профессиональности, а наоборот. Здорово, что ты научился строить автоматы, но не стоит их приспосабливать к чему не попадя.
[QUOTE=Green]
2) задача решается за O(n log n), а не за те O(n^2), которые ты предлагаешь;
Не исключено, что программы будут переводиться в Fortran, и они писались таким образом, чтоб перевод был как можно более простой, напр. я поэтому не использовал динамические переменные. Не знаю есть ли в Fortran-e ф-ия qsort(вроде вопрос топика как сортировать строки), поэтому я написал тот модуль без сортировки.
[/QUOTE]
А при чем тут О-большое и язык программирования, динамические переменные?
Что касается сортировки, то если писать программу структурированно, а не лепить всё в одну кучу, то у тебя был бы просто метод sort, а уж что там у него внутри (реализация) не так важно. Незнание того есть ли Fortran сортировка или нет, не меняет сути алгоритма: "сортируем, сравниваем соседей". Не имел дело с фортраном, но уверен, что уже есть реализованные алгоритмы сортировок. А если даже и нет, то никто не мешает реализовать такой алгоритм, но будет он идти отдельной функцией, а не вкраплением в монолитный код.
Может быть 2, 3 макс. 10 слов. На теперешних компах разница в программе с сортировкой и без сортировки будет незаметна.
М-да... кто тебя такому научил? Можешь плюнуть ему в лицо.
Давай найдем повторы в выборке из тысячи слов.
Твоему алгоритму потребуется миллион итераций!
А по идее нужно всего то 10 тысяч, т.е. можно в 100 раз быстрее!
Из того что ты не можешь прочитать еще не следует, что код вообще нечитаем. Ты хоть в своем коде можешь разобраться?
Я могу читать код различной степени ЗАПУТАННОСТИ и НАГРОМАЖДЕННОСТИ, но это не значит, что мне приятно и удобно его читать. У удобство - основной показатель в программировании, иначе программы писались бы вообще в машинных кодах, а не на языках программирования.
Почему бы тебе было не привести свою программу в таком виде?
5C 04 00 00 83 C4 08 89 │ 46 0C 85 C0 75 17 8B 15
BC 05 4E 00 56 52 E8 45 │ 03 00 00 83 C4 08 33 C0
5F 5E 5B 5D C3 53 57 E8 │ 34 04 00 00 83 C4 08 89
46 10 85 C0 75 20 8B 46 │ 0C 50 E8 41 04 00 00 8B
0D BC 05 4E 00 56 51 E8 │ 14 03 00 00 83 C4 0C 33
C0 5F 5E 5B 5D C3 8B C6 │ 5F 5E 5B 5D C3 6A 05 6A
7D 68 90 26 4C 00 E8 75 │ F7 FF FF 83 C4 0C 85 C0
74 01 CC 5F 5E 33 C0 5B │ 5D C3 90 90 90 90 90 90
55 8B EC 56 57 8B 7D 08 │ 85 FF 75 1F 6A 05 68 BF
00 00 00 68 90 26 4C 00 │ E8 43 F7 FF FF 83 C4 0C
85 C0 74 01 CC 5F 5E 33 │ C0 5D C3 8B F7 8B 56 04
33 C0 85 D2 7E 10 8B 4E │ 0C 83 39 00 7F 43 40 83
C1 04 3B C2 7C F3 8B 76 │ 14 85 F6 75 E0 8B F7 8B
7F 14 8B 46 0C 50 E8 A5 │ 03 00 00 8B 4E 10 51 E8
9C 03 00 00 8B 15 BC 05 │ 4E 00 56 52 E8 6F 02 00
00 83 C4 10 85 FF 75 D5 │ 5F 5E B8 01 00 00 00 5D
C3 6A 05 68 C8 00 00 00 │ 68 90 26 4C 00 E8 CE F6
FF FF 83 C4 0C 85 C0 74 │ 01 CC 5F 5E 33 C0 5D C3
Кому надо тот поймет... :)
Несколько раз мне пришлесь менять программу, написанную другим программистом, который был подобно комментирован. Перед тем как разобраться в коде я сперва удалил комментарии. Но в данном случае у тех комментарий 2 цели. 1.проще перевести код в фортран. 2. Их можно записать один к одному в блок-схему.
Если бы ты разбил свою программу на логические блоки, правильно бы их оформил и назвал, дал переменным внятные имена, комментарии были бы не нужны, тем более для такой элементарной задачи. Ты же не читаешь комментарии и инструкцию по использованию обычной чайной кружки или ложки? Зачем, и так всё понятно. Даже инструкцию для магнитофона не обязательно изучать, чтоб включить музыку.
А твои комментарии, даже при сущуствующем виде твоей программы, излишни и лишь загромождают текст программы.
Можно по комментариям понять как работает программа и самому написать код.
Понимать, как работает программа нужно по тексту программы, а не по комментариям. Для чего вообще тогда нужны языки программирования? Машина языков не понимает, ей нужен скомпилированный код.
Если ты пишешь так, что и человек не понимает кода, а может разобраться только с помощью комментариев к этому коду, то почему бы тебе не писать сразу в машинных кодах? Так хоть компилировать не придется...
Если тебя это успокоит, то ты прав, я совершенно не умею пользоваться этим языком
Да мне то в принципе всё равно. Я пытаюсь до тебя донести, что ты не только не знаешь язык (бог с ним с языком, он не так важен), но и не умеешь мыслить структурировано.
я хотел показать как просто решаются такие задачи с использованием КА. Для этого и привел все 5 программ.
Да не нужен здесь конечный автомат. Ты лишь усложнил решение простой задачи.
Конечно не спорю. С использованием STL программа была бы намного меньше и проще, но ту программу уже точно не переведешь на Fortran.
А при чем тут STL?
Эти задачи можно просто решить и без STL, но так же и без конечного автомата. И решение будет простым и понятным.
Но кто-то договорился до того, что я не умею называть переменные (imho называю как хочу) и не умею пользоваться Си++.
Если ты пишешь программу и не собираешься даже сам её когда-либо потом даже просматривать, а не то что выкладывать на всеобщее обозрение, то можешь писать, как хочешь. Но раз уж ты показываешь свою программу, да ещё и в качестве примера, то будь добр сделать её ЧИТАБЕЛЬНОЙ.
автоматы красивая штука ))
только стоит ли усложнять решения элементарных задач
А при чем тут STL?
Эти задачи можно просто решить и без STL, но так же и без конечного автомата. И решение будет простым и понятным.
На самом деле, использование элементов STL для C++ кода предложил я, просто потому, что в моем сознании она связана с современным С++ неразрывно. И для прикладных задач использовать char * - имхо, смешно:)
Думаю, ты не считаешь это нерациональным усложнением кода.
Если я не ошибаюсь, elan писал не на С++, a на С :). Что меня "радует" в разделе Студентам, это когда просят решить задачу на С, им решают на С++ и все довольны :) :) :) А для меня это абсолютно разные языки.
Думаю, ты не считаешь это нерациональным усложнением кода.
Да нет, конечно.
Хотя нам и приходится писать на C++ но без STL. Но это не мешает "рисовать" свои строковые классы.
Ты совершенно права, это разные языки. Но даже на С никто функции не отменял. :)
автоматы красивая штука
только стоит ли усложнять решения элементарных задач
Красивая только там, где она действительно красивая... :)
А в данном случае, из пушки по воробьям.
Мне кажется если человек выложил 10 фрагметов кода на С/С++ для студенческой задачи по Фортрану,то у него должна быть на это какая то веская причина ? По крайней мере сам код можно обсуждать то ?
Если нет - тогда вопрос : зачем он его выкладывал ? Чтоб помочь Gloms ? :)
Замечания Green по поводу читаемости кода- справедливы. "Программа должна быть написана для человека, который будет ее читать и только попутно - для машины,которая будет ее
выполнять"( Harold Abelson && Gerald Jay Sussman )
3) ты когда-нибудь слышал о разбиении программы на логические блоки, функции? Твой код невозможно
читать!.
Так все правильно,есть принцип "одна функция - одна задача".Длинная ф-ия препятствует реализации этого принципа и эта проблема решается путем разбиения задачи на отдельные логические блоки.
Не знаю,меня когда то учили так : если код функции не возможно охватить одним взглядом - стоит подумать о ее разбиении.(хотя может это и не совсем корректно и правильно).
4) переменным надо давать ясные имена, а не те невероятные сокращения, перемешенные регистры букв и непонятные "magic numbers";
Опять же абсолютно верно.Чего обижаться то ? Стоит использовать непротиворечивые и значимые имена и следовать принятым соглашениям об именовании."Если вы не можете сами разработать соглашение об
именовании воспользуйтесь следующим:имена классов,ф-ий и перечислений выглядят как LikeThis,имена переменных - ikeThis,имена закрытых членов - likeThis_,имена макросов - LIKE_THIS"( Герб Саттер ). В любом случае в именовании должен быть хоть какой-то порядок.
P.S.По поводу С и С++.Где то читал,что есть такая старая шутка,которая гласит примерно следующее:
Язык называется С++ , а не ++С потому что язык был улучшен(на что и указывает инкремент),но многие программисты
продолжают использовать его как С( как предыдущее значение до инкремента).