小学自动生成四则运算加强版

这是一个在自动生成计算式的代码上加强的新版本

1.支持用户交互

2.用户可以在线答题,程序会检查用户的答案是否正确

3.增加了真分数的计算

4.增加了有余数的计算

思路:

整数:

1.需要生成式子,程序需要生成一定范围内的数,判断生成数的大小,在自动生成一个符号

2.复杂的是除法,分母不能为0,并且生成的数可以整除

分数:

1.需要生成式子,程序需要生成一定范围内的数,判断生成数的大小,在自动生成一个符号

2.分母不能为0

3.加法与减法,需要求最小公倍数,结果必须最简化,求最大公约数,化简成最简。

有余数的数:

1.需要生成式子,程序需要生成一定范围内的数,判断生成数的大小,在自动生成一个符号

2.计算结果比较简单,利用int型整除还能得到余数

下面是源代码:

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

class Suan1//生成整数计算的类
{
    public int x,y,c;//定义两个变量,还有一个符号变量
    public Random random=new Random();//定义随机数
    String m;//生成的计算式储存咋m里面
    public String shengcheng()//自动生成数的函数
    {

         c=random.nextInt(4);//生成符号
         String fuhao;
         x=random.nextInt(100);//生成100以内的自然数
         y=random.nextInt(100);
         if(c==0)//0是加法
         {
             fuhao="+";
         }
         else if(c==1)//1是减法
         {
             fuhao="-";
         }
         else if(c==2)//2是乘法
         {
             fuhao="*";
         }
         else
         {
             fuhao="/";//3是除法
         }
         m=String.valueOf(x)+fuhao+String.valueOf(y);
         return m;

    }
    public int shuchu()//定义输出函数
    {
        if(c==0)
        {
            System.out.print(x+"+"+y+"=");
            return (x+y);//并且返回计算的结果
        }
        else if(c==1)
        {
            if(x>=y)//将较大的数放在前面,不能出现负数
            {
            System.out.print(x+"-"+y+"=");
            return (x-y);
            }
            else
            {
                System.out.print(y+"-"+x+"=");
            return (y-x);
            }
        }
        else if(c==2)
        {
            if(x*y<100)//控制计算范围在100以内
            {
                System.out.print(x+"*"+y+"=");
                return (x*y);
            }
            else
            {
                for(int i=0;;i++)
                {
                    if(x*y<=100)//控制计算范围在100以内
                    {
                        System.out.print(x+"*"+y+"=");
                        return (x*y);
                    }
                    else
                    {
                        y=random.nextInt(100);
                    }

                }
            }
        }
        else
        {
            for(int i=0;;i++)
            {
            if(y==0)//分母不能为0
            {
                y=random.nextInt();
            }
            else
            {
                break;
            }
            }
                System.out.print(x*y+"/"+y+"=");
                return (x*y/y);

        }
    }
    public int jianyan(String a[],int s)//检验是否有重复的式子,如果有返回0,没有就返回1
    {
       int flag=1;
       for(int i=0;i<s;i++)
       {
           if(m.equals(a[i]))//数组a里面是生成的式子
           {
              flag=0;
              break;
           }
       }
       return flag;
    }
}
class Suan2//真分数的运算类
{
    public int m,n,x,y,c;//定义4个变量,还有一个符号变量
    public Random random=new Random();
    String s;//生成的计算式储存咋m里面
    public String shengcheng()
    {
        c=random.nextInt(4);
        x=random.nextInt(50);
        y=random.nextInt(50);
        m=random.nextInt(50);
        n=random.nextInt(50);//生成4个随机数在50以内,赋给x,y,m,n
        String fuhao;
        if(c==0)//通整数一样,0是加法,1减法,2乘法,3除法
         {
             fuhao="+";
         }
         else if(c==1)
         {
             fuhao="-";
         }
         else if(c==2)
         {
             fuhao="*";
         }
         else
         {
             fuhao="/";
         }
         s=String.valueOf(x)+fuhao+String.valueOf(y);//储存计算式
         return s;
    }
    public String shuchu()//定义输出函数
    {
        for(int i=0;;i++)
        {
            if(x==0)//不能生成0
            {
            x=random.nextInt(50);
            }
            else
            {
                break;
            }
        }
        for(int i=0;;i++)
        {
            if(y==0)//不能生成0
            {
            y=random.nextInt(50);
            }
            else
            {
                break;
            }
        }
        for(int i=0;;i++)
        {
            if(m==0)//不能生成0
            {
            m=random.nextInt(50);
            }
            else
            {
                break;
            }
        }
        for(int i=0;;i++)
        {
            if(n==0)//不能生成0
            {
            n=random.nextInt(50);
            }
            else
            {
                break;
            }
        }
        if(c==0)
        {
            if(x>y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
            System.out.print(y+"/"+x+"  +  "+n+"/"+m+"=");
            return jisuan(x,y,m,n,c);//返回计算结果
            }
            else if(x>y&&m<n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(y+"/"+x+"  +  "+m+"/"+n+"=");
                return jisuan(x,y,n,m,c);//返回计算结果
            }
            else if(x<y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  +  "+n+"/"+m+"=");
                return jisuan(y,x,m,n,c);//返回计算结果
            }
            else//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  +  "+m+"/"+n+"=");
                return jisuan(y,x,n,m,c);//返回计算结果
            }
        }
        else if(c==1)
        {
            double x1=Double.parseDouble(String.valueOf(x));
            double y1=Double.parseDouble(String.valueOf(y));
            double m1=Double.parseDouble(String.valueOf(m));
            double n1=Double.parseDouble(String.valueOf(n));
            if(x>y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
                if((y1/x1)>(n1/m1))
                {
                    System.out.print(y+"/"+x+"  -  "+n+"/"+m+"=");
                    return jisuan(x,y,m,n,c);//返回计算结果
                }
                else
                {
                    System.out.print(n+"/"+m+"  -  "+y+"/"+x+"=");
                    return jisuan(m,n,x,y,c);//返回计算结果
                }
            }
            else if(x>y&&m<n)//生成的分母必须大于分子,输出不同的结果
            {
                if((y1/x1)>(m1/n1))//减数必须大于被减数
                {
                    System.out.print(y+"/"+x+"  -  "+m+"/"+n+"=");
                    return jisuan(x,y,n,m,c);//返回计算结果
                }
                else//减数必须大于被减数
                {
                    System.out.print(m+"/"+n+"  -  "+y+"/"+x+"=");
                    return jisuan(n,m,x,y,c);//返回计算结果
                }
            }
            else if(x<y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
                if((x1/y1)>(n1/m1))//减数必须大于被减数
                {
                    System.out.print(x+"/"+y+"  -  "+n+"/"+m+"=");
                    return jisuan(y,x,m,n,c);
                }
                else//减数必须大于被减数
                {
                    System.out.print(n+"/"+m+"  -  "+x+"/"+y+"=");
                    return jisuan(m,n,y,x,c);//返回计算结果
                }
            }
            else
            {
                if((x1/y1)>(m1/n1))//生成的分母必须大于分子,输出不同的结果//减数必须大于被减数
                {
                    System.out.print(x+"/"+y+"  -  "+m+"/"+n+"=");
                    return jisuan(y,x,n,m,c);//返回计算结果
                }
                else//减数必须大于被减数
                {
                    System.out.print(m+"/"+n+"  -  "+x+"/"+y+"=");
                    return jisuan(n,m,y,x,c);//返回计算结果
                }
            }
        }
        else if(c==2)
        {
            if(x>y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
            System.out.print(y+"/"+x+"  *  "+n+"/"+m+"=");
            return jisuan(x,y,m,n,c);//返回计算结果
            }
            else if(x>y&&m<n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(y+"/"+x+"  *  "+m+"/"+n+"=");
                return jisuan(x,y,n,m,c);//返回计算结果
            }
            else if(x<y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  *  "+n+"/"+m+"=");
                return jisuan(y,x,m,n,c);
            }
            else//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  *  "+m+"/"+n+"=");
                return jisuan(y,x,n,m,c);//返回计算结果
            }
        }
        else
        {
            if(x>y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
            System.out.print(y+"/"+x+"  /  "+n+"/"+m+"=");
            return jisuan(x,y,m,n,c);//返回计算结果
            }
            else if(x>y&&m<n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(y+"/"+x+"  /  "+m+"/"+n+"=");
                return jisuan(x,y,n,m,c);//返回计算结果
            }
            else if(x<y&&m>n)//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  /  "+n+"/"+m+"=");
                return jisuan(y,x,m,n,c);//返回计算结果
            }
            else//生成的分母必须大于分子,输出不同的结果
            {
                System.out.print(x+"/"+y+"  /  "+m+"/"+n+"=");
                return jisuan(y,x,n,m,c);//返回计算结果
            }
        }
    }
    public String jisuan(int a,int b,int c,int d,int m)//计算结果的函数
    {
        String daan;
        int gongyue,gongbei;
        if(m==0)//加法计算的结果算法
        {
            gongbei=Gongbei(a,c);//求两个分母的最小公倍数
            int s1,s2,s3;
            s1=gongbei/a;
            s2=gongbei/c;
            s3=b*s1+d*s2;
            if(s3==gongbei)
            {
                return("1");
            }
            else
            {
                gongyue=Gongyue(s3,gongbei);
                daan=String.valueOf(s3/gongyue)+"/"+String.valueOf(gongbei/gongyue);//通分
                return daan;
            }
        }
        else if(m==1)//减法计算的结果算法
        {
            gongbei=Gongbei(a,c);
            int s1,s2,s3;
            s1=gongbei/a;
            s2=gongbei/c;
            s3=b*s1-d*s2;
            if(s3==gongbei)
            {
                return("1");
            }
            else
            {
                gongyue=Gongyue(s3,gongbei);
                daan=String.valueOf(s3/gongyue)+"/"+String.valueOf(gongbei/gongyue);
                return daan;
            }
        }
        else if(m==2)//乘法计算的结果算法
        {
            int s1,s2;
            s1=a*c;
            s2=b*d;
            if(s1==s2)
            {
                return("1");
            }
            else
            {
                gongyue=Gongyue(s1,s2);
                daan=String.valueOf(s2/gongyue)+"/"+String.valueOf(s1/gongyue);
                return daan;
            }
        }
        else//除法计算的结果算法
        {
            int s1,s2;
            s1=a*d;
            s2=b*c;
            if(s1==s2)
            {
                return("1");
            }
            else
            {
                gongyue=Gongyue(s1,s2);
                daan=String.valueOf(s2/gongyue)+"/"+String.valueOf(s1/gongyue);
                return daan;
            }
        }
    }
    public int Gongbei(int a,int c)//求最小公倍数的函数
    {
        int gongbei;
        if(a>c)
        {
            gongbei=a;//公倍数从大的开始
            while(gongbei<=a*c)
            {
                if(gongbei%a==0&&gongbei%c==0)
                {
                    break;
                }
                gongbei++;
            }
        }
        else
        {
            gongbei=c;//公倍数从大的开始
            while(gongbei<=a*c)
            {
                if(gongbei%a==0&&gongbei%c==0)
                {
                    break;
                }
                gongbei++;
            }
        }
        return gongbei;

    }
    public int Gongyue(int gongbei,int s3)//求最大公约数的函数
    {
        int i=1,gongyue=0;
        if(gongbei>s3)//公约数从1到最小的数
        {
            while(i<=s3)
            {
                if(gongbei%i==0&&s3%i==0)
                {
                    gongyue=i;
                }
                i++;
            }
            return gongyue;
        }
        else
        {
            while(i<=gongbei)
            {
                if(gongbei%i==0&&s3%i==0)
                {
                    gongyue=i;
                }
                i++;
            }
            return gongyue;
        }
    }
    public int jianyan(String a[],int l)//检验是否生成重复计算式的函数
    {
         int flag=1;
           for(int i=0;i<l;i++)
           {
               if(s.equals(a[i]))
               {
                  flag=0;
                  break;
               }
           }
           return flag;
    }
}
class Suan3//有余数的类
{
    public int x,y;//定义两个变量
    String m;
    public Random random=new Random();
    public String shengcheng()//定义生成函数

