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

个人码云地址:HuanWong

a.需求分析:

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

b.功能设计:

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

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

c.设计实现:

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

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

d.代码说明:

 1.Fraction类

public class Fraction {

public static int[] createFraction(){
int[] num=new int[2];
int num1 = (int)(Math.random()*100);
int num2 = (int)(Math.random()*100);
if(num1!=num2){
if(num1<num2) {
num[0]=num1; num[1]=num2; return num;
}else{
num[0]=num2; num[1]=num1; return num;
}
}else
createFraction();
return num;

}

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);
}


}

 

2.整数题生成:

public class CreateIntQuestion {

public static String CreateQuestion(){

int num1;
int num2;
num1 = (int)(Math.random()*100);
num2 = (int)(Math.random()*100); //随机生成两数
int op = (int)(Math.random()*4+1); //随机决定运算类型,1234对应加减乘除
if(op==1){
System.out.print(num1+"+"+num2+"= "+"\t\t");
return num1+num2+"";
}
if(op==2){
if(num1>num2){ //小学生知识有限,避免出现负数结果
System.out.print(num1+"-"+num2+"= "+"\t\t");
return num1-num2+"";
} else{
System.out.print(num2+"-"+num1+"= ");
return num2-num1+"";
}
}
if(op==3){
System.out.print(num1+"×"+num2+"= "+"\t\t");
return num1*num2+"";
}
if(op==4){
if(num2==0){ //除数为0重新出题
CreateQuestion();
}else{
System.out.print(num1+"÷"+num2+"= "+"\t\t");
BigDecimal a = new BigDecimal((float)num1/num2);
float ans = a.setScale(2,BigDecimal.ROUND_HALF_UP).floatValue(); //保留两位,四舍五入
return ans+"";
}
}

return "";
}

3.分数题生成:

public class CreateFracQuestion {

    public static String CreateFQuestion(){
        
       int[] fa1=Fraction.createFraction();
       int[] fa2=Fraction.createFraction();
       int gbs=Fraction.LCM(fa1[1],fa2[1]);
    
        int op = (int)(Math.random()*4+1);
        if(op==1){ 
            System.out.print("("+fa1[0]+"/"+fa1[1]+")+("+fa2[0]+"/"+fa2[1]+")= "+"\t\t");
            int sum=gbs/fa1[1]*fa1[0] + (gbs/fa2[1]*fa2[0]);
            int gys1=Fraction.GCD(sum,gbs);
            return sum/gys1+"/"+gbs/gys1+"";//化简结果并存储
        }
        if(op==2){ 
            if( fa1[0]/fa1[1] > fa2[0]/fa2[1] ){                        //避免出现负数结果
                System.out.print("("+fa1[0]+"/"+fa1[1]+")-("+fa2[0]+"/"+fa2[1]+")= "+"\t\t");
            int cha=gbs/fa1[1]*fa1[0] - (gbs/fa2[1]*fa2[0]);
            int gys2=Fraction.GCD(cha,gbs);
            return cha/gys2+"/"+gbs/gys2+"";
            } else{
                System.out.print("("+fa2[0]+"/"+fa2[1]+")+("+fa1[0]+"/"+fa1[1]+")= "+"\t\t");
                int cha=gbs/fa2[1]*fa2[0] - (gbs/fa1[1]*fa1[0]);
                int gys2=Fraction.GCD(cha,gbs);
                return cha/gys2+"/"+gbs/gys2+"";
            }
        }
        if(op==3){ 
            System.out.print("("+fa1[0]+"/"+fa1[1]+")×("+fa2[0]+"/"+fa2[1]+")= "+"\t\t");
            int a =fa1[0]*fa2[0]; int b = fa1[1]*fa2[1];
            int gys3 = Fraction.GCD(a,b);
            return a/gys3+"/"+b/gys3+"";
        }
        if(op==4){ 
            if(fa2[0]==0){
                CreateFQuestion();
            }else{
            System.out.print("("+fa1[0]+"/"+fa1[1]+")÷("+fa2[0]+"/"+fa2[1]+")= "+"\t\t");
            int c =fa1[0]*fa2[1]; int d = fa2[0]*fa1[1];    //转化为乘法
            int gys4 = Fraction.GCD(c,d);
            return c/gys4+"/"+d/gys4+"";
            }    
        }
        return "";
    }
}

 

4.主函数:

public static void main(String[] args){
        ArrayList<String>Answers=new ArrayList<String>();//参考答案存储
        System.out.println("请输入想要的题目数量:");                         //提示需求数量
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Answers=print(n);             //打印题目,具体见源码  
        cheack(Answers);               //检查答案,具体见源码
sc.close(); }

 

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.小结:

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

posted @ 2017-03-03 22:23  木子火奂  阅读(353)  评论(5编辑  收藏  举报