课堂作业1(出题)

时间:2023-01-06 22:00:41

题目:支持整数和真分数的四则运算(需验证程序的正确性),题目避免重复,可定制出题数量。

思路:由于有真分数,所以我想到的是用int型的二维数组来存储数字(int a[num][2]),用char类型的一维数组来存储运算符,如果是整数则该行的第一个数存则为该数,第二个数存为零,如果是分数则该行的第一个数存分子,第二个数存分母,而且在生成分数的随机数时不包含0,利用1到4的随机数来随机生成运算符,在生成完所有的数后再查找是否有重复,如果有,则在该位置重新生成随机数。在计算之前先进行数字的处理,如果进行计算的两个数之中有分数,则将两个数的分母变为相同。最后约分。

package 出题;

import java.util.Random;
import java.util.Scanner;

public class test {
    static int[][] a;
    static int[][] b;
    static int[][] r;
    static char[] c;
    static int max;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
     System.out.println("请输入题目的数量");
     Scanner sc = new Scanner(System.in);
     int num = sc.nextInt();
     System.out.println("请输入出现的最大整数");
     max = sc.nextInt();
     r = new int[num][num];
     symbol(num);
     setnumber(num);
     yuefen(num);
     show(num);
     zhuanhuan(num);
     count(num);
     yuefenr(num);
     System.out.println("是否输出答案 1、是 2、否");
     int n = sc.nextInt();
     if(n==1)
     {
         showanswer(num);
     }
     else
     {
         System.out.println("结束");
     }
    }
