本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2166
我的github远程仓库的地址:https://github.com/CTqin/CTqin
第一部分:要求
具体要求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:
23 - 3 * 4 = 11
第二部分:设计
1.需求分析
第三部分:实现
(功能一)整数部分的相加减 实现
通过产生随机数字,其中的两个随机数是符号对应随机产生的符号。
a = rand() % 99+1;//产生随机数a b = rand() % 99+1;//随机数b c = rand() % 99+1;//随机数c d = rand() % 4+1;//随机产生第一个对应符号位+-/* d2 = rand() % 4+1;//随机产生第二个对应符号位+-/*
获取用户输入需求的题目道数n,利用for()语句循环实现功能需求。
里面嵌套switch()case语句实现整个四则运算功能。如下是实现首先随机产生加号的代码:
case 1://+ switch(d2) { case 1://+ printf("请计算 "); printf("%d + %d + %d= ",a,b,c); scanf("%d",&useranswser); answer=a+b+c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案错误 "); printf("答案是:%d ",answer); } break; case 2://- printf("请计算 "); if((a+b)<c)//不能负数处理 { temp=a; a=c; c=a; printf("%d + %d - %d=",a,b,c); scanf("%d",&useranswser); answer=a+b-c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%d ",answer); printf("答案错误 "); } } else { printf("%d + %d - %d=",a,b,c); scanf("%d",&useranswser); answer=a+b-c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%d ",answer); printf("答案错误 "); } } break; case 3://* printf("请计算 "); printf("%d + %d * %d= ",a,b,c); scanf("%d",&useranswser); answer=a+b*c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%d ",answer); printf("答案错误 "); } break; case 4://除/ printf("请计算(精算小数点后两位) "); printf("%d + %d / %d= ",a,b,c); scanf("%f",&useranswser2); answer=(int)(useranswser2*100 ) ; // printf("%f ",ftemp); fanswer=(float)a+(float)b/c;//强转结果数据类型 intanswer= (int)( (fanswer+0.005)*100 ) ; // printf("%d",intanswer);//答案扩大100 if(-0.02<answer - intanswer && answer - intanswer <0.02) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%0.2f ",fanswer); printf("答案错误 "); } break; } break;
而后的减乘除也是同理。实现功能的同时利用percentageAnswer来记录已经答对的题目,一些细节要考虑清楚,利用if语句来进行判断,处理一些不能负数的结果。比如如果两数相加后随机产生的随机符号是减号,
两数相加后需要判断下是否大于0
if((a+b)<c)//不能负数处理 { temp=a; a=c; c=a; printf("%d + %d - %d=",a,b,c); scanf("%d",&useranswser); answer=a+b-c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%d ",answer); printf("答案错误 "); } } else { printf("%d + %d - %d=",a,b,c); scanf("%d",&useranswser); answer=a+b-c; if(useranswser==answer) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%d ",answer); printf("答案错误 "); }
}
(功能二)分数部分的相加减实现
通过定义结构体
typedef struct { int numerator; /* 分子 */ int denominator; /* 分母 */ } Fraction;
函数最小公倍数,最小公因数(借鉴网上知识)
/* 返回两个整数的最大公约数 */ int GCD(int a,int b) { int i,temp_gcd; for(i=a;i>=1;i--) { if(a%i==0) { if(b%i==0) { temp_gcd=i; return temp_gcd; } } } } /* 返回两个整数的最小公倍数 */ int LCM(int a,int b) { int temp_lcm; temp_lcm = a * b / GCD(a,b); return temp_lcm; }
通分实现分数的相加减,详细代码有注释。
第四部分:问题解决
在本次布置作业中主要遇到两个问题,一个就是在整数四则运算计算的时候,保留两位小数和用户输入的答案进行的比较,即是两个浮点数之间的比较,我原本通过定义宏常量0.001,fas(两数相减)//绝对值是否大于定义的宏常量即可。不知到为什么,我测试的时候老是出现的结果不是我想要的,可能是某处的逻辑问题。然后再修改-0.02<结果(保留两位小数,扩大一百倍)<0.02来比较,后来还是没达到我想要的效果,仔细想了想,发现没有-0.02<结果(保留两位小数,扩大一百倍)<0.02这种表示方法,具体的是里面要夹带&&。通过强转数据类型解决我的问题。处理的代码如此
printf("%d / %d / %d=",a,b,c); scanf("%f",&useranswser2); answer=(int)(useranswser2*100 ) ; // printf("%f ",ftemp); fanswer=(float)a/b/c;//强转结果数据类型 intanswer=(int)( (fanswer+0.005)*100 ) ; // printf("%d",intanswer);//答案扩大100 if(-0.02<answer - intanswer && answer - intanswer <0.02) { percentageAnswer++; printf("答对%d题目 ",percentageAnswer); } else { printf("答案是:%0.2f ",fanswer); printf("答案错误 "); }
还有一个就是公约数,公因数那块,在网上学习观摩了一会就理解解决问题。
第五部分:运行结果截图
主菜单功能:
功能一:
功能二 分数题目(扩展题目)
附图:统计表
PSP2.1 |
Personal Software Process Stages |
Time Senior Student(h) |
Time(h) |
Planning |
计划 |
0 |
0 |
· Estimate |
估计这个任务需要多少时间 |
5 |
6 |
Development |
开发 |
1 |
1.5 |
· Analysis |
需求分析 (包括学习新技术) |
0.1 |
0.01 |
· Design Spec |
生成设计文档 |
0 |
0 |
· Design Review |
设计复审 |
3 |
2 |
· Coding Standard |
代码规范 |
0.1 |
0.1 |
· Design |
具体设计 |
0.5 |
0.5 |
· Coding |
具体编码 |
3 |
3.5 |
· Code Review |
代码复审 |
1 |
1 |
· Test |
测试(自我测试,修改代码,提交修改) |
0.5 |
0.6 |
Reporting |
报告 |
0 |
0 |
Test Report |
测试报告 |
0 |
0.5 |
·workload |
计算工作量 |
0 |
0.2 |
·correction |
并提出过程改进计划 |
0 |
0 |