项目——学生成绩管理系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15345177/article/details/84942435

项目——学生成绩管理系统

前言:此项目不具有商业价值,旨在总结C语言所学知识点及各知识点在项目中的运用,主要锻炼编码能力,程序设计能力,对业务逻辑的理解能力。

系统要求

在这里插入图片描述
在这里插入图片描述

设计逻辑

  1. 先设计系统主界面,并且搭建基础框架。主界面分为管理员、教师、学生各自的入口和退出功能,其中超级管理员也要设置,但不显示。搭建管理员、教师、学生等子界面基本框架。
  2. 确定全局变量:学生、老师、管理员结构体,学生、老师、管理员数量,超级管理员有且只有一个直接写入程序。
  3. 编写各个子界面功能函数 ,统一编写登录功能函数。
  4. 信息读取与储存:每次启动系统,系统从文件中读取所有信息,包括(学生、老师、管理员结构体,学生、老师、管理员数量),然后存储在相应变量中以待系统编辑。编辑完成后,正常退出,退出时将相应变量存储到文件中。

编程实现

1、主函数

#include"interface.h"
#include"common.h"
void xsglxt(void)//主界面
{
	while(1)
	{
		interface();//显示初始界面
		switch(getch())
		{
			case 49:student_interface();break;//1.学生入口
			case 50:teacher_interface();break;//2.教师入口
			case 51:administratorsr_interface();break;//3.管理员入口
			case 52:super_administrators_interface();break;//4.超级管理员入口
			case 53:return ;;break;//5.退出
		}
	}
}


int main()//读写信息使用二进制文件,提高文件安全性(二进制打开看不懂)
{
	FILE* fpp1=fopen("admin.dat","r");//读取管理员信息
	fseek(fpp1,0,SEEK_END);
	long j=ftell(fpp1);
	rewind(fpp1);
	adm_count=j/56;
	for(int i=0;i<=adm_count;i++)
	{
		fread(&admin[i],56,1,fpp1);
	}
	FILE* fap1=fopen("student.dat","r");//读取学生信息
	fseek(fap1,0,SEEK_END);
	long j1=ftell(fap1);
	rewind(fap1);
	stu_count=j1/64;
	for(int i=0;i<=stu_count;i++)
	{
		fread(&student[i],64,1,fap1);
	}

	FILE* fwp1=fopen("teacher.dat","r");//读取老师信息
	fseek(fwp1,0,SEEK_END);
	long j2=ftell(fwp1);
	rewind(fwp1);
	teacher_count=j2/60;
	for(int i=0;i<=teacher_count;i++)
	{
		fread(&teacher[i],60,1,fwp1);
	}

	xsglxt();//显示主界面,进入相应的子界面完成操作
	FILE* fap=fopen("student.dat","w");//写入(保存)学生信息
	for(int i=0;i<stu_count;i++)
	{
		fwrite(&student[i],sizeof(student[0]),1,fap);
	}
	FILE* fwp=fopen("teacher.dat","w");//写入(保存)教师信息
	for(int i=0;i<teacher_count;i++)
	{
		fwrite(&teacher[i],sizeof(teacher[0]),1,fwp);
	}
	FILE* fpp=fopen("admin.dat","w");//写入(保存)管理员信息
	for(int i=0;i<adm_count;i++)
	{
		fwrite(&admin[i],sizeof(admin[0]),1,fpp);
	}
}

2、common.c

存放普遍功能函数,以及结构体、数量等全局变量

#include<stdio.h>
#include<getch.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<time.h>
void clear_stdin(void);//清屏函数
char* get_str(char* str,size_t size);//输入函数
void anykey_continue(void);//任意键跳出函数 
void password_input(char* str);//密码输入
void show_msg(char* msg,int sec,int color);//延迟显示
int password_rule(char *str);//密码规则


int password_rule(char *str)
{
	int x=strlen(str);
	if(x<6 || x>10)
	return 0;
	for(int i=0;str[i];i++)
	{
		if(str[i]<'0' || str[i]>'9')
		return 0;
	}
	return 1;
}
struct Admin
{
	int number;//工号
	char name[20];//姓名
	char code[20];//密码
	int year;//出生年
	int work_year;//参加工作的那年
	char sex;//性别
	char state;//0正常 1 冻结 2 离职

};
struct Teacher
{
	int number;//工号
	char name[20];//姓名
	char sex;//性别
	int year;//出生年
	int work_year;//入职年
	char code[20];//密码
	char state;//0正常 1 冻结 2 退学	
};
struct Student
{
	char code[20];//密码
	char name[20];//姓名
	int number;//学号
	int year;//出生年
	int math;//数学成绩
	int English;//英语成绩
	int chinese;//语文成绩
	char sex;//性别
	char state;//0正常 1 冻结 2 离职
};
struct Score
{
	int num ;//学号
	int math ;//数学成绩
	int English;//英语成绩
	int chinese;// 语文成绩
};
struct Score score[500];
struct Student student[500];
struct Teacher teacher[50];
struct Admin admin[10];
int stu_count=0;
int teacher_count=0;
int adm_count=0;
void anykey_continue(void)
{
	puts("按任意键返回......");
	getch();
}
void password_input(char* str);
void clear_stdin(void)
{
	stdin->_IO_read_ptr=stdin->_IO_read_end;
}
char* get_str(char* str,size_t size)
{
	if(NULL == str) return str;
	clear_stdin();
	fgets(str,size,stdin);
	if(size-1 == strlen(str))
	{
		if('\n'==str[size-2])
			str[size-2]= '\0';
		else
			clear_stdin();
	}
	else
		str[strlen(str)-1]='\0';
}
void password_input(char* str)
{
	for(int i=0;i<20;i++)
	{
		str[i]=getch();
		if(i>0&&127 == str[i])
		{
			i-=2;
			printf("\b \b");
			continue;
		}
		if(127 == str[i])
		{
			i--;
			continue;
		}
		if('\n'==str[i])
		{
			str[i]='\0';
			break;
		}
		putchar('*');
		
	}
}
void show_msg(char* msg,int sec,int color)//提示信息颜色
{
	if(0==color)
	printf("\n\033[01;31m%s\n\033[00m\n",msg);
	if(1==color)
	printf("\n\033[01;32m%s\n\033[00m\n",msg);
	if(2==color)
	printf("\n\033[01;33m%s\n\033[00m\n",msg);
	sleep(sec);
}

