/*----------------------------------------------------------------------------------------- 程序名:stu_management.c 程序功能: 1.鑑別root權限,設置管理員和學生權限,管理員和學生能夠異步登陸 (若是加入網絡模塊就能夠實現多用戶同步登陸) 2.管理員能夠設置/查詢/修改學生全部帳戶信息,也能夠增長新的管理員 3.學生只有查詢帳戶/課程/獎學金的權限 4.自動生成配置文件,退出時並保存配置文件,防止信息丟失 5.移植程序只需將可執行程序和配置文件移植便可,信息不會丟失 程序實現:採用鏈表加文件操做庫函數結合過程控制實現 編譯:gcc stu_management.c -o stu_management 編譯環境:gcc 版本 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 做者:張峯 [mailto:frankzhang02010@gmail.com] 修改日期:2013-12-8 -----------------------------------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define N 3 //課程和獎學金種類的總數量和 typedef struct SCORE{ char course_name[32]; float score; }Score; typedef struct node{ int auth; char usr_name[32]; char password[18]; int id; char stu_name[32]; char major[32]; Score s[N]; struct node* next; }Node; Node *head,*last; int usr_type; char usr_name[32],password[18]; const char* f_name="usr_info.conf"; void load_data(),save_data(),export_data(),check_admin(),add_admin(),login(); void add_student(),search_student(),del(),modify(),modify_password(),logout(); void show_score(),search_course(); void title_win(),msg_win(); int main() { int ch; load_data(); title_win(); check_admin(); loop: printf("請選擇用戶類型:"); scanf("%d",&usr_type); if(usr_type!=1 && usr_type!=2) { msg_win("沒有該用戶類型,請從新輸入,1表示admin,2表示student\n"); goto loop; } if(usr_type==1) { title_win(); login(); while(1) { msg_win("User Type:Admin"); msg_win("Add/Srch/Del/Mdfy/M_Psd/Quit/Exp/Save"); printf(">"); scanf("%d",&ch); switch(ch) { case 1:add_student();break; case 2:search_student();break; case 3:del();break; case 4:modify();break; case 5:modify_password();break; case 6:logout();break; case 7:export_data();break; case 8:save_data();break; case 9:add_admin();break; default:break; } getchar(); msg_win("按任意鍵返回"); getchar(); system("clear"); } } else { title_win(); login(); while(1) { msg_win("User Type:Student"); msg_win("ShowScore/SrchCourse/M_Pwd/Quit"); printf(">"); scanf("%d",&ch); switch(ch) { case 1:show_score();break; case 2:search_course();break; case 3:modify_password();break; case 4:logout();break; default:break; } getchar(); msg_win("按任意鍵返回"); getchar(); system("clear"); } } return 0; } void load_data() { FILE* fp=NULL; if(!(fp=fopen(f_name,"a"))) { msg_win("Open file fail"); return; } fclose(fp); fp=NULL; if(!(fp=fopen(f_name,"r+"))) { msg_win("Open file fail"); return; } Node* p; while(1) { p=(Node*)malloc(sizeof(Node)); if(!p) continue; if(!fread(p,sizeof(Node),1,fp)) break; if(head==NULL) { head=last=p; head->next=NULL; } else { last->next=p; last=p; last->next=NULL; } } fclose(fp); fp=NULL; } void save_data() { FILE* fp=NULL; if(!(fp=fopen(f_name,"w+"))) { msg_win("Open file fail"); return; } Node* p; p=head; while(p) { fwrite(p,sizeof(Node),1,fp); p=p->next; } fclose(fp); fp=NULL; } void export_data() { FILE* fp; if(!(fp=fopen("export.log","w+"))) { msg_win("Open file fail"); return; } Node* p; int i; p=head; while(p) { fprintf(fp,"%-2d|%-15s|%-18s|%-15s|%-10d|%-18s|\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major); for(i=0;i<N;i++) fprintf(fp,"%s:%-5.1f|",p->s[i].course_name,p->s[i].score); fprintf(fp,"\n"); p=p->next; } fclose(fp); } void check_admin() { Node* p; p=head; while(p) { if(p->auth==1) return; p=p->next; } p=(Node*)malloc(sizeof(Node)); p->auth=1; msg_win("請設置管理員帳戶"); printf("用戶名:"); scanf("%s",p->usr_name); printf("密碼:"); scanf("%s",p->password); if(head==NULL) { head=last=p; head->next=NULL; } else { last->next=p; last=p; last->next=NULL; } msg_win("管理員帳戶設置成功"); sleep(1); system("clear"); } void add_admin() { Node* p; p=(Node*)malloc(sizeof(Node)); p->auth=1; msg_win("添加管理員帳戶"); printf("用戶名:"); scanf("%s",p->usr_name); printf("密碼:"); scanf("%s",p->password); if(head==NULL) { head=last=p; head->next=NULL; } else { last->next=p; last=p; last->next=NULL; } msg_win("新管理員帳戶設置成功"); } void login() { login: system("clear"); msg_win("登陸"); printf("用戶名:"); scanf("%s",usr_name); printf("密碼:"); scanf("%s",password); Node* p; p=head; while(p) { if(!strcmp(p->usr_name,usr_name) && !strcmp(p->password,password) && p->auth==usr_type) { msg_win("登陸成功"); sleep(1); system("clear"); return; } p=p->next; } msg_win("用戶名或密碼不正確,按任意鍵從新登陸"); getchar();getchar(); goto login; } void add_student() { Node* p=(Node*)malloc(sizeof(Node)); if(!p) return ; p->auth=2; msg_win("添加學生帳戶"); printf("用戶名:"); scanf("%s",p->usr_name); printf("密碼:"); scanf("%s",p->password); printf("姓名:"); scanf("%s",p->stu_name); printf("學號:"); scanf("%d",&(p->id)); printf("專業:"); scanf("%s",p->major); if(head==NULL) { head=last=p; head->next=NULL; } else { last->next=p; last=p; last->next=NULL; } msg_win("學生帳戶設置成功"); } void search_student() { msg_win("搜索帳戶信息"); int stu_id,i; printf("請輸入學號:"); scanf("%d",&stu_id); Node* p; p=head; while(p) { if(p->id==stu_id) { printf("%d %s %s %s %d %s\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major); for(i=0;i<N;i++) printf("%s:%-5.1f",p->s[i].course_name,p->s[i].score); printf("\n"); return; } p=p->next; } msg_win("系統中沒有該學號"); } void del() { Node *p,*q; int stu_id; msg_win("刪除帳戶信息"); printf("請輸入學號:"); scanf("%d",&stu_id); p=head; while(p) { if(p->id==stu_id) { if(head==p) head=head->next; else q->next=p->next; free(p); msg_win("刪除成功!"); return; } q=p; p=p->next; } msg_win("刪除失敗!系統中沒有該學號"); } void modify() { int stu_id,i; msg_win("修改課程成績和獎學金"); printf("請輸入學號:"); scanf("%d",&stu_id); Node* p; p=head; while(p) { if(p->id==stu_id) { for(i=0;i<N;i++) scanf("%s %f",p->s[i].course_name,&(p->s[i].score)); return; } p=p->next; } msg_win("系統中沒有該學號"); } void modify_password() { char temp[18],new_password[18]; msg_win("修改密碼"); printf("請輸入舊密碼:"); scanf("%s",temp); printf("請輸入新密碼:"); scanf("%s",new_password); printf("請確認新密碼:"); scanf("%s",password); Node* p; p=head; while(p) { if(!strcmp(usr_name,p->usr_name)) { if(!strcmp(p->password,temp)&& !strcmp(new_password,password)) { strcpy(password,new_password); strcpy(p->password,password); msg_win("密碼修改爲功"); return; } else { msg_win("輸入有誤,自動退出"); return; } } p=p->next; } } void logout() { save_data(); msg_win("成功退出"); exit(1); } void show_score() { int i; Node* p; p=head; msg_win("全部課程成績和獎學金"); while(p) { if(!strcmp(usr_name,p->usr_name)) { printf("%d %s %s %s %d %s\n",p->auth,p->usr_name,p->password,p->stu_name,p->id,p->major); for(i=0;i<N;i++) printf("%s:%-5.1f",p->s[i].course_name,p->s[i].score); printf("\n"); return; } p=p->next; } } void search_course() { char course_name[32]; int i; msg_win("輸入要查詢的課程"); printf(">"); scanf("%s",course_name); Node* p; p=head; while(p) { if(!strcmp(usr_name,p->usr_name)) { for(i=0;i<N;i++) { if(!strcmp(course_name,p->s[i].course_name)) { printf("%s:%-5.1f\n",p->s[i].course_name,p->s[i].score); return; } } } p=p->next; } } char str1[]="Student Information Management System"; void title_win() { int i,M; M=strlen(str1); for(i=0;i<M;i++) printf("-"); printf("\n"); printf("%s\n",str1); for(i=0;i<M;i++) printf("-"); printf("\n"); } void msg_win(const char* str) { int i,M; M=strlen(str1); printf("\n"); printf("%s\n",str); for(i=0;i<M;i++) printf("-"); printf("\n"); }