• 软件工程个人作业01


    题目要求:

      像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”。

    要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性)、

    题目避免重复、可定制出题的数量。

    (有能力者改编成网页版)

    程序设计思想:

      首先我建了一个包含主函数的类,用来执行功能,比如说,根据用户需求进行出题、

    控制出的题目不重复、控制分数题里出的是真分数等。

      然后我又写了另一个类,在这个类里,只有各种各样执行功能的方法,比如说,求两个数的最大公约数、

    求两个数的最小公倍数、对一个分数进行约分、对两个分数进行运算等。

    源程序:

      (下面是包含主函数的类)

     

    package math_package;
    
    import java.util.Random;
    import java.util.Scanner;
    import mathMethod.*;
    
    public class Math {
    
        /**
         * @param args
         */
        
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int a;//用来产生存储一个随机数
            int b;//用来产生一个1~4以内的随机数,分别代表加减乘除
            int c;//用来产生第二个参与运算的数
            int d;//用来随机出是产生整数式还是真分数式
            
            int e;//第一个数的分母
            int f;//第二个数的分母
            
            Random ran=new Random();
            
            
            System.out.println("请输入你要定制的数量:");
            Scanner scan=new Scanner(System.in);
            int number=scan.nextInt();
            System.out.println("开始答题");
            
            //这个数组是用来存放已经出好的题
            String nihao[]=new String [number];
            
            int number1=0;//这个是用来对已经出的题进行计数
            
            String result="";   //用来接受分数答案
            int result1;    //用来整数接收
            
            int i,j;
            for(i=0;i<number;i++){
            d=ran.nextInt(2)+1;
            
            
            if(d==1){
            //如果d是1,那么就产生整数式    
            a=ran.nextInt(10)+1;
            b=ran.nextInt(4)+1;
            c=ran.nextInt(10)+1;
            
            if(b==1){
                String bian1=a+"+"+c+"=";
                String bian2=c+"+"+a+"=";
                for(j=0;j<number1;j++){
                    if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                        break;
                    }
                }
                if(j==number1)
                {
    
                    nihao[number1]=new String(bian1);
                    number1++;
                    System.out.print(a+"+"+c+"=");
                    result1=scan.nextInt();  //接收答案
                    while(result1!=(a+c))
                    {
                        System.out.print("答案不正确,请重新输入:");
                        result1=scan.nextInt();
                    }
                }
                else i=i-1;
            }
            else if(b==2){
                String bian1=a+"-"+c+"=";
                String bian2=c+"-"+a+"=";
                for(j=0;j<number1;j++){
                    if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                        break;
                    }
                }
                if(j==number1)
                {
    
                    nihao[number1]=new String(bian1);
                    number1++;
                    System.out.println(a+"-"+c+"=");
                    result1=scan.nextInt();  //接收答案
                    while(result1!=(a-c))
                    {
                        System.out.print("答案不正确,请重新输入:");
                        result1=scan.nextInt();
                    }
                }
                else i=i-1;
                }
            else if(b==3){
                String bian1=a+"*"+c+"=";
                String bian2=c+"*"+a+"=";
                for(j=0;j<number1;j++){
                    if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                        break;
                    }
                }
                if(j==number1)
                {
    
                    nihao[number1]=new String(bian1);
                    number1++;
                    System.out.println(a+"*"+c+"=");
                    result1=scan.nextInt();  //接收答案
                    while(result1!=(a*c))
                    {
                        System.out.print("答案不正确,请重新输入:");
                        result1=scan.nextInt();
                    }
                }
                else i=i-1;
                }
            else if(b==4){
                String bian1=a+"/"+c+"=";
                String bian2=c+"/"+a+"=";
                for(j=0;j<number1;j++){
                    if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                        break;
                    }
                }
                if(j==number1)
                {
    
                    nihao[number1]=new String(bian1);
                    number1++;
                    System.out.println(a+"/"+c+"=");
                    result1=scan.nextInt();  //接收答案
                    while(result1!=(a/c))
                    {
                        System.out.print("答案不正确,请重新输入:");
                        result1=scan.nextInt();
                    }
                }
                else i=i-1;
                }
            
            }
            
            else if(d==2){
                //如果d是2,那么就产生真分数式    
                a=ran.nextInt(10)+1;
                b=ran.nextInt(4)+1;
                c=ran.nextInt(10)+1;
                e=ran.nextInt(10)+1;
                f=ran.nextInt(10)+1;
                
                //对两个分数进行约分
                String g=Method.reduce(a,e);
                String h=Method.reduce(c, f);
                if(b==1){
                    String bian1=g+"+"+h+"=";
                    String bian2=h+"+"+g+"=";
                    if(a/e<1&&c/f<1){
                    for(j=0;j<number1;j++){
                        if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                            break;
                        }
                    }
                    if(j==number1)
                    {
    
                        nihao[number1]=new String(bian1);
                        number1++;
                        System.out.println(g+"+"+h+"=");
                        result=scan.next();//接收结果
                        while(!(result.equals(Method.calculate(g, h,"+"))))
                        {
                            System.out.print(Method.calculate(g, h,"+")+"答案不正确,请重新输入:");
                            result=scan.next();
                        }
                    }
                    else i=i-1;
                    }
                    else i=i-1;
                }
                else if(b==2){
                    String bian1=g+"-"+h+"=";
                    String bian2=h+"-"+g+"=";
                    if(a/e<1&&c/f<1){
                    for(j=0;j<number1;j++){
                        if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                            break;
                        }
                    }
                    if(j==number1)
                    {
    
                        nihao[number1]=new String(bian1);
                        number1++;
                        System.out.println(g+"-"+h+"=");
                        result=scan.next();//接收结果
                        while(!(result.equals(Method.calculate(g, h,"-"))))
                        {
                            System.out.print(Method.calculate(g, h,"-")+"答案不正确,请重新输入:");
                            result=scan.next();
                        }
                    }
                    else i=i-1;
                    }
                    else i=i-1;
                }
                else if(b==3){
                    String bian1=g+"*"+h+"=";
                    String bian2=h+"*"+g+"=";
                    if(a/e<1&&c/f<1){
                    for(j=0;j<number1;j++){
                        if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                            break;
                        }
                    }
                    if(j==number1)
                    {
    
                        nihao[number1]=new String(bian1);
                        number1++;
                        System.out.println(g+"*"+h+"=");
                        result=scan.next();//接收结果
                        while(!(result.equals(Method.calculate(g, h,"*"))))
                        {
                            System.out.print(Method.calculate(g, h,"*")+"答案不正确,请重新输入:");
                            result=scan.next();
                        }
                    }
                    else i=i-1;
                    }
                    else i=i-1;
                }
                else if(b==4){
                    String bian1=g+"/"+h+"=";
                    String bian2=h+"/"+g+"=";
                    if(a/e<1&&c/f<1){
                    for(j=0;j<number1;j++){
                        if(bian1.equals(nihao[j])||bian2.equals(nihao[j])){
                            break;
                        }
                    }
                    if(j==number1)
                    {
    
                        nihao[number1]=new String(bian1);
                        number1++;
                        System.out.println(g+"/"+h+"=");
                        result=scan.next();//接收结果
                        while(!(result.equals(Method.calculate(g, h,"/"))))
                        {
                            System.out.print(Method.calculate(g, h,"/")+"答案不正确,请重新输入:");
                            result=scan.next();
                        }
                    }
                    else i=i-1;
                    }
                    else i=i-1;
                }
            }
            
        }
            System.out.println("答题结束");
        }
    }

    (下面是只包含方法的类)

      

    package mathMethod;
    
    //采用分而治之的思想
    public class Method {
        
        public static int maxCommon(int a ,int b)
        {
            //循环法求两个数的最大公约数
            
            //保证第一个参数大于第二个参数
            if(a<b)
            {
                int temp;
                temp=a;
                a=b;
                b=temp;
            }
            while(a%b!=0)   //在余数不为零时循环
            {
                int temp=a%b;
                a=b;
                b=temp;
            }
            return b;  //返回最大公约数
        }
        
        public static int minCommon(int a,int b)
        {
            //求最小公倍数
            return a*b/maxCommon(a,b);
        }
        
        public static String reduce(int a ,int b)
        {
            //对于a/b组成的分数进行约分
            
            //第一步就是找出两者的最大公约数
            int c=maxCommon(a,b);
            
            //分子分母约分
            a=a/c; 
            b=b/c;
            
            //把a,b转换成分数返回
            String temp=a+"/"+b;
            return temp;
        }
        public static String calculate(String a,String b,String c) //参数分别代表第一个分数,第二个分数,以及运算符
        {
            int a1=Integer.parseInt(a.substring(0,1));//代表a的分子
            int a2=Integer.parseInt(a.substring(2));//代表a的分母
            int b1=Integer.parseInt(b.substring(0,1));//代表b的分子
            int b2=Integer.parseInt(b.substring(2));//代表b的分母
            if(c.equals("+"))
            {
                //首先求两个分母的最小公倍数,进行通分
                int temp=minCommon(a2,b2);
                a1=temp/a2*a1;
                b1=temp/b2*b1;
                
                //求合并后的分子
                int temp1=a1+b1;
                
                String temp2=reduce(temp1,temp);
                return temp2;
            }
            else if(c.equals("-"))
            {
                //首先求两个分母的最小公倍数,进行通分
                int temp=minCommon(a2,b2);
                a1=temp/a2*a1;
                b1=temp/b2*b1;
                
                //求合并后的分子
                int temp1=a1-b1;
                
                return reduce(temp1,temp);
            }
            else if(c.equals("*"))
            {
                //直接把分母相乘得到合并后的分母
                int temp=a2*b2;
                
                //求合并后的分子
                int temp1=a1*b1;
                
                return reduce(temp1,temp);
            }
            
            else if(c.equals("/"))
            {
                //分数相除就是第一个分数乘以第二个分数的倒数
                int temp=a2*b1;
                
                //求合并后的分子
                int temp1=a1*b2;
                
                return reduce(temp1,temp);
            }
            String xuhaojun="成功了";
            return xuhaojun;
            
        }
    }

      程序结果截图:

     未能及时完成的原因:

    感觉自己写程序的方法不对,以至于到了最后因为一些小问题而耽误很长时间。

    如果我能采用分而治之的思想,把一个大问题分解为一个一个的小问题,然后依次解决这些小问题。

    那么,我感觉效率可能会提高些。

        

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    网上怎么赚钱?如何利用CPA赚钱?
    在农村养殖什么赚钱?要做好哪些预防工作?
    计算机组成的基本硬件设备
    JAVA回溯法求0-1背包
    TensorFlow学习笔记之批归一化:tf.layers.batch_normalization()函数
    数据库连接池的大小值设定,不能随意设置太大的值
    N皇后问题
    19个强大、有趣、又好玩的 Linux 命令!
    JAVA马的遍历
  • 原文地址:https://www.cnblogs.com/haojun/p/6490072.html
Copyright © 2020-2023  润新知