老师对自动出题的系统又有了新的功能:
其中有一个要求是 是否有括号:最多可支持十个数参与计算
现在提供实验思路和部分代码:
实验思路:( 以1+(2+3*4)/5为例)
1.先实现正常的多项式运算,忽略括号的作用 1+2+3*4/5,按着运算符的优先级,先判断运算符是否为*或者/,先进行乘除运算,每次运算后重新储存运算式(例如第一次储存为:1+2+12/5),再判断运算符是否为+或者-,再进行加减运算,再储存运算式。
2.先记录括号的位置,在括号里进行运算的循环,按照正常的计算顺序,先计算乘除,再计算加减,计算为乘除后,重新储存运算式,储存为1+(2+12)/5,然后进行第三次运算,储存为1+(14)/5,当()在数字的左右时,跳出括号内的循环。跳出循环后重新进行普通的多项式运算。
过程概述为,算一次储存一次运算式:
1+(2+3*4)/5 —》 1+(2+12)/5 —》 1+14/5 —》 1+2 —》 3
下面是实现多项式加括号的计算实验代码:
package sum2; import java.util.Scanner; //由于先前的实验固定了数据的个数,然而根据第二次试验的要求需要重新进行修改 //所以决定重新建立一个新的项目 //时间:2017 3 8 //随风的叶子 //加减乘除程序代码 public class sum2 { //记录运算符个数 static int m; //建立动态数组:操作数 static int[][]n1; //设置成运算式:数据源 static int[][]n2; //结果设置成int型的 static int[]S; //记录用算过程的数组 static int[]s; //运算符的选择 static String[]r1={"+","-","*","÷"}; //运算符的操作:操作符 static String[]R; //运算符的存储:数据源 static String[]R1; //括号的存储 static char[]r2={'(',')'}; static char[]r3; public static void main(String[] args) { //随机生成数组 System.out.println("功能1:请输入定制数量:"); Scanner scan1=new Scanner(System.in); int sum2=scan1.nextInt(); System.out.println("功能2:请输入操作数个数:"); Scanner scan2=new Scanner(System.in); int sum1=scan2.nextInt(); System.out.println("功能3:是否需要括号:0 是 1否"); Scanner scan3=new Scanner(System.in); int sum3=scan3.nextInt(); n1=new int[sum2][sum1]; n2=new int[sum2][sum1]; S=new int[sum2]; s=new int[sum1]; R=new String[sum1]; R1=new String[sum1]; r3=new char[sum1*2]; for(int i=0;i<sum1*2;i++) { r3[i]=' '; } for(int i=0;i<sum2;i++) { for(int j=0;j<sum1;j++) { n1[i][j]=(int)(1+Math.random()*100); n2[i][j]=n1[i][j]; } } for(int i=0;i<sum2;i++) { int number=0; int num2=0; int num3=0; if(sum3==0) { num2=2 + 2*(int)(Math.random()*(sum1*2-6)/2);//2 4 6 num3=num2 +3 + 2*(int)(Math.random()*(sum1*2-2-num2)/2);//5 7 9 r3[num2]='('; r3[num3]=')'; } int jishu=0; //设置运算符 for(int j1=0;j1<sum1;j1++) { int num=(int)(0 + Math.random()*4); //运算符的设置 R[j1]=new String(r1[num]); R1[j1]=new String(r1[num]); } //括号内的算法 num2=num2/2;//左括号的位置 num3=num3/2;//右括号的位置 m=sum1-1; //num2=num3时 括号消掉 while(num2<num3) { //括号的乘除法 for(int k=num2;k<num3;k++) { if(R[k].equals("*")) { number=n1[i][k]*n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; }//乘法截至 else if(R[k].equals("÷")) { number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; //处理括号内除数为0的情况 if(number==0) { if(R[k-1].equals("÷")) { n1[i][k+1]=n2[i][k]; n2[i][k+1]=n1[i][k+1]; number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; } } //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; }//除法截至 }//乘除循环截至 //括号的加减法 for(int k=num2;k<num3;k++) { if(R[k].equals("+")) { number=n1[i][k]+n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; }//加法截至 else if(R[k].equals("-")) { number=n1[i][k]-n1[i][k+1]; n1[i][k]=number; //处理括号内减法为0的情况 if(number==0) { if(R[k-1].equals("÷")) { n1[i][k+1]=n2[i][k]+(int)(1+Math.random()*5); n2[i][k+1]=n1[i][k+1]; number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; } } //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; }//减法截止 //System.out.print(number+" "); }//加减循环止 }//括号内算法循环止 //乘除法的运算 for(int k=0;k<sum1-1;k++) { //如果加入乘法 //进行插入 if(R[k].equals("*")) { number=n1[i][k]*n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; } else if(R[k].equals("÷")) { number=n1[i][k]/n1[i][k+1]; n1[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n1[i][j1+1]=n1[i][j1+2]; } R[m-1]="+"; m--; k--; } } //加减法的运算 for(int k=0;k<m;k++) { if(R[k].equals("+")) { number=n1[i][k]+n1[i][k+1]; n1[i][k+1]=number; } else if(R[k].equals("-")) { number=n1[i][k]-n1[i][k+1]; n1[i][k+1]=number; } //System.out.print(number+" "); } //运算式的输出 for(int j=0;j<sum1;j++) { System.out.print(r3[jishu]); jishu++; System.out.print(n2[i][j]); System.out.print(r3[jishu]); jishu++; if(j<sum1-1) { System.out.print(R1[j]); } else System.out.print("="); } //输出结果 System.out.print(number); System.out.println(); //清空括号 for(int i1=0;i1<sum1*2;i1++) { r3[i1]=' '; } }//一行运算截至 }//main }//class
实验结果截图:
实验总结:
完成了多项式任意加减乘除加括号的试验任务,但是完成的过程中进行了长时间的思路的总结和结果测试,现在的程序结果代码还有各种瑕疵(bug),而且暂时没有加上总体的实验要求,只实现了部分的功能,还需要继续改进,唯一的作用是提供一个思路。还有另外一种栈的储存方式,认为这个思路不好的还可以考虑用栈的方式进行实验代码的构写。