软件工程基础第二次作业

[Welcome to My Blog]

第二次作业要求和准备

GIT地址 点击进入我的github
GIT用户名 13551330961
学号后5位 61129
博客链接 点击进入我的博客
作业链接 点击进入我的作业

一.环境的配置

·VS2013一直很给力奥!

1.建立一个项目。
软件工程基础第二次作业_第1张图片
2.空项目。
软件工程基础第二次作业_第2张图片
3.C++文件
软件工程基础第二次作业_第3张图片
4.开始敲代码。
5.GIt的配置:通过作业要求下载安装好了Git和Github软件工程基础第二次作业_第4张图片

二.代码的设计

·背景
:阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。

**作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。
由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中**

思路:我采用的C语言和C++混合完成这个项目(因为C++只学习了一点,还不大熟悉)
主要思路靠的是随机产生数字组合2项的四则运算(3项的四则运算开发失败),宁外一组数字是产生加减乘除符号,通过队列记录下结果。最后通过选择操作,输出结果。公开地展示自己的代码,我只能说一句“小生献丑了!”还望大佬指导!

①头文件的声明和一些函数的声明:

#include
#include
#include
#include 
using namespace std;
void Tot(int n);//两位数四则运算
void Toto(int n);//三位数四则运算
typedef int Status;
typedef int QElemType;//定义队列元素数据类型
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXQSIZE 100 //循环队列最大容量

②有关队列的操作:

typedef struct QNode{
    QElemType *base; //队列元素存储数组
    int front;       //队头指针,若队列不空,则指向队列头元素
    int rear;        //队尾指针,若队列不空,则指向队列尾元素的下一个空白位置
}SqQueue;

//初始化循环队列
Status InitQueue(SqQueue &q) {
    q.base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));  //分配空间
    if (!q.base) return ERROR;
    //初始化队头、队尾
    q.front = 0;
    q.rear = 0;
    return OK;
}
//入队(元素值e入队,如果队列已满无法入队就返回ERROR,执行成功返回OK)
Status EnQueue(SqQueue &q, QElemType e){
    if ((q.rear + 1) % MAXQSIZE == q.front)
        return ERROR;
    q.base[q.rear] = e;
    q.rear = (q.rear + 1) % MAXQSIZE;
    return OK;

}
//依次打印输出队列元素(执行成功返回OK,否则返回ERROR)
Status PrintQueue(SqQueue q) {
    int i = q.front;
    while ((i + q.front) != q.rear)
    {
        printf("%d  ", q.base[i]);
        i = (i + 1) % MAXQSIZE;
    }
    return OK;
}

③生成2项式数字以及运算符号的函数Tot

void Tot(int n)
{

    SqQueue Q;
    QElemType e;
    InitQueue(Q);
    int i, x, y, s, m;
    for (i = 0; i < n; i++)
    {
        s = rand() % 4 + 1;
        if (s == 1)
        {
            x = rand() % 100 + 1;
            y = rand() % 100 + 1;
            e = x + y;
            EnQueue(Q, e);
            cout << x << "+" << y << "=\n";
        }
        else    if (s == 2)
        {
            x = rand() % 100 + 1;
            y = rand() % 100 + 1;
            e = x - y;
            EnQueue(Q, e);
            cout << x << "-" << y << "=\n";
        }
        else    if (s == 3)
        {
            x = rand() % 100 + 1;
            y = rand() % 100 + 1;
            e = x*y;
            EnQueue(Q, e);
            cout << x << "×" << y << "=\n";
        }
        else    if (s == 4)
        {
            x = rand() % 100 + 1;
            y = rand() % 100 + 1;
            if (x > y)
            {
                if (x%y == 0)
                {
                    e = x / y;
                    EnQueue(Q, e);
                    cout << x << "÷" << y << "=\n";
                }
                else
                {
                    i--;
                }
            }
            else if (x <= y)
            {
                if (y%x == 0)
                {
                    e = x / y;
                    EnQueue(Q, e);
                    cout << y << "÷" << x << "=\n";
                }
                else
                {
                    i--;
                }
            }
        }

    }
    cout << "显示答案请输入“1”" << endl;
    do{
        cin >> m;
        switch (m)
        {
        case 1:
            PrintQueue(Q);
            break;
        default:
            cout << "\n你的输入有错误";
        }
    } while (m);
    ofstream outfile;
    outfile.open("subject.txt");
    cout << PrintQueue(Q) << endl;
    outfile.close();
}

