代码改变世界

个人作业1——四则运算题目生成程序(基于控制台)

2017-03-07 10:53  olivia-sun  阅读(228)  评论(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()使用的随机数种子,来保证题目不能重复;

三、功能设计

  • 根据用户所给答案判断对错,若答案错误,给出正确结果;
  • 最后给出所做题目正确个数以及错误个数,并计算正确率;

四、设计实现

  1. 函数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;
			}
		}
	}
}
  1. 用函数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 StagesTime (%) Senior StudentTime (%)
Planning 计划 65
· Estimate 估计这个任务需要多少时间 8 6
Development开发8590
· Analysis需求分析 (包括学习新技术)1012
· Design Spec生成设计文档00
· Design Review设计复审00
· Coding Standard代码规范32
· Design具体设计1012
· Coding具体编码80100
· Code Review代码复审00
· Test测试(自我测试,修改代码,提交修改)1525
Reporting报告108
·测试报告32
·计算工作量54
·并提出过程改进计划33
##七、小结 通过这次个人项目,我学到了很多经验和教训: - 麻雀虽小,五脏俱全。这虽然仅是一个为期一周的个人项目,却包含了项目的各个要素。诸如设计,测试等步骤必不可少,否则便会遇到难以预料的问题。 - 这是第一次用coding发表代码,考验了自己的自学能力,收获颇丰。 - 简单的题目往深处去探讨往往并不简单。这次个人项目的生成四则运算表达式看似很简单,实际上蕴含着查重,分数等诸多复杂的问题,需要我们做好充分的设计,查重方面还未实现,需要后期学习完善。 - 设计对于一个项目十分重要。以前经常喜欢拿到题目,构思好算法就直接码代码。结果在过程中才发现自己写的代码逻辑不尽人意。