objective-c : 使用FSM实现自动售水机模型


今天我们使用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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值