C++单链表学生管理系统(有登录界面)

本文介绍了一个使用C++实现的单链表学生管理系统,包括登录注册界面、链表结构体定义、链表操作(如增加、删除、修改、查找、排序)、文件操作(导入、读取、写入)。系统支持按学号、成绩和班级对学生信息进行管理。
摘要由CSDN通过智能技术生成

C++单链表 学生管理系统
这个程序是我好几天的心血,欢迎大家指正!!!
该程序需要新建三个txt文件。1.login.txt用来存放注册用户的用户名与密码。 2.login2.txt用于登录时将login.txt文件中的每行用户名和密码单独存放,比较用户输入的用户名密码是否正确。3.studentlist.txt用于存放学生的信息。

1.程序准备工作(需要的包,设置界面样式:system等)

① 运行程序需要导入的包

#include<stdio.h>
#include<stdlib.h>
#include <fstream>
#include <ctime>
using namespace std;
#include <string.h>
#include <iostream>
using namespace std;

② 编辑进入学生系统的主界面(可根据自己的喜好修改界面样式)

void pr1()
{
   
	printf("\t\t\t\t\t*************************\n");
}
//输出界面选项 
void pr2()
{
   
	printf("\t\t\t\t\t* 请选择需要进行的操作:*\n\
\t\t\t\t\t* 1.创建学生表          *\n\
\t\t\t\t\t* 2.查看学生信息        *\n\
\t\t\t\t\t* 3.删除学生信息        *\n\
\t\t\t\t\t* 4.插入学生信息        *\n\
\t\t\t\t\t* 5.修改学生信息        *\n\
\t\t\t\t\t* 6.查找学生信息        *\n\
\t\t\t\t\t* 7.按学号排序          *\n\
\t\t\t\t\t* 8.按成绩排序          *\n\
\t\t\t\t\t* 9.查看一个班级学生信息*\n\
\t\t\t\t\t* 10.保存到文件中       *\n\
\t\t\t\t\t* 11.从文件中导入       *\n\
\t\t\t\t\t* 12.读取文件中的数据   *\n\
\t\t\t\t\t* 13.退出               *\n");
}

在这里插入图片描述

学生系统主界面效果示意图,背景和字体颜色可以根据自己喜好调整。本人用的是黑色背景,字体颜色是绿色:system(“color 01”)

2.设置登录界面,以及注册界面

该程序有点复杂,因为要考虑多种登录注册时需要遇见的情况(登录时账号密码错误,忘记密码,注册用户名已存在等)
上面也介绍过了,需要新建两个txt文件:login.txt,login2.txt。login.txt文件用来储存所有已经注册过的用户名与密码,login2.txt用于程序在执行登录、找回密码以及检验注册的用户名是否存在时使用

