四则运算3

要求:

1、学生写的程序必须能判定用户的输入答案是否正确,
例如程序输出:20 – 5 = ?用户输入15,那么程序就会反馈正确,然后继续出题。直到 30 道题目结束,程序最后告诉用户作对了几道题。
2、程序必须能处理四种运算的混合算式;
20 – 5 * 2 =?           正确答案是10.
20– 5 * 2 + 9 / 3 = ?   正确答案是13

思路:

在(二)基础上改进

1、定义 SIZE 打印题数

2、定义是否有乘除法(用以改变随机符号范围)

3、定义加减有无负数(用以改变加减符号状况下,数值的范围)

4、定义除法有无余数(用除数*整数商 得到被除数,算式就写被除数/除数)

5、(此为添加的函数)输出字符串(算式答案),目的用于比较用户输入的是否相同

    分为加减乘除四种情况,总体计算方法为:若为整数,则分母为1 。最终将以分数来进加     减乘除,然后化简。

6、用for循环生成题目for(int i=0;i<SIZE;i++)

    1、输入相关变量(有无负数、有无余数、有无乘除法、数值范围)

    2、生成符号

    3、生成第一个数

    4、生成第二个数(若要求除法无余数,就在此定义第一个数)

    5、得出算式 第一个数+符号+第二个数+=

      其中需要用for循环来排除重复的(若重复,则 i-1,退出此循环,重新再大循环一次)

        6、进行比较,列出正确性。

6、输出,总结正确与错误的个数

(有无乘除 将影响是否显示 除法有无余数 的选项)

import java.util.Scanner;
public class operations3 {
    public static int SIZE(int size)//定制数量
    {
        int s;
        s=size;
        return s;
    }
    
    public static int MultiplyDivide(String p1)//是否有乘除法
    {
        int m = 4;
        if(p1.equals("Y")){m=4;}
        if(p1.equals("N")){m=2;}
        return m;
    }
    
    public static String Negative(String p2)//加减有无负数
    {
        String n;
        n=p2;
        return n;
    }
    
    public static String Remainder(String p3)//除法有无余数
    {
        String r;
        r=p3;
        return r;
    }
    
    public static int Max(int max)//最大数
    {
        int m;
        m=max;
        return m;
    }
    public static int Min(int min)//最小数
    {
        int m;
        m=min;
        return m;
    }
    
    
    public static String Compare(int nup1,int ndown1,int nup2,int ndown2,int mid)//答案
    {
        String n=new String();
        int nup3=1,ndown3=1;
        if(ndown1==-99999)
        {
            ndown1=1;
        }
        if(ndown2==-99999)
        {
            ndown2=1;
        }
        
        if(mid==0)//
        {
            ndown3=ndown1*ndown2;
            nup3=nup1*ndown2+nup2*ndown1;
        }
        if(mid==1)//
        {
            ndown3=ndown1*ndown2;
            nup3=nup1*ndown2-nup2*ndown1;
        }
        if(mid==2)//
        {
            ndown3=ndown1*ndown2;
            nup3=nup1*nup2;
        }
        if(mid==3)//
        {
            int nd=nup2;
            nup2=ndown2;
            ndown2=nd;
            
            ndown3=ndown1*ndown2;
            nup3=nup1*nup2;
        }
        
        //化简
        int z1=Math.abs(nup3),z2=Math.abs(ndown3);
        int chushu=2;
        if(z1>z2)
        {
            while(z2>=chushu)
            {
                if(z1%chushu==0&&z2%chushu==0)
                {z1=z1/chushu;z2=z2/chushu;}
                else
                {chushu++;}
            }
            
        }
        else if(z1<z2)
        {
            while(z1>=chushu)
            {
                if(z1%chushu==0&&z2%chushu==0)
                {z1=z1/chushu;z2=z2/chushu;}
                else
                {chushu++;}
            }
        }
        else
        {
            z1=1;z2=1;
        };
        if(nup3<0){nup3=0-z1;}
        else {nup3=z1;}
        if(ndown3<0){ndown3=0-z2;}
        else {ndown3=z2;}
        //化简
        
        if(ndown3==1)
        {
            n=nup3+"";
        }
        else if(ndown3==-1)
        {
            nup3=0-nup3;
            n=nup3+"";
        }
        else
        {
            if((nup3<0&&ndown3<0)||(nup3>0&&ndown3<0))
            {
                nup3=0-nup3;
                ndown3=0-ndown3;
            }
            n=nup3+"/"+ndown3+"";
        }
        return n;
    }
    
