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

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

5160  1 2 3 4 5 6 7 8 9 10 все
uscheswoi_82 свой человек28.01.21 23:28
NEW 28.01.21 23:28 
в ответ uscheswoi_82 28.01.21 23:07

Вот Flussdiagramm:

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#21 
uscheswoi_82 свой человек29.01.21 00:14
NEW 29.01.21 00:14 
в ответ uscheswoi_82 28.01.21 23:28

Пардон, там ошибки, вместо "35 градусов", ">35 градусов", а вместо "18 градусов", "<18 градусов".

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#22 
wasja-de посетитель29.01.21 07:40
NEW 29.01.21 07:40 
в ответ AlexNek 28.01.21 15:54

Для начала попробуйте просто описать алгоритм используя конструкции "Делай ..." и "Если ... То... Иначе


наверное перед тем, как что-то программировать, правильно было бы почитать про PID контроллер, хотя бы в википедии. Там и теория есть, и свойства решения, и как это можно имплементировать. Кстати, в arduino под это есть аж целая PID Library.


Знакомый в Уни, начал подкидывать задачки.

а я бы добавил задачки от другого профессора, которые он публикует на bwinf.de - там выбор побольше будет, а если взять второй тур и все предыдущие годы, то на несколько лет можно чадо по самое здрасте загрузить, да и самому порадоваться за красиво поставленные задачи.


#23 
Программист коренной житель29.01.21 10:01
NEW 29.01.21 10:01 
в ответ uscheswoi_82 28.01.21 23:07

Может быть я что-то не так понял (и уж точно я не знаю питон :) ), но мне кажется, что ты пытаешься решить задачу "в лоб" :)

Я понимаю, что задача настолько просто сформулирована, что "в лоб" решить ее гораздо проще ;)


Но все таки мне кажется, что тут нужно сделать 2 класса:

1) Контроллер градуcника

2) Контроллер обогревателя


Контроллер градусника должен посылать сообщения контроллеру обогревателя.

Таким образом логика контроллера обогревателя становится максимально примитивной и, что важно, тестируемой:

public interface ITermometerController 
{
   event EventHandler<TemperatureEventArgs> Temperature;
}

public class TemperatureEventArgs : EventArgs
{
   TemperatureArgs (int value)
   {
     Value = value;
   }
   public int Value {get; private set; }
}

public interface IHeaterController
{
  void HeaterOn ();
  void HeaterOff ();
}

public class HeaterController : IHeaterController
{
  public HeaterController (ITermometerController termometer)
  {
     termometer.Temperature += termometer_Handler;
  }

  public void HeaterOn()
  {
    ...
  }

  public void HeaterOff()
  {
    ...
  }

  public void termometer_Handler(object sender, TemperatureArgs e)
  {
    if (e.Value > highThreshhold)
      HeaterOff();
    else if (e.Value < lowThreshhold)
      HeaterOn();
  }
}

Вот и весь код :)


#24 
koder патриот29.01.21 10:11
koder
NEW 29.01.21 10:11 
в ответ wasja-de 29.01.21 07:40
правильно было бы почитать про PID контроллер

Зачем? Это описание железяк?

#25 
koder патриот29.01.21 10:19
koder
NEW 29.01.21 10:19 
в ответ Программист 29.01.21 10:01
termometer.Temperature += termometer_Handler;

А что это значит?

#26 
Программист коренной житель29.01.21 10:36
NEW 29.01.21 10:36 
в ответ koder 29.01.21 10:19

Это подписка на эвенты.

#27 
Murr патриот29.01.21 10:38
Murr
NEW 29.01.21 10:38 
в ответ Программист 29.01.21 10:01

нужно сделать 2 класса

-----

нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.

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

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

это и будет решение в лоб.


НО! это не будет решением начинающего... хммм

#28 
Murr патриот29.01.21 10:42
Murr
NEW 29.01.21 10:42 
в ответ Murr 29.01.21 10:38

Пыхх... ты так и написал 5-ку... спок

#29 
Программист коренной житель29.01.21 10:58
NEW 29.01.21 10:58 
в ответ Murr 29.01.21 10:38
нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.

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

Поставленная в 1-ом посте задача сводится к "написать котроллер обогревателя". Все остальное - вода.


НО! это не будет решением начинающего...

Это направление, в котором начинающий должен двигаться, если он хочет чему-то научиться.

#30 
Программист коренной житель29.01.21 10:59
NEW 29.01.21 10:59 
в ответ Murr 29.01.21 10:42
Пыхх... ты так и написал 5-ку...

Там 2 класса, один из которых не имеет функционала. И я его привел просто для того, чтобы не было лишник вопросов.

#31 
koder патриот29.01.21 11:14
koder
29.01.21 11:14 
в ответ Программист 29.01.21 10:36
Это подписка на эвенты.

Что за язык?

#32 
koder патриот29.01.21 11:20
koder
NEW 29.01.21 11:20 
в ответ Murr 29.01.21 10:38
нужно делать 5 классов - градусник, нагреватель, два контроллера и террариум.

В реальности нужен только один класс, который реагирует на событие. Событие - изменение температуры. Событие приходит от термометра, но на самом деле это не важно - удав может по желанию включать и выключать обогреватель, подавая нужное событие, например имитируя градусник. Градусник не должен пренадлежать обогревателю - лёзе куплюнг. Мне нравится решение программиста, хотя я не понимаю этот синтаксис


