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
  • 相关阅读:
    .net core实现的全程序跟踪
    gmap.net
    Spring Cloud实践:降级、限流、滚动、灰度、AB、金丝雀的实现思路
    服务的协作:服务间的消息传递——《微服务设计》读书笔记
    使用消息系统进行微服务间通讯时,如何保证数据一致性
    How to distribute a database among microservices
    微服务间如何选择推送和拉取数据
    Android 怎么使用Bitmap+Canvas 自适应屏幕
    Android 音乐播放器之--错误状态下调用导致的异常
    Android应用截图和SurfaceView截图问题总结
  • 原文地址:https://www.cnblogs.com/smallmomo/p/11171839.html
Copyright © 2011-2022 走看看