    {
        x=random.nextInt(100);
        y=random.nextInt(100);
        m=String.valueOf(x)+"/"+String.valueOf(y);//返回计算式
        return m;
    }
    public String shuchu()//生成输出函数
    {
        String daan;
        int shang,yushu;
        System.out.println(m+"=");
        shang=x/y;
        yushu=x-shang*y;
        daan=String.valueOf(shang)+"/"+String.valueOf(yushu);//返回计算结果
        return daan;
    }
    public int jianyan(String a[],int l)//检验是否重复的函数
    {
         int flag=1;
           for(int i=0;i<l;i++)
           {
               if(m.equals(a[i]))
               {
                  System.out.println(m);
                  flag=0;
                  break;
               }
           }
           return flag;
    }
}

public class Jisuan {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Random random=new Random();
        Suan1 a=new Suan1();//定义整数运算变量a
        Suan2 b=new Suan2();//定义分数运算变量b
        Suan3 c=new Suan3();//定义余数运算变量c
        Scanner in=new Scanner(System.in);
        String shuju[]=new String[30];//定义储存计算式的数组
        int flag=0;//定义旗帜看是否有重复
        int m=0;
        for(int i=0;i<30;i++)
        {
            shuju[i]=new String();
        }
        for(int i=0;;i++)
        {
          System.out.println("1   整数的四则计算");
          System.out.println("2   真分数的四则计算");
          System.out.println("3   整数与真分数的混合四则运算");
          System.out.println("4   有余数的除法");//新添加的带括号的混合四则运算
          System.out.println("5   退出");
          System.out.print("请选择:");
          int t=in.nextInt();
          if(t==1)
          {
            while(m<30)//生成30个计算式
             {
                    shuju[m]=a.shengcheng();//将生成的计算式储存咋数组里面
                    flag=a.jianyan(shuju, m);//返回是否有重复
                    if(flag==1)//如果没有就是1
                    {
                        int daan=a.shuchu();//输出式子,将答案储存在daan里面
                        String daan1=in.next();//用户输入答案
                        if(daan1.equals("break"))//用户不想做题时输入break跳出
                        {
                            break;

                        }
                        else if(Integer.parseInt(daan1)==daan)//检查答案是否正确
                        {
                            System.out.println("回答正确!!!");
                        }
                        else
                        {
                        System.out.println("回答错误!!!正确答案是:"+daan);//如果不正确输出正确答案
                        }
                        m++;
                        flag=0;
                    }
             }
            m=0;
          }
          else if(t==2)
          {
              while(m<30)//生成30个计算式
                {
                  shuju[m]=b.shengcheng();//将生成的计算式储存咋数组里面
                  flag=b.jianyan(shuju, m);//返回是否有重复
                    if(flag==1)//如果没有就是1
                    {
                        String daan=b.shuchu();//输出式子,将答案储存在daan里面
                        String daan1=in.next();//用户输入答案
                        if(daan1.equals("break"))//用户不想做题时输入break跳出
                        {
                            break;

                        }
                        else if(daan1.equals(daan))//检查答案是否正确
                        {
                            System.out.println("回答正确!!!");
                        }
                        else
                        {
                        System.out.println("回答错误!!!正确答案是:"+daan);//如果不正确输出正确答案
                        }
                        m++;
                        flag=0;
                    }
                }
              m=0;
          }
          else if(t==3)//真是整数于分数混合的运算同上
          {
              while(m<30)
                {
                  int suiji=random.nextInt(2);
                  if(suiji==0)
                  {
                  shuju[m]=b.shengcheng();
                  flag=b.jianyan(shuju, m);
                  String daan=b.shuchu();
                    String daan1=in.next();
                    if(daan1.equals("break"))
                    {
                        break;

                    }
                    else if(daan1.equals(daan))
                    {
                        System.out.println("回答正确!!!");
                    }
                    else
                    {
                    System.out.println("回答错误!!!正确答案是:"+daan);
                    }
                    m++;
                    flag=0;
                  }
                  else
                  {
                      shuju[m]=a.shengcheng();
                      flag=a.jianyan(shuju, m);
                      if(flag==1)
                        {
                            int daan=a.shuchu();
                            String daan1=in.next();
                            if(daan1.equals("break"))
                            {
                                break;

                            }
                            else if(Integer.parseInt(daan1)==daan)
                            {
                                System.out.println("回答正确!!!");
                            }
                            else
                            {
                            System.out.println("回答错误!!!正确答案是:"+daan);
                            }
                            m++;
                            flag=0;
                        }
                  }
                }
              m=0;
          }

          else if(t==4)//余数的运算
          {
              while(m<30)
                 {
                        shuju[m]=c.shengcheng();//将结果储存在数组里面
                        flag=c.jianyan(shuju, m);//检验是否有重复
                        if(flag==1)
                        {
                            String daan=c.shuchu();//输出式子,将答案储存在daan里面
                            System.out.print("商为:");
                            String shang=in.next();
                            System.out.print("余数为:");
                            String yushu=in.next();
                            if(daan.equals("break"))
                            {
                                break;

                            }
                            else if(daan.equals(shang+"/"+yushu))
                            {
                                System.out.println("回答正确!!!");
                            }
                            else
                            {
                             int weizhi=daan.indexOf(‘/‘);
                             shang=daan.substring(0, 1);
                             yushu=daan.substring(weizhi+1);

                            System.out.println("回答错误!!!正确答案是商"+shang+"余"+yushu);
                            }
                            m++;
                            flag=0;
                        }
                 }
                m=0;
          }
          //有括号的四则运算
          else
          {
              break;
          }
        }

    }

}

