作业三
姓名:赖铮华
学号:3122004482
github链接:https://github.com/jiongand/-jiongand/tree/main/app/x64/Release
作业所属课程 | 软工2024 |
---|---|
作业要求 | 结对项目 |
作业目标 | 积累项目经验。体验项目制作流程。练习计算机语言语法。 |
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 40 | 45 |
Estimate | 估计这个任务需要多少时间 | 20 | 25 |
Development | 开发 | 300 | 600 |
Analysis | 需求分析 (包括学习新技术) | 80 | 190 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 | 15 | 15 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
Design | 具体设计 | 15 | 15 |
Coding | 具体编码 | 60 | 300 |
Code Review | 代码复审 | 20 | 34 |
Test | 测试(自我测试,修改代码,提交修改) | 56 | 66 |
Reporting | 报告 | 5 | 5 |
Test Repor | 测试报告 | 5 | 5 |
Size Measurement | 计算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 20 |
合计 | 641 | 1335 |
实现过程
本次项目选取实现语言为c++。
为方便对题目的查重,决定以二叉树的形式来存储一条算式。对二叉树之间进行是否对称或等同的测试来鉴别题目是否重复。
运算符和数字的生成分别依赖与函数的返回值,函数内部通过随机数来随机生成符号和数字。按照先符号后数字插入树中。
主功能头文件如下
class mmm
{
//B_Tree为自定义二叉树类
vector<B_Tree> forest;//存放所有的题目
vector<string> ans_;//存放所有题目的答案
int max_Tree;//题目的总量
int max_Number;//生成数字最大量
int now_Tree;//当前已有题目量
void minCommonMultiple(int& a,int& b);//最小公倍数
int maxCommonDicisor(int a,int b);//最大公约数
bool if_same(Node*t1,Node*t2);//判断二叉树是否相等
bool if_symmetry(Node*t1,Node*t2);//判断二叉树是否对称
bool test();//判断题目是否合法
public:
mmm(int t,int n);
string answer(const string& ppp);//计算题目
mmm();
~mmm();
bool createTree();//生成一个题目
void full_create();//生成所有合法题目
string generalSymbol();//生成四则运算符
string generalNumber();//生成数字
string change(const string&nnn);//用于计算,把真分数转换为假分数
string re_change(const string&nnn);//将假分数反向转回真分数
string jisuan(const string &num1,const string &num2,const string &symbol);//完成两目运算
string show_tree();//用于测试
bool write(const char* tar);//写入文档
bool write_ans(const char* ans);//写入答案
void set_MaxTree(int a);//设置最大题目量
void set_MaxNumber(int a);//设置出现的最大数字
};
计算算式借助逆波兰表达式进行。
对于需求9,则新设计一类解决。
每读取一行算式,计算后与答案对比。正确则将题目号插入对应的vector,错误同理。
头文件如下:
class checker
{
vector<int> c;//正确的题目
vector <int>w;//错误的题目
////
string change(const string&nnn);
string re_change(const string&nnn);
string jisuan(const string &num1, const string &num2, const string &symbol);
void minCommonMultiple(int& a, int& b);//最小公倍数
int maxCommonDicisor(int a, int b);//最大公约数
////被注释框住的是answer的前置函数
string answer(const string& ppp);//计算题目
public:
void compare(const char*e,const char*a,const char*p);//读取e中题目,a中答案,结果写入p
};
效能分析
以下为生成一万道题目的性能分析
很明显,对题目合法性的检测占用最大。但无力解决。
附上消耗最大的函数
测试用例
胡乱输入测试
输入负数
正常输入
生成的文件
用上面生成的文件进行功能9