Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2013, 19:23   #1
user1.1
Новичок
Джуниор
 
Регистрация: 26.11.2013
Сообщений: 3
По умолчанию Здравствуйте, помогите пожалуйста решить задачу подробно

Автомат по продаже кофе имеет щель для получения монет, кнопку, нажатие которой после уплаты достаточной суммы приводит к получению кофе, и накопитель, через кото-рый он выдает сдачу покупателю. Автомат принимает монеты достоинством в 1, 2 и 5 рублей. Чашка кофе стоит 8 руб. Пока полученная сумма недостаточна, горит красная лампочка. Если сумма, полученная автоматом, >= 8, то зажигается зеленая лампочка и после нажатия кнопки автомат наливает кофе и, если требуется, дает сдачу. Если автомат получает монету, когда горит зеленая лампочка, то он немедленно ее возвращает. Определите входной и выходной алфавиты конечного автомата, управляющего продажей кофе, и постройте его функции переходов и выходов.
user1.1 вне форума Ответить с цитированием
Старый 26.11.2013, 20:16   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

читаем на форуме такую же тему: Конечные автоматы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2013, 06:41   #3
user1.1
Новичок
Джуниор
 
Регистрация: 26.11.2013
Сообщений: 3
По умолчанию

Мне это ничего не говорит! решите пожалуйста задачу.
user1.1 вне форума Ответить с цитированием
Старый 27.11.2013, 08:37   #4
ZX Spectrum-128
Участник клуба
 
Регистрация: 05.11.2013
Сообщений: 1,601
По умолчанию

Цитата:
Сообщение от user1.1 Посмотреть сообщение
Мне это ничего не говорит! решите пожалуйста задачу.
Вам написать нужно за вас? Тогда разделом ошиблись. Помощь подразумевает то, что вы что-то пытались сделать, у вас не получилось и тогда вам помогают.
ZX Spectrum-128 вне форума Ответить с цитированием
Старый 27.11.2013, 08:58   #5
SaLoKiN
Форумчанин
 
Аватар для SaLoKiN
 
Регистрация: 19.09.2013
Сообщений: 597
По умолчанию

Цитата:
Мне это ничего не говорит! решите пожалуйста задачу.
ахаха, смешно...
за $ и вот тут
Сделал сам, помоги другому!
Что-то работает не так? Дебаггер в помощь!!!
SaLoKiN вне форума Ответить с цитированием
Старый 27.11.2013, 14:50   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Ладно, подмогнем студню :D

конечный автомат: кофе-машина

Код:
#include <iostream>
#include <locale>

#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>

using boost::msm::front::Row;
using boost::msm::front::none;

struct insert_coin
{
	insert_coin(int val) : amount(val)
	{ }
	int amount;
};

struct press_button {};

class CoffeeMachine_ : public boost::msm::front::state_machine_def<CoffeeMachine_>
{
public:
	CoffeeMachine_() : money(0)
	{}

	struct Red : public boost::msm::front::state<>
	{
		template <typename EVT, typename FSM>
		void on_entry(EVT&, FSM&)
		{
			std::cout << "Давай денег, насяльника!" << std::endl;
		}
	};
	struct Accumulate : public boost::msm::front::state<>
	{
		template <typename EVT, typename FSM>
		void on_entry(EVT&, FSM& fsm)
		{
			if (fsm.money < 8)
				std::cout << "Давай еще денег, насяльника!" << std::endl;
		}
	};
	struct Green : public boost::msm::front::state<>
	{
		template <typename EVT, typename FSM>
		void on_entry(EVT&, FSM&)
		{
			std::cout << "Денег достаточно, насяльника!" << std::endl;
			std::cout << "Жми кнопку, не тормози, насяльника!" << std::endl;
		}
	};
	struct Coffee : public boost::msm::front::state<>
	{
		template <typename EVT, typename FSM>
		void on_entry(EVT&, FSM&)
		{
			std::cout << "Забирай кофе, насяльника!" << std::endl;
		}
	};
	struct Change : public boost::msm::front::state<>
	{
		template <typename EVT, typename FSM>
		void on_entry(EVT&, FSM& fsm)
		{
			std::cout << "Забирай сдачу, насяльника! Сдача: " << (fsm.money - 8) << std::endl;
		}
	};