程序运行结果图:

                                                                                                项目计划总结


任务

日期(min)


听课


阅读课


编程


准备考


日总计


周日


星期一


160


60


130


星期二


20


165


185


星期三


120


120


星期四


210


240


星期五


60


60


星期六


周总计

 

时间记录日志


开始时间


结束时间


中断时间


净时间


活动


备注


3月6日


18:40


21:20


20min


140min


听课,编程


四则运算二


3月7日


19:10


21:30


10min


130min


编程


四则运算二


3月8日


19:00


21:00


10min


110min


阅读


3月9日


19:20


21:00


10min


90min


编程


四则运算二


3月10日


16:00


17:30


90min


编程


四则运算的最后修改

 

                                                                                                      错误总计


3月6日


程序死循环,在循环中法跳出


3月7日


最大公倍数和最小公约数求得不对


3月7日


程序出现分母为0的情况,一直找不到哪里错误

时间: 2024-12-30 16:03:08

小学自动生成四则运算加强版的相关文章

结对作业2——自动生成四则运算

软件结对作业三 1 选择题目 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 二.单元测试 1 代码运行结果 (1)首先展示的是代码运行成功的界面: (2)以下为加减乘除四种不同运算方式下随机产生的题目: 注:其中用户可以

用不同语言实现自动生成四则运算题目

