学生成绩管理 +教师人员管理 +管理员系统----------(结构体和文件读写相关的函数承接)【更新2】

学生管理系统项目总结分析(附代码)

一、项目要求

学生:
姓名 性别 学号 密码 语文 数学 英语
1、第一次登录强制修改密码。
2、查询成绩
排名 不显示姓名和学号、平均分、最高分、最低分
3、修改密码
4、查看个人信息
5、三次密码错误锁定帐号,由教师解锁
教师:
姓名 性别 工号 密码
1、第一次登录强制修改密码。
2、添加学生(学生的学号自动生成)
单个添加、批量导入
3、删除学生 输入两人次学号确定、删除的学生要记录保存在已退学的文件中
4、查找学生 按姓名查找、按学号查找
5、修改学生信息 修改学生基础信息、修改学生成绩
6、录入学生成绩 单个录入、批量导入
7、重置学生密码
8、显示所有在校学生信息
9、显示所有退出学生信息
10、三次密码错误锁定帐号,由校长解锁
校长:
1、第一次登录强制修改密码
2、能重置自己的密码
3、能重置教师密码
4、添加教师
5、删除教师
6、显示所有在职教师
7、显示所有离职教师

二、思考过程及反思

1、根据项目的要求,我们选择了数据结构和文件读写的这两个主要知识点,来作为解决问题途径;
2、按区块任务分配,分为主界面、学生、教师、管理员以及Makefile和部分工具函数;
3、后期发现由于用户名和密码设置不合理,输入过长后数组越界,会发生段错误,更改了密码的显示方式,优化了操作过程;
这是第一次和团队完成一个小项目,代码又臭又长,而且功能未完全实现,操作方式不统一,限制条件不充分,在过多输入时会发生段错误,仅供参考。后期我们团队会优化代码减少代码量。让代码更加简洁,方便阅读。本次只是上传代码,希望大家多多批评提出建议 感谢!!!)

三、简单代码在这里插入图片描述

管理员

#include"admin.h"
#include"tool.h"
#include"teacher.h"

//管理员账号
Admin adm={"xixi",'m',"9527","123456",0};

extern uint32_t id_a[2];
//修改自己的密码
void a_change_password_myself(void)
{
	char new[A_PASS];
	while(true)
	{
		printf("请输入新的密码:");
		get_passwd(new,A_PASS,false);
		if(islegal_pass(new))
		{
			strcpy(adm.password,new);
			printf("修改成功!!");
			anykey_continue();
			return;
		}
		else
		{
			printf("密码不合法,重新输入!!!");
			anykey_continue();
		}
	}
}

//重置自己的密码
//void a_reset_password_myself(void)
//{
//	printf("是否确定重置密码!!!!(y/n)");
//	char temp=getchar();
//	if(temp=='Y'||temp=='y')
//	{
//		strcpy(adm.password,"123456");
//		printf("初始化成功!!初始密码为123456");
//		anykey_continue();
//		return;
//	}
//}

//重置教师密码
void a_reset_password_teacher(void)
{
	uint32_t number;
	char new[T_PASS];
	printf("请输入要修改的教师的工号:");
    scanf("%d",&number);
	for(int i=0;i<T_COUNT;i++)
	{
		if(tea[i].number==number&&tea[i].sex!=0)
		{
			while(true)
			{
				printf("\n请输入修改后该教师的密码:");
				get_passwd(new,T_PASS,true);
				if(islegal_pass(new))
				{
					strcpy(tea[i].password,new);
					printf("修改成功!!!");
					anykey_continue();
					return;
				}
				else
				{
					printf("密码不合法,请重新输入!!!");
					anykey_continue();
				}
			}
		}
	}
	printf("未找到该教师,请重新确认后再进行修改!!!");
	anykey_continue();
	return;
}

