四则运算03

小组成员:

黄丽萍,杜若憧

工作照片:

设计思想:

没有括号时:

对整数’+’,’-’,’*’运算直接由用户输入结果,与计算结果进行比较。‘/’先化简再用字符串类型以最简分数的形式输出。

对分数运算:分别求出分子和分母,用simplify()函数将其化简,并用字符串类型将其以最简分数的形式输出。

有括号时:

使用新的数组rs[]储存括号计算结果,用op[]储存括号外的运算符。利用for循环,先找到‘*’,‘/’运算符将符号两边的数进行计算,将后一个数修改为0,此运算符修改为‘+’。再而计算‘+’,‘-’运算。

源代码:

import java.text.DecimalFormat;
import java.util.Scanner; public class operate { static int simplify(int x,int y){/*求两数最大公约数,用于分数化简*/ int t,xx,yy,k=1; if(x>y) { t=x;x=y;y=t; } if(x<0) { x=-1*x; } if(y<0) { y=-1*y; } for(int i=x;i>=2;i--) { xx=x%i;yy=y%i; if(xx==0&&yy==0) { k=i; break; } } return k; } public static void main(String[] args) { // TODO 自动生成的方法存根 int a1,a2,b1,b2,k; int count=0;//统计作对题目个数 /*控制题目个数*/ Scanner in=new Scanner(System.in); System.out.print("请输入题目个数(>0):"); int number=in.nextInt(); /*数值范围*/ System.out.print("请输入数值所取得最大值(>0):"); int max=in.nextInt(); /*判断括号*/ int backets; System.out.print("是否有括号:(0:无 1:有):"); backets=in.nextInt(); if(backets==0)//没有括号 { /*控制是否有负数*/ System.out.print("是否有负数:(0:无 1:有):"); int negative=in.nextInt(); /*控制是否有乘除*/ System.out.print("是否有乘除法(0:无 1:有):"); int panduan; for(;;) { panduan=in.nextInt(); if(panduan==0||panduan==1) break; else panduan=in.nextInt(); } /*有无余数*/ int remainder=0; if(panduan==1){ System.out.print("是否有余数:(0:无 1:有):"); remainder=in.nextInt();} /*算法的实现*/ for(int i=0;i<number;i++) { int index; if(panduan==0) { index=(int)(Math.random()*1); } else { index=(int)(Math.random()*4); //随机产生,控制运算符 } a1=(int)(Math.random()*max); a2=(int)(Math.random()*(max-1)+1); b1=(int)(Math.random()*max); b2=(int)(Math.random()*(max-1)+1); k=(int)(Math.random()*2); //控制是否是整数或分数,随机产生 if(k==0)//k=1输出整数运算 { if(index==0) //加法运算 { if(negative==0)//没有负数 { System.out.print(a1+"+"+b1+"="); int rs=a1+b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else //有负数 { a1=-1*a1; System.out.print(a1+"+"+b1+"="); int rs=a1+b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==1)//减法运算 { if(negative==0) {//无负数 if(a1>b1) { System.out.print(a1+"-"+b1+"="); int rs=a1-b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else { System.out.print(b1+"-"+a1+"="); int rs=b1-a1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else//有负数 { System.out.print(a1+"-"+b1+"="); int rs=a1-b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==2)//乘法运算 { System.out.print(a1+"*"+b1+"="); int rs=a1*b1; int result=in.nextInt(); if(result==rs) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } if(index==3)//除法运算 { if(remainder==0) {//没有余数 for(int kk=0;;) { //余数不为0.继续生成随机数 if(a1!=0) { //判断分母是否为0 if(b1%a1!=0) { a1=(int)(Math.random()*max); b1=(int)(Math.random()*max); } else break; } else a1=(int)(Math.random()*max);} } System.out.print(b1+"/"+a1+"="); String rs; if(b1==0) { rs=0+"";//结果为0,不需要化简 } int cd=simplify(b1,a1); b1=b1/cd;a1=a1/cd; if(a1==1) { rs=b1+""; } else { rs=b1+"/"+a1; } String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else//分数计算 { int s2=simplify(a1,a2); a1=a1/s2; a2=a2/s2; int s3=simplify(b1,b2); b1=b1/s3; b2=b2/s3; if(index==0) { if(negative==0) //没有负数 { /*分母不为1,分情况输出*/ if(a2!=1&&b2!=1) { System.out.println(a1+"/"+a2+"+"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b2+b1*a2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"+"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b2+b1;//分子 int cd=simplify(molecule,denom);//最大公约数 String rs; denom=denom/cd; molecule=molecule/cd; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"+"+b1+"="); int denom=a2; //分母 int molecule=a1+b1*a2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else{//有负数 if(a2!=1&&b2!=1) { System.out.print("-"+a1+"/"+a2+"+"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=b1*a2-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print("-"+a1+"+"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=b1-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print("-"+a1+"/"+a2+"+"+b1+"="); int denom=a2; //分母 int molecule=b1*a2-a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } if(index==1) { if(a1/a2>=b1/b2) {/*分类输出:分母是否为1*/ if(a2!=1&&b2!=1) { System.out.print(a1+"/"+a2+"-"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b2-a2*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"-"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b2-b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"-"+b1+"="); int denom=a2; //分母 int molecule=a1-a2*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } else{ if(a2!=1&&b2!=1) { System.out.print(b1+"/"+b2+"-"+a1+"/"+a2+"="); int denom=a2*b2; //分母 int molecule=b1*a2-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(b1+"/"+b2+"-"+a1+"="); int denom=b2; //分母 int molecule=b1-a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(b1+"-"+a1+"/"+a2+"="); int denom=a2; //分母 int molecule=b1*a2-a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } if(index==2)//分数乘法 { if(a2!=1&&b2!=1) { System.out.println(a1+"/"+a2+"*"+b1+"/"+b2+"="); int denom=a2*b2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1) { System.out.print(a1+"*"+b1+"/"+b2+"="); int denom=b2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1) { System.out.print(a1+"/"+a2+"*"+b1+"="); int denom=a2; //分母 int molecule=a1*b1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } if(index==3)//分数除法 { if(a2!=1&&b2!=1) { for(int kk=0;;) { //余数不为0.继续生成随机数 if(b1==0) { //判断分母是否为0 b1=(int)(Math.random()*max); } else break; } System.out.print("("+a1+"/"+a2+")"+"/"+"("+b1+"/"+b2+")"+"="); int denom=a2*b1; //分母 int molecule=a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(molecule==0) { rs=0+""; } if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(a2==1&&a1!=0) { System.out.print(a1+"/"+"("+b1+"/"+b2+")"+"="); int denom=b1; //分母 int molecule=a1*b2;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } else if(b2==1&&b1!=0) { System.out.print("("+a1+"/"+a2+")"+"/"+b1+"="); int denom=a2*b1; //分母 int molecule=a1;//分子 int cd=simplify(molecule,denom);//最大公约数 denom=denom/cd; molecule=molecule/cd; String rs; if(denom==1) { rs=molecule+""; } else rs=molecule+"/"+denom;//化简结果 String result=in.next(); if(result.equals(rs)) { count+=1; System.out.println("回答正确!"); } else { System.out.println("回答错误!"); } System.out.println("正确结果是"+rs); } } } } }     else//有括号
        {
            int szgs,fhgs,x,z,y;//szgs数字个数 fhgs符号个数
            double result;//结果    
            int sz[]=new int[20];//数字数组
            char fh[]=new char[10];//字符数组
            char operate[]={'+','-','*','/'};
            for(int p=0;p<number;p++)
            {
                szgs=(int)(Math.random()*6+3);//生成3-4个数字
                fhgs=szgs-1;//字符个数比数字少1
                float rs[]=new float[20];
                float c;String s;
                char op[]=new char[10];//储存字符
                for(y=0;y<szgs;y++)
                {
                    sz[y]=(int)(Math.random()*max+1);//随机生成数
                }
                for(y=0;y<fhgs;y++)
                {
                    x=(int)(Math.random()*4);//产生0~3的随机数  控制字符
                    fh[y]=operate[x];
                }
                fh[fhgs]='=';
                if(fhgs%2==0)//偶数个运算符
                {
                    System.out.print(sz[0]);System.out.print(fh[0]);    
                    rs[0]=sz[0];op[0]=fh[0];
                    int d=1;
                    for(y=1;y<fhgs;y++)
                    {
                        System.out.print("(");
                        if(fh[y]=='/'||fh[y]=='-') //判断是否是真分数和负数
                        {
                            if(sz[y]<sz[y+1])
                            {//交换
                                int temp;
                                temp=sz[y];
                                sz[y]=sz[y+1];
                                sz[y+1]=temp;
                                System.out.print(sz[y]);
                                System.out.print(fh[y]);
                                System.out.print(sz[y+1]);
                            }
                            else
                            {
                                System.out.print(sz[y]);
                                System.out.print(fh[y]);
                                System.out.print(sz[y+1]);
                            }
                         }
                         else
                         {
                             System.out.print(sz[y]);
                             System.out.print(fh[y]);
                             System.out.print(sz[y+1]);        
                         }
                         System.out.print(")");    
                         if(fh[y]=='+')
                         {
                             rs[d]=sz[y]+sz[y+1];
                         }
                         else if(fh[y]=='-')
                         {
                             rs[d]=sz[y]-sz[y+1];
                         }
                         else if(fh[y]=='*')
                         {
                            rs[d]=sz[y]*sz[y+1];
                            
                         }
                         else if(fh[y]=='/')
                         {
                             c=(float)sz[y]/sz[y+1];
                             DecimalFormat df = new DecimalFormat("0.00");//格式化小数   
                             s = df.format(c);//返回的是String类型
                             rs[d] = Float.valueOf(s);
                         }
                         System.out.print(fh[y+1]);
                         op[d]=fh[y+1];
                         y=y+1;     
                         d=d+1;
                 }
                  //先算乘除
                for(d=0;d<fhgs/2;d++)
                {
                    if(op[d]=='*')
                    {
                        rs[d]=rs[d]*rs[d+1];
                        rs[d+1]=0;
                        op[d]='+';
                    }
                    if(op[d]=='/')
                    {
                         c=(float)rs[d]/rs[d+1];
                         DecimalFormat df = new DecimalFormat("0.00");//格式化小数   
                         s = df.format(c);//返回的是String类型
                         rs[d] = Float.valueOf(s);
                         rs[d+1]=0;
                         op[d]='+';
                    }
                    
                }
                float sum=rs[0];
                //后算加减
                for(int ii=0;ii<fhgs/2;ii++)
                {
                    if(op[ii]=='+')
                    {
                        sum=sum+rs[ii+1];
                    }
                    if(op[ii]=='-')
                    {
                        sum=sum-rs[ii+1];
                    }
                }
                result=in.nextDouble();
                if(result==sum)
                {
                    System.out.println("回答正确!");
                    count++;
                }
                else
                    System.out.println("回答错误!");
                 System.out.println("正确结果:"+sum);
           }
           else//奇数运算符
           {
               int id=0;
               for(y=0;y<fhgs;y++)
               {
                   System.out.print("(");
                   if(fh[y]=='/'||fh[y]=='-') //判断是否是真分数和负数
                   {
                       if(sz[y]<sz[y+1])
                       {
                           int temp;
                           temp=sz[y];
                           sz[y]=sz[y+1];
                           sz[y+1]=temp;
                           System.out.print(sz[y]);
                           System.out.print(fh[y]);
                           System.out.print(sz[y+1]);
                       }
                       else
                       {
                           System.out.print(sz[y]);
                           System.out.print(fh[y]);
                           System.out.print(sz[y+1]);
                       }
                    }
                    else
                    {                    
                        System.out.print(sz[y]);
                        System.out.print(fh[y]);
                        System.out.print(sz[y+1]);
                    }
                    System.out.print(")");
                    //计算括号里的结果
                    if(fh[y]=='+')
                    {
                        rs[id]=sz[y]+sz[y+1];
                    }
                    else if(fh[y]=='-')
                    {
                        rs[id]=sz[y]-sz[y+1];
                    }
                    else if(fh[y]=='*')
                    {
                        rs[id]=sz[y]*sz[y+1];
                    }
                    else if(fh[y]=='/')
                    {
                         c=(float)sz[y]/sz[y+1];
                         DecimalFormat df = new DecimalFormat("0.00");//格式化小数   
                         s = df.format(c);//返回的是String类型
                         rs[id] = Float.valueOf(s);
                    }
                    System.out.print(fh[y+1]);
                    op[id]=fh[y+1];
                    y=y+1;
                    id=id+1;
                }
               
                //先算乘除
                for(id=0;id<fhgs/2;id++)
                {
                    if(op[id]=='*')
                    {
                        rs[id]=rs[id]*rs[id+1];
                        rs[id+1]=0;
                        op[id]='+';
                    }
                    if(op[id]=='/')
                    {
                         c=(float)rs[id]/rs[id+1];
                         DecimalFormat df = new DecimalFormat("0.00");//格式化小数   
                         s = df.format(c);//返回的是String类型
                         rs[id] = Float.valueOf(s);
                         rs[id+1]=0;
                         op[id]='+';
                    }
                    
                }
                float sum=rs[0];
                //后算加减
                for(int ii=0;ii<fhgs/2;ii++)
                {
                    if(op[ii]=='+')
                    {
                        sum=sum+rs[ii+1];
                    }
                    if(op[ii]=='-')
                    {
                        sum=sum-rs[ii+1];
                    }
                }
                result=in.nextDouble();    
                if(result==sum)
                {
                    System.out.println("回答正确!");
                    count=count+1;
                }
                else
                    System.out.println("回答错误!");
                System.out.println("正确结果:"+sum);
          }
         }
                    
        }
        System.out.println("计算正确的个数:"+count);
    }
}

    

 实验结果截图:

                                                                                            周活动总结表

                                                                  姓名:杜若憧                            日期 2016/3/25