Github项目地址:https://github.com/Aiyaxc/zuoye- 题目:用不同语言实现自动生成四则运算题目的命令行程序. (1)题目要求: a.  能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!) b. 除了整数外,还要支持真分数的四则运算  (2)思路: a.四则运算加减乘除,采用两个随机数,由于不能出现负数,所以在对两个随机数进行减法运算的时候,需要进行比较大小,而除法在运算中,除数不能取0. b.  进行真分数运算应注意假分数的影响

自动生成四则运算题目

主要功能:随机生成四则运算题目 设计思想:先通过一个简单的四则运算,再不断完善 源代码 #include"stdio.h" main(){ int a,b,c,d; printf("自动生成四则运算:\n"); printf("%d+%d= \n",a,b); printf("%d-%d= \n",a,b); printf("%d*%d= \n",a,b); printf("%d/%d= \n&q

作业二:自动生成四则运算

主要功能:本程序可以自动生成四则运算,还有选择运算法则和查看答案的功能.设计思想: 可以选择运算法则,可以随机出现计算题,可出现答案,也可直接进入下一题.源代码:#include<stdio.h> #include<stdlib.h> #include<time.h> main() { int a,b,op,os; aq1: printf("选择您想挑战的运算法则\n"); printf("1.加法 2.减法 3.乘法 4.除法\n&quo

