代码:https://coding.net/u/AJIAN044/p/cyuyan/git/tree/master
题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
- 运算符为 +, −, ×, ÷
- 并且要求能处理用户的输入,并判断对错,打分统计正确率。
- 要求能处理用户输入的真分数, 如 1/2, 5/12 等
- 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
分析:
程序要求:
1、自动生成题目
2、除了整数,还要支持真分数运算
3、判断答案正确与否(可以识别真分数答案)
4、可以控制生成题目数量实现步骤
5、化简分数成最简结果
实现方式:
1、题目生成利用两个随机数,使用基于时间的随机,避免多次运行时产生的随机数相同。
2、利用switch语句以及随机数rand()%4,产生基于—+*/的随机。
3、gcd(int m,int n)生成最大公约数,便于计算。
4、两个函数fs()、zs()用于分数和整数的四则运算。
5、整数的除法以及分数的四则运算,将其结果转换为字符串,方便比较。
6、题目的生成数量,根据输入值d设置循环。
代码说明:
整数运算部分代码:
void zs() //整数 { int a,b,temp; int x,y; char result1[10],answer1[10],s[10];//作为除法的分数比较 int answer,result;//用于+-*三种运算 srand((int)time(0));//以时间为基数的随机 x=rand()%100; y=rand()%100; int c=rand()%4; switch(c) { case 0: printf("%d+%d=",x,y); //case 0、1、2用数字比较 temp=x+y; scanf("%d",&answer); if(answer==temp) { printf("正确 "); ttrue++; } else printf("错误 答案是%d ",result); break; case 1: if(x<y) { int temp =x; y=x; x=temp; } printf("%d-%d=",x,y); temp=x-y; scanf("%d",&answer); if(answer==temp) { printf("正确 "); ttrue++; } else printf("错误 答案是%d ",result); break; case 2: printf("%d×%d=",x,y); temp=x*y; scanf("%d",&answer); if(answer==temp) { printf("正确 "); ttrue++; } else printf("错误 答案是%s ",result); break; case 3: printf("%d÷%d=",x,y); //采用字符串进行比较 if(x%y==0) { temp=x/y; itoa(temp,result1,10); } else { temp=gcd(x,y); if(temp>0) { x=x/temp; y=y/temp; } else if (temp<0) { x=-x/temp; y=-y/temp; } itoa(x,result1,10); strcat(result1,"/"); itoa(y,s,10); strcat(result1,s); } scanf("%s",&answer1); if(strcmp(answer1,result1)==0) { printf("正确 "); ttrue++; } else printf("错误 答案是%s ",result1); break; } }
分数运算部分代码:
void fs() //分数 { int x1,y1,x2,y2,p,fz,fm,temp; //分子fz 分母fm char answer[20],result[20],s[9]; int d; d=rand()%4; srand((int)time(0)); x1=rand()%20+1; y1=rand()%20+1; if(x1>y1||x1==y1) { x1=rand()%20+1; y1=rand()%20+1; } temp=gcd(x1,y1); if(temp>0) { x1=x1/temp; y1=y1/temp; } else if (temp<0) { x1=-x1/temp; y1=-y1/temp; } x2=rand()%20+1; y2=rand()%20+1; if(x2>y2||x2==y2) { x2=rand()%20+1; y2=rand()%20+1; } temp=gcd(x2,y2); if(temp>0) { x2=x2/temp; y2=y2/temp; } else if (temp<0) { x2=-x2/temp; y2=-y2/temp; } switch(d) { case 0: printf("%d/%d+%d/%d=",x1,y1,x2,y2); fz=x1*y2+x2*y1; fm=y1*y2; break; case 1: printf("%d/%d-%d/%d=",x1,y1,x2,y2); fz=x1*y2-x2*y1; fm=y1*y2; break; case 2: printf("%d/%d×%d/%d=",x1,y1,x2,y2); fz=x1*x2; fm=y1*y2; break; case 3: printf("%d/%d÷%d/%d=",x1,y1,x2,y2); fz=x1*y2; fm=y1*x2; break; } p=gcd(fz,fm); if(p>0) { fz=fz/p; fm=fm/p; } else if (p<0) { fz=-fz/p; fm=-fm/p; } if(fz%fm==0) { temp=fz/fm; itoa(fz,result,10); } else { itoa(fz,result,10); itoa(fm,s,10); strcat(result,"/"); strcat(result,s); } scanf("%s:",&answer); if(strcmp(result,answer)==0) { printf("正确 "); ttrue++; } else printf("错误 答案是%s ",result); }
展示PSP:
PSP2.1 |
Personal Software Process Stages |
Time (%) Senior Student |
Time (%) SDE |
Planning |
计划 |
8 |
6 |
· Estimate |
· 估计这个任务需要多少时间 |
8 |
6 |
Development |
开发 |
82 |
88 |
· Analysis |
· 需求分析 (包括学习新技术) |
6 |
10 |
· Design Spec |
· 生成设计文档 |
5 |
6 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
4 |
6 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
3 |
3 |
· Design |
· 具体设计 |
10 |
20 |
· Coding |
· 具体编码 |
36 |
90 |
· Code Review |
· 代码复审 |
7 |
9 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
13 |
21 |
Reporting |
报告 |
9 |
20 |
|
3 |
10 |
|
|
2 |
1 |
|
|
3 |
3 |
小结:在前面整数的四则运算的编程时还算顺利,到了分数部分就开始卡住了。 也在网上借鉴了一些其他人的代码,自己也在理解后进行再编程。自己平时编程的练习还是不够,遇到bug的时候总要一条条的去搜索或者找问题。在后面的学习中一定多多练习,增强自己的编程能力。