⑤main函数:

int main()
{
    int m, n;
    cout << "请输入需要产生的四则运算题个数:" << endl;
    cin >> n;
    srand((unsigned)time(NULL));
    do
    {
        cout << "2项式运算请输入“2”,3项式运算请输入“3”" << endl;
        cin >> m;
        cout << "........随机生成题目中........" << endl;
        Sleep(1000);
        cout << "..........Loading.............." << endl;
        Sleep(1000);
        switch (m)
        {
        case 2: Tot(n);//生成两项数字的函数程序
        case 3: cout << "阿偶!程序出错了!菜鸡程序员还未开发出此版块...\n..........请等待后续.........\n";
                                    //生成3项数字的函数程序Toto中道崩殂
            break;
        default:
            cout << "\n\n您的输入有误,请重新输入字符:\n" << endl;
        }
    } while (m);

    //Tot(n);
    system("pause");
    return 0;
}

⑥运行结果:

软件工程基础第二次作业_第5张图片
⑦代码缺陷及改进思路:

可能由于逻辑原因,出现除法的概率特别小,然后三项式子的四则运算,应该可以基于二项式子的基础上增加(及在原来的数据结果上增加数字,也许会涉及迭代啥的)这样可能避开优先级的考虑,但是脱离了实际情况(因为对小学生的考察内容也包括优先级),由于知识水平时间有限暂未开发出三项式子的四则运算....建议老师购买别的软件...(别问我那么简单的代码我写那么长,因为显得比较厉害..>)软件工程基础第二次作业_第6张图片


三.使用github克隆项目及提交代码

==
通过链接(https://github.com/ChildishChange/Calculator
进入阿超的仓库,点击Fork,克隆阿超的仓库到自己的账号上。

软件工程基础第二次作业_第7张图片
软件工程基础第二次作业_第8张图片
绿色方框里可以找到一个可克隆的项目地址

软件工程基础第二次作业_第9张图片

打开 Git 命令行软件(Windows上可在空白处右键打开 Git Bash ),输入 git clone ,其中 即我们刚刚复制的项目地址。
软件工程基础第二次作业_第10张图片
得到这样一个文件夹
软件工程基础第二次作业_第11张图片
一系列谜之操作
软件工程基础第二次作业_第12张图片
软件工程基础第二次作业_第13张图片
软件工程基础第二次作业_第14张图片
软件工程基础第二次作业_第15张图片
软件工程基础第二次作业_第16张图片
软件工程基础第二次作业_第17张图片
软件工程基础第二次作业_第18张图片

四.对项目进行单元测试和回归测试

①新建单元测试项目:

软件工程基础第二次作业_第19张图片

软件工程基础第二次作业_第20张图片

④条件断点的强大,此断点在某些条件下才有效 并且通过Condition来设定值,来确定什么时候触发断点,十分强大!!

⑤单步调试F11和F10的区别:F11逐过程F10逐语句(由于项目简单为使用断点)


软件工程基础第二次作业_第21张图片
软件工程基础第二次作业_第22张图片

五.我本次作业的感想

“革命尚未成功,还需继续努力!”但是也有所收获,熟悉了数据结构中“队列”的用法,掌握了调试的基础技巧,在个人能力上还需要极大的提升,需要认真复习上学期的数据结构。在敲代码之前应该理清楚思路设计好框架,而后进行代码的生成。在调试的过程中更耐住性子,一步一步地失调好代码。我想这也是成为一个程序员必须所要经受的痛苦,希望最后可以在痛苦中感受到了一丝甜处。(好非︿( ̄︶ ̄)︿.....)
软件工程基础第二次作业_第23张图片)

你可能感兴趣的:(软件工程基础第二次作业)