IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【c语言小项目】学生成绩管理系统 -> 正文阅读

[C++知识库]【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
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 10:59:24  更:2021-09-06 11:01:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:37:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码