Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Задачи для начинающих

5160   10 11 12 13 14 15 16 17 18 19 20 все
Программист коренной житель15.02.21 15:37
NEW 15.02.21 15:37 
в ответ Murr 15.02.21 15:25
Бо, всем понятно что там будет - табличка: текущее состояние, управляющие сигналы, новое состояние.
Ищется совпадение первых двух и возвращается третье. Все по теории.

Ага, вот только что-то мне подсказывает, что у тебя там будет говно код в стиле


switch (blah-blah)
{
  case 1:
   break;
 case 2:
   break;
}
Murr патриот15.02.21 15:40
Murr
NEW 15.02.21 15:40 
в ответ Программист 15.02.21 15:14

роль контроллера исполняет зацикленный лист

-----

У тебя "зацикленный лист" завязан на конкретную реализацию светофора и последовательность сигналов.

Изменится светофор - надо переделывать КОД, а машина состояний в контроллере никак не завязана на светофоры.

И не важно какой конфигурации перекресток - Я поленился переименовать ТТрафикЛигхт в ТРоадКросс... ну да, лентяй, каюсь...

Программист коренной житель15.02.21 15:41
NEW 15.02.21 15:41 
в ответ koder 15.02.21 15:34

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

Murr патриот15.02.21 15:58
Murr
NEW 15.02.21 15:58 
в ответ koder 15.02.21 15:34

Состояние должно знать следующее состояние?

-----

Ну если его совмещают с контроллером - почему бы и нет?

Murr патриот15.02.21 16:07
Murr
NEW 15.02.21 16:07 
в ответ Программист 15.02.21 15:37

что у тебя там будет говно код в стиле

-----

Нее, Я это привык делать трехколоночной табличкой. безум

Ну или двухколоночной если управляющих сигналов нет... улыб

Верификацию же надо делать - 100 элементов во входящем состоянии, 20-30 управляющих, 100 в выходящем состоянии и от 20 до 5000 строк - мне его руками проверять ой как лениво...

А кейсовый говнокод иногда в мок могу сунуть - там без валидации сойдет... бебе

Murr патриот15.02.21 16:15
Murr
NEW 15.02.21 16:15 
в ответ Программист 15.02.21 15:41

это особенно полезно

-----

Это никогда НЕ полезно.


т.е. если есть ветвления

-----

Ну нет в автомате ветвлений. Есть - дополнительные состояния.

Сколько всего этих состояний должно быть - смотри в теории - тема - минимизация автоматов.

anly патриот15.02.21 17:23
anly
NEW 15.02.21 17:23 
в ответ Программист 15.02.21 09:59
Прости конечно, но это самое ужасное режение из всех возможных.
прощаю конечно, ведь ты не учавствовал в беседе, поэтому не должен понимать о чем шла речь.

А вот с АлехНек и Мурр у меня была беседа в стиле Гладышева с Иваном Чонкиным, когда он объяснял ему почему у коня пальцев нет.улыб

- Вот ты вчерась насчет лошади спрашивал.

- Насчет какой лошади? - не понял Иван.

- Ну вообще, почему, мол, она человеком не стала.

- А-а, - Иван вспомнил, что в самом деле вчера был какой-то такой разговор.

- Так вот, - с гордостью сообщил Гладышев. - Я понял, почему лошадь не становится человеком. Она не становится человеком, потому что у ней пальцев нет.

- Эка, удивил, - сказал Чонкин. - Это я с малых лет знаю, что у лошади нет пальцев.

- Да я тебе не о том. Я говорю не то, что у ней нет пальцев, а то, что она не становится человеком, потому что у нее нет пальцев.

- А я тебе говорю - это всем известно, что у лошади нет пальцев.

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

Предлагаю подойти к решению задачи с другой стороны:
хорошее решение, да только не подходящее для стандартных систем программирования контроллеров.

Ибо в этих языках:

- нету Sleep (поэтому надо следовать совету Мурр, и вынести Next из класса)

- нету интерфейсов

- класс имеет только одну функцию у которой есть доступ к входным, выходным и локальным данным класса. В локальных данных могут быть инстанциированны другие классы, единственную функцию которых можно вызвать, предварительно записав необходимое в их входные данные, и считав выходные после вызова их единственной функции.

- альтернатива CASEу только IF-ELSE. Никаких Action<>, которые можно было бы засунуть в таблицу, нету.

- рекурсии невозможны

Состояний у светофора не так много:
таблица состояний это конечно хорошо.

Еще лучше таблица переходов (что предлагал Мурр), где для каждого состояния указаны условия переходов в другие состояния.

А еще лучше таблица переходов изображенная в виде графа.

А это ни что иное, как язык SFC из упомянутого стандарта.

Там сразу рисуешь такой граф.

...........

Единственный язык из стандарта, который по структуре подобен СиШарпу, это ST. И если соблюдать ограничения, то написанную программу на СиШарпе можно, слегка подправляя текст, преобразовать в ST и наоборот.

Проклят нарушающий межи ближнего своего (Втор.27:17)
Murr патриот15.02.21 18:12
Murr
NEW 15.02.21 18:12 
в ответ anly 15.02.21 17:23

Еще лучше таблица переходов

-----

Гы... Одно - Мили, другое - Мур.

И почти всегда из одного можно сделать другое.

Мне юзерские сигналы удобнее иметь отдельно - меньше переделывать - один компаратор...

AlexNek патриот15.02.21 20:09
AlexNek
NEW 15.02.21 20:09 
в ответ Программист 15.02.21 13:40
Что может быть проще, чем один бесконечный цикл?

