个人项目对方代码分析(随机生成不同难度试卷)
這次的個人項(xiàng)目著實(shí)讓我知道了為什么程序猿毛發(fā)稀疏~(哭),在經(jīng)歷了寫代碼的血與淚之后,看我搭檔的代碼不禁感慨,哇塞~她的代碼真的好短小精悍,讓人心情愉悅~相反,我的代碼讓人看起來就想扶額(嚶~)。下面我們就來一起欣賞我搭檔的代碼吧(應(yīng)老師的要求,還要找找茬?)~~~~
題目:
1、命令行輸入用戶名和密碼,兩者之間用空格隔開(程序預(yù)設(shè)小學(xué)、初中和高中各三個賬號,具體見附表),如果用戶名和密碼都正確,將根據(jù)賬戶類型顯示“當(dāng)前選擇為XX出題”,XX為小學(xué)、初中和高中三個選項(xiàng)中的一個。否則提示“請輸入正確的用戶名、密碼”,重新輸入用戶名、密碼;
2、登錄后,系統(tǒng)提示“準(zhǔn)備生成XX數(shù)學(xué)題目,請輸入生成題目數(shù)量:”,XX為小學(xué)、初中和高中三個選項(xiàng)中的一個,用戶輸入所需出的卷子的題目數(shù)量,系統(tǒng)默認(rèn)將根據(jù)賬號類型進(jìn)行出題。每道題目的操作數(shù)在1-5個之間,操作數(shù)取值范圍為1-100;
3、題目數(shù)量的有效輸入范圍是“10-30”(含10,30),程序根據(jù)輸入的題目數(shù)量生成符合小學(xué)、初中和高中難度的題目的卷子(具體要求見附表)。同一個老師的卷子中的題目不能與以前的已生成的卷子中的題目重復(fù)(以指定文件夾下存在的文件為準(zhǔn),見5);
4、在登錄狀態(tài)下,如果用戶需要切換類型選項(xiàng),命令行輸入“切換為XX”,XX為小學(xué)、初中和高中三個選項(xiàng)中的一個,輸入項(xiàng)不符合要求時,程序控制臺提示“請輸入小學(xué)、初中和高中三個選項(xiàng)中的一個”;輸入正確后,顯示“”系統(tǒng)提示“準(zhǔn)備生成XX數(shù)學(xué)題目,請輸入生成題目數(shù)量”,用戶輸入所需出的卷子的題目數(shù)量,系統(tǒng)新設(shè)置的類型進(jìn)行出題;
5、生成的題目將以“年-月-日-時-分-秒.txt”的形式保存,每個賬號一個文件夾。每道題目有題號,每題之間空一行;
該代碼流程圖:
代碼:
代碼一共分為三個部分:user.h,generate.h,main.cpp;
1、user.h
1 #ifndef USER_H_ 2 #define USER_H_ 3 4 5 #include <iostream> 6 #include <string> 7 using namespace std; 8 9 extern int g_grade; 10 11 class user 12 { 13 private: 14 string name; 15 string password; 16 int grade; 17 18 public: 19 void users(string username, string userpassword, int usergrade) 20 { 21 name = username; 22 password = userpassword; 23 grade = usergrade; 24 } 25 26 bool IsCorrect(string username, string userpassword) 27 { 28 if (username==name && userpassword==password) return true; 29 else return false; 30 } 31 32 int Getgrade() 33 { 34 return grade; 35 } 36 }; 37 38 void UserData() 39 { 40 user users[9]; 41 users[0].users("張三1", "123", 1); 42 users[1].users("張三2", "123", 1); 43 users[2].users("張三3", "123", 1); 44 users[3].users("李四1", "123", 2); 45 users[4].users("李四2", "123", 2); 46 users[5].users("李四3", "123", 2); 47 users[6].users("王五1", "123", 3); 48 users[7].users("王五2", "123", 3); 49 users[8].users("王五3", "123", 3); 50 51 cout << "請輸入用戶名和密碼" << endl; 52 string name, password; 53 while (1) 54 { 55 cin >> name >> password; 56 int is_correct = 0; 57 for (int i=0; i<9; i++) 58 { 59 if (users[i].IsCorrect(name, password) == true) 60 { 61 is_correct = 1; 62 g_grade = users[i].Getgrade(); 63 break; 64 } 65 } 66 if (is_correct == 1) 67 { 68 cout << "當(dāng)前選擇為"; 69 if (g_grade == 1) cout << "小學(xué)出題, "; 70 else if (g_grade == 2) cout << "中學(xué)出題, "; 71 else cout << "高中出題, "; 72 break; 73 } 74 else 75 cout << "請輸入正確用戶名和密碼" << endl; 76 } 77 } 78 79 80 81 82 #endif /* USER_H_ */?這個模塊主要作用為:有關(guān)登陸的一系列提示
優(yōu)點(diǎn):該模塊代碼巧妙運(yùn)用類,使整個模塊思路更加清晰。
2、generate.h
1 #ifndef GENERATE_H_ 2 #define GENERATE_H_ 3 extern int g_num; 4 5 6 #include <iostream> 7 #include <ctime> 8 #include <cstdlib> 9 using namespace std; 10 11 extern ofstream out; 12 13 void Operator(int operatorNo) 14 { 15 switch (operatorNo) 16 { 17 case 1: out << " + "; break; 18 case 2: out << " - "; break; 19 case 3: out << " * "; break; 20 case 4: out << " / "; break; 21 case 5: out << "^2"; break; 22 case 6: out << "√"; break; 23 case 7: out << "sin";break; 24 case 8: out << "cos";break; 25 case 9: out << "tan";break; 26 } 27 28 } 29 30 void GeneratePart(int operandNum, int g_grade) 31 { 32 int is_kuohao, kuohaoNum = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0; 33 int juniorNum = 0, seniorNum = 0; 34 for (int j=0; j<operandNum-1; j++) 35 { 36 int operand = rand()%100 + 1; 37 int tmp4 = 0; 38 39 is_kuohao = rand()%2; 40 if (j != operandNum-2 && is_kuohao == 1 && kuohaoNum <= 3) 41 { 42 out << "("; 43 if (j == 0) tmp2 = 1; //用來排除(5+2)這種情況 44 kuohaoNum ++; 45 tmp1 = 1; //用來排除(5)這種情況 46 } 47 48 int choose = rand()%9 + 1; 49 if (g_grade > 1) 50 { 51 if (g_grade == 2 && choose == 6) 52 { 53 Operator(6); 54 juniorNum ++; 55 tmp4 ++; 56 } 57 else if (g_grade == 3 && choose > 6) 58 { 59 Operator(choose); 60 seniorNum ++; 61 tmp4 ++; 62 } 63 if (j != operandNum-2 && tmp4 != 0) 64 { 65 is_kuohao = rand()%2; 66 if (is_kuohao == 1 && kuohaoNum <= 3) 67 { 68 out << "("; 69 tmp3 = 1; 70 kuohaoNum ++; 71 } 72 } 73 } 74 75 out << operand; 76 77 if (g_grade ==2 && choose == 5) 78 { 79 Operator(5); 80 juniorNum ++; 81 } 82 83 if (tmp1 == 0 && tmp3 == 0 && kuohaoNum >= 1) 84 { 85 for (int k=0; k<kuohaoNum; k++) 86 { 87 int flag = rand()%2; 88 if (flag == 1) 89 { 90 out << ")"; 91 kuohaoNum --; 92 tmp2 = 2; 93 } 94 } 95 } 96 97 if (j==operandNum-2 && tmp2==1 && kuohaoNum>0) 98 { 99 for (int j=0; j<kuohaoNum; j++) 100 out << ")"; 101 kuohaoNum = 0; 102 } 103 104 int operatorNo = rand()%4 + 1; 105 Operator(operatorNo); 106 } 107 108 if ((g_grade==1) || (g_grade==2&&juniorNum!=0) || (g_grade==3&&seniorNum!=0)) out << rand()%100 + 1; 109 else if (g_grade == 2 && juniorNum == 0) 110 { 111 int chooseOper = rand()%2; 112 if (chooseOper == 0) out << "√" << rand()%100 + 1; 113 else out << rand()%100 + 1 << "^2"; 114 } 115 else if (g_grade == 3 && seniorNum == 0) 116 { 117 int chooseOper = rand()%3 + 7; 118 Operator(chooseOper); 119 out << rand()%100 + 1; 120 } 121 122 if (kuohaoNum != 0) 123 { 124 for (int j=0; j<kuohaoNum; j++) 125 out << ")"; 126 kuohaoNum = 0; 127 } 128 out << " = "<< endl; 129 } 130 131 132 133 134 void GenerateAll(int g_num, int g_grade) 135 { 136 for (int i=0; i<g_num; i++) 137 { 138 out << i+1 << ". "; 139 140 if (g_grade == 1) 141 { 142 int operandNum = rand()%4 + 2; 143 GeneratePart(operandNum, g_grade); 144 } 145 146 else if (g_grade == 2) 147 { 148 int operandNum = rand()%5 + 1; 149 if (operandNum == 1) 150 { 151 int chooseOper = rand()%2; 152 if (chooseOper == 0) out << "√" << rand()%100 + 1 << " = " << endl; 153 else out << rand()%100 + 1 << "^2 = " << endl; 154 } 155 else 156 { 157 GeneratePart(operandNum, g_grade); 158 } 159 } 160 161 else if (g_grade == 3) 162 { 163 int operandNum = rand()%5 + 1; 164 if (operandNum == 1) 165 { 166 int chooseOper = rand()%3; 167 if (chooseOper == 0) out << "sin"; 168 else if (chooseOper == 1) out << "cos"; 169 else out << "tan"; 170 out << rand()%100 + 1 << " = " << endl; 171 } 172 else 173 { 174 GeneratePart(operandNum, g_grade); 175 } 176 } 177 out << endl; 178 } 179 } 180 181 182 #endif /* GENERATE_H_ */這個模塊主要作用:按需求文檔上的要求生成試卷(選擇生成運(yùn)算符及括號)
優(yōu)點(diǎn):括號部分產(chǎn)生條理清晰,對于括號產(chǎn)生的條件限制考慮非常全面,比如(5),()前后需有運(yùn)算符等。
缺點(diǎn):一個子函數(shù)中變量過多,其中tmp4或許可以刪掉。代碼中注釋較少,一些變量旁可添加一些注釋,方便讀者閱讀代碼。
3、main.cpp
1 #include <iostream> 2 #include <fstream> 3 #include <ctime> 4 #include <time.h> 5 #include <stdio.h> 6 #include "generate.h" 7 #include "user.h" 8 9 int g_grade, g_num; 10 ofstream out; 11 12 int main() 13 { 14 UserData(); 15 16 cout << "請輸入題目數(shù)量(10-30)" << endl; 17 cin >> g_num; 18 while (g_num < 10 || g_num > 30) 19 { 20 cout << "請輸入正確數(shù)量" << endl; 21 cin >> g_num; 22 } 23 24 srand ((unsigned)time(NULL)); 25 26 time_t t = time(0); 27 char tmp[64]; 28 strftime( tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S.txt",localtime(&t) ); 29 //freopen(tmp,"w",stdout); 30 //GenerateAll(g_num, g_grade); 31 //fclose(stdout); 32 //freopen("CON", "w", stdout); 33 //freopen("CON", "r", stdin); 34 out.open(tmp); 35 GenerateAll(g_num, g_grade); 36 out.close(); 37 38 cout << "若需要切換類型, 輸入 切換為XX , 為小學(xué)、初中和高中三個選項(xiàng)中的一個" << endl; 39 string order; 40 while(1) 41 { 42 cin >> order; 43 int flag = 0; 44 if (order == "切換為小學(xué)") g_grade = 1; 45 else if (order == "切換為初中") g_grade = 2; 46 else if (order == "切換為高中") g_grade = 3; 47 else 48 { 49 cout << "請輸入小學(xué)、初中和高中三個選項(xiàng)中的一個" << endl; 50 flag = 1; 51 } 52 if (flag == 0) 53 { 54 cout << "準(zhǔn)備生成"; 55 if (g_grade == 1) cout << "小學(xué)題目, 請輸入生成題目數(shù)量" << endl; 56 else if (g_grade == 2) cout << "中學(xué)題目, 請輸入生成題目數(shù)量" << endl; 57 else cout << "高中題目, 請輸入生成題目數(shù)量" << endl; 58 cin >> g_num; 59 if (g_num<10 || g_num>30) 60 { 61 cout << "請輸入正確數(shù)量" << endl; 62 cin >> g_num; 63 } 64 65 time_t t = time(0); 66 strftime( tmp, sizeof(tmp), "%Y-%m-%d-%H-%M-%S.txt",localtime(&t) ); 67 //freopen(tmp,"w",stdout); 68 //GenerateAll(g_num, g_grade); 69 //fclose(stdout); 70 //freopen("CON", "w", stdout); 71 //freopen("CON", "r", stdin); 72 out.open(tmp); 73 GenerateAll(g_num, g_grade); 74 out.close(); 75 } 76 } 77 return 0; 78 }該模塊主要作用:設(shè)置出題題數(shù)和難度,以及最后文件的輸出。
優(yōu)點(diǎn):由于各模塊已經(jīng)在頭文件中實(shí)現(xiàn),所以主函數(shù)中代碼簡潔短小,條理清晰。
同時,搭檔的變量的命名非常規(guī)范,嚴(yán)格按照老師給的代碼規(guī)范命名。
缺點(diǎn):并不是所有用戶都要切換難度,還要考慮不切換難度的情況。同時,為了有更好的用戶體驗(yàn),界面上每次生成完試卷最好提示試卷完成生成。
運(yùn)行截圖:
總結(jié):
優(yōu)點(diǎn):代碼簡短,將各功能模塊化,條理清晰,命名及格式規(guī)范,每個模塊實(shí)現(xiàn)條件考慮嚴(yán)謹(jǐn)。
缺點(diǎn):沒有實(shí)現(xiàn)向指定文件夾中生成試卷,沒有實(shí)現(xiàn)查重功能,輸入完成后,界面最好有提示,增強(qiáng)用戶體驗(yàn)。
轉(zhuǎn)載于:https://www.cnblogs.com/ttyape/p/9708976.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的个人项目对方代码分析(随机生成不同难度试卷)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】多线程相关复习—— 线程的创
- 下一篇: HDU 3555 Bomb