设计思路
关于用户输入输出:
- 对用户输入用字符串进行处理,处理了设想中的错误输入
- 用名为prompt的int型变量的值来决定用户收到的提示语言(1为中文,2为英文)
- 解题报告采用名为wrongquenum的数组来存储用户的错误题目编号,在最后通过for循环将错误题目呈现出来。总结用名为corrnum的int型变量存储正确题目数量,wrongnum存储错误题目数量。
算式生成:
一个算式由符号和前后“数据域”构成,由此,采用二叉树来建构算式。然后结合随机生成数的算法来随机生成一个算式。
class TreePoint{
private:
TreePoint *prep;
TreePoint *next;
char symbol;
int priority;
int rightpriority;
Fraction *num;
char newsymbol(int upper);
……
};
算式 计算:
算出前“数据域”和后“数据域”的值,然后根据符号算出算式的值。整个计算采用递归的方法对二叉树进行中序遍历
算式 输出:
同样采用递归的方法对二叉树进行中序遍历。对于括号的解决采用优先级的方式。一个数的priority及rightpriority均为4。rightpriority用于“解决减号的后运算域是加号或减号”的情况及类似情况。一旦遍历的时候发现优先级掉落(例如'*'的前数据域出现加法),就增加括号(只在输出时)。
switch (symbol)
{
case '+':priority=1;rightpriority=1;break;
case '-':priority=1;rightpriority=3;break;
case '*':priority=2;rightpriority=2;break;
case '/':priority=2;rightpriority=3;break;
}
关于数:
用Fraction类进行存储,将整数和真分数全部视为分数,overload四则运算、逻辑等于。
class Fraction{
private:
int nume;// numerator
int deno;// denominator
……
};
关于其他要求:
- 对根节点特殊处理,保证至少一个数据域是子算式,从而生成“混合运算”。
- 对层数进行记录并限制,使算式不至于过于庞大
- 生成树后马上进行答案计算,保证算式的合法性,以及“答案是整数”的要求
编码规范
- 采用C++,每个类都有.h .cpp两个文件
- 使用Tab缩进,tab size =4
- define不需要的时候undef之
程序实现和结果测试的截图
github的提交链接和提交日志截图
两位同学的分工和协作证据截图
合作过程
开始的时候我们确立了大概的思路,然后开始学习github协作的相关事项。然后我们各自确立任务,开始实现一个个功能。在我敲代码的过程中出现过不少问题,也发现自己知识储备不够,所以我是边学边敲,感觉拖慢了进度,很不好意思
。。。最后我在写完main函数,在编译时出现了许多bug。。。其中有几个我发现自己解决不了,多亏了王源同学的帮助。。。王源同学之后还对界面做了调整,看起来更加美观。再一次王源同学的帮助(鞠躬)。
合作体会
- 感觉有了队友就有种责任感,因为怕拖后腿所以感觉效率高了不少。
- 这么多代码如果是我一个人肯定要花大量时间,所以有队友可以减少很多工作。
- 有一个厉害的队友感觉很棒,可以从他那里学到很多东西。
- 由于我一开始考虑不周,没有想到用户在选择提示语言时乱输的问题,还好最后队友注意到了这一点,加了一条语句。也是我想当然地认为用户会遵守提示操作,所以没有去想用户给出了不符合要求的输入该如何处理。。今后会注意这点。
最后感谢队友王源同学