zoukankan      html  css  js  c++  java
  • B-浮点常量问题

    Description

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

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

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

    请注意Pascal语言的语法规则没有对浮点数常量的取值范围作出任何假定。

    Input

    输入只有一行,就是有待识别的字符串。字符串的长度不超过255。

    Output

    请将分析的结果按以下样例的格式输出。如果输入文件中的字符串是Pascal浮点常量,请输出字符串“YES”,否则输出字符串“NO”。

    Sample

    Input 

    1.2

    Output 

    YES

    Hint

    输入:1                                             输出:NO
    输入:1.0e-55                                 输出:YES
    输入:e-12                                       输出:NO
    输入:1e-12                                    输出:YES
    输入:6.5E                                       输出:NO
    输入:+4.1234567890E-9999     输出: YES
     
    老是WA改了好长时间,面向样例的编程要不得
    白天清醒了再看看
    #include <bits/stdc++.h>
    
    using namespace std;
    
    char s[300];
    bool flag = 1;
    int cnt1 = 0, cnt2 = 0, cnt3 = 0;
    
    int numb(char a){
        if(a >= '0' && a <= '9')
            return 1;
        return 0;
    }
    
    int main()
    {
        scanf("%[^
    ]", s);
        int n = strlen(s);
        int l = 0, r = n - 1;
        while(s[l] == ' ')
            l++;
        while(s[r] == ' ')
            r--;
            int i = l;
        while(i <= r){
           if(s[i] == '.'){
                cnt1++;
                if(i == l || i == r || cnt2 == 1 || cnt3 == 1 ){
                    flag = 0;
                    break;
                }
                 if(numb(s[i-1]) == 0 || numb(s[i+1]) == 0){
                    flag = 0;
                    break;
                }
           }
           else if(s[i] == '-' || s[i] == '+'){
                cnt2++;
                if(i == l){
                    cnt2--;
                    i++;
                    continue;
                }
                if(i == r){
                    flag = 0;
                    break;
                }
                else
                if((s[i-1] != 'e' && s[i-1] != 'E') || numb(s[i+1] == 0) ){
                    flag = 0;
                    break;
                }
           }
           else if(s[i] == 'e' || s[i] == 'E'){
                cnt3++;
                if(i == r || i == l){
                    flag = 0;
                    break;
                }
                if(numb(s[i-1]) == 0 || (!(numb(s[i+1]) == 1 || s[i+1] == '+' || s[i+1] == '-'))){
                    flag = 0;
                    break;
                }
           }
           else if(!numb(s[i])){
            flag = 0;
            break;
           }
           i++;
        }
       if(cnt1 > 1 || cnt2 > 1 || cnt3 > 1)
            flag = 0;
        if(flag && (cnt1 || cnt3))
            printf("YES
    ");
        else
            printf("NO
    ");
        return 0;
    }
     
  • 相关阅读:
    iOS开发- UICollectionView详解+实例
    iOS 8出色的跨应用通信效果:解读Action扩展
    iOS开发宝典:String用法大全
    Masonry介绍与使用实践
    UILabel 行间距设置
    libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
    适配iOS 8备忘录 开始启动(持续更新。。。1130)
    “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    HighCharts 详细使用及API文档说明
    跟我一起从零开始学WCF系列课程
  • 原文地址:https://www.cnblogs.com/kaito77/p/15313403.html
Copyright © 2011-2022 走看看