编译原理:无符号实数的识别

代码实现:java实现

package club.codezp;

/**
 * @Author:Zpg
 * @Date:2020/4/3 12:07
 * @Version:1.0
 * @Description: 无符号实数的识别
 */

public class UnsignedRealNumber {

    // 表示各个状态
    final static int DIGIT = 1;
    final static int POINT = 2;
    final static int OTHER = 3;
    final static int POWER = 4;
    final static int PLUS = 5;
    final static int MINUS = 6;
    final static int EndState = -1;

    static int w = 0;	// 整数部分
    static int p = 0;	// 小数部分
    static int e = 1;	// 幂次是+ 还是 -
    static int d = 0;	// 暂存数据
    static int n = 0;	// 表示小数点后边有几个位
    static int currentState = 0;	// 当前状态,默认是0,后面执行的时候还要初始化
    static double result = 0.0;		// result用来存最后结果

    public static void main(String[] args) {
    // 测试数据
        String[] strs = {
                "12","34.567","89.",".345",".","12E34","12e34","12E+34",
                "12e+34","12e-34","12.3E4","12.3e4","12.3E+4","12.3e+4",
                "12.3E-4","12.3e-4",".38E4",".3e45",".38E+4",".3e+45",
                ".38E-4",".3e-45","31.E45","38.e4","3.E+45","38.e+4",
                "3.E-45","38.e-4","000538","##!!"
        };
        for(String str:strs) {
            if(isUnsignedNumber(str) == true) {

                System.out.println(str+" Yes"+" "+result);
            }else {
                System.out.println(str+" No");
            }

        }

    }

    // 解析字符,返回相应的状态,前面静态变量定义好了
    private static int analysisCharacter(char c) {
        switch (c) {
            case '.':
                return POINT;
            case 'E':
            case 'e':
                return POWER;
            case '+':
                return PLUS;
            case '-':
                return MINUS;
            default:
                if (Character.isDigit(c)) {
                    d = c - '0';
                    return DIGIT;
                }
                break;
        }
        return OTHER;
    }

    //判断是不是无符号整数,返回相应的状态
    private static boolean isUnsignedNumber(String s) {
        // 在这里全部都要重新初始化
        currentState = 0;	// 当前状态初始化0
        n = 0;			    // 小数点后位数初始化0
        w = 0;			    // 整数部分初始化0
        p = 0;			    // 小数部分初始化0
        e = 1;			    // 默认是+
        for(int i=0;i<s.length();i++) {
            int ch = analysisCharacter(s.charAt(i));
            currentToNext(ch);
            if(currentState == EndState) {
                return false;
            }
        }
        switch(currentState) {
            case 1:
            case 2:
            case 6:
                result = w * Math.pow(10,e*p-n);
                return true;
        }
        return false;
    }

    // 从当前状态到下一个状态的执行,参数是一个字符串,currentState是静态成员变量不需要传参
    private static void currentToNext(int ch) {
        switch (currentState) {
            case 0:
                switch (ch) {
                    case DIGIT:
                        w = w * 10 + d;
                        currentState = 1;
                        break;
                    case POINT:
                        currentState = 3;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 1:
                switch (ch) {
                    case DIGIT:
                        w = w * 10 + d;
                        currentState = 1;
                        break;
                    case POINT:
                        currentState = 2;
                        break;
                    case POWER:
                        currentState = 4;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 2:
                switch (ch) {
                    case DIGIT:
                        w = w * 10 + d;
                        ++n;
                        currentState = 2;
                        break;
                    case POWER:
                        currentState = 4;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 3:
                switch (ch) {
                    case DIGIT:
                        w = w * 10 + d;
                        ++n;
                        currentState = 2;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 4:
                switch (ch) {
                    case DIGIT:
                        p = p * 10 + d;
                        currentState = 6;
                        break;
                    case PLUS:
                        currentState = 5;
                        break;
                    case MINUS:
                        e = -1;
                        currentState = 5;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 5:
                switch (ch) {
                    case DIGIT:
                        p = p * 10 + d;
                        currentState = 6;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
            case 6:
                switch (ch) {
                    case DIGIT:
                        p = p * 10 + d;
                        currentState = 6;
                        break;
                    default:
                        currentState = EndState;
                        break;
                }
                break;
        }
    }
}

结果测试:
在这里插入图片描述

参考链接

实数格式识别 【问题描述】 合法的实数书写格式分一般格式和科学格式两种。分别描述如下: 一般格式为常见的书写格式,分为整数部分和小数部分两部分,中间分用小数点.分隔。整数部分最开始可能含有正号或负号,之后为不含前导零的数字串;小数部分是由0-9十种字符组成的任意长的字符串。当小数部分为0时,小数部分和小数点可以省略。 科学格式由系数部分和指数部分两部分组成,中间用英文字母E分隔。系数部分为实数书写的一般格式;指数部分为可带有正负号数字串。 例如,+2、-1.56为一般格式的实数,而6.2E-2、-9E8为科学格式的实数。 只有小数点而没有小数部分的书写格式为不合法,例如,23.,23.E16均为不合法的实数书写格式。 编程分析哪些数的书写是正确的,是用哪种方式书写的。 【输入形式】 输入文件为当前目录下的real.in。 该文件包含一个字符串(长度不超过20个字符),以回车符结束,表示一个数据(无多余空格)。 【输出形式】 输出文件为当前目录下的real.out。 该文件有一行。如果输入数据的书写是非法的,输出Wrong;如果输入数据是用一般格式书写的,输出“Format1”;如果该数据是用科学格式书写的,输出“Format2”。输出的末尾均要以一个回车符作为结束。 【输入样例1】 +1.23 【输出样例1】 Format1 【输入样例2】 -5.1.1 【输出样例2】 Wrong 【输入样例3】 -5.1E-2 【输出样例3】 Format2 【时间限制】 1s 【空间限制】 65536KB
【问题描述】 合法的实数书写格式分一般格式和科学格式两种。分别描述如下: 一般格式为常见的书写格式,分为整数部分和小数部分两部分,中间分用小数点.分隔。整数部分最开始可能含有正号或负号,之后为不含前导零的数字串;小数部分是由0-9十种字符组成的任意长的字符串。当小数部分为0时,小数部分和小数点可以省略。 科学格式由系数部分和指数部分两部分组成,中间用英文字母E分隔。系数部分为实数书写的一般格式;指数部分为可带有正负号数字串。 例如,+2、-1.56为一般格式的实数,而6.2E-2、-9E8为科学格式的实数。 只有小数点而没有小数部分的书写格式为不合法,例如,23.,23.E16均为不合法的实数书写格式。 编程分析哪些数的书写是正确的,是用哪种方式书写的。 【输入形式】 输入文件为当前目录下的real.in。该文件包含一个字符串(长度不超过20个字符),以回车符结束,表示一个数据(无多余空格)。 【输出形式】 输出文件为当前目录下的real.out。该文件有一行。如果输入数据的书写是非法的,输出Wrong;如果输入数据是用一般格式书写的,输出“Format1”;如果该数据是用科学格式书写的,输出“Format2”。输出的末尾均要以一个回车符作为结束。 【输入样例1】 +1.23 【输出样例1】 Format1 【输入样例2】 -5.1.1 【输出样例2】 Wrong 【输入样例3】 -5.1E-2 【输出样例3】 Format2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值