	typedef boost::mpl::vector<Red> initial_state;

	struct Collect
	{
		template <typename EVT, typename FSM, typename SourceState, typename TargetState>
		void operator()(EVT& evt, FSM& fsm, SourceState, TargetState) const
		{
			fsm.money += evt.amount;
			std::cout << "Всего получено денег, насяльника! " << fsm.money << std::endl;
		}
	};
	struct NoMoreMoney
	{
		template <typename EVT, typename FSM, typename SourceState, typename TargetState>
		void operator()(EVT& evt, FSM& fsm, SourceState, TargetState) const
		{
			std::cout << "Куда суешь деньги, насяльника! Хватит уже!" << std::endl;
		}
	};

	struct IsEnoughMoney
	{
		template <typename EVT, typename FSM, typename SourceState, typename TargetState>
		bool operator()(EVT, FSM& fsm, SourceState, TargetState) const
		{
			return fsm.money >= 8;
		}
	};
	struct HasChange
	{
		template <typename EVT, typename FSM, typename SourceState, typename TargetState>
		bool operator()(EVT, FSM& fsm, SourceState, TargetState) const
		{
			return fsm.money > 8;
		}
	};

	struct transition_table : public boost::mpl::vector<
		Row < Red, insert_coin, Accumulate, Collect >,
		Row < Accumulate, insert_coin, Accumulate, Collect >,
		Row < Accumulate, none, Green, none, IsEnoughMoney >,
		Row < Green, insert_coin, Green, NoMoreMoney, IsEnoughMoney >,
		Row < Green, press_button, Coffee >,
		Row < Coffee, none, Red >,
		Row < Coffee, none, Change, none, HasChange >,		
		Row < Change, none, Red >
	> {};

	int money;
};

typedef boost::msm::back::state_machine<CoffeeMachine_> CoffeeMachine;

int main()
{
	std::locale::global(std::locale(""));

	CoffeeMachine coffee;
	coffee.start();

	std::cout << "Закидываем монетку 5..." << std::endl;
	coffee.process_event(insert_coin(5));

	std::cout << "Закидываем монетку 2..." << std::endl;
	coffee.process_event(insert_coin(2));

	std::cout << "Закидываем монетку 5..." << std::endl;
	coffee.process_event(insert_coin(5));

	std::cout << "Закидываем монетку 1..." << std::endl;
	coffee.process_event(insert_coin(1));

	std::cout << "Жмем кнопку..." << std::endl;
	coffee.process_event(press_button());

	return 0;
}
вывод результата:
[pre]Давай денег, насяльника!
Закидываем монетку 5...
Всего получено денег, насяльника! 5
Давай еще денег, насяльника!
Закидываем монетку 2...
Всего получено денег, насяльника! 7
Давай еще денег, насяльника!
Закидываем монетку 5...
Всего получено денег, насяльника! 12
Денег достаточно, насяльника!
Жми кнопку, не тормози, насяльника!
Закидываем монетку 1...
Куда суешь деньги, насяльника! Хватит уже!
Денег достаточно, насяльника!
Жми кнопку, не тормози, насяльника!
Жмем кнопку...
Забирай кофе, насяльника!
Забирай сдачу, насяльника! Сдача: 4
Давай денег, насяльника![/pre]
Rififi вне форума Ответить с цитированием
Старый 27.11.2013, 18:43   #7
user1.1
Новичок
Джуниор
 
Регистрация: 26.11.2013
Сообщений: 3
По умолчанию

Я ничего тут не понял, ну пусть так. спасибо огромное
user1.1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск