天天看點

【c語言小項目】學生成績管理系統

設計要求:

此項目沒有商業價值,練習學習過的知識點。

僅限于C語言知識。

學生:

姓名 性别 學号 密碼 國文 數學 英語

1、第一次登入強制修改密碼。

2、查詢成績

排名 不顯示姓名和學号。

平均分

最高分 所有學生單科和總分

最低分

3、修改密碼

4、檢視個人資訊

5、三次密碼錯誤鎖定帳号,由教師解鎖

教師:

姓名 性别 工号 密碼

1、第一次登入強制修改密碼。

2、添加學生(學生的學号自動生成)

單個添加

從檔案批量導入

3、删除學生

輸入兩次學号确定

删除的學生要記錄儲存在已退學的檔案中

4、查找學生

按姓名查找

按學号查找

5、修改學生資訊

修改學生基礎資訊

修改學生成績

6、錄入學生成績

單個錄入

批量導入

7、重置學生密碼

8、解鎖學生

9、顯示所有在校學生資訊

10、顯示所有退出學生資訊

11、三次密碼錯誤鎖定帳号,由校長解鎖

校長:

admin

1、第一次登入強制修改密碼。

2、能重置自己的密碼

3、能重置教師密碼

4、添加教師

5、删除教師

6、解鎖老師

7、顯示所有在職教師

8、顯示所有離職教師

以下代碼實作在Linux ubuntu

main.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "file.h"
#include "land.h"

int main(int argc,const char* argv[])
{	
	//配置設定記憶體 讀取檔案
	s=calloc(1000,sizeof(Students));
	stu_e=calloc(100,sizeof(Students));
	tea=calloc(100,sizeof(Teachers));
	dtea=calloc(100,sizeof(Teachers));
	file_scanf();
	while(1)
	{
		system("clear");
		printf("\033[01;34m");
		puts("歡迎使用學生成績管理系統!");
		puts("1.進入學生菜單.");
		puts("2.進入教師菜單.");
		puts("3.進入校長菜單.");
		puts("4.退出并儲存.");
		printf("\033[00m");
		switch(get_cmd('1','4'))
		{
			case '1': land_student();break;
			case '2': land_teacher();break;
			case '3': land_choose();break;
			case '4': file_save();return 0 ;
			
		}
	}
	return 0;
}

           

tools.h

//一個優秀的工具函數
#ifndef TOOL_H   	//頭檔案衛士,防止頭檔案重複包含
#define TOOL_H

#include <getch.h>  //該函數需手動添加到系統頭檔案路徑
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef struct Teacher
{
	char name[10];
	char sex[4];
	char key[10];
	char lock;
	int id;
}Teachers;
Teachers* tea;//聲明在職教師
Teachers* dtea;//聲明離職教師

typedef struct Student{
	char name[10];
	char sex[4];
	int id;
	float Chinese;
	float Math;
	float English;
	char key[10];
	char lock;
}Students;
Students *s;//聲明在校學生
Students *stu_e;//聲明退校學生

int count_stu,count_stu_e,iD;//學生用全局變量

int count_tea,count_dtea;//老師用全局

int cur;//通用全局

int get_cmd(char start,char end);
char* get_str(char* str,size_t size);
void anykey_continue(void);
char* get_password(char* password, size_t len,bool isshow);

#endif //TOOL_H
           

tools.c

#include <stdio.h>
#include "tool.h"

int count_stu=0,count_stu_e=0,iD;//學生用全局變量

int count_tea=0,count_dtea=0;//老師用全局

int cur=0;//通用全局

int get_cmd(char start,char end)//從鍵盤中讀取按鍵,起始終止位置為ASCII表字元
{
	puts("------------------");
	printf("請輸入指令:");
	for(;;)
	{
		char cmd = getch();
		if(start <= cmd && cmd <= end)//接收判斷
		{
			printf("%c\n",cmd);
			return cmd;
		}
	}
}
char* get_str(char* str,size_t size)//優化fgets函數,防止換行符的讀取和多餘資料殘留輸入緩沖區
{
	// 限制輸入的字元度
	fgets(str,size,stdin);
	// 計算實際輸入的字元數量
	size_t len = strlen(str);
	// 判斷最一個字元是否是'\n'
	if('\n' == str[len-1])
	{
		// 删除'\n'
		str[len-1] = '\0';
	}
	else
	{
		// 清理輸入緩沖區
		stdin->_IO_read_ptr = stdin->_IO_read_end;//在GNU編譯環境下
	}
	return str;
}
void anykey_continue(void)//讀取一個字元後可繼續操作
{
	stdin->_IO_read_ptr = stdin->_IO_read_end;
	puts("按任意鍵繼續...");
	getch();
	stdin->_IO_read_ptr = stdin->_IO_read_end;
}

char* get_password(char* password, size_t len,bool isshow)
{
	int i = 0;
	while (i < len - 1)
	{
		char ch = getch();
		if (127 == ch)
		{
			if (i > 0)
			{
				i--;
				printf("\b \b");
			}
			continue;
		}
		if ('\n' == ch)
		{
			break;
		}
		if(true==isshow)
		{
		printf("*");
		}
		else
		{	
		printf("%c",ch);
		}
		password[i++] = ch;
	}
	password[i] = '\0';
	return password;
}

           

land.h

#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#ifndef PASSWORD_H
#define PASSWORD_H

void land_student(void);
void land_teacher(void);
void land_admin(void);

#endif//PASSWORD

           

land.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "land.h"

void land_student(void)		//學生登入接口
{		
		
	printf("請輸入學号:\n");
	int ID = 0;
	int flaa=0;
	char password[10]={0};
	int cnt1=3;
	while(1)
	{
		//get_str(ID, sizeof(ID));
		scanf("%d",&ID);
		stdin->_IO_read_ptr = stdin->_IO_read_end;
		for(int a=0;a<count_stu;a++)
		{
			if(ID==s[a].id)
			{
				cur=a;
				flaa=1;
				break;
			}				
		}
		if(!flaa)
			printf("未查詢到該學号,請重新輸入!\n");
		else
			break;
	}
	if(1==s[cur].lock)
	{
		printf("帳号已鎖定!\n");
		anykey_continue();
		return;
	}
	if(0==strcmp(s[cur].key,"000000"))
	{			
		printf("首次登入請重置密碼,且不能為初始化密碼:000000\n");
		get_password(password,sizeof(password),false);
		printf("\n");
		while(0==strcmp(password,"000000"))
		{
		printf("請重新初始化密碼!\n");
		get_password(password,sizeof(password),false);
		printf("\n");
		}
		strcpy(s[cur].key,password);
		printf("密碼修改成功!\n");
		sleep(1);
		menu_student();
		return;
	}
	else
	{
		//int count1=3;
		while(cnt1)
		{	
			printf("請輸入密碼:\n");
			get_password(password,sizeof(password),true);
			printf("\n");
			if (0 == strcmp(password,s[cur].key))
			{
				printf("驗證通過!\n");
				sleep(1);
				menu_student();
				return;
			}
			else	
			{
				cnt1--;
				printf("\033[01;31m");
				printf("驗證失敗三次将當機帳号,還有%d次機會!\n",cnt1);
				printf("\033[00m");		
			}			
		}
		if(!cnt1)
		{
			printf("帳号已鎖定,請尋求老師解鎖并初始化密碼!\n");
			s[cur].lock='1';
			anykey_continue();
			return;
		}	
	}
}
	
void land_teacher(void)			//老師登入接口
{		
		
	printf("請輸入工号:\n");
	int ID = 0;
	int flgg=0;
	char password[10]={0};
	int cnt1=3;
		while(1)
		{
			//get_str(ID, sizeof(ID));
			scanf("%d",&ID);
			stdin->_IO_read_ptr = stdin->_IO_read_end;
			for(int a=0;a<count_tea;a++)
			{
				if(ID==tea[a].id)
				{
					cur=a;
					flgg=1;
					break;
				}
			}
			if(!flgg)
				printf("未查詢到該工号,請重新輸入!\n");
			else
				break;
		}

	 
		if(1==tea[cur].lock)
		{
			printf("帳号已鎖定!\n");
			anykey_continue();
			return;
		}
		if(0==strcmp(tea[cur].key,"000000"))
		{			
			printf("首次登入請重置密碼,且不能為初始化密碼:000000\n");
			get_password(password,sizeof(password),false);
			printf("\n");
			while(0==strcmp(password,"000000"))
			{
			printf("請重新初始化密碼!\n");
			get_password(password,sizeof(password),false);
			printf("\n");
			}
			strcpy(tea[cur].key,password);
			printf("密碼修改成功!\n");
			sleep(1);
			teacher();
			return;
		}

		else
		{
		//int count1=3;
			while(cnt1)
			{	
				printf("請輸入密碼:\n");
				get_password(password,sizeof(password),true);
				printf("\n");
				if (0 == strcmp(password,tea[cur].key))
				{
					printf("驗證通過!\n");
					sleep(1);
					teacher();
					return;
				}
				else
				{
					cnt1--;
					printf("\033[01;31m");
					printf("驗證失敗三次将當機帳号,還有%d次機會!\n",cnt1);
					printf("\033[00m");		
				}			
			}
			if(!cnt1)
			{
				printf("帳号已鎖定,請尋求校長解鎖并初始化密碼!\n");
				tea[cur].lock='1';
				anykey_continue();
				return;
			}
		}
}

