标签:-- image 这一 src jpg 实验代码 ima 优先级 .com
老师对自动出题的系统又有了新的功能:
其中有一个要求是 是否有括号:最多可支持十个数参与计算
我只实现了这一部分的功能,还并未同其他的功能整合到一起,代码还需改进,但我的思路和实现的代码无太大问题,本周末我会将代码进行完善。
现在只提供实验思路和部分代码:
实验思路:( 以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[][]n; //结果设置成int型的 static int[]S; //记录用算过程的数组 static int[]s; //运算符的选择 static String[]r1={"+","-","*","÷"}; //运算符的存储 static String[]R; //括号的存储 static char[]r2={‘(‘,‘)‘}; static char[]r3; public static void main(String[] args) { //随机生成数组 int sum1=5; //式子的参数个数 int sum2=10;//式子的个数 n=new int[sum2][sum1]; S=new int[sum2]; s=new int[sum1]; R=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++) { n[i][j]=(int)(1+Math.random()*100); } } for(int i=0;i<sum2;i++) { int number=0; int num2=2 + 2*(int)(Math.random()*(sum2-6)/2);//2 4 6 int num3=num2 +3 + 2*(int)(Math.random()*(sum2-2-num2)/2);//5 7 9 r3[num2]=‘(‘; r3[num3]=‘)‘; int jishu=0; for(int j=0;j<sum1;j++) { int num=(int)(0 + Math.random()*4); R[j]=new String(r1[num]); System.out.print(r3[jishu]); jishu++; System.out.print(n[i][j]); System.out.print(r3[jishu]); jishu++; if(j<sum1-1) { System.out.print(R[j]); } else System.out.print("="); } //括号内的算法 num2=num2/2;//左括号的位置 num3=num3/2;//右括号的位置 //num2=num3时 括号消掉 while(num2<num3) { m=sum1-1; for(int k=num2;k<num3;k++) { if(R[k].equals("*")) { number=n[i][k]*n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; } else if(R[k].equals("÷")) { number=n[i][k]/n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; } } //括号的加减法 for(int k=num2;k<num3;k++) { if(R[k].equals("+")) { number=n[i][k]+n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[i][j1+2]; } R[m-1]="+"; m--; k--; num3--; } else if(R[k].equals("-")) { number=n[i][k]-n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[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=n[i][k]*n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[i][j1+2]; } R[m-1]="+"; m--; k--; } else if(R[k].equals("÷")) { number=n[i][k]/n[i][k+1]; n[i][k]=number; //System.out.print(number+" "); for(int j1=k;j1<m-1;j1++) { R[j1]=R[j1+1]; n[i][j1+1]=n[i][j1+2]; } R[m-1]="+"; m--; k--; } } //加减法 for(int k=0;k<m;k++) { if(R[k].equals("+")) { number=n[i][k]+n[i][k+1]; n[i][k+1]=number; } else if(R[k].equals("-")) { number=n[i][k]-n[i][k+1]; n[i][k+1]=number; } //System.out.print(number+" "); } System.out.print(number); System.out.println(); //清空括号 for(int i1=0;i1<sum1*2;i1++) { r3[i1]=‘ ‘; } //计算结果 } } }
实验结果截图:
实验总结:
完成了多项式任意加减乘除加括号的试验任务,但是完成的过程中进行了长时间的思路的总结和结果测试,现在的程序结果代码还有各种瑕疵(bug),而且暂时没有加上总体的实验要求,只实现了部分的功能,还需要继续改进,唯一的作用是提供一个思路。还有另外一种栈的储存方式,认为这个思路不好的还可以考虑用栈的方式进行实验代码的构写。
标签:-- image 这一 src jpg 实验代码 ima 优先级 .com
原文地址:http://www.cnblogs.com/suifengye/p/6532833.html