zoukankan      html  css  js  c++  java
  • 课堂结队作业:二维数组(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(" ");

            }

        }

        //约分函数

        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;

        }

    }

  • 相关阅读:
    38、面向对象设计模式之策略模式(Strategy)
    37、面向对象设计模式之代理模式(Proxy)
    36、面向对象设计模式之观察者模式(Observer)
    35、面向对象设计模式之抽象工厂(Abstract Factory)设计模式
    34、面向对象设计模式之工厂模式——简单工厂模式与工厂方法模式比较
    Chisel插件
    Git 常用命令
    oh_my_zsh
    一般xcode报错
    sqlite3 语法
  • 原文地址:https://www.cnblogs.com/cxr0711/p/6945954.html
Copyright © 2011-2022 走看看