DFA应用——判断合法数字

来源:互联网 发布:移动硬盘数据同步软件 编辑:程序博客网 时间:2024/06/10 22:39
判断输入是否是一个合法数字
状态par=    0: 初始状态
1: 以 + 或者 - 号
2: 以 .结尾
3: 以数字结尾, 没出现过小数点
4: 以E 或者 e结尾
5: 数字后面跟blank
6: 有了E,以数字结尾
7: 有了E , 以+或者-结尾
8: 有了E ,数字后面跟blank

9: 以数字结尾, 已经出现过小数点


#include<cstdio>#include<cstring>#include<cctype>using namespace std;const int maxn=5000;int T ,N,par;char ch[maxn] ;char now[maxn] ;void Init(){    int i , j ,k, len;    i = 0 ; len = strlen(ch);    while(i<len && (ch[i ]==' ' || ch[i]==9))    i++ ;    j = len-1 ;    while(j>=i &&  (ch[j]==' ' || ch[i]==9)) j-- ;    for(k=0 ;i<=j;i++,k++){        now[k] = ch[i] ;    }    now[k] = 0 ;    N = k ;}void judge(char c){    if(par == 0){        if(c=='+' || c=='-')    par = 1 ;        else if(c == '.')   par = -1 ;        else if( isdigit(c) ) par = 3 ;        else if( c=='e' || c=='E') par = 4 ;        else        par = -1 ;    }    else if(par == 1){        if( isdigit(c) )    par = 3 ;        else par = -1 ;    }    else if(par == 2){        if( isdigit(c) )    par = 9 ;        else    par = -1 ;    }    else if(par == 3){        if( isdigit(c) ) par = 3 ;        else if(c == '.')   par = 2 ;        else if(c=='+' || c=='-')   par = -1 ;        else if(c=='e' || c=='E')   par = 4 ;        else    par = 5 ;   //空格    }    else if(par == 9){        if( isdigit(c) )    par = 9 ;        else if(c=='e' || c=='E')   par = 4 ;        else if(c==' ' || c==9) par = 5 ;        else par = -1 ;    }    else if(par == 4){        if( isdigit(c) )  par = 6 ;        else if(c=='+' || c=='-')   par = 7 ;        else par = -1 ;    }    else if(par == 5){        if(c=='e' || c=='E') par = 4 ;        else if(c==' ' || c==9) par = 5 ;        else        par = -1 ;    }    else if(par == 6){        if(isdigit(c)) par = 6 ;        else if(c==' ' || c==9) par = 8 ;        else par = -1 ;    }    else if(par == 7) {        if(isdigit(c))  par = 6 ;        else par = -1 ;    }    else if(par == 8){        if(c==' ' || c==9)  par = 8 ;        else    par = -1 ;    }}void solve(){    int i,j ;    par = 0 ;    bool ok = 1 ;    for(i=0;i<N;i++){        judge( now[i] );        if(par == -1){            ok = 0 ;    break ;        }    }    if(par==1 || par==2 || par==4 || par==7 || par==-1)     ok=0 ;    printf("the number is ");    if(!ok) printf("illegal\n\n");    else    printf("legal\n\n");}int main(){printf("Please input the number of the test cases:  ");    scanf("%d",&T) ;    printf("********Login********\n");    for(int i=1;i<=T;i++){printf("Please input the number you want to test (the length of string is limited to 5000)  \n");printf("The  %d  of the number is :\n",i);        scanf("%s",ch);//gets(ch) ;        Init() ;        solve() ;        if(i==T) printf("********Exit********\n");    }    return 0 ;}


阅读全文
0 0
原创粉丝点击