学生成绩信息管理系统收获
这次的学生信息管理系统,锻炼了我对C语言知识的运用,我在其中负责的是老师的功能的实现以及文件读写的实现
- 教师信息包括:工号、密码、姓名、性别、年龄、工龄学生信息管理:
- 添加学生,单个添加或批量添加
- 删除学生,删除后的学生记作退学学生修改学生基本信息
- 重置学生密码解锁学生帐号
- 根据姓名查询学生基本信息显示所有在读学生
- 显示所有退学学生
- 学生成绩管理:
- 录入学生成绩,单个录入或指导入修改学生成绩
- 根据学号或姓名查询学生成绩按各科分数和部分排序
- 修改登陆密码
以下是我文件读写功能实现的代码,在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("打开文件失败\n");
return;
}
while(!feof(frp))
{
fscanf(frp,"%d %s %s %c %d %d %d %d %f %d %d %d %d %d %d %d\n",&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("打开文件失败\n");
return;
}
for(i=0;i<stu_count;i++)
{
if(strcmp(stu[i].name,"杨万里")==0)
{
while(!feof(frp))
{
fscanf(frp,"%d %d %d\n",&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("\b \b");
continue;
}
if(i>0&&127 == pass[i])
{
i-=2;
printf("\b \b");
continue;
}
if('\n' == pass[i])
{
pass[i] = '\0';
break;
}
putchar('*');
}
printf("\n");
}
这个是我写的隐藏密码的函数,其中\b是退格,在写这个时也是遇到过一些问题,例入为0时,会发生错误,最后我让它在为0时先减一,再退格打印空格再退格,就正常了
这次的这个项目也让我意识到了我的很多不足,我的框架搭建的就不是很好,有一些问题,但是也是通过这个项目学到了不少的知识