void land_admin(void)			//校長登入接口
{
	char password[10]={0};
	if(0==strcmp(apd,"000000"))
	{			
		printf("首次登入請重置密碼,且不能為初始化密碼:000000\n");
		get_password(password,sizeof(password),false);
		printf("\n");
		while(0==strcmp(password,"000000"))
		{
			printf("請重新初始化密碼!\n");
			get_password(password,sizeof(password),false);
			printf("\n");
		}
		strcpy(apd,password);
		printf("密碼修改成功!\n");
		sleep(2);
		admin();
		return ;
	}
	else
	{
		while(1)
		{	
			printf("請輸入密碼:\n");
			get_password(password,sizeof(password),true);
			printf("\n");
			if (0 == strcmp(password,apd))
			{
				printf("驗證通過!\n");
				sleep(2);
				admin();
				return ;
			}
			else
			{
				printf("\033[01;31m");				
				printf("密碼錯誤!\n");
				printf("\033[00m");
				sleep(2);
				return;
			}
		}
	}
}

           

file.h

#ifndef FILE_H
#define	FILE_H
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"


void file_scanf(void);
void file_save(void);
#endif//FILE_H

           

file.h

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
#include "file.h"

void file_scanf(void)//檔案讀取
{	
	FILE* F=fopen("admin.txt","r");			//校長密碼讀取
	if (NULL == F)
	{
		printf("admin檔案打開失敗!\n");
		return ;
	}
	char jm[10]="12345678";
	char buf[4096];
	int ret=0;
	ret=fread(buf,1,4096,F);
	fclose(F);
	FILE* F1=fopen("admin.txt","w");
	size_t len=strlen(jm);
	while (ret>0)
	{
		for(int i=0;i<ret;i++)
		{
			buf[i]=buf[i]^jm[i%len];//檔案加密
		}
		fwrite(buf,1,ret,F1);
		fclose(F1);
		break;		
	}
	FILE* F2=fopen("admin.txt","r");
	fscanf(F2,"%s",apd);
	fclose(F2);

	FILE* fp1= fopen("stu.txt", "r");//在校學生讀取
	if (NULL == fp1)
	{
		printf("stu檔案打開失敗!");
		return ;
	}	
	while (0<fscanf(fp1, "姓名:%s 性别:%s 學号:%d 國文:%f 數學:%f 英語:%f 密碼:%s lock:%c\n",s[count_stu].name,(s[count_stu].sex),&(s[count_stu].id),&(s[count_stu].Chinese), &(s[count_stu].Math), &(s[count_stu].English),(s[count_stu].key),&(s[count_stu].lock)))
	{
	//printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",s[count_stu].name,s[count_stu].sex,s[count_stu].id, s[count_stu].Chinese, s[count_stu].Math, s[count_stu].English,s[count_stu].key,s[count_stu].lock);
	count_stu++;
	} 
	if(0==count_stu)
		iD=202110000;
	else
		iD=s[count_stu-1].id;
	fclose(fp1);

	FILE* fp2= fopen("stu_e.txt", "r");//退校學生讀取
	if (NULL == fp2)
	{
		printf("stu_e檔案打開失敗!");
		return ;
	}	
	while (0<fscanf(fp2, "姓名:%s 性别:%s 學号:%d 國文:%f 數學:%f 英語:%f\n",stu_e[count_stu_e].name,(stu_e[count_stu_e].sex),&(stu_e[count_stu_e].id),&(stu_e[count_stu_e].Chinese), &(stu_e[count_stu_e].Math), &(stu_e[count_stu_e].English)))
	{
	count_stu_e++;
	} 
	fclose(fp2);

	FILE* fp3=fopen("tea.txt","r");//在職教師讀取
	if (NULL == fp3)
	{
		printf("tea檔案打開失敗!\n");
		return ;
	}
	while (0<fscanf(fp3, "姓名:%s 性别:%s 工号:%d 密碼:%s lock:%c\n",tea[count_tea].name,(tea[count_tea].sex),&(tea[count_tea].id),(tea[count_tea].key),&(tea[count_tea].lock)))
	{
		count_tea++;
	}
	fclose(fp3);

	FILE* fp4=fopen("dtea.txt","r");//離職教師
	if (NULL == fp4)
	{
		printf("dtea檔案打開失敗!");
		return ;
	}
	while (0<fscanf(fp4, "姓名:%s 性别:%s 工号:%d\n",dtea[count_dtea].name,dtea[count_dtea].sex,&(dtea[count_dtea].id)))
	{
		count_dtea++;
	}
	fclose(fp4);
}

