• 软件工程个人作业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

  • 相关阅读:
    week4
    week3
    2017福州大学面向对象程序设计寒假作业二
    Week2
    10个android开发必备的开源项目
    Day Ten
    Day Nine
    Day Eight
    Day Seven
    Day Six
  • 原文地址:https://www.cnblogs.com/love528/p/5295003.html
Copyright © 2020-2023  润新知