结队编程项目——四则运算
一、项目需求
- 自动生成小学四则运算题目(加、减、乘、除)统计正确率
- 支持整数
- 支持多运算符(比如生成包含100个运算符的题目)
- 支持真分数
需求分析:
生成四则运算:需要使用随机数生成,需要创造一个能实现计算功能的类。
支持多运算符:运算符也需要利用随机生成,并且不限个数。
支持真分数:需要用到生成分子、分母的函数,将分数化简等。
统计正确率:需要设置一个计算变量,并需要用一个判断正确的函数。
二、设计思路
首先根据需求分析,进行大体的设计:
生成题目→输入答案→判断正误→下一道题→生成题目→ ......→显示正确率
我和搭档决定一共用四个类,来完成本次项目:1.Main.java 2.栈.java 3.计算.java 4.后缀.java
UML类图:
三、关键代码
压栈\出栈:
第一周我们打算先完成栈和计算的部分,根据老师发的参考网站,我们又自行百度了很多关于栈的学习资料...但由于我们的水平有限,经过一下午的时间,还是未能完全搞懂如何利用栈来进行后缀计算,所以我们向学长请教,在学长的指导下,完成了部分代码。我们的栈主要分为两个部分,一是DataStack,专门用来存储数字,二是CharStack用来存储运算符。以此来完成老师参考资料里的后缀表达式算法。
public class CharStack { int n; char [] a; int top = -1; public CharStack(int m) { //定义栈的大小 this.n=m; } void getStack() { // 定义栈的大小 a = new char[n]; } void push(char data) { //压栈 a[++top]=data; } char pop() {//出栈 return a[top--]; } }
public class DataStack { //代码原理同上一个CharStack int n; Rational [] a; int top = -1; public DataStack(int m) { this.n=m; } void getStack() { a = new Rational[n]; for(int i=0;i<n;i++) { a[i] = new Rational(); } } void push(Rational data) { top++; a[top].numerator=data.numerator; a[top].denominator=data.denominator; } Rational pop() { return a[top--]; } }
题目运算:
而计算部分我们则采取了全分数计算的方式,整数也作为分母为1的分数。并且还能做到对分数进行约分,我们想的是利用找分子分母最大公约数,然后同除以其约数,完成约分。在将运算共分为四种情况:加减乘除。先利用分子分母有理化,将分母化为一样的,然后再进行基本运算,得到新的分数,再进行约分,得到答案。
public class Rational { double numerator = 1 ; //分子 double denominator = 1; //分母 void setNumerator(double a) { //设置分子 double c=f(Math.abs(a),denominator); //计算最大公约数 numerator = a/c;//约分 denominator = denominator/c; if(numerator<0&&denominator<0) { //分子分母负数情况 numerator = -numerator; denominator = -denominator; } } void setDenominator(double b) { //设置分母 double c=f(numerator,Math.abs(b)); //计算最大公约数 numerator = numerator/c; denominator = b/c; if(numerator<0&&denominator<0) { numerator = -numerator; denominator = -denominator; } } double getNumerator() {//返回分子 return numerator; } double getDenominator() { return denominator; } double f(double a,double b) { //求a和b的最大公约数 if(a==0) return 1; if(a<b) { double c=a; a=b; b=c; } double r=a%b; while(r!=0) { //辗转相除 a=b; b=r; r=a%b; } return b; } Rational add(Rational r) { //加法运算 double a=r.getNumerator(); double b=r.getDenominator(); double newNumerator=numerator*b+denominator*a; //计算出新分子 double newDenominator=denominator*b; //计算出新分母 Rational result=new Rational(); result.setNumerator(newNumerator); result.setDenominator(newDenominator); return result; } Rational sub(Rational r) { //减法运算 double a=r.getNumerator(); double b=r.getDenominator(); double newNumerator=numerator*b-denominator*a; double newDenominator=denominator*b; Rational result=new Rational(); result.setNumerator(newNumerator); result.setDenominator(newDenominator); return result; } Rational muti(Rational r) { //乘法运算 double a=r.getNumerator(); double b=r.getDenominator(); double newNumerator=numerator*a; double newDenominator=denominator*b; Rational result=new Rational(); result.setNumerator(newNumerator); result.setDenominator(newDenominator); return result; } Rational div(Rational r) { //除法运算 double a=r.getNumerator(); double b=r.getDenominator(); double newNumerator=numerator*b; double newDenominator=denominator*a; Rational result=new Rational(); result.setNumerator(newNumerator); result.setDenominator(newDenominator); return result; } static boolean judge(Rational a,Rational b) {//判断是否正确 if(a.numerator==b.numerator && a.denominator==b.denominator) return true; else return false; } }
四、遇到的困难及解决办法
问题1:不会栈的使用
问题1解决办法:参考网上的博客:《栈详解及Java实现》 https://www.cnblogs.com/fzz9/p/8167546.html,然后对于一些细节不懂的地方再请教学长
问题2:没有分数运算的思路,无从下手
问题2解决办法:参考网上的博客:《Java-分数运算》https://blog.csdn.net/slyslyme/article/details/80032526。
五、对小伙伴鑫浩的评价:
搭档是一个非常有责任心的伙伴,也是一个很热情的人,在我们开发项目之前,他就已经进行了一些关于项目所需函数的了解,并且在设计时他也非常积极,在共同工作时总能给与我很大的帮助。
六、P2P图
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 20 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 900 | |
· Analysis | · 需求分析 (包括学习新技术) | 300 | 350 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 180 | |
· Coding | · 具体编码 | 900 | |
· Code Review | · 代码复审 | 180 | |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | |
Reporting | 报告 | 90 | |
· Test Report | · 测试报告 | 90 | |
· Size Measurement | · 计算工作量 | 90 | |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 90 | |
合计 | 2990 |
原文地址:https://www.cnblogs.com/apollooo/p/10645536.html