博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDUT 识别浮点常量问题 编译原理作业
阅读量:4984 次
发布时间:2019-06-12

本文共 5134 字,大约阅读时间需要 17 分钟。

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

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

2:分三中情况

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

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

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

View Code
#include 
#include
#include
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; } } } }

转载于:https://www.cnblogs.com/E-star/archive/2012/03/12/2392033.html

你可能感兴趣的文章
snprintf 返回值陷阱 重新封装
查看>>
asp.net GridView多行表头的实现,合并表头
查看>>
C#套打
查看>>
codeforce 932E Team Work(第二类斯特林数)
查看>>
PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类...
查看>>
省市三级菜单
查看>>
C#中的事件
查看>>
【每日进步】July 2012
查看>>
策略模式
查看>>
单机部署多实例redis
查看>>
Cookie登录保存
查看>>
继承与重写的具体事例
查看>>
327 作业
查看>>
sql 取汉字首字母
查看>>
python3 字符串属性(四)
查看>>
javascript 封装ajax(多版本)
查看>>
bzoj4034: [HAOI2015]树上操作(树剖)
查看>>
android-Activity
查看>>
${sessionScope.user}的使用方法
查看>>
IOS断点下载
查看>>