基于有限状态自动机的数据类型识别功能(3)
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
相关文章