软件工程个人作业02

设计思路:

功能一:题目避免重复。

        1、在原程序中将原程序的数据进行记录(三组数据用队列或者是栈);

        2、从第二次循环开始将三项纪录依次与之前记录的数据进行比较(for循环?)

功能二:可定制。控制循环的次数

功能三:是否有乘除法:控制运算符

        是否有括号:没有实现

        数值范围:控制随机数的范围

        有无负数:判断两个数值的大小,递归

        除法有无余数:若规定无余数则生成随机数并判断是否符合要求,直到符合要求为止。

流程图:

程序源代码:

//可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求
//This is a program of math operation 02
//2016/3/17
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int a;
int a1,a2;
int b;
int b1,b2;
int item;
int d;
int p;
int y;
char c[4];

int main()
{
    int g;
    cout<< "请输入您需要打印/输出的算式的个数:";//功能二:定制打印个数
    cin>>g;

    //定制取值范围
    int MAX,MIN;
    cout << "请输入算式中所允许数值范围的最大值:" ;
    cin>>MAX;
    cout << "请输入算式中所允许数值范围的最小值:";
    cin>>MIN;

    //定制是否有乘除法
    int m;
    cout << "是否允许有乘除法:1、允许;0、不允许"<<endl;
    cin>>m;

    //有无负数
    int f;
    cout << "是否允许结果有负数:1、允许;0、不允许"<<endl;
    cin>>f;

    //除法有无余数
    int cy;
    cout << "是否允许除法有余数:1、允许;0、不允许"<<endl;
    cin>>cy;

    srand((int)time(NULL));
    
    c[0]='+';
    c[1]='-';
    c[2]='*';
    c[3]='÷'; 

    
    for(int i =1;i <= g;i++)
    {
        
        p = (0+rand()%2);
        if(m==1)//允许有乘除
        {
        if(p == 0)//整数
        {
            a = (MIN+rand()%MAX);
            y = (0 + rand()%4);
            if(y == 1)
            {
                b = (MIN+rand()%MAX);
                if(a<b)
                {
                    item = a;
                    b = a;
                    b = item;
                }
            }
            if(y == 3)
            {
                b = (1 + rand()%MAX);
                if(a<b)
                {
                    item = a;
                    b = a;
                    b = item;
                }
                if(cy == 0)
                {
                    for(;i == 0;)
                    {
                        i = a%b;
                        b = (1 + rand()%MAX);
                    }
                }

            }
            else
            {
                b = (MIN + rand()%MAX);
            }
            cout << a << " " << c[y] << " " << b << " " << "="<<endl;
        }
        else //分数
        {
            a1 = (MIN + rand()%MAX);
            a2 = (MIN + rand()%MAX);
            if(a1 > a2)
            {
                item = a1;
                a1 = a2;
                a2 = item;
            }
            y = (0 + rand()%3);
            if(y == 1)
            {
                b1 = (1 + rand()%MAX);
                b2 = (1 + rand()%MAX);
                if(b1>b2)
                {
                    item = b1;
                    b1 = b2;
                    b2 = item;
                    
                }
                if((b1/b2)>(a1/a2))
                {
                    int item1,item2;
                    item1 = a1,a1 = b1,b1 = item1;
                    item2 = a2,a2 = b2,b2 = item2;
                }
            }
            if(y == 3)
            {
                b1 = (1 + rand()%MAX);
                b2 = (1 + rand()%MAX);
                if(b1>b2)
                {
                    item = b1;
                    b1 = b2;
                    b2 = item;
                    
                }
            }
            else
            {
                b1 = (1+rand()%MAX);
                b2 = (1+rand()%MAX);
                if(b1>b2)
                {
                    item = b1;
                    b1 = b2;
                    b2 = item;
                    
                }
            }
        }
        for(int s = a1;s > 1;s--)
        {
            if(a1%s == 0 && a2%s == 0)
            {
                a1/=s;
                a2/=s;
            }
        }
        for(int s = b1;s > 1;s--)
        {
            if(b1%s == 0 && b2%s == 0)
            {
                b1/=s;
                b2/=s;
            }
        }
        cout << a1<<"/"<<a2<<" " <<c[y]<<" "<<" "<< b1 <<"/"<<b2 << " " <<"="<<endl;
    }
        else
        {
            if(p == 0)//整数
            {
                a = (MIN+rand()%MAX);
                y = (0 + rand()%1);
                b = (MIN + rand()%MAX);
                if(y == 1)
            {
                //b = (MIN+rand()%MAX);
                if(a<b)
                {
                    item = a;
                    b = a;
                    b = item;
                }
            }
                cout << a << " " << c[y] << " " << b << " " << "="<<endl;
            }
            else //分数
            {
                a1 = (MIN + rand()%MAX);
                a2 = (MIN + rand()%MAX);
                if(a1 > a2)
                {
                    item = a1;
                    a1 = a2;
                    a2 = item;
                }
                y = (0 + rand()%1);
                b1 = (1+rand()%MAX);
                b2 = (1+rand()%MAX);
                if(b1>b2)
                {
                    item = b1;
                    b1 = b2;
                    b2 = item;
                }
                if((b1/b2)>(a1/a2))
                {
                    int item1,item2;
                    item1 = a1,a1 = b1,b1 = item1;
                    item2 = a2,a2 = b2,b2 = item2;
                }
            }
            for(int s = a1;s > 1;s--)
        {
            if(a1%s == 0 && a2%s == 0)
            {
                a1/=s;
                a2/=s;
            }
        }
        for(int s = b1;s > 1;s--)
        {
            if(b1%s == 0 && b2%s == 0)
            {
                b1/=s;
                b2/=s;
            }
        }
            cout << a1<<"/"<<a2<<" " <<c[y]<<" "<<" "<< b1 <<"/"<<b2 << " " <<"="<<endl;
        }
}
}

