首页 > 代码库 > 个人作业1——四则运算题目生成程序(基于控制台)

个人作业1——四则运算题目生成程序(基于控制台)

个人码云地址:HuanWong

a.需求分析:

      出一次小学四则运算的试题对于大多数家长来说都是个简单的小事情,但是如果每天都需要重复同样的小事显得太过繁琐,浪费时间。所以,有必要设计一个小程序帮助家长减轻负担同时又能让孩子得到锻炼。

b.功能设计:

      按题目要求,同时考虑是实际,程序应具备以下功能:

    1. 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
    2. 运算符为 +, ?, ×, ÷
    3. 并且要求能处理用户的输入,并判断对错,打分统计正确率。
    4. 要求能处理用户输入的真分数, 如 1/2, 5/12 等
    5. 可以自定义题目数量

c.设计实现:

      考虑到小学生的知识水平,整数运算部分可以随机生成来两个0~100的数字来随机进行四则运算。对于真分数,需要用一个createFraction方法来随机生成两整数当做分子分母,为保证分数为真,应判断大为分子且排除分子为零且两数相等导致值为1的情况。用GCD方法与CLM方法求两数最大公约数与最小公倍数,GCD利用辗转相除法求两数最大公约数,LCM利用“最大公约数*最小公倍数=两数乘积”的关系求得最小公倍数。分数的四则运算遵守分数运算规则利用最大公约数与最小公倍数进行转换化简。为检验各题答案,计算结果转换为字符串存储,按习惯,整数除法依据四舍五入保留两位小数。

      考虑到计算难度,每次整数运算与分数运算题比例为2:1,最终计分为一题一分,并对错题进行标记显示。

d.代码说明:

 1.createFraction方法:

public static int[] createFraction(){                                       //生成两数构造一个真分数,数组中第一个数为分子
        int[] num=new int[2];
        int num1 = (int)(Math.random()*100+1);
        int num2 = (int)(Math.random()*100+1);                              //避免分母出现零(待改进)
        if(num1!=num2){
            if(num1<num2) {                                                 //避免出现构造住的分数值为1 
                num[0]=num1; num[1]=num2;  return num;
            }else{
                num[0]=num2; num[1]=num1;  return num;
            }
        }else  
            createFraction();                                                //若不满足条件递归调用方法
        return num;
        
    }

2.GCD与LCM方法:

public static int GCD(int m, int n) {     //辗转相除法求最大公约数
        while (true) {
        if ((m = m % n) == 0)
        return n;
        if ((n = n % m) == 0)
        return m;
        }
        }
    
    public static int LCM(int m, int n){
        return m*n/GCD(m,n);             //最大公约数*最小公倍数=两数乘积 求最小公倍数   
    }

3.主函数:

