首页 > 其他 > 详细

软件工程个人作业02

时间:2016-03-19 10:00:52      阅读:315      评论:0      收藏:0      [点我收藏+]

小组成员:杨茵,严羽卿

设计思想:

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

 

听课

编写代码

阅读课本

准备考试

 

 

日总计

周日

 

 

17

 

 

 

17

周一

100

44

12

 

 

 

156

周二

 

40

 

 

 

 

40

周三

 

 

16

 

 

 

16

周四

 

267

 

 

 

 

267

周五

 

176

11

 

 

 

187

周六

 

 

 

 

 

 

 

周总计

100

527

56

 

 

 

683

                                                      

                                                              时间记录日志

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

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

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/14

8:00

10:00

20

100

听课

下课,休息

 

 

 

18:30

20:30

10

120

改程序读构建之法

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

 

 

3/15

15:20

17:00

10

90

改程序

作业

休息

 

 

3/16

15:30

16:52

10

82

讨论设计思想

大概过程

四则运算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

60

读构建之法

聊天

 

 

 

                                                            缺陷记录日志

                      学生:杨茵

                      日期: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应用程序类必须扩展

 

 

软件工程个人作业02

原文:http://www.cnblogs.com/yyting/p/5294400.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!