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 }
這個函數用於檢查所輸入的行裏的科學計數法是否符合格式java
輸入輸出以下:算法
從圖中能夠看到第四位是科學計數法數字數組
在一行中判斷科學計數法的格式是否正確有點困難,我用的算法以下ide
(1)找到離字母e左邊最近的小數點函數
(2)找到離字母e左邊最近的空格測試
(3)若是空格在小數點左邊 那麼該小數點屬於科學記數法的小數點spa
3.1若是空格在小數點右邊那麼這個科學計數法沒有小數點 錯誤格式code
(4)再判斷空格與小數點之間的數字個數,只有一位0-9之間的數字即爲正確的格式blog
(5)若第2步沒有找到空格說明該科學記數法在最左邊,那麼判斷離e最近的左邊小數點前面又幾位數字ci
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 }