C语言实现教务管理系统
生活随笔
收集整理的這篇文章主要介紹了
C语言实现教务管理系统
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、工具源文件
1.學(xué)生、教師、校長(zhǎng)結(jié)構(gòu)體 mis.h
// mis 信息管理系統(tǒng) // mis.h #ifndef MIS_H #define MIS_H#define MAX_TEA 50 //不要用MAX遍歷 #define MAX_STU 500typedef struct Student {int firstlogin; // 是否是第一次登入int id; // 學(xué)號(hào)char password[20]; // 密碼char name[20]; // 姓名char sex; double chinese; // 語(yǔ)文成績(jī)double math; // 數(shù)學(xué)成績(jī)double english; // 英語(yǔ)成績(jī)int count; // 計(jì)算密碼輸入次數(shù)int flag; // 狀態(tài):1,在校。-1,離校。0,該條記錄無(wú)數(shù)據(jù),或未使用 }Student;typedef struct Teacher//聲明教師的結(jié)構(gòu)體,用來(lái)存放教師的基本信息 {char name[20]; //教師的名字char sex; //教師的性別int id; //教師登陸系統(tǒng)的工號(hào)Student* stu;char password[20]; //教師登陸系統(tǒng)的密碼int count; //教師登錄系統(tǒng)輸錯(cuò)密碼的次數(shù)int firstlogin; //判斷是否第一次登錄int flag; //判斷是否在校 }Teacher;typedef struct admin{int firstlogin; // 是否是第一次登入char password[20]; // 密碼}Admin;extern Teacher* tea; extern Student* stu; #endif //MIS_H? ? ? ? 工具函數(shù)tools.c
#include <stdio.h> #include <stdlib.h> #include "tools.h" #include <getch.h> #include <unistd.h> #include <string.h> #include "mis.h" #include "admin.h" #include <malloc.h> Teacher* tea; Student* stu; extern int teacher_count; void msg_show(const char* msg, float sec)//短暫顯示提示信息 {printf("%s",msg);fflush(stdout);usleep(sec*1000000); } void anykey_continue(void)//按任意鍵繼續(xù) {puts("按任意鍵繼續(xù)...");stdin->_IO_read_ptr = stdin->_IO_read_end;getch(); } char* hidden_input(void)//隱藏式輸入密碼,用法:strcpy(*dest,hidden_input()),輸入密碼到給定字符串里 {stdin->_IO_read_ptr = stdin->_IO_read_end;//清空緩沖區(qū)static char p[21]={};int i=0;do{p[i]=getch();if(10==(int)p[i])//是回車{p[i]='\0'; break;}if((int)p[i]==127)//是退格{if(0==i){printf("\a");continue;}i=i-1;printf("\b \b");}else{i=i+1;if(20!=i){printf("*");}else{i=i-1;}}}while('\n'!=p[i] && i<20);printf("\n");if('\0'==p[0]){printf("密碼為空,已自動(dòng)置為初始密碼\n");strcpy(p,"123456");anykey_continue();}return p; }//讀文件teacher.txt void tea_read(void) {FILE* frp = fopen("teacher.txt","r");//以只讀權(quán)限打開文件if(NULL == frp)//判斷文件有沒有{perror("frp: fopen");return ;}for(int j=0;j < teacher_count;j++){fscanf(frp,"%s %c %d %d %d %d %s\n",tea[j].name,&tea[j].sex,&tea[j].id,&tea[j].count,&tea[j].firstlogin,&tea[j].flag,tea[j].password);//在文件中讀取數(shù)據(jù)到變量中}fclose(frp);//關(guān)閉文件frp = NULL;encryption2(-8); }//讀文件student.txt void stu_read(void) { FILE* frp=fopen("student.txt","r"); if(NULL==frp){printf("系統(tǒng)正在維護(hù)!");sleep(1);//anykey_continue();return;}char row[sizeof(Student)];int i=0;while(NULL!=fgets(row,sizeof(Student),frp)){sscanf(row,"%d %d %s %s %c %lf %lf %lf %d %d",&stu[i].firstlogin,&stu[i].id,stu[i].password,stu[i].name,&stu[i].sex,&stu[i].chinese,&stu[i].math,&stu[i].english,&stu[i].count,&stu[i].flag);i++;}fclose(frp);frp=NULL;encryption3(-8); }//保存文件student.txt void stu_save(void) {encryption3(8);FILE* fwp=fopen("student.txt","w");//寫方式打開文件for(int i=0;i<MAX_STU;i++){if('w'==stu[i].sex||'m'==stu[i].sex)//性別存在,寫入{fprintf(fwp,"%d %d %s %s %c %lf %lf %lf %d %d\n",stu[i].firstlogin,stu[i].id,stu[i].password,stu[i].name,stu[i].sex,stu[i].chinese,stu[i].math,stu[i].english,stu[i].count,stu[i].flag);} //更新文件數(shù)據(jù)}fclose(fwp);fwp=NULL; }//保存文件teacher.txt void tea_save(void) {encryption2(8);FILE* ftp = fopen("teacher.txt","w");//以只寫權(quán)限打開文件,如果存在則清空打開,不存在則新建if(NULL == ftp){perror("frp: fopen");return;}for(int j = 0;j<teacher_count;j++) {if(tea[j].id){fprintf(ftp,"%s %c %d %d %d %d %s\n",tea[j].name,tea[j].sex,tea[j].id,tea[j].count,tea[j].firstlogin,tea[j].flag,tea[j].password);//以文本形式輸入數(shù)據(jù)到文件中} }fclose(ftp);//關(guān)閉文件ftp = NULL; } //輸入字符串并將末尾的\n變?yōu)閈0 void my_fgets(char* str,int size) {stdin->_IO_read_ptr = stdin->_IO_read_end;fgets(str,size,stdin); str[strlen(str)-1]='\0'; //將\n置為\0 stdin->_IO_read_ptr = stdin->_IO_read_end; } //加密解密 void encryption1(char key) {for(int i=0;i<19;i++){ad.password[i]+=key;}ad.password[19]='\0'; } void encryption2(char key) { //教師密碼加密for(int i=0; tea[i].flag ;i++){for(int j=0; j < strlen(tea[i].password) ;j++){tea[i].password[j]+=key;}} }void encryption3(char key)//學(xué)生密碼加密 { for(int i=0; stu[i].flag ;i++){for(int j=0; j < strlen(stu[i].password) ;j++){stu[i].password[j]+=key;// printf("%c\n",stu[i].password[j]);}} }int id_fgets(char*str,int size) {stdin->_IO_read_ptr = stdin->_IO_read_end;//清空緩沖區(qū)fgets(str,size,stdin);str[strlen(str)-1]='\0';//將末尾\n置為\0stdin->_IO_read_ptr = stdin->_IO_read_end;//printf("\n\n%s:%d\n\n",str,atoi(str)+10);return atoi(str); }? ? ? ? tools.h
#ifndef TOOLS_H #define TOOLS_Hvoid msg_show(const char* msg,float sec);//短暫顯示提示信息 void anykey_continue(void);//按任意鍵繼續(xù) char* hidden_input(void);//隱藏式輸入密碼,用法:strcpy(*dest,hidden_input()),輸入密碼到給定字符串里 void tea_read(void); void stu_read(void); void tea_save(void); void stu_save(void); void my_fgets(char* str,int size); void encryption1(char key); void encryption2(char key); void encryption3(char key); int id_fgets(char*str,int size); #endif//TOOLS_H?
二、功能函數(shù)源文件
1.主函數(shù):申請(qǐng)內(nèi)存、顯示主界面 main.c
#include "mis.h" #include "process.h" #include "student.h" #include "teacher.h"int main(void) {stu=calloc(sizeof(Student),MAX_STU); //為學(xué)生結(jié)構(gòu)體申請(qǐng)內(nèi)存tea=calloc(sizeof(Teacher),MAX_TEA); //申請(qǐng)內(nèi)存過多 改*/do{system("clear");puts("*****教務(wù)管理系統(tǒng)*****\n");puts("1、校長(zhǎng)端\n");puts("2、教師端\n");puts("3、學(xué)生端\n");puts("4、退出系統(tǒng)\n");puts("********************\n");puts("請(qǐng)選擇功能:\n");switch(getch()){case '1':admin_main(); //校長(zhǎng)系統(tǒng)break;case '2':tea_login(); //教師系統(tǒng)break;case '3':stu_login(); //學(xué)生系統(tǒng)break;case '4':free(tea); //釋放內(nèi)存free(stu);return 0;}stdin->_IO_read_ptr=stdin->_IO_read_end; }while(1); }2.校長(zhǎng)端
????????功能源代碼:admin.c
#include "admin.h" #include <stdio.h> #include <unistd.h> #include "tools.h" #include "process.h" #include <string.h> #include <getch.h>Admin ad; int teacher_count=0; // 計(jì)算教師人數(shù) void teacher_add(void) //添加教師 { if(MAX_TEA <= teacher_count) //判斷教師的最大人數(shù)是否達(dá)到最大值{puts("系統(tǒng)正在升級(jí),請(qǐng)等待...");return ;}printf("請(qǐng)輸入新教師的姓名:");for(;;){my_fgets(tea[teacher_count].name,21); printf("請(qǐng)選擇性別w/m(女/男):\n");while(1){stdin->_IO_read_ptr=stdin->_IO_read_end;int sex=getch();printf("%c\n",sex);switch(sex) //為教師結(jié)構(gòu)體的sex成員賦值{case 'm':tea[teacher_count].sex='m';break;case 'w':tea[teacher_count].sex='w';break;default:stdin->_IO_read_ptr=stdin->_IO_read_end;printf("請(qǐng)重新選擇性別w/m:\n");//判讀非法輸入continue; }break; }break; }tea[teacher_count].firstlogin = 0; //默認(rèn)教師第一次登錄strcpy(tea[teacher_count].password,"123456");//設(shè)置默認(rèn)密碼tea[teacher_count].id = 100+teacher_count;//默認(rèn)自動(dòng)生成帳號(hào)tea[teacher_count].flag=1;teacher_count++; //如果添加成功,則總教師人數(shù)加一 msg_show("添加教師成功!\n",1.5); }void teacher_reset(void) //重置教師的密碼 {int num;printf("請(qǐng)輸入要重置密碼老師的工號(hào):");scanf("%d",&num); //輸入重置密碼的工號(hào)for(int j=0;j<teacher_count;j++)//通過for循環(huán)查找所輸入的工號(hào)是否為有效工號(hào){if(tea[j].id == num) //判斷工號(hào)是否存在{strcpy(tea[j].password,"123456"); //將新密碼替換舊的密碼msg_show("重置成功!",1.5);return;}}msg_show("工號(hào)有誤!\n",1.5); } void teacher_del(void) //刪除教師 {int num ;printf("請(qǐng)輸入要?jiǎng)h除老師的工號(hào):");scanf("%d",&num);for(int j=0;j<teacher_count;j++)//通過for循環(huán)查找老師工號(hào)判斷輸入工號(hào)是否為有效工號(hào){if(tea[j].id == num) //如果是有效工號(hào){tea[j].flag = -1;//將is_school改為1,則為離職教師 msg_show("刪除成功!\n",1.5);return;}}msg_show("未查找到該工號(hào)!\n",1.5); }void teacher_display_in(void) //在屏幕中顯示在職教師 {printf("姓名 性別 工號(hào)\n");for(int j=0; j<teacher_count; j++)//通過for循環(huán)判斷列表中教師的工號(hào)是否為正{if(1 == tea[j].flag) {printf("%-9s %s %-4d\n",tea[j].name,'w'==tea[j].sex?"女":"男",tea[j].id); }}anykey_continue(); //按任意鍵繼續(xù) }void teacher_display_out(void) //在屏幕中顯示離職教師 {printf("姓名 性別 工號(hào)\n");for(int j=0; j<teacher_count; j++)//通過for循環(huán)判斷列表中教師的工號(hào)是否為負(fù){if(-1 == tea[j].flag) {printf("%-9s %s %-4d\n",tea[j].name,'w'==tea[j].sex?"女":"男",tea[j].id); } //輸出離職教師}anykey_continue(); //按任意鍵繼續(xù) }void teacher_unlock(void) //解鎖教師帳號(hào) {int num;printf("請(qǐng)輸入要解鎖的教師工號(hào):");scanf("%d",&num); // 輸入要重置密碼的帳號(hào)for(int j=0;j<teacher_count;j++)//通過for循環(huán)判斷輸入的工號(hào)是否有效{if(num == tea[j].id) //判斷帳號(hào){tea[j].count = 0; //將該教師輸錯(cuò)密碼次數(shù)清零msg_show("帳號(hào)已解鎖!",1.5);return;}}msg_show("未找到該教師!",1.5); }void admin_reset_code(void) //重置校長(zhǎng)密碼 {strcpy(ad.password,"123456");//將密碼重置msg_show("密碼重置成功!\n",1.5);return; }? ? ? ? ? ? ? ? admin.h
#ifndef ADMIN_H #define ADMIN_H #include "mis.h" extern Admin ad; //聲明Admin結(jié)構(gòu)體 void teacher_reset(void); //重置教師密碼 void teacher_add(void); //添加教師 void admin_reset_code(void); //修改校長(zhǎng)密碼 void teacher_del(void); //刪除教師 void teacher_display_in(void); //顯示在職教師 void teacher_display_out(void); //顯示離職教師 void teacher_unlock(void); //解鎖教師帳號(hào) #endif//ADMIN_H?
????????驅(qū)動(dòng)源代碼:process.c
#include "process.h" #include <malloc.h> extern int teacher_count; void init(void) {FILE* fap = fopen("bossID","r");//以只讀權(quán)限打開文件if(NULL == fap) //判斷文件有沒有{perror("frp: fopen");return ;}fscanf(fap,"123456 %s %d %d\n",ad.password,&ad.firstlogin,&teacher_count);//在文件中讀取數(shù)據(jù)到變量中fclose(fap);//關(guān)閉文件fap = NULL;tea_read();encryption1(-8); }void start(void) { int ID;char code_old[20] = {}; //定義一個(gè)字符串用來(lái)存放第一次輸入的密碼char code[20] = {};char password1[20] = {};char password2[20] = {};for(;;) //進(jìn)入死循環(huán){ if(0==ad.firstlogin)//如果是第一次登錄系統(tǒng)則強(qiáng)制修改密碼{printf("請(qǐng)輸入帳號(hào):");scanf("%d",&ID);if(123456==ID) //判斷輸入帳號(hào)是否正確{ printf("帳號(hào)輸入正確!\n");printf("請(qǐng)輸入密碼:");strcpy(code_old,hidden_input());//輸入初始密碼if(0==strcmp(code_old,"123")) //初始密碼為123,判斷初始密碼是否輸入正確{printf("登錄成功!\n");printf("請(qǐng)修改密碼:");strcpy(password1,hidden_input());printf("請(qǐng)?jiān)俅屋斎朊艽a:");strcpy(password2,hidden_input());if(0 == strcmp(password1,password2)){printf("密碼修改成功!");strcpy(ad.password,password1);ad.firstlogin = 1;//登錄成功,則以后登錄便不再?gòu)?qiáng)制修改密碼}else{printf("密碼不一致!請(qǐng)重試!");continue;}}else{printf("密碼錯(cuò)誤!\n");continue;//初始密碼錯(cuò)誤,進(jìn)入下次循環(huán)}}else { msg_show("帳號(hào)錯(cuò)誤!\n",1.5);//帳號(hào)輸入錯(cuò)誤,進(jìn)入下次循環(huán)return;}}else{printf("請(qǐng)輸入密碼:");//不是第一次登錄,直接輸入密碼即可strcpy(code,hidden_input());if(0==strcmp(code,ad.password))//如果密碼正確,則進(jìn)入主菜單{ for(;;)//進(jìn)入死循環(huán){switch(menu1()){case '1': teacher_reset(); break; //重置教師密碼case '2': teacher_add(); break; //添加教師case '3': teacher_del(); break; //刪除教師case '4': teacher_display_in(); break; //顯示在職教師case '5': teacher_display_out(); break;//顯示離職教師case '6': teacher_unlock(); break; //解鎖教師帳號(hào)case '7': admin_reset_code();break; //重置校長(zhǎng)密碼case '0': return; //退出系統(tǒng)}}}else {printf("密碼錯(cuò)誤!\n");//密碼錯(cuò)誤,進(jìn)入下次循環(huán)continue;}}} } void save(void)//保存數(shù)據(jù) { encryption1(8);FILE* fwp = fopen("bossID","w");//以只寫權(quán)限打開文件,如果存在則清空打開,不存在則新建if(NULL == fwp){perror("frp: fopen");return ;}fprintf(fwp,"123456 %s %d %d",ad.password,ad.firstlogin,teacher_count);//以文本形式輸入數(shù)據(jù)到文件中fclose(fwp);//關(guān)閉文件fwp = NULL;tea_save(); }int menu1(void)//顯示菜單 {system("clear");puts("****歡迎使用校長(zhǎng)管理系統(tǒng)****");puts("1、重置教師密碼");puts("2、添加教師");puts("3、刪除教師");puts("4、顯示所有在職教師");puts("5、顯示所有離職教師");puts("6、解鎖教師帳號(hào)");puts("7、重置密碼");puts("0、退出系統(tǒng)");puts("******************************");printf("請(qǐng)輸入指令:");char cmd = getch();printf("%c\n",cmd);return cmd; }void admin_main(void) {init();start();save(); }? ? ? ? ? ? ? ? process.h
#ifndef PROCESS_H #define PROCESS_H #include <stdio.h> #include "tools.h" #include "admin.h" #include <stdlib.h> #include "process.h" #include <string.h> #include <getch.h> #include "mis.h" void init(void);//讀取文件,初始化 void start(void);//開始功能 void save(void);//保存文件 void admin_main(void); int menu1(void); #endif//PROCESS_H?
2.教師端
? ? ? ? teacher.c
#include "teacher.h" #include "tools.h" #include "admin.h" int cnt=0; int ret=0; extern int teacher_count; //教師端主菜單功能 1、添加學(xué)生 void stu_add(void) {printf("請(qǐng)選擇添加學(xué)生的方式:\n");printf("1、單個(gè)添加學(xué)生信息\n");printf("2、批量導(dǎo)入學(xué)生信息\n");switch(getch()){case '1':stu_add_single();break; //按1進(jìn)入單個(gè)添加功能case '2':stu_add_batch();break; //按2進(jìn)入批量導(dǎo)入功能} }//添加學(xué)生二級(jí)菜單功能 1、單個(gè)添加 void stu_add_single(void) {if(MAX_STU<=cnt){puts("系統(tǒng)正在升級(jí),請(qǐng)等待...");return;}int i=0;while(stu[i].flag) //flag為真代表第i行有數(shù)據(jù),跳轉(zhuǎn)下一行{i++;}printf("請(qǐng)輸入新學(xué)生的姓名:");for(;;){my_fgets(stu[i].name,20);printf("請(qǐng)選擇性別w/m(女/男):\n");while(1){stdin->_IO_read_ptr=stdin->_IO_read_end;int sex=getch();printf("%c\n",sex);switch(sex){case 'm':stu[i].sex='m';break;case 'w':stu[i].sex='w';break;default:stdin->_IO_read_ptr=stdin->_IO_read_end;printf("請(qǐng)重新選擇性別w/m:\n");continue; }break; }break;}stu[i].firstlogin=0; //新添加的學(xué)生未登錄過教務(wù)系統(tǒng)stu[i].id=1000+i; //學(xué)號(hào)由系統(tǒng)自動(dòng)產(chǎn)生,為1000+行數(shù)strcpy(stu[i].password,"123456"); //學(xué)生初始密碼為123456stu[i].count=0; //學(xué)生登錄次數(shù)置0stu[i].flag=1; //flag置1,表示第i行已填入學(xué)生信息cnt++; //對(duì)添加的學(xué)生計(jì)數(shù)msg_show("添加成功!\n",1.5); }//添加學(xué)生二級(jí)菜單功能 2、批量導(dǎo)入 void stu_add_batch(void) {int ret1 = 1,i =cnt;char str[256] = {}; //定義256字節(jié)字符串FILE* frp=file_read(); //調(diào)用讀文件函數(shù)if(NULL==frp){perror("frp:fopen");return;}while(ret1) //ret1表示讀取文件是否成功,成功則繼續(xù)循環(huán){ stu[i].firstlogin=0;stu[i].id=1000+i; //自動(dòng)生成學(xué)生帳號(hào)strcpy(stu[i].password,"123456"); ret1=(int)fgets(str,50,frp); //從文件中最多輸入49個(gè)字符到str中sscanf(str,"%s %c\n",stu[i].name,&stu[i].sex); //從str中解析讀取數(shù)據(jù)到變量中stu[i].count=0; //默認(rèn)密碼輸入次數(shù)為0stu[i].flag=1; //默認(rèn)學(xué)生為在校生i++; //指向結(jié)構(gòu)體數(shù)組里的下一個(gè)元素cnt++; //統(tǒng)計(jì)學(xué)生數(shù)量printf("cnt : %d\n",cnt);}printf("cnt : %d\n",cnt);stu[cnt-1].id = 0;stu[cnt-1].flag = 0; //flag置0,表示下次輸入數(shù)據(jù)時(shí)此處可用cnt--; //多了一次循環(huán) cnt=cnt-1fclose(frp); //關(guān)閉文件frp=NULL; //frp置空 }//主菜單功能 2、刪除學(xué)生 void stu_del(void) {int id1=0,i=0;char str1[6]={};char str2[6]={};printf("請(qǐng)輸入要?jiǎng)h除學(xué)生的學(xué)號(hào):");id1=id_fgets(str1,6);int id2=0;printf("請(qǐng)?jiān)俅屋斎胍獎(jiǎng)h除學(xué)生的學(xué)號(hào):");id2=id_fgets(str2,6);while(stu[i].flag) //遍歷結(jié)構(gòu)體{if(id1==id2){if(id2==stu[i].id) //判斷該行結(jié)構(gòu)體有數(shù)據(jù) 并 帳號(hào)存在{stu[i].flag=-1; //flag置-1,表示該學(xué)生休學(xué)FILE* fwp=fopen("stu_Drop_out.txt","a");if(NULL==fwp){perror("frp: fopen");return;}fprintf(fwp,"%d %s %c\n",stu[i].id,stu[i].name,stu[i].sex);//將結(jié)構(gòu)數(shù)據(jù)更新到文件中fclose(fwp);fwp=NULL;cnt--;msg_show("刪除成功!\n",1.5);return;}}else {msg_show("兩次輸入學(xué)號(hào)不一致,請(qǐng)重新進(jìn)入刪除功能\n",1.5);return;} i++;}msg_show("查無(wú)此人,刪除失敗!\n",1.5); }//主菜單功能 3、查找學(xué)生 找到一個(gè)就return? void stu_find(void) {char key[20]={};printf("請(qǐng)輸入要查找學(xué)生的姓名或?qū)W號(hào):");my_fgets(key,20); //輸入查詢關(guān)鍵字,限制從鍵盤讀入19個(gè)字符char str[20]={};int i=0;while(stu[i].flag){ sprintf(str,"%d",stu[i].id); //將結(jié)構(gòu)體中的id數(shù)據(jù),以字符串方式存入str中if(strstr(stu[i].name,key)||(!strcmp(str,key))) //判讀姓名和學(xué)號(hào){printf("%d %s %s\n",stu[i].id,stu[i].name,'w'==stu[i].sex?"女":"男"); sleep(1);}i++;}msg_show("無(wú)更多信息!\n",1.5); return; }//主菜單功能 4、修改學(xué)生信息 void stu_mod(void) {printf("請(qǐng)選擇功能:\n");printf("1、修改學(xué)生基礎(chǔ)信息\n");printf("2、修改學(xué)生成績(jī)\n");switch(getch()){case '1':stu_modbase();break;case '2':stu_modscore();break;} }//修改學(xué)生信息二級(jí)菜單功能 1、修改學(xué)生基礎(chǔ)信息 void stu_modbase(void) {int id=0,i=0;char str[6]={};printf("請(qǐng)輸入要修改學(xué)生的學(xué)號(hào):");id=id_fgets(str,6);while(stu[i].flag) //遍歷結(jié)構(gòu)體{if(id==stu[i].id) //判讀關(guān)鍵字是否符合要求{printf("請(qǐng)輸入學(xué)生的姓名:");for(;;){my_fgets(stu[i].name,20);printf("請(qǐng)選擇性別w/m(女/男):");while(1){stdin->_IO_read_ptr=stdin->_IO_read_end;int sex=getch();printf("%c\n",sex);switch(sex){case 'm':stu[i].sex='m';msg_show("修改成功!",1.5);return;case 'w':stu[i].sex='w';msg_show("修改成功!",1.5);return;default: //判讀非法字符stdin->_IO_read_ptr=stdin->_IO_read_end;printf("請(qǐng)重新選擇性別w/m:");continue; }break; }break;} }i++;}msg_show("查無(wú)此人!\n",1.5); }//修改學(xué)生信息二級(jí)菜單功能 2、修改學(xué)生成績(jī) 改! void stu_modscore(void) {int id=0,i=0;char str[6]={};printf("請(qǐng)輸入要修改學(xué)生的學(xué)號(hào):");id=id_fgets(str,6);printf("%d",id);double score[3]={};while(stu[i].flag) //遍歷結(jié)構(gòu)體{if(1==stu[i].flag&&id==stu[i].id) //按學(xué)號(hào)修改成績(jī){printf("請(qǐng)重新輸入學(xué)生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)成績(jī):");for(int j=0;j<3;j++){scanf("%lf",&score[j]);//改}if(score[0]>0&&score[0]<100&&score[1]>0&&score[1]<100&&score[2]>0&&score[2]<100) //判斷成績(jī)合法{msg_show("修改成績(jī)成功!",1.5); stu[i].chinese=score[0];stu[i].math=score[1];stu[i].english=score[2];return;}else{msg_show("修改成績(jī)失敗!",1.5);return;}}i++;}msg_show("查無(wú)此人!\n",1.5); }//主菜單功能 5、錄入學(xué)生成績(jī) void stu_score_input(void) {printf("請(qǐng)選擇錄入成績(jī)的方式:\n");printf("1、單個(gè)錄入\n");printf("2、批量導(dǎo)入\n");switch(getch()){case '1':score_input_single();break;case '2':score_input_batch();break;} }//錄入學(xué)生成績(jī)二級(jí)菜單功能 1、單個(gè)錄入 void score_input_single(void) {int id=0;int i=0;char str[6]={};printf("請(qǐng)輸入要錄入成績(jī)學(xué)生的學(xué)號(hào):");id=id_fgets(str,6);double score[3]={};while(stu[i].flag){ if(id==stu[i].id){printf("請(qǐng)輸入該學(xué)生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)成績(jī):\n");for(int j=0;j<3;j++){scanf("%lf",&score[j]);//改}if(score[0]>0&&score[0]<100&&score[1]>0&&score[1]<100&&score[2]>0&&score[2]<100) //判斷成績(jī)合法{msg_show("成績(jī)錄入成功!",1.5); stu[i].chinese=score[0];stu[i].math=score[1];stu[i].english=score[2];return;}else{msg_show("輸入成績(jī)失敗!",1.5);return;}}i++;}msg_show("查無(wú)此人!",1.5); }//錄入學(xué)生成績(jī)二級(jí)菜單功能 2、批量導(dǎo)入 void score_input_batch(void) { typedef struct Score{int id;double chinese; double math; double english;}Score;Score* sco;sco=calloc(sizeof(Score),50);int i=0,j=0;int ret=1;FILE* frp=file_read();if(NULL==frp){perror("frp:fopen");return;}while(ret!=-1){ret=fscanf(frp,"%d %lf %lf %lf\n",&sco[i].id,&sco[i].chinese,&sco[i].math,&sco[i].english);i++;}fclose(frp);frp=NULL;int len = 0;while( stu[len].flag ){for(int i = 0 ; stu[i].flag ; i ++ ){if( stu[len].id == sco[i].id ){stu[len].chinese = sco[i].chinese;stu[len].math = sco[i].math;stu[len].english = sco[i].english;}}len++;} }//主菜單功能 6、重置學(xué)生密碼 void stu_reset_password(void) {int id=0,i=0;char str[6]={};printf("請(qǐng)輸入需要重置密碼學(xué)生的學(xué)號(hào):");id=id_fgets(str,6);while(stu[i].flag){ if(1==stu[i].flag&&id==stu[i].id){strcpy(stu[i].password,"123456"); //重置密碼msg_show("重置成功!\n",1.5);return;}i++;}msg_show("查無(wú)此人!",1.5); }//主菜單功能 7、顯示所有在校學(xué)生信息 void stu_show(void) {int i=0;while(stu[i].flag){if(1==stu[i].flag) //判讀是否是在校生{printf("學(xué)號(hào):%-5d姓名:%-10s 性別:%-4s語(yǔ)文:%-7.2lf數(shù)學(xué):%-7.2lf英語(yǔ):%-7.2lf\n",stu[i].id,stu[i].name,'w'==stu[i].sex?"女":"男",stu[i].chinese,stu[i].math,stu[i].english);}i++;}anykey_continue(); }//主菜單功能 8、顯示所有退學(xué)學(xué)生信息 void stu_show_quit(void) {int i=0;while(stu[i].flag){if(-1==stu[i].flag) //判斷是否是離校生{printf("學(xué)號(hào):%-5d姓名:%-10s性別:%-4s\n",stu[i].id,stu[i].name,'w'==stu[i].sex?"女":"男");}i++;}anykey_continue(); }//首次登錄修改密碼 void tea_changepassword(void) {puts("請(qǐng)輸入新密碼:");char newpass[20];strcpy(newpass,hidden_input());strcpy(tea[ret].password,newpass);msg_show("修改成功!\n",1.5); }//登錄教師端 void tea_login(void) { FILE* fap = fopen("bossID","r");//以只讀權(quán)限打開文件if(NULL == fap) //判斷文件有沒有{perror("frp: fopen");return ;}fscanf(fap,"123456 %s %d %d\n",ad.password,&ad.firstlogin,&teacher_count);//在文件中讀取數(shù)據(jù)到變量中fclose(fap);//關(guān)閉文件fap = NULL;tea_read();stu_read();//使用帳號(hào)登錄char pass[20]={};char str[4]={};int i=0;int id=0;printf("請(qǐng)輸入帳號(hào)(工號(hào)):");id=id_fgets(str,5);//printf("%d\n",id);while(i<MAX_TEA){if(id==tea[i].id&&tea[i].sex) //帳號(hào)如果存在{if(3==tea[i].count) //是否上鎖{msg_show("您的帳號(hào)已上鎖,請(qǐng)找校長(zhǎng)解鎖\n",1.5);return;}else{break;}}if(i==MAX_TEA-1){msg_show("帳號(hào)不存在!\n",1.5);return;}i++;}//密碼判斷while(1)//隱藏密碼{printf("請(qǐng)輸入密碼:");strcpy(pass,hidden_input());//printf("密碼:%s\n",pass);if(!strcmp(pass,tea[i].password))//密碼正確則退出循環(huán)進(jìn)入下一步{ ret=i;tea[i].count=0;msg_show("登錄成功!\n",1.5);break;}else {tea[i].count++;}if(1==tea[i].count){printf("輸入錯(cuò)誤,還有兩次機(jī)會(huì)!\n");}else if(2==tea[i].count){printf("輸入錯(cuò)誤,還有一次機(jī)會(huì)!\n");}else if(3==tea[i].count)//輸錯(cuò)三次,保存上鎖信息,退出登錄{msg_show("密碼輸入錯(cuò)誤三次,帳號(hào)已鎖定,解鎖請(qǐng)校長(zhǎng)解鎖!\n",1.5);return;}}//是否初次登錄if (0==tea[ret].firstlogin){printf("初次登錄請(qǐng)修改密碼!\n");tea[ret].firstlogin=1;tea_changepassword();} for(;;){//顯示主界面switch(menu2()){case '1': stu_add(); break;case '2': stu_del(); break;case '3': stu_find(); break;case '4': stu_mod(); break;case '5': stu_score_input(); break;case '6': stu_reset_password(); break;case '7': stu_show();break;case '8': stu_show_quit();break;case '9': stu_unlock();break;case '0': tea_save();stu_save();return;} } }// 教師端主菜單 int menu2(void) {system("clear");puts("—————?dú)g迎使用教務(wù)管理系統(tǒng)————");puts(" 1.添加學(xué)生");puts(" 2.刪除學(xué)生");puts(" 3.查找學(xué)生");puts(" 4.修改學(xué)生信息");puts(" 5.錄入學(xué)生成績(jī)");puts(" 6.重置學(xué)生密碼");puts(" 7.顯示所有在校學(xué)生信息");puts(" 8.顯示所有退學(xué)學(xué)生信息");puts(" 9.解鎖學(xué)生帳號(hào)");puts(" 0.退出系統(tǒng)");puts("—————————————————————————————");printf("請(qǐng)輸入指令:");char cmd=getch();printf("%c\n",cmd);return cmd;}FILE* file_read(void) {FILE *frp; //定義文件指針 char filename[50]; //定義一個(gè)文件名數(shù)組保存文件名 char path[100]={}; //標(biāo)明文件所在的路徑 char path1[256]={}; //存儲(chǔ)最終的文件讀取路徑printf("請(qǐng)輸入路徑名:\n");scanf("%s",path);printf("請(qǐng)輸入要導(dǎo)入的文件的名字:/filename\n");scanf("%s",filename);stdin->_IO_read_ptr=stdin->_IO_read_end;sprintf(path1,"%s%s",path,filename); //拼接path+filename,形成最終的文件路徑 printf("待導(dǎo)入文件的路徑為:%s\n",path1);frp=fopen(path1,"r"); //打開文件 if(NULL==frp) //判斷打開的文件是否為空,空則報(bào)錯(cuò) {perror("frp: fopen");sleep(5);return NULL; //返回空}return frp; //返回文件指針frp } void stu_unlock(void) //解鎖學(xué)生帳號(hào) {int id=0;int j=0;char str[6]={};printf("請(qǐng)輸入要解鎖的學(xué)生學(xué)號(hào):");id=id_fgets(str,6);while(stu[j].flag) //通過for循環(huán)判斷輸入的學(xué)號(hào)是否有效{if(id == stu[j].id){stu[j].count = 0; //將該學(xué)生輸錯(cuò)密碼次數(shù)清零msg_show("帳號(hào)已解鎖!",1.5);return;}j++;}msg_show("未找到該學(xué)生!",1.5); }? ? ? ? teacher.h
#ifndef TEACHER_H #define TEACHER_H#include<stdio.h> #include <stdlib.h> #include <getch.h> #include <string.h> #include "mis.h"//教師登錄 void tea_changepassword(void); //首次登錄修改密碼 void tea_login(void);//功能實(shí)現(xiàn)函數(shù) void stu_add(void); //1、添加學(xué)生 void stu_add_single(void); //單個(gè) void stu_add_batch(void); //批量void stu_del(void); //2、刪除學(xué)生void stu_find(void); //3、查找學(xué)生void stu_mod(void); //4、修改學(xué)生信息 void stu_modbase(void); void stu_modscore(void);void stu_score_input(void); //5、錄入學(xué)生成績(jī) void score_input_single(void); //單個(gè) void score_input_batch(void); //批量void stu_reset_password(void); //6、重置學(xué)生密碼 void stu_show(void); //7、顯示所有在校學(xué)生信息void stu_show_quit(void); //8、顯示所有退學(xué)學(xué)生信息//工具函數(shù) int menu2(void); FILE* file_read(void); void stu_save1(void); void tea_save(void); void stu_unlock(void);#endif//TEACHER_H3.學(xué)生端
? ? ? ? student.c
#include"student.h"int id=0;//當(dāng)前學(xué)生所在位置 int stu_cnt=0;//學(xué)生個(gè)數(shù) //登錄主程序,成功則進(jìn)入學(xué)生界面完成功能 void stu_login(void)// {stu_read();for(int i=0;i<MAX_STU;i++){if(0!=stu[i].flag)stu_cnt++;}char pw[20]={};int ac=0;printf("請(qǐng)輸入帳號(hào)(學(xué)號(hào)):");if(!scanf("%d",&ac)){printf("帳號(hào)不存在!\n");anykey_continue();return;}for(id=0;id<stu_cnt;id++){if((ac==stu[id].id)) //帳號(hào)如果存在{if(-1==stu[id].flag){msg_show("您的帳號(hào)已歸檔!",1.5);//是否退學(xué)anykey_continue();return;}else if(3==stu[id].count) //是否上鎖{msg_show("您的帳號(hào)已上鎖,請(qǐng)找老師解鎖",1.5);anykey_continue();return;}else {break;}}if(id==stu_cnt-1){printf("帳號(hào)不存在!\n");anykey_continue();return;}}//密碼判斷while(1){printf("請(qǐng)輸入密碼:");strcpy(pw,hidden_input());if(!strcmp(pw,stu[id].password))//密碼正確則退出循環(huán)進(jìn)入下一步{stu[id].count=0;break;}else {stu[id].count++;}if(1==stu[id].count){printf("輸入錯(cuò)誤,還有兩次機(jī)會(huì)!\n");}else if(2==stu[id].count){printf("輸入錯(cuò)誤,還有一次機(jī)會(huì)!\n");}else if(3==stu[id].count)//輸錯(cuò)三次,保存上鎖信息,退出登錄{printf("密碼輸入錯(cuò)誤三次,帳號(hào)已鎖定,解鎖請(qǐng)找老師!\n"); anykey_continue();return;}}//是否初次登錄if (0==stu[id].firstlogin){printf("初次登錄請(qǐng)修改密碼!\n");stu[id].firstlogin=1;while(stu_changepassword());//強(qiáng)制修改密碼}//進(jìn)入學(xué)生界面循環(huán)for(;;){switch(stu_menu()) {case '1': stu_checkgrade();break;case '2': stu_changepassword();break;case '3': stu_showmessage();break; case '0': stu_save();return;}} }int stu_menu(void)//學(xué)生界面 {system("clear");printf("你好,%s同學(xué)!\n",stu[id].name);puts("***************");puts(" 1、查詢成績(jī)");puts(" 2、修改密碼");puts(" 3、個(gè)人信息");puts(" 0、退出系統(tǒng)");puts("***************");printf("請(qǐng)輸入指令:"); char cmd=getch();printf("%c\n",cmd); //回顯return cmd ; }void stu_checkgrade(void)//成績(jī)查詢 {stdin->_IO_read_ptr = stdin->_IO_read_end;double grade[stu_cnt][4];//存放每個(gè)人成績(jī)memset(grade,0,sizeof(grade));double stuchin=stu[id].chinese,stumath=stu[id].math,stuengl=stu[id].english,//將結(jié)構(gòu)體數(shù)據(jù)傳入數(shù)組stu_all=stu[id].chinese+stu[id].math+stu[id].english; //計(jì)算個(gè)人成績(jī)總分printf("你的成績(jī):\n語(yǔ)文:%.2lf\n數(shù)學(xué):%.2lf\n英語(yǔ):%.2lf\n\ 總分:%.2lf\n",stuchin,stumath,stuengl,stu_all);for(int i=0;i<stu_cnt;i++)//成績(jī)存入數(shù)組,每列分別存語(yǔ)文數(shù)學(xué)英語(yǔ)總分{grade[i][0]=stu[i].chinese;grade[i][1]=stu[i].math;grade[i][2]=stu[i].english;grade[i][3]=stu[i].chinese+stu[i].math+stu[i].english;}double plus[4]={},max[4]={},min[4]={},avg[4]={};int cnt=0,level[4]={1,1,1,1};//分別計(jì)入單科成績(jī)的分?jǐn)?shù)for(int i=0;i<stu_cnt;i++)//用flag while{if(grade[i][3]>0)//成績(jī)存在,計(jì)算最高分最低分{cnt++; // 計(jì)入有成績(jī)的學(xué)生人數(shù)if(stuchin<grade[i][0])level[0]++;//名次if(stumath<grade[i][1])level[1]++;if(stuengl<grade[i][2])level[2]++;if(stu_all<grade[i][3])level[3]++;for(int j=0;j<4;j++){plus[j]+=grade[i][j];//成績(jī)累加if(grade[i][j]>max[j])max[j]=grade[i][j];//最大值if(grade[i][j]<min[j])min[j]=grade[i][j];//最小值} }}if(0==cnt) // 防止除0出現(xiàn)的錯(cuò)誤{cnt=1;}for(int i=0;i<4;i++){avg[i]=plus[i]/cnt;//計(jì)算平均分}printf("語(yǔ)文最高分:%.2lf 語(yǔ)文最低分:%.2lf 語(yǔ)文平均分:%.2lf 你的名次:%d\n",max[0],min[0],avg[0],level[0]);printf("數(shù)學(xué)最高分:%.2lf 數(shù)學(xué)最低分:%.2lf 數(shù)學(xué)平均分:%.2lf 你的名次:%d\n",max[1],min[1],avg[1],level[1]);printf("英語(yǔ)最高分:%.2lf 英語(yǔ)最低分:%.2lf 英語(yǔ)平均分:%.2lf 你的名次:%d\n",max[2],min[2],avg[2],level[2]);printf("總分最高分:%.2lf 總分最低分:%.2lf 總分平均分:%.2lf 你的名次:%d\n",max[3],min[3],avg[3],level[3]);anykey_continue(); }int stu_changepassword(void)//修改密碼 {puts("請(qǐng)輸入新密碼:");char new1[20],new2[20];strcpy(new1,hidden_input()); //隱藏輸入密碼puts("請(qǐng)?jiān)俅屋斎胄旅艽a:");strcpy(new2,hidden_input()); //隱藏再次輸入密碼if(!strcmp(new1,new2)) //判讀兩次密碼輸入是否相等{strcpy(stu[id].password,new1);//修改密碼puts("修改成功!");anykey_continue();return 0;}else {puts("修改失敗!");}anykey_continue();return 1; }void stu_showmessage(void)//顯示信息 {printf("姓名:%s\n性別:%s\n學(xué)號(hào):%d\n狀態(tài):%s\n",stu[id].name,'w'==stu[id].sex?"女":"男",stu[id].id,stu[id].flag==1?"在校":"離校");anykey_continue(); }? ? ? ? student.h
#ifndef STUDENT_H #define STUDENT_H#include<stdio.h> #include<stdlib.h> #include<string.h> #include<getch.h> #include"mis.h" #include "tools.h" void stu_login(void); //學(xué)生登入界面int stu_menu(void); //學(xué)生界面菜單void stu_checkgrade(void); //查詢學(xué)生成績(jī)int stu_changepassword(void); //修改學(xué)生密碼void stu_showmessage(void); //顯示學(xué)生信息void stu_save(void); //將學(xué)生信息寫入文件char* hidden_input(void); //隱藏輸入函數(shù)#endif總結(jié)
以上是生活随笔為你收集整理的C语言实现教务管理系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Modelsim10.6d安装破解有问题
- 下一篇: 广东计算机重点学校排名2015年,201