软件工程基础第二次作业
[Welcome to My Blog]
第二次作业要求和准备
GIT地址 | 点击进入我的github |
---|---|
GIT用户名 | 13551330961 |
学号后5位 | 61129 |
博客链接 | 点击进入我的博客 |
作业链接 | 点击进入我的作业 |
一.环境的配置 | |
== | |
·VS2013一直很给力奥! |
|
1.建立一个项目。 | |
2.空项目。 | |
3.C++文件 | |
4.开始敲代码。 | |
5.GIt的配置:通过作业要求下载安装好了Git和Github |
二.代码的设计
·背景
:阿超家里的孩子上小学一年级了,这个暑假老师给家长们布置了一个作业:家长每天要给孩子出一些合理的,但要有些难度的四则运算题目,并且家长要对孩子的作业打分记录。
作为程序员的阿超心想,既然每天都需要出题,那何不做一个可以自动生成小学四则运算题目与解决题目的命令行 “软件”呢。他把老师的话翻译一下,就形成了这个软件的需求:
程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号+-*/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。
由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式。
练习题生成好后,将生成的 n 道练习题及其对应的正确答案输出到一个文件 subject.txt 中
思路:我采用的C语言和C++混合完成这个项目(因为C++只学习了一点,还不大熟悉)
主要思路靠的是随机产生数字组合2项的四则运算(3项的四则运算开发失败😂),宁外一组数字是产生加减乘除符号,通过队列记录下结果。最后通过选择操作,输出结果。公开地展示自己的代码,我只能说一句“小生献丑了!”还望大佬指导!
①头文件的声明和一些函数的声明:
#include<iostream>
#include<time.h>
#include<windows.h>
#include <fstream>
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;
}
⑥运行结果:
⑦代码缺陷及改进思路:
可能由于逻辑原因,出现除法的概率特别小,然后三项式子的四则运算,应该可以基于二项式子的基础上增加(及在原来的数据结果上增加数字,也许会涉及迭代啥的)这样可能避开优先级的考虑,但是脱离了实际情况(因为对小学生的考察内容也包括优先级),由于知识水平时间有限暂未开发出三项式子的四则运算....建议老师购买别的软件...(别问我那么简单的代码我写那么长,因为显得比较厉害..>)
**进入阿超的仓库,点击Fork,克隆阿超的仓库到自己的账号上。**
绿色方框里可以找到一个可克隆的项目地址
打开 Git 命令行软件(Windows上可在空白处右键打开 Git Bash ),输入 git clone
得到这样一个文件夹
一系列谜之操作
四.对项目进行单元测试和回归测试
①新建单元测试项目:
④条件断点的强大,此断点在某些条件下才有效 并且通过Condition来设定值,来确定什么时候触发断点,十分强大!!
⑤单步调试F11和F10的区别:F11逐过程F10逐语句(由于项目简单为使用断点)
五.我本次作业的感想
“革命尚未成功,还需继续努力!”但是也有所收获,熟悉了数据结构中“队列”的用法,掌握了调试的基础技巧,在个人能力上还需要极大的提升,需要认真复习上学期的数据结构。在敲代码之前应该理清楚思路设计好框架,而后进行代码的生成。在调试的过程中更耐住性子,一步一步地失调好代码。我想这也是成为一个程序员必须所要经受的痛苦,希望最后可以在痛苦中感受到了一丝甜处。(好非︿( ̄︶ ̄)︿.....)
)