这是一个基于链表的简单学生成绩管理系统
使用链表,将链表分为指针域和数据域,使用指针域动态内存分配指向数据将数据存入,之后将数据导入数据域存储数据,把数据域写为结构体以学生的id为基准表示学生的各项资料。系统实现了学生资料的存储(文件),修改,排序,拥有简单的异常处理,拥有一定的数据处理,同时建立一个稍微美化的界面和比较舒服的运行模式。
其中的账号和密码必须先注册,
没有注册就不能登录,只有数据是保存的,必须点击退出才可以读数据到文件里面!!!
可以自行改良系统,另外将注册数据再写到一个文件里面(类似程序中将学生数据存到一个文件里面),然后实现登录数据的保存,以及数据的实时保存等等......
以下为管理系统的简单的流程图
运行程序
注册
登陆后
录入学生资料然后查看资料
查看文件
话不多说上程序,有基础+百度+仔细看你就懂了
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>
#include<conio.h>
int num=0,j=0,skip=0,use,analy=0,analyAll=0;
char zhan[50][50];
char mima[50][50];
struct student
{
char name[20];
char id[20];
int math;
int english;
int total;
int order;
int avar;
};
struct Node
{
struct student data; ///数据域
struct Node*next; ///指针域
};
struct Node *creatList(); ///建表头
struct Node* creatNode(struct student data); ///建表身
void insertNodeByend(struct Node*list,struct student data); ///尾插
void deleteNodeByAppoin(struct Node*list,char* id); ///删除指定信息
void printList(struct Node*list); ///打印
void printPoslist(struct Node*list,int n,int m); ///打印指定目标
struct Node *find(struct Node*list,char*id); ///寻找指定位置
struct Node *Sort(struct Node *list); ///总分排序
void savefile(struct Node*list,char*filename); ///入文件
void readfile(struct Node*list,char*filename); ///读文件
void jiemian(); ///界面
void keydown(struct Node*list); ///键入信息
int login(); ///登陆以及注册
///创建表
struct Node *creatList()
{
struct Node*list=(struct Node*)malloc(sizeof(struct Node));
list->next=NULL;
return list;
};
struct Node *creatNode(struct student data)
{
struct Node* newNode= (struct Node*)malloc(sizeof(struct Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
};
///插入表
void insertNodeByend(struct Node*list,struct student data)
{
struct Node*newNode=creatNode(data);
while(list->next!=NULL)
{
list=list->next;
}
list->next=newNode;
}
///删除表
void deleteNodeByAppoin(struct Node*list,char* id)
{
use=0;
struct Node*posNode=list->next;
struct Node*posNodeFront=list;
if(posNode==NULL)
{
printf("===无任何学生资料===\n");
use=0;
return;
}
else
{
while(strcmp(posNode->data.id,id))
{
posNodeFront=posNode;
posNode=posNodeFront->next;
if(posNode==NULL)
{
printf("\n没有找到相关信息,无法删除\n\n");
use=1;
return;
}
}
posNodeFront->next=posNode->next;
free(posNode);
printf("以上信息已删除!\n");
}
}
///打印表
void printList(struct Node*list)
{
struct Node*pMove=list->next;
printf("id\tname\tmath english\ttotal\tavar\n");
while(pMove)
{
analyAll++;
printf("%s\t%s\t%d\t%d\t%d\t%d\n",
pMove->data.id,
pMove->data.name,
pMove->data.math,
pMove->data.english,
pMove->data.total,
pMove->data.avar);
pMove=pMove->next;
}
printf("\n");
}
void printPoslist(struct Node*list,int n,int m)
{
struct Node*pMove=list->next;
printf("id\tname\tmath english\ttotal\tavar\n");
while(pMove)
{
if(pMove->data.avar>=n&&pMove->data.avar<=m)
{
analy++;
printf("%s\t%s\t%d\t%d\t%d\t%d\n",
pMove->data.id,
pMove->data.name,
pMove->data.math,
pMove->data.english,
pMove->data.total,
pMove->data.avar);
}
pMove=pMove->next;
}
printf("\n");
}
///查找表
struct Node*find(struct Node*list,char*id)
{
struct Node *pMove=list->next;
while(pMove!=NULL&&strcmp(pMove->data.id,id))
{
pMove=pMove->next;
}
return pMove;
};
///排序
struct Node *Sort(struct Node *list)
{
int i=1;
struct Node *q, *s, *pre ,*p;
p=list->next;
q=p->next;
p->next=NULL;
while(q)
{
s=q;
q=q->next;
pre=list;
p=list->next;
while(p!=NULL && p->data.total > s->data.total)
{
pre=p;
p=p->next;
}
s->next=p;
pre->next=s;
}
return list;
}
///存表于文件
void savefile(struct Node*list,char*filename)
{
FILE*fp=fopen("d:\\111.txt","w");
struct Node*pMove=list->next;
while(pMove)
{
fprintf(fp," %s %5s %3d %3d %3d %3d\n",
pMove->data.id,
pMove->data.name,
pMove->data.math,
pMove->data.english,
pMove->data.total,
pMove->data.avar);
pMove=pMove->next;
}
fclose(fp);
}
///读表于文件
void readfile(struct Node*list,char*filename)
{
FILE*fp=fopen("d:\\111.txt","r");
if(fp==NULL)
{
fp=fopen(filename,"a");
}
struct student info;
while(fscanf(fp,"%s%s%d%d%d%d",
info.id,info.name,
&info.math,
&info.english,
&info.total,
&info.avar)!=EOF)
{
insertNodeByend(list,info);
}
fclose(fp);
}
///界面
void jiemian()
{
printf("==============学生管理系统============\n");
printf("| 0. 退出系统 |\n");
printf("--------------------------------------\n");
printf("| 1. 录入学生资料 |\n");
printf("--------------------------------------\n");
printf("| 2. 修改学生资料 |\n");
printf("--------------------------------------\n");
printf("| 3. 查找学生资料 |\n");
printf("--------------------------------------\n");
printf("| 4. 查看所有学生资料 |\n");
printf("--------------------------------------\n");
printf("| 5. 查看某分数范围学生资料 |\n");
printf("--------------------------------------\n");
printf("| 6. 学生成绩分析 |\n");
printf("--------------------------------------\n");
printf("| 7. 编者 |\n");
printf("======================================\n");
}
///键入
void keydown(struct Node*list)
{
int aly;
char choice,j,n;
struct student info;
//scanf("%d",&choice);
choice=getch();
system("cls");
switch(choice)
{
case '0':
skip=1;
printf("正在退出.....");
Sleep(500);
system("cls");
printf("文件数据自动保存.....");
Sleep(800);
system("cls");
printf("退出成功!");
break;
case '1':
printf("==请问您要输入几个学生的资料(输入0退出)==\n");
while(scanf("%d",&n)){
if(n<0)
{printf("输入错误,请重新输入\n");
continue;}
else if(n==0){break;}
system("cls");
printf("=============录入学生资料=============\n\n");
printf("==========请输入%d个学生资料==========\n\n学号 姓名 数学 英语\n",n);
while(scanf("%s%s%d%d",info.id,info.name,&info.math,&info.english))
{
if(find(list,info.id)==NULL)
{
info.total=info.math+info.english;
info.avar=info.total/2;
insertNodeByend(list,info);
if(!--n)
break;
}
else
{
printf("\n <|TIP|>\n<该学生id已存在,输入有误,请重新输入>\n");
continue;
}
}
printf("=====<|录入成功|>=====\n");
Sleep(500);
break;
}
break;
case '2':
printf("=============修改学生资料=============\n");
printf("请输入1,2,3\n1.删除学生记录\n2.修改学生记录\n3.退出\n");
while(1)
{
j=getch();
if(j!='1'&&j!='2'&&j!='3')
{
printf("输入错误,请重新输入\n");
continue;
}
system("cls");
if(j=='1')
{
printf("请输入学号\n");
scanf("%s",info.id);
deleteNodeByAppoin(list,info.id);
system("pause");
break;
}
else if(j=='2')
{
printf("请输入学号\n");
scanf("%s",info.id);
system("cls");
printf("学号为 %s 的学生的资料为:\n",info.id);
if(find(list,info.id)!=NULL)
{
printf("学号 姓名 数学 英语 总分 平均分\n");
printf(" %s %4s %3d %4d %3d %4d\n",
find(list,info.id)->data.id,
find(list,info.id)->data.name,
find(list,info.id)->data.math,
find(list,info.id)->data.english,
find(list,info.id)->data.total,
find(list,info.id)->data.avar);
}
deleteNodeByAppoin(list,info.id);
if(use==0)
{
printf("\n请输入学生的新资料\n\n学号 姓名 数学 英语\n",n);
scanf("%s%s%d%d",info.id,info.name,&info.math,&info.english);
info.total=info.math+info.english;
info.avar=info.total/2;
insertNodeByend(list,info);
printf("\n");
}
system("pause");
break;
}
else if(j=='3')
{
break;
}
else
{
printf("输入无效,请重新输入\n");
continue;
}
}
break;
case '3':
printf("请输入学号\n");
scanf("%s",info.id);
system("cls");
printf("================学号为%s的学生信息================\n",info.id);
if(find(list,info.id)!=NULL)
{
printf("学号 姓名 数学 英语 总分 平均分\n");
printf(" %s %4s %3d %4d %3d %4d\n",
find(list,info.id)->data.id,
find(list,info.id)->data.name,
find(list,info.id)->data.math,
find(list,info.id)->data.english,
find(list,info.id)->data.total,
find(list,info.id)->data.avar);
}
else
printf("\n 未找到该学生信息\n");
printf("\n");
system("pause");
break;
case '4':
printf("=================学生资料=================\n");
if(list->next==NULL)
printf("==================无信息==================\n");
else
{
Sort(list);
printList(list);
}
system("pause");
break;
case '5':
Sort(list);
printf("=============查看指定分数学生资料=============\n");
printf("请输入两个0~100以内的数表示平均数 a->b 的范围\n ");
while(scanf("%d%d",&n,&j)){
if(n<=100&&n>=0&&j<=100&&j>=0)
{
system("cls");
printf("====平均分数段为%d~%d的学生资料====\n",n,j);
printPoslist(list,n,j);
break;
}
else
{
system("cls");
printf("输入错误,请重新输入\n");
continue;
}
}
system("pause");
break;
case '6':
printf("======================================\n");
printPoslist(list,0,59);
printf("以上 %d 位同学不及格!\n\n",analy);
printf("======================================\n");
aly=analy;
analy=0;
printPoslist(list,60,79);
printf("以上 %d 位同学处于中上水准,还需努力\n\n",analy);
printf("======================================\n");
analy=0;
printPoslist(list,80,100);
printf("以上 %d 位同学考的不错,争取更进一步\n\n",analy);
printf("======================================\n");
system("pause");
system("cls");
printf("============================================\n");
if(aly>analyAll/5)
{
printf(" 总体而言有太多的同学不及格,需要整改!!!\n");
}
else if(aly<=analyAll/5&&aly>=analyAll/10)
{
printf(" 总体而言要加强学生的学习效率,提高成绩\n");
}
else
{
printf(" 总体而言成绩还不错,争取更进一步!\n");
}
printf("=============================================\n");
system("pause");
system("cls");
break;
case '7':
printf("QAQ 制作者 3181905124 \n");
system("pause");
break;
default:
printf("输入无效\n");
system("pause");
break;
}
}
///登陆以及不完整的注册
int login()
{
int zhan_num=1;
int p=1;
char link;
memset(zhan,0,sizeof(zhan[0]));
memset(mima,0,sizeof(zhan[0]));
printf(" |=== 1.登陆 ===|\n");
printf(" |=== 2.注册 ===|\n");
printf("|==请注册完再登陆==|");
link=getch();
system("cls");
if(link=='1')
{
printf("|=== 账号 : ===|");
scanf("%s",zhan[0]);
printf("\n");
printf("|=== 密码 : ===|");
scanf("%s",mima[0]);
system("cls");
if(strcmp(zhan[0],zhan[1])==0&&strcmp(mima[0],mima[1])==0)
{
printf("登陆中.....");
Sleep(800);
system("cls");
return 1;
}
else
{
printf("登陆中.....\n");
Sleep(500);
system("cls");
printf("登录失败,密码或账号错误\n");
Sleep(1000);
system("cls");
return 0;
}
}
else if(link=='2')
{
printf("|=== 新账号 : ===|");
scanf("%s",zhan[1]);
printf("|=== 新密码 : ===|");
scanf("%s",mima[1]);
system("cls");
printf("正在录入....\n");
Sleep(800);
printf("录入成功!");
Sleep(500);
system("cls");
return 0;
}
else
{
printf("即将退出系统\n");
Sleep(500);
system("cls");
printf("正在退出.....");
Sleep(500);
system("cls");
printf("文件数据自动保存.....");
Sleep(800);
system("cls");
printf("退出成功!");
exit(1);
}
}
int main()
{
int logi;
system("color 0");
system("color 70");
MessageBox(NULL,"欢迎进入学生管理系统","学生管理系统",0);
struct Node*list=creatList();
readfile(list,"d:\\111.txt");
do
{
logi=0;
login();
logi=login();
if(logi==0)
continue;
else
break;
}while(1);
while(1)
{
if(skip==1)
break;
system("cls");
jiemian();
keydown(list);
}
savefile(list,"d:\\111.txt");
return 0;
}