Пример. Работа с микроволновой печью.
Описание системы:
1) имеется единственная кнопка управления, которая доступна для пользователя печи. Если дверь печи закрыта, и пользователь нажимает кнопку, то печь будет готовить пищу в течение 1 минуты;
2) если пользователь нажимает на кнопку во время работы печи, получаем дополнительную минуту работы;
3) если дверь открыта, нажатие кнопки не имеет эффекта;
4) внутри печи есть электролампа, во время работы она должна быть включена; когда дверь печи открыта, электролампа должна быть включена;
5) можно приостановить процесс приготовления пищи открытием двери, в этом случае время сбрасывается;
6) начальная конфигурация: дверь закрыта, лампа погашена;
7) если время истекло, выключается питание и электролампа.
Функцию управления берет на себя пользователь, то есть управление осуществляется с клавиатуры.
Идентификаторы состояния:
1) включена/выключена электролампа;
2) включено/выключено электропитание;
3) открыта/закрыта дверь;
4) сколько времени осталось до конца приготовления пищи.
Электролампа | Дверь | Питание |
Невозможный набор | ||
Необходимые функции (сообщения):
1) нажать кнопку;
2) изменить положение двери;
3) пища готова.
Файл stove.h
enum state {on, off}; //определение типа для элемента, поддерживающего состояние включён/выключен
enum door {open, close}; //определение типа для элемента, поддерживающего состояние открыт/закрыт
class stove
{ state curr_lamp; //поле для описания состояния лампы
door curr_door; //поле для описания состояния двери
state curr_power; //поле для описания состояния питания
int time; //время, оставшееся до конца приготовления еды
void take_door(void); //метод, изменяющий положение двери
void push_button(void); //метод, обрабатывающий работы с питанием микроволновой печи
void ready(void); //метод, обрабатывающий окончание приготовления еды
public:
stove(); //конструктор, задёт начальные параметры
void Run(); //метод, обрабатывающий взаимодействие пользователя с печью
};
файл stove.cpp
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include "stove.h"
void menu() //выводит на экран меню
{
printf("\n%b - нажать кнопку для приготовления еды\n");
printf("d - открыть/закрыть дверь\n");
printf("ESC - выход\n\n");
}
stove::stove()
{
//начальноге состояние:
curr_lamp=off; //лампа выключена
curr_door=close; //дверь закрыта
curr_power=off; //питание выключено
time=-1; //еда не готовится
}
void stove::take_door(void)
{
if (curr_door==open) //если дверь открыта
{ curr_door=close; //закрываем дверь
curr_lamp=off; //выключаем лампу
printf("Дверь закрыта\n");
}
else //если дверь закрыта
{ curr_door=open; //открываем дверь
curr_lamp=on; //включаем лампу
printf("Дверь открыта\n");
if (curr_power==on) //если в момент открытия двери готовилась еда
{
printf("Процесс прерван\n");
time=-1; //сбрасываем счётчик времени
curr_power=off; //выключаем питание
}
}
return;
}
void stove::push_button(void)
{
if (curr_door==open) //если дверь открыта, еду готовить нельзя
printf("Закройте дверь!\n");
else //если дверь закрыта
{ if (curr_power==on) //если еда уже готовится
{ time+=60; //добавляем минуту
printf("Вам добавлена минута\n");
}
else //если еда не готовится
{ curr_power=on; //включаем питание
curr_lamp=on; //включаем лампу
time=60; //устанавливаем счётчик времени
printf("Еда готовится\n");
}
}
return;
}
void stove::ready(void)
{
//еда пригтовлена
curr_power=off; //выключаем питание
curr_lamp=off; //выключаем лампу
time=-1; //сбрасываем счётчик времени
printf("\aЕда готова\n");
}
void stove::Run(void)
{
int key;
do
{
while (!kbhit() && time>0) //в этот цикл заходим, если еда готовится;
условие выхода из цикла: нажата клавиша или истекло время приготовления еды
//функция kbhit() возвращает истину, если пользователь нажал клавишу
{
time--; //вычитаем секунду из времени, оставшегося до конца приготовления еды
Sleep(100); //задержка в 100 мс
printf("Осталось %d секунд\n",time);
}
if (time==0) //если еда закончила готовиться, вызываем метод ready()
ready();
menu();
key=getch();
switch (key)
{ case 'b': push_button(); break;
case 'd': take_door(); break;
}
fflush(stdin);
}
while(key!=27);
return;
}