有关自动售糖机的问题,包括了编译原理部分的有穷自动机 有编译错误,自己思路捋不出来错误
//投入1块或2块,并以#号结束输入 当大于等于3块时给块糖,有误时提示//糖有总量,每次给糖会总量减一
//判断过程用了编译原理的有穷自动机部分,这是要求的。。。
//输入大于等于3块钱时,会跳过下次判断,一直减总量直至总量为0
//输入错误的量时,会一直跳出错误不停
#include <stdio.h>
int sum=5;//总糖数
char input[3];
char token[3]=" ";
int p_input;
int p_token;
char ch;
char *word;
int flag=1;
char *scaner();
int main()
{
while(sum>=1)//当糖的总量大于等于1时
{
printf("请投币,仅限于输入1、2分硬币并以#号结束投币:");
scanf("%[^#]s",input);
p_input=0;
word=scaner(); //判断输入的硬币数能否通过功能scaner()
if(flag==1){ //标志位为1时
printf("投入硬币足够,成功给糖!");
sum--;
}
else{
flag=1;
}
}
printf("糖已售完!");
return 0;
}
char m_getch(){
ch=input[p_input];
p_input=p_input+1;
return (ch);
}//从输入缓冲区中读取一个字符到ch中
void getbc(){
while(ch==' '){
ch=input[p_input];
p_input=p_input+1;
}
}//去掉空白符号
void concat(){
token[p_token]=ch;
p_token=p_token+1;
token[p_token]='\0';
}//拼接输入的字符串
int one(){
if(ch=='1')return 1;
else return 0;
}//判断是否为1元硬币
int two(){
if(ch=='2')return 1;
else return 0;
}//判断是否为2元硬币
void error(){
printf("您输入有误,不能出糖!");
flag=0;
}
char *scaner(){ //有穷自动机
p_token=0;
m_getch();
getbc();
if(one()) //1-- 输入一块
{
concat();
m_getch();
if(one()){//11- 输入1块、1块
concat();
m_getch();
if(one()){//111
word=token;
return(word);
}
else if(two()){//112
word=token;
return(word);
}
else {//11x
error();
}
}
else if(two()){//12
word=token;
return(word);
}
else{//1x
error();
}
}
else if(two())
{//2--
concat();
m_getch();
if(one()){//21
word=token;
return(word);
}
else if(two()){//22
word=token;
return(word);
}
else{//2x
error();
}
}
else{//x
error();
}
}