JZ 20 表示数值的字符串:抽象与逻辑练习

题目:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
例如,字符串"+100""5e2""-123""3.1416""-1E-16""0123"都表示数值,
但"12e""1a3.14""1.2.3""+-5""12e+5.4"都不是。

思路:
面对情况较多并且前后顺序混乱的这种问题,
我们应该先抽象出合理数字的模型,再拆分问题进行解决;

举个例子:对于数字**-16.321E-16**可以说是这种情况下所有条件都加上了;
对这个数字进行拆分:【-16】【.】【321】【E/e】【-16】

可以看到,对于一个数字而言,最多有这5个部分,那么我们可以从向后拆解给出的字符串
①首先拆出最前面的第一部分数字,其是否合规标记为:OK1;
②拆解出①后,判断当前位置是否为 . ,如果是则走③,如果不是则走④
③拆解**.后面的数字,重复①的判断,注意不能有符号,而①可以有符号,合规与否标记为OK2
④拆解后面的数字,重复①的过程
可以有符号**,合规与否标记为OK3
⑤判断当前指针位置是否为末尾,如果是则记录为OK4

最后判断逻辑:ret
当有**.** 的时候,前后必须有一个成立,也就是①和③必须成立一个:ret = OK1 || OK2
如果有e,则前面的ret与OK3必须同时成立:ret = ret && OK3
最后也必须满足后面没有奇奇怪怪的东西:ret&= OK4;

代码:

class Solution {
public:
    bool isInt(string& s, int& i)
    {
        int i_before = i;
        while(i < s.size() && s[i] >= '0' && s[i] <= '9'){
            i++;
        }
        if(i_before < i)
            return true;
        else 
            return false;
    }
    bool isNumber(string s) {

        if(s.size() == 0)
        return false;
        // 首先去除首末空格
        s.erase(0,s.find_first_not_of(' '));
        s.erase(s.find_last_not_of(' ')+1);
        int i = 0;
        if(s[i] == '+' || s[i] == '-'){
            i++;
        }
        
        
        bool is_int = isInt(s, i);
        bool ret = is_int;
        if(i < s.size())
        {
            if(s[i] == '.'){
                i++;
                bool is_int2 = isInt(s,i);
                ret = ret || is_int2;
            }
            if(i < s.size() && (s[i] == 'e' || s[i] == 'E') )
            {
                i++;
                if(i < s.size()){
                    if(s[i] == '+' || s[i] == '-'){
                        i++;
                    }
                    bool is_int3 = isInt(s,i);
                    ret &= is_int3;
                }
                else
                    return false;
            }
        }
        if(i == s.size() && ret){
            return true;
        }
        else 
            return false;
        
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第5章计算机控制系统程序设计 1/82 5.1 巡回检测程序 5.2 越限报警程序 5.3 判断程序 5.4 控制算法PID程序 5.5 数字滤波程序 5.6 步进电机控制程序 5.7 线性化处理程序 5.8 标度变换程序 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第1页。 5.1判断程序 所谓算术判断程序,就是根据算术运算结果进行判断。 用于算术操作类的指令如:ADD,ADDC,INC,DA,SUBB,DEC,MUL,DIV,其中的加(ADD,ADDC),减(SUBB),乘(MUL)和除(DIV)是四种基本的算术运算指令。由运算结果判断程序流向的指令,如,JZ、JNZ、CJNZ、DJNZ指令。将它们有机地结合起来就很容易地根据用户需要形成算术判断程序。 算术判断程序的两个基本要素:其一,是算术运算类指令;其二,是控制程序转移类指令。 2/82 第5章计算机控制系统程序设计 5.1.1算术判断程序 在计算机控制系统中,常常需要对检测的数据或状态进行分析,根据数值的大小及状态进行判断,以确定程序的流向。为此目的而设计的程序即为判断程序。 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第2页。 5.1.1 算术判断程序 例5-1 图5-1是用DAC0832作电压波形发生器的电路。写出产生三角波的程序清单。说明算术判断程序的设计。 图5-1电压波形发生器电路 3/82 第5章计算机控制系统程序设计 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第3页。 三角波程序清单:     ORG 2000H STAR: MOV DPTR,#0BFFFH ;选通道 STARA: MOV R6,#00H ;置初值 STARB: MOV A, R6 MOVX @DPTR,A ;启动D/A转换 INC R6 ;数字加1 CJNE R6,#FFH,STARB ;数字 FFH,循环 STARC: DEC R6 ;数字到FFH后减1 MOV A,R6 MOVX @DPTR,A ;启动D/A转换 CJNE R6,#00H,STARC ;数字 00H,返回STRAC AJMP STARA 4/82 第5章计算机控制系统程序设计 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第4页。 5.1.1 算术判断程序 在此程序中,将D/A转换的初值送入R6中,在第一个循环体中对R6作INC加1操作,然后,将R6中的数和常数0FFH进行比较,用CJNE R6,#FFH,STARB 指令,当(R6) FFH时,程序转向STARB继续循环;当(R6)=FFH时,三角波的左半部分已经形成,已处于三角波的顶点,于是就进入下一个循环中,对R6又作DEC减1操作,使D/A转换生成三角波的右半部分,用CJNE R6 ,#00H,STARC指令对R6中的数值与00H常数作比较,以确定程序的转向。三角波波形图如图5-2所示。 图5-2三角波波形图 5/82 第5章计算机控制系统程序设计 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第5页。 5.1.1 算术判断程序 例5-2 查找关键字程序 入口条件:在外部RAM 3000H~3020H的区域中检查关键字ABH。 出口条件:找到在则将关键字送入累加器A,否则A清零。 查找关键字程序流程图,如图5-3所示。 图5-3查找关键字程序流程图 6/82 第5章计算机控制系统程序设计 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第6页。 程序清单: ORG 2000H MOV DPTR,#3000H MOV R7,#01H MOV R0,#0ABH LOOP: MOVX A,@DPTR INC DPTR SUBB A,R0 JZ LOOP1 DJNZ R7,LOOP CLR A AJMP HALT LOOP1: MOV A,R0 HALT: RET 7/82 第5章计算机控制系统程序设计 计算机控制技术-第5章-计算机控制系统程序设计全文共82页,当前为第7页。 5.1.2 逻辑判断程序 1.逻辑判断程序是根据逻辑关系来确定程序流向的程序。2.在MCS-51单片机控制系统中,用于逻辑操作类的指令如:ANL、ORL、XRL、RL、RLC、RR、RRC、CPL、CLR,它们与其它的控制转移类指令结合起来就可以构成逻辑判断程序。 3.在逻辑判断程序中也包含两个基本要素:其一,是逻辑操作类的指令;其二,是控制程序转移类指令。 例5-3 设K1~K4表示四个开关,当它们全都打开时,绿色指示灯亮,表明系统投入正常运行,否则,等待正确指令,电路如图5-4所示。 图5-4 逻辑判断电路 8/82 第5章计算机控制系统程序设计 8031 P1

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值