结对作业
这个作业属于哪个课程 | |
---|---|
这个作业要求在哪里 | |
这个作业的目标 |
一、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和想法。
总的来说,这一次结对作业是一次特别的体验,从中我也学习到了很多~~