软件工程个人作业02

小组成员:杨茵,严羽卿

设计思想:

1.框架为:首先输入需要出题的数量,再选择是分数运算,整数运算;进入分数运算第一步输入数值的范围,运行即可(真分数,假分数必须化简);进入整数运算后,第一步输入数值的范围,然后选择是否需要括号;进入有括号后,随机产生题目;进入无括号后,需要选择是否需要乘除法,除法中是否需要余数,加减法是否需要负数;     

2.在加减法中控制有无负数,使用随机数控制,0产生正数,1

 产生负数;

3.选择除法是否有余数,先随机产生除数,若需要产生余数,则

 被除数=除数*n+kk为大于0小于除数的正整数);若不需要,

 则被除数=除数*n

4.有括号(最多可以支持十个数参与计数),将操作数压入动态数组al1中,将运算符压入动态数组al2中;通过循环输出数组信息,首先输出操作数,然后输出运算符;一对运算符中,第一个运算符和第二个运算符进行优先级的比较,若第一个的优先级小于等于第二个,则不加括号;若第一个优先级大于第二个,则在第二个运算符前后加括号。

代码:

 

import java.util.Scanner;
import java.util.ArrayList;
public class Test {
    public static void main(String[] args){
        int N,i,N1,N2;
        String hh;    
        Scanner in=new Scanner(System.in);    
        System.out.println("请输入需要打印的运算题的数目:");
        N=in.nextInt();
        System.out.println("请选择是否需要分数运算(Y/N):");
        hh=in.next();
        if(hh.equals("Y"))//分数运算
        {
            for(i=0;i<N;i++)
            {
                int a,b,c,d,r1,r2;
                a=(int) (Math.random()*100);
                b=(int) (Math.random()*99+1);
                //分母不等于0
                c=(int) (Math.random()*100);
                d=(int) (Math.random()*99+1);
                int h=(int)(Math.random()*4);
                int aa=0,bb=0,cc=0,dd=0;
                //为了产生分数,分子也不可为零
                if(a==0)
                    a=(int) (Math.random()*99+1);
                if(c==0)
                    c=(int) (Math.random()*99+1);
                if(a>b)
                    r1=b;
                else
                    r1=a;
                //化简分数
                for(int j=1;j<=r1;j++)
                {
                    if(a%j==0&&b%j==0)
                    {
                        aa=a/j;
                        bb=b/j;
                    }
                }
                if(c>d)
                    r2=d;
                else
                    r2=c;
                //化简分数
                for(int j=1;j<=r2;j++)
                {
                    if(c%j==0&&d%j==0)
                    {
                        cc=c/j;
                        dd=d/j;
                    }
                }
                if(h==0)
                {
                    //化简后,分母等于1时,直接输出分子
                    if(bb!=1&&dd!=1)
                        System.out.println(aa+"/"+bb+" + "+cc+"/"+dd+"=");
                    else if(bb==1&&dd!=1)
                        System.out.println(aa+" + "+cc+"/"+dd+"=");
                    else if(bb!=1&&dd==1)
                        System.out.println(aa+"/"+bb+" + "+cc+"=");
                    else
                        System.out.println(aa+"+"+cc+"=");
                }
                else if(h==1)
                {
                    //不能产生负数
                    int t1,t2;
                    if((a/b-c/d)<0)
                    {
                        t1=aa;
                        aa=cc;
                        cc=t1;
                        t2=bb;
                        bb=dd;
                        dd=t2;
                    }
                    //化简后,分母等于1时,直接输出分子    
                    if(bb!=1&&dd!=1)
                        System.out.println(aa+"/"+bb+" - "+cc+"/"+dd+"=");
                    else if(bb==1&&dd!=1)
                        System.out.println(aa+" - "+cc+"/"+dd+"=");
                    else if(bb!=1&&dd==1)
                        System.out.println(aa+"/"+bb+" - "+cc+"=");
                    else
                        System.out.println(aa+"-"+cc+"=");
                }
                else if(h==2)
                {
                    //化简后,分母等于1时,直接输出分子
                    if(bb!=1&&dd!=1)
                        System.out.println(aa+"/"+bb+" * "+cc+"/"+dd+"=");
                    else if(bb==1&&dd!=1)
                        System.out.println(aa+" * "+cc+"/"+dd+"=");
                    else if(bb!=1&&dd==1)
                        System.out.println(aa+"/"+bb+" * "+cc+"=");
                    else
                        System.out.println(aa+"*"+cc+"=");
                }
                else
                { 
                    //化简后,分母等于1时,直接输出分子
                    if(bb!=1&&dd!=1)
                        System.out.println(aa+"/"+bb+" / "+cc+"/"+dd+"=");
                    else if(bb==1&&dd!=1)
                        System.out.println(aa+" / "+cc+"/"+dd+"=");
                    else if(bb!=1&&dd==1)
                        System.out.println(aa+"/"+bb+" / "+cc+"=");
                    else
                        System.out.println(aa+"/"+cc+"=");
                }
            }
        }
        else if(hh.equals("N"))//整数运算
        {
            System.out.println("请选择是否需要产生括号的运算题(Y/N):");
            String str,str1,str2,str3;
            str=in.next();
            
            if(str.equals("Y"))
            {
                System.out.println("请输入数值范围:");
                N1=in.nextInt();
                for(i=0;i<N;i++)
                {
                    ArrayList<Integer> al1=new ArrayList<Integer>();
                    //申请动态数组存放操作数
                    ArrayList<Integer> al2=new ArrayList<Integer>();
                    //申请动态数组存放运算符
                    int m,n,a,b;
                    int j,k;
                    m=(int) (Math.random()*7+3);
                    //限制操作数个数
                    n=m-1;
                    //运算符个数
                    for(j=0;j<m;j++)
                    {
                        a=(int) (Math.random()*(N1-1)+1);
                        al1.add(a);
                    }//将操作数压入al1数组
                    
                    for(k=0;k<n;k++)
                    {
                        b=(int) (Math.random()*4);
                        al2.add(b);
                    }//将运算符压入al2数组
                    if(m==3)//产生的操作数是3个
                    {
                        if((int)al2.get(0)>(int)al2.get(1))//比较优先级
                        {
                            if((int)al2.get(0)==1)
                                System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"+"+(int)al1.get(2));
                            else if((int)al2.get(0)==2)
                            {
                                if((int)al2.get(1)==0)
                                System.out.print((int)al1.get(0)+"*"+"("+(int)al1.get(1)+"+"+(int)al1.get(2)+")");
                                else if((int)al2.get(1)==1)
                                    System.out.print((int)al1.get(0)+"*"+"("+(int)al1.get(1)+"-"+(int)al1.get(2)+")");
                            }
                            else if((int)al2.get(0)==3)
                            {
                                if((int)al2.get(1)==0)
                                System.out.print((int)al1.get(0)+"/"+"("+(int)al1.get(1)+"+"+(int)al1.get(2)+")");
                                else if((int)al2.get(1)==1)
                                    System.out.print((int)al1.get(0)+"/"+"("+(int)al1.get(1)+"-"+(int)al1.get(2)+")");
                                if((int)al2.get(1)==2)
                                    System.out.print((int)al1.get(0)+"/"+(int)al1.get(1)+"*"+(int)al1.get(2));
                            }
                        }
                        else if((int)al2.get(0)<(int)al2.get(1)||(int)al2.get(0)==(int)al2.get(1))//比较优先级
                        {
                            if((int)al2.get(0)==0)
                            {
                                if((int)al2.get(1)==0)
                                    System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"+"+(int)al1.get(2));
                                else if((int)al2.get(1)==1)
                                    System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"-"+(int)al1.get(2));
                                else if((int)al2.get(1)==2)
                                    System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"*"+(int)al1.get(2));
                                else if((int)al2.get(1)==3)
                                    System.out.print((int)al1.get(0)+"+"+(int)al1.get(1)+"/"+(int)al1.get(2));
                            }
                            else if((int)al2.get(0)==1)
                            {
                                if((int)al2.get(1)==1)
                                    System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"-"+(int)al1.get(2));
                                else if((int)al2.get(1)==2)
                                    System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"*"+(int)al1.get(2));
                                else if((int)al2.get(1)==3)
                                    System.out.print((int)al1.get(0)+"-"+(int)al1.get(1)+"/"+(int)al1.get(2));
                            }
                            else if((int)al2.get(0)==2)
                            {
                                if((int)al2.get(1)==2)
                                    System.out.print((int)al1.get(0)+"*"+(int)al1.get(1)+"*"+(int)al1.get(2));
                                else if((int)al2.get(1)==3)
                                    System.out.print((int)al1.get(0)+"*"+(int)al1.get(1)+"/"+(int)al1.get(2));
                            }
                            else if((int)al2.get(0)==3)
                            {
                                System.out.print((int)al1.get(0)+"/"+(int)al1.get(1)+"/"+(int)al1.get(2));
                            }
                        }
                        System.out.print("=");
                        System.out.println();
                    }
                    else if(m>=4)//产生的操作大于等于4个
                    {
                        for(j=0;j<al2.size()-2;j=j+2)//输出运算表达式
                        {
                            k=j;
                            if((int)al2.get(j)>(int)al2.get(j+1))//比较运算符优先级
                            {
                                if((int)al2.get(j)==1)//第一个出现减法
                                    System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"+"+(int)al1.get(k+2));
                                else if((int)al2.get(j)==2)//第一个出现乘法
                                {
                                    if((int)al2.get(j+1)==0)
                                    System.out.print((int)al1.get(k)+"*"+"("+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)+")");
                                    else if((int)al2.get(j+1)==1)
                                        System.out.print((int)al1.get(k)+"*"+"("+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)+")");
                                }
                                else if((int)al2.get(j)==3)//第一个出现除法
                                {
                                    if((int)al2.get(j+1)==0)
                                    System.out.print((int)al1.get(k)+"/"+"("+(int)al1.get(k+1)+"+"+(int)al1.get(k+2)+")");
                                    else if((int)al2.get(j+1)==1)
                                        System.out.print((int)al1.get(k)+"/"+"("+(int)al1.get(k+1)+"-"+(int)al1.get(k+2)+")");
                                    if((int)al2.get(j+1)==2)
                                        System.out.print((int)al1.get(k)+"/"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2));
                                }
                            }
                            else if((int)al2.get(j)<(int)al2.get(j+1)||(int)al2.get(j)==(int)al2.get(j+1))
                            {
                                if((int)al2.get(j)==0)
                                {
                                    if((int)al2.get(j+1)==0)//第一个出现加法
                                        System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"+"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==1)
                                        System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"-"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==2)
                                        System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==3)
                                        System.out.print((int)al1.get(k)+"+"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2));
                                }
                                else if((int)al2.get(j)==1)//第一个出现减法
                                {
                                    if((int)al2.get(j+1)==1)
                                        System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"-"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==2)
                                        System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==3)
                                        System.out.print((int)al1.get(k)+"-"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2));
                                }
                                else if((int)al2.get(j)==2)//第一个出现乘法
                                {
                                    if((int)al2.get(j+1)==2)
                                        System.out.print((int)al1.get(k)+"*"+(int)al1.get(k+1)+"*"+(int)al1.get(k+2));
                                    else if((int)al2.get(j+1)==3)
                                        System.out.print((int)al1.get(k)+"*"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2));
                                }
                                else if((int)al2.get(j)==3)//第一个出现除法
                                {
                                    System.out.print((int)al1.get(k)+"/"+(int)al1.get(k+1)+"/"+(int)al1.get(k+2));
                                }
                            }
                            if((int)al2.get(j+2)==0)
                                System.out.print("+");
                            else if((int)al2.get(j+2)==1)
                                System.out.print("-");
                            else if((int)al2.get(j+2)==2)
                                System.out.print("*");
                            else if((int)al2.get(j+2)==3)
                                System.out.print("/");
                        }
                        System.out.print((int)al1.get(al1.size()-1));
                        //输出最后一位操作数
                        System.out.print("=");
                        System.out.println();                
                    }
                }
            }
            
            else if(str.equals("N"))//不需要产生括号
            {
                System.out.println("请输入数值范围:");
                N2=in.nextInt();
                System.out.println("请选择是否有无乘除法的运算题(Y/N):");
                str1=in.next();
                if(str1.equals("Y"))//有乘除法
                {                
                    System.out.println("请选择是否有无余数的运算题(Y/N):");
                    str2=in.next();                
                    if(str2.equals("Y"))//需要有余数
                    {
                        System.out.println("请选择是否有负数(Y/N):");
                        str3=in.next();
                        for(i=0;i<N;i++)
                        {
                            int a,b,c,c1,h,h2;
                            a=(int) (Math.random()*N2);
                            b=(int) (Math.random()*N2);
                            h=(int) (Math.random()*4);
                            //控制加减运算符
                            c=(int) (Math.random()*(N2-1)+1);
                            c1=(int) (Math.random()*10+1);
                            //控制倍数
                            
                            if(str3.equals("Y"))//有负数
                            {
                                if(h==0)//加法
                                {
                                    h2=(int) (Math.random()*2);
                                    //控制有无负数
                                    if(h2==0)
                                        System.out.println(a+"+"+b+"=");
                                    else if(h2==1)
                                        System.out.println("-"+a+"+"+b+"=");
                                }
                                if(h==1)//减法
                                {
                                    h2=(int) (Math.random()*2);
                                    //控制有无负数
                                    if(h2==0)
                                        System.out.println(a+"-"+b+"=");
                                    else if(h2==1)
                                        System.out.println("-"+a+"-"+b+"=");
                                }
                            }
                            else if(str3.equals("N"))//无负数
                            {
                                if(h==0)
                                {
                                    System.out.println(a+"+"+b+"=");
                                }
                                if(h==1)
                                {
                                    System.out.println(a+"-"+b+"=");
                                }
                            }
                            if(h==2)
                            {
                                System.out.println(a+"*"+b+"=");
                            }
                            if(h==3)
                            {
                                int d,k;
                                k=(int) (Math.random()*(c-1)+1);
                                //必须产生余数
                                d=c*c1+k;
                                System.out.println(d+"/"+c+"=");
                            }
                        }
                    }
                    else if(str2.equals("N"))//不需要产生余数
                    {
                        System.out.println("请选择是否有负数(Y/N):");
                        str3=in.next();
                        for(i=0;i<N;i++)
                        {
                            int a,b,c,c1,h,h2;
                            a=(int) (Math.random()*N2);
                            b=(int) (Math.random()*N2);
                            h=(int) (Math.random()*4);
                            //控制加减运算符
                            c=(int) (Math.random()*(N2-1)+1);
                            c1=(int) (Math.random()*10+1);
                            //控制倍数
                            
                            if(str3.equals("Y"))//有负数
                            {
                                if(h==0)//加法
                                {
                                    h2=(int) (Math.random()*2);
                                    //控制有无负数
                                    if(h2==0)
                                        System.out.println(a+"+"+b+"=");
                                    else if(h2==1)
                                        System.out.println("-"+a+"+"+b+"=");
                                }
                                if(h==1)//减法
                                {
                                    h2=(int) (Math.random()*2);
                                    //控制有无负数
                                    if(h2==0)
                                        System.out.println(a+"-"+b+"=");
                                    else if(h2==1)
                                        System.out.println("-"+a+"-"+b+"=");
                                }
                            }
                            else if(str3.equals("N"))//无负数
                            {
                                if(h==0)
                                {
                                    System.out.println(a+"+"+b+"=");
                                }
                                if(h==1)
                                {
                                    System.out.println(a+"-"+b+"=");
                                }
                            }
                            if(h==2)//乘法
                            {
                                System.out.println(a+"*"+b+"=");
                            }
                            if(h==3)//除法,不产生余数
                            {
                                int d;
                                //不能产生余数
                                d=c*c1;
                                System.out.println(d+"/"+c+"=");
                            }
                        }
                    }
                }
                        
                else if(str1.equals("N"))//没有乘除法
                {
                    int a,b,h,h2;                        
                    System.out.println("请选择是否有负数(Y/N):");
                    str3=in.next();
                    for(i=0;i<N;i++)
                    {
                        a=(int) (Math.random()*N2);
                        b=(int) (Math.random()*N2);
                        h=(int) (Math.random()*2);
                        //控制运算符
                        
                        if(str3.equals("Y"))//有负数
                        {
                            if(h==0)//加法
                            {
                                h2=(int) (Math.random()*2);
                                //控制有无负数
                                if(h2==0)
                                    System.out.println(a+"+"+b+"=");
                                else if(h2==1)
                                    System.out.println("-"+a+"+"+b+"=");
                            }
                            if(h==1)//减法
                            {
                                h2=(int) (Math.random()*2);
                                //控制有无负数
                                if(h2==0)
                                    System.out.println(a+"-"+b+"=");
                                else if(h2==1)
                                    System.out.println("-"+a+"-"+b+"=");
                            }
                        }
                        else if(str3.equals("N"))//无负数
                        {
                            if(h==0)
                            {
                                System.out.println(a+"+"+b+"=");
                            }
                            if(h==1)
                            {
                                System.out.println(a+"-"+b+"=");
                            }
                        }
                    }
                }
            }
        }
        in.close();
    }
}

 

