20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

20165101刘天野 2017-2018-2 《Java程序设计》 结对编程练习_四则运算(第二周)

一、需求分析

  • 能随机生成n道四则运算题目,n由使用者输入
  • 支持分数运算
  • 支持多运算符
  • 能够判断正误,错误时能提醒并输出正确答案
  • 能计算出正确率

二、设计思路

本项目主要分为两大部分。第一部分是对复杂计算式的计算,第二部分是随机题目的生成。

对于复杂计算式的计算,我参考了娄老师的博客2016-2017-2 《Java 程序设计》课堂实践项目——数据结构应用中的逆波兰式的思想来解决,真分数的运算参考课本中第四章的例子22。

对于随机计算式的生成,我利用了Random类中的nextInt()方法,根据生成的随机数,生成对应的运算符和数字,从而形成计算式。

三、本周达成功能:

  • 能够随机生成n道题目,n由用户输入;
  • 支持真分数运算,支持多运算符;
  • 能够计算正确率。

三、关键代码及解释

复杂计算式的读取与计算:

Rational manage() {
	int i=0;
	Rational r = new Rational();
	double d;
	while(true) {
		if(i>=a.length())
			break;
		char c = a.charAt(i);
		if(c>='0' && c<='9') {//从字符串中检测数字
			String temp = String.valueOf(c);
			String s = new String();
			s = s+temp;
			i++;
			if(i>=a.length()) {
				d = Double.parseDouble(s);
				r.setNumerator(d);
				datastack.push(r);
				break;
			}
			c = a.charAt(i);
			while(c>='0' && c<='9') {
				temp = String.valueOf(c);
				s = s+temp;
				i++;
				if(i>=a.length())
					break;
				c = a.charAt(i);
			}
			d = Double.parseDouble(s);
			r.setNumerator(d);
			datastack.push(r);
			continue;
		}
		else if(c=='*' || c=='/') {//从字符串中检测运算符
			while(true) {
				if(charstack.top==-1) {//如果符号栈顶无元素,入栈。
					charstack.push(c);
					break;
				}
				if(charstack.a[charstack.top]=='+' || charstack.a[charstack.top]=='-') {//如果符号栈顶是+或-,入栈。
					charstack.push(c);
					break;
				}
				else if((charstack.a[charstack.top]=='*' || charstack.a[charstack.top]=='/') && (datastack.top>=1)) {//如果符号栈顶是*或/,并且栈内元素大于等于1,计算。
					calculate(charstack.a[charstack.top]);
					continue;
				}
				else {
					charstack.push(c);
					break;
				}
			}
		}
		else if(c=='+' || c=='-') {
			while(true) {
				if(charstack.top==-1) {//如果符号栈顶无元素,入栈。
					charstack.push(c);
					break;
				}						
				else if((charstack.a[charstack.top]=='+' || charstack.a[charstack.top]=='-' || charstack.a[charstack.top]=='*' || charstack.a[charstack.top]=='/') && (datastack.top>=1)) {
					calculate(charstack.a[charstack.top]);//计算。
					continue;
				}
				else {
					charstack.push(c);
					break;
				}
			}
			
		}
		else if(c=='(') {//如果符号是(,入栈。
			charstack.push(c);
		}
		else if(c==')') {//如果符号是),栈内符号依次计算。
			while(true) {
				if(charstack.a[charstack.top]=='(') {
					charstack.pop();
					break;
				}
				else {
					calculate(charstack.a[charstack.top]);
				}
			}
		}
		i++;
	}
	while(true) {
		if(datastack.top>=1)
			calculate(charstack.a[charstack.top]);
		else
			break;
	}
	return datastack.pop();
}

四、UML图

五、测试方法

六、运行过程截图

七、代码托管

码云链接

八、遇到的困难

问题一:随机生成题目,如何随机生成括号,以及如何保证生成计算式的正确性。

PSP

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 0.5 0.5
Estimate 估计这个任务需要多少时间 0.5 1
Development 开发 2 2.5
Analysis 需求分析(包括学习新技术) 2 4
Design Spec 生成设计文档 1 1
Disign Review 设计复审(和同事审核设计文档) 0.5 1
Code Standard 代码规范 2 2
Design 具体设计 3 2
Coding 具体编码 5 6
Code Review 代码复审 1 1.5
Test 测试(自我测试,修改代码,提交修改) 2 3
Reporting 报告 2 2.5
Test Report 测试报告 1.5 2
Size Measurement 计算工作量 0.5 0.5
Postmortem&Process Improvement Plan 事后总结,并提出过程改进计划 1 1
total 合计 24.5 30.5

九、点评伙伴

随着合作的次数不断增加,我和队友的配合也愈发默契了,结队编程的效率有显著的提升。在关键问题的决策我们也能很快达成共识,这样很有利于我们项目的推进。希望我们以后还能一起合作,一起学习,一起做项目。

posted @ 2018-04-22 23:30  00埜00  阅读(154)  评论(1编辑  收藏  举报