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

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

28.01.21 19:17
Re: Задачи для начинающих
 
uscheswoi_82 свой человек
в ответ AlexNek 28.01.21 15:54
Выкладывайте свои ответы - обсудим.

А если не будут обсуждать, а будут смеятся над ответом, или пойдут ироничные или саркастические шутки?

Смотря какой террариум. Если он большой, то я предпологаю что в террариуме должно находится несколько датчиков температуры, а так-же несколько подогревательных элементов, допустим по бокам, и посередине. Ведь в квартире иногда бывают 2 или 3 обогревателя, но в константу MAX_COUNT_SENSORS можно просто установить значение 1, тогда будет от одного датчика проверяться. И если это проект для ардуино, то датчики будут возвращать скорей всего числа с плавоющей точкой, что-то вроде около нуля, а range в Python отказывается иметь дело с float, берёт только целые числа. Причём датчики ардуино, будут давать погрешность, калибровка датчиков (термометров) это тот ещё геморрой. А MicroPython какой-нибудь урезаный, там нет прям таких крутых библиотек как в нормальном Python 3.x


Требуется вначале построить Flussdiagram, а потом уже прогу на питоне.

Ох, а мне вот проще наоборот.


"Делай ..." и "Если ... То... Иначе..."

А мне больше нравится использовать ...in range...

 if avg_temp in range(MIN, MED):
...
elif avg_temp in range(MED, MAX):
...
elif avg_temp > MAX:
...
else:
...


Начну с кода, а завтра попробую Flussdiagram нарисовать.

import random 
import sys
#Константы--------------
MIN_TEMP = 0           #Минимальная температура
MED_TEMP = 5           #Средняя температура
MAX_TEMP = 10          #Максимальная температура
STEP = 1               #Шаг
MAX_COUNT_SENSORS = 5  #Максимальное количество сенсоров
#Функци-----------------
#Поиск среднего значения
def avg(items):
  return sum(items) / len(items)
#Делаем теплее
def make_warm(i, idx):
  #Инкрементация массива idx индекса i, на один шаг, с шагом STEP
  i[idx] += STEP
#Делаем холоднее
def make_cold(i, idx):
  #Декрементация массива idx индекс i, на один шаг, с шагом STEP
  i[idx] -= STEP
#Остужаем всё
def make_cold_all(i):
  #Декрементация всех элеметнов массива i, с шагом STEP
  for x in i:
    i[i.index(x)] -= STEP
#Сброс
def restart_all(mv, i):
  #Устанавливаем для каждого элемента массива i, значение mv
  for x in i:
    i[i.index(x)] = mv
#Начало-----------------
#Инициализация переменных
temp = []           # Массив со значением от датчиков
index = 0           # Индекс
avg_temp = 0        # Средняя температура
cmd = ''            # Команда, Y-дальше мониторить/A-выключить подогрев/N-выход
times = 0           # Сколько раз убавлять температуру

#Инициализация 
#temp = [1, 3, 4, 5, 10]
#Главная программа------
try:
    #Рандомно генерируем температуру
    for i in range(MAX_COUNT_SENSORS):
      temp.append(random.randint(MIN_TEMP, MAX_TEMP))
    while True:
      #Получаем среднее значение
      avg_temp = avg(temp)
      if avg_temp != None:
        avg_temp = round(avg(temp))
        #Выдаём все значения температуры
        for i in temp:
          print(i)
        #Перенос на новую строку
        print('')
        #Среднее значение 
        print(avg_temp)
        #Если среднее значение находится между минимальной и средней температуры, то:
        if avg_temp in range(MIN_TEMP, MED_TEMP):
          #Холодно
          print('Холодно, включаю подогреватель')
          #Получаем индекс массива минимальной температуры
          index = temp.index(min(temp))
          #Подогреваем
          make_warm(temp, index)
        #Если среднее значение находится между средней и максимальной температуры, то
        elif avg_temp in range(MED_TEMP, MAX_TEMP):
          print('Нормальная температура, отключаю подогреватель')
          #Понижаем температуру
          make_cold_all(temp)
        #Если температура выше максимальной температуры, то
        elif avg_temp >= MAX_TEMP:
          print('Жарко, отключаю подогреватель')
          #Понижаем температуру
          index = temp.index(max(temp))
          make_cold(temp, index)
        #Иначе ошибка   
        else:
          print('Ошибка, датчики температуры сбрасываются на минимальную температуру')
          #Сбрасывем температуру, до минимального значения 
          restart_all(MIN_TEMP, temp)
      #Спрашиваем, что делать дальше, Y-дальше, A-выключить подогрев, N-нет
      cmd = input('Дальше (Y-да/A-выключить подогрев/N-нет)?').upper()  
      #Если нажали на клавишу N, то завершаем программу
      if cmd == 'N':
        break
      #Если нажали на клавишу A, то отключаем подогрев
      elif cmd == 'A':
        try:
          #Пытаемся выключить на n-раз
          times = int(input('На сколько выключить?'))
        except Exception as err:
          print('Ошибка ', err)
        else:
          #остужаем n-раз
          for _ in range(0, times):
            make_cold_all(temp)
except Exception as err:
    print('Ошибка ', err)


В данной ситуации, т.е. в этом алгоритме выше MED_TEMP не поднимается, поэтому в данном алгоритме, т.е. строка elif avg_temp in range(MED, MAX): бесполезна.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
 

Перейти на