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]是实现单元测试的源码文件