今天我们使用FSM(finite state machine有限状态机)来实现一个自动售水机;
我们要实现的FSM,如下图:
+-------------------------------------------------+-----+
| |
v input |
+------+ money +-----------+ no money+------------+ |
| |+------->| |+------->| quit +------+
+--> |welcome | sale water| press 'n' |
| +------+ ++----------+ | pay & get |
| + | ^ +------------+
| | | |
+ | +-------+
+-------+ want buy more
Not illegle input
#import <Foundation/Foundation.h>
unsigned int money;
unsigned int left_money;
int my_goods[100]={0};
int my_goods_count=0;
typedef enum {
STATE_WELCOME,
STATE_SALE,
STATE_QUIT
}SM;
SM welcome_print(void)
{
printf("*************welcom to warter sale machine!************\n");
printf("please input your money: $(1-100)\n");
scanf("%d",&money);
fflush(stdin);
printf("now you have : $%d\n", money);
if(money > 100 || money < 1) return STATE_WELCOME;
left_money = money;
return STATE_SALE;
}
//goods have to move to a 'xml' file. waiting....
void goods_print(void)
{
printf("\n*******************\n");
printf("1 apple drink 3$\n");
printf("2 wanglaoji $5\n");
printf("\n*******************\n");
}
SM water_sel(void)
{
char c;
int water_sel = 0;
while(left_money>0)
{
goods_print();
printf("please select:\n");
scanf("%d",&water_sel);
fflush(stdin);
printf("you have select %d\n", water_sel);
if(water_sel == 1) {
left_money -= 3;
my_goods[my_goods_count] = water_sel;
my_goods_count++;
}
else if(water_sel == 2) {
left_money -= 5;
my_goods[my_goods_count] = water_sel;
my_goods_count++;
}
printf("do you want buy more?(y/n)\n");
c = getchar();
if(c == 'n') return STATE_QUIT;
}
return STATE_QUIT;
}
SM quit(void)
{
int i;
printf("\n **************pay and get*************\n");
printf("you have buy %d things:\n", my_goods_count);
for(i = 0; i < my_goods_count; i++)
{
if(my_goods[i] == 1) {
printf("apple drinks\n");
}
else if(my_goods[i] == 2)
{
printf("wang lao ji\n");
}
}
my_goods_count = 0;
printf("pay you : $%d\n", left_money);
return STATE_WELCOME;
}
void process_FSM(void)
{
SM state = welcome_print();
while(1) {
switch(state) {
case STATE_WELCOME:
state = welcome_print();
break;
case STATE_SALE:
state = water_sel();
break;
case STATE_QUIT:
state = quit();
break;
default : break;
}
}
}
int main(int argc, const char *argv[])
{
process_FSM();
system("pause");
return (0);
}