听课

编写代码

阅读课本

准备考试

日总计

周日

周一

100

40

140

周二

48

48

周三

40

30

周四

50

50

周五

30

30

周六

77

77

周总计

100

245

30

375

                                                                                      时间记录日志

                   学生:杜若憧                    日期:2016/3/25

          教师:王建民                    课程:软件工程

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/21

8:00

9:50

10

100

听课

理论学时,课件

18:50

20:30

15

85

看书

看《构建之法》

3/22

18:55

20:55

20

90

编程序

查资料,休息

3/23

16:30

17:30

60

讨论,编程序

讨论,共同写程序

19:00

19:30

30

看书

3/24

15:30

18:00

30+10

110

编程序

作业,拿快递,玩手机

3/25

16:30

18:00

15

75

编程序

休息

3/26

8:45

10:21

96

编程序写报告

                      

  缺陷记录日志

                           学生:杜若憧

                      日期:2016/3/25

                      教员:王建民

                      程序号:四则运算3

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/25

1

编码

编译

10min

描述:负数分数运算输出的结果化简失败

2

编码

编译

10min

描述:分数除法运算,第二个分数分母=0,导致计算结果错误,

3

编码

1min

描述:分数计算为0,不需要化简

4

编码

编译

60min

描述:有多个括号时,计算不出结果

原文地址:https://www.cnblogs.com/java-test/p/5322393.html