zoukankan      html  css  js  c++  java
  • 基于有限状态自动机的数据类型识别功能(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
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/smallmomo/p/11171839.html
Copyright © 2011-2022 走看看