第八周结对编程报告
一.结对情况
本人:2252407
结对搭档:2252438
二.实现方式
由c++(2252407)和c(2252438)混合编写实现,3位数的四则运算
三.程序完成功能点
首先程序要求如下:
具体实现的功能有:
- 由用户制定计划,确定练习的总题量和练习的天数,由此得出每天练习的题量
- 生成每天的算术表达式,0-100以内的三个数字,两个运算符,答案在0-100以内
- 生成实时计算题,由用户输入,按下Enter后显示正确与否,错误时给出正确答案
亮点细节:
- 当总体量不是天数的倍数时,实时写题系统会按照天数减一来安排前几天的题量,最后一天写剩下的题,同时最后一天时给出提示:“最后一天喽,只剩n道题了!”
- 用户可以选择打印和实时填写两种功能,为用户提供多元的使用方法;
- 能够检验用户的答案是否正确,当用户写错时,对于错误提示中的答案,整数则显示整数,小数则保留两位小数显示;
4.除法的显示符号为“÷”,更加便于用户理解,避免“/”和“%”对于用户的误导。
四.制作过程
2252438同学负责编写程序架构和一部分基础的代码实现,本人(2252407)负责进行代码的优化和细节的修改,代码实现过程中,当一位同学编写代码完成自己的部分时,另一位同学观察和纠错,一位同学完成自己范围内的一部分模块后交换角色;
五.代码
1 #include <iostream> 2 #include <cstdio> 3 #include<string> 4 #include <stdlib.h> 5 #include <time.h> 6 using namespace std; 7 // 生成指定范围内的随机整数 8 int generateRandomNumber(int min, int max) { 9 return min + rand() % (max - min + 1); 10 } 11 12 // 生成随机运算符 13 string generateRandomOperator() { 14 string operators[] = {"+", "-", "*", "÷"};//因为除号想用“÷”,所以要用“string”类 15 int index = rand() % 4; 16 return operators[index]; 17 } 18 19 // 生成算式 20 void generateExpression(int &operand1, string &operator1, int &operand2, string &operator2, int &operand3) { 21 operand1 = generateRandomNumber(0, 100); // 修改范围为0到100 22 operand2 = generateRandomNumber(0, 100); // 修改范围为0到100 23 operand3 = generateRandomNumber(0, 100); // 修改范围为0到100 24 operator1 = generateRandomOperator(); 25 operator2 = generateRandomOperator(); 26 } 27 28 // 检查答案是否正确 29 int checkAnswer(double answer, double expectedAnswer) { 30 return abs(answer - expectedAnswer) < 0.1; // 允许小数点后一位的误差 31 } 32 33 int jisuan(int operand1, string operator1, int operand2, string operator2, int operand3){ 34 35 36 } 37 38 void xieti(int Day,int totalQuestions ){ 39 srand(time(NULL)); // 用当前时间初始化随机数种子 40 int daynum; 41 int lastday=totalQuestions%Day; 42 if(lastday==0) { 43 daynum=totalQuestions/Day; 44 lastday=daynum; 45 } 46 else { 47 daynum=totalQuestions/(Day-1); 48 lastday=totalQuestions%(Day-1); 49 } 50 // 主循环 51 for (int day = 1; day <= Day; day++) { 52 if(day==Day) {daynum=lastday;printf("最后一天喽,只剩%d道题了!",lastday);} 53 printf("Day %d:\n", day); 54 printf("解题过程中的小数注意四舍五入保留两位小数哦!\n"); 55 // 每天的题目循环 56 for (int i = 1; i <= daynum; i++) { 57 int operand1, operand2, operand3; 58 string operator1, operator2; 59 double answer, userAnswer; 60 61 do { 62 generateExpression(operand1, operator1, operand2, operator2, operand3); 63 64 // 计算正确答案 65 double temp; 66 //运算顺序改变时 67 if((operator2=="÷"||operator2=="*") && (operator1!="÷" && operator1!="*")){ 68 if(operator2=="*") temp= operand2* operand3; 69 else if(operator2=="÷"){ 70 // 避免除数为0 71 if (operand3 == 0) { 72 continue; // 重新生成算式 73 } 74 temp=(double)operand2 / operand3; 75 } 76 if(operator1=="+") answer = operand1 + temp; 77 else if(operator1=="-") answer = operand1 - temp; 78 else if(operator1=="*") answer = operand1 * temp; 79 else if(operator1=="÷"){ 80 // 避免除数为0 81 if (temp == 0) { 82 continue; // 重新生成算式 83 } 84 answer = (double)operand1 / temp; 85 } 86 } 87 //从前向后运算 88 else{ 89 if(operator1=="+") temp = operand1 + operand2; 90 else if(operator1=="-") temp = operand1 - operand2; 91 else if(operator1=="*") temp = operand1 * operand2; 92 else if(operator1=="÷"){ 93 // 避免除数为0 94 if (operand2 == 0) { 95 continue; // 重新生成算式 96 } 97 temp = (double)operand1 / operand2; 98 } 99 if(operator2=="+") answer = temp + operand3; 100 else if(operator2=="-") answer = temp - operand3; 101 else if(operator2=="*") answer = temp * operand3; 102 else if(operator2=="÷"){ 103 // 避免除数为0 104 if (operand3 == 0) { 105 continue; // 重新生成算式 106 } 107 answer = (double)temp / operand3; 108 } 109 } 110 } while (answer < 0 || answer > 100); // 重新生成算式直到答案在0到1000间 111 112 cout<<i<<":"<<operand1<<" "<<operator1<<" "<<operand2<<" "<<operator2<<" "<<operand3<<" = "; 113 scanf("%lf", &userAnswer); 114 115 // 检查答案 116 if (checkAnswer(userAnswer, answer)) { 117 printf("答案正确!\n"); 118 } else { 119 if((int(answer*100))%100==0) printf("答案错误!正确答案是: %d\n", (int)answer); 120 else printf("答案错误!正确答案是: %.2f\n", answer); 121 } 122 } 123 } 124 } 125 126 void da_ying(int daynum){ 127 int operand1, operand2, operand3; 128 string operator1, operator2; 129 double answer, userAnswer; 130 131 for(int w=1;w<=daynum;w++){ 132 do { 133 generateExpression(operand1, operator1, operand2, operator2, operand3); 134 135 // 计算正确答案 136 double temp; 137 138 //运算顺序改变时 139 if((operator2=="÷"||operator2=="*") && (operator1!="÷" && operator1=="*")){ 140 if(operator2=="*") temp= operand2* operand3; 141 else if(operator2=="÷"){ 142 // 避免除数为0 143 if (operand3 == 0) { 144 continue; // 重新生成算式 145 } 146 temp=(double)operand2 / operand3; 147 } 148 if(operator1=="+") answer = operand1 + temp; 149 else if(operator1=="-") answer = operand1 - temp; 150 else if(operator1=="*") answer = operand1 * temp; 151 else if(operator1=="÷"){ 152 // 避免除数为0 153 if (temp == 0) { 154 continue; // 重新生成算式 155 } 156 answer = (double)operand1 / temp; 157 } 158 } 159 //从前向后运算 160 else{ 161 if(operator1=="+") temp = operand1 + operand2; 162 else if(operator1=="-") temp = operand1 - operand2; 163 else if(operator1=="*") temp = operand1 * operand2; 164 else if(operator1=="÷"){ 165 // 避免除数为0 166 if (operand2 == 0) { 167 continue; // 重新生成算式 168 } 169 temp = (double)operand1 / operand2; 170 } 171 if(operator2=="+") answer = temp + operand3; 172 else if(operator2=="-") answer = temp - operand3; 173 else if(operator2=="*") answer = temp * operand3; 174 else if(operator2=="÷"){ 175 // 避免除数为0 176 if (operand3 == 0) { 177 continue; // 重新生成算式 178 } 179 answer = (double)temp / operand3; 180 } 181 } 182 } while (answer < 0 || answer > 100); // 重新生成算式直到答案在0到1000间 183 cout<<w<<": "<<operand1<<" "<<operator1<<" "<<operand2<<" "<<operator2<<" "<<operand3<<" = \t"; 184 if (w % 3 == 0) cout <<endl <<endl; 185 } 186 } 187 int main() { 188 cout<<"-------欢迎来到写题系统-------"<<endl; 189 cout<<"请先确认您的写题计划:"<<endl; 190 cout<<"请输入您的总刷题数:";int num; 191 cin>>num; 192 cout<<"请输入您的刷题天数:"; 193 int day;cin>>day; 194 menu: 195 cout<<"请选择一下功能:"<<endl; 196 cout<<"1、打印"<<endl; 197 cout<<"2、实时写题"<<endl; 198 cout<<"请输入:"; 199 int op; 200 cin>>op; 201 switch(op){ 202 case 1: 203 { 204 int numday,lastday; 205 lastday=num%day; 206 if(lastday!=0) numday=num/day+1; 207 else numday=num/day; 208 da_ying(numday); 209 goto menu; 210 } 211 case 2: 212 { 213 xieti(day,num); 214 goto menu; 215 } 216 default: 217 cout<<"输入错误,请重新输入!"<<endl; 218 goto menu; 219 } 220 return 0; 221 }
六.运行截图
(1)进入程序后输入计划:
- 主菜单截图
- 打印效果
- 实时编辑
4.1 答案正确时
4.2答案错误时
4.3 最后一天
4.4 除法
七.运行环境
基于Windows 11系统的c++在线编译器,地址:https://lightly.teamcode.com/login
八.实验总结和体会
总结:
结对编程的过程会很考验耐心和沟通能力,首先在在任务初期要确定具体实现哪些功能和实现功能的方法,在确定实现的方法时,由于队友想尝试EXCEL实现,本人当堂课状态不佳,因此课堂上并我们没有开始编写代码,而是在做一些基础的准备工作,之后确定通过c/c++实现,因为二者是兼容的,因此两人各自选择了自己更熟悉的语言(2252438:c,2252407:c++)。具体的功能实现上,由2252438实现代码框架和简单功能的基本实现,2252407进行功能的完善和细节优化,最后经过商讨确定最后的版本内容。
二人总结结对编程优缺点如下:
优点:
1. 提高代码质量:由于有两个人同时参与编程,彼此可以及时发现并纠正错误,从而提高代码的质量。
2. 提升双方的能力:结对编程有助于两人之间的知识传递和共享,让每个人都能从对方的经验中学习到新的东西。
3. 增加趣味性,一定程度上提示效率:结对编程在完成某一模块后,互换角色,可以使编码者、观察者免于重复性工作导致的疲惫,双方的沟通也使得编程的趣味性增加,使编程效率在一定程度上得到了提升。
4. 便于思路的更新:结对编程时,若是忽然有了某个想法或是在编程过程中遇到了什么问题,可以及时的沟通得到解决,方案的更新更加高效。
缺点:
1. 沟通投入成本高:结对编程建立在双方密切合作的前提下,因此沟通成本可能会相对较高。特别是在对项目的构思阶段,双方需要将项目的方向以及实现细节确定下来,并彼此理解对方的想法。如果双方沟通不畅或存在误解,会影响编程进度和质量。
2. 对团队成员的依赖性强:结对编程中,一个队员的表现会影响另一个队员的工作进度和质量。如果其中一方表现不佳或出现问题,会对整个团队造成负面影响。
3. 结对编程时,对于出现的问题需要快速解决,否则项目的进度会显著降低。
体会:
2252407:
编写代码时有人在一旁观察是一种很神奇的体验,最开始会不习惯,后面会下意识的去询问对方的想法,和对方分享自己编写的思路,对于体量不大的代码,编写过程会有趣很多,但是对于难度较高的代码可能会由于专注度降低,导致编写的效率降低;
在担任观察员时,要事先和队友充分的沟通,确认队友编写代码的思路,发现问题要确认后再提出,可以先提出疑问,不能直接不经思考的指出对方写错了,要尊重对方的编程习惯;对于队友在编写过程中出现的问题进行提出和解决时,再提出疑问发现问题后,要留给队友思考和反应的时间,和正在编写的队友共同讨论解决;
2252438:
在结对编程过程中,我和队员两人,一人编写程序,一人审核代码,之后再互换角色。
在编写程序过程中,观察员及时的反馈机制让我更专注于代码的编写,自己每一步编程都会被仔细审查,观察员也经常能指出代码中可能会忽视的问题和潜在的改进点。
作为观察员时,需要时刻关注编码者的编码过程,提出改进意见并避免潜在问题。这个过程能够令观察员更深入地理解代码的结构和逻辑。
结对编程相比独自编程而言具有较高的趣味性和积极性,同时能够拥有更好的心态去实现项目。