作业三

姓名:赖铮华
学号: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
};

效能分析

以下为生成一万道题目的性能分析
g
很明显,对题目合法性的检测占用最大。但无力解决。

附上消耗最大的函数
gg

测试用例

胡乱输入测试
hu

输入负数
tt

正常输入
z
生成的文件
e
a

用上面生成的文件进行功能9
asd

ddd

posted @ 2024-03-25 18:00  格外后悔  阅读(21)  评论(0编辑  收藏  举报