软件工程基础第二次作业

[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;
}


⑥运行结果:


⑦代码缺陷及改进思路:

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

三.使用github克隆项目及提交代码 == 通过链接(https://github.com/ChildishChange/Calculator
**进入阿超的仓库,点击Fork,克隆阿超的仓库到自己的账号上。**



绿色方框里可以找到一个可克隆的项目地址

打开 Git 命令行软件(Windows上可在空白处右键打开 Git Bash ),输入 git clone ,其中 即我们刚刚复制的项目地址。

得到这样一个文件夹

一系列谜之操作






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

①新建单元测试项目:



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

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



五.我本次作业的感想

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

posted on 2019-09-21 18:33  真的不会敲  阅读(358)  评论(2编辑  收藏  举报

导航