从个人项目到结对编程

馋奶兔 提交于 2019-11-30 16:48:57

个人项目:中小学数学卷子自动生成程序

结对编程项目:UI的小初高数学学习软件

从个人项目到结对编程,可以复用的就只有出题部分,由于个人项目时,出题函数做的并不是很好,好多括号加的没有必要,所以在做结对编程时,对出题函数进行了修改,下面是修改前和修改后的题目比较

 

 接下来进行结对编程的内容,我的搭档负责设计界面和各个界面之间的连接,我负责计算得数等

1.首先将中缀表达式转化为后缀表达式,因为后缀表达式对计算机更友好,方便计算

原理就是:定义一个List用来存后缀表达式,一个栈来存表达式中的操作符,然后遍历字符串:

  1.如果为数字,则直接存进List,如果为(,则直接入栈,

  2.如果为),则将栈中的内容弹出存入List,直到遇到(,然后弹出(,

  3.如果为操作符,如果当前操作符的优先级高于栈顶元素,则直接入栈,否则,弹出栈顶元素到List,知道栈顶元素的优先级低于当前操作符

(PS:优先级的定义为 (最低,其次是"+","-","*","÷",然后是"√","²","sin","cos","tan";)

 

2.接下来,进行运算  public static String operate(String p,Stack<String> v)

由于double有精度问题和计算机中的存储问题,所以我使用BigDecimal类进行精确运算

  1.BigDecimal类的定义  有3种

    BigDecimal num=new BigDecimal(int i);

    BigDecimal num=new BigDecimal(double i);

    BigDecimal num=new BigDecimal(String i);

推荐使用第三种,集体的使用方法可以见百度,下面粘贴一下我写的计算函数的代码

public static String operate(String p,Stack<String> v) 
 {
  String result="";
  if(p.equals("+")||p.equals("-")||p.equals("*")||p.equals("÷"))
  {
   
   BigDecimal v1=new BigDecimal(v.pop());
   BigDecimal v2=new BigDecimal(v.pop());
   char ch=p.charAt(0);
   switch((int)ch)
   {
    case 43://+
     result=v1.add(v2).toString();
     break;
    case 45://-
     result=v2.subtract(v1).toString();
     break;
    case 42://*
     result=v1.multiply(v2).toString();
     break;
    case 247://÷
     result=v2.divide(v1, 20, BigDecimal.ROUND_HALF_UP).toString();
     break; 
    default:
     break;
   }
  
  }
  else
  {
   int v1=Integer.valueOf(v.pop());
   if(p.equals("√"))
    result=Double.toString(Math.sqrt(v1));
   if(p.equals("²"))
    result=new BigDecimal(Integer.toString(v1)).multiply(new BigDecimal(Integer.toString(v1))).toString();
   if(p.equals("sin"))
    result=Double.toString(Math.sin(v1));
   if(p.equals("cos"))
    result=Double.toString(Math.cos(v1));
   if(p.equals("tan"))
    result=Double.toString(Math.tan(v1));
  }
  return result;
 }

3.有了计算函数之后我们就可以由后缀表达式计算出答案了,原理是:

  1.新建一个栈,用来存储后缀表达式中的数字,

  2.遍历后缀表达式,如果是数字则直接压栈

  3.如果为操作符,则传操作符和栈到计算函数,然后把计算结果压栈。

到此,我的工作基本完成。

4.总结:编程时,遇到的第一个问题就是中缀表达式如何转化为后缀表达式,我当时是问了度娘,但是我没有将代码下载下来进行验证,然后就发生了很多波折,中缀表达式如法正确转化成后缀表达式,原因是 有很多if else,逻辑出现了问题,后面自己根据原理重新写了,经过调试、修改成功了,建议大家以后不要直接从网上copy,一定要进行验证;另一个问题就是浮点数,由于计算机中存储浮点数的方式,对计算结果会产生很大的误差,后面查资料BigDecimal可以进行精确运算,具体的一些使用方法,建议大家去百度查,有很多详细的介绍,结对编程收获很多。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!