我的第一個c專案
阿新 • • 發佈:2018-12-11
學習c已經兩週了,這是我的第一個專案,以下是我的一些總結:
我們的專案名稱是學生成績管理系統,主要功能是:
- 學生能夠登陸系統查詢語數外三科成績,及三科平均分、總分、排名。
- 教師能夠管理學生、錄入成績。
- 管理員能夠管理教師,超級管理員能夠管理管理員。
- 超級管理員外,其他人輸錯密碼3次賬號即鎖定,向上級請求才能解鎖。
5.除超級管理員外,每個使用者第一次登陸必須修改密碼。
在這個專案中我與其他兩位同學合作,我負責的是登陸密碼模組和主介面模組以及學生模組。主要實現方法是:首先判斷輸入的ID是否存在,存在且未鎖定,則繼續輸入密碼,否則顯示賬號不存在。判斷密碼是否正確,若正確則登陸,若不正確則減少登陸次數,直至次數為零。當再次登入時,若賬號已被鎖定,則顯示賬號被鎖定,需要向上級請求解鎖。
以下是程式碼部分:
密碼模組:
//教師登入 15 void tea_username_and_password(void) 16 { 17 char id[20]; 18 int tea_cur = 0; 19 char str[10]; 20 int n = 3; 21 puts("請輸入工號:"); 22 { 23 int flag = 1; 24 while(flag){ 25 scanf("%s",id); 26 for(int i = 0;i < 50;i++ ){ 27 //輸入的id存在且該id在職 28 if(0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 1){ 29 //若被鎖定則顯示 30 if(tea[i].is_lock == 1){ 31 printf("該工號被鎖定!請向上一級(管理員)申訴\n"); 32 sleep(1); 33 return; 34 //否則,退出迴圈,記錄是第a個人 35 }else{ 36 flag = 0; 37 tea_cur = i; 38 break; 39 } 40 //輸入id存在但離職或不存在,顯示不存在 41 }else if((0 == strcmp(tea[i].tea_id,id) && tea[i].is_work == 2) || (i == 49)){ 42 printf("該工號不存在\n"); 43 sleep(1); 44 return; 45 } 46 } 47 } 48 } 49 puts("請輸入密碼:"); 50 do{ 51 n--; 52 scanf("%s",str); 53 //輸入的密碼與該賬號密碼不相同,則進入 54 if(0 != strcmp(tea[tea_cur].tea_pass_word,str)){ 55 //n記錄剩餘次數 56 if(n > 0){ 57 printf("密碼錯誤,請重新輸入(還有%d次)\n",n); 58 }else{ 59 printf("工號被鎖定!請向上一級(管理員)申訴\n"); 60 tea[tea_cur].is_lock=1; 61 sleep(1); 62 return; 63 } 64 } 65 //如果相同則進入教師模組 66 else{ 67 //傳參內容:第a個教師 68 teacher_func(tea_cur); 69 n = 0; 70 } 71 }while(n); 72 }
學生模組程式碼:
1 #include "student.h" 2 #include "stu_tea_adm_struct.h" 3 #include "get_cmd.h" 4 #include "display.h" 5 extern Student stu[500]; 6 extern Teacher tea[50]; 7 extern Administrator adm[10]; 8 9 10 //修改密碼 11 void stu_cha_pass(int i) 12 { 13 printf("請輸入新的密碼:"); 14 scanf("%s",stu[i].stu_pass_word); 15 puts("修改成功!"); 16 sleep(1); 17 stu[i].is_first=1; 18 } 19 //顯示個人資訊 20 void inf_my(int i) 21 { 22 printf("姓名:%s 語文:%d 數學:%d 英語:%d 平均分:%.2lf 總分:%d\n",stu[i].name,stu[i].ach_chi,stu[i].ach_mat,stu[i].ach_eng,stu[i].ach_avg,stu[i].ach_sco); 23 printf("請按任意鍵返回..."); 24 getch(); 25 } 26 27 //總分排名 28 void sco_rank(int i) 29 { 30 printf("您的總分排名是%d\n",stu[i].sco_rank); 31 printf("按任意鍵返回..."); 32 getch(); 33 } 34 //數學成績排名 35 void mat_rank(int i) 36 { 37 printf("您的數學排名是%d\n",stu[i].mat_rank); 38 printf("按任意鍵返回..."); 39 getch(); 40 } 41 42 void eng_rank(int i) 43 { 44 printf("您的英語排名是%d\n",stu[i].eng_rank); 45 printf("按任意鍵返回..."); 46 getch(); 47 } 48 //語文成績排名顯示 49 void chi_rank(int i) 50 { 51 printf("您的語文排名是%d\n",stu[i].chi_rank); 52 printf("按任意鍵返回..."); 53 getch(); 54 } 55 56 //在查詢成績排名時選擇科目 57 void switch_course(int i) 58 { 59 printf("請選擇你要查詢的專案:"); 60 printf("1.數學"); 61 printf("2.英語"); 62 printf("3.語文"); 63 printf("4.總分"); 64 printf("5.返回"); 65 switch(get_cmd('1','5')) 66 { 67 case '1':mat_rank(i);break; 68 case '2':eng_rank(i);break; 69 case '3':chi_rank(i);break; 70 case '4':sco_rank(i);break; 71 case '5':return; 72 } 73 } 74 75 int student_use(int x) 76 { 77 //判斷是否第一次登入,是則要求修改 78 if(0==stu[x].is_first) 79 { 80 stu_display(); 81 puts("您使用的是預設密碼,請修改密碼:"); 82 scanf("%s",stu[x].stu_pass_word); 83 puts("修改成功!"); 84 stu[x].is_first=1; 85 sleep(1); 86 } 87 while(1) 88 { 89 stu_display(); 90 //根據輸入1~4選擇功能 91 switch(get_cmd('1','4')) 92 { 93 case '1':stu_cha_pass(x);break; 94 case '2':inf_my(x);break; 95 case '3':switch_course(x);break; 96 case '4':return 0;break; 97 } 98 } 99 }
這次專案練習是我們的第一次練習,還有很多的不足:
1.首先程式碼不夠規範,對於變數的命名不夠準確,使得其他人在閱讀程式碼時,可讀性不高,理解起來有困難。
2.其次我們的程式碼有很多的重複,優化不夠,會浪費很多的資源。
3.再者就是我們對於問題的思考不夠縝密,導致了一些邏輯問題。
4.然後就是我們的小組開始前討論不夠充分,使工作的分配有一些問題。
5.最後就是我們的測試不夠認真,致使一些bug未被發現,結果在演示時出錯。
經過這次的經歷,我總結了一些問題,在下一次做專案的時候希望可以避免這些問題。