结对编程个人项目分析
Posted sorvon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结对编程个人项目分析相关的知识,希望对你有一定的参考价值。
项目需求
个人项目:中小学数学卷子自动生成程序
用户:
小学、初中和高中数学老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6、个人项目9月17日早上8点以前提交至各自负责的助教处。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。
附表-1:账户、密码
账户类型 |
账户 |
密码 |
备注 |
小学 |
张三1 |
123 |
|
张三2 |
123 |
|
|
张三3 |
123 |
|
|
初中 |
李四1 |
123 |
|
李四2 |
123 |
|
|
李四3 |
123 |
|
|
高中 |
王五1 |
123 |
|
王五2 |
123 |
|
|
王五3 |
123 |
|
附表-2:小学、初中、高中题目难度要求
|
小学 |
初中 |
高中 |
|
难度要求 |
+,-,*./ |
平方,开根号 |
sin,cos,tan |
|
备注 |
只能有+,-,*./和() |
题目中至少有一个平方或开根号的运算符 |
题目中至少有一个sin,cos或tan的运算符 |
|
代码分析
优点
使用结构体对用户信息进行初始化,十分方便
struct Student char name[20]; char degree[5]; char password[20]; ; Student stu[9] ="张三1","小学","123","张三2","小学","123","张三3","小学","123", "李四1","初中","123","李四2","初中","123","李四3","初中","123", "王五1","高中","123","王五2","高中","123","王五1","高中","123";
反例
class UserDB public: string name; string password; string grade; ; UserDB user_db[9]; void load_db() user_db[0].name="张三1"; user_db[0].password="123"; user_db[0].grade="小学"; user_db[1].name="张三2"; user_db[1].password="123"; user_db[1].grade="小学"; user_db[2].name="张三3"; user_db[2].password="123"; user_db[2].grade="小学"; user_db[3].name="李四1"; user_db[3].password="123"; user_db[3].grade="初中"; user_db[4].name="李四2"; user_db[4].password="123"; user_db[4].grade="初中"; user_db[5].name="李四3"; user_db[5].password="123"; user_db[5].grade="初中"; user_db[6].name="王五1"; user_db[6].password="123"; user_db[6].grade="高中"; user_db[7].name="王五2"; user_db[7].password="123"; user_db[7].grade="高中"; user_db[8].name="王五3"; user_db[8].password="123"; user_db[8].grade="高中";
使用strftime函数获取格式化日期信息
static string getCurrentTimeStr() time_t t = time(NULL); char ch[64] = 0; strftime(ch, sizeof(ch) - 1, "%Y-%m-%d-%H-%M-%S", localtime(&t)); //年-月-日-时-分-秒 return ch;
strftime是一种计算机函数,根据区域设置格式化本地时间/日期,函数的功能将时间格式化,或者说格式化一个时间字符串。我们可以根据format指向字符串中格式命令把timeptr中保存的时间信息放在strDest指向的字符串中,最多向strDest中存放maxsize个字符。该函数返回向strDest指向的字符串中放置的字符数。
头文件:time.h
size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr );
出题逻辑完整,能随机生成任意形式的题目
1.cos(7)+32+cos(tan(17))*cos(cos(tan(20))) 2.cos(76)+5-32+sin(cos(66))+cos(sin(cos(96))) 3.√(cos(5))*cos(tan(47))/√(cos(cos(tan(81)))) 4.tan(25)+tan(41)+tan(75) 5.√(73)*89/53/tan(63)-√(tan(93)) 6.tan(sin(cos(tan(18))))/sin(cos(tan(95))) 7.sin(tan(sin(tan(82)))) 8.cos(47)-cos(63) 9.√(sin(sin(57)))/sin(19) 10.√(sin(sin(cos(tan(87)))))/sin(cos(tan(46))) 11.(cos(64))/77/sin(cos(1))^2 -(cos(sin(cos(77)))^2 ) 12.sin(tan(sin(tan(5)))) 13.35*(58)*73/tan(40)/tan(27) 14.√(sin(sin(tan(51)))) 15.(√(sin(cos(32))))*sin(cos(35))-sin(cos(sin(cos(1))))^2 16.√(tan(sin(tan(29))))-sin(tan(95)) 17.tan(sin(cos(tan(2)))) 18.57/cos(23)*cos(82) 19.√(sin(tan(sin(tan(14)))))/sin(tan(33)) 20.tan(tan(56)) 21.(6)/tan(39)-tan(54) 22.cos(tan(100))+55*cos(tan(70))-cos(tan(cos(tan(60)))) 23.38*56/tan(75)*tan(53) 24.(tan(61))-sin(tan(29)^2 )-(sin(tan(54)))^2 25.(35)/tan(22)^2 /(tan(37))^2 26.(59)+sin(cos(tan(62)^2 ))/(sin(cos(tan(97))))^2 27.17*(37)-64-sin(19)/sin(92) 28.49-(11)+cos(tan(36))*cos(tan(77)) 29.tan(sin(tan(47))) 30.sin(93)+sin(55)/sin(74)
缺点
出题函数长达500行,将小学、初中、高中题目完全分开,导致了大量功能相似的代码行
1 void Chuti(Student stu,char *degree0,int num) 2 3 int num0=1; 4 cout<<degree0<<"出题成功"<<endl; 5 srand((unsigned)time(NULL)); 6 ofstream outfile; 7 const char *filename1=getCurrentTimeStr().c_str(); 8 char filename[100]=""; 9 strcat(filename,filename1); 10 strcat(filename,".txt"); 11 char path[100]=""; 12 char *xiegang="\\\\"; 13 const char *file=getFile(); 14 strcat(path,file); 15 strcat(path,stu.name); 16 char path0[100]=""; 17 18 strcat(path,xiegang); 19 strcat(path,degree0); 20 strcpy(path0,path); 21 strcat(path,xiegang); 22 strcat(path,filename); 23 outfile.open(path); 24 if(!outfile) 25 26 char command[100]="mkdir "; 27 strcat(command,stu.name); 28 strcat(command,xiegang); 29 strcat(command,degree0); 30 system(command); 31 outfile.open(path); 32 33 if(strcmp(degree0,"小学")==0) 34 35 while(num0<=num) 36 37 outfile<<num0<<‘.‘; 38 int cznum=rand()%5+1; 39 bool kuohao=rand()%2; 40 bool shoukuohao=0; 41 42 if (cznum<3) 43 44 kuohao=0; 45 46 int count=0; 47 int kuohaouse=0; 48 int cznum0=cznum-1; 49 while(cznum--) 50 51 bool choose0=rand()%2; 52 bool choose1=rand()%2; 53 int temp=rand()%100+1; 54 int jjcc=rand()%4+1; 55 if(kuohao&&cznum>=2&&choose0&&!kuohaouse) 56 57 outfile<<"("; 58 kuohaouse=1; 59 if(cznum0==cznum) 60 61 shoukuohao=1; 62 63 64 outfile<<temp; 65 count++; 66 if(kuohao&&kuohaouse&&choose1&&count>=2) 67 68 outfile<<")"; 69 kuohao=0; 70 kuohaouse=0; 71 72 if(kuohao&&kuohaouse&&cznum==0) 73 74 outfile<<")"; 75 kuohaouse=0; 76 77 if(shoukuohao&&kuohaouse&&cznum==1) 78 79 outfile<<")"; 80 kuohaouse=0; 81 82 if(cznum>0) 83 84 if(jjcc==1) outfile<<"+"; 85 else if(jjcc==2) outfile<<"-"; 86 else if(jjcc==3) outfile<<"*"; 87 else if(jjcc==4) outfile<<"/"; 88 89 90 num0++; 91 outfile<<endl<<endl; 92 93 94 if(strcmp(degree0,"初中")==0) 95 96 while(num0<=num) 97 98 // bool kuohao=rand()%2+1; 99 100 bool pingfang=rand()%2; 101 bool genhao=rand()%2; 102 while(!(pingfang||genhao)) 103 104 pingfang=rand()%2; 105 genhao=rand()%2; 106 107 outfile<<num0<<‘.‘; 108 int cznum=rand()%5+1; 109 bool kuohao=rand()%2; 110 bool shoukuohao=0; 111 112 bool pingfangout=rand()%2; 113 bool genhaoout=rand()%2; 114 115 bool pingfanguse=0; 116 bool genhaouse=0; 117 118 int numkh=0; 119 if (cznum<3) 120 121 kuohao=0; 122 123 int count0=0; 124 int count1=0; 125 int count=0; 126 int kuohaouse=0; 127 int cznum0=cznum-1; 128 while(cznum--) 129 130 131 bool choose0=rand()%2; 132 bool choose1=rand()%2; 133 int temp=rand()%100+1; 134 int jjcc=rand()%4+1; 135 if(pingfang&&pingfangout&&!pingfanguse) 136 137 outfile<<"("; 138 numkh++; 139 pingfanguse=1; 140 141 142 if(genhao&&genhaoout&&!genhaouse) 143 144 outfile<<"√("; 145 numkh++; 146 genhaouse=1; 147 148 149 if(cznum==0||cznum==1) 150 151 if(pingfang==1) 152 153 outfile<<"("; 154 numkh++; 155 pingfanguse=1; 156 157 if(genhao==1) 158 159 outfile<<"√("; 160 numkh++; 161 genhaouse=1; 162 163 164 165 166 167 if(kuohao&&cznum>=2&&choose0&&!kuohaouse) 168 169 outfile<<"("; 170 numkh++; 171 kuohaouse=1; 172 if(cznum0==cznum) 173 174 shoukuohao=1; 175 176 177 outfile<<temp; 178 count++; 179 count0++; 180 count1++; 181 182 if(genhao&&genhaouse&&cznum==0&&numkh>0) 183 184 outfile<<")"; 185 numkh--; 186 genhaouse=0; 187 188 if(genhao&&genhaoout&&genhaouse&&count1>=1&&numkh>0) 189 190 outfile<<")"; 191 numkh--; 192 genhaouse=0; 193 count1=0; 194 195 196 if(pingfanguse&&cznum==0&&numkh>0) 197 198 outfile<<")^2 "; 199 numkh--; 200 pingfanguse=0; 201 202 if(pingfang&&pingfangout&&pingfanguse&&count0>=1&&numkh>0) 203 204 outfile<<")^2 "; 205 numkh--; 206 pingfanguse=0; 207 count0=0; 208 209 210 if(kuohao&&kuohaouse&&choose1&&count>=2&&numkh>0) 211 212 outfile<<")"; 213 numkh--; 214 kuohaouse=0; 215 count=0; 216 217 if(kuohao&&kuohaouse&&cznum==0&&numkh>0) 218 219 outfile<<")"; 220 numkh--; 221 kuohaouse=0; 222 223 if(shoukuohao&&kuohaouse&&cznum==1&&numkh>0) 224 225 outfile<<")"; 226 numkh--; 227 kuohaouse=0; 228 229 230 while(numkh>0) 231 232 numkh--; 233 outfile<<")"; 234 235 236 237 if(cznum>0) 238 239 if(jjcc==1) outfile<<"+"; 240 else if(jjcc==2) outfile<<"-"; 241 else if(jjcc==3) outfile<<"*"; 242 else if(jjcc==4) outfile<<"/"; 243 244 245 246 num0++; 247 outfile<<endl<<endl; 248 249 250 if(strcmp(degree0,"高中")==0) 251 252 while(num0<=num) 253 254 bool pingfang=rand()%2; 255 bool genhao=rand()%2; 256 bool sincal=rand()%2; 257 bool coscal=rand()%2; 258 bool tancal=rand()%2; 259 while(!(sincal||coscal||tancal)) 260 261 sincal=rand()%2; 262 coscal=rand()%2; 263 tancal=rand()%2; 264 265 int numkh=0; 266 outfile<<num0<<‘.‘; 267 int cznum=rand()%5+1; 268 bool kuohao=rand()%2; 269 bool shoukuohao=0; 270 271 bool pingfangout=rand()%2; 272 bool genhaoout=rand()%2; 273 274 bool pingfanguse=0; 275 bool genhaouse=0; 276 277 bool sinout=rand()%2; 278 bool cosout=rand()%2; 279 bool tanout=rand()%2; 280 281 bool sinuse=0; 282 bool cosuse=0; 283 bool tanuse=0; 284 285 if (cznum<3) 286 287 kuohao=0; 288 289 int count0=0; 290 int count1=0; 291 int count=0; 292 int count2=0; 293 int count3=0; 294 int count4=0; 295 int kuohaouse=0; 296 int cznum0=cznum-1; 297 while(cznum--) 298 299 300 bool choose0=rand()%2; 301 bool choose1=rand()%2; 302 int temp=rand()%100+1; 303 int jjcc=rand()%4+1; 304 if(pingfang&&pingfangout&&!pingfanguse) 305 306 outfile<<"("; 307 numkh++; 308 pingfanguse=1; 309 310 311 if(genhao&&genhaoout&&!genhaouse) 312 313 outfile<<"√("; 314 numkh++; 315 genhaouse=1; 316 317 318 319 if(sincal&&sinout&&!sinuse) 320 321 outfile<<"sin("; 322 numkh++; 323 sinuse=1; 324 325 if(coscal&&cosout&&!cosuse) 326 327 outfile<<"cos("; 328 numkh++; 329 cosuse=1; 330 331 if(tancal&&tanout&&!tanuse) 332 333 outfile<<"tan("; 334 numkh++; 335 tanuse=1; 336 337 338 if(cznum==0||cznum==1) 339 340 if(sincal==1) 341 342 outfile<<"sin("; 343 numkh++; 344 sinuse=1; 345 346 if(coscal==1) 347 348 outfile<<"cos("; 349 numkh++; 350 cosuse=1; 351 352 if(tancal==1) 353 354 outfile<<"tan("; 355 numkh++; 356 tanuse=1; 357 358 359 360 if(kuohao&&cznum>=2&&choose0&&!kuohaouse) 361 362 outfile<<"("; 363 numkh++; 364 kuohaouse=1; 365 if(cznum0==cznum) 366 367 shoukuohao=1; 368 369 370 outfile<<temp; 371 372 if(sinuse&&cznum==0&&numkh>0) 373 374 outfile<<")"; 375 numkh--; 376 sinuse=0; 377 378 if(sincal&&sinout&&sinuse&&count2>=2&&numkh>0) 379 380 outfile<<")"; 381 numkh--; 382 sinuse=0; 383 count2=0; 384 385 if(sincal&&sinout&&genhaouse&&count2==1&&numkh>0) 386 387 outfile<<")"; 388 numkh--; 389 sinuse=0; 390 391 392 if(cosuse&&cznum==0&&numkh>0) 393 394 outfile<<")"; 395 numkh--; 396 cosuse=0; 397 398 if(coscal&&cosout&&cosuse&&count3>=2&&numkh>0) 399 400 outfile<<")"; 401 numkh--; 402 cosuse=0; 403 count2=0; 404 405 if(coscal&&cosout&&genhaouse&&count3==1&&numkh>0) 406 407 outfile<<")"; 408 numkh--; 409 cosuse=0; 410 411 412 if(tanuse&&cznum==0&&numkh>0) 413 414 outfile<<")"; 415 numkh--; 416 tanuse=0; 417 418 if(tancal&&tanout&&tanuse&&count4>=2&&numkh>0) 419 420 outfile<<")"; 421 numkh--; 422 tanuse=0; 423 count2=0; 424 425 if(tancal&&tanout&&genhaouse&&count4==1&&numkh>0) 426 427 outfile<<")"; 428 numkh--; 429 tanuse=0; 430 431 432 433 if(genhaouse&&cznum==0&&numkh>0) 434 435 outfile<<")"; 436 numkh--; 437 genhaouse=0; 438 439 if(genhao&&genhaoout&&genhaouse&&count1>=2&&numkh>0) 440 441 outfile<<")"; 442 numkh--; 443 genhaouse=0; 444 count1=0; 445 446 if(genhao&&genhaoout&&genhaouse&&count1==1&&numkh>0) 447 448 outfile<<")"; 449 numkh--; 450 genhaouse=0; 451 452 453 454 if(pingfanguse&&cznum==0&&numkh>0) 455 456 outfile<<")^2 "; 457 numkh--; 458 pingfanguse=0; 459 460 if(pingfang&&pingfangout&&pingfanguse&&count0>=2&&numkh>0) 461 462 outfile<<")^2 "; 463 numkh--; 464 pingfanguse=0; 465 count0=0; 466 467 if(pingfang&&pingfangout&&pingfanguse&&count0==1&&numkh>0) 468 469 outfile<<")^2 "; 470 numkh--; 471 pingfanguse=0; 472 473 474 475 if(kuohao&&kuohaouse&&choose1&&count>=2&&numkh>0) 476 477 outfile<<")"; 478 numkh--; 479 kuohao=0; 480 kuohaouse=0; 481 482 if(kuohao&&kuohaouse&&cznum==0&&numkh>0) 483 484 outfile<<")"; 485 numkh--; 486 kuohaouse=0; 487 488 if(shoukuohao&&kuohaouse&&cznum==1&&numkh>0) 489 490 outfile<<")"; 491 numkh--; 492 kuohaouse=0; 493 494 count0++; 495 count1++; 496 count++; 497 count2++; 498 count3++; 499 count4++; 500 while(numkh>0) 501 502 numkh--; 503 outfile<<")"; 504 505 if(cznum>0) 506 507 if(jjcc==1) outfile<<"+"; 508 else if(jjcc==2) outfile<<"-"; 509 else if(jjcc==3) outfile<<"*"; 510 else if(jjcc==4) outfile<<"/"; 511 512 513 num0++; 514 outfile<<endl<<endl; 515 516 517
如果能将这些相似功能的代码整合成一个模块,多次调用(如+、-、*、/、括号、幂运算的添加)代码量至少能缩短1/3还便于维护
总结
通过这次结对编程对对方代码的分析,收获良多。和其他人合作,能让你观察到其他人的思考过程。你还可以看到他们写代码的方式。你能学会他们使用的工具。对于很多人来说,找到其他开发者一起合作,是一件奢侈的事情。但是所有人都可以用一种另外的方式学习别人的经验和技巧:仔细研读其他人写的代码。阅读高质量代码,就像是阅读一本好的小说。
以上是关于结对编程个人项目分析的主要内容,如果未能解决你的问题,请参考以下文章