Кто как пишет алгоритмы?

Тема в разделе "Флудилка", создана пользователем ИгорьК, 28 фев 2019.

  1. ИгорьК

    ИгорьК Гуру

    Речь не о коде непосредственно, речь о другом.

    Решил я, например, автоматизировать полив огорода. Приблизительно понимаю, что надо в какое-то время включать насос, заливать бочку, открывать краны, etc.
    Все это лишь приблизительно.

    Дальше я сажусь за компьютер и начинаю "в лоб" писать код. Не рисую никаких блок-схем.
    В результате на выходе практически всегда получается нечто, отстоящее от первых мыслей очень далеко и гора "старого" кода.

    Получается типа такого:

    upload_2019-2-28_18-11-25.png

    Ну это же, наверно, не правильно? Кто как действует? У кого-нибудь хватает силы воли до конца нарисовать алгоритмы и потом писать код? Как вы это делаете?
     
  2. DetSimen

    DetSimen Спамовредитель Модератор

    Я сначала пишу матом по белому, что я хочу получить
     
    parovoZZ нравится это.
  3. Это нормальный процесс - переписывать огромные куски кода. С опытом необходимость в этом возникает реже, но всё равно возникает. Схемы рисуются для коллективной работы, чтобы каждый мог независимо работать над своим, и всё состыковывалось.
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Я сажусь и тоже "в лоб" пишу структуру алгоритма, типа такого:
    Код (C++):

    void setup()
    {
      void restoreFromEEPROM();
    }


    void loop()
    {
      void testDisplay();
      void testSensors();
      void testButtons();
     
      void sheduler();
      void readButtons();
      void readSensors();
    }
     
    А потом потихоньку наполняю каждый блок кодом. Удобно тем, что:
    а) четко и сразу видна структура программы (меньше переделок потом)
    б) код готов к компиляции в любой момент
    в) кодить получается быстро - каждая часть логики записана отдельным блоком (функцией) и чаще всего просто копируется в готовом виде прошлых проектов.
     
    parovoZZ, Airbus и ostrov нравится это.
  5. parovoZZ

    parovoZZ Гуру

    Я даже хочу поставить какое-то ПО за контролем версий. Хоть и пытаешься писать код максимально выводонезависмый))), но когда приходишь к мысли, что этот МК не подходит и его надо менять, код полностью летит в мусорку.
     
  6. Daniil

    Daniil Гуру

    Не для всех проектов, но стараюсь писать в отдельном файле глобальный ченджлог (не пишу "переименовал переменную", а "реализован ввывод на дисплей").
    Старые схемы не удаляю, чтобы вспомнить "что я там соединил" и "что у меня было соединено".
    Блок-схемы стараюсь делать для работы как для документации, так и вспомнить мою молодую и горячую логику. Ибо мог запрогать что-то вчера, переключиться на новую задачу, а сегодня все сломалось. Провернуть шестеренки в голове к старой задаче помогают блок-схемы.
     
  7. KindMan

    KindMan Гик

    Я тоже сразу кодю. Когда-то пробовал на бумаге, блок схемами, но всё равно получается if else.… так что теперь время не трачу. Но код собираю маленькими кусками, сначала отлаживаю, потом дальше новых жуков добавляю и снова ловлю. Когда всё готово, переписываю с учетом всех возникших тонкостей, пытаюсь оптимизировать. Помню, когда первый раз пробовал программу писать, карточную игру, на размешивание колоды не смог придумать ничего лучше, как завести 36 переменных и сравнивал их друг с другом (представили, да, код). Вторая версия уместилась в 5 строк. Так был доволен прогрессом :)
     
  8. parovoZZ

    parovoZZ Гуру

    У меня в изыде что-то в бекапах, что так в версиях.
     
  9. Airbus

    Airbus Радиохулиган Модератор

    Я примерно как Tomasina.Пишу всё что надо.Потом оптимизирую-удаляю ненужные телодвижения.Откатываю на железе и только тогда сохраняю.Бетта версии не сохраняю и бэкапы не делаю.Ибо можно запутаться.Что когда и для чего пишу в шапке в коментах.
     
  10. Arkad_snz

    Arkad_snz Гик

    Лучше (корректнее) писать русским по белому, а не вводить еще один язык (матерный).
    Удобно кроме просто слов русского языка ввести свои спец. обозначения для отдельных операций, но нужно обязательно написать, и иметь табличку перевода этих обозначений на русский.
    Гляньте про роль алгоритма - http://forum.amperka.ru/threads/Необходима-помощь-в-решении-проблемы-с-alphabot.17854/#post-210633
    Про свою систему обозначений: Можно использовать конструкции из языков высокого уровня (присвоение, ветвление...), а можно придумать свои, исходя из специфики исполнительного механизма (что-нить навроде - "разжать захват", "поднять правый манипулятор", "мигнуть фарой"...).
    -----
    Рисовать блок-схемы ромбиками/квадратиками со стрелочками - тухлая практика.
    Вам же этот текст алгоритма предстоит переводить на формальный язык, а текст переводить удобнее, чем картинку! Да, и коментарии для проги уже, считай готовы - не надо ничего выдумывать.
    Потом проверяя свою прогу (с коментариями из строк алгоритма) вы себе же пять раз "спасибо" скажете!
    -----
    Совет: Не используйте в записи алгоритма синтаксис идентификатора, и все, что с ним связано.
    Можно только ввести (в начале текста) обозначения/сокращения для длинных понятий (напр. - "Температура за окном" - Ту) и везде далее в тексте использовать принятые (вами) ранее сокращения
    Имена переменным/идентификаторам придумает кодировщик (возможно, что использует ваши же сокращения) при переводе вашего текста алгоритма на формальный язык.
     
    Последнее редактирование: 28 фев 2019
  11. Arkad_snz

    Arkad_snz Гик

    В технологии кодирования - переводе ТЗ или алгоритма есть правило:
    В первую очередь определись с сущностями, которыми предстоит оперировать, а для этого выпиши все имена существительные (м.б. с поясняющим прилагательным из текста ТЗ и алгоритма в столбик.
    Каждой сущности придумай краткое имя/сокращение. Вот и пригодились сокращения в тексте алгоритма!
    Теперь определись со свойствами, и с атрибутами каждой сущности (по тексту, и из здравого смысла) - вот вам типы переменным, и поля (если структура)...
    Потом таким же манером расковыриваем глаголы, и получаем необходимые фунции/методы классов.
    Затем - строка за строкой/ операция за операцией переписываем действия алгоритма на выбранный язык высокого уровня - Имеем "исходный текст" программы.
    Пропускаем исходник через компилятор (на предмет проверки синтаксиса)
    Если все ОК - добавляем контрольные точки (КТ) - вывод критических параметров системы (скорость, высота, углы...). Может придется "прикрутить" телеметрию.
    КТ нужны не потому, что возможно накосячили, а в первую очередь из-за возможного влияния неконтролируемых процессов (внешние помехи), влияние внешней среды (кочка, ямка...).
    Да, и вообще - для протоколирования "пробных заездов", и последующего анализа поведения нашего монстра, и для приведения его "в чувство" максимальноприближенное к ТЗ
    Кроме приведения системы к ТЗ - не вредно еще иметь контроль параметров окружающей среды (температура, влажность,освещенность...) - для анализа диапазона применимости нашей поделки.
     
    Последнее редактирование: 1 мар 2019
    Daniil нравится это.
  12. !@#$

    !@#$ Нерд

    Начинаю с распределения пинов. ... сколько нужно на вход и куда какой датчик. Потом выходы ... куда какой исполнительный механизм. На простых скетчах проверяю работоспособность датчиков и исполнительных механизмов. Это важно. Заодно докачиваю или устанавливаю их библиотеки.
    По возможности короче и первым делом проверяю самую стрёмную часть идеи проекта. Или ту, в которой плохо разобрался. Как их осилил перехожу к написанию рутины и отладке.
     
    Последнее редактирование: 4 мар 2019
    Daniil нравится это.
  13. znamen

    znamen Guest

    Почитал ответы и понял,что все эти подходы полная ерунда. Я до определённой поры делал также"в лоб"
    Жизнь заставила переосмыслить. Начальство на пальцах объясняло задачу.Задачу решал. Решение предоставлял. Начальство было недовольно,что сделано не так. Хотя я сделал все так.После этого я изменил
    подход. Я писал четкий алгоритм решения поставленной задачи,при помощи квадратиков и ромбиков как
    положено классически. Затем предоставлял алгоритм на утверждение. Начальство под алгоритмом расписывалось. Когда я этот алгоритм программно реализовывал и начальство выражало недовольство
    реализацией программного решения,я тыкал ему в нос согласованный с ним алгоритм и просил указать
    мой неправильный ход программной реализации. И в 100% доказывал не корректность поставленной задачи.
    Без четкого алгоритма я бы не смог доказать свою правоту. Потом это вошло в привычку.Неукоснительно
    соблюдая алгоритм-избегаем путаницы в реализации программного кода.
     
    parovoZZ и ИгорьК нравится это.
  14. ИгорьК

    ИгорьК Гуру

    А в чем квадратики рисуете?
     
  15. znamen

    znamen Guest

    Квадратики рисую шариковой ручкой на простой бумажке. Начальство не шарит в программном коде. А на
    квадратиках и ромбиках -понимает логику. Последовательность квадратиков есть ход программы. Ромбики
    - ветвления,где указано, что если да-то туда,а если нет,то туда. А,если не туда и не туда-то,куда.
     
    parovoZZ и ИгорьК нравится это.
  16. znamen

    znamen Guest

    Доходило до смешного. Демонстрировал промежуточный вариант. Говорят-вот здесь не так работает. Отвечаю-сейчас алгоритм принесу. Не надо ,говорят-наверное мы упустили этот момент.Пришёл,посмотрел
    алгоритм-ничего они не упустили. Это я накосячил. Механик,который железяки делает под проекты мечтает
    тоже этих квадратиков нарисовать.
     
    ИгорьК нравится это.
  17. ИгорьК

    ИгорьК Гуру

  18. Airbus

    Airbus Радиохулиган Модератор

    Есть Algorithm Builder.Там всё программирование на Асме квадратиками и ромбиками.Чел который с ним работает (Get Chip) поистине впихивает невпихуемое в AVR.К сожалению в последние годы он тоже подсел на Ардуино.
     
    ИгорьК нравится это.
  19. znamen

    znamen Guest

    Посмотрел из интереса этот буилдер. Тот же ассемблер,только в извращенной форме.Алгоритм это есть
    кратчайший путь решения задачи. А в этом буилдере,только в название есть слово алгоритм. А так чисто
    картиночный язычишко,придуманный для людей у которых образное мышление преобладает над логичным.
    Это моё лично субъективное мнение. Прошу не пинать,если что.
     
    parovoZZ нравится это.
  20. Daniil

    Daniil Гуру

    ИгорьК нравится это.