个人作业1——四则运算题目生成程序(基于控制台)
2017-03-07 10:53 olivia-sun 阅读(245) 评论(1) 编辑 收藏 举报Coding代码地址:https://coding.net/u/olivia-sun/p/test1/git
一、题目描述:
用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
- 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
- 运算符为 +, −, ×, ÷
- 并且要求能处理用户的输入,并判断对错,打分统计正确率。
- 要求能处理用户输入的真分数, 如 1/2, 5/12 等
- 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
二、需求分析
- 自动生成小学四则运算题目,除整数以外,还支持真分数的四则运算;
- 能接受用户输入答案,采用if语句来判断对错,若错误则给出正确答案,最后给出总共对错的数量和正确率;
- 运用for循环来实现批量给出所需数目题目,并且使用计算机C语言中的rand函数,rand是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子,来保证题目不能重复;
三、功能设计
- 根据用户所给答案判断对错,若答案错误,给出正确结果;
- 最后给出所做题目正确个数以及错误个数,并计算正确率;
四、设计实现
- 函数YueFen实现约去分子分母的最大公倍数
void YueFen(int *a,int *b)
{
int c, d, e;
if (*a>*b)
{
for (c = *b; c >= 1 && c <=*b; c--)
{
d = *a%c;
e = *b%c;
if (d == 0 && e == 0)
{
*a = *a / c;
*b = *b / c;
}
}
}
else
{
for (c = *a; c >= 1 && c <= *a; c--)
{
d = *a%c;
e = *b%c;
if (d == 0 && e == 0)
{
*a = *a / c;
*b = *b / c;
}
}
}
}
- 用函数JudgeInt以及Judgefenshu分别实现判断整数和分数答案的对错,如果答案错误,给出正确答案。
void Judgeint(int s1, int s2, float a[2])
{
if (s2 == s1)
{
cout << "right!" << endl; a[0]++;
}
else
{
cout << "wrong!" << endl; a[1]++;
cout << "The right answer is " << s1 << endl;
}
}
分数判断函数这里省略。
3. 用函数DealInt以及DealFenshu分别生成整数与分数运算题目,以及相关运算方法。
void DealFenshu(int m, float a[2])
{
int s1,s2,s3,s4;
char c;
for (int p = 0; p<m; p++)
{
int i = (int)rand() % 10;
int j = (int)rand() % 10;
while (j == 0 || i >= j)
{
i = (int)rand() % 10;
j = (int)rand() % 10;
}
int x = (int)rand() % 10;
int y = (int)rand() % 10;
while (y == 0 || x >= y)
{
x = (int)rand() % 10;
y = (int)rand() % 10;
}
int k = (int)rand() % 4;
switch (k)
{
case 0:
cout << "(" << i << "/" << j << ")" << "+" << "(" << x << "/" << y << ")" << "=";
cin >> s1;
c = getchar();
cin >> s2;
s3= i*y + x*j;
s4= j*y;
YueFen(&s3, &s4);
Judgefenshu(s1, s2, s3, s4, a);
break;
case 1:
cout << "(" << i << "/" << j << ")" << "-" << "(" << x << "/" << y << ")" << "=";
cin >> s1;
c = getchar();
cin >> s2;
s3 = i*y - x*j;
s4 = j*y;
YueFen(&s3, &s4);
Judgefenshu(s1, s2, s3, s4, a);
break;
case 2:
cout << "(" << i << "/" << j << ")" << "*" << "(" << x << "/" << y << ")" << "=";
cin >> s1;
c = getchar();
cin >> s2;
s3 = i*x;
s4 = j*y;
YueFen(&s3, &s4);
Judgefenshu(s1, s2, s3, s4, a);
break;
case 3:
cout << "(" << i << "/" << j << ")" << "/" << "(" << x << "/" << y << ")" << "=";
cin >> s1;
c = getchar();
cin >> s2;
s3 = i*y;
s4 = j*x;
YueFen(&s3, &s4);
Judgefenshu(s1, s2, s3, s4, a);
break;
}
}
}
这里处理整数部分省略,需要注意的是,整数的除法运算中若被除数与除数不能整除则需要用到分数的运算方法,并且分母不能为零,若为零需重新生成随机数。
五、测试运行
六、PSP:
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student | Time (%) |
Planning | 计划 | 6 | 5 |
· Estimate | 估计这个任务需要多少时间 | 8 | 6 |
Development | 开发 | 85 | 90 |
· Analysis | 需求分析 (包括学习新技术) | 10 | 12 |
· Design Spec | 生成设计文档 | 0 | 0 |
· Design Review | 设计复审 | 0 | 0 |
· Coding Standard | 代码规范 | 3 | 2 |
· Design | 具体设计 | 10 | 12 |
· Coding | 具体编码 | 80 | 100 |
· Code Review | 代码复审 | 0 | 0 |
· Test | 测试(自我测试,修改代码,提交修改) | 15 | 25 |
Reporting | 报告 | 10 | 8 |
· | 测试报告 | 3 | 2 |
· | 计算工作量 | 5 | 4 |
· | 并提出过程改进计划 | 3 | 3 |