软件工程概论-个人作业03

一、要求:

  四则运算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;
    }
}

四、结果截图:

 

 五、项目计划日志

任务

日期

上课

编程序

看书

日总计

周一

1.5h

0.5h

0.5h

2.5h

周二

 

 

 

 

周三

 

4h

 

4h

周四

 

2h

 

2h

周五

 

 

1h

1h

周总计

1.5h

6.5h

1.5h

9.5

六、时间记录

日期

开始时间

结束时间

学习时间

活动

备注

3.6

16:00

17:30

1.5h

上课

软件工程概论

3.6

17:30

18:00

0.5h

编程

四则运算2

3.6

19:00

19:30

0.5h

看书

《构建之法》

3.8

17:00

21:00

4h

编程

四则运算2

3.9

18:00

20:00

2h

编程

四则运算2

3.10

18:30

19:30

1h

看书

《构建之法》

转载于:https://www.cnblogs.com/yifengyifeng/p/6530169.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值