У нас получается два варианта:

  1. Задача не для начинающих.
  2. Задача для начинающих. В таком случае должны быть использованы только те элементы которые им известны. Классы и интерфейсы к этому не относятся, к сожалению.


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


Pedestrian Red, Auto Green, delay 5s
Pedestrian Red, Auto Yellow, delay 3s
Pedestrian Red, Auto Red, delay 2s
Pedestrian Green, Auto Red, delay 15s
Pedestrian Red, Auto Red, delay 1s
Pedestrian Red, Auto Green, delay 5s
Pedestrian Red, Auto Yellow, delay 3.015s
Pedestrian Red, Auto Red, delay 2s
Pedestrian Green, Auto Red, delay 15s
...

Также очень бы хотелось увидеть реализацию класса TrafficLightButton для консольной проги под виндой, без каких либо извращений.

Для теста было использовано просто без нажатия кнопки.

internal class TrafficLightButton : ITrafficLightButton
{
        private bool _isPressed = false;

        public bool IsPressed
        {
            get
            {
                return _isPressed;
            }
        }

        public void Reset()
        {
        }
}
anly патриот15.02.21 20:20
anly
NEW 15.02.21 20:20 
в ответ Murr 15.02.21 16:07, Последний раз изменено 15.02.21 20:21 (anly)
А кейсовый говнокод иногда
улыб предлагаю подписать петицию в центры стандартизации СиШарпа об устранении оператора switch-case в следующей редакции языка.

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

Кто за?

Проклят нарушающий межи ближнего своего (Втор.27:17)
anly патриот15.02.21 20:45
anly
NEW 15.02.21 20:45 
в ответ AlexNek 15.02.21 20:09
Кстати, после тестирования выявлено, что приведенный код абсолютно нерабочий. А после возможного исправления, работает не так, как ожидалось
это только теоретически таблиц достаточно.

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

И если это ему часто придется делать, то и брезгливость к графам как рукой снимет.улыб

Проклят нарушающий межи ближнего своего (Втор.27:17)
AlexNek патриот15.02.21 21:01
AlexNek
15.02.21 21:01 
в ответ anly 15.02.21 20:45
который плевался ранее глядя на графы, сам начнёт рисовать их на бумаге

Многое зависит от решаемых задач. Тот же робот просто вынужден переходить из одного состояния в другое.

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

А когда, просто одна задачка попадется ее можно решить по разному. И рисунки могут вообще не понадобится.

https://en.wikipedia.org/wiki/State_pattern

AlexNek патриот15.02.21 21:04
AlexNek
NEW 15.02.21 21:04 
в ответ anly 15.02.21 20:20
устранении оператора switch-case

проблема не в операторе, а в его использовании.

Это как типа нож. Можно и так и так использовать.

anly патриот15.02.21 22:15
anly
NEW 15.02.21 22:15 
в ответ AlexNek 15.02.21 21:04
проблема не в операторе, а в его использовании. Это как типа нож. Можно и так и так использовать.
это верно, как и то, что Clean Code Development - как пиво: вещь хорошая, но можно и заболеть, а может и мозги отключить вообще, так, что кроме него ни о чем и думать не сможешь.улыб
Проклят нарушающий межи ближнего своего (Втор.27:17)
Murr патриот15.02.21 23:45
Murr
NEW 15.02.21 23:45 
в ответ AlexNek 15.02.21 20:09

У нас получается два варианта

-----

У нас получается:

- одна учебная задача

- множество, в зависимости от квалификации прогера, решений


Классы и интерфейсы к этому не относятся

-----

Ну так определяйся с тем что они знают и что могут/должны пользовать.

А то - начали со средины - непонятно знают ли они переменные, выражения, операторы и т.п...

Murr патриот15.02.21 23:50
Murr
NEW 15.02.21 23:50 
в ответ anly 15.02.21 20:20

Кто за?

-----

Поддерживаю!

Но не надо останавливаться на достигнутом - там есть еще целая куча всякого гамно-мусора - if-else, for, while, do... this...

Добавляем в петицию?

koder патриот16.02.21 05:45
koder
NEW 16.02.21 05:45 
в ответ AlexNek 15.02.21 20:09
Классы и интерфейсы к этому не относятся, к сожалению.

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

koder патриот16.02.21 05:48
koder
NEW 16.02.21 05:48 
в ответ anly 15.02.21 20:20
об устранении оператора switch-case в следующей редакции языка.

Зачем? Но ваш код действительно читать очень тяжело. Я, пока дочитал до середины метода, забыл, с чего начал

AlexNek патриот16.02.21 13:56
AlexNek
NEW 16.02.21 13:56 
в ответ anly 15.02.21 22:15
но можно и заболеть

Обычно заболевают те у кого иммунитет слабый спок

ССД еще никому не мешал, но в программировании роботов действительно абсолютно бесполезная вещь.

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

AlexNek патриот16.02.21 14:11
AlexNek
NEW 16.02.21 14:11 
в ответ Murr 15.02.21 23:45
У нас получается:- одна учебная задача

Это если смотреть абстрактно, а свете топика вроде однозначно - задачи для начинающих которые с программированием раньше не сталкивались.


Конечно, ничто не мешает нам поиграться и предложить самые разные решения - тоже интересно.


Ну так определяйся с тем что они знают

А ты что забыл как сам на 4-х лапах ходил и что знал при этом бебе

Судя по тестовому объекту - знаний практически нет