void file_save(void)
{
	FILE* F2=fopen("admin.txt","w");
	if (NULL == F2)
	{
		printf("admin檔案打開失敗!\n");
		return ;
	}
	fprintf(F2,"%s",apd);
	fclose(F2);

	FILE* F=fopen("admin.txt","r");
	char jm[10]="12345678";
	char buf[4096];
	int ret=0;
	ret=fread(buf,1,4096,F);
	fclose(F);
	FILE* F1=fopen("admin.txt","w");
	size_t len=strlen(jm);
	while (ret>0)
	{
		for(int i=0;i<ret;i++)
		{
			buf[i]=buf[i]^jm[i%len];//檔案加密
		}
		fwrite(buf,1,ret,F1);
		fclose(F1);
		break;		
	}

	FILE* file1=fopen("stu.txt","w");//在校學生儲存
	if (NULL == file1)
	{
		printf("stu檔案打開失敗!");
		return ;
	}	
	for(int i=0;i<count_stu;i++)
	{
		fprintf(file1,"姓名:%s 性别:%s 學号:%d 國文:%f 數學:%f 英語:%f 密碼:%s lock:%c\n",((s+i)->name),((s+i)->sex),((s+i)->id),((s+i)->Chinese),((s+i)->Math),((s+i)->English),((s+i)->key),((s+i)->lock));
	}
	fclose(file1);

	FILE* file2=fopen("stu_e.txt","w");//離校學生儲存
	if (NULL == file2)
	{
		printf("stu_e檔案打開失敗!");
		return ;
	}	
	for(int i=0;i<count_stu_e;i++)
	{
		fprintf(file2,"姓名:%s 性别:%s 學号:%d 國文:%f 數學:%f 英語:%f\n",((stu_e+i)->name),((stu_e+i)->sex),((stu_e+i)->id),((stu_e+i)->Chinese),((stu_e+i)->Math),((stu_e+i)->English));
	}
	fclose(file2);

	FILE* file3=fopen("tea.txt","w");//在職教師儲存
	if (NULL == file3)
	{
		printf("tea檔案打開失敗!");
		return ;
	}
	for(int i=0;i<count_tea;i++)
	{
 		fprintf(file3, "姓名:%s 性别:%s 工号:%d 密碼:%s lock:%c\n",tea[i].name,tea[i].sex,tea[i].id,tea[i].key,tea[i].lock);
	}
	fclose(file3);

	FILE* file4=fopen("dtea.txt","w");//離職教師儲存
	if (NULL == file4)
	{
		printf("dtea檔案打開失敗!");
		return ;
	}
	for(int i=0;i<count_dtea;i++)
	{
 		fprintf(file4, "姓名:%s 性别:%s 工号:%d\n",dtea[i].name,dtea[i].sex,dtea[i].id);
	}
	fclose(file4);	
}

           

student.h

#ifndef STUDENT_H
#define STUDENT_H
#include <stdio.h>
#include<stdlib.h>

void check_score(void);
void change_passward(void);
void show_information(void);
void menu_student(void);

#endif //STUDENT_H

           

student.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include "tool.h"
#include "student.h"
#include "teacher.h"
#include "land.h"

void check_score(void)	
{	
	float sum_max=s[0].Chinese+s[0].Math+s[0].English,	sum_min=s[0].Chinese+s[0].Math+s[0].English;
	float max_c=s[0].Chinese, max_m=s[0].Math, max_e=s[0].English;	
	float min_c=s[0].Chinese, min_m=s[0].Math, min_e=s[0].English;	
	int cnt_c=1,cnt_m=1,cnt_e=1,cnt_sum=1;
	for(int i=0;i<count_stu;i++)
	{
		sum_max=sum_max > (s[i].Chinese+s[i].Math+s[i].English) ? sum_max:(s[i].Chinese+s[i].Math+s[i].English);	//總成績最高
		sum_min=sum_min < (s[i].Chinese+s[i].Math+s[i].English) ? sum_min:(s[i].Chinese+s[i].Math+s[i].English);	//總成績最低
		if(s[i].Chinese > max_c)
			max_c=s[i].Chinese;		//查找國文成績最高
		if(s[i].Math > max_m)
			max_m=s[i].Math;		//查找數學成績最高
		if(s[i].English > max_e)
			max_e=s[i].English;		//查找英語成績最高
		if(s[i].Chinese < min_c)
			min_c=s[i].Chinese;		//查找國文成績最低
		if(s[i].Math < min_m)
			min_m=s[i].Math;		//查找數學成績最低
		if(s[i].English < min_e)
			min_e=s[i].English;		//查找英語成績最低
		if((s[i].Chinese+s[i].Math+s[i].English) > (s[cur].Chinese+s[cur].Math+s[cur].English))	//平均分/總分排名
		cnt_sum++;
		if(s[i].Chinese > s[cur].Chinese)		//國文成績排名
		cnt_c++;
		if(s[i].Math > s[cur].Math)		//數學成績排名
		cnt_m++;
		if(s[i].English > s[cur].English)		//英語成績排名
		cnt_e++;
	}
	printf("           \t國文\t數學\t英語\t\t 總分\n");
	printf("單科最高分:\t%.2f\t%.2f\t%.2f\t最高總分:%.2f\n",max_c,max_m,max_e,sum_max);
	printf("單科最低分:\t%.2f\t%.2f\t%.2f\t最低總分:%.2f\n",min_c,min_m,min_e,sum_min);
	printf(" 你的成績 :\t%.2f\t%.2f\t%.2f\t\t %.2f\t平均分:%.2f\n",s[cur].Chinese,s[cur].Math,s[cur].English,s[cur].Chinese+s[cur].Math+s[cur].English,(s[cur].Chinese+s[cur].Math+s[cur].English)/3);
	printf(" 你的排名 :\t%d\t%d\t%d\t\t %d\n",cnt_c,cnt_m,cnt_e,cnt_sum);
	anykey_continue();
}

