软件工程个人作业02

组内成员:张雪晴

设计思想(基于作业01)

题目避免重复:将随机生成的表达式以string类型存储在数组中,遍历数组以避免新产生的表达式与前面重复。

数值范围、可定制数量与打印方式:用户输入运算数数值范围、题目个数与打印方式即几行几列。

函数部分:定义三个函数,分别是MultiAndDiv()有无乘除法、Bracket()有无括号(最多支持10个数的运算)、Minus()加减法有无负数(包括减法结果有无负数)。用户可在程序开始定义这些功能的有无。

具体实现:

1. 使用无限循环实现不同功能的输出以满足用户的需求。

2. 输出语句,让用户输入数值范围Range,题目个数SumNum,打印方式:m行n列;输入有无乘除法,有Mu=1,无Mu=0;输入有无括号,有B=1,无B=0;输入加减法有无负数,有Mi=1,无Mi=0;输入除法有无余数,有D=1,无D=0。

3. MultiAndDiv():在规定的数值范围内,随机产生temp(2-10)个随机数与运算结合成表达式,并考虑除法有无余数,即判断除号两边的数取余是否为0,如果没有余数,则从新生成取余不为0的两个数。若有余数,随机输出即可。

4. Bracket()(最多支持10个数的运算):未能很好的实现。

5. Minus():如果没有负数,则去除减数大于被减数的情况;如果有负数,则产生负随机数(每个负的随机数都要加括号),进行输出。

6. 进行SumNum次循环,并根据Mu、Mi、D的值调用函数MultiAndDiv()、Bracket()、Minus(),遍历数组以避免新产生的表达式与前面重复,如果重复则继续生成表达式,直到不重复为止。

7.考虑含负数情况下也有无负数的表达式。

源代码:

