簡易的學生成績錄入程式(完整版)
阿新 • • 發佈:2019-01-22
從開始學習C語言開始,不知不覺已經接近一個月了。通過一步一步的寫小程式,自己也漸漸掌握了C語言的一些基礎語法。最後以這個簡易的學生成績錄入小程式來鞏固一下這段時間的學習成果,就當做是一次期末測驗吧。
該程式總體上包括兩個模組,分為是登入模組(log.c)和處理模組(system.c),登入模組包含註冊賬號密碼和驗證賬號密碼功能,只有成功登入,才能進入處理模組進行學生資訊的錄入。處理模組包含錄入新學生資訊,修改學生資訊,獲取所有學生成績資訊(按平均分從高到低排序)功能。每個學生資訊包括:學號,姓名,數學成績,英語成績和平均分。經過儲存後,學生資訊會以二進位制檔案的形式儲存下來,下次登入程式時會自動讀取。
log.c(主程式)
#include <stdio.h> #include <string.h> #include "system.c" //匯入模組 //使用者登入驗證系統-改良 struct log //定義log結構用於儲存使用者賬號和密碼資訊 { char name[15]; char password[10]; }; int num; void logging(struct log person); //登入函式 void regis(struct log person); //註冊函式 void jiami(char*p); //密碼加密函式 int main() { FILE*fp; int choice; //操作序號 struct log person; if ((fp=fopen("num.dat","rb"))!=NULL) //讀取當前已註冊使用者的人數 { fread(&num,sizeof(int),1,fp); fclose(fp); } do{ printf("輸入操作對應序號:1.登入 2.註冊 3.退出(目前已註冊使用者:%d)\n",num); scanf("%d",&choice); switch (choice) { case 1:logging(person);break; case 2:regis(person);break; case 3:break; default:break; } }while(choice!=3); if ((fp=fopen("num.dat","wb"))!=NULL) //儲存當前已註冊使用者的人數 { fwrite(&num,sizeof(int),1,fp); fclose(fp); } return 0; } void logging(struct log person) { FILE*fp; struct log read; int flag=0; //輔助開關 if ((fp=fopen("logging.dat","rb"))==NULL) //若沒有一個註冊使用者,則無法登入 { printf("不存在註冊使用者\n"); }else { printf("請輸入賬號\n"); scanf("%s",person.name); printf("請輸入密碼\n"); scanf("%s",person.password); jiami(person.password); fread(&read,sizeof(struct log),1,fp); while(!feof(fp)) { if((strcmp(person.name,read.name)==0) && (strcmp(person.password,read.password)==0)) //從註冊資訊檔案讀取資訊,驗證賬號和密碼 { printf("登入成功\n"); fclose(fp); flag=1; score(); break; } fread(&read,sizeof(struct log),1,fp); } if (flag==0) {printf("使用者名稱不存在或密碼不正確\n"); fclose(fp);} } } void regis(struct log person) { FILE*fp; char check[10]; int flag_check,flag_check1; //兩個輔助開關 struct log read; do{ flag_check1=0; printf("請輸入新賬號\n"); scanf("%s",person.name); if ((fp=fopen("logging.dat","rb"))!=NULL) { fread(&read,sizeof(struct log),1,fp); while(!feof(fp)) { if (strcmp(person.name,read.name)==0) //防止使用者名稱被重複註冊 { printf("該賬戶已被註冊\n"); flag_check1=1; break; } fread(&read,sizeof(struct log),1,fp); } fclose(fp); } }while(flag_check1); do{ flag_check=0; printf("請輸入新賬號的密碼\n"); scanf("%s",person.password); printf("請再次輸入密碼\n"); scanf("%s",check); if (strcmp(person.password,check)!=0) //防止密碼誤輸入 { printf("兩次輸入的密碼不一致\n"); flag_check=1; } }while(flag_check); jiami(person.password); if ((fp=fopen("logging.dat","ab"))==NULL) { printf("註冊失敗\n"); }else { fwrite(&person,sizeof(struct log),1,fp); //把賬號和密碼寫入註冊檔案 printf("註冊成功\n"); num++; fclose(fp); } } void jiami(char*p) //對密碼進行加密 { for (;*p!='\0';p++) { *p=*p^15; } }
system.c(被匯入的模組)
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 //定義學生的資料結構,包含學號,姓名,數學成績,英語成績,平均分資訊,進行錄入,修改學生資訊,列印成績表等操作 struct student { int num; char name[10]; int math,english; double average; }; int sum=0; void score() { int choice; struct student students[MAXSIZE]; void new_student(struct student *p); //錄入新學生資訊 void change(struct student*p); //修改學生資訊 void get(struct student*p); //獲取所有學生成績 void open(struct student*,int*); //讀取二進位制檔案中的學生 void save(struct student*,int*); //儲存學生資訊 open(students,&sum); do{ printf("輸入操作對應的序號\n1.錄入成績 2.修改成績 3.獲取所有學生成績 4.儲存 5.登出\n"); scanf("%d",&choice); switch (choice) { case 1: new_student(students);break; case 2: change(students);break; case 3: get(students);break; case 4: {if (sum!=0) {save(students,&sum);}else{printf("儲存成功\n");}break;} case 5: break; default: printf("無效操作序號\n");break; } }while(choice!=5); } void open(struct student*p,int*psum) { FILE*fp; FILE*num; if ((num=fopen("studentnum.dat","rb"))!=NULL) { fread(psum,sizeof(int),1,num); fclose(num); } if ((fp=fopen("info.dat","rb"))!=NULL) { fread(p,sizeof(struct student),*psum,fp); fclose(fp); printf("讀取資料成功\n"); } } void save(struct student*p,int*psum) { FILE*fp; FILE*num; if ((num=fopen("studentnum.dat","wb"))!=NULL) { fwrite(psum,sizeof(int),1,num); fclose(num); }else { printf("儲存失敗\n"); } if ((fp=fopen("info.dat","wb"))!=NULL) { fwrite(p,sizeof(struct student),*psum,fp); fclose(fp); printf("儲存成功\n"); }else { printf("儲存失敗\n"); } } void new_student(struct student *p) { int flag =0,num_new,i,flag1; struct student *p1; //用於檢查學號是否重複 do { if (sum<MAXSIZE){ do { p1=p; flag1=0; printf("輸入學生學號\n"); scanf("%d",&num_new); for (i=0;i<sum;p1++) //檢查學號是否重複 { if (p1->num==num_new) { printf("學號重複\n"); flag1=1; break; } i++; } if (flag1==0) (p+sum)->num=num_new; }while(flag1==1); printf("輸入學生姓名\n"); scanf("%s",(p+sum)->name); printf("輸入學生數學成績\n"); scanf("%d",&((p+sum)->math)); printf("輸入學生英語成績\n"); scanf("%d",&((p+sum)->english)); (p+sum)->average=((p+sum)->math+(p+sum)->english)/2; sum+=1; printf("繼續錄入輸入1,否則輸入0\n"); scanf("%d",&flag); }else { printf("系統已滿,無法錄入\n"); break; } }while(flag==1); } void change(struct student*p) { int num_change,i,choice; printf("輸入待修改學生的學號\n"); scanf("%d",&num_change); for (i=0;i<sum;p++) { if (p->num==num_change) { printf("輸入修改的資訊型別對應的序號\n1.學號 2.姓名 3.數學成績 4.英語成績\n"); scanf("%d",&choice); switch (choice) { case 1: { printf("輸入新學號\n"); scanf("%d",&(p->num)); break; } case 2: { printf("輸入新姓名\n"); scanf("%s",p->name); break; } case 3: { printf("輸入新數學成績\n"); scanf("%d",&(p->math)); break; } case 4: { printf("輸入新英語成績\n"); scanf("%d",&(p->english)); break; } default:{ printf("無效輸入\n"); break; } } if (choice==3 ||choice==4) //如果修改成績,則平均分也要變 { p->average=(p->math+p->english)/2; } break; } i++; } if (i==sum) { printf("沒有此學生\n"); } } void get(struct student*p) { int compare( const void*a,const void*b); int i; if (sum==0) { printf("空\n"); }else { printf("學號 姓名 數學成績 英語成績 平均分\n"); qsort(p,sum,sizeof(struct student),compare); //按平均分從高到低排序 for (i=0;i<sum;p++) { printf("%d %s %d %d %.1f\n",p->num,p->name,p->math,p->english,p->average); i++; } } } int compare( const void*a,const void*b) { return ((struct student*)b)->average - ((struct student*)a)->average; }