第八周结对编程报告

一.结对情况

本人:2252407
结对搭档:2252438

二.实现方式

由c++(2252407)和c(2252438)混合编写实现,3位数的四则运算

三.程序完成功能点

首先程序要求如下:

具体实现的功能有:

  1. 由用户制定计划,确定练习的总题量和练习的天数,由此得出每天练习的题量
  2. 生成每天的算术表达式,0-100以内的三个数字,两个运算符,答案在0-100以内
  3. 生成实时计算题,由用户输入,按下Enter后显示正确与否,错误时给出正确答案

亮点细节:

  1. 当总体量不是天数的倍数时,实时写题系统会按照天数减一来安排前几天的题量,最后一天写剩下的题,同时最后一天时给出提示:“最后一天喽,只剩n道题了!”
  2. 用户可以选择打印和实时填写两种功能,为用户提供多元的使用方法;
  3. 能够检验用户的答案是否正确,当用户写错时,对于错误提示中的答案,整数则显示整数,小数则保留两位小数显示;

    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)进入程序后输入计划:

  1. 主菜单截图

  1. 打印效果

  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

在结对编程过程中,我和队员两人,一人编写程序,一人审核代码,之后再互换角色。

在编写程序过程中,观察员及时的反馈机制让我更专注于代码的编写,自己每一步编程都会被仔细审查,观察员也经常能指出代码中可能会忽视的问题和潜在的改进点。

作为观察员时,需要时刻关注编码者的编码过程,提出改进意见并避免潜在问题。这个过程能够令观察员更深入地理解代码的结构和逻辑。

结对编程相比独自编程而言具有较高的趣味性和积极性,同时能够拥有更好的心态去实现项目。

posted on 2024-04-25 08:57  小桥流水人家026  阅读(15)  评论(0编辑  收藏  举报