我的队友在本次编程任务中使用的语言是c++,并且使用了类来实现。我们先分析一下他的代码中的几个缺点。
- 命名不规范。具体体现在下面几个方面:
类名首字母没有大写:
函数名没有按驼峰命名法:
2.缺少注释
代码中缺少注释且不能从函数、类和变量的命名中直接理解其用法和作用。
3.大括号的用法和缩进容易让人暴躁,具体可以看下图体会一下。
除了这些编码习惯上的缺点外,在别的方面我的队友还是有很多优点值得我学习的。
- 使用类而不是直接用一个个函数来实现需求,这样的好处就是可拓展性强,增加、修改一些功能都很方便,不需要进行太多的改动。这对于qq群中变来变去的需求来说就显得很有必要了。
- 把账号和密码保存在文档中而不是程序中,实现了创建新的账户的功能。把数据保存在文档中可以方便对数据进行修改二不需要改动程序。
1 #include<iostream> 2 #include<stdlib.h> 3 #include<sstream> 4 #include<ctime> 5 #include<windows.h> 6 #include <fstream> 7 using namespace std; 8 class shijuan{ 9 public: 10 int X,N; 11 string zhang; 12 string fuhao[6]={"+","-","*","/","^2","√"}; 13 shijuan(string z, int x,int n){ 14 X=x; 15 zhang=z; 16 N=n; 17 } 18 string creatcao(int max,int min){ 19 stringstream T; 20 int k=-1; 21 string TT; 22 double temp=0; 23 int m=rand()%max+min; 24 for(int j=0;j<m;j++){ 25 if(k==-1){ 26 int f=rand()%4; 27 if(f==0&&m>2&&j<=m-2&&j!=0){ 28 T<<"("; 29 k=j; 30 } 31 } 32 int cao=rand()%100+1; 33 T<<cao; 34 if(k!=-1) 35 if(k!=-1&&j>=k+1){ 36 int f=rand()%3; 37 int J; 38 if(k==0) 39 J=m-2; 40 else 41 J=m-1; 42 if((f==0)||j==J){ 43 T<<")"; 44 k=-1;} 45 } 46 if(j!=m-1){ 47 int fh=rand()%4; 48 49 T<<fuhao[fh]; 50 } 51 } 52 TT=T.str(); 53 return TT; 54 } 55 string creatchu(int max,int min,int K){ 56 stringstream T; 57 int k=K; 58 int m=rand()%max+min; 59 for(int j=0;j<m;j++){ 60 int r=rand()%4; 61 int fu=rand()%4; 62 if(r==0){ 63 T<<fuhao[5]; 64 T<<creatcao(1,1); 65 if(j!=m-1)T<<fuhao[fu]; 66 k=1; 67 } 68 else if(r==1){ 69 T<<creatcao(1,1)<<fuhao[4]; 70 if(j!=m-1)T<<fuhao[fu]; 71 k=1; 72 } 73 else{ 74 T<<creatcao(1,1); 75 if(j!=m-1) 76 T<<fuhao[fu]; 77 else{ 78 if(k==0){ 79 T<<fuhao[fu]; 80 int o=rand()%2; 81 if(o==0){ 82 T<<fuhao[5]; 83 T<<creatcao(1,1); 84 } 85 else{ 86 T<<creatcao(1,1)<<fuhao[4]; 87 } 88 } 89 } 90 } 91 } 92 string TT=T.str(); 93 return TT; 94 } 95 96 string creat(int n){ 97 srand((unsigned)time(NULL)); 98 stringstream T; 99 if(X==0){//小学难度 100 for(int i=0;i<n;i++){ 101 T<<"("<<i+1<<")"; 102 string ss=creatcao(5,2);//查重!!! 103 104 string name=zhang+"\\已有所有试题.txt"; 105 ifstream fp(name.c_str()); 106 string h="";string H=""; 107 int k=0; 108 for(int ii=0;;ii++){ 109 fp>>h; 110 if(h==H) 111 break; 112 H=h; 113 int l=h.length(); 114 int jj=0; 115 for(int j=0;j<l;j++) 116 if(h[j]==')'){ 117 jj=j; 118 break; 119 } 120 string hh=h.substr(jj+1,l-jj+3); 121 if(ss==hh) 122 k=1; 123 124 } 125 if(k==0){T<<ss; 126 T<<"=?"; 127 T<<"\n\n"; 128 }else 129 i--; 130 131 } 132 } 133 else if(X==1){//初中难度 134 for(int i=0;i<n;i++){ 135 136 T<<"("<<i+1<<")"; 137 138 string ss=creatchu(5,2,0);//查重!!! 139 140 string name=zhang+"\\已有所有试题.txt"; 141 ifstream fp(name.c_str()); 142 string h="";string H=""; 143 int k=0; 144 for(int ii=0;;ii++){ 145 fp>>h; 146 if(h==H) 147 break; 148 H=h; 149 int l=h.length(); 150 int jj=0; 151 for(int j=0;j<l;j++) 152 if(h[j]==')'){ 153 jj=j; 154 break; 155 } 156 string hh=h.substr(jj+1,l-jj+3); 157 if(ss==hh) 158 k=1; 159 160 } 161 if(k==0){T<<ss; 162 T<<"=?"; 163 T<<"\n\n"; 164 }else 165 i--; 166 } 167 } 168 else if(X==2){//高中难度 169 for(int i=0;i<n;i++){ 170 T<<"("<<i+1<<")"; 171 172 stringstream TTT; 173 int m=rand()%5+1; 174 175 for(int j=0;j<m;j++){ 176 int t=rand()%6; 177 int k=0; 178 int ff=rand()%4; 179 if(t==0){ 180 TTT<<"sin"<<creatchu(1,1,1)<<"π"; 181 k=1; 182 } 183 else if(t==1){ 184 TTT<<"cos"<<creatchu(1,1,1)<<"π"; 185 k=1; 186 } 187 else if(t==2){ 188 TTT<<"tan"<<creatchu(1,1,1)<<"π"; 189 k=1; 190 } 191 else{ 192 TTT<<creatchu(1,1,1); 193 } 194 if(j!=m-1)TTT<<fuhao[ff]; 195 else{ 196 if(k==0){ TTT<<fuhao[ff]; 197 int o=rand()%3; 198 if(o==0) 199 TTT<<"sin"<<creatchu(1,1,1)<<"π"; 200 else if(o==1) 201 TTT<<"cos"<<creatchu(1,1,1)<<"π"; 202 else if(o==2) 203 TTT<<"tan"<<creatchu(1,1,1)<<"π"; 204 } 205 } 206 } 207 string ss;//查重!!! 208 TTT>>ss; 209 string name=zhang+"\\已有所有试题.txt"; 210 ifstream fp(name.c_str()); 211 string h="";string H=""; 212 int k=0; 213 for(int ii=0;;ii++){ 214 fp>>h; 215 if(h==H) 216 break; 217 H=h; 218 int l=h.length(); 219 int jj=0; 220 for(int j=0;j<l;j++) 221 if(h[j]==')'){ 222 jj=j; 223 break; 224 } 225 string hh=h.substr(jj+1,l-jj+3); 226 if(ss==hh) 227 k=1; 228 229 } 230 if(k==0){T<<ss; 231 T<<"=?"; 232 T<<"\n\n"; 233 }else 234 i--; 235 } 236 } 237 string TT=T.str(); 238 return TT; 239 } 240 }; 241 class zhanghu{ 242 private: 243 string zhanghao,mima;int n=0;int X=0;int NN=0; 244 public: 245 shijuan *a[1000]; 246 zhanghu(string z,string mi,int N=0,int x=0){ 247 zhanghao=z; 248 mima=mi; 249 n=N; 250 X=x; 251 string filePath = ""; 252 string saveCompareRaw = filePath + zhanghao; 253 254 bool flag = CreateDirectory(saveCompareRaw.c_str(), NULL); 255 256 257 ofstream outFile; 258 259 260 261 string sjs=""+zhanghao+"\\已有试卷数.txt"; 262 263 outFile.open(sjs.c_str()); 264 outFile<<n; 265 outFile.close(); 266 string name=""+zhanghao+"\\类型.txt"; 267 outFile.open(name.c_str()); 268 outFile<<X; 269 outFile.close(); 270 } 271 zhanghu(){ 272 n=getn(); 273 } 274 void lei(int x=0){ 275 X=x; 276 ofstream outFile; 277 string name=""+zhanghao+"\\类型.txt"; 278 outFile.open(name.c_str()); 279 outFile<<X; 280 outFile.close(); 281 } 282 int getlei(){ 283 return X; 284 } 285 void creatsj(int m){ 286 287 a[n]= new shijuan(zhanghao,X,NN); 288 string S=a[n]->creat(m); 289 NN+=m; 290 n++; 291 292 time_t tt = time(NULL);//这句返回的只是一个时间cuo 293 tm* t= localtime(&tt); 294 stringstream ti; 295 296 ti<<t->tm_year + 1900<<"-"<< t->tm_mon + 1<<"-"<<t->tm_mday<<"-"<<t->tm_hour<<"-"<<t->tm_min<<"-"<<t->tm_sec; 297 298 299 string Time=ti.str(); 300 301 302 303 string name=""+zhanghao+"\\"+Time+".txt"; 304 string sjs=""+zhanghao+"\\已有试卷数.txt"; 305 306 string syt=""+zhanghao+"\\已有所有试题.txt"; 307 ofstream outFile; 308 outFile.open(syt.c_str(),ios::app); 309 outFile<<"||"<<Time<<"\n\n"; 310 311 outFile<<S; 312 outFile.close(); 313 314 outFile.open(name.c_str()); 315 outFile<<S; 316 outFile.close(); 317 outFile.open(sjs.c_str()); 318 outFile<<n; 319 outFile.close(); 320 } 321 int getn(){ 322 string name=""+zhanghao+"\\已有试卷数.txt"; 323 ifstream fp(name.c_str()); 324 int s; 325 fp>>s; 326 return s; 327 } 328 329 330 }; 331 332 class ht{ 333 private: 334 int N=0; 335 public: 336 zhanghu *zh[1000]; 337 ht(string n){ 338 N=getN(); 339 string name="已有账户.txt"; 340 ifstream fp(name.c_str()); 341 string z="",m=""; 342 for(int i=0;i<N;i++){ 343 fp>>z; 344 fp>>m; 345 string name2=z+"//已有试卷数.txt"; 346 ifstream fp2(name2.c_str()); 347 int s; 348 fp2>>s; 349 string name3=z+"//类型.txt"; 350 ifstream fp3(name3.c_str()); 351 int ss; 352 fp3>>ss; 353 zh[i]=new zhanghu(z,m,s,ss); 354 } 355 356 } 357 358 int getN(){ 359 string name="已有账户数.txt"; 360 ifstream fp(name.c_str()); 361 int s; 362 fp>>s; 363 return s; 364 } 365 366 int creatzh(string zhanghao,string mima,int X){ 367 int n=getN(); 368 string name="已有账户.txt"; 369 ifstream fp(name.c_str()); 370 string s=""; 371 int k=0; 372 for(int i=0;i<n;i++){ 373 374 fp>>s; 375 if(s==zhanghao){ 376 cout<<"已存在的账户,创建 "<<zhanghao<<" 失败\n"; 377 k=1; 378 break; 379 } 380 fp>>s; 381 } 382 if(k==0){ 383 zh[N]=new zhanghu(zhanghao,mima,0,X); 384 N++; 385 string zhs="已有账户数.txt"; 386 string yyzh="已有账户.txt"; 387 ofstream outFile; 388 outFile.open(zhs.c_str()); 389 390 outFile<<N; 391 outFile.close(); 392 393 outFile.open(yyzh.c_str(),ios::app); 394 outFile<<zhanghao<<endl; 395 outFile<<mima<<endl; 396 outFile.close(); 397 cout<<"创建账户 "<<zhanghao<<" 成功,请重新登录此账户\n"; 398 return N-1; 399 } 400 else 401 return 9999; 402 } 403 int creatzzz(){ 404 cout<<"请输入新账户名,密码,和试卷类型(小学请输入0,初中1,高中2)\n" 405 <<"中间使用空格隔开\n"; 406 string z,m;int X; 407 cin>>z>>m>>X; 408 int i=creatzh(z,m,X); 409 if(i==9999) 410 return creatzzz(); 411 else 412 return denglu(); 413 414 415 } 416 417 418 int denglu(){ 419 int N; 420 cout<<"请输入帐户和密码,中间用空格隔开;\n" 421 <<"可输入“#”加空格加“#”来注册新账户\n"; 422 string z,m;int X; 423 cin>>z>>m; 424 if(z=="#"&&m=="#"){ 425 return creatzzz(); 426 } 427 else{ 428 429 int n=getN(); 430 string name="已有账户.txt"; 431 ifstream fp(name.c_str()); 432 string s=""; 433 int k=0; 434 for(int i=0;i<n;i++){ 435 fp>>s; 436 if(s==z){ 437 fp>>s; 438 if(m==s){ 439 N=i; 440 k=2; 441 } 442 else{ 443 cout<<"密码错误!\n"; 444 k=1;} 445 break; 446 } 447 fp>>s; 448 } 449 if(k==0){ 450 cout<<"此账户尚未注册\n"; 451 return denglu(); 452 } 453 else if(k==1) 454 return denglu(); 455 else if(k==2){ 456 cout<<"您好!,亲爱的 "<<z<<" 当前选择为"; 457 switch(zh[N]->getlei()) 458 { 459 case 0: 460 cout<<"小学出题\n"; 461 break; 462 case 1: 463 cout<<"初中出题\n"; 464 break; 465 case 2: 466 cout<<"高中出题\n"; 467 break; 468 } 469 470 return N; 471 } 472 } 473 } 474 475 void Ti(int N){ 476 cout<<"准备生成"; 477 switch(zh[N]->getlei()) 478 { 479 case 0: 480 cout<<"小学数学题目,请输入题目数量(10~30)\n"; 481 break; 482 case 1: 483 cout<<"初中学题目,请输入题目数量(10~30)\n"; 484 break; 485 case 2: 486 cout<<"高中学题目,请输入题目数量(10~30)\n"; 487 break; 488 } 489 int m; 490 cin>>m; 491 while(m>30||m<10) 492 {cout<<"输入正确的题目数量(10~30)\n"; 493 cin>>m; 494 } 495 zh[N]->creatsj(m); 496 cout<<"生成题目成功\n"; 497 498 } 499 }; 500 501 int main(){ 502 ht a("初始化"); 503 int n=a.denglu(); 504 a.Ti(n);int k=1; 505 do{ 506 507 cout<<"请选择操作:\n输入“c”为继续当前题目类型出题\n"; 508 cout<<"输入“小学”或“初中”或“高中”切换出题模式出题\n"; 509 cout<<"输入“switch”切换账户\n"; 510 cout<<"输入“quit”退出程序\n"; 511 string sss; 512 cin>>sss;int ss=6; 513 if(sss=="c")ss=0; 514 else if(sss=="小学")ss=1; 515 else if(sss=="初中")ss=2; 516 else if(sss=="高中")ss=3; 517 else if(sss=="switch")ss=4; 518 else if(sss=="quit")ss=5; 519 else ss=6; 520 switch(ss){ 521 case 0: 522 a.Ti(n); 523 break; 524 case 1: 525 a.zh[n]->lei(0); 526 a.Ti(n); 527 break; 528 case 2: 529 a.zh[n]->lei(1); 530 a.Ti(n); 531 break; 532 case 3: 533 a.zh[n]->lei(2); 534 a.Ti(n); 535 break; 536 case 4: 537 n=a.denglu(); 538 break; 539 case 5: 540 k=0; 541 break; 542 case 6: 543 cout<<"请输入正确的操作\n"; 544 } 545 }while(k!=0); 546 547 return 0; 548 }