结对项目

项目 内容
这个作业属于哪个课程 软件工程
作业要求 作业要求
作业目标 生成四则运算题目

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Estimate 估计这个任务完成需要多少时间 1800 2020
Development 开发 360 600
Analysis 需求分析(包括学习新技术) 200 300
Design Spec 生成设计文档 30 30
Design Review 设计复审(和同事审核设计文档) 20 20
Coding Standard 代码规范(为目前的开发指定合适的规范) 10 20
Design 具体设计 180 150
Coding 具体编码 600 500
Code Review 代码复审 100 100
Test 测试(自我测试,修改代码,提交修改) 120 120
Reporting 报告 60 60
Test Report 测试报告 40 40
Size Measurement 计算工作量 30 30
Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 50 50
合计 1800 2020

效能分析

性能分析图

结对项目

实时内存使用情况

结对项目
结对项目

设计实现过程

由InputExpression(number);函数实现随机生成number数量满足条件的算式,并放入ArrayList中
由AddExpressionToQuestion();函数实现将ArrayList中的算式放入队列Question中
由MyFileIO.writeQueue(exerciseFile, questions);函数实现将队列中的算式一一输出到运行目录下的exerciseFile(Exercises.txt)文件
由AddExpressionToAnswer();函数实现将这些算式的结果放入队列Answer中
由MyFileIO.writeQueue(answerFile, answers);函数实现将Answer中的结果输入到运行目录下的AnswerFile(answers.txt)文件

代码说明

	// 元素加法,结果放入e1中

	public static void Add(Element e1, Element e2) {
		if (e1.numerator == 0 && e2.numerator == 0)// 若分数部分均为0,只需对整数部分运算即可
			e1.wholeNumber += e2.wholeNumber;
		else {
			e1.wholeNumber += e2.wholeNumber;// 带分数整数部分相加,放入e1的整数部分
			int lcm = Lcm(e1.denominator, e2.denominator);// 求最小公倍数
			e1.numerator *= lcm / e1.denominator;// 对e1的分子进行变换
			e2.numerator *= lcm / e2.denominator;// 对e2的分子进行变换
			e1.denominator = lcm;// 分母就是求得的最小公倍数
			e1.numerator += e2.numerator;// e1和e2分子相加,存放在e1的分子处

			// 将假分数化成带分数(也防止出现e1的值为十七又三分之三而不是十八的情况)

			e1.wholeNumber += e1.numerator / e1.denominator;
			e1.numerator = e1.numerator % e1.denominator;

			// 最终结果要约分

			int factor = Gcd(e1.numerator, e1.denominator);
			e1.numerator /= factor;
			e1.denominator /= factor;
		}
		e1.operator = e2.operator;// 由于运算已经完成,将e2的运算符赋值给e1的运算符
		e1.nextElement = e2.nextElement;// 修改结点关系
	}

	// 元素减法,由于只有元素减法会产生负数,因此一旦有负数,return false

	public static boolean Sub(Element e1, Element e2) {
		if (e1.numerator == 0 && e2.numerator == 0) {// 若分数部分均为0,只需对整数部分运算即可
			e1.wholeNumber -= e2.wholeNumber;
			if (e1.wholeNumber < 0)
				return false;
		} else {
			if (e1.wholeNumber < e2.wholeNumber)
				return false;// 如果整数部分就不够减,return false
			e1.numerator += e1.wholeNumber * e1.denominator;// 将带分数转化为假分数
			e2.numerator += e2.wholeNumber * e2.denominator;// 将带分数转化为假分数
			int lcm = Lcm(e1.denominator, e2.denominator);// 求最小公倍数
			e1.numerator *= lcm / e1.denominator;// 对e1的分子进行变换
			e2.numerator *= lcm / e2.denominator;// 对e2的分子进行变换
			e1.denominator = lcm;// 分母就是求得的最小公倍数
			e1.numerator -= e2.numerator;
			if (e1.numerator < 0)
				return false;

			// 将假分数化成带分数

			e1.wholeNumber = e1.numerator / e1.denominator;
			e1.numerator = e1.numerator % e1.denominator;

			// 最终结果要约分

			int factor = Gcd(e1.numerator, e1.denominator);
			e1.numerator /= factor;
			e1.denominator /= factor;
		} // e1和e2分子相减,存放在e1的分子处
		e1.operator = e2.operator;// 由于运算已经完成,将e2的运算符赋值给e1的运算符
		e1.nextElement = e2.nextElement;// 修改结点关系
		return true;
	}

	// 元素乘法,结果放入e1中

	public static boolean Multipy(Element e1, Element e2) {
		if (e1.denominator == 0 || e2.denominator == 0)
			return false;
		if (e1.numerator == 0 && e2.numerator == 0)// 若分数部分均为0,只需对整数部分运算即可
			e1.wholeNumber *= e2.wholeNumber;
		else {
			e1.numerator = (e1.wholeNumber * e1.denominator + e1.numerator)
					* (e2.wholeNumber * e2.denominator + e2.numerator);
			e1.denominator = e1.denominator * e2.denominator;
			e1.wholeNumber = e1.numerator / e1.denominator;// 将假分数化成带分数
			e1.numerator = e1.numerator % e1.denominator;

			// 最终结果要约分

			int factor = Gcd(e1.numerator, e1.denominator);
			e1.numerator /= factor;
			e1.denominator /= factor;
		}
		e1.operator = e2.operator;
		e1.nextElement = e2.nextElement;
		return true;
	}

	// 元素除法

	public static void Divide(Element e1, Element e2) {
		e1.numerator += e1.wholeNumber * e1.denominator;// 将带分数转化为假分数
		e2.numerator += e2.wholeNumber * e2.denominator;// 将带分数转化为假分数

		// 将除法运算转化为乘法运算

		e1.wholeNumber = e2.wholeNumber = 0;
		int temp = e2.numerator;
		e2.numerator = e2.denominator;
		e2.denominator = temp;
		Multipy(e1, e2);
	}
	// 最大公因数算法

	public static int Gcd(int a, int b) {
		if (b == 0)
			return a;
		return Gcd(b, a % b);
	}

	// 最小公倍数算法

	public static int Lcm(int a, int b) {
		return a * b / Gcd(a, b);
	}

项目小结

韦秋风:
惊吓收获:本次项目暴露了我编程能力的不足,特别是以为自己懂java,实际上对java的语言特性也不了解。对于面向对象的程序语言仍然不够熟悉。
惊喜收获:虽然代码形式比较丑陋,但坚持下来最终完成了核心功能。

陈泽同:
总体来说这次的项目我个人认为没有发挥到最好。和同伴一起编程的时间太少,再加上两人对模块设计思路有差异并且沟通不及时,造成了许多时间的浪费;不过逐渐熟悉对方后,我们之间的沟通变得更加有效,两人协作的效率也越来越高,在最终关头实现了1+1>2的效果,一齐发挥智慧攻克了一个困扰已久的bug。这次结对编程让我体会到思维的多样性和创造性,我们应该学会主动适应同伴的思维,同时也发挥出自己独特的能力。

上一篇:解决apt-get安装中的E: Sub-process /usr/bin/dpkg returned an error code (1)问题


下一篇:文件管理之打包压缩