小学生四则运算(C)
博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ |
作业要求 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11376 |
作业目标 | 写一个能自动生成小学四则运算题目的程序 |
学号 | 3190704207 |
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> int N; //存储应该生成的题目数量 int Nc; //题目数量的拷贝 int lenth; //确定当前生成的题目有几位,默认生成2~5位 int t; //确定是否出含真分数的题 int i; //用于应付程序中要用到的各种循环 float result=0; //用于存储正确答案 float answer; //用于存储输入的答案 int right=0; //用于存储答案正确的数量 int num; //用于存储在整数情况下生成的随机数 float num1; //用于存储生成分数的分子 float num2; //用于存储生成分数的分母 float ep=0.00001; float ans1; //存储输入答案的分子 float ans2; //存储输入答案的分母 void ran(){ srand((int)time(0)); //利用时间变化,使种子的设定值为任意数 lenth=(int)rand()%4+2; //确定位数 t=(int)rand()%2; //确认是否出真分数,1出,0不出 } void fenshu(){ //生成一个真分数 num1=rand()%99+1; num2=rand()%100+1; while(num1>=num2){ //保证为真分数 num2=rand()%100+1; } printf("(%d/%d)",(int)num1,(int)num2); } void jia(int n){ while(n--){ ran(); printf("%d. ",Nc-n); if(t){ //进行具有分式的运算 for(i=1;i<lenth;i++){ fenshu(); result+=(num1/num2); printf("+"); } fenshu(); printf("="); scanf("%d/%d",&ans1,&ans2); answer=ans1/ans2; if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%f\n",result); //判断 } result=0; //答案初始化 }else{ //进行具有整数的运算 for(i=1;i<lenth;i++){ num=(int)rand()%100; result+=num; printf("%d+",num); } num=(int)rand()%100; result+=num; printf("%d=",num); //整数题目生成 scanf("%f",&answer); if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%d\n",(int)result); //判断 } result=0; //答案初始化 } } } void jian(int n){ while(n--){ ran(); printf("%d. ",Nc-n); if(t){ //进行具有分式的运算 fenshu(); result+=(num1/num2); printf("-"); for(i=2;i<lenth;i++){ fenshu(); result-=(num1/num2); printf("-"); } fenshu(); printf("="); scanf("%d/%d",&ans1,&ans2); answer=ans1/ans2; if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%f\n",result); //判断 } result=0; //答案初始化 }else{ //进行具有整数的运算 num=(int)rand()%100; result+=num; printf("%d-",num); for(i=2;i<lenth;i++){ num=(int)rand()%100; result-=num; printf("%d-",num); } num=(int)rand()%100; result-=num; printf("%d=",num); //整数题目生成 scanf("%f",&answer); if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%d\n",(int)result); //判断 } result=0; //答案初始化 } } } void cheng(int n){ while(n--){ ran(); printf("%d. ",Nc-n); if(t){ //进行具有分式的运算 fenshu(); result=num1/num2; printf("*"); for(i=2;i<lenth;i++){ fenshu(); result+=(num1/num2); printf("*"); } fenshu(); printf("="); scanf("%d/%d",&ans1,&ans2); answer=ans1/ans2; if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%f\n",result); //判断 } result=0; //答案初始化 }else{ //进行具有整数的运算 num=(int)rand()%100; result=num; printf("%d*",num); for(i=2;i<lenth;i++){ num=(int)rand()%100; result*=num; printf("%d*",num); } num=(int)rand()%100; result*=num; printf("%d=",num); //整数题目生成 scanf("%f",&answer); if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%d\n",(int)result); //判断 } result=0; //答案初始化 } } } void chu(int n){ while(n--){ ran(); printf("%d. ",Nc-n); num=(int)rand()%100; result=num; printf("%d/",num); for(i=2;i<lenth;i++){ num=(int)rand()%100; result/=num; printf("%d/",num); } num=(int)rand()%100; result/=num; printf("%d=",num); //整数题目生成 scanf("%f",&answer); result=((float)((int)((result+0.005)*100))); answer=answer*100; if(fabs(answer-result)<ep){ right++; //用于最后计算正确率 printf("正确!\n"); }else{ printf("错误!正确答案为:%.2f\n",result/100); //判断 } result=0; //答案初始化 } } int main(){ printf("注意:\n在需要输入小数时(即仅在除法运算中),请保留两位小数!\n"); printf("--------------------------------------------\n") ; printf("请输入想要生成的题目数量:\n"); scanf("%d",&N); getchar(); Nc=N; while(1){ //输入选择的运算 char c; printf("请输入想要进行的运算:(请输入符号 + - * /)\n"); scanf("%c",&c); printf("-------------------------------------------------\n"); if(c=='+'){ jia(N); break; }else if(c=='-'){ jian(N); break; }else if(c=='*'){ cheng(N); break; }else if(c=='/'){ chu(N); break; }else{ printf("输入的符号错误,请重新输入!!\n"); getchar(); } } printf("恭喜你全部完成题目,正确率为:%.1f%%\n",((right*1.0)/Nc*100)); return 0; }
运行结果如下所示:(按顺序分别为 + - * / 的运行结果)
总结:
- 前期在设计排版时,应该考虑更多,这才有助于之后的代码不会有遗漏
- 对于代码的编写规范和读入还有待进一步的加强,很多次的失败都出现在读入格式上,浪费了不少的时间,比如scanf中不能存在\n,浮点数不能用==进行比较,甚至是<=
- 在学习新技术这方面要更加肯下功夫,对于能够加强代码可行性的代码设计应该要掌握最新动态,比如随机函数种子srand的设置,浮点数的比较方式
- 这四则运算设计的还是有欠缺,在真分数的正确答案公布方面还是个很大的漏洞,理应应该输出分数格式
- 在题目设计上也还存在缺陷,难度还是过大,不适合小学生,甚至不太适合让人算,尤其是除法运算时,很容易会在保留两位小数的情况下,出现答案为0的情况
任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
计划 | 8 | 6 |
估计这个任务需要多少时间,并规划大致工作步骤 | 8 | 12 |
开发 | 150 | 180 |
需求分析(包括学习新技术) | 20 | 17 |
生成设计文档 | 5 | 4 |
设计复审 | 10 | 5 |
代码规范 | 5 | 1 |
具体设计 | 10 | 7 |
具体编码 | 50 | 35 |
代码复审 | 7 | 5 |
测试(自我测试,修改代码,提交修改) | 30 | 50 |
报告 | 20 | 15 |
测试报告 | 5 | 0 |
计算工作量 | 5 | 0 |
事后总结,并提出过程改进计划 | 10 | 15 |