java-四则运算,自动出题(3)

老师对自动出题的系统又有了新的功能:

其中有一个要求是 是否有括号:最多可支持十个数参与计算

现在提供实验思路和部分代码:

  实验思路:( 以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),而且暂时没有加上总体的实验要求,只实现了部分的功能,还需要继续改进,唯一的作用是提供一个思路。还有另外一种栈的储存方式,认为这个思路不好的还可以考虑用栈的方式进行实验代码的构写。

 

原文地址:https://www.cnblogs.com/suifengye/p/6532833.html