zoukankan      html  css  js  c++  java
  • 识别浮点常量问题

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    Problem Description
    编译器在对程序进行编译之前,首先要进行语法分析。通常,程序被分解成若干个小单元,然后和语言的语法模式进行匹配。在分析表达式的时候,变量的类型在变量声明的时候就决定了;而常量的类型需要从常量的形式来判断。

    假设你是自动编译器(ACM)开发小组的一员,负责Pascal语言编译器的开发。你的任务是分析程序分解模块送来的文件,判断其中包含的字符串是否合乎语法的Pascal浮点常量。

    Pascal语言对浮点常量的语法要求是:一个浮点常量除了十进制数码之外,必须带有一个小数点或一个指数(紧接在字母e或E之后,在正式文档中也被称为比例因子)。如果该浮点常量含有小数点,则在小数点两侧都至少要有一个十进制数码。当然,在整个浮点常量或指数之前,也许会出现符号+或-。指数不能包含小数。空格也许会出现在浮点常量的前后,但不会出现在浮点常量中间。

    请注意Pascal语言的语法规则没有对浮点数常量的取值范围作出任何假定。
    Input
    输入只有一行,就是有待识别的字符串。字符串的长度不超过255。
    Output
    请将分析的结果按以下样例的格式输出。如果输入文件中的字符串是Pascal浮点常量,请输出字符串“YES”,否则输出字符串“NO”。
    Sample Input
    1.2
    Sample Output
    YES
    Hint
    输入:1 输出:NO
    输入:1.0e-55 输出:YES
    输入:e-12 输出:NO
    输入:1e-12 输出:YES
    输入:6.5E 输出:NO
    输入:+4.1234567890E-9999 输出: YES
    Source
    博客原文: https://blog.csdn.net/RIPwangh/article/details/52599000

    来组测试数据:

    1 NO

    1 .NO

    .2 NO

    1.2e NO

    1.2e1 YES

    e1 NO

    1e2.2 NO

    +1.2e+44 YES

    ++1.2 NO

    这样应该把所有的情况包括了吧

    [cpp] view plain copy

    include

    include

    include

    using namespace std;

    int main()
    {
    string s;
    while(cin>>s)
    {
    int len = s.length();
    int x = 0, e = 0, n = 0;
    for(int i = 0; i < len; i++)
    {
    if(s[i] == ‘.’)
    {
    x++;
    if(e>0)
    x = 2;
    }
    else if(s[i] == ‘e’ || s[i] == ‘E’)
    {
    e++;
    if(i == 0 || i == len)
    {
    e = 2;
    break;
    }
    else
    {
    if(s[i-1]>=’0’ && s[i-1] <=’9’ && s[i+1] >=’0’ && s[i+1] <=’9’)
    {

                    }  
                    else  
                    {  
                        if((s[i+1] == '+' || s[i+1] == '-')&&i+2<len&&s[i+2]>='0' && s[i+2] <='9')  
                        {  
    
                        }  
                        else  
                        {  
                        e = 2;  
                        break;  
                        }  
                    }  
                }  
    
            }  
            else if(s[i] == '+' || s[i] == '-')  
            {  
                if(i == 0 || (i > 0 && (s[i-1] == 'e' || s[i-1] =='E') ))  
                {  
    
                }  
                else  
                    n++;  
            }  
        }  
        if((x == 0 && e == 0) || (x > 1) || (e > 1) || n > 0)  
        {  
            cout<<"NO"<<endl;  
        }  
        else if(x == 1)  
        {  
            for(int i = 0; i < len ; i++)  
            {  
                if(s[i] == '.')  
                {  
                    if(i > 0 && s[i-1] >='0' && s[i] <= '9' && i+1 <len && s[i+1] >='0' && s[i+1] <= '9')  
                    {  
                        if(i-1==0)  
                        {  
                            if(s[i-1] >= '0' && s[i-1] <='9')  
                            {  
                                 cout<<"YES"<<endl;  
                            }  
                            else  
                              cout<<"NO"<<endl;  
                        }  
                        else  
                             cout<<"YES"<<endl;  
                    }  
                    else  
                        cout<<"NO"<<endl;  
                }  
            }  
        }  
        else  
        {  
            cout<<"YES"<<endl;  
        }  
    
    
    }  
    return 0;  
    

    }

  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781737.html
Copyright © 2011-2022 走看看