//添加教师
void a_add_teacher(void)
{
	if(t_count>T_COUNT)
	{
		printf("vip可享受更多存储空间!!!");
		return;
	}
	int the_number=0;           
	for(int i=0;i<T_COUNT;i++)           //找到可以添加的空位
	{
		if(tea[i].sex==0)
		{
			the_number=i;
			break;
		}
	}
	char name[T_NAME];
	char sex;
	uint32_t number=0;
	printf("请输入教师姓名:");
	scanf("%s",name);
	strcpy(tea[the_number].name,name);
	printf("请输入教师性别: ");
	while(true)
	{
		scanf(" %c",&sex);
		if('w'==sex||'m'==sex)
		{
			tea[the_number].sex=sex;
			break;
		}
		printf("输入有误请重新输入!!!\n");
	}
	tea[the_number].number=id_a[0]++;
	tea[the_number].landing=0;
	tea[the_number].Account_status=1;
	printf("教师:%s 性别:%c 工号:%d\n\n",tea[the_number].name,
	tea[the_number].sex,tea[the_number].number);
	sscanf("123456","%s",tea[the_number].password);
	printf("录入成功----(^-^)\n\n");
	t_count++;
	anykey_continue();
}

//删除教师
void a_delete_teacher(void)
{
		uint32_t number=0;
	printf("请输入要删除的教师的工号:");
	scanf("%d",&number);
	for(int i=0;i<T_COUNT;i++)
	{
		if(tea[i].number==number&&tea[i].sex!=0)
		{
			//文件存储离职教师的信息
			//删除离职老师的信息
			FILE *fwp = fopen("downteacher.txt","a");
			if(NULL==fwp)
			{
				printf("文件打开失败!!");
				return;
			}
			fprintf(fwp,"%s %c %d",tea[i].name,tea[i].sex,tea[i].number);
			fclose(fwp);
			tea[i].sex=0;
			t_count--;
			printf("删除成功!!!");
			anykey_continue();
			return;
		}
	}
	printf("未找到该老师的工号!!");
	anykey_continue();
}

//显示所有在职教师
void a_show_in_teacher(void)
{
	for(int i=0;i<T_COUNT;i++)
	{
		if(tea[i].sex!=0)
		{
			printf("姓名:%s ",tea[i].name);
			printf("性别:%s ",tea[i].sex=='w'?"女":"男");
			printf("编号:%d\n",tea[i].number);
		}
	}
	anykey_continue();
}

//显示所有离职教师
void a_show_down_teacher(void)
{
	char name[T_NAME];
	char sex;
		uint32_t number=0;
	FILE *frp = fopen("downteacher.txt","r");
	FILE *fsw=fopen("stu_tec.txt","w");
	if(NULL==frp)
	{
		printf("文件打开失败!!");
		return;
	}
	if(NULL==fsw)
	{
		printf("文件打开失败!!");
		return;
	}
	while(!feof(frp))
	{
		fscanf(frp,"%s %c %d",name,&sex,&number);
		printf("姓名:%s 性别:%s 编号:%d\n",name,sex=='w'?"女":"男",number);
		anykey_continue();
	}
	fprintf(fsw,"%d %d",id_a[0],id_a[1]);
	fclose(frp);
}

//给教师解锁
void a_unlock(void)
{
	uint32_t number=0;

	printf("请输入要解锁的教师工号:");
	scanf("%d",&number);

	while(true)
	{
		for(int i=0;i<T_COUNT;i++)
		{
			if(tea[i].number==number&&tea[i].Account_status==0)
			{
				tea[i].Account_status=1;
				printf("解锁成功!!");
				anykey_continue();
				return;
			}
			else if(tea[i].number==number)
			{
				printf("你输入的教师状态为未锁定请重新确认!!");
				anykey_continue();
				return;
			}
		}
		printf("你找到工号不存在!!!");
		anykey_continue();
		return;
	}
}
//恢复出厂设置
void clean_storage()
{
	printf("恢复出厂设置以就绪\n\n");

	char number[A_NUMBER];
	char pd[A_PASS];
	do
	{   printf("请输入管理员帐号:\n");
		get_number(number,A_NUMBER);
		printf("请输入管理员密码:\n");
		get_passwd( pd,A_PASS,true);
	}while(!strcmp(number,adm.number)&&strcmp(pd,adm.password));
	t_count=0;
	init_storage();
	 anykey_continue();
}