3.interface.c

主要为主界面进入子界面的入口和登录函数

#include "common.h"
#include "sup_admin.h"
#include "teacher.h"
#include "student.h"
#include "admin.h"
void interface(void);//主菜单函数声明
void student_interface(void);//学生入口
void teacher_interface(void);//教师入口
void administratorsr_interface(void);//管理员入口
void super_administrators_interface(void);//超级管理员入口
int cmp_stu_num(int num);//通过学号查找编号
int cmp_stu_code(int num,char *str);//通过编号对学生密码进行验证
int cmp_tea_num(int num);//通过工号查找编号
int cmp_tea_code(int num,char *str);//通过编号对教师密码进行验证
int cmp_adm_num(int num);//通过工号来查找编号
int cmp_adm_code(int num,char *str);//通过编号对管理员密码进行验证
void student_interface_son(int i);


int cmp_stu_code(int num,char *str)
{
	if(num<0) return 0;
	int i=strcmp(str,student[num].code);
	if(i==0) return 1;
	else return 0;
}
int cmp_stu_num(int num)
{
	for(int i=0;student[i].number;i++)
	{
		if(student[i].number==num)
		return i;
	}
	return -1;
}
int cmp_tea_code(int num,char *str)
{
	if(num<0) return 0;
	int i=strcmp(str,teacher[num].code);
	if(i==0) return 1;
	else return 0;
}
int cmp_tea_num(int num)
{
	for(int i=0;teacher[i].number;i++)
	{
		if(teacher[i].number==num)
		return i;
	}
	return -1;
}
int cmp_adm_code(int num,char *str)
{
	if(num<0) return 0;
	int i=strcmp(str,admin[num].code);
	if(i==0) return 1;
	else return 0;
}
int cmp_adm_num(int num)
{
	for(int i=0;admin[i].number;i++)
	{
		if(admin[i].number==num)
		return i;
	}
	return -1;
}
void interface(void)
{
	system("clear");
	puts("-----指针学生信息管理系统-----");	
	puts("1.学生入口");
	puts("2.教师入口");
	puts("3.管理员入口");
	puts("5.退出");
}
void student_interface(void)
{
	system("clear");
	puts("----------学生登录----------");
	puts("1.登入学生成绩查询系统");
	puts("2.返回主界面");
	int stu_num=0;
	char stu_code[20];
	int index=0;
	switch(getch())
	{
		case 49:
			while(1)
			{
				system("clear");
				puts("-----登入学生成绩查询系统-----");
				puts("1.输入账号密码:");
				puts("2.退出");
				switch(getch())
				{
					case 49:printf("请输入账号:");
							scanf("%d",&stu_num);
							printf("请输入密码:");
							getch();
							password_input(stu_code);
							int i=cmp_stu_num(stu_num);
							if(-1==i)
							{
								show_msg("账号不存在!",1,0);
								continue;
							}
							if(student[i].state=='1')
							{
								show_msg("该账号已经被冻结!",1,0);
								return;
							}
							if(student[i].state=='2')
							{
								show_msg("您已离校!无法登入!",1,0);
								return;
							}
							if(cmp_stu_code(i,stu_code))
							{
								system("clear");
								printf("%s同学,欢迎你!\n",student[i].name);
								sleep(2);
								student_interface_son(i);
								index=0;
							}
							else if(2==index)
							{
								show_msg("你的账号已经被锁定",1,0);
								student[i].state='1';
								anykey_continue();
								return;
							}
							else
							{
								printf("\n\033[01;33m你还剩%d次机会!\n\033[00m\n",2-index);
								index++;
								anykey_continue();
							};
							;break;
					case 50:return;
				}
			}	
			;break;//1.学生入口
		case 50:return;break;//退出
	}

}
void teacher_interface(void)
{
	system("clear");
	puts("----------教师登录----------");
	puts("1.登入教师管理系统");
	puts("2.返回主界面");
	int tea_num=0;
	char tea_code[20];
	int index=0;
	switch(getch())
	{
		case 49:
			while(1)
			{
				system("clear");
				puts("-----登入教师管理系统-----");
				puts("1.输入账号密码:");
				puts("2.退出");
				switch(getch())
				{
					case 49:printf("请输入教师工号:");
							scanf("%d",&tea_num);
							printf("请输入密码:");
							getch();
							password_input(tea_code);
							int i=cmp_tea_num(tea_num);
							if(-1==i)
							{
								show_msg("账号不存在!",1,0);
								continue;
							}
							if(teacher[i].state=='1')
							{
								show_msg("该账号已经被冻结!",1,0);
								return;
							}
							if(cmp_tea_code(i,tea_code))
							{
								system("clear");
								printf("%s老师,欢迎您!\n",teacher[i].name);
								sleep(2);
								teacher_interface_son(i);
								index=0;
							}
							else if(2==index)
							{
								show_msg("你的账号已经被锁定",1,0);
								teacher[i].state='1';
								anykey_continue();
								return;
							}
							else
							{
								printf("\n\033[01;33m你还剩%d次机会!\n\033[00m\n",2-index);
								index++;
								anykey_continue();
							};
							;break;
					case 50:return;
				}
			}	
			;break;
		case 50:return;break;
	}
}
void administratorsr_interface(void)
{
	system("clear");
	puts("----------管理员登录----------");
	puts("1.登入管理员管理系统");
	puts("2.返回主界面");
	int adm_num=0;
	char adm_code[20];
	int index=0;
	switch(getch())
	{
		case 49:
			while(1)
			{
				system("clear");
				puts("-----登入管理员管理系统-----");
				puts("1.输入账号密码:");
				puts("2.退出");
				switch(getch())
				{
					case 49:printf("请输入管理员工号:");
							scanf("%d",&adm_num);
							printf("请输入密码:");
							getch();
							password_input(adm_code);
							int i=cmp_adm_num(adm_num);
							if(-1==i)
							{
								show_msg("账号不存在!",1,0);
								anykey_continue();
								continue;
							}
							if(admin[i].state=='1')
							{
								show_msg("该账号已经被冻结!",1,0);
								anykey_continue();
								return;
							}
							if(cmp_adm_code(i,adm_code))
							{
								system("clear");
								printf("%s管理员,欢迎您!\n",admin[i].name);
								sleep(2);
								admin_interface_son(i);
								index=0;
							}
							else if(2==index)
							{
								show_msg("你的账号已经被锁定",1,0);
								admin[i].state='1';
								anykey_continue();
								return;
							}
							else
							{
								printf("\n\033[01;33m你还剩%d次机会!\n\033[00m\n",2-index);
								index++;
								anykey_continue();
							};
							;break;
					case 50:return;
				}	
			}	
			;break;
		case 50:return;break;
	}
}
void super_administrators_interface(void)
{
	while(1)
	{
		system("clear");
		puts("1.请输入指令:");
		puts("2.退出");
		switch(getch())
		{
			case 49:system("clear");
					puts("输入口令:");
					char sup_adm_mima[30]={};
					password_input(sup_adm_mima);
					int index=strcmp(sup_adm_mima,"asdfghjkl123456789");
					if(index==0)
					{
						show_msg("登入成功!!",1,0);
						super_administrators_interface_son();
					}
					else
					{
						anykey_continue();
						return;
					};break;
			case 50:return;
		}
	}
}

