SDUT 识别浮点常量问题 编译原理作业

http://acm.sdut.edu.cn/web/showproblem.php?pid=2098&cid=1088

相当于一道模拟题吧。纠结死我了、、各种WA各种不爽。。好多情况要考虑。。自己的思维全面性,以及编码能力还是不够啊。。。最重要的一点就是要静下心来。。。不能浮躁。。。

1:整个浮点数前后的空格不考虑,开始我考虑在内了所以WA了很多次。。

2:分三中情况

a: 只有小数点,无e(E)...

b:只有e(E),无小数点。。

c:既有小数点,又有e(E)..

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 300
char str[maxn];
int main()
{
int i,len;
int dn,en,td,te;
int s;
while (gets(str) != NULL)
{
dn = en = 0;//初始化,dn记录小数点的个数,en记录e的格式
td = te = s = 0;//s记录初始位置,td,te,分别记录小数点以及e的位置
len = strlen(str);
//把前后的空格清理一下
while (str[s] == ' ') s++;
while (str[len - 1] == ' ') len--;
for (i = 0; i < len; ++i)//统计小数点以及e的个数
{
if (str[i] == '.')
{
dn++; td = i;
}
if (str[i] == 'E' || str[i] == 'e')
{
en++; te = i;
}
}
if ((dn > 1 || en > 1) || (dn == 0 && en == 0))//如果小数点以及e的个数存在大于1的或者都小于0
{
printf("NO\n");
continue;
}
//只存在小数点,无e的情况
else if (dn == 1 && en == 0)
{
if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//第一位如果不满足直接输出NO
{
printf("NO\n");
continue;
}
if (!(str[td - 1] >= '0' && str[td - 1] <= '9') || td - 1 < s)//对紧靠小数点左边的以为检查
{
printf("NO\n");
continue;
}
bool flag = false;
for (i = s + 1; i < td; ++i)//对小数点左边的所有情况进行检查
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
if (td + 1 >= len)//对紧靠小数点右边的那一点检查
{
printf("NO\n");
continue;
}
flag = false;
for (i = td + 1; i < len; ++i)//对小数点右边的所有数检查
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
else
{
printf("YES\n");
continue;
}
}
//只有e而没有小数点的情况
else if (dn == 0 && en == 1)
{
if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//第一位如果不满足直接输出NO
{
printf("NO\n");
continue;
}
if (!(str[te - 1] >= '0' && str[te - 1] <= '9') || te - 1 < s)//对紧靠e左边的一位进行检查
{
printf("NO\n");
continue;
}
bool flag = false;
for (i = s + 1; i < te; ++i)//对e左边的所有数检查
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
break;
flag = true;
}
}
if (flag)
{
printf("NO\n");
continue;
}
flag = false;
for (i = te + 1; i < len; ++i)//对e后边的所有情况进行检查
{

if (i == te + 1 && (str[i] == '+' || str[i] == '-'))
continue;
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
else
{
if (te + 1 >= len || !(str[len - 1] >= '0' && str[len - 1] <= '9'))
printf("NO\n");
else
printf("YES\n");
continue;
}

}
//。与e都有
else if(dn == 1 && en == 1)
{
if (str[s] != '+' && str[s] != '-' && !(str[s] >= '0' && str[s] <= '9'))//开头检查
{
printf("NO\n");
continue;
}
if (!(str[td - 1] >= '0' && str[td - 1] <= '9') || td - 1 < s)//对紧靠.左边的一位进行检查
{
printf("NO\n");
continue;
}
bool flag = false;
for (i = s + 1; i < td; ++i)//对.左边的所有情况进行检查
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
if (td + 1 >= te)
{
printf("NO\n");
continue;
}
flag = false;
for (i = td + 1; i < te; ++i)//对.与e之间进行检查
{
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
flag = false;
for (i = te + 1; i < len; ++i)//对e后面的所有情况进行检查
{
if (i == te + 1 && (str[i] == '+' || str[i] == '-'))
continue;
if (!(str[i] >= '0' && str[i] <= '9'))
{
flag = true;
break;
}
}
if (flag)
{
printf("NO\n");
continue;
}
else
{
if (te + 1 >= len || !(str[len - 1] >= '0' && str[len - 1] <= '9'))
printf("NO\n");
else
printf("YES\n");
continue;
}
}
}

}



你可能感兴趣的:(编译原理)