运行结果:

个人总结:

      本次实验在讨论设计思想时,难度不大,但是在实现时有些难点不好解决。因为对栈的使用不太熟悉,我使用了动态数组来存放操作数和运算符以输出括号,虽然实现了功能,但是过程有些繁杂;因为负数的限制,我只在加减法中控制了负数的出现;总体程序有些缺陷。

                                                        周活动总结表

     姓名:杨茵                           日期 2016/3/18

 

听课

编写代码

阅读课本

准备考试

 讨论设计思想

 

日总计

周日

 

 

53

 

 

 

53

周一

100

70

40

 

 

 

210

周二

 

90

 

 

 

 

90

周三

 

 

 

 

 72

 

72

周四

 

380

 

 

 

 

380

周五

 

80

 

 

 

 

80

周六

 

 

 

 

 

 

 

周总计

100

620

93

 

 72

 

885

                                                      

                                                              时间记录日志

          学生:杨茵                    日期:2016/3/18

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

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/14

8:00

10:00

20

100

听课

下课,休息

 

 

 

18:30

20:30

10

110

改程序读构建之法

作业,修改部分程序;休息

 

 

3/15

15:20

17:00

10

90

改程序

作业

休息

 

 

3/16

15:30

16:52

10

72

讨论设计思想

大概过程

四则运算2,两人小组讨论

聊天

 

 

3/17

15:00

17:30

10

140

编程序

开始编写四则运算2

休息

 

 

 

18:30

23:00

30

240

编程序

编写四则运算2;休息,洗漱,聊天

 

 

3/18

16:30

18:00

10

80

编程序

休息

 

 

3/20

15:30

16:30

7

53

读构建之法

聊天

 

 

 

                                                            缺陷记录日志

                      学生:杨茵

                      日期:2016/3/18

                      教员:王建民

                      程序号:四则运算2

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/14

1

 

编码

编译

5min

 

描述:判断字符串相等,a.equals(b)

3/16

2

 

设计

编译

30min

 

描述:括号的产生有问题

3/17

3

 

编码

编译

1min

 

描述:申请的动态数组ArrayList.rangeCheck超出范围

 

4

 

编码

编译

1min

 

描述:Exception in thread “mian”:Index: 7,Size: 7

3/18

5

 

编码

编译

1min

 

 

描述:在类Test中找不到main方法,JavaFX应用程序类必须扩展

 

原文地址:https://www.cnblogs.com/yyting/p/5294400.html