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

     

  • 相关阅读:
    ZJOI2018]历史 做题心得 Flandre
    Codeforces 1495F 搞了一上午的心得 Flandre
    关于JS的跨域通信的几种解决方案 (转)
    我对php框架的理解和看法
    ob_get_contents();ob_end_clean();ob_start();的具体用法
    MySQL性能优化 (转载)
    遇到过的一些php笔试题
    php memcached 安装 install(转载)
    [转]mysql_fetch_row,mysql_fetch_array,mysql_fetch_object,mysql_fetch_assoc的区别
    深度探讨PHP之性能(看到的好文章,就转载啦)
  • 原文地址:https://www.cnblogs.com/suifengye/p/6532833.html
Copyright © 2020-2023  润新知