学生

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<getch.h>
#include"student.h"
#include"tool.h"

Student stu[S_COUNT];
Student s;

int s_position=0;
int s_count=0;

void sorce(void)
{
	//记录排名
	int ranking=1;
	int max=-1,min=101;
	for(int i=0;i<S_COUNT;i++)
	{
		if(stu[i].sex!=0)
		{
			//计算个人总分
	 	    stu[i].sum=stu[i].math+stu[i].chinese+stu[i].english;
			//查找最大 最小
			if(stu[i].sum>max) max=stu[i].sum;
			if(stu[i].sum<min) min=stu[i].sum;
			//计算排名
			if(s.sum<stu[i].sum) ranking++;
		}
	}	
	printf("1.排名 2.平均分 3.最高分 4.最低分\n");
        printf("请输入你需要查询的内容\n");
     //成绩查询功能
	switch(getch())
	{
		case '1':printf("\n你的排名为:%d",ranking);
		anykey_continue();
		break;
		case '2':printf("\n你的平均分为:%d",s.sum/3);
		anykey_continue();
		break;
		case '3':printf("\n最高分为:%d",max);
		anykey_continue();
		break;
		case '4':printf("\n最低分为:%d",min);
		anykey_continue();
		break;
		case '5':break;
	}
}


//更改密码
void Pass(void)
{
	char pass1[S_PASS],pass2[S_PASS],pass3[S_PASS];
	for(;;)
	{
		printf("输入原密码:\n");
                get_passwd(pass1,S_PASS,true);
		//判断密码是否和登入密码相同
		if(strcmp(pass1,s.password)==0)
		{
			//输入两个要修改的密码
			printf("输入要更改的密码(6~20位密码):\n");
			get_passwd(pass2,S_PASS,true);
			printf("\n确认要修改的密码:\n");
			get_passwd(pass3,S_PASS,true);
			//判断两个密码是否合法相等
			if(islegal_pass(pass2)&&islegal_pass(pass3)&&!strcmp(pass2,pass3))
			{
				//更新结构体内容,修改密码成功跳出循环
				strcpy(s.password,pass3);
                for(int i=0;i<S_COUNT;i++)
			    {
			    	if(s.number==stu[i].number)
				    {
					   stu[i]=s;
					   stu[i].landing=1;
				    }
			    }
			    printf("修改成功,请妥善保存密码\n");
				anykey_continue();
				return;
			}
			//返回循环,重新修改
			else
			{
				printf("密码不合法或者两次密码不相同\n");
				anykey_continue();
				continue;
			}
		}
		//返回循环,重新修改
		else
	    {
    	    printf("原密码错误重新输入:\n");
			continue;
        }
    }		
}

void Allmessage(void)
{
     for(int i=0;i<S_COUNT;i++)	        
     {
         if(s.number==stu[i].number)
         {
             printf("姓名:%s 性别:%c 学号:%d 语文:%d 数学:%d 英语:%d\n",stu[i].name,stu[i].sex,stu[i].number,stu[i].chinese,stu[i].math,stu[i].english);
			anykey_continue();
         }
      }
}

教师

#include<stdio.h>
#include<stdbool.h>
#include"tool.h"
#include"teacher.h"
#include"student.h"
Teacher tea[T_COUNT];
Teacher t;
	
int t_position=0;
int t_count=0;
uint32_t id_a[2]={200000,300000};//教师和学生的初始工号
int index_stu=0;