package pkg;
import java.util.Random;
import java.util.Scanner;
class Calculate {
    public String AddAndSub(int range,int Mi){//定义有加减法时的各种情况
        Random random =new Random();
        String output="";
        int temp1=2+random.nextInt(7);
        for(int i=0;i<temp1;i++)              //控制运算数个数
        {
            int m=random.nextInt(2);          //控制加减号的随机输出
            int n=random.nextInt(2);          //控制有无分数
            int l=random.nextInt(10);         //控制有负数的情况下包含无负数的输出
            int first=random.nextInt(range)+1;
            int second=random.nextInt(range)+2;
            char f=' ';                       //随机输出加减法
            if(m==0) f='+';
            if(m==1) f='-';
            if(n==0)                          //没有分数
            {                
                if(Mi==1)                     //有负数
                {
                    if(l>=4)                  //有负数
                    {
                        first=-1*(random.nextInt(range)+1);
                        output+="("+first+")";
                    }
                    if(l<4)                   //不含负数运算
                        output+=first;
                    if(i!=temp1-1){output+=f;}//配合输出运算符
                }
                if(Mi==0)                     //无负数
                {
                    output+=first;
                    if(i!=temp1-1){output+=f;}
                }
            }
            if(n==1)                          //有分数
            {
                if(first>=second){            //化简
                    for(int a=second;a>0;a--)
                    {
                        if(first%a==0&&second%a==0)
                        {
                            first=first/a;
                            second=second/a;
                        }
                    }
                }
                else
                {
                    for(int a=first;a>0;a--)
                    {
                        if(first%a==0&&second%a==0)
                        {
                            first=first/a;
                            second=second/a;
                        }
                    }
                }
                if(Mi==1)                   //有负数
                {
                    if(l>=4){
                        first=-1*(random.nextInt(range)+1);
                        output+="( ("+first+")"+"/"+second+" )";}
                    if(l<4)                //有负数的情况下也会产生无负数的情况
                        output+=first+"/"+second;
                }
                if(Mi==0)
                    output+=first+"/"+second;
                if(i!=temp1-1)
                    output+=f;
            }
        }
        output+="=";
        return output;
    }
    public String MultiAndDiv(int range,int D,int Mi){   //定义有乘除法时的各种情况
        Random random =new Random();
        int temp1=2+random.nextInt(8);
        int l=random.nextInt(10);                        //控制有负数的情况下包含无负数的输出
        String output="";
        for(int i=0;i<temp1;i++)                         //控制运算数个数
        {
            int first=random.nextInt(range)+1;
            int second=random.nextInt(range)+1;
            char f=' ';
            int temp2=random.nextInt(2);
            if(temp2==0) f='+';
            if(temp2==1) f='-';
            if(D==0)                                     //没有余数
            {
                for(int c=0;;)
                {
                    if(first%second!=0||second%first!=0) //判断是否能整除,否重新生成,并直到能整除为止
                    {
                        first=random.nextInt(range)+1;
                        second=random.nextInt(range)+1;
                    }
                    else
                        break;
                }
                if(Mi==1)                               //有负数
                {
                    if(l>=4)
                    {
                        first=-1*(random.nextInt(range)+1);
                        output+="("+first+")";
                    }
                    if(l<4)                             //有负数的情况下也会产生无负数的情况
                        output+=first;
                }
                if(Mi==0)
                    output+=first;
                if(i!=temp1-1)
                {
                    int temp3=random.nextInt(2);
                    if(temp3==0)
                        output+="*"+second+f;
                    if(temp3==1)
                        output+="/"+second+f;
                }
            }
        
            if(D==1)                                   //有余数
            {
                output+=first;
                if(i!=temp1-1)
                {
                    int temp4=random.nextInt(4);
                    if(temp4==0)
                        output+="*";
                    if(temp4==1)
                        output+="/";
                    if(temp4==2)
                        output+="+";
                    if(temp4==3)
                        output+="-";
                }
            }
        }
        output+="=";
        return output;
    }
    public String Bracket(String E){                        //多项式加括号
        Random random =new Random();
        int t=E.indexOf("+")+1;
        E=E.substring(0,t)+'('+E.substring(t+1,E.length());
        E=E.substring(0,t+4)+')'+E.substring(t+5,E.length());
        return E;
    }
    
}
public class CalculateTwo extends Calculate{         //继承Calculate

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in);
        Random random =new Random();
        int D=0;
        Calculate C;C=new Calculate();
        for(int j=0;;)                              //输出需要用户定义的要求
        {
            System.out.println("Please input the number's range of this calculation:");
            int Range=in.nextInt();
            System.out.println("Please input the number of this calculation:");
            int SumNum=in.nextInt();
            System.out.println("Please input the lines of this calculation:");
            int m=in.nextInt();
            System.out.println("Is there multiplication and division in this calculation?Yes,prress 1   No,press 0:");
            int Mu=in.nextInt();
            if(Mu==1){
                System.out.println("Is there reminder in division?Yes,prress 1   No,press 0:");
                    D=in.nextInt();}
            System.out.println("Is there minus in this calculation?Yes,prress 1   No,press 0:");
            int Mi=in.nextInt();
            System.out.println("Is there parenthese in this calculation?Yes,prress 1   No,press 0:");
            int B=in.nextInt();
            
            int l=random.nextInt(10);                       //控制有负数的情况下有无负数的输出
            String []Expre=new String[SumNum+1];
            for(int i=0;i<SumNum;i++)
            {
                if(Mu==0)                                  //无乘除法
                {
                    boolean s=false;                       //查询是否有重复
                    if(i==0)
                        Expre[i]=C.AddAndSub(Range, Mi);
                    else
                    {
                        Expre[i]=C.AddAndSub(Range, Mi);
                        for(int d=0;;)                     //如果有重复则继续生成,直到无重复为止
                        {
                            int c;
                            for(c=0;c<i;c++)
                            {
                                s=Expre[i].equals(Expre[c]);
                                if(s==true) break;
                            }
                            if(c<=i-1)                     //如果循环跳出时的c值小于i-1说明有重复
                            {
                                Expre[i]=C.AddAndSub(Range, Mi);
                            }
                            else
                                break;
                        }
                    }
                }
                if(Mu==1)                                   //有乘除
                {
                    boolean s=false;                        //查询是否有重复
                    if(i==0)
                    {
                        if(l>=4)
                            Expre[i]=C.MultiAndDiv(Range,D,Mi);
                        if(l<4)
                            Expre[i]=C.AddAndSub(Range, Mi);
                    }
                    else
                    {
                        if(l>=4)
                            Expre[i]=C.MultiAndDiv(Range,D,Mi);
                        if(l<4)
                            Expre[i]=C.AddAndSub(Range, Mi);
                        for(int d=0;;)                    //如果有重复则继续生成,直到无重复为止
                        {
                            int c;
                            for(c=0;c<i;c++)
                            {
                                s=Expre[i].equals(Expre[c]);
                                if(s==true) break;
                            }
                            if(c<=i-1)                        //如果循环跳出时的c值小于i-1说明有重复
                            {
                                if(l>=4)
                                    Expre[i]=C.MultiAndDiv(Range,D,Mi);
                                if(l<4)
                                    Expre[i]=C.AddAndSub(Range, Mi);
                            }
                            else
                                break;
                        }
                    }
                }
            }
            if(B==1)                               //有括号
            {
                for(int i=0;i<SumNum;i++)
                {
                    if(Expre[i].length()>8)
                        C.Bracket(Expre[i]);
                }
            }
            for(int i=0;i<SumNum;i++)              //输出字符串数组
            {
                System.out.print(Expre[i]+"   ");
                if((i+1)%m==0)
                    System.out.println();    
            }
            System.out.println();    
            
            System.out.print("Try again press:1  Quit press:0");
            int g=in.nextInt();
            if(g==1)
                continue;
            if(g==0)
                break;
        }
    }
}

