提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
续文章:
C语言学生管理系统(文件、链表)-(1)管理员
C语言学生管理系统(文件、链表)-(2)教师
提示:以下是本篇文章正文内容,下面案例可供参考
一、学生功能介绍
包含头文件:
#include"../inc/admin.h"
#include"../inc/student.h"
#include"../inc/teacher.h"
1.学生登录
读取文件内容匹配实现学生登录;
输出错误提示是否重新输入。
2.修改密码
实现文件和链表中信息的修改。
3.显示自身信息
通过文件操作显示;
不显示自身密码。
二、具体代码
1.学生菜单
代码如下:
void student_menu(long id,struct node2*head_s)
{
int flag=1;
int code;
while(flag)
{
printf("\n");
printf("**欢迎进入学生界面**\n");
printf("1.修改密码.\n");
printf("2.查看您的信息.\n");
printf("0.返回上一级.\n");
printf("**********************\n");
printf("请输入你的选择:");
scanf("%d",&code);
while(getchar()!='\n');
switch(code)
{
case 1:{
modify_student_password(head_s,id);
break;
}
case 2:{
show_s_info(id);
break;
}
case 0:{
flag=0;
break;
}
default:{
printf("输入有误,请重新输入:");
scanf("%d",&code);
while(getchar()!='\n');
break;
}
}
}
}
2.学生登录(main功能3)
代码如下:
/*
函数功能:读取学生
函数参数:学生结构体变量,要读取的学生学号
返回值:无
*/
void read_student(Stu*s,long id)
{
FILE *fp=NULL;
int ret;
fp=fopen("student.txt","r");//打开文件读取预存的账户和密码
assert(fp!=NULL);//判断文件是否已经打开
while(1)
{
ret=fscanf(fp,"%ld %s %s %u-%u-%u %s %lf %lf %lf\n",&(s->id),s->name,s->gender,&((s->birth).year),&((s->birth).month),&((s->birth).day),s->password,&(s->Math),&(s->Chinese),&(s->English));
if(s->id==id)
{
//printf("找到此人!\n");//测试
fclose(fp);
return;
}
if(ret<=0)
{
printf("查无此人!\n");
fclose(fp);
return;
}
}
}
/*
函数功能:学生登陆
函数参数:(用于记录输入的信息)
返回值:登陆成功返回1,失败返回0
函数说明:这里预设的学生的id会被修改
*/
bool login_student(long *id)
{
char password[15];
Stu s;//用于存放从文件读取的教师信息
int n=3;//最高重新输入的次数
char ch;//是否重新输入
//登陆,输入学号和密码
printf("请输入学号:");
scanf("%ld",id);//记录输入的学号
while(getchar()!='\n');
printf("请输入密码(最多15个字符或数字):");
scanf("%s",password);//记录输入的密码
while(getchar()!='\n');
read_student(&s,*id);//读取文件中的学生信息
while(s.id!=*id||strcmp(s.password,password)!=0)//如果输入与预存的不符合执行循环
{
printf("登陆失败!\n");
printf("您还有%d次重新输入的机会!\n",n);
printf("是否重新输入(y/n):");
scanf("%c",&ch);
while(getchar()!='\n');
if(ch=='n'||ch=='N')//判断是否重新输入
{
return false;
}
if(n==0)
{
return false;
}
printf("请输入学号:");
scanf("%ld",id);//记录输入的学号
while(getchar()!='\n');
printf("请输入密码:");
scanf("%s",password);//记录输入的密码
while(getchar()!='\n');
n--;
}
return true;
}
2.修改学生信息(student功能1)
代码如下:
/*
函数功能:修改文件中指定学生的登陆密码
函数参数:要修改的学生的学号(为了排除链表查找的影响直接用id),新的密码数组
返回值:无
函数说明:通过临时文件和结构体实现修改操作
*/
void modify_student_password_file(long id,char password[])
{
FILE *fp=NULL,*ft=NULL;
int ret1;
Stu s;
fp=fopen("student.txt","rt+");//读写方式打开一个文本文件,允许读写
ft=fopen("temp5.txt","wt");//以只写打开或建立一个文本文件,只允许写
assert(fp!=NULL&&ft!=NULL);
while(1)
{
ret1=fscanf(fp,"%ld %s %s %u-%u-%u %s %lf %lf %lf\n",&(s.id),s.name,s.gender,&((s.birth).year),&((s.birth).month),&((s.birth).day),s.password,&(s.Math),&(s.Chinese),&(s.English));
if(ret1<=0)
{
// printf("文件查无此人!\n");//测试
break;
}
if(s.id==id)
{
strcpy(s.password,password);
}
fprintf(ft,"%ld %s %s %u-%u-%u %s %lf %lf %lf\n",s.id,s.name,s.gender,(s.birth).year,(s.birth).month,(s.birth).day,s.password,s.Math,s.Chinese,s.English);
}
fclose(fp);
fclose(ft);
remove("student.txt");
rename("temp5.txt","student.txt");
//printf("文件修改成功!\n");//测试
return;
}
/*
函数功能:修改学生密码
函数参数:学生链表的头结点地址,要修改的学生id
返回值:无
*/
void modify_student_password(struct node2*head, long id)
{
//根据学号找到学生在链表中的位置
struct node2*p=head->next;
if(p==NULL)
{
printf("无学生信息!\n");
return;
}
while(p!=NULL)
{
if((p->stu).id==id)
{
break;
}
p=p->next;
}
if(p==NULL)
{
printf("学号有误,查无此人!\n");
return;
}
//修改学生链表中的内容
//保存新密码
char password[15];
printf("请输入新密码:");
scanf("%s",password);
while(getchar()!='\n');
strcpy((p->stu).password,password);
//修改学生文件内的内容
modify_student_password_file(id,password);
return;
}
2.显示学生信息(student功能2)
代码如下:
void show_s_info(long id)
{
FILE *fp=NULL;
int ret;
Stu s;
fp=fopen("student.txt","r");
assert(fp!=NULL);
while(1)
{
ret=fscanf(fp,"%ld %s %s %u-%u-%u %s %lf %lf %lf\n",&(s.id),s.name,s.gender,&((s.birth).year),&((s.birth).month),&((s.birth).day),s.password,&(s.Math),&(s.Chinese),&(s.English));
if(ret<=0)
{
break;
}
if(s.id==id)
{
printf("学号:%ld 姓名:%s 性别:%s 出生日期:%u-%u-%u 数学成绩:%1.1lf 语文成绩:%1.1lf 英语成绩:%1.1lf\n",s.id,s.name,s.gender,(s.birth).year,(s.birth).month,(s.birth).day,s.Math,s.Chinese,s.English);
break;
}
}
fclose(fp);
return;
}
总结
到这里整个系统就完成了,整个系统的显示可能还不够美观,代码的书写不够简洁,但是可以实现上述的所有功能,读者若有兴趣,可以尝试优化本人代码。
若哪里有误欢迎指正,本人还在学习中~~~