zoukankan      html  css  js  c++  java
  • 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]是实现单元测试的源码文件

  • 相关阅读:
    Atitit sql计划任务与查询优化器统计信息模块
    Atitit  数据库的事件机制触发器与定时任务attilax总结
    Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
    Atitit 图像处理 深刻理解梯度原理计算.v1 qc8
    Atiti 数据库系统原理 与数据库方面的书籍 attilax总结 v3 .docx
    Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
    Atitit View事件分发机制
    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
    Atitti 存储引擎支持的国内点与特性attilax总结
    Atitit 深入理解软件的本质 attilax总结 软件三原则"三次原则"是DRY原则和YAGNI原则的折
  • 原文地址:https://www.cnblogs.com/HanYG/p/13775323.html
Copyright © 2011-2022 走看看