20175126Apollo 20175126《Java程序设计》结队编程项目——四则运算 第一周阶段总结

结队编程项目——四则运算

一、项目需求

  • 自动生成小学四则运算题目(加、减、乘、除)统计正确率

    • 支持整数
    • 支持多运算符(比如生成包含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

时间: 2024-12-28 23:58:14

20175126Apollo 20175126《Java程序设计》结队编程项目——四则运算 第一周阶段总结的相关文章

20175209王梓鸿 结对编程项目—四则运算 第一周 阶段总结

20175209王梓鸿 结对编程项目-四则运算 第一周 阶段总结 一.需求分析 1.题目要求: 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 扩展需求 文件 处理生成题目并输出到文件 完成题目后从文件读入并判题 多语言支持简体中文,繁體中文,English 生成题目去重 二.设计思路 1.编写背景及完成情况 在开始写设计思路之前,我觉得应该说一下我们编写的情况(可能有些跑题).这次结对的

20172318 结对编程项目-四则运算 第一周 阶段总结

结对对象 学号 20172312 20172315 姓名 彭霖 胡智韬 担任角色 陆大岳 生成题目 编写主类 胡智韬 中缀转后缀 计算 彭霖 分数 需求分析 生成分级的题目 目前的代码编写只写了第一级(一个运算符)和第二级(两个运算符),有需要可以再加 指定生成题目的数量 放main方法里,用循环解决 支持真分数 把运算弄成分数的运算,还在写 答案 计算时用数组将每题答案记录并在最后输出 正确率 统计回答者的正确题数和题数的比值 拓展 去重暂时不会 设计思路 设计calculate类,实现填入生

20175314 结队编程项目——四则运算第二周

20175314 结队编程项目--四则运算第二周 一.需求分析 实现一个命令行程序,要求: 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计正确率 能生成随机数 产生的算式要有括号 要建立堆栈,进行中缀转后缀,以及后续后缀的运算 能输入想要产生的题目数 能输入用户计算的答案 能够比较用户输入的答案是否正确 能够统计用户答题的正确率 二.设计思路 生成一个有加减乘除支持括号的算式,以字符串的形式输出,每个操作数或操作符中间都用

20172327 结对编程项目-四则运算 第二周 阶段总结

20172327 结对编程项目-四则运算 第二周 阶段总结 结对编程项目-四则运算 第二周 输出阶段总结博客 结对对象: 学号:20172317 姓名:蒋子行 伙伴第二周博客地址: 学号:20172320 姓名:李闻洲 伙伴第二周博客地址: 担任角色: 驾驶员:蒋子行 副驾驶:李闻洲 马瑞蕃 小组结对编程的photo: 项目中自己负责的部分: 我在项目中真的没啥贡献,项目主要由祥哥主刀,我和李闻洲就是打杂的. 个人贡献度划分: 我在项目中真的没啥贡献,项目主要由祥哥主刀,我就是打杂的,提点建议和

20175212童皓桢 结对编程项目-四则运算 第一周

20175212童皓桢 结对编程项目-四则运算 第一周 需求分析 实现一个命令行程序,要求自动生成小学四则运算题目(加减乘除) 支持多运算符 测试结果的正确性,用户输入错误时给出正解 统计题目正确率 设计思路 首先要能够按照按人的一般习惯,生成自左向右计算的加减乘除算式. 随机生成多运算符,并随机生成相对应个数的整数 利用eval方法直接计算随机生成的算式的值,并和用户的输入作比较 判断正确率 设计测试类,利用JUnit测试整数的四则运算 UML类图 关键代码 如何生成符合要求格式的运算式 fo

20165227 结对编程项目-四则运算 第一周

20165227 结对编程项目-四则运算 第一周 需求分析 自动生成小学四则运算题目(加.减.乘.除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 统计题目完成数并计算正确率 设计思路 设计一个计算器能够实现简单的+.-.*./运算 通过编程实现多运算符计算.整数运算.真分数运算.判断结果等 进行junit检测 设计一个程序主类,达到生成随机数.题目.并判断正误 测试 UML类图 功能截图 结对感受 因为同为室友,所以结对起来更轻松方便,讨论的时间也更加地充足,对于队

20165214 结队编程项目-四则运算(第二周)

20165214 第一次结队编程项目--四则运算第二周 需求分析 本周的结队编程想要实现一个四则运算系统,它可以自动生成n个计算题(本周不包括分数),其中n由我们输入.每输出一道题目,运行程序的人需要输入相应的答案,直到最后一道题做完.最后,统计正确率.然后,在这个基础上可以进行相应的功能扩展,比如语言支. 设计思路 我需要在上周的基础上对程序进行补充.在题目的生成上,应该再加上括号.÷./ 本周达成: ①能够随机生成n道题目,n由我们输入,最大长度可直接在程序里面修改: ②支持真分数运算: ③

20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目(加.减.乘.除) 需要实现计算结果的输出 将正确的计算结果与用户输入的计算结果进行比较得出最终的正确率 之前编写的程序还有很多问题,这周主要对这些问题进行改进和升级,我们成功实现了这些功能. 设计思路 1. 首先我们需要编写随机生成数字和随机生成符号的代码,把他们编写好后保存 2. 我们需要利用之前编写好的随

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: 需求分析 功能要求 1.自动生成题目 可独立使用(能实现自己编写测试类单独生成题目的功能) 可生成不同等级题目,类似于: 1级题目:2 + 5 =: 10 - 5 = 之类的两个数,一个运算符的题目 2.题目运算(判题) 可独立使用 实现中缀表达式转为后缀表达式并计算 判断用户答题正误,并输出正确结果 3.支持真分数 可独立使用 实现分数算式的