void  change_password(void)
{	
	char KEY[2][10]={0};
	printf("目前密碼為:%s,請輸入新密碼,長度10以内:\n",s[cur].key);
	get_password(KEY[0],sizeof(KEY[0]),true);
	printf("\n");
	puts("請再次輸入新密碼!\n");
	get_password(KEY[1], sizeof(KEY[1]) ,true);
	printf("\n");
	if(0 == strcmp(KEY[0],KEY[1]))
	{
		printf("修改成功!\n");
		strcpy(s[cur].key,KEY[1]);
		sleep(1);	
	}
	else
	{
		printf("\033[01;31m");		
		printf("修改失敗!\n");
		printf("\033[00m");
		sleep(1);		
	}
}
void show_information(void)
{
	printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",s[cur].name,s[cur].sex,s[cur].id, s[cur].Chinese, s[cur].Math, s[cur].English,s[cur].key,s[cur].lock);
	anykey_continue();
}
void menu_student(void)
{
	
	while(1)
	{	
		printf("\033[01;32m");
		system("clear");
		puts("歡迎進入學生菜單!");
		puts("1.查詢成績.");
		puts("2.修改密碼.");
		puts("3.檢視個人資訊.");
		puts("4.退出.");
		printf("\033[00m");
		switch(get_cmd('1','4'))
		{
			case '1': check_score();  break;
			case '2': change_password();  break;
			case '3': show_information(); break;
			case '4': return;
		}
	}
}
           

teacher.h

#ifndef TEACHER_H
#define TEACHER_H

#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <getch.h>

int cntt;

void change_key(void);
void menu_teacher(void);
void add_student(void);
void del_student(void);
void find(void);
void change_information(void);
void change_information_sorce(void);
void add_sorce(void);
void show_student(void);
void teacher(void);

#endif //TEACHER_H

           

teacher.c

#include <stdio.h>
#include "tool.h"
#include "admin.h"
#include "teacher.h"
#include "land.h"


void menu_teacher(void)
{
	printf("\033[01;32m");	
	printf("--%s正在使用\n",tea[cur].name);
	puts("1-修改密碼");
	puts("2-添加學生");
	puts("3-删除學生");
	puts("4-學生查詢 資訊(密碼)修改 學生解鎖");
	puts("5-錄入學生成績");
	puts("6-顯示學生資訊");
	puts("0-退出");
	printf("\033[00m");
}


void change_key(void)
{
	char ch;
	char KEY[3][10];
	puts("是否修改? y or n");
	scanf("%c",&ch);
	stdin->_IO_read_ptr = stdin->_IO_read_end;
	if('y'==ch)
	{
		puts("請輸入舊密碼");
		get_str(KEY[2],10);
		if(0 == strcmp(KEY[2],tea[cur].key))
		{
			for(;;)
			{
				puts("請輸入新密碼");
				get_str(KEY[0],10);
				puts("請确認新密碼");
				get_str(KEY[1],10);
				if(0 == strcmp(KEY[0],KEY[1]))
				{	
					strcpy(tea[cur].key,KEY[0]);
					break;
				}	
				else
					puts("兩次密碼不一緻,重新輸入");
				anykey_continue();
			}
		}
	}
	else
	{
		printf("\033[01;31m");		
		puts("密碼修改失敗");
		printf("\033[00m");
		anykey_continue();
	}
}