//添加学生
bool t_add_stu(void)
{
		
	if (s_count >= S_COUNT)
	return false;
	printf("请选择你要添加的方式\n");
	printf("1、单个添加\n");
	printf("2、批量导入\n");
	printf("3、退出添加\n");
	char ch;
	do
	{
		scanf("%c", &ch);
		if (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch)
		{
			printf("输入错误请重新输入\n\n");
		}
		
	} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch);

	//单个添加
	if (CHOOSE_ONE == ch)
	{
		int i = 0;

		while (0 != stu[i].sex)i++;

		Student s;

		do
		{
			printf("请输入你要添加的学生的姓名\n\n");
			scanf("%s", s.name);
			
			printf("请输入你要添加的学生的性别\n\n");
			scanf(" %c", &s.sex);

		} while (!is_legalstu(s));
		printf("--------------\n");
		s.number=id_a[1]++;
		printf("学生:%s,性别:%c,学号:%d\n",s.name,s.sex,s.number);
		init_stu( &s);
		stu[i] = s;
	}
	//通过文件批量添加
	else if (CHOOSE_TWO == ch)
	{
		printf("请输入你要添加的文件的路径\n\n");
		char path[T_FILE];
		get_number(path,T_FILE);
		int cnt = 0;
		FILE* f = fopen(path, "a");
		if (NULL == f)
		{
			printf("文件路径错误!!!\n");
			return false;
		}
		int i = 0;
		while (!feof(f)) 
		{
			fscanf(f, "%s %c%d", stu[i].name,&stu[i].sex,&stu[i].number);//学生的姓名 性别和学号的批量录入
			
			if(!islegal_id(stu[i].number))
			{
				stu[i].number=id_a[1]++;
			}
				 
			init_stu(&s);
			i++;
			if (i >= s_count)
			{
			    s_count++;
			    //
			}
			if(s_count>=S_COUNT)
			{
				 full_capcity();
			}

		}
	}
	//退出
	else if (CHOOSE_THREE == ch)
	{
		printf("正在退出");
		fflush(stdout);
		usleep(1000);
		return false;
	}
	printf("添加成功----(^-^)\n\n");
	return true;
}

//查找学生
bool t_search_stu(void)
{
	printf("请选择你要查找的方式\n");
				printf("1、姓名查找\n");
				printf("2、学号查找\n");
				printf("3、退出查找\n");
				char  ch;
				do
				{
					scanf(" %c",&ch);
					if(CHOOSE_ONE!=ch&&CHOOSE_TWO!=ch&&CHOOSE_THREE!=ch)
					{
						printf("输入错误请重新输入\n\n");
					}
				}while(CHOOSE_ONE!=ch&&CHOOSE_TWO!=ch&&CHOOSE_THREE!=ch);

				//按照姓名查找
				if(CHOOSE_ONE==ch)
				{
					printf("请输入你要查找的学生的姓名\n\n");
					char name[S_NAME];
					scanf("%s",name);
					for(int i=0;i<S_COUNT;i++)
					{
						if(0==strcmp(name,stu[i].name)&&stu[i].sex!=0)
						{
							 index_stu=i; 
							 printf("查找成功----(^-^)\n\n");
							return true;
						}
					}
				}
				//按学号查找
				else if (CHOOSE_TWO==ch)
				{
					
					int number;
					do
					{
						printf("请输入你要查找的学生的学号\n\n");
						scanf("%d",&number);
						
					}while(!islegal_id(number));
					
					for(int i=0;i<S_COUNT;i++)
					{
						if(number==stu[i].number&&stu[i].sex!=0)
						{
							index_stu=i; 
							printf("查找成功----(^-^)\n\n");
							return true;
						}
					}
				}
				//退出
				else if(CHOOSE_THREE==ch)
				{
					printf("正在退出");
					fflush(stdout);
					usleep(1000);
					return false;
				}
				printf("查找失败---('-')!!!\n\n");
				return false;
		}