    public static void Work(int MultiplyDivide,String Negative,String Remainder,int Max,int Min,int SIZE)//算式计算
    {
        String Again[][]=new String[SIZE][1];//用数组装算式,用以判断是否重复
        int Count1=0;//计数正确
        int Count2=0;//计数错误
        for(int i=0;i<SIZE;i++)//重复次数,用以确定算式多少
        {        
        int cha=Max-Min;
        int mid,nup1 =1,ndown1=1,nup2=1,ndown2=1;
        String s1=new String();
        String s2=new String();
        String suanshi=new String();
        
        String fuhao=new String();//符号判定
        mid=(int)(Math.random()*MultiplyDivide);
        if(mid==0) fuhao="+";
        if(mid==1) fuhao="-";
        if(mid==2) fuhao="*";
        if(mid==3) fuhao="/";
        
        for(int j=0;j<2;j++)//两次循环,第一次为第一个数字,第二次为第二个数字
        {
            int n1 =-99999,n2=-99999;//用于后面是否为分数的判定
            int s=(int)(Math.random()*2);//随机数判定整数或分数,0->整数,1->分数
            if(s==0)//整数
            {
                if(Negative.equals("N"))
                {
                    if(mid==0||mid==1)
                    {
                        while(n1<0)
                        {n1=(int)(Min+Math.random()*(cha+1));}
                    }
                    else
                    {
                        n1=(int)(Min+Math.random()*(cha+1));
                    }
                }
                if(Negative.equals("Y"))
                {n1=(int)(Min+Math.random()*(cha+1));}
            }
            if(s==1)//分数
            {
                n1=(int)(Min+Math.random()*(cha+1));
                n2=(int)(Min+Math.random()*(cha+1));
                    if(Negative.equals("N"))
                    {
                        if(mid==0||mid==1)
                        {
                            while(n1<=0||n2<=0)
                            {
                                n1=(int)(Min+Math.random()*(cha+1));
                                n2=(int)(Min+Math.random()*(cha+1));
                            }
                        }
                        else
                        {
                            while(n1==0||n2==0)
                            {
                            n1=(int)(Min+Math.random()*(cha+1));
                            n2=(int)(Min+Math.random()*(cha+1));
                            }
                        }
                    }
                    if(Negative.equals("Y"))
                    {
                        while(n1==0||n2==0)
                        {
                        n1=(int)(Min+Math.random()*(cha+1));
                        n2=(int)(Min+Math.random()*(cha+1));
                        }
                    }
                    int z1=Math.abs(n1),z2=Math.abs(n2);
                    int chushu=2;
                    if(z1>z2)
                    {
                        while(z2>=chushu)
                        {
                            if(z1%chushu==0&&z2%chushu==0)
                            {z1=z1/chushu;z2=z2/chushu;}
                            else
                            {chushu++;}
                        }
                        
                    }
                    else if(z1<z2)
                    {
                        while(z1>=chushu)
                        {
                            if(z1%chushu==0&&z2%chushu==0)
                            {z1=z1/chushu;z2=z2/chushu;}
                            else
                            {chushu++;}
                        }
                    }
                    else
                    {
                        z1=1;z2=1;
                    };
                    if(n1<0){n1=0-z1;}
                    else {n1=z1;}
                    if(n2<0){n2=0-z2;}
                    else {n2=z2;}
            }
            if(j==0)//第一个数字
            {
                nup1=n1;ndown1=n2;
                if(ndown1==-1&&nup1<0)
                {nup1=Math.abs(nup1);}
                if(ndown1==-1&&nup1>0)
                {nup1=0-nup1;}
                if(ndown1>-99999)//如果存在分母,则为分数
                {
                    if(Math.abs(ndown1)!=1)
                    {
                        if(nup1<0&&ndown1<0)
                        {nup1=Math.abs(nup1);ndown1=Math.abs(ndown1);}
                        if(ndown1<0)
                        {s1="("+nup1+"/("+ndown1+"))"+"";}
                        else
                        {s1="("+nup1+"/"+ndown1+")"+"";}
                    }
                    if(Math.abs(ndown1)==1)//否则为整数
                    {
                        if(nup1>=0)
                        {s1=nup1+"";}
                        if(nup1<0)
                        {s1="("+nup1+")"+"";}
                    }
                }
                
                else//否则为整数
                {
                    if(nup1>=0)
                    {s1=nup1+"";}
                    if(nup1<0)
                    {s1="("+nup1+")"+"";}
                }
            }
            if(j==1)//第二个数字
            {
                nup2=n1;ndown2=n2;
                if(mid==3)//当为除法时,除数不能为0,
                {
                    while(nup2==0)
                    {nup2=(int)(Min+Math.random()*(cha+1));}//分子或整数不能为0
                }
                if(ndown2==-1&&nup2<0)
                {nup2=Math.abs(nup2);}
                if(ndown2==-1&&nup2>0)
                {nup2=0-nup2;}
                if(ndown2>-99999)//如果存在分母,则为分数
                {
                    if(Math.abs(ndown2)!=1)
                    {
                        if(nup2<0&&ndown2<0)
                        {nup2=Math.abs(nup2);ndown2=Math.abs(ndown2);}
                        if(ndown2<0)
                        {s2="("+nup2+"/("+ndown2+"))"+"";}
                        else
                        {s2="("+nup2+"/"+ndown2+")"+"";}
                    }
                    else
                    {
                        if(nup2<0)
                        {
                            s2="("+nup2+")"+"";
                        }
                        if(nup2>0)
                        {
                            s2=nup2+"";
                        }
                    }
                }
                else//否则为整数
                {
                    if(nup2<0)
                    {
                        s2="("+nup2+")"+"";
                    }
                    if(nup2>0)
                    {
                        s2=nup2+"";
                    }
                }
                if(mid==3&&Remainder.equals("N"))
                {
                    nup1=nup2*n1;ndown1=ndown2;
                    if(ndown1%n1==0)
                    {ndown1=ndown1/n1;nup1=nup1/n1;}
                    if(ndown1>-99999)//如果存在分母,则为分数
                    {
                        if(Math.abs(ndown1)!=1)
                        {s1="("+nup1+"/"+ndown1+")"+"";}
                        else//否则为整数
                        {
                            s1=nup1+"";
                        }
                    }
                    else//否则为整数
                    {
                        s1=nup1+"";
                    }
                    
                }
            }
        }
        
        suanshi=suanshi+s1+fuhao+s2+"=";//算式
        Again[i][0]=suanshi;
        for(int k=0;k<(i+1);k++)
        {
            if(Again[i][0].equals(Again[k][0])){k--;break;}
        }
        System.out.print(suanshi);
        String Daan=Compare(nup1,ndown1,nup2,ndown2,mid);
        
        Scanner Shuru=new Scanner(System.in);
        String Answer=Shuru.next();
        if(Answer.equals(Daan))
        {
            System.out.println("正确");
            Count1++;
        }
        else
        {
            System.out.println("错误,正确答案为:"+Daan);
            Count2++;
        }
        }
        System.out.println("一共"+SIZE+"道题,其中正确:"+Count1+"道,错误:"+Count2+"道");
    }
    
