关于学生管理系统(注册,登录,学生端)

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


前言

这里是学生管理系统的一些小模块的实现:


提示:以下是本篇文章正文内容,下面案例可供参考

一、注册模块

注册模块应该怎样写呢?
1.首先需要创建一个文件来保存已经注册了的账号及密码,这样就不需要每次登录时都重新注册,只需要登录的时候在文件中查看这个账号是否存在

2.然后我们需要判断每次输入的账号是否合法。(指输入的学生学号是否真实存在)这时候我们也需要一个文件,来存储所有可以用来注册的学生信息。

所以我们需要判断用户输入的账号是否对应真实存在的学生,并且这个账号未被注册,还需要在注册成功后对账号及密码进行保存

1.注册模块

void zhuce() {//这里是注册模块
	Sleep(1000);
	system("cls");
	//注册账号
	printf("请输入账号:");
	char num[NUM_S];
	scanf("%s", num);
	Node* head = (Node*)malloc(sizeof(Node));
	head = duqu_class1();//这里是去寻找账号是否合法
	int k = -1;
	while (head) {
		if (strcmp(head->num, num) == 0) {
			k = 0;
			break;
		} else {
			k = 1;
			head = head->next;
		}
	}
	if (k == 1) {
		printf("没有找到你的账号,请重新输入!\n");
		zhuce();
	}
	struct count* count = (struct count*)malloc(sizeof(count));
	count = duqu_count();//判断输入的账号是不是已经被注册
	while (count) {
		if (strcmp(count->num, num) == 0) {
			printf("此账号已被注册,请重新输入:\n");
			zhuce();
			break;
		} else {
			k = 2;
			count = count->next;
		}
	}
	char password1[PASS_S];//当账号合法且未被注册时会来到这一步
	char password2[PASS_S];//我们需要让用户输入两次密码,达到确定密码的目的
	if (k == 2) {
		printf("请输入密码:");
		scanf("%s", password1);
		printf("请确认密码:");
		scanf("%s", password2);
		if (strcmp(password1, password2) == 0) {
		//这里不能直接比较password1和password2,因为他们都是字符串类型,变量名应该为字符串地址
			printf("注册成功!\n");
			struct count* Head = (struct count*)malloc(sizeof(struct count));
			struct count* p = Head;
			strcpy(Head->num, num);
			strcpy(Head->password, password1);
			//需要注意这里不能直接让Head->password=password
			//password是一个字符串,应该使用strcpy函数将它复制过来,原因和上边的strcmp函数相同
			save_count(Head);//对已经成功注册的账号,应该保存至账号文件内
			Head->next = NULL;
			Head = Head->next;

		}
	} else {//当两次输入的密码不一致时,会提示用户输入的密码不一致,然后重新来到注册页面
		printf("两次输入的密码不一致!请重新输入:\n");
		zhuce();
	}
}

2.判断账号是否存在

文件中的信息的读取(需要存在一个名为class1.txt的文件),对这个文件进行读取

Node* duqu_class1() {//将文件中的信息读取到链表里
	Sleep(1000);
	system("cls");
	FILE* fp;
	fp = fopen("class1.txt", "r");
	Node* head, * p, * end;
	head = p = (Node*)malloc(sizeof(Node));
	while (!feof(fp)) {
		end = (Node*)malloc(sizeof(Node));
		fscanf(fp, "%s %s %s %d %d %d\n", end->name, end->num, end->class, &end->score1, &end->score2, &end->score3);
		p->next = end;
		p = end;
	}
	fclose(fp);
	head = head->next;
	p->next = NULL;
	return head;
}

3.判断账号是否未被注册

这里是判断读取的账号是否已经被注册的函数,需要注意这里函数的返回类型(count.txt)是用来存储所有已经注册过的账号和密码的文件

struct count* duqu_count() {
	Sleep(1000);
	system("cls");
	FILE* fp = fopen("count.txt", "r");
	if (fp == NULL) {
		perror(fopen);
		return;
	}
	struct count* Head, * p, * end;
	Head = p = (struct count*)malloc(sizeof(struct count));
	while (!feof(fp)) {
		end = (struct count*)malloc(sizeof(struct count));
		fscanf(fp, "%s %s\n", end->num, end->password);
		p->next = end;
		p = end;
	}
	fclose(fp);
	Head = Head->next;
	p->next = NULL;
	return Head;
}

4.注册成功的账号的保存

这里是对注册成功的账号及密码的保存函数,我们依然把注册成功的账号及密码保存至count.txt文件中

void save_count(struct count* head) {//将注册过的账号保存起来
	Sleep(1000);
	system("cls");
	struct count* con = (struct count*)malloc(sizeof(struct count));
	FILE* fp;
	fp = fopen("count.txt", "a");
	if (fp == NULL) {
		perror(fopen);
	} else {
		con = head;
		struct count* Headcount = con;
		fprintf(fp, "%s %s\n", con->num, con->password);
		con = con->next;
		printf("账号密码已成功保存!\n");
		fclose(fp);
	}
}

二、登录模块

1.登录

在用户输入时,我们只需读取之前的存储账号及密码的文件,看用户输入的账号及密码是否正确即可。

void denglu_stu() {//登录学生账户
	Sleep(1000);
	system("cls");
	char num[NUM_S];
	printf("请输入账号:");
	scanf("%s", num);
	char password[PASS_S];
	printf("请输入密码:");
	scanf("%s", password);
	int i = 0;
	struct count* Head = duqu_count();
	//此函数在前面已经声明过,不做过多解释
	while (Head) {
		if (strcmp(Head->num, num) == 0 && strcmp(Head->password, password) == 0) {
			printf("登录成功!\n");
			menu_stu();
			i = 1;
			break;
		} else {
			Head = Head->next;
		}
	}
	if (i != 1) {
		printf("输入的学号或密码有误,或此学号还未注册!\n");
	}
}

三.学生查询成绩

struct student* Head=NULL;
Head = duqu_class1();
//依然是之前的读取学生信息的函数
char num[NUM_S];
printf("请输入你的学号:\n");
scanf("%s", num);
int i = 0;
while (Head) {
	if (strcmp(Head->num, num) == 0) {
		printf("%d %d %d", Head->score1, Head->score2, Head->score3);
		i = 1;
		break;
	} else {
		Head = Head->next;
	}
}
if (i != 1) {
	printf("输入的学号有误,请重新输入!\n");
	chaxun(k);
}

四.学生查询本班成绩

struct student* Head=NULL;
Head = duqu_class1();
while (Head) {
		printf("%5s %5s %5s %5d %5d %5d\n", Head->name, Head->num, Head->class, Head->score1, Head->score2, Head->score3);
		Head = Head->next;
	}

总结

在学生管理系统的注册,登陆等模块中,要注意这块我们需要对文件进行操作。一定一定注意文件的打开方式,否则你可能在操作完成后会发现自己又得到了一个空文件。

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山河丘壑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值