void add_student(void)
{
	puts("1-單個添加");
	puts("2-從檔案添加");
	char st1[10]="000000";
	if('1' == get_cmd('1','2'))
	{
		while(1)
		{
			puts("開始添加");
			puts("輸入姓名,性别");
			get_str(s[count_stu].name,10);
			get_str(s[count_stu].sex,4);
			s[count_stu].id=iD+1;			//學号自加
			s[count_stu].lock='0';
			iD++;
			strcpy((s+count_stu)->key,st1);
			printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",(s+count_stu)->name,(s+count_stu)->sex,(s+count_stu)->id,(s+count_stu)->Chinese,(s+count_stu)->Math,(s+count_stu)->English,(s+count_stu)->key,(s+count_stu)->lock);
			count_stu++;
			puts("添加成功!");
			puts("1-繼續添加\n2-退出\n");
			switch(get_cmd('1','2'))
			{
				case '1':break;
				case '2':return;
			}
		}
	}
	else
	{
		FILE* file=fopen("stu_add.txt","r");
		if (NULL == file)
		{
			printf("stu_add檔案打開失敗!");
			return ;
		}
		while(0 < fscanf(file,"姓名:%s 性别:%s\n",((s+count_stu)->name),((s+count_stu)->sex)))		//從檔案中讀取添加學生
		{
			s[count_stu].id=iD+1;
			s[count_stu].lock='0';
			iD++;
			strcpy((s+count_stu)->key,st1);
			count_stu++;
		}
		fclose(file);
		puts("添加成功!");
	}
	anykey_continue();
}

void del_student(void)
{
	int ID[2];
	int flag=0;
	puts("輸入學生學号");
	scanf("%d",&ID[0]);
	stdin->_IO_read_ptr = stdin->_IO_read_end;
	puts("再次輸入");
	scanf("%d",&ID[1]);
	stdin->_IO_read_ptr = stdin->_IO_read_end;
	if(ID[0] == ID[1])
	{
		for(int i=0; i<count_stu; i++)
		{
			if(ID[0] == s[i].id)
			{
				puts("---");
				*(stu_e+count_stu_e)=*(s+i);
				count_stu_e++;
				bzero(s+i,sizeof(Students));
				for(int j=i;j<count_stu-1;j++)
				{
					*(s+j)=*(s+j+1);
					bzero(s+j+1,sizeof(Students));
				}
				count_stu--;
				flag=1;
				puts("删除成功!");
				break;
			}
		}
		if(0==flag)
			puts("查無此人");
	}
	else
	{
		printf("\033[01;31m");	
		puts("兩次輸入不一緻");
		printf("\033[00m");
	}
	anykey_continue();
	return;
}

void find(void)
{
	char ch;
	int flag=0;
	puts("1-學号查詢");
	puts("2-姓名查詢");
	switch(get_cmd('1','2'))
	{
		case '1':{
			int ID;
			puts("輸入學号");
			scanf("%d",&ID);
			for(int i=0; i<count_stu; i++)
			{
				if(ID == s[i].id)
				{
					printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
					flag=1;
					cntt=i;
					break;
				}
			}
			if(0==flag)
			{
				puts("查無此人");
				anykey_continue();
			}
		}break;
		case '2':{
			char NAME[10];
			puts("輸入姓名");
			get_str(NAME,10);
			for(int i=0; i<count_stu; i++)
			{
				if(0 == strcmp(NAME,s[i].name))
				{
					printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
					flag=1;
					cntt=i;
					break;
				}
			}
			if(0 == flag)
			{
				puts("查無此人");
				anykey_continue();
			}
		}break;
	}
	if(1==flag)
	{
		puts("1-修改學生資訊/密碼 解鎖學生");
		puts("2-繼續查詢");
		puts("3-退出");
		switch(get_cmd('1','3'))
		{
			case '1': change_information();break;
			case '2': find();break;
			case '3': return;
		}
	}
	else
	{
		puts("繼續查詢 y or n");
		scanf("%c",&ch);
		stdin->_IO_read_ptr = stdin->_IO_read_end;
		if('y' == ch)
			find();
		else 
			return;
	}
}

void change_information(void)
{
	while(1)
	{
		puts("1-姓名\n2-性别\n3-學号\n4-密碼\n5-成績\n6-解鎖學生\n0-退出");
		switch(get_cmd('0','6'))
		{
			case '0': return;
			case '1': get_str(s[cntt].name,10);break;
			case '2': get_str(s[cntt].sex,4);break;
			case '3': scanf("%d",&s[cntt].id);break;
			case '4': get_str(s[cntt].key,10);break;
			case '5': change_information_sorce();break;
			case '6': {
				if('1'==s[cntt].lock)
					s[cntt].lock='0';
			}break;
		}
		puts("操作成功");
	}
}

void change_information_sorce(void)
{
	for(;;)
	{
		puts("1-國文  2-數學  3-英語  4-所有  5-退出\n");
		switch(get_cmd('1','5'))
			{
				case '1': scanf("%f",&s[cntt].Chinese);break;
				case '2': scanf("%f",&s[cntt].Math);break;
				case '3': scanf("%f",&s[cntt].English);break;
				case '4':{
					puts("按順序輸入語 數 英:");
					scanf("%f %f %f",&s[cntt].Chinese,&s[cntt].Math,&s[cntt].English);
				}break;
				case '5': return;
			}
		stdin->_IO_read_ptr = stdin->_IO_read_end;
		puts("修改成功");
	}
}