运行结果截图:

无乘除 有负数

 有乘除 无负数 有余数

有乘除 有负数 有余数

程序总结      

存在的问题:括号输出功能实现的不够全面。感觉有无余数功能应该是对的,但输出不对 ,不知道为什么。    

先写出程序大框,再逐步加入细节,考虑问题需要全面,然后以后要尽量缩短编程时间。Java语言基础不够扎实,还需要多加训练。

结组编程时从对方身上学到很多。 

                                                                                                   周活动总结表

                                                                             姓名:尤凯丽                            日期 2016/3/18

听   课

编写代码

阅读课本

准备考试

日总计

周日

周一

100分钟

20

构建之法1-4章

讨论程序

100分钟

周二

60

周三

70

周四

50

周五

70

周六

周总计

100分钟

270

100分钟

                                                                                              时间记录日志

                                                                           学生:尤凯丽                    日期:2016/3/18

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

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3.14

8:00

9:50

8:50-9:00

100

听课

4个

小时(1-4章)

16:00

17:30

90

阅读笔记

20:00

21:00

20:30-20:40

50

讨论程序

3.15

15:00

16:50

110

写设计思想

2个小时

21:40

22:30

50

编程序

3.16

21:40

22:30

50

编程序

50

3.17

17:20

18:20

17:30-17-40

50

编程序

2个小时

21:40

23:00

22:00-22:10

70

3.18

17:00-

21:00

18:00-18:20

220

编程序 博客

3小时40

3.19

9:50-9:55

                      

                                                                                                缺陷记录日志

                                                                                学生:尤凯丽             日期:2016/3/18

                                                                                教员:王建民             程序号:四则运算第二季

日期

编    号

类    型

引入阶段

排除阶段

修复时间

修复缺陷

3.16

1

20

编程

编程

1min

描述:创建对象方法错误

3.17

2

10

编程

编译

2min

描述:未考虑有负数情况下也包含无负数的运算式

3

80

编程

编译

1min

描述:当用户输入无乘除法时还会提示除法有无余数

3.18

4

10

编程

编译

2min

描述:循环体错误,删掉output+=“+”等

5

20

编程

编译

3min

描述:循环变量错误,把d改为i

原文地址:https://www.cnblogs.com/love528/p/5295003.html