大體流程圖
大概的一個項目要實現如上功能
首先大體分塊寫函數
1、先實現界面的相關功能
寫一個簡單的界面登錄函數
終端界面編輯相關參數見 c語言linux終端花里胡哨輸出
先做一個簡單的登錄界面
千萬不要覺得界面編輯沒有用,上圖!感受一下差距吧!
編輯界面之前
編輯之后
差別應該很明顯了吧!!!!美感提升一個檔次。
此博文是在基本完成之后回顧所做,所以進行了界面優化,使用起來舒適度得到了極大的提升。

1 /*登錄界面菜單*/ 2 int login(Node *pHead, TeaNode *pTHead) 3 { 4 system("clear"); 5 printf("\t\t\t"); 6 printf("\033[32m\033[1m\033[44m歡迎來到師生管理系統\n\033[0m\n"); 7 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m登錄選項\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 8 printf("|\t\t\t\t\t\t\t\t|\n"); 9 printf("\t\t\t1.管理員登錄\n"); 10 printf("|\t\t\t\t\t\t\t\t|\n"); 11 printf("\t\t\t2.教師登錄\n"); 12 printf("|\t\t\t\t\t\t\t\t|\n"); 13 printf("\t\t\t3.學生登錄\n"); 14 printf("|\t\t\t\t\t\t\t\t|\n"); 15 printf("\t\t\t0.退出\n"); 16 printf("|\t\t\t\t\t\t\t\t|\n"); 17 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 18 printf("請選擇:"); 19 char ch; 20 ch = getchar(); 21 switch(ch) 22 { 23 case '1': 24 { 25 int ret = adminlogin(); 26 if(ret != 1) 27 { 28 printf("管理員登入失敗!\n\n\n"); 29 printf("按任意鍵退出系統!!!"); 30 char ch1; 31 ch1 = getchar();//利用字符獲取函數實現簡單的界面停留 32 return 0; 33 } 34 else if(ret == 1) 35 return 1;//返回1,回在主函數中根據不同的返回值進入不同的操作菜單 36 } 37 case '2': 38 { 39 40 int ret = tealogin(pTHead); 41 while(ret != 1 && ret != 2) 42 { 43 system("clear"); 44 printf("教師登入失敗!\n"); 45 printf("請重新輸入!\n"); 46 ret = tealogin(pTHead);//調用教師登錄函數 47 getchar(); 48 } 49 if(ret == 1) 50 //由於教師是班主任和任課老師執行是有差別的,所以函數中返回值為1時為班主任,返回值為2時為任課老師 51 { 52 getchar(); 53 return 2; 54 break; 55 } 56 if(ret == 2) 57 { 58 getchar(); 59 return 3; 60 break; 61 } 62 } 63 case '3': 64 { 65 int retstu = stulogin(pHead);//學生登錄函數 66 getchar(); 67 while(retstu != 1) 68 { 69 system("clear"); 70 printf("學生登入失敗!\n"); 71 printf("請重新輸入!\n"); 72 retstu = stulogin(pHead); 73 getchar(); 74 } 75 if(retstu == 1) 76 { 77 return 4;//返回值為4 78 break; 79 } 80 } 81 case '0': 82 { 83 return 0;//返回0,退出管理系統 84 } 85 default: 86 { 87 printf("\n選項輸入錯誤!請重新輸入"); 88 login(pHead, pTHead); 89 }; 90 } 91 }
主函數利用while循環可以保證菜單不退出

1 void main() 2 { 3 int retlogin = login(pHead, pTHead);//讀取登錄菜單返回值,不同返回值代表不同用戶在操作 4 while(retlogin != 0)//為0時退出,不為0時一直循環,實現系統的持續運行 5 { 6 while(retlogin == 1)//管理員身份登入 7 { 8 if(admindo(pTHead) == 1)//管理員執行函數 9 { 10 getchar();//吸收字符 11 retlogin = login(pHead, pTHead); 12 } 13 } 14 while(retlogin == 2)//班主任 15 { 16 if(headteacherdo(pHead, pTHead,IDhao) == 1) 17 { 18 getchar(); 19 retlogin = login(pHead, pTHead); 20 } 21 } 22 while(retlogin == 3)//任課老師 23 { 24 if(teacherdo(pTHead, pHead) == 1) 25 { 26 getchar(); 27 retlogin = login(pHead, pTHead); 28 } 29 } 30 while(retlogin == 4)//學生登錄 31 { 32 if(studo(pHead) == 1)//學生執行菜單 33 { 34 getchar(); 35 retlogin = login(pHead, pTHead); 36 } 37 } 38 } 39 }
執行選項菜單

1 /*管理員執行選項*/ 2 int admindo(TeaNode *pTHead) 3 { 4 printf("\033[32m\033[1m\033[44m ☃ 管理員admin,您好!\n\033[0m\n"); 5 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 操作選項✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 6 printf("|\t\t\t\t\t\t\t\t|\n"); 7 printf("\t\t\t ❁ 1.教師信息錄入\n"); 8 printf("|\t\t\t\t\t\t\t\t|\n"); 9 printf("\t\t\t ❁ 2.查看教師信息\n"); 10 printf("|\t\t\t\t\t\t\t\t|\n"); 11 printf("\t\t\t ❁ 3.修改教師信息\n"); 12 printf("|\t\t\t\t\t\t\t\t|\n"); 13 printf("\t\t\t ❁ 4.刪除教師信息\n"); 14 printf("|\t\t\t\t\t\t\t\t|\n"); 15 printf("\t\t\t ❁ 0.注銷\n"); 16 printf("|\t\t\t\t\t\t\t\t|\n"); 17 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 18 printf("請選擇:"); 19 char ch; 20 ch = getchar(); 21 switch(ch) 22 { 23 case '1': 24 { 25 entertea(pTHead); 26 break; 27 } 28 case '2': 29 { 30 getchar(); 31 examintea(pTHead); 32 char ch1 = '\0'; 33 printf("\n"); 34 printf("按Enter退回菜單!\n"); 35 ch1 = getchar(); 36 break; 37 } 38 case '3': 39 { 40 modifytea(pTHead); 41 break; 42 } 43 case '4': 44 { 45 printf("請輸入要刪除教師工號:"); 46 int teaID; 47 scanf("%d", &teaID); 48 getchar(); 49 deltea(pTHead, teaID); 50 break; 51 } 52 case '0': 53 { 54 return 1; 55 } 56 default : 57 { 58 getchar(); 59 system("clear"); 60 printf("\n選項輸入錯誤!請重新輸入"); 61 } 62 } 63 }
學生和教師的菜單類似。
登錄界面一覽登錄界面一覽
登錄函數 login.c全部

1 #include "login.h" 2 3 int IDhao; 4 int IDstuhao; 5 int resID[10] = {0};//申請辭職待處理的教師ID存儲 6 int resdID[10] = {0};//申請辭職未處理的教師ID 7 int resnum = 0; 8 int resokID[10] = {0};//批准辭職的教師ID 9 10 void main() 11 { 12 Node *pHead = makeNode(); 13 pHead = readFromFile(pHead); 14 TeaNode *pTHead = makeTeaNode(); 15 pTHead = readFromTeaFile(pTHead); 16 /*if(pTHead == NULL) 17 { 18 TeaNode *pTHead = makeTeaNode(); 19 writeToTeaFile(pTHead); 20 }*/ 21 22 int retlogin = login(pHead, pTHead);//讀取登錄菜單返回值,不同返回值代表不同用戶在操作 23 while(retlogin != 0)//為0時退出,不為0時一直循環,實現系統的持續運行 24 { 25 int flag = 0; 26 while(retlogin == 1)//管理員身份登入 27 { 28 if(flag == 0) 29 { 30 resinformation(pTHead);//辭職信息窗口顯示 31 flag = 1; 32 } 33 if(admindo(pTHead) == 1)//管理員執行函數 34 { 35 flag = 0; 36 getchar();//吸收字符 37 retlogin = login(pHead, pTHead); 38 } 39 } 40 while(retlogin == 2)//班主任 41 { 42 int nn = resfeedback(pTHead); 43 if(nn == 2) 44 { 45 if(headteacherdo(pHead, pTHead,IDhao) == 1) 46 { 47 directdeltea(pTHead,IDhao); 48 getchar(); 49 retlogin = login(pHead, pTHead); 50 } 51 } 52 else 53 { 54 if(headteacherdo(pHead, pTHead,IDhao) == 1) 55 { 56 getchar(); 57 retlogin = login(pHead, pTHead); 58 } 59 } 60 } 61 while(retlogin == 3)//任課老師 62 { 63 int nn = resfeedback(pTHead); 64 if(nn == 2) 65 { 66 if(teacherdo(pTHead, pHead) == 1) 67 { 68 directdeltea(pTHead,IDhao); 69 getchar(); 70 retlogin = login(pHead, pTHead); 71 } 72 } 73 else 74 { 75 if(teacherdo(pTHead, pHead) == 1) 76 { 77 getchar(); 78 retlogin = login(pHead, pTHead); 79 } 80 } 81 } 82 while(retlogin == 4)//學生登錄 83 { 84 if(studo(pHead) == 1)//學生執行菜單 85 { 86 getchar(); 87 retlogin = login(pHead, pTHead); 88 } 89 } 90 } 91 92 // readFromFile(pHead); 93 // showList(pHead) 94 } 95 96 97 /*登錄界面菜單*/ 98 int login(Node *pHead, TeaNode *pTHead) 99 { 100 system("clear"); 101 printf("\t\t\t"); 102 printf("\033[32m\033[1m\033[44m歡迎來到師生管理系統\n\033[0m\n"); 103 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m登錄選項\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 104 printf("|\t\t\t\t\t\t\t\t|\n"); 105 printf("\t\t\t1.管理員登錄\n"); 106 printf("|\t\t\t\t\t\t\t\t|\n"); 107 printf("\t\t\t2.教師登錄\n"); 108 printf("|\t\t\t\t\t\t\t\t|\n"); 109 printf("\t\t\t3.學生登錄\n"); 110 printf("|\t\t\t\t\t\t\t\t|\n"); 111 printf("\t\t\t0.退出\n"); 112 printf("|\t\t\t\t\t\t\t\t|\n"); 113 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 114 printf("請選擇:"); 115 char ch; 116 ch = getchar(); 117 switch(ch) 118 { 119 case '1': 120 { 121 int ret = adminlogin(); 122 if(ret != 1) 123 { 124 printf("管理員登入失敗!\n\n\n"); 125 printf("按任意鍵退出系統!!!"); 126 char ch1; 127 ch1 = getchar();//利用字符獲取函數實現簡單的界面停留 128 return 0; 129 } 130 else if(ret == 1) 131 return 1;//返回1,回在主函數中根據不同的返回值進入不同的操作菜單 132 } 133 case '2': 134 { 135 136 int ret = tealogin(pTHead); 137 while(ret != 1 && ret != 2) 138 { 139 system("clear"); 140 printf("教師登入失敗!\n"); 141 printf("請重新輸入!\n"); 142 ret = tealogin(pTHead);//調用教師登錄函數 143 getchar(); 144 } 145 if(ret == 1) 146 //由於教師是班主任和任課老師執行是有差別的,所以函數中返回值為1時為班主任,返回值為2時為任課老師 147 { 148 getchar(); 149 return 2; 150 break; 151 } 152 if(ret == 2) 153 { 154 getchar(); 155 return 3; 156 break; 157 } 158 } 159 case '3': 160 { 161 int retstu = stulogin(pHead);//學生登錄函數 162 getchar(); 163 while(retstu != 1) 164 { 165 system("clear"); 166 printf("學生登入失敗!\n"); 167 printf("請重新輸入!\n"); 168 retstu = stulogin(pHead); 169 getchar(); 170 } 171 if(retstu == 1) 172 { 173 return 4;//返回值為4 174 break; 175 } 176 } 177 case '0': 178 { 179 return 0;//返回0,退出管理系統 180 } 181 default: 182 { 183 printf("\n選項輸入錯誤!請重新輸入"); 184 login(pHead, pTHead); 185 }; 186 } 187 } 188 189 /*管理員登錄菜單*/ 190 int adminlogin() 191 { 192 char sname[MAX_SIZE]; 193 char spwd[MAX_SIZE]; 194 system("clear"); 195 for(int i = 0; i < 3; i++) 196 { 197 //printf("\n\n\n"); 198 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 管理員登錄✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 199 printf("\t\t ☞ 用戶名:"); 200 scanf("%s",sname); 201 getchar(); 202 printf("\n\n\n"); 203 printf("\t\t ☞ 密 碼:"); 204 set_disp_mode(STDIN_FILENO,0); 205 getpasswd(spwd, MAX_SIZE); 206 set_disp_mode(STDIN_FILENO,1); 207 if(strcmp(sname,"admin") == 0 && strncmp(spwd,"123456",6) == 0) 208 { 209 //getchar();//吸收多余字符 210 system("clear"); 211 return 1; 212 } 213 else 214 { 215 if(i == 2) 216 { 217 return -1; 218 } 219 else 220 { 221 system("clear"); 222 printf("\t\033[31m ✖ ✖ ✖ 提示:用戶名或者密碼輸入錯誤!"); 223 printf("還有%d次機會\033[0m\n\n\n", 2-i); 224 } 225 } 226 } 227 } 228 229 /*辭職信息顯示*/ 230 int resinformation(TeaNode *pTHead) 231 { 232 system("clear"); 233 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \033[1m辭職信息提醒\033[0m\033[33m✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n"); 234 TeaNode *temp = makeTeaNode(); 235 if(resID[0] == 0) 236 { 237 printf("|\t\t\t\t\t\t\t\t|\n\n"); 238 printf("|\t\t\t\t\t\t\t\t|\n"); 239 printf("\t\t\t無辭職信息!\n"); 240 printf("|\t\t\t\t\t\t\t\t|\n\n"); 241 printf("|\t\t\t\t\t\t\t\t|\n\n"); 242 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 243 printf("按Enter繼續..."); 244 getchar(); 245 } 246 else 247 { 248 printf("有 %d 條辭職信息待處理!\n",resnum); 249 int i =0; 250 while(i < 10) 251 { 252 if(resID[i] != 0) 253 { 254 temp = findteanode(pTHead,resID[i]); 255 printf("該教師信息為:\n"); 256 printf("--%-4d -- %-8s -- %-10s --\n", 257 temp->data.ID, temp->data.name, temp->data.password); 258 printf("-- %-3d -- %-3d -- %-3c -- %-10s --\n", 259 temp->data.age,temp->data.classes, temp->data.sex, temp->data.position); 260 getchar(); 261 printf("是否同意辭職[Y/N]"); 262 char ch = '\0'; 263 while(ch != 'Y' && ch != 'N' && ch != 'y' && ch != 'n') 264 { 265 scanf("%c",&ch); 266 getchar(); 267 } 268 if(ch == 'Y' || ch == 'y') 269 { 270 int j = 0; 271 while(j < 10) 272 { 273 if(resokID[j] == 0) 274 { 275 resokID[j] = temp->data.ID; 276 break; 277 } 278 j++; 279 } 280 } 281 else if(ch == 'N' || ch == 'n') 282 { 283 printf("不同意辭職!\n"); 284 } 285 } 286 i++; 287 } 288 printf("處理完畢!\n"); 289 getchar(); 290 char ch1 = '\0'; 291 printf("按Enter進入操作菜單!\n"); 292 ch1 = getchar(); 293 system("clear"); 294 } 295 for(int z = 0; z < 10; z++) 296 { 297 resID[z] = 0; 298 } 299 resnum = 0; 300 temp = NULL; 301 } 302 303 /*辭職信息回饋*/ 304 int resfeedback(TeaNode *pTHead) 305 { 306 TeaNode *temp = makeTeaNode(); 307 temp = findteanode(pTHead, IDhao); 308 int i = 0; 309 while(i < 10) 310 { 311 // printf("%d\n",resdID[i]); 312 // printf("%d\n",resID[i]); 313 if(resdID[i] == IDhao) 314 { 315 int j = 0; 316 while(j < 10) 317 { 318 if(resID[j] == IDhao) 319 { 320 printf("辭職申請管理員還未處理,請耐心等待!\n"); 321 return 1;//辭職申請還未處理; 322 break; 323 } 324 if(resokID[j] == IDhao) 325 { 326 resokID[j] = 0; 327 resdID[i] = 0; 328 printf("辭職申請已通過,此次為最后一次登錄!\n"); 329 return 2;//辭職申請已經處理並且已經批准; 330 break; 331 } 332 j++; 333 } 334 resdID[i] = 0; 335 printf("管理員未通過您的辭職申請,有事請面談!\n"); 336 return 3;//申請辭職處理過但是不同意辭職; 337 break; 338 } 339 i++; 340 } 341 return 0;//未申請過辭職 342 } 343 344 /*管理員執行選項*/ 345 int admindo(TeaNode *pTHead) 346 { 347 system("clear"); 348 printf("\033[32m\033[1m\033[44m ☃ 管理員admin,您好!\n\033[0m\n"); 349 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 操作選項✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 350 printf("|\t\t\t\t\t\t\t\t|\n"); 351 printf("\t\t\t ❁ 1.教師信息錄入\n"); 352 printf("|\t\t\t\t\t\t\t\t|\n"); 353 printf("\t\t\t ❁ 2.查看教師信息\n"); 354 printf("|\t\t\t\t\t\t\t\t|\n"); 355 printf("\t\t\t ❁ 3.修改教師信息\n"); 356 printf("|\t\t\t\t\t\t\t\t|\n"); 357 printf("\t\t\t ❁ 4.刪除教師信息\n"); 358 printf("|\t\t\t\t\t\t\t\t|\n"); 359 printf("\t\t\t ❁ 0.注銷\n"); 360 printf("|\t\t\t\t\t\t\t\t|\n"); 361 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 362 printf("請選擇:"); 363 char ch; 364 ch = getchar(); 365 switch(ch) 366 { 367 case '1': 368 { 369 entertea(pTHead); 370 break; 371 } 372 case '2': 373 { 374 getchar(); 375 examintea(pTHead); 376 char ch1 = '\0'; 377 printf("\n"); 378 printf("按Enter退回菜單!\n"); 379 ch1 = getchar(); 380 break; 381 } 382 case '3': 383 { 384 modifytea(pTHead); 385 break; 386 } 387 case '4': 388 { 389 deltea(pTHead); 390 break; 391 } 392 case '0': 393 { 394 return 1; 395 } 396 default : 397 { 398 getchar(); 399 system("clear"); 400 printf("\n選項輸入錯誤!請重新輸入"); 401 } 402 } 403 } 404 405 /*教師登錄菜單*/ 406 int tealogin(TeaNode *pTHead) 407 { 408 int teaID; 409 char teapwd[MAX_SIZE]; 410 system("clear"); 411 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 教師登錄✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 412 printf("\t ☞ 用戶名(工號):"); 413 scanf("%d",&teaID); 414 getchar(); 415 IDhao = teaID; 416 printf("\n\n\n"); 417 printf("\t ☞ 輸 入 密 碼:"); 418 set_disp_mode(STDIN_FILENO,0); 419 getpasswd(teapwd, MAX_SIZE); 420 set_disp_mode(STDIN_FILENO,1); 421 //getchar();//吸收字符 422 TeaNode *p = makeTeaNode(); 423 p = findteanode(pTHead, teaID); 424 if(p == NULL) 425 { 426 return -1; 427 } 428 if(strncmp(p->data.password,teapwd,strlen(p->data.password)) == 0) 429 { 430 if(strcmp(p->data.position,"head") == 0) 431 { 432 system("clear"); 433 return 1; 434 } 435 else 436 { 437 system("clear"); 438 return 2; 439 } 440 } 441 else 442 { 443 printf("教師密碼輸入錯誤!\n"); 444 } 445 } 446 447 448 449 /*班主任執行選項*/ 450 int headteacherdo(Node *pHead, TeaNode *pTHead, int ID) 451 { 452 TeaNode *temp = makeTeaNode(); 453 temp = findteanode(pTHead, ID); 454 char name1[16]; 455 strcpy(name1, temp->data.name); 456 printf("\033[32m\033[1m\033[44m ☃ %d 班班主任 %s,您好!\n\033[0m\n",temp->data.classes,name1); 457 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 班主任操作選項 ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 458 printf("|\t\t\t\t\t\t\t\t|\n"); 459 printf("\t\t\t1.錄入本班學生信息\n"); 460 printf("|\t\t\t\t\t\t\t\t|\n"); 461 printf("\t\t\t2.查看本班學生信息\n"); 462 printf("|\t\t\t\t\t\t\t\t|\n"); 463 printf("\t\t\t3.修改學生相關信息\n"); 464 printf("|\t\t\t\t\t\t\t\t|\n"); 465 printf("\t\t\t4.刪除學生所有信息\n"); 466 printf("|\t\t\t\t\t\t\t\t|\n"); 467 printf("\t\t\t5.按總分排名查看成績\n"); 468 printf("|\t\t\t\t\t\t\t\t|\n"); 469 printf("\t\t\t6.修改自己登錄密碼\n"); 470 printf("|\t\t\t\t\t\t\t\t|\n"); 471 printf("\t\t\t7.辭職\n"); 472 printf("|\t\t\t\t\t\t\t\t|\n"); 473 printf("\t\t\t0.注銷\n"); 474 printf("|\t\t\t\t\t\t\t\t|\n"); 475 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 476 printf("請選擇:"); 477 char ch = '\0'; 478 ch = getchar(); 479 switch(ch) 480 { 481 case '1': 482 { 483 enterstu(pHead); 484 break; 485 } 486 case '2': 487 { 488 getchar(); 489 examinestu(pTHead, pHead, IDhao); 490 char ch1 = '\0'; 491 printf("\n"); 492 printf("按Enter退回菜單!\n"); 493 ch1 = getchar(); 494 break; 495 } 496 case '3': 497 { 498 modifystu(pHead); 499 break; 500 } 501 case '4': 502 { 503 printf("請輸入要刪除學生學號:"); 504 int stuID; 505 scanf("%d", &stuID); 506 getchar(); 507 delstu(pHead, stuID); 508 break; 509 } 510 case '5': 511 { 512 getchar(); 513 bublesort(pHead); 514 writeToFile(pHead); 515 lookrank(pTHead, pHead, IDhao); 516 char ch1 = '\0'; 517 printf("\n"); 518 printf("按Enter退回菜單!\n"); 519 ch1 = getchar(); 520 break; 521 } 522 case '6': 523 { 524 changepasswd(pTHead, IDhao); 525 return 1; 526 break; 527 } 528 case '7': 529 { 530 int n; 531 n = resignation(pTHead, IDhao); 532 if(n == 0) 533 { 534 break; 535 } 536 else if(n != 0) 537 { 538 resID[resnum] = IDhao; 539 resdID[resnum] = IDhao; 540 resnum++; 541 return 1; 542 } 543 } 544 case '0': 545 { 546 return 1; 547 } 548 default : 549 { 550 getchar(); 551 system("clear"); 552 printf("\n選項輸入錯誤!請重新輸入"); 553 }; 554 } 555 } 556 557 /*任課教師執行菜單*/ 558 int teacherdo(TeaNode *pTHead, Node *pHead) 559 { 560 printf("任課教師操作選項:\n"); 561 printf("\t1.查看學生科目成績以及排名\n"); 562 printf("\t2.修改自己登錄密碼\n"); 563 printf("\t3.辭職\n"); 564 printf("\t0.注銷\n"); 565 printf("請選擇:"); 566 char ch = '\0'; 567 ch = getchar(); 568 switch(ch) 569 { 570 case '0': 571 { 572 return 1; 573 break; 574 } 575 case '1': 576 { 577 getchar(); 578 onebublesort(pTHead, pHead, IDhao); 579 writeToFile(pHead); 580 lookrank(pTHead, pHead, IDhao); 581 char ch1 = '\0'; 582 printf("\n"); 583 printf("按Enter退回菜單!\n"); 584 ch1 = getchar(); 585 break; 586 } 587 case '2': 588 { 589 changepasswd(pTHead, IDhao); 590 return 1; 591 break; 592 } 593 case '3': 594 { 595 int n; 596 n = resignation(pTHead, IDhao); 597 if(n == 0) 598 { 599 break; 600 } 601 else if(n != 0) 602 { 603 resID[resnum] = IDhao; 604 resdID[resnum] = IDhao; 605 resnum++; 606 return 1; 607 } 608 } 609 default : 610 { 611 getchar(); 612 system("clear"); 613 printf("\n選項輸入錯誤!請重新輸入"); 614 } 615 } 616 } 617 618 619 620 /*學生登錄菜單*/ 621 int stulogin(Node *pHead) 622 { 623 int stuID; 624 char stupwd[MAX_SIZE]; 625 system("clear"); 626 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 學生登錄✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n\n\n\n"); 627 printf("\t ☞ 用戶名(ID號):"); 628 scanf("%d",&stuID); 629 IDstuhao = stuID; 630 printf("\n\n\n"); 631 printf("\t ☞ 輸 入 密 碼:"); 632 scanf("%s",stupwd); 633 //getchar();//吸收字符 634 Node *p = makeNode(); 635 p = findnode(pHead, stuID); 636 if(p == NULL) 637 { 638 return -1; 639 } 640 if(strcmp(p->data.password,stupwd) == 0) 641 { 642 system("clear"); 643 return 1; 644 } 645 else 646 { 647 printf("密碼輸入錯誤!\n"); 648 return 0; 649 } 650 } 651 652 /*學生執行菜單*/ 653 int studo(Node *pHead) 654 { 655 Node *temp = makeNode(); 656 temp = findnode(pHead, IDstuhao); 657 char name1[16]; 658 strcpy(name1, temp->data.name); 659 printf("\033[32m\033[1m\033[44m ☃ %d 班同學 %s,您好!\n\033[0m\n",temp->data.classes,name1); 660 printf("\033[33m ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ 學生操作選項 ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ ✈ \n"); 661 printf("|\t\t\t\t\t\t\t\t|\n"); 662 printf("\t\t\t1.學生信息查詢\n"); 663 printf("|\t\t\t\t\t\t\t\t|\n"); 664 printf("\t\t\t2.登錄密碼修改\n"); 665 printf("|\t\t\t\t\t\t\t\t|\n"); 666 printf("\t\t\t3.成績班級排名\n"); 667 printf("|\t\t\t\t\t\t\t\t|\n"); 668 printf("\t\t\t4.成績學校排名\n"); 669 printf("|\t\t\t\t\t\t\t\t|\n"); 670 printf("\t\t\t0.退出\n"); 671 printf("|\t\t\t\t\t\t\t\t|\n"); 672 printf(" ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ ☺ ☻ \n\n"); 673 printf("請選擇:"); 674 675 char ch = '\0'; 676 ch = getchar(); 677 switch(ch) 678 { 679 680 case '1': 681 { 682 getchar(); 683 mynews(pHead, IDstuhao); 684 char ch1 = '\0'; 685 printf("\n"); 686 printf("按Enter退回菜單!\n"); 687 ch1 = getchar(); 688 system("clear"); 689 break; 690 } 691 case '2': 692 { 693 stuchangepsw(pHead, IDstuhao); 694 return 1; 695 break; 696 } 697 case '3': 698 { 699 getchar(); 700 classranking(pHead, IDstuhao); 701 char ch1 = '\0'; 702 printf("\n"); 703 printf("按Enter退回菜單!\n"); 704 ch1 = getchar(); 705 system("clear"); 706 break; 707 } 708 case '4': 709 { 710 getchar(); 711 schoolranking(pHead, IDstuhao); 712 char ch1 = '\0'; 713 printf("\n"); 714 printf("按Enter退回菜單!\n"); 715 ch1 = getchar(); 716 system("clear"); 717 break; 718 } 719 case '0': 720 { 721 return 1; 722 break; 723 } 724 default : 725 { 726 getchar(); 727 system("clear"); 728 printf("\n選項輸入錯誤!請重新輸入"); 729 } 730 } 731 732 } 733 734 //函數getpasswd用於獲得用戶輸入的密碼,並將其存儲在指定的字符數組中 735 int getpasswd(char* passwd, int size) 736 { 737 int c; 738 int n = 0; 739 740 do{ 741 c=getchar(); 742 if (c != '\n'|c!='\r'){ 743 passwd[n++] = c; 744 } 745 }while(c != '\n' && c !='\r' && n < (size - 1)); 746 passwd[n] = '\0'; 747 return n; 748 } 749 //函數set_disp_mode用於控制是否開啟輸入回顯功能 750 //如果option為0,則關閉回顯,為1則打開回顯 751 int set_disp_mode(int fd,int option) 752 { 753 int err; 754 struct termios term; 755 if(tcgetattr(fd,&term)==-1){ 756 perror("Cannot get the attribution of the terminal"); 757 return 1; 758 } 759 if(option) 760 term.c_lflag|=ECHOFLAGS; 761 else 762 term.c_lflag &=~ECHOFLAGS; 763 err=tcsetattr(fd,TCSAFLUSH,&term); 764 if(err==-1 && err==EINTR){ 765 perror("Cannot set the attribution of the terminal"); 766 return 1; 767 } 768 return 0; 769 }
頭文件 login.h

1 #include <termios.h> 2 #include <unistd.h> 3 #include <errno.h> 4 #include "teacherdo.h" 5 6 #define MAX_SIZE 20 7 #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL) 8 9 /*管理員登錄菜單*/ 10 int adminlogin(); 11 12 /*學生登錄菜單*/ 13 int stulogin(Node *pHead); 14 15 /*學生執行菜單*/ 16 int studo(); 17 18 /*管理員執行選項*/ 19 int admindo(TeaNode *pHead); 20 21 /*主菜單*/ 22 int login(Node *pHead, TeaNode *pTHead); 23 24 /*教師登錄菜單*/ 25 int tealogin(TeaNode *pTHead); 26 27 /*班主任執行菜單*/ 28 int headteacherdo(Node *pHead, TeaNode *pTHead, int ID); 29 30 /*任課教師執行菜單*/ 31 int teacherdo(TeaNode *pTHead, Node *pHead); 32 33 /*辭職信息顯示*/ 34 int resinformation(TeaNode *pTHead); 35 36 /*辭職信息回饋*/ 37 int resfeedback(TeaNode *pTHead); 38 39 //函數getpasswd用於獲得用戶輸入的密碼,並將其存儲在指定的字符數組中 40 int getpasswd(char* passwd, int size); 41 42 //函數set_disp_mode用於控制是否開啟輸入回顯功能 43 //如果option為0,則關閉回顯,為1則打開回顯 44 int set_disp_mode(int fd,int option);
整個項目分開寫到了很多個文件里,有些函數沒有講到,后續會一個一個介紹。
本着一個記錄自己學習成果的態度,也希望能夠給其他人有一個參考。