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

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

小组成员

  • 20172313 余坤澎
  • 20172332 于欣月
  • 20172326 康皓越

小组编程照片

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

设计思路

  1. 通过一个Element和Num类来作为基本元素获得表达式
  2. 通过一个Expression来将各个元素组合起来
  3. 通过Cal将表达式计算出来
  4. 通过用户类将结果计算出来,并判断其正负

重要代码

 public void getNum() {
Random num = new Random();
numerator = num.nextInt(9);//分子
denominator = num.nextInt(9)+1;//分母
if (denominator == 1 && numerator != 0)//分母为1,结果为分子。
number = numerator + "";
else if (numerator == 0)//分子为0,结果为分母。
number = denominator + "";
else if (denominator == numerator )
number = 1 + "";
else {
reduce();//约分
if (numerator < denominator)//约分后分子小于分母
number = " ( "+ numerator + "/" + denominator+" ) ";
else if (numerator > denominator)//约分后分子大于分母,交换分子分母
number = " ( "+denominator + "/" + numerator+" ) ";
}
}
//约分的方法
private int gcd(int num1,int num2)
{
while (num1 !=num2) {
if (num1 > num2)
num1 = num1 - num2;
else
num2 = num2 - num1;
} return num1;
}
private void reduce()
{
if (numerator !=0)
{
int common = gcd(Math.abs(numerator),denominator); numerator = numerator/common;
denominator = denominator/common;
}
}

本段为生成分数以及通分,提取公约数

 Random a = new Random();
//是否有括号
int or = a.nextInt(2);
//无括号
if (or == 0) {

通过随机数来判断表达式中是否有括号0为没有,1为有。

 for (int index = 0; index <= times; index++) {
int c = time.nextInt(4);
Elements q = new Elements();
//开始生成表达式
if (c == 0) {
num.getNum();
q.add();
result += num.toString() + q;
count1++;
}
if (c == 1) {
num.getNum();
q.sub();
result += num.toString() + q;
count1++;
}
if (c == 2) {
num.getNum();
q.mul();
result += num.toString() + q;
count2++;
}
if (c == 3) {
num.getNum();
q.div();
result += num.toString() + q;
count2++;
}

通过0,1,2,3来选择加减乘除

public List<String> work(String str){
List<String> list = new ArrayList<String>();
char c;
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
c = str.charAt(i);
if(isDigit(c)){
sb.append(c); }
if(isOp(c)){
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
list.add(c+"");
}
}
if(sb.toString().length()>0){
list.add(sb.toString());
sb.delete(0, sb.toString().length());
}
return list;
}
public void printList(List<String> list){
for(String o:list){
System.out.print(o+" ");
}
}

将生成的表达式数字与符号分别存入数组与栈中

   if(s.equals("+")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2+a1;
stack.push(v);
}else if(s.equals("-")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2-a1;
stack.push(v);
}else if(s.equals("*")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2*a1;
stack.push(v);
}else if(s.equals("/")||s.equals("÷")){
double a1 = (double) stack.pop();
double a2 = (double) stack.pop();
double v = a2/a1;
stack.push(v);

表达式的计算,包含了优先级的选择,以及栈操作使得计算得以使用。

项目链接

小组结对博客

于欣月同学

余坤澎

代码贡献度

余坤澎 于欣月 康皓越
个人贡献度 30% 40% 30%

遇到的困难及解决方法

  1. 运算符的生成问题,一开始时打算使用随机数来表示输出,但是后续的括号无法进行合并,遂放弃。解决方法:将所有符号改为单个方法,例如,加方法只有加号。而值得说的是括号方法有两个,一个左一个右。
  2. 表达式类中的第三等级,因为同样是使用随机数来决定各个加减乘除运算的位置以及个数,但是会出现只有加减或者只有乘除的情况。解决方法:运用一个int型的count变量来监控加减或乘除,如果没有,自动生成相应的缺失运算。
  3. 优先级的问题,是继续在element方法中定义还是怎样?解决方法:直接在cal中计算前,也就是进栈时,规定谁优先。

文件扩展

  1. 判断正确率
  2. 将生成的题目用IO流输入一个文件,生成一个题库
上一篇:20172325『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结


下一篇:通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象