软件工程作业02

题目:自动生成小学算数题,且有要求。(是否有乘除法,减法是否有负数,除法是否有余数等)

设计思想:写一个定制生成数量的函数num(); 写一个生成整数算术题的函数function();function函数中可以直接生成随机数,用if语句进行分母为0或者减法过后结果为负数的情况的排除,运算符号也用随机数0到3来表示,返回值为String的式子即为算数题式子。写一个生成整数算术题的函数fun();fun函数中可以直接生成随机数,用if语句进行分母为0或者减法过后结果为负数的情况的排除,运算符号也用随机数0到3来表示,返回值为String的式子即为分数算数题式子。在生成算术式子的函数中用if语句进行判断生成哪种要求的算术式子。主函数中用一个String类型的数组保存算数题,用类似查询的方法来查重题目,不重复后输出题目。

源代码:

package suanshuti;

import java.util.Scanner;

public class Timu2 {

    //最大公约
    static double getGcd(double m,double n){
            while(n > 0){
                double temp = m % n;
                m = n;
                n = temp;
            }
            return m;
        }
     //最小公倍数
    static double getLcm(double m,double n){
         double gcd = getGcd(m,n);
         double result = m*n / gcd;
            return result;
        }
    //生成题目数量的函数*************
    static int num()
    {
        int num;
        @SuppressWarnings("resource")
        Scanner in =  new Scanner(System.in);
        System.out.print("请输入题目的数量:");
        num = in.nextInt();
        return num;
    }
    