//生成验证码 
void myrand(char str[],int leng)
{
   
	srand(int(time(0)));//产生随机种子,保证每次的数据都不重复
	char temp;
	for (int i=0;i<leng;i++)
	{
   
		switch (rand()%3)
		{
   
		case 0:
			temp = rand()%9+'1';
			break;
		case 1:
			temp = rand()%26+'a';
			break;
		case 2:
			temp = rand()%26+'A';
			break;
		}
		str[i]=temp;	
	}
}
void login()
{
   
	int i,j,run=1;
	char username[50],password[50],namepass[100];
	printf("\t\t\t\t\t欢迎您进入学生系统的主界面!\n");
	printf("\t\t\t\t\t【1】我已经注册过了!\n");
	printf("\t\t\t\t\t【2】未注册,现在注册!\n"); 
	printf("\t\t\t\t\t请选择:");
	scanf("%d",&i);
	while(run==1)
	{
   
		if(i==2)//注册用户
		{
   
			int len,y=1; 
			system("title 注册界面");
			printf("\t\t\t\t====================欢迎注册====================\n");
		 	printf("\t\t\t\t\t欢迎新用户注册!\n");
		 	len=strlen(username);
		 	ifstream fp("C:\\Users\\Desktop\\login.txt");
		 	string line;
		 	FILE *f;
		 	while(y==1)//判断新用户名是否注册过
		 	{
   
		 		char str[50];
			 	printf("\t\t\t\t\t请输入您的用户名:");
			 	scanf("%s",username);
			    while(getline(fp,line))
			    {
   
			    	y=1;
			    	ofstream fp1("C:\\Users\\Desktop\\login2.txt");
			    	fp1<<line<<endl;
			    	fp1.close();
			    	f=fopen("C:\\Users\\Desktop\\login2.txt","r");
			    	while(fgets(str,50,f)!=0)
					{
   
						str[strlen(str)-1]='\0';
						fclose(f);
					}
					for(int k=0;k<(len-1);k++)
					{
   
						if(username[k]!=str[k])
						{
   
							y=0;
							break;
						}
					}
					if(y==1)
					{
   
						printf("\t\t\t\t\t该用户名已存在!请重新输入!\n");
						break;
					}
				}
			}
			//如果没有注册过,则开始设置密码,并将用户名密码存入login.txt中
		 	printf("\t\t\t\t\t请输入您的密码:");
		 	scanf("%s",password);
			fstream ff;
			ff.open("C:\\Users\\Desktop\\login.txt",ios::out|ios::app);
			ff<<username;
			ff<<password;
			ff<<"\n";
			ff.close();
			printf("\t\t\t\t\t注册成功!\n");
			printf("\t\t\t\t\t");
			system("pause");
			system("cls");
		}
		system("title 登录界面");//登录操作
		printf("\t\t\t\t====================欢迎登录====================\n");
		printf("\t\t\t\t\t请输入您的用户名:"); 
		scanf("%s",username);
		printf("\t\t\t\t\t请输入您的密码:");
		scanf("%s",password);
		strcpy(namepass,strcat(username,password));
		char str[50];
		FILE *f;
	    ifstream fp("C:\\Users\\Desktop\\login.txt");
	    string line;
	    while(getline(fp,line))//判断用户名与密码是否正确
	    {
   
	    	ofstream fp1("C:\\Users\\Desktop\\login2.txt");
	    	fp1<<line<<endl;
	    	fp1.close();
	    	f=fopen("C:\\Users\\Desktop\\login2.txt","r");
	    	while(fgets(str,50,f)!=0)
			{
   
				str[strlen(str)-1]='\0';
				fclose(f);
				if(strcmp(namepass,str)==0)
				{
   
					char yan[6],ren[6],to=1;
					while(to)
					{
   
						myrand(yan,6);//随机生成一个验证码
						cout<<"\t\t\t\t\t请输入验证码(区分大小写)|"<<yan<<"|:";
						scanf("%s",ren);
						if(strcmp(yan,ren)==0)
						{
   
							printf("\t\t\t\t\t登录成功!\n");to=0;
						}
						if(to==1)printf("\t\t\t\t\t验证码有误,请重新输入!\n");
					}
					run=0;
					printf("\t\t\t\t\t");system("pause");system("cls");
				}
			}
	    }
		if(run==1)
		{
   
		    printf("\t\t\t\t账号或密码错误,请输入正确的账号和密码!(1.重新输入 2.忘记密码):");
		    scanf("%d",&j);
		    system("cls");
			if(j==2)
			{
   
				run=2;
			} 
		}
		if(run==2)
		{
   
			system("title 找回密码");
			printf("\t\t\t\t====================找回密码====================\n");
			int ulen,k,go=1;
			char str[50];
			FILE *f;
			ifstream fp("C:\\Users\\Desktop\\login.txt");
			printf("\t\t\t\t\t请输入你的用户名:");
			scanf("%s",username);
			ulen=strlen(username);
			string line;
		    while(getline(fp,line))
		    {
   
		    	go=1;
		    	ofstream fp1("C:\\Users\\Desktop\\login2.txt");
		    	fp1<<line<<endl;
		    	fp1.close();
		    	f=fopen("C:\\Users\\Desktop\\login2.txt","r");
		    	while(fgets(str,50,f)!=0)
				{
   
					str[strlen(str)-1]='\0';
					fclose(f);
				}
				for(k=0;k<(ulen-1);k++)
				{
   
					if(username[k]!=str[k])
					{
   
						go=0;
						break;
					}
				}
				if(go==1)
				{
   
					k=k+1;
					printf("\t\t\t\t\t");
					cout<<"用户"<<username<<",你的密码为:";
					for(k;k<strlen(str);k++)cout<<str[k];
					run=1;printf("\n");
					break;
				}
			}
			if(go==0)
			{
   
				printf("\t\t\t\t\t该用户名没有在此网站注册!请注册登录!\n");
				i=2;run=1;printf("\t\t\t\t\t");system("pause");system("cls");
			}
			printf("\t\t\t\t\t");system("pause");system("cls");	
		}
	}
}

注册界面

在这里插入图片描述登录界面

在这里插入图片描述再次注册,发现该用户名已被注册。
在这里插入图片描述登录时忘记密码。
在这里插入图片描述

3.初始化链表,创建结构体,以及对链表的多种操作

① 创建链表结构体

num:学号 score:成绩 sex:性别 name:姓名 cla:班级 pnext:指向下一个节点

typedef struct Node
{
   
	long int num;
	float score;
	char sex[20];
	char name[20];
	char cla[20];
	struct Node * pnext;
}N,*P;
//创建链表 
P create()
{
   
	P phead=(P)malloc(sizeof(N));
	if(phead==NULL)
	{
   
		printf("分配内存失败,退出程序\n");
		exit(-1);
	}
	phead->pnext=NULL;
	return phead;
}

② 在phead链表的末尾加入一个last节点

//在链表的末尾加入节点 
void connect(P phead,P last)
{
   
	while(phead->pnext!=NULL)//将指针指向链表的末尾
	{
   
		phead=phead->pnext;
	}
	phead->pnext=last;
}

③ 计算链表中节点个数

//计算链表节点的个数 
int length(P phead)
{
   
	int count=0;
	while(phead->pnext!=NULL)//遍历整个链表
	{
   
		phead=phead->pnext;
		count++;
	}
	return count;
}

④ 交换链表中相邻的两个节点(主要用于后面的冒泡排序)

//交换链表中相邻的两个数据 
void numexchange(P head)
{
   
	P left=head->pnext;
	P right=left->pnext;
	P three=right->pnext;
	head->pnext=right;
	right->pnext=left;
	left->pnext=three;
}

⑤判断放入的学号在链表中是否已经存在

bool input(P phead,long int num)
{
   
	while(phead->pnext!=NULL)
	{
   
		phead=phead->pnext;
		if(phead->num==num)return false;
	}
	if(phead->pnext==NULL)return true;
}

4.文件操作(导入,写入,读取)

①将txt文件中的数据导入到链表中

//导入txt文件中学生的信息 
void putfile
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值