结对作业

这个作业属于哪个课程
信安1912
这个作业要求在哪里
作业要求
这个作业的目标
小学四则运算生成器+生成应用程序+结对

一、Github 链接

Github:仓库链接

二、设计与实现过程

2.1 逆波兰式及计算结果

vector<string >Polish(string s)///已完成
{//把基础算式变为一个波兰式
	stack<string> opstack;//辅助栈
	vector<string >polish;//逆波兰结果
	string s1;//temp变量
	//以下均为板子,参考逆波兰式
	for(int i =0;i<s.size();++i)
	{
		if(s[i]=='('){opstack.push("(");continue;}
		if(s[i]>='0'&&s[i]<='9')
		{
			s1 = "";
			while(i<s.size()&&((s[i]>='0'&&s[i]<='9')||s[i]=='`'||s[i]=='_') )s1 += s[i++];
			--i;
			polish.push_back(s1);
			continue;
		}
		if(s[i]==')')
		{
			while(opstack.size())
			{
				if(opstack.top()!="(")
				{
					polish.push_back(opstack.top());
					opstack.pop();
				}
				else
				{
					opstack.pop();
					break;
				}
			}
		}
		else
		{
			s1 = s[i];
			while(opstack.size()&&pri(opstack.top())>=pri(s1))
			{
				polish.push_back(opstack.top());
				opstack.pop();
			}
			opstack.push(s1);
		}
	}
	while(opstack.size())
	{
		polish.push_back(opstack.top());
		opstack.pop();
	}
	return polish;
}
pii cal(pii a, pii b,char op)///已完成
{//对两个分数进行求解;
	pii res;
	if(op=='+')res = {a.X*b.Y + a.Y*b.X,a.Y*b.Y};
	else if(op=='-')res = {a.X*b.Y - a.Y*b.X,a.Y*b.Y};
	else if(op=='*')res = {a.X*b.X,a.Y*b.Y};
	else if(op=='/')res = {a.X*b.Y,a.Y*b.X};
	if(res.X==0)return (pii ){0,1};
	if(res.Y==0)return (pii ){0,0};
	int g = __gcd(res.X,res.Y);//通分
	return (pii ){res.X/g,res.Y/g};//通分
}
pii func(vector<string >P)///已完成
{//对逆波兰式P进行计算;
	stack<pii >st;//存数;
	int n = P.size();
	//计算逆波兰的板子
	for(int i =0;i<n;++i)
	{
		if(P[i]=="+"||P[i]=="-"||P[i]=="*"||P[i]=="/")
		{
			pii a= st.top();st.pop();
			pii b = st.top();st.pop();
			st.push(cal(b,a,P[i][0]) );
		}
		else
		{
			pii temp ;
			if(P[i].size()==1)
			{
				temp = {P[i][0]-'0',1} ;
			}
			else if(P[i][1]=='`')
			{
				temp = {P[i][2]-'0'+(P[i][4]-'0')*(P[i][0]-'0'),P[i][4]-'0'};
			}
			else if(P[i][1]=='_')
			{
				temp = {P[i][0]-'0',P[i][2]-'0'};
			}
			int g = __gcd(temp.X,temp.Y);
			st.push((pii ){temp.X/g,temp.Y/g});
		}
		//printf("%d %d %d\n",st.size(),st.top().X,st.top().Y);
	}
	return st.top();
}

2.2 生成题目与答案文件

map<pii ,bool>m;
vector<pii >g;
void make()///已完成
{//生成题目文件和正确答案文件
	printf("输入数据组数和数据范围n:");
	int t;scanf("%d %d",&t,&n);n--;
	while(n<0||n>9){printf("n的数据范围超限了");scanf("%d",&n);n--;}
	freopen("Exercises.txt","w",stdout);
	for(int i=1;i<=t;++i)
	{
		printf("%d: ",i);
		m.clear();//使用map来检查当前答案是否为负数或者已经存在过;
		while(1)
		{
			string s = func(f(2)+1);//生成题目
			pii ans = func(Polish(s) );//计算题目并求出答案
			if(ans.Y<0){ans.X=-ans.X;ans.Y=-ans.Y;}
			if(m[ans]||ans.Y==0||ans.X<0)continue;//若已存在过||答案无意义||答案为负数则重新生成;
			output(s);//输出题目
			g.push_back(ans);//把答案存起来
			break;
		}
	}
	freopen("correct.txt","a",stdout);
	for(int i =0;i<g.size();++i)out(g[i]);//最后压入正确答案文件;
}



2.3 校对答案正误

map<string ,int > v;
vector<int > yes,no;
void check()///已完成
{// 检查目录下的输入文件和答案文件,把结果输出到grade
	freopen("Answers.txt","r",stdin);
	int cnt =0;
	string s ;
	while(cin>>s)
	{
		//cout<<cnt<<' '<<s<<' '<<s.size()<<endl;
		++cnt;
		v[s] = cnt;
	}
	fclose(stdin);
	freopen("correct.txt","r",stdin);
	cnt =0;
	char ks[20] = "";
	while(~scanf("%s",ks))
	{
		s = "";int n = strlen(ks);
		for(int i =0;i<n;++i)s+=ks[i];
		//cout<<cnt<<' '<<s<<' '<<s.size()<<endl;
		++cnt;
		if(v[s]==cnt)yes.push_back(cnt);
		else no.push_back(cnt);;
	}
	//printf("09");
	freopen("Grade.txt","w",stdout);
	printf("Correct: %d (",yes.size());
	for(int i =0;i<yes.size();++i)printf(", %d"+(i==0),yes[i]);
	printf(")\r");
	printf("Wrong: %d (",no.size());
	for(int i =0;i<no.size();++i)printf(", %d"+(i==0),no[i]);
	printf(")\r");
}

返回正误题号

三、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时
Planning 计划 20 30
- Estimate - 估计这个任务需要多少时间 20 30
Development 开发 1375 2350
- Analysis 需求分析(包括学习新技术) 30 200
- Design Spec 生成设计文档 5 15
- Design Review 设计复审 5 10
- Coding Standard 代码规范(为目前的开发制定合适的规范) 15 5
- Design 具体设计 300 300
- Coding 具体编码 600 1200
- Code Review 代码复审 300 500
- Test 测试 120 120
Reporting 报告 110 165
- Test Repor 测试报告 30 60
- Size Measurement 计算工作量 20 10
- Postmortem & Process Improvement Plan 事后总结,并提出过程改进计划 60 95
合计 1505 2545

四、小结

成员1:张伟龙小结

本次项目是与梁卓楠两人完成的,大部分工作由卓楠完成,学习到了很多东西。

1.跟着卓楠交流c++,对语言理解更深一些。

2.对项目中的很多注意事项进行探讨,分数、负数、重复等问题。

3.图、容器等语言知识和逆波兰式的应用。

成员2:梁卓楠

在这次结队项目中,我体会到了合作的重要性。个人可以做完整个项目,但是合作分工可以让工作完成的更加顺利高效并且具有活力,还可以在交流的过程中收获不同的idea和想法。

总的来说,这一次结对作业是一次特别的体验,从中我也学习到了很多~~

posted @ 2021-10-26 01:09  缕缕过客  阅读(26)  评论(0编辑  收藏  举报