学生管理系统收获

学生成绩信息管理系统收获

这次的学生信息管理系统,锻炼了我对C语言知识的运用,我在其中负责的是老师的功能的实现以及文件读写的实现

  • 教师信息包括:工号、密码、姓名、性别、年龄、工龄学生信息管理:
    1. 添加学生,单个添加或批量添加
    2. 删除学生,删除后的学生记作退学学生修改学生基本信息
    3. 重置学生密码解锁学生帐号
    4. 根据姓名查询学生基本信息显示所有在读学生
    5. 显示所有退学学生
  • 学生成绩管理:
    1. 录入学生成绩,单个录入或指导入修改学生成绩
    2. 根据学号或姓名查询学生成绩按各科分数和部分排序
    3. 修改登陆密码

以下是我文件读写功能实现的代码,在main函数开始时从文件读进管理员、教师、学生结构体,在程序退出时保存到文件中

//读取文件中的信息
	FILE* stu_r=fopen("stu.txt","r");
	if(stu_r==NULL)
	{
		perror("fopen");
		return 0;
	}
	fseek(stu_r,0,SEEK_END);
	long ret_stu=ftell(stu_r);
	rewind(stu_r);
	stu_count=ret_stu/sizeof(student);
	for(int i=0;i<stu_count;i++)
	{
		fread(&stu[i],sizeof(student),1,stu_r);
	}
	fclose(stu_r);
	stu_r=NULL;
	FILE* tea_r=fopen("tea.txt","r");
	if(tea_r==NULL)
	{
		perror("fopen");
		return 0;
	}
	fseek(tea_r,0,SEEK_END);
	long ret_tea=ftell(tea_r);
	rewind(tea_r);
	tea_count=ret_tea/sizeof(teacher);
	for(int i=0;i<tea_count;i++)
	{
		fread(&tea[i],sizeof(teacher),1,tea_r);
	}
	fclose(tea_r);
	tea_r=NULL;
	FILE* ma_r=fopen("ma.txt","r");
	if(ma_r==NULL)
	{
		perror("fopen");
		return 0;
	}
	fseek(ma_r,0,SEEK_END);
	long ret_ma=ftell(ma_r);
	rewind(ma_r);
	ma_count=ret_ma/sizeof(manager);
	for(int i=0;i<ma_count;i++)
	{
		fread(&ma[i],sizeof(manager),1,ma_r);
	}
	fclose(ma_r);
	ma_r=NULL;
//退出登录
void quit(void)
{	
	FILE* stu_w=fopen("stu.txt","w");
	if(stu_w==NULL)
	{
		perror("fopen");
		return;
	}
	for(int i=0;i<stu_count;i++)
	{
		fwrite(&stu[i],sizeof(student),1,stu_w);
	}
	fclose(stu_w);
	stu_w=NULL;
	FILE* tea_w=fopen("tea.txt","w");
	if(tea_w==NULL)
	{
		perror("fopen");
		return;
	}
	for(int i=0;i<tea_count;i++)
	{
		fwrite(&tea[i],sizeof(teacher),1,tea_w);
	}
	fclose(tea_w);
	tea_w=NULL;
	FILE* ma_w=fopen("ma.txt","w");
	if(ma_w==NULL)
	{
		perror("fopen");
		return;
	}
	for(int i=0;i<ma_count;i++)
	{
		fwrite(&ma[i],sizeof(manager),1,ma_w);
	}
	fclose(ma_w);
	return;
}	

在我开始写读写文件这一部分时,也遇到过一些问题,我直接把结构体字节数出来写到代码中去了,这会导致之后不能再往结构体中添加新的成员了,所以我改变了写法

下面是我负责的老师批量添加学生,批量添加分数的代码

//批量添加学生
void batch_add_student(void)
{
	system("clear");
	FILE *frp=fopen("batch_stu.txt","r");
	if(NULL==frp)
	{
		printf("打开文件失败
");
		return;
	}
	while(!feof(frp))
	{
		fscanf(frp,"%d %s %s %c %d %d %d %d %f %d %d %d %d %d %d %d
",&stu[stu_count].num,stu[stu_count].password,stu[stu_count].name,&stu[stu_count].sex,&stu[stu_count].age,&stu[stu_count].chinese,&stu[stu_count].math,&stu[stu_count].english,&stu[stu_count].avg,&stu[stu_count].sum,&stu[stu_count].rank_all,&stu[stu_count].rank_chinese,&stu[stu_count].rank_math,&stu[stu_count].rank_english,&stu[stu_count].index,&stu[stu_count].lock);
		if(stu_count!=0)
		{
			stu[stu_count].num=stu[stu_count-1].num+1;
		}
		stu_count++;
	}
	fclose(frp);
	frp=NULL;
	puts("导入成功");
	anykey_continue();
}
//批量添加分数
void batch_add_score(void)
{
	int i;
	system("clear");
	FILE *frp=fopen("batch_score.txt","r");
	if(NULL==frp)
	{
		printf("打开文件失败
");
		return;
	}
	for(i=0;i<stu_count;i++)
	{
		if(strcmp(stu[i].name,"杨万里")==0)
		{
			while(!feof(frp))
			{
				fscanf(frp,"%d %d %d
",&stu[i].chinese,&stu[i].math,&stu[i].english);
				if(stu[i].index==1)
				{
					stu[i].chinese=0;
					stu[i].math=0;
					stu[i].english=0;
				}
				i++;
				
			}
			break;
		}
	}
	fclose(frp);
	frp=NULL;
	puts("导入成功");
	anykey_continue();
}

使用了feof这个文件指针,在批量写入时我用到了fscanf这个函数

//隐藏密码函数
void hide(char *pass)
{
	for(int i = 0;i<10;i++)
	{
		pass[i] = getch();
		if(i==0 && 127==pass[i])
		{	
			i--;
			printf(" ");
			continue;
		}
		if(i>0&&127 == pass[i])
		{
			i-=2;	
			printf(" ");
			continue;
		}
		if('
' == pass[i])
		{
			pass[i] = '';
			break;
		}
		putchar('*');
	}
	printf("
");
}

这个是我写的隐藏密码的函数,其中是退格,在写这个时也是遇到过一些问题,例入为0时,会发生错误,最后我让它在为0时先减一,再退格打印空格再退格,就正常了

这次的这个项目也让我意识到了我的很多不足,我的框架搭建的就不是很好,有一些问题,但是也是通过这个项目学到了不少的知识

原文地址:https://www.cnblogs.com/xiwen2017/p/10129689.html