public static void yuefen(int num)
{
    for(int i=0;i<num;i++)
    {
        if(a[i][1]!=0&&a[i][0]!=0)
        {
            int n = (a[i][0]<a[i][1])?a[i][0]:a[i][1];
            for(int j=2;j<=n;j++)
            {
                if(a[i][0]%j==0&&a[i][1]%j==0)
                {
                    a[i][0] = a[i][0]/j;
                    a[i][1] = a[i][1]/j;
                }
            }
        }
    }
    for(int i=0;i<num;i++)
    {
        if(b[i][1]!=0&&b[i][0]!=0)
        {
            int n = (b[i][0]<b[i][1])?b[i][0]:b[i][1];
            for(int j=2;j<=n;j++)
            {
                if(b[i][0]%j==0&&b[i][1]%j==0)
                {
                    b[i][0] = b[i][0]/j;
                    b[i][1] = b[i][1]/j;
                }
            }
        }
    }
}
public static void yuefenr(int num)
{    
        for(int i=0;i<num;i++)
        {
            if(r[i][1]!=0&&r[i][0]!=0)
            {
                int n = (r[i][0]<r[i][1])?r[i][0]:r[i][1];
                for(int j=2;j<=n;j++)
                {
                    if(r[i][0]%j==0&&r[i][1]%j==0)
                    {
                        r[i][0] = r[i][0]/j;
                        r[i][1] = r[i][1]/j;
                    }
                }
            }
        }
}
public static void showanswer(int num)
{
    for(int i=0;i<num;i++)
    {
        if(r[i][1]==0||r[i][1]==1)
        {
            System.out.println(i+1+"、"+r[i][0]);
        }
        else 
        {
            if(Math.abs(r[i][1])>Math.abs(r[i][0]))
            {
                if(r[i][0]==0)
                {
                    System.out.println(i+1+"、"+0);
                }
                else
                {
                    System.out.println(i+1+"、"+r[i][0]+"/"+r[i][1]);
                }
            }
            else if(Math.abs(r[i][0])==Math.abs(r[i][1]))
            {
                System.out.println(i+1+"、"+1);
            }
            else
            {
                int m = r[i][0]%r[i][1];
                System.out.println(i+1+"、"+r[i][0]/r[i][1]+"又"+m+"/"+r[i][1]);
            }
        }
    }
}
public static void zhuanhuan(int num)
{
    for(int i=0;i<num;i++)
    {
        if(a[i][1]==0&&b[i][1]!=0)
        {
            a[i][0] = a[i][0]*b[i][1];
            a[i][1] = b[i][1];
        }
        else if(a[i][1]!=0&&b[i][1]==0)
        {
            b[i][0] = a[i][1]*b[i][0];
            b[i][1] = a[i][1];
        }
        else if(a[i][1]!=0&&b[i][1]!=0)
        {
            int t = a[i][1]*b[i][1];
            a[i][0] = a[i][0]*b[i][1];
            b[i][0] = b[i][0]*a[i][1];
            a[i][1] = t;
            b[i][1] = t;
        }
    }
}
public static void symbol(int num)
{
    Random rand = new Random();
    c = new char[num];
    for(int i=0;i<num;i++)
    {
        int n = rand.nextInt(4)+1;
        if(n==1)
        {
            c[i]='*';
        }
        if(n==2)
        {
            c[i]='/';
        }
        if(n==3)
        {
            c[i]='+';
        }
        if(n==4)
        {
            c[i]='-';
        }
    }
}
public static void count(int num)
{
    for(int i=0;i<num;i++)
    {
        if(c[i]=='+')
        {
            add(i);
        }
        if(c[i]=='-')
        {
            minus(i);
        }
        if(c[i]=='*')
        {
            multiply(i);
        }
        if(c[i]=='/')
        {
            divide(i);
        }
    }
}
public static void add(int i)
{
    r[i][0] = a[i][0] + b[i][0];
    r[i][1] = a[i][1];
}
public static void minus(int i)
{
    r[i][0] = a[i][0] - b[i][0];
    r[i][1] = a[i][1];
}
public static void multiply(int i)
{
    r[i][0] = a[i][0] * b[i][0];
    r[i][1] = a[i][1] * b[i][1];
}
public static void divide(int i)
{
    r[i][0] = a[i][0];
    r[i][1] = b[i][0];
}
public static void setnumber(int num)
{
    Random rand = new Random();
    a = new int[num][2];
    b = new int[num][2];
        for(int i=0;i<num;i++)
        {
            int n = rand.nextInt(2)+1;
            int m = rand.nextInt(2)+1;
            if(n==1)//分数
            {
                boolean flag = false;
                while(flag==false)
                {
                    int x = rand.nextInt(max)+1;
                    int y = rand.nextInt(max)+1;
                    if(x<y)
                    {
                        a[i][0] = x;
                        a[i][1] = y;
                        flag = true;
                    }
                }
            }
            if(n==2)//整数
            {
                a[i][0] = rand.nextInt(max);
                a[i][1] = 0;
            }
            if(m==1)//分数
            {
                boolean flag = false;
                while(flag==false)
                {
                    int x = rand.nextInt(max)+1;
                    int y = rand.nextInt(max)+1;
                    if(x<y)
                    {
                        b[i][0] = x;
                        b[i][1] = y;
                        flag = true;
                    }
                }
            }
            if(m==2)//整数
            {
                if(c[i]=='/')
                {
                    b[i][0] = rand.nextInt(max)+1;
                }
                else
                {
                    b[i][0] = rand.nextInt(max);
                }
                b[i][1] = 0;
            }
        }
            for(int i=0;i<num-1;i++)
            {
                for(int j=i+1;j<num;j++)
                {
                    while((a[i][0]==a[j][0]&&a[i][1]==a[j][1]&&b[i][0]==b[j][0]&&b[i][1]==b[j][1])||(a[i][0]==b[j][0]&&a[i][1]==b[j][1]&&b[i][0]==a[j][0]&&a[j][1]==b[i][1]))
                    {
                        int n=rand.nextInt(2)+1;
                        int m=rand.nextInt(2)+1;
                        if(n==1)//分数
                        {
                            boolean flag = false;
                            while(flag==false)
                            {
                                int x = rand.nextInt(max);
                                int y = rand.nextInt(max);
                                if(x<y)
                                {
                                    a[j][0] = x;
                                    a[j][1] = y;
                                    flag = true;
                                }
                            }
                        }
                        if(n==2)//整数
                        {
                            a[j][0] = rand.nextInt(max);
                            a[j][1] = 0;
                        }
                        if(m==1)//分数
                        {
                            boolean flag = false;
                            while(flag==false)
                            {
                                int x = rand.nextInt(max);
                                int y = rand.nextInt(max);
                                if(x<y)
                                {
                                    b[j][0] = x;
                                    b[j][1] = y;
                                    flag = true;
                                }
                            }
                        }
                        if(m==2)//整数
                        {
                            if(c[j]=='/')
                            {
                                b[j][0] = rand.nextInt(max)+1;
                            }
                            else
                            {
                                b[j][0] = rand.nextInt(max);
                            }
                            b[j][1] = 0;
                        }
                    }
                }
            }
}
public static void show(int num)
{
    for(int i=0;i<num;i++)
    {
        if(a[i][1]==0)
        {
            System.out.print(i+1+"、"+a[i][0]+" "+c[i]+" ");
            if(b[i][1]==0)
            {
                System.out.println(b[i][0]+" =");
            }
            else
            {
                System.out.println(" ("+b[i][0]+"/"+b[i][1]+") =");
            }
        }
        else
        {
            System.out.print(i+1+"、("+a[i][0]+"/"+a[i][1]+") "+c[i]+" ");
            if(b[i][1]==0)
            {
                System.out.println(b[i][0]+" =");
            }
            else
            {
                System.out.println("("+b[i][0]+"/"+b[i][1]+") =");
            }
        }
    }
}
}

运行结果截图:

课堂作业1(出题)

课堂作业1(出题)