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

码市地址:
https://coding.net/u/xmcyh1996/p/xxx/git/blob/master/szys.java

1.作业内容

a.需求分析
(1)基础需求
①除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
②运算符为 +, −, ×, ÷
③并且要求能处理用户的输入,并判断对错,打分统计正确率。
④要求能处理用户输入的真分数, 如 1/2, 5/12 等
⑤使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10
(2)自己的思考分析
①命令行指的是DOS界面,,一次显示/输入一行,运行程序必须在DOS界面上输入一条命令,命令是一个字符串,用回车键结束,一条命令是一行所以叫“命令行”。
②该题的重点在支持随机生成和真假分数的判断(个人认为)
③优化:如果可以直接读取txt文档(文档里写好四则运算)比较方便(个人认为)
④调研了朋友的需求:四则运算功能太少,最好能开根号什么的,能手写输入、语音输入(想的都很美好,但做不到orz)
⑤真分数:分子比分母小的分数,叫做真分数。真分数的分数值小于一。如:1/2,3/5,8/9等等。

b.功能设计
(1)基本功能
实现a.(1)需求分析的基础需求的全部
(2)扩展功能
对于错误答案的四则算式,输出正确答案
(3)高级功能
从txt导入四则运算

c.设计实现
(1)类
szys:实现可定制数量随机输出四则算式(整数式和分数式的数量也随机),注意考虑除法分母应当不为0的情况
最后统计题目的正确率并输出所有正确答案进行对比

(2)函数
①createFraction:用来产生随机的真分数
②GCD:递归法求最大公约数,用来化简分式,保持每个分数都真分数
③LCM:求最小公倍数,功能同上

d.代码说明
①随机生成真分数

public static int[] createFraction(){//随机生成真分数
	int[] n = new int[2];
	int n1 = (int)(Math.random()*10+1);//随机生成分母,分母≠0
	int n2 = (int)(Math.random()*10+1);//随机生成分子,分母>分子,分子≠0
	if(n1 != n2){
		n[0] = n2;
		n[1] = n1;
	}else
		createFraction();
	return n;
	}

②求最大公约数

public static int GCD(int m, int n) {//递归法求最大公约数
	if(m < n){//保证m>n,否则进行交换
		int temp = m;
		m = n;
		n= temp;
	}
	if(m % n == 0){//若余数为0,返回最大公约数
		return n;
	}else{//否则进行递归
		return GCD(n, m % n);
	}
}

③求最小公倍数

public static int LCM(int m, int n){//求最小公倍数
	return m * n / GCD(m,n);
}

④进行四则运算的主程序(分数运算部分代码)

			int a = (int)(Math.random()*4+1);
			if(a==1){//加
				Question.add("("+fn1[0]+"/"+fn1[1]+")+("+fn2[0]+"/"+fn2[1]+")=");
				int sum = gbs/fn1[1]*fn1[0] + (gbs / fn2[1]*fn2[0]);
				int gys1 = GCD(sum,gbs);
				Answer.add(sum/gys1+"/"+gbs/gys1+"");//化简结果并存储
			}
			if(a==2){//减
				Question.add("("+fn1[0]+"/"+fn1[1]+")-("+fn2[0]+"/"+fn2[1]+")=");
				int cha = gbs/fn1[1]*fn1[0] - (gbs / fn2[1]*fn2[0]);
				int gys2 = GCD(cha,gbs);
				Answer.add(cha/gys2+"/"+gbs/gys2+"");
			}
			if(a==3){//乘
				Question.add("("+fn1[0]+"/"+fn1[1]+")×("+fn2[0]+"/"+fn2[1]+")=");
				int mult1 = fn1[0]*fn2[0]; 
				int mult2 = fn1[1]*fn2[1];
				int gys3 = GCD(mult1,mult2);
				Answer.add(mult1/gys3+"/"+mult2/gys3+"");//
			}
			if(a==4){//除
				Question.add("("+fn1[0]+"/"+fn1[1]+")÷("+fn2[0]+"/"+fn2[1]+")=");
				int div1 = fn1[0]*fn2[1]; //转化为乘法
				int div2 = fn1[1]*fn2[0];
				int gys4 = GCD(div1,div2);
				Answer.add(div1/gys4+"/"+div2/gys4+"");
			}				
		}

e.测试运行
程序能正确编译,尝试5组的数据,随机生成整数式和真分数式,能够打出正确率和正确答案(环境变量出了点问题,暂时用绝对路径运行)

2.展示PSP

耗时最多:具体编码(特别是需求⑤使用 -n 参数控制生成题目的个数,本想用exe4j做,但是软件一直下载失败)
估计失败:1.c设计实现,不太擅长写这种,写的也不太好

3.小结
程序缺点:
①只能实现两个数的四则(可改进为多数,但不懂得如何随机四则式的项数)
②局限于窗口打印,结果不够美观(用netbean做一下界面会比较好看)
③存在浮点数和整数之间无法比较的问题,尝试了强行转换,无效
感想:
①很久没编程感觉手生,以及开始对题目的分析理解有偏差导致浪费了很多时间,作为计算机的学生不应该生疏编程能力
②虽然四则运算是简单题,但随机生成之后需要考虑的问题,像化简式子、考虑真假分数,考虑整数式子和分数式子,较为繁复
③出现了数组溢出的问题,浮点数与整数无法比较的问题,还未解决(请老师指点)

有时候会提示“分母不能为零”的报错,随机数函数已经+1不知道为什么会有错。

④谢谢助教老师检查,辛苦了

posted on 2017-03-05 01:21  201421123068  阅读(233)  评论(2编辑  收藏  举报

导航