//显示查找到的学生
void t_psearch_stu(void)
{
	if(!t_search_stu()) return ;
    printf("姓名:%s ",stu[index_stu].name);
	printf("性别:%c ",stu[index_stu].sex);
	printf("学号:%d ",stu[index_stu].number);
	printf("语文:%3d ",stu[index_stu].chinese);
	printf("英语:%3d ",stu[index_stu].english);
	printf("数学:%3d\n",stu[index_stu].math);
}

//删除学生
bool t_delete_stu(void) 
{
	printf("查找你要删除的学生的信息\n");

	if (!t_search_stu())
	{
		printf("删除失败---('-')!!!\n\n");
		return false;
	}
    printf("您所要删除的学生信息:姓名:%s 学号:%d\n\n",stu[index_stu].name,stu[index_stu].number);
	int cnt = 1;
	int err_cnt=0;
    int numbers;

	while (cnt <= 2)
	{
		printf("请输入学号加以确认,第%d次: \n", cnt);
		scanf("%d",&numbers);
		cnt++;
		if (numbers!=stu[index_stu].number&&stu[index_stu].sex)
		{
			cnt--;
			err_cnt++;
		}
		if(err_cnt==3)
		{
			printf("学号输入错误超过三次,退出删除操作\n\n");
			return false;
		}
	}
	
	FILE* ds = fopen("downstudent.txt", "a");
	if (NULL == ds)
	{
		perror("fopen:");
		return false;
	}
  	//将失足学生打入到退学学生标表中
	fprintf(ds, "%s %c %d\n", stu[index_stu].name,
	stu[index_stu].sex, stu[index_stu].number);
	
	fclose(ds);
	stu[index_stu].sex =0;
	//更新两张表
	
	printf("删除成功----(^-^)\n\n");
	
	return true;
}

//重置学生密码
bool t_reset_stu_pass(void)
{
	printf("请选择你要重置密码的学生\n");
	if (!t_search_stu())
	{
		printf("重置密码失败!!!\n\n");
		return false;
	}
	strcpy(stu[index_stu].password, "123456");
	printf("重置为:%s\n\n","123456");
	printf("重置成功----(^-^)\n\n");
	return true;
}

//显示所有在校学生
void t_show_stu(void)
{
    int cnt=0;
	for ( int i = 0; i < S_COUNT; i++)
	{
		if (0 != stu[i].sex)
		{
			printf("姓名:%s ",stu[i].name);
			printf("性别:%s ",stu[i].sex == 'w' ? "女" : "男");
			printf("学号:%d ",stu[i].number);
			printf("语文:%d ",stu[i].chinese);
			printf("数学:%d ",stu[i].math);
			printf("英语:%d\n",stu[i].english);
			cnt++;
		}
	}
	if(!cnt)
	{
		printf("一大波学生正在赶来的路上,请老师准备接收----(^+^)\n\n");
	}
}


//录入学生成绩
bool t_import_stu_score()
{
	printf("请选择你要添加的方式\n");
	printf("1、单个录入\n");
	printf("2、退出录入\n");

	char  ch;

	do
	{
		scanf("%c", &ch);

		if (CHOOSE_ONE != ch && CHOOSE_TWO != ch)
		{
			printf("输入错误请重新输入\n");
		}
	} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch);
	
	//单个录入
	if (CHOOSE_ONE == ch)
	{
		printf("请选择你要录入成绩的对象\n");

		if (!t_search_stu())
		{
			printf("录入失败\n");
			return false;
		}

		int flag = 1;

		do
		{
			flag = 0;

			printf("输入学生的语文成绩\n");
			scanf("%d", &stu[index_stu].chinese);
			if(!legal_chinese_score( stu[index_stu].chinese))
			{
			 	flag=1;
			 	continue;
			}

			printf("输入学生的英语成绩\n");
			scanf("%d", &stu[index_stu].english);
			if(!legal_english_score(stu[index_stu].english ))
			{
			 	flag=1;
			 	continue;
			}
	
			printf("输入学生的数学成绩\n");
			scanf("%d", &stu[index_stu].math);
			if(!legal_math_score( stu[index_stu].math))
			{
			 	flag=1;
			 	continue;
			}
		} while (flag);

		printf("录入成功----(^-^)\n\n");
		return true;
	}
	//退出录入
	else if (CHOOSE_TWO == ch)
	{
		printf("正在退出");
		fflush(stdout);
		usleep(1000);
		return false;
	}

	return false;
}

