一, 实验目标:
1)体验敏捷开发中的两人合作.
2)进一步提高个人编程技巧与实践.
二 , 实验内容:
1)根据以下问题描述, 练习结对编程 (pair programming) 实践;
2)要求学生两人一组, 自由组合. 每组使用一台计算机, 二人共同编码, 完成实验要求.
3)要求在结对编程工作期间, 两人的角色至少切换 4 次;
4)编程语言不限, 版本不限. 建议使用 Python 或 JAVA 进行编程.
三 需求分析
1. 能够自动出题
2. 包含 "+,-,*,/,()" 的四则运算.
3. 能够自定义出题目的数量
4. 能够判别答案的正确与否
5. 能根据所答情况打分
四 结构设计
1. 自动出题用随机数生成语句实现: 包括随机生成数字, 运算符号和
2. 用变量约束左右括号顺序和同时存在的特点.
3. 将题目输出并用字符串存储
4 . 对字符串入栈进行运算.
五 程序流程图
五 部分代码
主函数控制题目数量:
- char ans[]="\0";
- int b,i;
- srand(time(0));
- while(1)
- {
- printf("当前功能: 生成题库 \ n");
- printf("请输入所需题目数量:");
- scanf("%d",&b);
- for(i=0;i<b;i++){
- exp();
- printf("%d\n",CalcExp(math));
- }
- }
利用栈对表达式进行计算:
采用符号优先值对五种运算符号进行控制.
- while(c!='='||x!='=') // 循环处理表达式中的每一个字符 {
- if(isOperator(c)) // 如果是运算符 {
- if(flag){
- seqStackPush(StackData,q); // 表达式入栈
- q=0; // 操作数清零
- flag=0; // 标志清零, 表示操作数已经入栈
- }
- switch(PRI(x,c)) // 判断运算符优先级 {
- case -1:
- seqStackPush(StackOper,c); // 运算符进栈
- c=exp[i++];
- break;
- case 0:
- c=seqStackPop(StackOper); // 运算符括号, 等号出栈, 被抛弃
- c=exp[i++]; // 取下一个 字符
- break;
- case 1:
- oper=seqStackPop(StackOper); // 运算符出栈
- b=seqStackPop(StackData);
- a=seqStackPop(StackData); // 两个操作数出栈
- t=Calc(a,oper,b); // 计算结果
- seqStackPush(StackData,t); // 将运算结果入栈
- break;
- }
- }else if(c>='0'&&c<='9') // 如果输出的字符在 0 到 9 之间 {
- c-='0'; // 把字符转换成数字
- q=q*10+c; // 多位数的进位处理
- c=exp[i++]; // 取出下一位字符
- flag=1; // 设置标志, 表示操作数未入栈
- }
- else {
- printf("输入错误 \ n");
- getch();
- exit(0);
- }
- x=seqStackPeek(StackOper); // 获取栈顶操作符
- }
- q=seqStackPop(StackData);
- seqStackfree(StackOper);
- seqStackfree(StackData); // 释放内存占用空间
- return q; // 出栈, 返回结果
- }
随机生成数字及符号:
- c=rand()%19+1; // 数字
- printf("%d",c);
- b=rand()%4; // 符号
- switch(b)
- {
- case 0: printf("+"); math[m]='+';m++;
- if(i<a-3&&j==10) b=10;
- else b=rand()%4; break;
- case 1: printf("-"); math[m]='-';m++;
- if(i<a-3&&j==10) b=10;
- else b=rand()%4; break;
- case 2: printf("*"); math[m]='*';m++;
- if(i<a-3&&j==10) b=10;
- else b=rand()%4; break;
- case 3: printf("/"); math[m]='/';m++;
- b=20; break;
- }
- if(b==10)
- {
- printf("(");
- math[m]='(';m++;
- j=3;
- b=rand()%4;
- }
- if(j!=10)
- j--;
- if(j==0){
- printf(")");
- math[m]=')';
- m++;
- b=rand()%3;
- j=10;
- }
运行结果:
六运行结果截图
1)主界面
2)超出预设范围报错
3)从文件调出题目答题
4)结果与答案的比对
5)题目做完和计时结束
七 结对编程过程
本次实验我们因为疫情原因不能在学校面对面互相协助, 所以我们采用了 qq 视频电话与屏幕分享, 当一个人编写程序的时候, 另一个人检查纠错检查
我们用了一晚上的时间, 初步完成了这次试验, 后期还有些细枝末节的修改
八 实验总结
在结对编程中, 我承担驾驶员的角色, 我的队友是领航员的角色, 我主要负责代码的输入, 如代码文件的创建及配置等, 我的队友主要起到引领的作用, 由于我们对基础知识都掌握的不是很牢固, 想实现一些功能时, 总是不知道使用什么方法, 这时候队友的工作就很起作用, 他在旁边搜查相关知识点的资料, 告诉我下一步要实现什么功能, 然后我们一起讨论解决过程中遇到的问题. 我们的默契度有了一定的提高, 但是有时候想问题, 思想还是不会同步, 但是我相信我们的默契度以后还会得到更大的提高.
成员博客地址 & 仓库地址
1 周宗逸: https://www.cnblogs.com/zzynb/
2 周乐天 https://www.cnblogs.com/alanandpython/
3 仓库地址: https://github.com/zhoudashuaibi/my-travel-plans
来源: http://www.bubuko.com/infodetail-3494116.html