結隊編程隊友使用的是C++語言,主函數循環是三個出題函數以及一個主函數進行登陸選擇,下面進行一部分的代碼分析。算法
代碼的一些不足之處:編程
①代碼重用度較差數組
未使用面向對象編程,部分重複代碼能夠更充分封裝。函數
如spa
time_t now_time = time(NULL); //獲取當前時間 struct tm *p; p = gmtime(&now_time); char filename[256] = {0}; sprintf(filename,"%d-%d-%d-%d-%02d-%02d.txt", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec); //將當前時間做爲爲文件名 ofstream mycout(filename); //生成txt文件
部分大量出現,可封裝爲函數。code
②算式生成算法亟需改進對象
int bracket_l[10][3] = {0, 0, 0, 5, 0, 0, 0, 11, 0, 0, 1, 0, 0, 5, 0, 5, 11, 0, 0, 1, 11, 0, 1, 2, 0, 5, 17, 5, 11, 17}; //左半括號可能的位置 int bracket_r[10][3] = {9, 0, 0, 14, 0, 0, 9, 19, 0, 14, 9, 0, 15, 14, 0, 20, 19, 0, 20, 9, 19, 19, 14, 9, 15, 14, 24, 26, 25, 24}; //與左半括號分別對應的右半括號位置
這部分是括號的位置,沒有用算法,暴力枚舉了幾種括號的插入位置,雖然支持部分多個括號的插入,可是治標不治本。blog
但這種方法也並非沒有可取之處,此方法簡化了複雜的括號生成,用了一種較爲簡單的方法解決較爲複雜的問題,並且在絕大多數下是可以知足須要的。文檔
③未進行查重操做字符串
需求文檔中要求進行查重,但代碼中未進行查重操做。
可取之處
①使用定長字符數組
string str1[27]; //考慮括號全部位置後建立一個長度爲27的字符串數組存儲算式 int flag = rand() % 2; //算式中是否出現括號 int flag1 = rand() % 3; //算式中是否出現平方或開根號
用一個定長字符數組,且僅僅是用於存儲標記。
for (int j = 0; j < 27; j++) { if ((n > 0) && (j == 3 || j == 8 || j == 13 || j == 18 || j == 23)) //操做數的位置直接輸出隨機數 { if (radical[n - 1] == "√") //是否輸出開根號 { mycout << radical[n - 1]; } if (trig_sit[n - 1] != 3) //是否輸出三角函數符號 { mycout << trig[trig_sit[n - 1]]; } mycout << rand() % 100 + 1; if (square[n - 1] == "^2") //是否輸出平方 { mycout << square[n - 1]; } n--; } else if (str1[j] != " ") { mycout << str1[j]; } } mycout << "=" << endl << endl; }
生成對應的各個算式標記後,再統一遍歷該字符數組的各個標記,從而產生各個的算式。
避免了由於不斷的字符插入致使的字符串各字符的index紊亂的狀況,極大地減輕了工做量。
② 總體效率較高
未使用C++的String類的成員函數,避免了耗時的插入查找操做,使程序運行效率較大提升。