4.student.c

主要是学生界面等信息显示及其功能函数

#include "common.h"
#define SUM_SEC 365*24*3600
void total_ranking(int n);//总成绩排名
void single_ranking(int n);//单科成绩排名
void student_interface_son(int i);//学生界面
void change_stu_password(int i);
void single_ranking(int n)
{
	int count_c=1,count_m=1,count_e=1;//排名默认为1
	for(int i=0;i<500;i++)
	{
		if(student[i].state=='0')
		{
			if(student[i].chinese > student[n].chinese)//有一个成绩比我高,我的排名就加1
			count_c++;
			if(student[i].math > student[n].math)
			count_m++;
			if(student[i].English > student[n].English)
			count_e++;
		}
	}
	printf("语文成绩排名:%d\n",count_c);
	printf("数学成绩排名:%d\n",count_m);
	printf("英语成绩排名:%d\n",count_e);
}

void total_ranking(int n)
{
	int count=1;//排名默认为1
	for(int i=0;i<500;i++)
	{
		if(student[i].state=='0')
		{
			if(student[i].chinese+student[i].math+student[i].English > student[n].chinese+student[n].math+student[n].English )
				count++;			////有一个成绩比我高,我的排名就加1
		}
	}
	printf("总成绩排名:%d\n",count);	
}
void change_stu_password(int i)
{
	while(1)
		{
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,2);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改为初始密码!",1,2);
				continue;
			}
			strcpy(student[i].code,new_code);
			show_msg("输入成功!",1,1);
			anykey_continue();
			break;
		}
}
void student_interface_son(int i)
{

	if(0==strcmp(student[i].code,"123456"))
	{
		system("clear");
		while(1)
		{
			puts("第一次登入请修改密码,密码不能为初始值");
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,2);
				continue;
			}
			strcpy(student[i].code,new_code);
			show_msg("输入成功!",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
		system("clear");
		printf("--------学生界面--------\n");
		printf("学号:%d\n",student[i].number);
		printf("姓名:%s\n",student[i].name);
		printf("性别:%s\n",student[i].sex=='1'?"男":"女");
		printf("年龄:%ld\n",(time(NULL)/(SUM_SEC))+1970-student[i].year);
		printf("语文成绩:%d\n",student[i].chinese);
		printf("数学成绩:%d\n",student[i].math);
		printf("英语成绩:%d\n",student[i].English);
		printf("平均分:%.2lf\n",(student[i].chinese+student[i].math+student[i].English)/3.0);
		printf("总分:%d\n",student[i].chinese+student[i].math+student[i].English);
		printf("--------------------\n");
		printf("1、查看单科成绩排名:\n");
		printf("2、总分成绩排名:\n");
		printf("3、修改登入密码:\n");
		printf("4、返回主菜单:\n");
		printf("--------------------\n");
		switch(getch())
		{
			case 49:printf("*查看单科成绩排名*\n");single_ranking(i);anykey_continue();break;//1.学生入口
			case 50:printf("*查看总分成绩排名*\n");total_ranking(i);anykey_continue();break;//退出
			case 51:printf("修改登入密码\n");change_stu_password(i);;break;//退出
			case 52:printf("返回主菜单\n");return ;//退出
		}
	}
}

5、teacher.c

主要是教师界面等信息显示及其功能函数

