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