(java) 四则运算(三)

要求:

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
简化分数,想以函数方法简化程序,未成功

时间: 2024-10-23 12:43:24

(java) 四则运算(三)的相关文章

四则运算三

上次的作业,四则运算三,在以前的基础上又有了新的需求.算术题目中不能产生复数,也就是所算术表达式如果有形如e1-e2的子表达式,那么e1>e2 .而且除法的结果可以表示为真分数或者带分数,每道题目不超过三个运算符.而且一次程序运行的结果不能产生重复的表达式,即任何两道题目不能通过有限次的加法交换和乘法交换变成统一到题目(其实我觉得如果两个表达式需要经过加法交换或者乘法交换变成同一道题,那么这两个题也不是重复的题目呀,因为这还需要涉及到交换律呀!).最重要的是需要连接数据库,计算答案和判定对错.

Java四则运算表达式求解

压栈思想计算Java运算表达式 栈的规则是先进后出.利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字.一个用来存放对应的操作符.假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符.或者就是括号了.然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶. (2)遇到运算符(+-*/)时,若操作符栈为空,则直接放到操作符栈顶,否则,见(3). (3)若操作符栈顶

Java进阶(三十四)Integer与int的种种比较你知道多少?

Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值为0,Ingeter的初值为null.但是如果面试官再问一下Integer i = 1;int ii = 1; i==ii为true还是为false?估计就有一部分人答不出来了,如果再问一下其他的,估计更多的人会头脑一片混乱.所以我对它们进行了总结,希望对大家有帮助. 首先看代码: package

Java分为三个体系

Java是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由JamesGosling和同事们共同研发,并在1995年正式推出. Java分为三个体系: JavaSE(J2SE)(Java2PlatformStandardEdition,java平台标准版) JavaEE(J2EE)(Java2Platform,EnterpriseEdition,java平台企业版) JavaME(J2ME)(Java2PlatformMicroEdit

Java第三章 P72 输出”欢迎你,青“ 否则输出”对不起,你不是青“

import java.util.*; public class If { public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); System.out.println("请输入用户:"); String name =in.next(); System.out.println("请输入密码:");

Java的三种代理模式简述

本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class Singer{ 2 public void sing(){ 3 System.out.println("唱一首歌"); 4 } 5 } 假如你希望,通过你的某种

Java进阶(三十五)java int与integer的区别

Java进阶(三十五)java int与integer的区别 前言 int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象. 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前者而integer 是后者(也就是一个类):因此在类进行初始化时int类的变量初始为0.而Integer的变量则初始化为null. 2.初始化时: int i =1; Integer i= new In

学习 java netty (三) -- Channel

学习 java netty (三) – Channel 前言:netty封装的channel,看一下官网的定义 A nexus to a network socket or a component which is capable of I/O operations such as read, write, connect, and bind. 可以I/O操作(如读,写,连接和绑定)的连网套接字或组件 A channel provides a user: All I/O operations a

java多线程三之线程协作与通信实例

多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition.     附加 : 用监视器进行线程间通信 2.生产者消费者实现,使用LinkedList自写缓冲区. 3.多线程之阻塞队列学习,用阻塞队列快速实现生产者消费者模型.    附加:用布尔变量关闭线程        在三种线程同步方法中,我们这里的实例用Lock锁来实现变量同步,因为它比较灵活直观.

201671010117 2016-2017-2 《Java程序设计》Java第三周学习心得

Java第三周学习心得 通过这一周的学习,了解到了Java的核心部分,理解了用户自定义类的定义 ,了解了对象的声明 ,了解了使用构造函数初始化对象 ,使用类属性与方法的使用,了解了package和import语句的用途,知道了假设你面对现实世界的一个对象,你不会把它的属性和处理方法分开,程序设计也是一样.面向对象程序设计(OOP):一种新的思维方法,更接近人类处理现实世界问题的自然表示方法.面向对象的语言有:C++,Smalltalk,Java等.面向对象程序设计的几个主要概念:抽象数据类型.类