从《构建之法》第一章的 “程序” 例子出发,完成一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
1、参与运算的操作数(operands)除了100以内的整数以外,还要支持真分数的四则运算,例如:1/6 + 1/8
=7/24。操作必须随机生成。
2、运算符(operators)为 +, −, ×, ÷ (如运算符个数固定,则不得小于3)运算符的种类和顺序必须随机生成。
3、要求能处理用户的输入,并判断对错,打分统计正确率。
4、使用 -n 参数控制生成题目的个数,例如执行下面命令将生成5个题目
(以C/C++/C#为例) calgen.exe -n 5
(以python为例) python3 calgen.py -n 5
附加功能(算附加分)
1、支持带括号的多元复合运算
2、运算符个数随机生成(考虑小学生运算复杂度,范围在1~10)
2、解题思路
- 我的整体思路是将所有对象看做是一个有分子、分母和符号的结构体,分数表示成分子、分母和“|”符号,整数表示成分子为整数,分母为1和符号为“|”,加法表示成分子为0,分母为1和符号为“+”,减法表示成分子为0,分母为1和符号为“-”,......,都是以这种形式在栈和队列中表示。只有当要输出的时候才转换成原来的形式。
- 对生成的运算式子进行控制。在生成整数时用rand()函数控制生成的数在100范围内,对分数,只有当分子和分母都在1~10范围内且分子小于分母才有效,否则重新生成分数。对于每次生成的式子都会用额外的队列存储,当运算的最后结果不为负数且分母和分子都不大于100时,这个式子才有效可以显示出来,否则丢掉重新生成。
- 项目主要包含math.h和calgen.cpp两个文件。
- math.h主要封装了结构体的定义和一系列对分数运算的函数。
- calgen.cpp主要包含生成数字,生成分数,生成运算符,生成式子,将式子转换成后缀表达式,计算结果等函数。
3.代码说明
1、Fraction结构体
1 struct Fraction { 2 int deno; //Denominator 3 int numer; //Numerator 4 char symbol;//Operator 5 };