基于有限状态自动机的数据类型识别功能(3)

匿名 (未验证) 提交于 2019-12-02 21:45:52

Check_science()

 1     private void Check_science(String Nowline,int i) {  2         int k=Nowline.lastIndexOf('.',i)-1;//找到e最近的左边.  3         int j=Nowline.lastIndexOf(' ',i);  4         if(j!=-1) {//有空格时  5             if(k<=j)//点在空格前面或者点前一个位置就是空格  6                 Check=false;  7             else if(Nowline.charAt(k)>='0'  8                     &&Nowline.charAt(k)<='9'  9                     &&(Nowline.charAt(k-1)==' ') 10                     ) 11                         Check=true; 12             else 13                 Check=false; 14         } 15         else if(k==0) 16             Check=true; 17         else  18             Check=false; 19     }

这个函数用于检查所输入的行里的科学计数法是否符合格式

输入输出如下:

从图中可以看到第四位是科学计数法数字

在一行中判断科学计数法的格式是否正确有点困难,我用的算法如下

(1)找到离字母e左边最近的小数点

(2)找到离字母e左边最近的空格

(3)如果空格在小数点左边 那么该小数点属于科学记数法的小数点

  3.1如果空格在小数点右边那么这个科学计数法没有小数点 错误格式

(4)再判断空格与小数点之间的数字个数,只有一位0-9之间的数字即为正确的格式

(5)若第2步没有找到空格说明该科学记数法在最左边,那么判断离e最近的左边小数点前面又几位数字

测试&调用:

1     public static void main(String[] args) { 2         Scanner input=new Scanner(System.in); 3         String nowline=input.nextLine().trim(); 4         FSM a=new FSM(); 5         a.Input_Classificantion(nowline); 6              7     }

完整代码:

  1 import java.util.Arrays;   2 import java.util.Scanner;   3 public class FSM {   4     private final int[][] State_table;   5     private int Now_state=0;   6     private final int Char_m=0;//表示0-9的字符 49-48   7     private final int Char_d=1;//表示.字符    45   8     private final int Char_e=2;//表示e字符    69/101   9     private final int Char_j=3;//表示-字符    46   10     //空格32  11       12     private final int Int_result_code=1;//整型  13     private final int Float_result_code=3;//浮点型  14     private final int Scientif_result_code=6;//科学记数法  15     private final int Scientif_result_code_2=7;//科学记数法  16     // 0 2 4 5 状态不可输出  17       18     private boolean Output=false;//能否输出标志  19     private boolean Check=false;//检查科学计数法书写是否规范  20       21     private int Erroe_code=0;  22     //错误1:输入非(数字.e-)字符  23     //错误2:处于无法输出的状态中  24       25     //初始化二维表  26     FSM(){  27     State_table=new int[8][4];  28     int[] b={1,1,3,3,7,6,6,7};  29       30     for(int i=0;i<8;i++)  31     Arrays.fill(State_table[i],-1);//填满  32     State_table[1][1]=2;  33     State_table[1][2]=4;  34     State_table[3][2]=4;  35     State_table[4][3]=5;  36     for(int i=1;i<=8;i++)  37         State_table[i-1][0]=b[i-1];              38     }  39       40     //通过读取对应数组的值来确定当前的状态值  41     private void Change_state(int Old_state,int Char_code) {  42         Now_state=State_table[Old_state][Char_code];          43           44         if(Now_state==0||Now_state==2||Now_state==4||Now_state==5) //不可输出状态                                       45             Output=false;  46         else if(Now_state==-1){  47                 System.out.println("输入错误");  48                 Erroe_code=2;  49                 System.exit(1);  50             }  51         else //可输出状态  52             Output=true;  53           54     }  55   56     //对输入的字符串进行类型判断  57     public void Input_Classificantion(String Nowline){          58         for(int i=0;i<Nowline.length();i++) {              59             if(Nowline.charAt(i)>='0'&&Nowline.charAt(i)<='9')  60                 Change_state(Now_state,Char_m );  61             else if(Nowline.charAt(i)=='.')  62                 Change_state(Now_state, Char_d);  63             else if(Nowline.charAt(i)=='e'||Nowline.charAt(i)=='E')  64                 {    Check_science(Nowline,i);  65                     Change_state(Now_state, Char_e);  66                 }  67             else if((Nowline.charAt(i)=='-'))  68                 Change_state(Now_state, Char_j);  69             else if(Nowline.charAt(i)==' ') {  70                 //排除同行的空格  71                     do {  72                         i=Nowline.indexOf(' ',i)+1;}  73                     while(Nowline.charAt(i)==' ');  74                     i--;  75                     Input();  76                 }  77             else   78                 {System.out.println("输入包含非法字符");  79                 Erroe_code=1;    }          80         }  81           82         Input();          83     }  84       85     //根据对应的当前状态输出该状态的类型  86     private  void Input() {  87         if(Output==true) {  88             if(Now_state==Int_result_code)   89                 System.out.println("整型");  90             else if(Now_state==Float_result_code)  91                 System.out.println("浮点型");  92             else if(Check) {  93                 if(Now_state==Scientif_result_code)  94                 System.out.println("科学计数法负");  95                 else if(Now_state==Scientif_result_code_2)  96                 System.out.println("科学计数法");  97             }  98             else   99                 System.out.println("科学计数法格式错误"); 100         } 101         else{ 102             System.out.println("输入错误"); 103             Erroe_code=2; 104             System.exit(1); 105         } 106         Now_state=0; 107     } 108      109      110     private void Check_science(String Nowline,int i) { 111         int k=Nowline.lastIndexOf('.',i)-1;//找到e最近的左边. 112         int j=Nowline.lastIndexOf(' ',i); 113         if(j!=-1) {//有空格时 114             if(k<=j)//点在空格前面或者点前一个位置就是空格 115                 Check=false; 116             else if(Nowline.charAt(k)>='0' 117                     &&Nowline.charAt(k)<='9' 118                     &&(Nowline.charAt(k-1)==' ') 119                     ) 120                         Check=true; 121             else 122                 Check=false; 123         } 124         else if(k==0) 125             Check=true; 126         else  127             Check=false; 128     } 129      130     public static void main(String[] args) { 131         Scanner input=new Scanner(System.in); 132         String nowline=input.nextLine().trim(); 133         FSM a=new FSM(); 134         a.Input_Classificantion(nowline); 135              136     } 137      138 }
View Code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!