软件工程概论-个人作业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

看书

《构建之法》

优质内容筛选与推荐>>
1、《coredump问题原理探究》Linuxx86版5.2节C风格数据结构内存布局之基本数据类型
2、HTML学习记录及整理
3、AI工程师职业指南|《程序员》11月精彩内容
4、后端开源软件集合
5、《coredump问题原理探究》Linuxx86版5.1节C风格数据结构内存布局之引言


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号