小皇帝闹闹

课堂结队作业:二维数组(2)

结队成员:陈欣容,孙奇文

一、要求:

  四则运算2,可控制下列参数:

  是否有乘除法; 是否有括号(最多可以支持十个数参与计算); 数值范围; 加减有无负数。

二、思路:

  1.存储结构:构建一个表达式类,私有属性为一个字符串数组,即将一个表达式拆成若干字符串,每个操作数和操作符都视为一个字符串。若需生成多个表达式则用类创建一个对象数组。

  2.生成一个表达式的实现过程:

    1)随机生成一个2-10的整数number表示操作数的数量;

    2)随机选择该表达式操作数全为整数或全为分数;

    3)若全为整数则判断是否要出现负数(用户输入控制),然后随机生成number个操作数,若操作数为分数则会生成一个分数字符串,格式为:“[a/b]” ,负数格式为“[-4]”;

    4)判断是否有乘除法(输入控制),若有则随机生成number-1个含有+-*÷的操作符,若无则只有+-两种操作符;

    5)用表达式类创建对象,将上述生成的操作数及操作符合成一个完整的表达式如 “9*5+6÷3=”;

    6)若用户输入有括号(即ifKuoHao参数为1),则根据表达式字符串数组的长度随机出两个位置填入一对括号,如 “9*5+6÷3=”这个表达式,该字符串数组长度为8,则随机生成整数k,范围是0-7,再判断k/2的值是否为偶数,若不为偶数则将k/2+1即为表达式数组插入右括号的位置(因为操作数的位置下标为偶数,如6的下标为4),例如,就上述表达式而言,若生成的k值为7,7/2=3,3+1=4,所以生成右括号的位置为4,即在“6”和“÷”之间添加右括号,再在k-3的位置后添加左括号,所以最终表达式为“9*(5+6)÷3=”;

    7)若ifKuoHao参数为2,则在第5)步结束。

三、源代码:

 

import java.util.*;public class MathHomeWork2 {

    public static int choose,from,to,operNum,ifFuShu,number,ifKuoHao,ifChengChu;

    public static int randomArr[]=new int[10];

    public static Random ran=new Random();

    public static char randomCh[]={'+','-','*','÷'};

    public static Formular formu[];

    @SuppressWarnings({  "resource" })

    public static void main(String[] args){

        Scanner in=new Scanner(System.in);

        System.out.println("题目个数:");

        number=in.nextInt();

        System.out.println("数字范围(从小到大输入两个正整数):");

        from=in.nextInt();

        to=in.nextInt();

        System.out.println("是否有乘除法(1有2无):");

        ifChengChu=in.nextInt();

        System.out.println("是否有括号(1有2无):");

        ifKuoHao=in.nextInt();

        System.out.println("是否有负数(1有2无):");

        ifFuShu=in.nextInt();

        formu=new Formular[number];

        for(int i=0;i<number;i++){

            formu[i]=new Formular();

            choose=ran.nextInt(2)+1;

            operNum=ran.nextInt(9)+2;

            formu[i]=creaFormula(choose,operNum,ifChengChu,ifKuoHao);

            if(formu[i]==null)

                i--;

        }

        showFormulas(formu);

    }

    //生成分数

    public static String creaFenShu(){

        int a=0,b=0;

        while(a>=b){

            a=randomNum(from,to,2);

            b=randomNum(from,to,2);

        }

        int fenshu[]={a,b};

        fun1(fenshu);

        String s="["+a+"/"+b+"]";

        return s;

    }

    //生成表达式

    public static Formular creaFormula(int choose,int nums,int ifChengChu,int ifKuoHao){

        Formular formu=new Formular();

        char operator[]=new char[nums-1];

        if(ifChengChu==1){

            for(int i=0;i<operator.length;i++){

                int n=ran.nextInt(4);

                operator[i]=randomCh[n];

            }

        }

        else{

            for(int i=0;i<operator.length;i++){

                int n=ran.nextInt(2);

                operator[i]=randomCh[n];

            }

        }

 

        if(choose==1){

            for(int i=0;i<nums;i++){

                randomArr[i]=randomNum(from,to,ifFuShu);

            }

            for(int i=0;i<nums-1;i++){

                formu.push(""+randomArr[i]);

                formu.push(""+operator[i]);

            }

            formu.push(""+randomArr[nums-1]);

            formu.push("=");

            

 

        }

        else if(choose==2){

            String fenshu[]=new String[nums];

            for(int i=0;i<nums;i++){

                fenshu[i]=creaFenShu();

            }

            for(int i=0;i<nums-1;i++){

                formu.push(""+fenshu[i]);

                formu.push(""+operator[i]);

            }

            formu.push(""+fenshu[nums-1]);

            formu.push("=");

        }

        else

            return null;

        if(ifKuoHao==1){

            int k=ran.nextInt(2*nums);

            k/=2;

            if(k%2!=0) k++;

            formu.insert(k+3,")");

            formu.insert(k,"(");

        }

        //处理表达式,给负数加括号

        for(int i=0;i<formu.size();i++){

            String s=formu.get(i);

            if(s.indexOf('-')!=-1&&s.length()>1){

                s="["+s+"]";

            }

            formu.set(i,s);

        }

        return formu;

        

    }

    //打印表达式

    public static void showFormulas(Formular f[]){

        int len=f.length;

        for(int i=0;i<len;i++){

            System.out.print("No."+(i+1)+": ");

            f[i].show();

            System.out.print("\n");

        }

    }

    //约分函数

    public static void fun1(int x[]){

        

        int k=fun2(x[0],x[1]);

        x[0]=x[0]/k;

        x[1]=x[1]/k;

    }

    //求分子分母最大公约数

    public static int fun2(int x,int y){

        int min,i;

        if(x>y) min=x;

        else

            min=y;

        for(i=min;i>=1;i--){

            if(x%i==0&&y%i==0){

                break;

            }

        }

        return i;

    }

    //范围生成随机数

    public static int randomNum(int fromA,int toB,int ifFuShu){

        int x=ran.nextInt(toB)+fromA+1;

        if(ifFuShu==1){

            boolean ifFushu=ran.nextBoolean();

            if(ifFushu)

                x=x-2*x;

        }

        return x;

    }

}

class Formular{

    private Vector<String> formular;

    public Formular(){

        formular=new Vector<String>();

    }

    public void push(String x){

        formular.addElement(x);

    }

    public String get(int i){

        if(formular!=null&&i>=0&&i<formular.size()){

            return formular.get(i);

        }

        else return null;

    }

    public void set(int i,String x){

        if(formular!=null&&i>=0&&i<formular.size()){

            formular.set(i,x);

        }

        else return;

    }

    public void insert(int i,String x){

        if(formular!=null&&i>=0&&i<formular.size()){

            formular.insertElementAt(x,i);

        }

        else return;

    }

    public void add(int i,String x){

        if(formular!=null&&i>=0&&i<formular.size()){

            formular.add(i,x);

        }

        else return ;

    }

    public void delete(int i){

        if(formular!=null&&i>=0&&i<formular.size()){

            formular.removeElementAt(i);

        }

        else return ;

    }

    public void show(){

        for(int i=0;i<formular.size();i++){

            System.out.print(formular.get(i));

        }

    }

    public int size(){

        if(formular!=null)

            return formular.size();

        else return -1;

    }

}

posted on 2017-04-09 17:09  小皇帝闹闹  阅读(127)  评论(0编辑  收藏  举报

导航