运行结果截图:

程序分析与反思:

在原来的程序上进行了分数的约分(分子分母同时除以一个数s若是可以除尽则将这个数约去,可以利用for循环,当s大于分子是便可以停止)。

要根据客观实际即客观需求,分子分母的大小问题,除法是否有余数等问题都应该想到。还有没有实现的功能以及控制运算项为几项的问题都应该尽快解决。 

            周活动总结表                    

                                                                                                                                     姓名:黄丽萍                             

                                                                                                                                     日期:3.19.2016 

日期

任务

听课

编写程序

阅读课本

准备考试

 

 

日总计

周日

 

 

 

 

 

 

0

周一

100

 90

30

 

 

 

220

周二

 

 

 

 

 

 

0

周三

 

 

 

 

 

 

0

周四

 

 

 30

 

 

 

30

周五

 

 120

 

 

 

 

120

周六

 

180

120

 

 

 

300

周总计

100

390

180

 

 

 

670

           

                                                                                 时间记录日志

                                                                                                                       学生:黄丽萍          

                                                                                                                       教师:王建民老师         

                                                                                                                       课程:PSP

日期

开始时间

结束时间

中断时间

净时间

活动

备注

C

U

3/14

9:35

9:50

 0

15

设计思路

 

 

 3/14

20:00

21:00

30

30

自己先思考补充

聊天了

 

3/15

19:00

19:30

0

30

小组讨论设计思路

 

 

3/17

21:00

21:30

0

30

阅读

 

 

3/18

19:00

21:00

0

120

编写程序

 

 

3/19

8:00

10:00

0

120

阅读

 

 

 3/19

13:00

16:00

 0

180

编写程序

 

 

 

                  

                                                                                                                                                 学生:黄丽萍

                                                                                                                                                 老师:王建民老师

                                                                                                                                                程序编号:02

                                                                                                                                                日期:2016/3/19

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/14

02

忽略问题

此程序的上个版本

 

10min

 

描述:未化简分子分母

3/19

02 命名问题       10      

描述:命名不规范

posted @ 2016-03-19 09:57  Huangliping  阅读(145)  评论(0编辑  收藏  举报