#33 
Программист коренной житель29.01.21 11:30
NEW 29.01.21 11:30 
в ответ koder 29.01.21 11:14
Что за язык?

C#

#34 
Murr патриот29.01.21 11:32
Murr
NEW 29.01.21 11:32 
в ответ Программист 29.01.21 10:58

Поставленная в 1-ом посте задача сводится к "написать котроллер обогревателя"

-----

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


В постановке задачи определены три сущности - террариум, нагреватель и термометр(?, не явно).

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

изолируем фактические нагреватель и термометр соответствующими контроллерами.

Вот она - 5-ка.

Можно - усложнить (или упростить сопровождение) введя фабрики для двух сущностей, как оно обычно и бывает на практике.



в котором начинающий должен двигаться

-----

Ну должен. У него, правда, пока еще не уложилось Если...То...Иначе. смущ



Там 2 класса, один из которых не имеет функционала.

-----

А должно быть минимум 3.

Пусть два из них - нагреватель и термометр - абстрактные.

При этом нагреватель не должен знать об термометре, а термометр - об нагревателе.

Вообще не должны. Потому как в террариуме они никак напрямую не взаимодействуют.

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



И, кстати, у тебя в решении есть существенная ошибка.

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

В большинстве случаев это будет корректно.

Но не всегда - террариум, по определению, является системой с контролируемой температурой.

Так что вполне может иметь место ситуация когда надо охлаждать - следовательно - надо переделывать контроллер. спок

#35 
Программист коренной житель29.01.21 11:58
NEW 29.01.21 11:58 
в ответ Murr 29.01.21 11:32
Тогда вполне годится сааамый первый вариант...

Не подходит. Там термометр опрашивается в цикле.


В постановке задачи определены три сущности - террариум, нагреватель и термометр(?, не явно).террариум, по определению, должен агрегиривать нагреватель и термометр.

Аквариум, терариум или жилая комната - в данной задаче это не имеет значения. Это просто описательная информация. Также как в задаче "Ученица 1-ого класса деревенской школы построила себе в лесу шалаш и спрятала там 10 монеток. При этом в своей копилке дома у нее было 16 монеток. Сколько всего монеток было у школьницы?" полно описательной информации, которая ничего не дает. Это просто контекст, который не играет никакой роли в решении.


изолируем фактические нагреватель и термометр соответствующими контроллерами.

Именно это я и сделал. При этом код контроллера термометра никого не интересует, поэтму я ограничился только кодом контроллера нагревателя.


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

Ну это уже holly war на тему "толстых" и "тонких" контроллеров :)


В большинстве случаев это будет корректно.

А если прочитать условие задачи, то это будет корректно и для данной задачи :)

#36 
Murr патриот29.01.21 11:58
Murr
NEW 29.01.21 11:58 
в ответ koder 29.01.21 11:20

Событие приходит от термометра

-----

А кто сказал, что Термометр в состоянии делать нотификацию?

Может или не может - неизвестно - потому термометр и оборачивается в контроллер термометра.

Нагреватель - аналогично.


удав может

-----

Может.

Для корректно имплементированного кода это не должно вызывать переписывания кода.

И вместо удава там может быть какой-нибудь песец или пингвиn...

#37 
Murr патриот29.01.21 12:10
Murr
NEW 29.01.21 12:10 
в ответ Программист 29.01.21 11:58

Не подходит. Там термометр опрашивается в цикле.

-----

Ну и что? Ну опрашивается, ну в цикле. Заявленному требованию - удовлетворяет - значит годится. спок



Ну это уже holly war на тему "толстых" и "тонких" контроллеров :)

-----

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



А если прочитать условие задачи

-----

Читаем:

нужно поддерживать постоянную заданную температуру

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

#38 
Программист коренной житель29.01.21 12:15
NEW 29.01.21 12:15 
в ответ Murr 29.01.21 12:10
Ну и что? Ну опрашивается, ну в цикле. Заявленному требованию - удовлетворяет - значит годится.

Где я говорил, что это решение не годится? Я сказал, что это решение "в лоб". Ну или если бы писали на ANSI C :)


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

Толстые и тонкие контроллеры - это не вопрос привильно или нет. Спорить тут не имеет смысла.


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

Это потому что ты прочитал только половину условия:

нужно поддерживать постоянную заданную температуру, для этого есть функции "ВключитьНагрев", "ОтключитьНагрев".

Почему ты проигнорировал то, что после запятой - большой вопрос.

#39 
koder патриот29.01.21 13:08
koder
NEW 29.01.21 13:08 
в ответ Murr 29.01.21 11:58
А кто сказал, что Термометр в состоянии делать нотификацию?

Это самое красивие решение. Поскольку реальные приборы не названы и задача учебная, нужно привести красивое теоретическое решение. Контроллер действительно может долбить термометр регулярно, опрашивая температуру и принимая решение после каждого опроса. Но это не красиво.


Более того, а кто сказал, что обогреватель вообще автоматически может реагировать на изменение температуры? И ВДРУГ, решение Программиста полностью функционирует без переписывания, если в качестве эвента выступает дворник, считывающий температуру и инициирующий события.


#40 
1 2 3 4 5 6 7 8 9 10 все