void add_sorce(void)
{
	int i=0;
	int arr_id;
	FILE* sorce=fopen("stu_cj.txt","r");
	if (NULL == sorce)
	{
		printf("stu_sorce檔案打開失敗!");
		return ;
	}
	fscanf(sorce,"學号 語  數  英");
	while(i < count_stu)
	{
		printf("錄入%s的成績 語 數 英:",s[i].name);
		fscanf(sorce,"%d %f  %f  %f\n",&arr_id,&s[i].Chinese,&s[i].Math,&s[i].English);
		printf("%.2f  %.2f  %.2f\n",s[i].Chinese,s[i].Math,s[i].English);
		i++;
	}
	fclose(sorce);
	anykey_continue();
}

void show_student(void)
{
	puts("1-在校學生\n2-退校學生\n3-傳回");
	switch(get_cmd('1','3'))
	{
		case '1':{
			for(int i=0; i<count_stu; i++)
			{
				printf("姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f 密碼:%s lock:%c\n",(s+i)->name,(s+i)->sex,(s+i)->id,(s+i)->Chinese,(s+i)->Math,(s+i)->English,(s+i)->key,(s+i)->lock);
			}
		}break;
		case '2':{
			for(int i=0; i<count_stu_e; i++)
			{
				printf("退 姓名:%s 性别:%s 學号:%d 國文:%.2f 數學:%.2f 英語:%.2f\n",(stu_e+i)->name,(stu_e+i)->sex,(stu_e+i)->id,(stu_e+i)->Chinese,(stu_e+i)->Math,(stu_e+i)->English);
			}
		}break;
		case '3': return;
	}
	anykey_continue();
}

void teacher(void)
{
	//stu=calloc(100,sizeof(Students));
	//stu_e=calloc(100,sizeof(Students));
	while(1)
	{
		system("clear");
		menu_teacher();
		switch (get_cmd('0','6'))
		{
			case '0': return;
			case '1': change_key();break;
			case '2': add_student();break;
			case '3': del_student();break;
			case '4': find();break;
			case '5': add_sorce();break;
			case '6': show_student();break;
		}
	}
}

           

admin.h

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <getch.h>
#ifndef ADMIN_H
#define ADMIN_H

int ID;
char* man_num;
char apd[10];

void admin(void);
void menu_admin(void);
void land_choose(void);
void menu_land(void);
void add_teacher(void);
void del_teacher(void);
void reset(void);
void oplock(void);

#endif//ADMIN_h

           

admin.c

#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <getch.h>
#include <stdlib.h>
#include "admin.h"
#include "teacher.h"
#include "tool.h"
#include "land.h"

//Teachers* tea=NULL;//存放在職老師

//Teachers* dtea=NULL;//存放離職老師//

char* man_num="thl520";//校長的管理者令牌
int ID = 20210001;//起始id


void land_choose(void)		//校長登入選擇
{
	for(;;)
	{	
		menu_land();
		switch(get_cmd('1','3'))
		{
			case '1': land_admin(); break;
			case '2': reset(); break;
			case '3':return;
		}
	}
}
void menu_land(void)
{
	system("clear");
	printf("\033[01;35m");
	puts("*****歡迎登入校長平台*****");
	puts("1、登入背景");
	puts("2、重置密碼");
	puts("3、退出");
	printf("\033[00m");
}
void reset(void)//重置校長和老師密碼
{	
	char str[10];
	int key=0;
	printf("請輸入管理者令牌:");	
	get_password(str,sizeof(str),true);
	printf("\n");
	if(0 == strcmp(str,man_num) )
	{
		printf("重置本人密碼按 1\n");
		printf("重置老師密碼按 2\n");
		switch(get_cmd('1','2'))
		{
			case '1':
					printf("請輸入本人的重置密碼:");
					get_str(apd,10);
					puts("重置成功!");
					sleep(2);
					break;
			case '2':
					printf("請輸入要重置密碼的老師工号:");
					scanf("%d",&key);
;					for(int i=0; i<count_tea; i++)
					{
						if(key==tea[i].id && tea[i].id)
						{
							printf("%s %s %s %d\n",tea[i].name,tea[i].sex,tea[i].key,tea[i].id);					
							puts("請重新輸入重置密碼:");
							get_str(tea[i].key,10);
							puts("重置成功!");
							printf("%s %s %s %d\n",tea[i].name,tea[i].sex,tea[i].key,tea[i].id);
							sleep(2);
							return;
						}
						else
						{	
							printf("\033[01;31m");
							puts("找不到該老師!\n");
							printf("\033[00m");
							return;
						}
					}break;
		}
	}
	else
	{
		printf("\033[01;31m");		
		printf("令牌錯誤!\n");
		printf("\033[00m");	
		sleep(1);	
	}	
}
void add_teacher(void)
{
	int i=0;
	while(tea[i].id)i++;
	printf("請輸入姓名:");
	get_str(tea[i].name,10);
	printf("請輸入性别:");
	get_str(tea[i].sex,4);
	if(!strcmp(tea[i].sex,"男") || !strcmp(tea[i].sex,"女"))
	{
		strcpy(tea[i].key,"000000");
		tea[i].lock='0';
		if(0 == i )
		{
			tea[i].id=ID;	
		}
		else
		{
			tea[i].id=tea[i-1].id+1;	
		}
		count_tea++;
		printf("%s %s %d 添加成功!\n",tea[i].name,tea[i].sex,tea[i].id);
		sleep(2);
	}
	else
	{
		puts("性别輸入有問題");
		getch();
	}
}

