C语言学生管理系统(文件、链表)-(3)学生

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

续文章:
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;
}

总结

到这里整个系统就完成了,整个系统的显示可能还不够美观,代码的书写不够简洁,但是可以实现上述的所有功能,读者若有兴趣,可以尝试优化本人代码。
若哪里有误欢迎指正,本人还在学习中~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值