//显示退出学生
void t_show_drop_stu()
{
	Student s;
	FILE* f = fopen("downstudent.txt", "r");
	while (!feof(f))
	{
		fscanf(f, "%s %c %d\n", s.name,&s.sex, &s.number);
		printf("姓名:%s ",s.name);
		printf("性别:%s ",s.sex == 'w' ? "女" : "男");
		printf("学号:%d\n",s.number);
	}
	fclose(f);
}

//修改学生信息
bool t_modify_stu()
{
	printf("请输入你要修改的学生信息\n");
	if (!t_search_stu())
	{
		printf("修改失败\n");
		return false;
	}
	printf("请选择你要修改信息\n");
	printf("1、学生基础信息修改\n");
	printf("2、学生成绩修改\n");
	printf("3、退出修改\n");
	char  ch;
	do
	{
		scanf(" %c", &ch);                       //菜单界面选项的判断
		if (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch)
		{
			printf("输入错误请重新输入\n");
		}
		
	} while (CHOOSE_ONE != ch && CHOOSE_TWO != ch && CHOOSE_THREE != ch);

	//学生基础信息修改
	if (CHOOSE_ONE == ch)
	{
		
		do
		{
			printf("请输入你要修改的学生的姓名\n");
			scanf("%s", stu[index_stu].name);
			
			printf("请输入你要修改的学生的性别\n");
			scanf(" %c", &stu[index_stu].sex);
			
			printf("请输入你要修改的学生的密码\n");
			get_passwd(stu[index_stu].password,S_PASS,true);
			if (!islegal_pass(stu[index_stu].password))
			{
				printf("学生密码错误\n");
				continue;
			}
					
		} while (!is_legalstu(stu[index_stu]));
		printf("修改成功----(^-^)\n\n");
	}
	//学生成绩修改
	else if (CHOOSE_TWO == ch)
	{
		int flag = 1;
		do
		{
			flag = 0;
			printf("输入学生的语文成绩\n");
			scanf("%d", &stu[index_stu].chinese);
			if(!legal_chinese_score( stu[index_stu].chinese))
			{
			 	flag=1;
			 	continue;
			}

			printf("输入学生的英语成绩\n");
			scanf("%d", &stu[index_stu].english);
			if(!legal_english_score(stu[index_stu].english ))
			{
			 	flag=1;
			 	continue;
			}
	
			printf("输入学生的数学成绩\n");
			scanf("%d", &stu[index_stu].math);
			if(!legal_math_score( stu[index_stu].math))
			{
			 	flag=1;
			 	continue;
			}
			
		} while (flag);
		printf("修改成功----(^-^)\n\n");
	}
	//退出
	else if (CHOOSE_THREE == ch)
	{
		printf("正在退出");
		fflush(stdout);
		usleep(1000);
		return false;
	}
	return false;

}

//给学生解锁
void t_unlock(void)
{
	int number;
	printf("请输入要解锁的学生学号:");
	scanf("%d",&number);
	while(true)
	{
		for(int i=0;i<S_COUNT;i++)
		{
			if(stu[i].number==number)              //改过
			{
				if(stu[i].Account_status==0)
				{
					stu[i].Account_status=1;
					printf("解锁成功----(^-^)");
					anykey_continue();
					return;
				}
				else
				{
					printf("你输入的学生状态为未锁定请重新确认!!");
					anykey_continue();
					return;
				}
			}
		}
		printf("你找到学号不存在----(*+*)");
		anykey_continue();
		return;
	}
}

具体代码以及头文件请见
https://github.com/8mybug/kuku/tree/master/studentGitHub库文件

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值