uva 325 Identifying Legal Pascal Real Constants

题目:一个简单的格式分析程序。浮点数的组成规则已知。求是不是正确的数字。有限自动机。

注意:有些情况如没有e的情况,不要忘了考虑

#include <cstdio>
#include <string.h>
#include <cstdlib>
#include <cmath>
#include <ctgmath>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
//理解有限状态机
/*
 pre_num 数分析前状态
 sign1 数值部分符号
 pre_point 数值部分小数点前
 point 小数点
 fraction 数值部分小数点后
 e 指数符号
 sign2 指数部分符号
 exp 指数部分的的指数状态
 followblack 常数后的空格
 error 错误
*/
//cin进行字符变量输入,自动过滤头部空格
int main(){
	enum Status{pre_num,sign1,pre_point,point,fraction,e,sign2,exp,error};
	char m;
	char str[1000];//存读入的数字
	Status state;
	while(cin >> str && strcmp(str, "*")!=0){
		int i = 0;
		m = str[i];
		state = pre_num;
		while (m != '\0') {
			switch (state) {
				case pre_num:  if(m=='+' || m=='-'){state = sign1;break;}
							   else if(m>='0' && m<='9'){state = pre_point;break;}
							   else {state = error;break;}
				
				case sign1:    if(m>='0' && m<='9'){state = pre_point;break;}
							   else {state = error;break;}
				
				case pre_point:if(m=='.'){state = point;break;}
							   if(m=='e' || m=='E'){state = e;break;}//不一定是小数的情况
							   if(m>='0' && m<='9'){state = pre_point;break;}//123.1情况
							   else state = error;break;
				
				case point:    if(m>='0' && m<='9'){state = fraction;break;}
							   else state = error;break;
				
				case fraction: if(m>='0' && m<='9'){state = fraction;break;}
							   else if(m=='e' || m=='E'){state = e;break;}
							   else state = error; break;
			   
				case e:        if(m=='+' || m=='-'){state = sign2;break;}
							   else if(m>='0' && m<='9'){state = exp;break;}
							   else state = error;break;
			   
				case sign2:    if(m>='0' && m<='9'){state = exp;break;}
							   else state = error;break;
				
				case exp:      if(m>='0' && m<='9'){state = exp;break;}
							   else state = error;break;
				
				case error:    goto lable;
					
					
					
					
			}
			m = str[++i];
		}
lable:if (state == error) {printf("%s is illegal.\n",str);}
		else if(state == fraction || state == exp) printf("%s is legal.\n",str);
		else printf("%s is illegal.\n",str);
	}
	return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值