四则运算生成程序
一、题目要求
我们选择了小学四则运算自动生成程序的作为此次结对编程的任务。如下题目要求:
- 能够自动生成四则运算练习题
- 可以定制题目数量;
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号、是否有小数
- 用户选择输出方式(如输出到文件、打印机等)
- 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
二、角色分配
本次结对编程的过程中和小伙伴的角色分配如下:
- 驾驶员:李 鑫
- 领航员:李宏达
驾驶员主要负责代码的编写,领航员引导驾驶员提供思路、修正驾驶员错误等以及对程序的测试工作。
三、程序编写
- 代码链接
代码内容
头文件引入
#ifndef PCH_H#define PCH_H#include
#include #include #include #include #include #include #include #endif //PCH_H 类定义
class Calculation {public: int quantity; //题目数量 int maximum; //最大数 int elem_len; //每个式子参与运算的个数 bool brackets; //括号 bool decimal; //小数 vector
opt{}; //计算符号 vector expression{}; //生成表达式 vector answer{}; //表达式答案public: void Create(); //生成表达式 void SetQuantity(int q); //设置题目数量 void SetMaximum(int m); //设置最大数值 void SetBrackets(bool b); //设置是否有括号 void SetDecimal(bool d); //设置是否有小数 void SetElem_len(int len); //设置每个式子中数值的个数 void AddOpt(string op) { //运算符号 this->opt.push_back(op); } void SaveFile(); //输出文件 Calculation(int q, int m, bool b, bool d);}; 类实现
Set
前缀方法均为对参数的设置;string
类型vector
变量expression用于保存生成的表达式;Create()
方法用于生成表达式。void Calculation::Create() { srand((unsigned int)(time(NULL))); for (int x = 0; x < quantity; x++) { string tmp; int left = rand() % (elem_len - 1); // 括号左位置 int right = rand() % (elem_len - left - 1) + left + 1; //括号右位置 while (left == 0 && right == elem_len - 1) { left = rand() % (elem_len - 1); // 括号左位置 right = rand() % (elem_len - left - 1) + left + 1; //括号右位置 } for (int i = 0; i < elem_len; i++) { string temp = ""; float number = rand() % maximum + 1 + (float)(rand() % maximum) / maximum; if (this->decimal) { //小数 temp = roundAny(number, 2); } else { temp = roundAny(number, 0); } if (brackets) { //括号 if (i == left) { temp = "(" + temp + " "; } else if (i == right) { temp = temp + ")"; } else { temp = temp + " "; } } else { temp = temp + " "; } if (temp.size() == 2) { temp = " " + temp; } else if (temp.size() == 3) { temp = " " + temp; } tmp += temp; if (i < elem_len - 1) tmp += opt[rand() % (opt.size())] + " "; else tmp += " = "; } expression.push_back(tmp); //std::cout << expression[x] << endl; }}
剩余部分方法实现
补充函数
static std::string roundAny(float r, int precision) { std::stringstream buffer; buffer << std::fixed << std::setprecision(precision) << r; return buffer.str();}
此函数用于将浮点型数据转换成特定位小数的字符串。
四、结果
项目完成的结果:
常规输入输出
包含小数
输出文件
五、总结
在这次结对编程中,要十分感谢我的领航员李宏达
同学。 在程序实现的过程中,他提出了许多真知灼见,让我少犯了许多的错误,这也是为什 么我能在较短的时间内就完成编码。我们两个人互相配合的不错,在完成C++编码的过 程中相处愉快。我们除了使用C++
完成主体的编码,还探索了使用 C#
扩展的图形界面。我们计划使用dll(动态链接库)
对 C++
的类进行封装,之后在C#
中进行调用,但经过一番 尝试因自己本身的才学疏浅未能成功完成此计划。后计划使用C#
重写 类,因时间关系而放弃。 总的来说这次结对编程收获匪浅,让我对合作的有了一定的接触,也学 会了一些协调合作的方法。对任务的内容算得上大体上都完成了,但还不算太好,在 编码前期并没有对任务进行设计研究等。