void del_teacher(void)
{	
	char key[10];
	int j=0;
	printf("請輸入要删除的老師姓名:");
	get_str(key,10);
	for(int i=0; i<count_tea; i++)
	{			
		if(tea[i].id && !strcmp(key,tea[i].name))
		{	
			while(dtea[j].id)j++;			
			dtea[j]=tea[i];
			
			count_dtea++;
			printf("姓名:%s 性别:%s 工号:%d 删除老師成功!\n",dtea[j].name,dtea[j].sex,dtea[j].id);
			for(int k=i;k<count_tea;k++)
			{
				tea[k]=tea[k+1];
			}
			count_tea--;
			sleep(2);
			return;
		}
	}
	printf("\033[01;31m");
	printf("未找到老師,删除失敗!\n");
	printf("\033[00m");
	sleep(1);
}
void list(void)		//顯示教師名單
{	
	printf("在職老師名單:\n");
	for(int i=0; i<count_tea; i++)
	{	
		if(tea[i].id)
		{	
			printf("姓名:%s 性别:%s 工号:%d\n",tea[i].name,tea[i].sex,tea[i].id);
		}
	}
	printf("離職老師名單:\n");
	for(int i=0; i<count_dtea; i++)
	{			
		if(0!=dtea[i].id)
		{	
			printf("姓名:%s 性别:%s 工号:%d \n",dtea[i].name,dtea[i].sex,dtea[i].id);
		}
	}
	anykey_continue();
}
void oplock(void)		//解鎖教師
{
	char key[10];
	printf("請輸入要解鎖的老師姓名:");
	get_str(key,10);
	for(int i=0; i<count_tea; i++)
	{			
		if(tea[i].id && !strcmp(key,tea[i].name))
		{
			tea[i].lock='0';
			puts("解鎖成功");
			sleep(2);
		}		
	}
}

void menu_admin(void)
{
	system("clear");
	printf("\033[01;35m");
	puts("*****歡迎登入管理中心*****");
	puts("1、添加老師");
	puts("2、删除老師");
	puts("3、解鎖老師");
	puts("4、顯示在職,離職老師");
	puts("5、重置密碼");
	puts("6、退出");
	printf("\033[00m");
}

void admin(void)
{			
	//tea=calloc(500,sizeof(Teachers));
	//dtea=calloc(500,sizeof(Teachers));
	for(;;)
	{	
		menu_admin();
		switch(get_cmd('1','6'))
		{
		case '1': add_teacher(); break;
		case '2': del_teacher(); break;
		case '3': oplock();break;
		case '4': list();break;
		case '5': reset();break;
		case '6': return ;
		}
	}
}

           

makefile

CC=gcc
FLAG=-Werror -Wall
OBJS=main.o student.o teacher.o admin.o tool.o file.o land.o
TARGE=manage

all:$(OBJS)
		$(CC) $(OBJS) -o $(TARGE) && ./$(TARGE)
#%.o:%.c 
#		$(CC) $(FLAG) -c $<
		
clean:
	rm -rf *.h.gch
	rm -rf $(OBJS) $(TARGE)

tool.o:tool.c tool.h
	$(CC) $(FLAG) -c tool.c
main.o:main.c tool.h student.h teacher.h admin.h land.h file.h
	$(CC) $(FLAG) -c main.c
student.o:student.c student.h teacher.h tool.h land.h
	$(CC) $(FLAG) -c student.c
teacher.o:teacher.c student.h teacher.h admin.h tool.h land.h
	$(CC) $(FLAG) -c teacher.c
admin.o:admin.c admin.h teacher.h tool.h land.h
	$(CC) $(FLAG) -c admin.c
file.o:file.c file.h admin.h teacher.h tool.h 
	$(CC) $(FLAG) -c file.c
land.o:land.c land.h student.h teacher.h tool.h
	$(CC) $(FLAG) -c land.c
           

繼續閱讀