个人项目:中小学数学卷子自动生成程序
结对编程项目:带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可以进行精确运算,具体的一些使用方法,建议大家去百度查,有很多详细的介绍,结对编程收获很多。