阅读了队友的代码,觉得他的代码有很多值得学习的地方,也有不少可以改进的地方,虽然和我的代码用的语言不同,但是思路大同小异。
优点主要有以下三点:
1.修改用户和命令较为方便:采用了字符串数组来存储账号密码和各种命令,如果需要修改,直接更改存储的元素即可。
1 const string Userchart[3][3]={"张三1 123","张三2 123","张三3 123", 2 "李四1 123","李四2 123", "李四3 123", 3 "王五1 123","王五2 123","王五3 123"};
2.可以方便改进生成文件的路径:字符数组存储路径,,如果需要对之进行修改,可以直接对之进行修改。
3.命名较标准比如对于括号的判断变量,用了judgebackets,让代码更加容易理解。就以其中的括号生成部分为例,一目了然。
1 judgebackets=rand()%3; 2 if (judgebackets==0) 3 { 4 while (judgebackets==0&&((operatenumber-j)>backetsnumber)) //考虑同时有多个括号的情况 5 { 6 judgebackets=rand()%3; 7 backetsnumber++; 8 ofile<<'('; 9 }; 10 ofile<<rand()%100+1<<g_Operatechar[rand()%4]; 11 }
可以改进的地方当然也有:
1.去重:可能由于时间问题,去重函数只写了一个伪代码,并未具体实现。所以我就简单说一下我自己的思路。我采用了先搜索原文件夹,按顺序打开文件,之后按行读取。我之前先是生成了一个字符串,之后一行一行搜索查重,相同的话(尽管概率较小),就重新生成,不然就写入文本,这样就可以实现去重的要求。
2.生成文件文件名时间较为麻烦,他是采用了一种繁琐的方法做的,虽然这样编辑较为方便,但是略显冗杂。
1 void Creattime() //获取当前系统时间,用g_timenow来表示 2 { 3 SYSTEMTIME sys; //利用windowsAPI获取系统时间 4 GetLocalTime(&sys); 5 g_timenow[0]=sys.wYear/1000+'0'; 6 g_timenow[1]=(sys.wYear/100)%10+'0'; 7 g_timenow[2]=(sys.wYear/10)%10+'0'; 8 g_timenow[3]=sys.wYear%10+'0'; 9 g_timenow[4]='-'; 10 g_timenow[5]=sys.wMonth/10+'0'; 11 g_timenow[6]=sys.wMonth%10+'0'; 12 g_timenow[7]='-'; 13 g_timenow[8]=sys.wDay/10+'0'; 14 g_timenow[9]=sys.wDay%10+'0'; 15 g_timenow[10]='-'; 16 g_timenow[11]=sys.wHour/10+'0'; 17 g_timenow[12]=sys.wHour%10+'0'; 18 g_timenow[13]='-'; 19 g_timenow[14]=sys.wMinute/10+'0'; 20 g_timenow[15]=sys.wMinute%10+'0'; 21 g_timenow[16]='-'; 22 g_timenow[17]=sys.wSecond/610+'0'; 23 g_timenow[18]=sys.wSecond%10+'0'; 24 }
3.可能会生成双重括号,经常会出现在两个操作数外围同时出现两对括号,对于题目的简洁造成了影响。这里我觉得可以采用一种判断方式,如果两个前括号已经在一起,那么两个后括号就不能在一起,强制将后一个后括号向后移位,如果已经是最后一位就重新生成题目;或者如果检索到双重括号就直接重新生成。