2020年秋第四五周-四则运算试题生成

此作业要求参见https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11245
结对伙伴为[Nicole]
此作业的程序是在Windows 10操作系统下,使用集成开发环境Visual Studio 2019编写的C++应用程序

功能一和功能二一同实现

使用C++中rand()函数来随机生成题目。运用栈的后进先出原理实现对题目的计算,程序使用保留一位小数
其中rand()函数,需要设置随机种子为毫秒级的随机种子,如下代码为设置毫秒级随机种子
感悟:1、对于实现计算试题结果的算法时存在两种算法。(1)使用试题先序转后续的过程实现。(2)设置符号优先级,进行入栈出栈的优先计算的算法(原理也是栈)。最终使用方法2实现该算法。
2、在设置随机数生成算式的过程中,设置的随机种子是按照系统时间设置,是秒级的随机种子。对于该程序,算法在每秒内生成多个算式,导致算式相同。经过查阅大量博客,发现可以设置为毫秒级的随机种子。

LARGE_INTEGER seed;									//设置随机种子
QueryPerformanceFrequency(&seed);
QueryPerformanceCounter(&seed);
srand(seed.QuadPart);

运行结果如下

功能三和功能四一同实现

打印输出使用输出重定向,输入格式为f4 -c 20 > test.txt即输出20个方程到test.txt文件中。
分数支持的实现是使用了自定义的分数类,该类的定义如下代码
感悟:1、实现分数的输入输出时的实现方式,把分数定义为一个类,通过运算符重载实现分数的+-*/操作。

#define CHAR_SIZE 10
/*
* 类中分数全部存储形式为假分数
*/
class fraction
{
	int numerator;			// 分子
	int denominator;		//分母

public:
	char* print();
	void print_s();								//打印。假分数
	char* print_res(bool bol = true);			//打印结果,true打印分数,false打印小数
	fraction(int numerator, int denominator);	//构造函数,分数构造
	fraction(int number);						//构造函数,整数构造
	fraction(const char* chr);					//构造函数,字符串构造

	fraction operator=(fraction& obj);		//重载"="
	fraction operator=(char* chr);			//重载"="
	fraction operator=(int number);
	fraction operator=(const char* chr);

	fraction operator+(fraction& obj);		//加法重载
	fraction operator-(fraction& obj);		//减法重载
	fraction operator*(fraction& obj);		//乘法重载
	fraction operator/(fraction& obj);		//除法重载

private:
	fraction reduction();							//约分
	//lowest common multiple
	int lcm(int a, int b);							//最小公倍数
	//greatest common divisor
	int gcd(int a, int b);							//最大公约数

};

命令行参数测试如下

输出测试如下

运行结果如下

功能五

该程序的所有功能全部是由各个函数构成,对以后的改造直接调用相关函数即可实现。

实现该程序的PSP表

程序代码

fraction.pp主要定义了一个用于操作分数的类
operator.cpp定义了用于实现方程计算的函数
main.cpp是主函数所在的文件
定义的常量

#define DATA_SIZE				20		//方程长度

//方程字符标记
#define FLAG_NUMBER				0		//数字
#define FLAG_ADD_SUBSTRACT		1		//加减
#define FLAG_MULTIPLY_DIVIDE	2		//乘除
#define FLAG_LEFT				3		//左括号
#define FLAG_RIGHT				4		//右括号
#define EQUATION_LENGTH			4		//方程长度,表示四个数据做运算

存储方程的结构体

/*
* 结构体存储方程和结果
* result:方程结果
* equa:指针数组存储方程的每一位
*/
typedef struct equation
{
	fraction pResult = 0;					//方程答案
	/*不建议用链表实现*/
	char equa[DATA_SIZE][DATA_SIZE];		//方程
	equation* next;							//指向下一个方程
}*pEqua, equation;

用于计算方程的栈的结构体

/*
* 用于计算方程结果,原理同栈
* equa:存储方程
* rear:指向数组末尾
*/
typedef struct calculate
{
	int flag[DATA_SIZE];
	char equa[DATA_SIZE][DATA_SIZE];				//存储方程式
	int rear = -1;						//指向数组末尾,-1表示空
}*pCalc, calculate;

以及各个函数的定义和实现的功能

/*
* 判断方程元素标记
* chr:方程元素
*/
int judge_flag(char* chr);

/*
* 进栈
* pcalc:栈
* chr:进栈的数据
*/
void calculate_in(pCalc pcalc, char* chr);

/*
* 出栈
* pcalc:出栈的栈
* 返回字符串,或NULL
*/
char* calculate_out(pCalc pcalc);

///*
//* 创建一个存储方程的结构体
//* 注意!!!可能为空
//*/
//equation create_equa();

/*
* 创建一组方程方程结构体
* size:大小
*/
pEqua create_equa_array(int size);

/*
* 设置方程答案
* equa:待设置答案的方程
* frac:答案
*/
void stroage_result(pEqua equa, fraction frac);

/*
* 计算fraction算数结果
* chr:运算符
* 返回fraction
*/
fraction calculate_resu(fraction f1, fraction f2, char* chr);

/*
* 栈出三个符号计算结果
* 返回char*
*/
char* calculate_three_result(pCalc pcalc);

/*
* 计算方程结果
* equa:方程式
* 返回char*
*/
char* calculate_equa(pEqua equa);

/*
* 生成随机数
* 返回char*
* bol:控制生成分数还是整数
*/
char* rand_numb(bool bol);

/*
* 生成方程
* pequa:存储方程的结构体
* bol:控制生成分数还是整数
*/
void rand_equa(pEqua pequa, bool bol = true);

/*
* 重定向输出
*/
void print_equa(pEqua pequa);

/*
* 输出单个方程
*/
void print_one_equa(pEqua pequa);

结对编程

编程过程拍照

coding地址为https://e.coding.net/nenuwork/ourteam/arithmetic_operation.git
仓库名称为[rithmetic_operation],文件夹[f4]存储的是实现程序的源码文件,[f4_UnitTest.cpp]是实现单元测试的源码文件

posted @ 2020-10-06 20:19  韩亚光  阅读(164)  评论(2编辑  收藏  举报