#ifndef TEACHER_H
#define TEACHER_H
#include "common.h"
#define SUM_SEC 365*24*3600//宏定义一年的秒数(忽略闰年)用来计算年龄
int _find_num( int key);//寻找学号
char *_find_name(char* name,char* key);//寻找姓名
void _show_stu(int key,int b);//显示信息
void add_stu_more(void);//导入学生
void add_stu(void);//增加学生(可能需要修改)
void del_stu(void);//删除学生
void modify_stu(void);//修改学生信息
void reset_code(void);//重置密码
void unlock_account(void);//解锁账号
void find_name_stu(void);//按姓名查找
void show_01_stu(void);//显示在校学生
void show_2_stu(void);//显示离校学生
void add_score_more(void);//导入分数
void add_score(void);//添加分数
void modify_score(void);//修改分数
void sort_score(void);//按成绩排序
void find_name_num_score(void);//按学号查分数
void teacher_interface_son(int i);//教师界面
void student_achievement_management(void);//学生成绩管理
void student_information_management(void);//学生信息管理
void change_tea_password(int i);
int _find_num( int key)//寻找学号
{
	for(int i=0 ;i<stu_count;i++)
	{
		if(student[i].number==key && student[i].state!= '2')
		{
			return i;
		}
	}
	return -1;
}
char *_find_name(char* name,char* key)//寻找姓名
{
	int count=0;
	for(int i=0;i<stu_count;i++)
	{
		if(0==strcmp(student[i].name,name) && (student[i].state=='0'|| student[i].state=='1'))
		{
			key[count]=i+'0';
			count++;
		}
	}
	key[count]='\0';
	return key;
}
void _show_stu(int key,int b)//显示信息
{
	system("clear");
	printf("学号:%4d ",student[key].number);
	printf("性别:%3s ",'1'==student[key].sex?"男":"女");
	printf("姓名:%4s ",student[key].name);
	if(b==1)
	{
	printf("语文:%4d ",student[key].chinese);
	printf("数学:%4d ",student[key].math);
	printf("英语:%4d ",student[key].English);
	}
	printf("\n");
	sleep(1);
}
void add_stu_more(void)//导入学生
{

	system("clear");
	puts("---------导入学生---------");
	FILE* fp=fopen("add_stu.txt","r");
	if(NULL==fp)
	{
		perror("fopen");
		return ;
	}	
	while(1)
	{
		int num=100000;
		stu_count++;
		fscanf(fp,"%s %d %c",student[stu_count-1].name,&student[stu_count-1].year,&student[stu_count-1].sex);
		if(feof(fp)==1)
		{
			stu_count--;
			break;
		}
		student[stu_count-1].number=num+stu_count;
		strcpy(student[stu_count-1].code,"123456");
		student[stu_count-1].state='0';
	}	
	fclose(fp);
		show_msg("添加成功!按任意键返回!",1,1);
		getch();
}
void add_stu(void)//增加学生
{
	system("clear");
	printf("----------增加学生---------\n");
	stu_count++;
	int num=100000;int sex=0;
	student[stu_count-1].number=num+stu_count;
	strcpy(student[stu_count-1].code,"123456");
	printf("请输入姓名:\n");
	gets(student[stu_count-1].name);

	while(1)
	{	
		printf("请输入性别1.男 2.女\n");
		sex=getch();
		if(sex==49||sex==50)
		{
			printf("%s\n",sex==49?"男":"女");
			student[stu_count-1].sex=sex;
			break;
		}
		else
		show_msg("性别输入错误!",1,0);
	}
	student[stu_count-1].state='0';
	printf("请输入出生年份:\n");
	scanf("%d",&student[stu_count-1].year);
	show_msg("添加成功!",1,1);
	sleep(1);	
}
void del_stu(void)//删除学生
{
	system("clear");
	int key=0;int num=0;int yes=0;
	printf("----------删除学生---------\n");
	printf("请输入需删除学生的学号\n");
	while(1)
	{
		scanf("%d",&key);
		printf("k=%d\n",key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("该学生学号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);	
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}	
		else
		{
			_show_stu(num,0);
			show_msg("是否继续删除?y/n",1,2);
			yes=getch();
			if(yes==121 || yes==89)
			{	
				student[num].state='2';
				show_msg("删除成功!",1,1);
				break;
			}
			else
			{
				printf("输入学号:\n");
			}
		}	
	}
	sleep(1);
}
void modify_stu(void)//修改学生信息
{
	system("clear");
	int key=0;int num=0;char name[20];int year=0;
	printf("----------修改信息---------\n");
	printf("请输入需修改学生的学号\n");
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		show_msg("该学生学号不存在!",1,0);
		else
		{
			printf("输入修改的姓名:\n");
			strcpy(student[num].name,gets(name));
			printf("输入出生年份:\n");
			scanf("%d",&year);
			student[num].year=year;
			show_msg("修改成功!",1,1);		
		}
	sleep(1);
}
void reset_code(void)//重置密码
{
	system("clear");
	int key=0;int num=0;
	printf("----------重置密码----------\n");
	printf("请输入需要重置密码学生的学号\n");
	scanf("%d",&key);
	getchar();
	num=_find_num(key);
	if(-1==num)
		show_msg("该学生学号不存在!",1,0);
	else
	{
		strcpy(student[num].code,"123456");
		show_msg("修改成功!",1,1);
	}
	sleep(1);
}
void unlock_account(void)//解锁账号
{
	system("clear");
	int key=0;
	printf("----------解锁账号----------\n");
	printf("请输入需要解锁账号的学生的学号:\n");
	scanf("%d",&key);
	getchar();
	for(int i=0 ;i<stu_count;i++)
	{
		if(student[i].number==key && student[i].state == '1')
		{
			student[i].state= '0';
			show_msg("解锁成功!",1,1);
			sleep(1);
			return;
		}
	}	
	show_msg("该账号不存在或未被锁定!",1,0);	
	show_msg("任意键结束显示",1,2);
	getch();
	
}
void find_name_stu(void)//按姓名查找
{
	system("clear");
	char key[100] ;char name[20];int num=0;
	printf("----------按姓名查找----------\n");
	while(1)
	{
		printf("请输入需要查找人姓名:\n");
		gets(name);
		_find_name(name,key);
		num=strlen(key);
		if(0==num)
		{
			show_msg("查无此人!",1,0);
			anykey_continue();
			break;
		}
		for(int i=0;i<num;i++)
		{
			printf("学号:%4d ",student[key[i]-'0'].number);
			printf("性别:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
			printf("姓名:%4s \n",student[key[i]-'0'].name);
		}
		show_msg("是否结束查找?y/n",1,2);
		num=getch();
		if(num==121 ||num==89)
			break;
	}
}
void show_01_stu(void)//显示在校学生
{
	system("clear");
	char key[500];
	printf("----------显示在校学生---------\n");
	int num=0;
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state!='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	for(int i=0;i<num;i++)
	{
		printf("学号:%4d ",student[key[i]-'0'].number);
		printf("性别:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
		printf("姓名:%4s \n",student[key[i]-'0'].name);
	}
	show_msg("任意键结束显示!",1,2);
	getch();
}
void show_2_stu(void)//显示离校学生
{
	system("clear");
	char key[500];int num=0;
	printf("----------显示离校学生---------\n");
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state=='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	for(int i=0;i<num;i++)	
	{
		printf("学号:%4d ",student[key[i]-'0'].number);
		printf("性别:%3s ",'1'==student[key[i]-'0'].sex?"男":"女");
		printf("姓名:%4s \n",student[key[i]-'0'].name);
	}
	show_msg("任意键结束显示",1,2);
	getch();
}
void student_information_management(void)//学生信息管理
{
	while(1)
	{
		system("clear");
		printf("-------------学生信息管理--------------\n");
		puts("0.批量导入学生");
		puts("1.添加学生");
		puts("2.删除学生");
		puts("3.修改学生基本信息");
		puts("4.重置学生密码");
		puts("5.解锁学生账号");
		puts("6.根据姓名查询学生基本信息");
		puts("7.显示所有在读学生");
		puts("8.显示所有退学学生");
		puts("9.返回上层");
		switch(getch())
			{
				case 48: add_stu_more();break;
				case 49: add_stu();break;
				case 50: del_stu();break;
				case 51: modify_stu();break;
				case 52: reset_code();break;
				case 53: unlock_account();break;
				case 54: find_name_stu();break;
				case 55: show_01_stu();break;
				case 56: show_2_stu();break;
				case 57: return;
			}
	}
}
void add_score_more(void)
{
	system("clear");
	puts("---------导入学生成绩---------");
	FILE* fp=fopen("add_score.txt","r");
	int n=0;
	if(NULL==fp)
	{
		perror("fopen");
		return ;
	}	
	while(1)
	{
		fscanf(fp,"%d%d%d%d",&score[n].num,&score[n].chinese,&score[n].math,&score[n].English);
		if(feof(fp)==1)
		{
			break;
		}
		n++;
	}	
	fclose(fp);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<stu_count;j++)
		{
			if(score[i].num==student[j].number)
			{
				student[j].chinese=score[i].chinese;
				student[j].math=score[i].math;
				student[j].English=score[i].English;
			}
		}
	}
		show_msg("添加成功!按任意键返回!",1,1);
		getch();
}
void add_score(void)
{
	system("clear");
	int key=0;int num=0;int yes=0;
	while(1)
	{
		system("clear");
		puts("----------成绩录入----------");
		printf("请输入需录入成绩学生的学号\n");
	
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("该学生学号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
			
		}
		else
		{
			_show_stu(num,1);
			puts("请输入语文成绩:");
			scanf("%d",&student[num].chinese);
			puts("请输入数学成绩: ");
			scanf("%d",&student[num].math);
			puts("请输入英语成绩:");
			scanf("%d",&student[num].English);
			getchar();
			show_msg("是否继续输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}	
	}
	sleep(1);
}
void modify_score(void)
{
	system("clear");
	int key=0;int num=0;int yes=0;
	while(1)
	{
		system("clear");
		puts("----------成绩修改----------");
		puts("请输入需录入成绩学生的学号");
	
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("该学生学号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}		
		else
		{
			_show_stu(num,1);
			puts("请输入语文成绩:");
			scanf("%d",&student[num].chinese);
			puts("请输入数学成绩: ");
			scanf("%d",&student[num].math);
			puts("请输入英语成绩:");
			scanf("%d",&student[num].English);
			getchar();
			show_msg("是否继续修改?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }
		}
	}
}
void find_name_num_score(void)
{
	int key=0,yes;
	while(1)
	{	
		int num=0;
		system("clear");
		puts("----------成绩查询----------");
		puts("请输入需要查询学生的学号:");
		scanf("%d",&key);
		getchar();
		num=_find_num(key);
		if(-1==num)
		{
			show_msg("该学生学号不存在!",1,0);
			show_msg("是否重新输入?y/n,",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			_show_stu(num,1);
			show_msg("任意键结束显示!",1,2);
			getch();
			break;
		}
	}
}
void sort_score(void)
{
	system("clear");
	int count_c[500]={},count_m[500]={},count_e[500]={},count[500]={};
	for(int i=0;i<stu_count;i++)
	{
		if(student[i].state!='2')
		{
			for(int j=0;j<stu_count;j++)
			{
				if(student[j].state!='2')
				{
					if(student[j].chinese > student[i].chinese)
					count_c[i]++;
					if(student[j].math > student[i].math)
					count_m[i]++;
					if(student[j].English > student[i].English)
					count_e[i]++;
					if(student[j].chinese+student[j].math+student[j].English > student[i].chinese+student[i].math+student[i].English )
					count[i]++;
				}
			}
		}
	}
	printf(" 学号    姓名	语文排名(语文分数)  数学排名(数学分数)  英语排名(英语分数)  总排名(总分)\n");
	for(int i=0;i<stu_count;i++)
	{
		
		if(student[i].state!='2')
		{
			printf("%6d\t",student[i].number);
			printf("%s\t",student[i].name);
			printf("%6d(%3d)\t",count_c[i]+1,student[i].chinese);
			printf("%10d(%3d)\t",count_m[i]+1,student[i].math);
			printf("%6d(%3d)\t",count_e[i]+1,student[i].English);
			printf("%7d(%3d)\n",count[i]+1,student[i].chinese+student[i].math+student[i].English);
		}
	}
	show_msg("任意键结束显示!",1,2);
	getch();	

}
void student_achievement_management(void)//学生成绩管理
{
	while(1)
	{
		system("clear");
		printf("------------学生成绩管理---------------\n");
		puts("1.单个录入成绩");
	    puts("2.值导入成绩");
	    puts("3.修改学生成绩");
	    puts("4.根据学号或姓名查找成绩");
	    puts("5.按各科分数或部分排序");
	    puts("6.返回上层");
	    switch(getch())
	    {
			case 49: add_score();break;//单个录入成绩
			case 50: add_score_more();break;//指导入
			case 51: modify_score();break;//修改学生成绩 
	 		case 52: find_name_num_score();break;//根据学号或姓名查询学生成绩 
			case 53: sort_score();break;//按各科分数和部分排序
			case 54: return;//返回上层
		}
	}	
}
void change_tea_password(int i)
{
	while(1)
		{
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,2);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改为初始密码!",1,2);
				continue;
			}
			strcpy(teacher[i].code,new_code);
			puts("输入成功");
			anykey_continue();
			break;
		}
}
void teacher_interface_son(int i)
{
	if(0==strcmp(teacher[i].code,"123456"))
	{
		system("clear");
		while(1)
		{
			show_msg("第一次登入请修改密码,密码不能为初始值",1,2);
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,2);
				continue;
			}
			strcpy(teacher[i].code,new_code);
			show_msg("输入成功",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
	system("clear");
	printf("--------教师界面--------\n");
	printf("工号:%d\n",teacher[i].number);
	printf("性别:%s\n",teacher[i].sex=='1'?"男":"女");
	printf("姓名:%s\n",teacher[i].name);
	printf("年龄:%ld\n",(time(NULL)/(SUM_SEC))+1970-teacher[i].year);
	printf("工龄:%ld\n",(time(NULL)/(SUM_SEC))+1970-teacher[i].work_year);
	printf("1、学生信息管理:\n");
	printf("2、学生成绩管理:\n");
	printf("3、修改登入密码:\n");
	printf("4、返回主菜单:\n");
	switch(getch())
			{
				case 49:student_information_management();break;
				case 50:student_achievement_management();break;
				case 51:printf("修改登入密码\n");change_tea_password(i);;break;
				case 52:printf("返回主菜单\n");return;break;
			}
	}
}

6、admin.c

主要是管理员界面等信息显示及其功能函数

#include"common.h"
void admin_interface_son(int i);
int _find_teacher_num( int key);//寻找老师工号
char *_find_teacher_name(char* name,char* key);//寻找教师姓名
void _show_teacher(int key,int b);//显示教师信息
void add_teacher(void);//增加教师(可能需要修改)
void del_teacher(void);//删除教师
void modify_teacher(void);//修改教师信息
void reset_teacher_code(void);//重置教师密码
void unlock_teacher_account(void);//解锁教师账号
void find_teacher_name(void);//按姓名查找教师
void show_01_teacher(void);//显示在职教师
void show_2_teacher(void);//显示离职教师
void teacher_information_management(void);//教师信息管理
void change_adm_password(int i);
int _find_teacher_num( int key)//寻找老师工号
{
	for(int i=0 ;i<teacher_count;i++)
	{
		if(teacher[i].number==key && teacher[i].state != '2')
		{
			return i;
		}
	}
	return -1;
}
char *_find_teacher_name(char* name,char* key)//寻找教师姓名
{
	int count=0;
	for(int i=0;i < teacher_count;i++)
	{
		if(0==strcmp(teacher[i].name,name) && (teacher[i].state=='0'|| teacher[i].state=='1'))
		{
			key[count]=i+'0';
			count++;
		}
	}
	key[count]='\0';
	return key;
}
void _show_teacher(int key,int b)//显示教师信息
{
	system("clear");
	printf("工号:%4d ",teacher[key].number);
	printf("性别:%3s ",'1'==teacher[key].sex?"男":"女");
	printf("姓名:%4s \n",teacher[key].name);
	sleep(1);
}
void add_teacher(void)//增加教师(可能需要修改)
{
	system("clear");
	printf("----------增加教师---------\n");
	teacher_count++;
	int num=200000,sex=0;
	teacher[teacher_count-1].state='0';
	strcpy(teacher[teacher_count-1].code,"123456");
	teacher[teacher_count-1].number=num+teacher_count;

	printf("请输入姓名:\n");
	gets(teacher[teacher_count-1].name);
	while(1)
	{	
		printf("请输入性别1.男 2.女\n");
		sex=getch();
		if(sex==49||sex==50)
		{
			printf("%s\n",sex==49?"男":"女");
			teacher[teacher_count-1].sex=sex;
			break;
		}
		else
		show_msg("性别输入错误!",1,2);
	}
	printf("请输入出生年份:\n");
	scanf("%d",&teacher[teacher_count-1].year);
	printf("请输入参加工作的年份:\n");
	scanf("%d",&teacher[teacher_count-1].work_year);
	show_msg("添加成功!",1,1);
		
}
void del_teacher(void)//删除教师
{
	system("clear");
	int key=0;int num=0;int yes;
	printf("----------删除教师---------\n");
	printf("请输入需删除教师的工号\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("该教师工号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			_show_teacher(num,0);
			show_msg("是否继续删除?y/n",1,2);
			yes=getch();
			if(yes==121 || yes==89)
			{	
				teacher[num].state='2';
				show_msg("删除成功!",1,1);
				break;
			}
			else
			{
				printf("输入工号:\n");
			}
		}	
	}
	sleep(1);
}
void modify_teacher(void)//修改教师信息
{
	system("clear");
	int key=0;int num=0;char name[20];int year=0;int yes=0;
	printf("----------修改信息---------\n");
	printf("请输入需修改教师的工号\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("该教师工号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			printf("输入修改的姓名:\n");
			strcpy(teacher[num].name,gets(name));
			
			printf("输入入职年份:\n");
			scanf("%d",&year);
			teacher[num].year=year;
			show_msg("修改成功!",1,1);
			break;
		}
	}
	sleep(1);
}
void reset_teacher_code(void)//重置教师密码
{
	system("clear");
	int key=0;int num=0;int yes=0;
	printf("----------重置密码----------\n");
	printf("请输入需要重置密码教师的工号\n");
	while(1)
	{
		scanf("%d",&key);
		getchar();
		num=_find_teacher_num(key);
		if(-1==num)
		{
			show_msg("该教师工号不存在!",1,0);
			show_msg("是否重新输入?y/n",1,2);
			yes=getch();
			if(121==yes || 89==yes)
			{	continue; }
			else
			{   break;    }	
		}
		else
		{
			strcpy(teacher[num].code,"123456");
			show_msg("修改成功!",1,1);
			break;
		}
	}	
	sleep(1);
}
void unlock_teacher_account(void)//解锁教师账号
{
	system("clear");
	int key=0;
	printf("----------解锁账号----------\n");
	while(1)
	{	
		printf("请输入需要解锁账号的教师的工号:\n");
		scanf("%d",&key);
		getchar();
		for(int i=0 ;i<teacher_count;i++)
		{
			if(teacher[i].number==key && teacher[i].state == '1')
			{
				teacher[i].state= '0';
				show_msg("解锁成功!",1,1);
				anykey_continue();
				return;
			}
		}
		show_msg("查无此人",1,0);
		return;
	}
}
void find_teacher_name(void)//按姓名查找教师
{
	system("clear");
	char key[100]={};char name[20];int num=0;
	printf("----------按姓名查找----------\n");
	while(1)
	{
		printf("请输入需要查找人姓名:\n");
		gets(name);
		_find_teacher_name(name,key);
		num=strlen(key);
		if(num==0)
		{
			show_msg("查无此人",1,0);
			return;
		}
		for(int i=0;i<num;i++)
		{
			printf("工号:%4d ",teacher[key[i]-'0'].number);
			printf("姓名:%4s ",teacher[key[i]-'0'].name);
			printf("性别:%3s \n",'1'==teacher[key[i]-'0'].sex?"男":"女");
		}
		show_msg("是否结束查找?y/n",1,2);
		num=getch();
		if(num==121 ||num==89)
		{
			break;
		}
	}

}
void show_01_teacher(void)//显示在职教师
{
	system("clear");
	char key[500];int num=0;
	printf("----------显示在职教师---------\n");
	for(int i=0;i<teacher_count;i++)
	{
		if(teacher[i].state!='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	key[num]='\0';
	for(int i=0;i<num;i++)
	{
		printf("工号:%4d ",teacher[key[i]-'0'].number);
		printf("姓名:%4s ",teacher[key[i]-'0'].name);
		printf("性别:%3s\n",'1'==teacher[key[i]-'0'].sex?"男":"女");
	}
	show_msg("按任意键继续!",1,2);
	getch();
	
}
void show_2_teacher(void)//显示离职教师
{
	system("clear");
	char key[500];int num=0;
	printf("----------显示离职教师---------\n");
	for(int i=0;i<teacher_count;i++)
	{
		if(teacher[i].state=='2')
		{
			key[num]=i+'0';
			num++;
		}
	}
	key[num]='\0';
	for(int i=0;i<num;i++)
	{
		printf("工号:%4d ",teacher[key[i]-'0'].number);
		printf("姓名:%4s ",teacher[key[i]-'0'].name);
		printf("性别:%3s\n",'1'==teacher[key[i]-'0'].sex?"男":"女");
	}
	show_msg("按任意键继续!",1,2);
	getch();
}
void teacher_information_management(void)//教师信息管理
{
	while(1)
	{
		system("clear");
		printf("-------------教师信息管理--------------\n");
		puts("1.添加教师");
		puts("2.删除教师");
		puts("3.修改教师基本信息");
		puts("4.重置教师密码");
		puts("5.解锁教师账号");
		puts("6.根据姓名查询教师基本信息");
		puts("7.显示所有在职教师");
		puts("8.显示所有离职教师");
		puts("9.返回上层");
		switch(getch())
			{
				case 49: add_teacher();break;
				case 50: del_teacher();break;
				case 51: modify_teacher();break;
				case 52: reset_teacher_code();break;
				case 53: unlock_teacher_account();break;
				case 54: find_teacher_name();break;
				case 55: show_01_teacher();break;
				case 56: show_2_teacher();break;
				case 57: return;
			}
	}
}
void change_adm_password(int i)
{
	while(1)
		{
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,0);
				continue;
			}
			if(0==strcmp(new_code,"123456"))
			{
				show_msg("不能修改为初始密码!",1,0);
				continue;
			}
			strcpy(admin[i].code,new_code);
			show_msg("输入成功!",1,1);
			anykey_continue();
			break;
		}
}
void admin_interface_son(int num)
{
	if(0==strcmp(admin[num].code,"123456"))
	{
		system("clear");
		while(1)
		{
			puts("第一次登入请修改密码,密码不能为初始值");
			printf("请输入新密码:");
			char new_code[20];
			password_input(new_code);
			if(0==password_rule(new_code))
			{
				show_msg("密码格式错误",1,0);
				continue;
			}
			strcpy(admin[num].code,new_code);
			show_msg("输入成功!",1,1);
			anykey_continue();
			break;
		}
	}
	while(1)
	{
	system("clear");
	printf("--------管理员界面--------\n");
	printf("工号:%d\n",admin[num].number);
	printf("姓名:%s\n",admin[num].name);
	printf("-------------------------\n");
	printf("1、教师信息管理:\n");
	printf("2、修改登入密码:\n");
	printf("3、返回主菜单:\n");
	switch(getch())
			{
				case 49:teacher_information_management();break;
				case 50:printf("修改登入密码\n");change_adm_password(num);;break;
				case 51:printf("返回主菜单\n");return;break;
			}
	}
}

7.sup_admin.c

主要是超级管理员界面及其功能函数

#include"common.h"
void adm_add(void);//添加或删除管理员函数
int adm_sec_num(int num);//通过工号查找编号
void super_administrators_interface_son(void);//界面函数
int adm_sec_num(int num)
{
	for(int i=0;i<adm_count;i++)
	{
		if(admin[i].state!='2' && num == admin[i].number)
		return i;
	}
	return -1;
}
void replace_adm(void)
{
	puts("输入要重置密码的管理员的工号:");
	int num=0;
	scanf("%d",&num);
	getchar();
	int index=adm_sec_num(num);
	if(-1==index)
	{
		show_msg("查无此管理员",1,0);
		anykey_continue();
	}
	else
	{
		strcpy(admin[index].code,"123456");
		show_msg("重置密码成功",1,1);
		anykey_continue();
	}
	
}
void unlock_adm(void)
{
	puts("输入要解锁的管理员的工号:");
	int num=0;
	scanf("%d",&num);
	getchar();
	int index=adm_sec_num(num);
	if(-1==index)
	{
		show_msg("查无此管理员",1,0);
		anykey_continue();
	}
	else
	{
		admin[index].state='0';
		show_msg("解锁成功",1,1);
		anykey_continue();
	}
}
void list_adm(void)
{
	system("clear");
	for(int i=0;i<adm_count;i++)
	{
		if(admin[i].state=='2')
		continue;
		else
		printf("姓名:%s 工号:%d\n",admin[i].name,admin[i].number);
	}
	anykey_continue();
	
}
void super_administrators_interface_son(void)
{
	while(1)
	{
		system("clear");
		puts("1.添加或删除管理员");
		puts("2.重置管理员密码");
		puts("3.解锁管理员账号");
		puts("4.显示所有管理员");
		puts("5.返回上级菜单");
		switch(getch())
		{
			case 49:adm_add();;break;
			case 50:replace_adm();;break;
			case 51:unlock_adm();;break;
			case 52:list_adm();;break;
			case 53:return;		
		}
	}
}
void adm_add(void)
{
	system("clear");
	puts("1.添加管理员");
	puts("2.删除管理员");
	puts("3.返回上级菜单");
	while(1)
	{
		int num=0;
		switch(getch())
			{
				case 49:
						system("clear");
						printf("----------增加管理员---------\n");
						adm_count++;
						int num=300000,sex=0;
						admin[adm_count-1].state='0';
						strcpy(admin[adm_count-1].code,"123456");
						admin[adm_count-1].number=num+adm_count;

						printf("请输入姓名:\n");
						gets(admin[adm_count-1].name);
						while(1)
						{	
							printf("请输入性别1.男 2.女\n");
							sex=getch();
							if(sex==49||sex==50)
							{
								printf("%s\n",sex==49?"男":"女");
								admin[adm_count-1].sex=sex;
								break;
							}
							else
							show_msg("性别输入错误!",1,0);
						}
						printf("请输入出生年份:\n");
						scanf("%d",&admin[adm_count-1].year);
						show_msg("添加成功!",1,1);
						sleep(1);	
				return;
						;break;
				case 50:
				puts("请输入要删除的管理员的工号:");
				scanf("%d",&num);
				getchar();
				int index=adm_sec_num(num);
				if(-1==index)
				{
					show_msg("查无此管理员!",1,0);
					anykey_continue();
					return;
				}
				else
				{
					admin[index].state='2';
					show_msg("删除成功!",1,1);
					anykey_continue();
					return;
				}
						;break;	
				case 51:return;break;
			}
	}
}

总结

整个系统不是我一个人完成的,是三个人合力完成的。在编写代码的时候会发现很多的问题。
比如:

1、函数以及变量名要先统一好,否则一人一个变量名等到整合时会很难受的。
2、会有很多编译错误和编译警告,其中比较多的是数组数据越界导致的段错误。
3、教师和管理员功能类似,不过在移植后发现很多的问题源代码出现的问题移植过去之后也会产生问题,修改起来就特别麻烦。
所以在之后的学习合作中要:
1、多写注释,方便其他人阅读,和时间久了防止自己忘记。
2、做好及时的沟通交流。
3、结对编程很重要。
4、思维和逻辑灵活,不要把事情搞复杂,往简单方面想。
5、在写项目中学习,遇到问题学会分析,一起讨论一起解决,学习新的知识,和对原来理解的拓展和更新。

猜你喜欢

转载自blog.csdn.net/qq_15345177/article/details/84942435
今日推荐