    //产生分数式子的函数*************
    static String fun(int r ,int fun)//int fun为功能选项
    {
        //1有乘除法2减法无负数
        String fu ="";
        String shizi="";
        int a=(int)(Math.random()*(r+1));
        int b=(int)(Math.random()*(r+1));
        int c=(int)(Math.random()*(r+1));
        int d=(int)(Math.random()*(r+1));
        int e=(int)(Math.random()*4);
        //1有乘除法2减法无负数***12
        if(fun==12)
        {
        if(e==0)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==1)
        {
            fu="-";
            double y=getLcm(b,d);
            double a1=y/b;
            double c1=y/d;
            double a2=a*a1;
            double c2=c*c1;
            while(a>=b||c>=d||b==0||d==0||a2<c2)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
                  y=getLcm(b,d);
                     a1=y/b;
                     c1=y/d;
                     a2=a*a1;
                     c2=c*c1;
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==2)
        {
            fu="*";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==3)
        {
            fu="/";
            while(a>=b||c>=d||b==0||d==0||c==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        }
        //1有乘除法2减法无负数***1
        if(fun==1)
        {
        if(e==0)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==1)
        {
            fu="-";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==2)
        {
            fu="*";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==3)
        {
            fu="/";
            while(a>=b||c>=d||b==0||d==0||c==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        }
        //1有乘除法2减法无负数***2
        if(fun==2)
        {
        if(e==0)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==1)
        {
            fu="-";
            double y=getLcm(b,d);
            double a1=y/b;
            double c1=y/d;
            double a2=a*a1;
            double c2=c*c1;
            while(a>=b||c>=d||b==0||d==0||a2<c2)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
                  y=getLcm(b,d);
                     a1=y/b;
                     c1=y/d;
                     a2=a*a1;
                     c2=c*c1;
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==2)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==3)
        {
            fu="-";
            double y=getLcm(b,d);
            double a1=y/b;
            double c1=y/d;
            double a2=a*a1;
            double c2=c*c1;
            while(a>=b||c>=d||b==0||d==0||a2<c2)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
                  y=getLcm(b,d);
                     a1=y/b;
                     c1=y/d;
                     a2=a*a1;
                     c2=c*c1;
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        }
        //1有乘除法2减法无负数***0
        if(fun==0)
        {
        if(e==0)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==1)
        {
            fu="-";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==2)
        {
            fu="+";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        if(e==3)
        {
            fu="-";
            while(a>=b||c>=d||b==0||d==0)
            {
                 a=(int)(Math.random()*(r+1));
                 b=(int)(Math.random()*(r+1));
                 c=(int)(Math.random()*(r+1));
                 d=(int)(Math.random()*(r+1));
            }
            int aa=(int) getGcd(a,b);
            int cc=(int) getGcd(c,d);
            a=a/aa; b=b/aa;
            c=c/cc; d=d/cc;
            shizi=a+"/"+b+" "+fu+" "+c+"/"+d+" = ?";
        }
        }
        return shizi;
    }
    //生成整数式子的函数******************************

static String function(int r ,int q, int fun)//int fun为功能选项 { //1有乘除法 2加减无负数 3除法无余数(123,12,1,13, 2,0) String fu =""; String shizi=""; int a=(int)(Math.random()*(r)%(r-q+1)+q); int b=(int)(Math.random()*(r)%(r-q+1)+q); int c=(int)(Math.random()*4); //1乘除法 2加减无负数 3除法无余数****123 if(fun==123) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0||a%b!=0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****12 if(fun==12) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0) { b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****13 if(fun==13) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0和余数的可能性 while(b==0||a%b!=0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****1 if(fun==1) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="*"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="/"; //排除分母为0的可能性 while(b==0) { b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****2 if(fun==2) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="-"; //排除负数可能性 while(a-b<0) { a=(int)(Math.random()*(r)%(r-q+1)+q); b=(int)(Math.random()*(r)%(r-q+1)+q); } shizi=a+" "+fu+" "+b+" = ?"; } } //1乘除法 2加减无负数 3除法无余数****0 if(fun==0) { if(c==0) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==1) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==2) { fu="+"; shizi=a+" "+fu+" "+b+" = ?"; } if(c==3) { fu="-"; shizi=a+" "+fu+" "+b+" = ?"; } } return shizi; } @SuppressWarnings("resource") public static void main(String[] args) { int num1,r = 0,q = 0,r1,m=0,fun ; while(m==0) { int flag=0; System.out.print("1:真分数 2:数整 3:退出 请输入:"); Scanner in2 = new Scanner(System.in); r1 = in2.nextInt(); if(r1==1) { num1=num(); String Array1[]=new String[num1]; System.out.print("请输入算数题中出现的数的最大值:"); Scanner in1 = new Scanner(System.in); r = in1.nextInt(); System.out.println("请输入算数题的控制项(1有乘除法 2加减无负数 0都未选择)"); System.out.println("例如:12是有乘除法,加减法无负数"); System.out.print("请输入控制项:"); Scanner in21 = new Scanner(System.in); fun = in21.nextInt(); while(flag==0) { if(fun==12||fun==1||fun==2||fun==0) { for(int i=0;i<num1;i++) { Array1[i]=fun(r,fun); //查重 for(int z=0;z<i;z++) { if(Array1[z].equals(Array1[i])) { Array1[i]=fun(r,fun); z=0; } } flag=1; if(i%3==0) System.out.println(); System.out.print(Array1[i]+" "); } } else { System.out.println("输入错误,请重新输入!"); flag=1; } } } if(r1==2) { num1=num(); String Array[]=new String[num1]; //进行最大值最小值的顺序判断*** int w1=0;; while(w1==0) { System.out.print("请输入算数题中出现的数的最大值和最小值:"); Scanner in1 = new Scanner(System.in); r = in1.nextInt(); q = in1.nextInt(); if(r>=q) w1=1; else { w1=0; System.out.println("输入错误!"); } } System.out.println("请输入算数题的控制项(1有乘除法 2加减无负数 3除法无余数 0都未选择)"); System.out.println("例如:123是有乘除法,加减法无负数,除法无余数"); System.out.print("请输入控制项:"); Scanner in211 = new Scanner(System.in); fun = in211.nextInt(); while(flag==0) { if(fun==123||fun==12||fun==1||fun==13||fun==2||fun==0) { for(int i=0;i<num1;i++) { Array[i]=function(r,q,fun); //查重 for(int z=0;z<i;z++) { if(Array[z].equals(Array[i])) { Array[i]=function(r,q,fun); z=0; } } flag=1; if(i%3==0) System.out.println(); System.out.print(Array[i]+" "); } } if(fun!=123&&fun!=12&&fun!=1&&fun!=13&&fun!=2&&fun!=0) { System.out.println("输入错误,请重新输入!"); flag=1; } } } if(r1==3) { m=1; System.out.print("谢谢使用!"); } System.out.println(); } } }

结果截图:

过程中产生的错误和不足:分数的除法只想到了每一个分数的分母不能等于0,没想到被除数也不能等于0,开始会生成1/2 / 0/1=?这样的式子,其实这样的式子是不正确的。后来在while语句中加了一个c==0的情况排除上面的情况。还有分数开始时候没有约分,之后运用最大公约数最小公倍数进行约分。

 

posted @ 2017-03-10 16:49  the-heartbeat  阅读(126)  评论(0编辑  收藏  举报