课程作业四
课程作业四
在看到这次作业时别人可能会觉得很简单,而对我来说又是一次代码的重构,因为我之前只写了一个类。。。。。下面是我改编之后的代码:
git传送门
对于我的代码,我觉得可以分为四个类:
- 交互与储存类
- 题目生成器类
- 计算器类
- 判断与统计类
各个类的代码实现
class creatmachine
{
public:
string int_string(int number); // int类型转化为 string类型
char randomOperation(); //随机符号
string combine(string str1, string str2, char k); //符号数字结合
string generateExpression(); //生成算式
int randomNunber(); //产生随机数
string putdata(); //输出算式
private:
string formula; //产生的算式
};
class calculator
{
public:
float calculateResult(string str); //一级计算函数
float caculate(float Operand1, float Operand2, char Operator); //二级计算函数
void InitPriorities(); //比较优先级容器
float putdata(); //输出结果
private:
float answer; //存储结果
};
class judge
{public:
int scan(float answer,char *p); //用户输入结果并写入文件并判断对错
int readfile(char *p0); //读取文件
int putdata(); //输出统计结果
private:
int right; //正确题目数目
};
class filemachine
{public:
void writefile(char *p0, char *p,int w); //写入函数
void print(int right,char *pp); //输出
void showTip(char *ptr); //程序说明
};
类图
各个类之间的关系
首先根据用户需求,交互与储存类向生成题目类发出需要题目的指令,生成题目类把所生成的题目发给交互与储存类和计算器类并向计算器类发出计算指令。计算器类计算出结果后,发给给交互储存类和判断统计类,判断统计类根据接受的用户答案来判断正误和统计做对题目数量,之后发送给交互储存类。最后交互储存类将接收到的数据一并发给用户和写入文件。
主函数代码实现
int main(int argc, char *argv[])
{
srand(time(0));
filemachine f;
char *p1 = argv[2];
char *p0 = argv[1];
int i = 0, n, sum = 0;
f.showTip(p1);
n = f.readfile(p0);
while (i<n)
{
float user;
creatmachine cr;
calculator ca;
judge j;
string problem = cr.generateExpression();
cout << problem << endl; //输出所生成的算式
float answer = ca.calculateResult(problem); //计算结果交给判断类
cin >> user; //用户输入答案
j.getdata(user); //数据传入
sum += j.scan(answer, p1); //判断
i++;
}
f.print(sum, p1); //输出统计结果
return 0;
}
我的感想
在这次作业中我学会了构建类图,实现将各个类之间的关系清楚的表达出来。写程序时不再是盲目的编码,而是清晰的将各个类联系起来,最后充实各个类中的成员,会为编码带来极大的便利,也会使程序更加清晰。