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

本文共 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

你可能感兴趣的文章
字符串类型的相互转换
查看>>
day57 手写socket、路由系统、响应一个动态内容、链接数据库、django配置、及应用、DNS服务器...
查看>>
无法执行该操作,因为链接服务器 "xxxxx" 的 OLE DB 访问接口 "SQLNCLI" 无法启动分布式事务 ....
查看>>
YARN的运行机制
查看>>
HTTP状态码
查看>>
iOS如何过滤掉文本中特殊字符
查看>>
python - wmi模块学习(windwos硬件信息获取)
查看>>
Maven------使用maven新建web项目出现问题 项目名称出现红色交叉
查看>>
基础学习:C#中float的取值范围和精度
查看>>
Akka-Cluster(3)- ClusterClient, 集群客户端
查看>>
java中基本数据类型和包装类的区别
查看>>
项目指南
查看>>
康托展开
查看>>
JarvisOJ Basic Help!!
查看>>
MongoDB-CRUD
查看>>
ASM字节码增强技术
查看>>
javaagent 简介
查看>>
《Linux4.0设备驱动开发详解》笔记--第十四章:Linux网络设备驱动
查看>>
C++学习之智能指针
查看>>
python升级安装后的yum的修复
查看>>