技术分享
    public static void main(String[] args){
        ArrayList<String>List=new ArrayList<String>();//题目存储
        ArrayList<String>Answers=new ArrayList<String>();//参考答案存储
        System.out.println("请输入想要的题目数量:");                         //提示需求数量
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = n/3;                                                        //分数题型题量占三分之一
        int num1;
        int num2;
        for(int i=0;i<(n-m);i++){                                           //开始随机出整数题型
            
             num1 = (int)(Math.random()*100);
             num2 = (int)(Math.random()*100);                              //随机生成两数
            if(num2!=0){                                                   //排除0对除法造成影响(待改进)
                int op = (int)(Math.random()*4+1);                       //随机决定运算类型,1234对应加减乘除
                if(op==1){ 
                    List.add(num1+"+"+num2+"= ");
                    Answers.add(num1+num2+"");
                }
                if(op==2){ 
                    if(num1>num2){                                      //小学生知识有限,避免出现负数结果
                    List.add(num1+"-"+num2+"= ");
                    Answers.add(num1-num2+"");
                    } else{
                        List.add(num2+"-"+num1+"= ");
                        Answers.add(num2-num1+"");
                    }
                }
                if(op==3){ 
                    List.add(num1+"×"+num2+"= ");
                    Answers.add(num1*num2+"");
                }
                if(op==4){ 
                    List.add(num1+"÷"+num2+"= ");
                    BigDecimal  a = new BigDecimal((float)num1/num2);  
                      float ans = a.setScale(2,BigDecimal.ROUND_HALF_UP).floatValue();  //保留两位,四舍五入
                    Answers.add(ans+"");
                }
            }else{                                                                      //出现0不做除法(待改进)
                int op = (int)(Math.random()*3+1);
                if(op==1){ 
                    List.add(num1+"+"+num2+"= ");
                    Answers.add(num1+num2+"");
                }
                if(op==2){ 
                    if(num1>num2){                        //避免出现负数结果
                    List.add(num1+"-"+num2+"= ");
                    Answers.add(num1-num2+"");
                    } else{
                        List.add(num2+"-"+num1+"= ");
                        Answers.add(num2-num1+"");
                    }
                }
                if(op==3){ 
                    List.add(num1+"×"+num2+"= ");
                    Answers.add(num1*num2+"");
                }
            }
        
    }
        
        for(int j=0;j<m;j++){
            int[] fa1=createFraction();
            int[] fa2=createFraction();
            int gbs=LCM(fa1[1],fa2[1]);
            if(fa2[0]!=0){
                int op = (int)(Math.random()*4+1);
                if(op==1){ 
                    List.add("("+fa1[0]+"/"+fa1[1]+")+("+fa2[0]+"/"+fa2[1]+")= ");
                    
                    int sum=gbs/fa1[1]*fa1[0] + (gbs/fa2[1]*fa2[0]);
                    int gys1=GCD(sum,gbs);
                    Answers.add(sum/gys1+"/"+gbs/gys1+"");//化简结果并存储
                }
                if(op==2){ 
                    if( fa1[0]/fa1[1] > fa2[0]/fa2[1] ){                        //避免出现负数结果
                    List.add("("+fa1[0]+"/"+fa1[1]+")-("+fa2[0]+"/"+fa2[1]+")= ");
                    
                    int cha=gbs/fa1[1]*fa1[0] - (gbs/fa2[1]*fa2[0]);
                    int gys2=GCD(cha,gbs);
                    Answers.add(cha/gys2+"/"+gbs/gys2+"");
                    } else{
                        List.add("("+fa2[0]+"/"+fa2[1]+")+("+fa1[0]+"/"+fa1[1]+")= ");
                        int cha=gbs/fa2[1]*fa2[0] - (gbs/fa1[1]*fa1[0]);
                        int gys2=GCD(cha,gbs);
                        Answers.add(cha/gys2+"/"+gbs/gys2+"");
                    }
                }
                if(op==3){ 
                    List.add("("+fa1[0]+"/"+fa1[1]+")×("+fa2[0]+"/"+fa2[1]+")= ");
                    int a =fa1[0]*fa2[0]; int b = fa1[1]*fa2[1];
                    int gys3 = GCD(a,b);
                    Answers.add(a/gys3+"/"+b/gys3+"");
                }
                if(op==4){ 
                    List.add("("+fa1[0]+"/"+fa1[1]+")÷("+fa2[0]+"/"+fa2[1]+")= ");
                    int c =fa1[0]*fa2[1]; int d = fa2[0]*fa1[1];    //转化为乘法
                    int gys4 = GCD(c,d);
                    Answers.add(c/gys4+"/"+d/gys4+"");
                }
            }else{
                    int op = (int)(Math.random()*3+1);
                    if(op==1){ 
                        List.add("("+fa1[0]+"/"+fa1[1]+")+("+fa2[0]+"/"+fa2[1]+")= ");
                        
                        int sum=gbs/fa1[1]*fa1[0] + (gbs/fa2[1]*fa2[0]);
                        int gys1=GCD(sum,gbs);
                        Answers.add(sum/gys1+"/"+gbs/gys1+"");
                    }
                    if(op==2){ 
                        if( fa1[0]/fa1[1] > fa2[0]/fa2[1] ){                        //避免出现负数结果
                        List.add("("+fa1[0]+"/"+fa1[1]+")-("+fa2[0]+"/"+fa2[1]+")= ");
                        
                        int cha=gbs/fa1[1]*fa1[0] - (gbs/fa2[1]*fa2[0]);
                        int gys2=GCD(cha,gbs);
                        Answers.add(cha/gys2+"/"+gbs/gys2+"");
                        } else{
                            List.add("("+fa2[0]+"/"+fa2[1]+")+("+fa1[0]+"/"+fa1[1]+")= ");
                            int cha=gbs/fa2[1]*fa2[0] - (gbs/fa1[1]*fa1[0]);
                            int gys2=GCD(cha,gbs);
                            Answers.add(cha/gys2+"/"+gbs/gys2+"");
                        }
                    }
                    if(op==3){ 
                        List.add("("+fa1[0]+"/"+fa1[1]+")×("+fa2[0]+"/"+fa2[1]+")= ");
                        int a =fa1[0]*fa2[0]; int b = fa1[1]*fa2[1];
                        int gys3 = GCD(a,b);
                        Answers.add(a/gys3+"/"+b/gys3+"");
                    }
                    
                    }
                }
        int qnum=0;
        int count=0;
        for (String string : List) {                   //打印题目
            qnum++; count++;
            if(count>3) {
                System.out.println();
                count=1;
            } 
            System.out.print("["+qnum+"] "+string+"\t\t");
        }
        System.out.println();
        Scanner ans = new Scanner(System.in);
        ArrayList<String>anslist=new ArrayList<>();
        String str="";
        System.out.println("请输入答案,除法结果请保留两位小数,输入“ok”结束:");
        while(!str.equals("ok")){
            str=ans.nextLine();
            anslist.add(str);
        }
        int correct=0;

        int t=0;
        System.out.println("[题号] 参考答案 \t 提交结果");
        System.out.println();
        for (int x=0;x<Answers.size();x++) {                    //检验答案并统计
            if(Answers.get(x).equals(anslist.get(x))){
                correct++;
                t=x+1;
                System.out.println("["+t+"] "+" \t "+Answers.get(x)+" \t "+" \t "+anslist.get(x));
            }else
            {

                t=x+1;
                System.err.println("["+t+"]"+" \t "+Answers.get(x)+" \t "+" \t "+anslist.get(x)+"    !!!!");
            }
    }
        System.out.println("本次练习统计:");
        System.out.println("得分:"+correct+"    共"+n+"分,正确率: "+(float)correct/n*100+"%, 带!!!!为答错的题目。");
}
main

e.测试运行:

技术分享

f.PSP

PSP2.1 Personal Software Process Stages Time  Senior Student Time 
Planning 计划 30min 20min
· Estimate 估计这个任务需要多少时间 5h 7h
Development 开发 --- ---
· Analysis 需求分析 (包括学习新技术) 5min 8min
· Design Spec 生成设计文档 6min 6min
· Design Review 设计复审 8min 8min
· Coding Standard 代码规范 --- ---
· Design 具体设计 40min 30min
· Coding 具体编码 3h 3.5h
· Code Review 代码复审 15min 15min
· Test 测试(自我测试,修改代码,提交修改) 30min 30min
Reporting 报告 2h 1.5h
· 测试报告 30min 30min
· 计算工作量 5min 8min
· 并提出过程改进计划 8min 12min

h.小结:

       对于编程缺少练习导致花费了很多的时间在重新了解代码上,这是很不应该的。程序中的有些地方处理的不是太合理,还有好多改进的空间。程序虽小,但结构还是不够明晰,逻辑不是太清楚,这可能会造成阅读困难,在以后开发中要注意在设计阶段中就理清条理

个人作业1——四则运算题目生成程序(基于控制台)