自动生成四则运算

博主我在C语言领域还是菜鸟一枚,因此感谢博主15吕日荣 (http://www.cnblogs.com/Russelling/p/4366993.html) 的初代码. 但初代码用随机函数仅仅给出了加减乘除所需的两个运算数,包括分开运算的整数运算数和小数运算数两类,并没有做任何运算. 本人在博主自动生成四则运算的基础上增加了判断对错,累计分数的功能.让人引以为豪的是,博主能将输入的结果与计算机运算的结果相比较.例如输入的答案为 d,计算机内被除数 a,除数 b ,两者相除结果为 c,其中a,b,

20194684 + 自动生成四则运算题第一版报告

前提需求 要求:使用C或Java语言完成一个自动生成四则运算试题的程序 软件基本功能如下. 自动生成10道100以内的2个操作数的四则运算算式(+ - * /),要求运算结果也在100以内 剔除重复算式.2+3 和 2+3 是重复算式,2+3 和 3+2 不属于重复算式 题目数量可定制 相关参数可控制 是否包含乘法和除法 操作数数值范围可控 操作数是否含负数 生成的运算题存储到外部文件result.txt中 需求分析 某幼儿园,老师要每天出30道加减乘除法题目给孩子做.于是,想写一个脚本完成这件

20194653 自动生成四则运算题第一版报告

一.需求分析 需要能自动生成四则运算的程序并能控制其中的一些参数,显示在txt文件中 二.功能设计 基本功能 自动生成10道100以内的2个操作数的四则运算算式(+ - *  /),要求运算结果也在100以内 扩展功能 (1)剔除重复算式.  2 + 3 =    和  2 + 3 =     是重复算式      2 + 3 =   和   3 + 2 =  不属于重复算式 (2)题目数量可定制 (3)以下相关参数可控制 是否包含乘法和除法 操作数数值范围可控(如操作数 在100以内   还是

20194696 自动生成四则运算题第一版报告

1.需求分析: 帮助学校自动生成四则运算. 2.功能设计: (1)自动生成10道100以内的2个操作数的四则运算算式(+ - *  /),要求运算结果也在100以内 ( 2)剔除重复算式.  2 + 3 =    和  2 + 3 =     是重复算式      2 + 3 =   和   3 + 2 =  不属于重复算式 (3)题目数量可定制 (4)相关参数可控制 是否包含乘法和除法 操作数数值范围可控(如操作数 在100以内   还是1000以内) 操作数是否含负数 3.设计实现: 用C语

20194615自动生成四则运算题第一版报告

1.需求分析 使用C语言完成一个自动生成四则运算试题的程序. 2.功能设计 基本功能:随机生成10道100以内的2个操作数的四则运算算式,要求运算结果也在100以内. 扩展功能:(1)剔除重复算式 (2)定制题目数量 (3)是否选择包含乘法和除法 (4)操作数数值范围是否可控 (5)操作数是否含负数 (6)是否选择生成答案 (7)生成的运算题存储到result.txt文件中 3.设计实现 使用sign函数实现含有负数的随机算式.sum函数选择受否生成带有答案的算式,其他功能由主函数完成. 4.测