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

  • 相关阅读:
    SAP的一些HR函数
    如何在sap的screen中使用ListBox
    关于SAP的SD的定价公式的资料(强力推荐,有时间我会进行翻译)
    如何设计和使用自定义的权限对象(自定义权限检查函数)
    [转载]ASP.NET面试题收集
    [转载]sql in与exists区别
    删除A数据表中的一行数据时,不小心将表名写成了B,现在想恢复B中刚删除的的着一行数据怎么办
    删除A数据表中的一行数据时,不小心将表名写成了B,现在想恢复B中刚删除的的着一行数据怎么办
    oracle优化总结经验
    oracle优化总结经验
  • 原文地址:https://www.cnblogs.com/HanYG/p/13775323.html
Copyright © 2011-2022 走看看