本次作业要求来自: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;//产生随机数ab = rand() % 99+1;//随机数bc = rand() % 99+1;//随机数cd = rand() % 4+1;//随机产生第一个对应符号位+-/*d2 = rand() % 4+1;//随机产生第二个对应符号位+-/*
获取用户输入需求的题目道数n,利用for()语句循环实现功能需求。
里面嵌套switch()case语句实现整个四则运算功能。如下是实现首先随机产生加号的代码:
case 1://+switch(d2){case 1://+printf("请计算\n");printf("%d + %d + %d= ",a,b,c);scanf("%d",&useranswser);answer=a+b+c;if(useranswser==answer){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{printf("答案错误\n");printf("答案是:%d\n",answer);}break;case 2://-printf("请计算\n");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题目\n",percentageAnswer);}else{printf("答案是:%d\n",answer);printf("答案错误\n");} }else{printf("%d + %d - %d=",a,b,c);scanf("%d",&useranswser);answer=a+b-c;if(useranswser==answer){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{printf("答案是:%d\n",answer);printf("答案错误\n");}}break;case 3://* printf("请计算\n");printf("%d + %d * %d= ",a,b,c);scanf("%d",&useranswser);answer=a+b*c;if(useranswser==answer){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{printf("答案是:%d\n",answer);printf("答案错误\n");}break;case 4://除/printf("请计算(精算小数点后两位)\n");printf("%d + %d / %d= ",a,b,c);scanf("%f",&useranswser2);answer=(int)(useranswser2*100 ) ;// printf("%f\n",ftemp);fanswer=(float)a+(float)b/c;//强转结果数据类型intanswer= (int)( (fanswer+0.005)*100 ) ;// printf("%d",intanswer);//答案扩大100if(-0.02<answer - intanswer && answer - intanswer <0.02){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{ printf("答案是:%0.2f\n",fanswer);printf("答案错误\n");}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题目\n",percentageAnswer);}else{printf("答案是:%d\n",answer);printf("答案错误\n");} }else{printf("%d + %d - %d=",a,b,c);scanf("%d",&useranswser);answer=a+b-c;if(useranswser==answer){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{printf("答案是:%d\n",answer);printf("答案错误\n");}
}
(功能二)分数部分的相加减实现
通过定义结构体
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\n",ftemp);fanswer=(float)a/b/c;//强转结果数据类型intanswer=(int)( (fanswer+0.005)*100 ) ;// printf("%d",intanswer);//答案扩大100if(-0.02<answer - intanswer && answer - intanswer <0.02){percentageAnswer++;printf("答对%d题目\n",percentageAnswer);}else{printf("答案是:%0.2f\n",fanswer);printf("答案错误\n");}
还有一个就是公约数,公因数那块,在网上学习观摩了一会就理解解决问题。
第五部分:运行结果截图
主菜单功能:
功能一:
功能二 分数题目(扩展题目)
附图:统计表
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 |