    public static void main(String args[])
    {
        String p3="Y";
        Scanner pan=new Scanner(System.in);
        System.out.println("请输入定制数量:");
        int size=pan.nextInt();
        System.out.println("是否有乘除法,Y--有,N--没有");
        String p1=pan.next();
        System.out.println("加减有无负数,Y--有,N--没有");
        String p2=pan.next();
        if(p1.equals("Y"))
        {
            System.out.println("除法有无余数,Y--有,N--没有");
            p3=pan.next();
        }
        System.out.println("请输入数值范围最大值:");
        int max=pan.nextInt();
        System.out.println("请输入数值范围最小值:");
        int min=pan.nextInt();
        
        int zhi=SIZE(size);
        int a=MultiplyDivide(p1) ;
        String b=Negative(p2);
        String c=Remainder(p3);
        int d=Max(max);
        int e=Min(min);
        
        Work(a,b,c,d,e,zhi);
        
    }
}

结果截图:

【项目计划总结表】

项目计划总结表(2016/3/19)

  任 务

(日 期)

听课 编写程序 阅读课本 准备考试 日总计
周日          
周一 100 120     220
周二     90   90
周三          
周四    60     60
周五      30    30
周六   240  60   300
周总计 100 420 120   640

【时间记录日志】

日期 开始时间 结束时间 中断时间 净时间 活动 备注
2016/3/21 8:00 8:50   50 上课  
  9:00 9:50   50 上课  
  14:00 16:00   120 编程序 单元测试
2016/3/22 15:00 16:00   60 看书 java编程
  19:00 19:30   30 看书 构建之法
2016/3/24 15:00 16:00   60 编程序 四则运算
2016/3/25 19:00 19:30   30 看书  
2016/3/26 10:00 11:30 30min 60 看书  构建之法
  13:00 17:30 30min 240 编程序  

【缺陷记录日志】

日期 编号 引入阶段 排除阶段 修复时间 问题描述
2016/3/26 1 编程 改进代码 2016/3/26

简化分数,想以函数方法简化程序,未成功

 

原文地址:https://www.cnblogs.com/maplely/p/5323671.html