学生信息管理是一个学校不可缺少的部分,它的内容对于学校的管理者和学生以及学生家长来说都至关重要。
学生信息管理系统对学校加强学生成绩管理有着极其重要的作用。由于各个大学都在持续扩招,学生的数量日益庞大,对于如何管理如此庞大的学生成绩数据显得更为复杂,传统的手工成绩管理不仅工作量大,而且容易出现问题,如:效率低、保密性差,时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。已不能适应时代的发展。
随着科学技术的不断提高,使用计算机对学生成绩信息进行管理,具有手工管理所无法比拟的优点。例:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高管理者管理的效率,也是学校走向科学化、正规化管理,与世界接轨的重要条件。因此,开发设计这样一个学生信息管理系统具有非常重要的意义。.
程序框图如下
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
typedef struct Node
{
int sid ; //学号
char name[50]; //姓名
char sex[10]; //性别
int cn,en,ms; //语英数三科成绩
int sum; //总分
struct Node *next;
}node;
node List; //定义链表储存每一个学生信息
void welcome(); //主菜单显示函数
int readFile (node *L); //文件读取函数
int saveFile (node *L); //文件保存函数
void UIaddstudent(); //添加学生信息界面
void addstudent(node *L,node p); //头插法插入链表
void UIoutputstudent(node *L);//显示界面
void outputstudent(node *L);//显示学生成绩信息
void UIsearchstudent(node *L); //查找学生信息界面
node* IDsearchstudent(node *L,int id);//学号查找
node* NAsearchstudent(node *L,char name[]);//姓名查找
int UIfixstudent(node *L); //修改信息界面
void fixstudent(node *st,node *L);//修改信息
void UIdeletestudent(node *L);//删除界面
void deletstudent(node *pd); //删除操作函数
void quitstuden(); //退出系统
int findmaxgrade(node *L,int subject);//s0:语文s1:英语s2:数学s3:总分
void sortstudent(node *L); //直接排序函数
int cmpnode(node a,node b); //比较
int main()
{
int choose=0,ture=1;
readFile(&List);
while (ture)
{
system("cls"); //清屏
welcome();
printf("请输入对应功能键:");
scanf("%d",&choose);
switch (choose)
{
case 1:UIaddstudent(); //添加学生信息
break;
case 2:UIoutputstudent(&List); //显示学生信息
break;
case 3:UIsearchstudent(&List); //查询学生信息
break;
case 4:UIfixstudent(&List); //修改学生信息
break;
case 5:UIdeletestudent(&List); //删除学生信息
break;
case 6:quitstuden(); //退出管理系统
break;
}
printf("是否继续操作?(yes or no/1 or 0):");
scanf("%d",&ture);
if(ture==0)
break;
}
return 0;
}
void welcome() //主菜单功能界面
{
printf("—————————————————\n");
printf("| |\n");
printf("| 学生基本信息管理系统 |\n");
printf("| |\n");
printf("—————————————————\n");
printf("| |\n");
printf("| 104设计组 |\n");
printf("| |\n");
printf("—————————————————\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("—————————————————\n");
}
void UIaddstudent() //插入学生信息界面
{
system("cls");
node st;
printf("请输入新增学生基本信息:\n");
printf("学号:");
scanf("%d",&st.sid);
printf("姓名:");
scanf("%s",st.name);
printf("性别:");
scanf("%s",st.sex);
printf("语文:");
scanf("%d",&st.cn);
printf("英语:");
scanf("%d",&st.en);
printf("数学:");
scanf("%d",&st.ms);
st.sum=st.cn+st.en+st.ms;
addstudent(&List,st);
saveFile(&List);
}
void addstudent(node *L,node p) //头插法插入链表
{
node *h=L;
node *s=(node *)malloc(sizeof(node));
*s=p;
s->next=h->next;
h->next=s;
}
void UIoutputstudent(node *L) //显示方式
{
int choose;
system("cls");
printf(" 请选择显示样式:\n");
printf(" 添加时间降序显示--->1\n");
printf(" 总分成绩降序显示--->2\n");
scanf("%d",&choose);
if(choose==1)
{
outputstudent(L);
}
else if(choose==2)
{
sortstudent(L);
outputstudent(L);
}
else
printf("输入错误!");
}
void outputstudent(node *L) //显示学生信息
{
system("cls");
node *p=L->next;
if(p!=NULL)
{
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
while(p!=NULL)
{
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",p->sid,p->name,p->sex,p->cn,p->en,p->ms,p->sum);
printf("_____________________________________________________\n");
p=p->next;
}
}
printf("语文最高分:%d\n",findmaxgrade(L,0));
printf("英语最高分:%d\n",findmaxgrade(L,1));
printf("数学最高分:%d\n",findmaxgrade(L,2));
printf("总分最高分:%d\n",findmaxgrade(L,3));
}
void UIsearchstudent(node *L) //查询学生信息
{
system("cls");
int choice=0,id;
char name[30];
node *st;
printf(" 按学号查询--->1 \n");
printf(" 按姓名查询--->2 \n");
printf("输入查询方式:");
scanf("%d",&choice);
if(choice==1)
{
printf("请输入学号:");
scanf("%d",&id);
st=IDsearchstudent(L,id);
st=st->next;
if (st==NULL)
printf("查无此人!");
else
{
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",st->sid,st->name,st->sex,st->cn,st->en,st->ms,st->sum);
printf("_____________________________________________________\n");
}
}
else if(choice==2)
{
printf("请输入姓名:");
scanf("%s",name);
st=NAsearchstudent(L,name);
st=st->next;
if (st==NULL)
printf("查无此人!\n");
else
{
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",st->sid,st->name,st->sex,st->cn,st->en,st->ms,st->sum);
printf("_____________________________________________________\n");
}
}
else
printf("输入错误!\n");
}
node* IDsearchstudent(node *L,int id) //学号查找
{
node *p=L;
while (p->next!=NULL)
{
if(p->next->sid==id)
return p; //找到节点位置立刻返回
p=p->next;
}
return NULL;
}
node* NAsearchstudent(node *L,char name[]) //姓名查找
{
node *p=L;
while (p->next!=NULL)
{
if(strcmp(p->next->name,name)==0) //使用字符串比较函数
return p;
p=p->next;
}
return NULL;
}
int UIfixstudent(node *L) //修改学生信息
{
system("cls");
int id;
printf("请输入要修改的学生学号:");
scanf("%d",&id);
node *st=IDsearchstudent(L,id);
st=st->next;
if (st==NULL)
{
printf("查无此人!\n");
return 0;
}
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",st->sid,st->name,st->sex,st->cn,st->en,st->ms,st->sum);
printf("_____________________________________________________\n");
fixstudent(st,L);
return 0;
}
void fixstudent(node *st,node *L)
{
int choose;
while (1)
{
printf("修改姓名 --->1\n");
printf("修改性别 --->2\n");
printf("修改语文成绩--->3\n");
printf("修改英语成绩--->4\n");
printf("修改数学成绩--->5\n");
printf("请输入要修改的信息:\n");
scanf("%d",&choose);
switch (choose)
{
case 1: printf("请输入新姓名:\n");
scanf("%s",st->name);
break;
case 2: printf("请输入新性别:\n");
scanf("%s",st->sex);
break;
case 3: printf("请输入新语文成绩:\n");
scanf("%d",&st->cn);
break;
case 4: printf("请输入新英语成绩:\n");
scanf("%d",&st->en);
break;
case 5: printf("请输入新数学成绩:\n");
scanf("%d",&st->ms);
break;
}
st->sum=st->cn + st->en + st->ms;
printf("修改成功!\n");
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",st->sid,st->name,st->sex,st->cn,st->en,st->ms,st->sum);
printf("_____________________________________________________\n");
printf("是否继续修改(yes or no/1 or 0):\n");
scanf("%d",&choose);
if(choose==0)
break;
}
saveFile(L);
}
void UIdeletestudent(node *L) //删除界面
{
system("cls");
int id;
printf("请输入要删除的学生学号:");
scanf("%d",&id);
node *st=IDsearchstudent(L,id);
node *p=st;
st=st->next;
if (st==NULL)
{
printf("查无此人!\n");
return;
}
printf("_____________________________________________________\n");
printf("#学号#\t#姓名#\t#性别#\t#语文#\t#英语#\t#数学#\t#总分#\n");
printf("_____________________________________________________\n");
printf("%d|%s\t|%s\t|%d\t|%d\t|%d\t|%d\t\n",st->sid,st->name,st->sex,st->cn,st->en,st->ms,st->sum);
printf("_____________________________________________________\n");
deletstudent(p);
saveFile(L);
}
void deletstudent(node *pd) //删除操作
{
node *s=pd->next;
pd->next=s->next;
s->next=NULL;
free(s);
}
void quitstuden() //退出程序
{
system("cls");
printf("—————————————————\n");
printf("| |\n");
printf("| 学生基本信息管理系统 |\n");
printf("| |\n");
printf("—————————————————\n");
printf("| |\n");
printf("| 104设计组 |\n");
printf("| |\n");
printf("—————————————————\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| 欢迎下次使用! |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("|北京时间%s |\n",__TIME__);
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("| |\n");
printf("—————————————————\n");
exit(0);
}
int readFile(node *L) //文件读取
{
node st;
node *s;
node *t=L;
FILE *fpr=fopen("StudentInfor.txt","r");
if(fpr==NULL)
return 0;
else
{
while(fscanf(fpr,"%d %s %s %d %d %d %d",&st.sid,st.name,st.sex,&st.cn,&st.en,&st.ms,&st.sum)!=EOF)
{
s=(node *)malloc(sizeof(node));
*s=st;
t->next=s;
t=s;
t->next=NULL;
}
}
fclose(fpr);
return 1;
}
int saveFile(node *L) //文件保存
{
FILE *fps=fopen("StudentInfor.txt","w");
if (fps==NULL)
return 0;
node *p=L->next;
while(p!=NULL) //遍历写入信息保存
{
fprintf(fps,"%d %s %s %d %d %d %d\n",p->sid,p->name,p->sex,p->cn,p->en,p->ms,p->sum);
p=p->next;
}
fclose(fps);
return 1;
}
int findmaxgrade(node *L,int subject) //查找最高分
{
node *p=L->next;
if(p!=NULL)
{
int max[4]={-1,-1,-1,-1};
while (p!=NULL)
{
if(p->cn>max[0]) max[0]=p->cn;
if(p->en>max[1]) max[1]=p->en;
if(p->ms>max[2]) max[2]=p->ms;
if(p->sum>max[3]) max[3]=p->sum;
p=p->next;
}
return max[subject];
}
return -1;//查询失败
}
void sortstudent(node *L) //直接排序降序
{
node *p=L->next;
for (;p!=NULL;p=p->next)
{
node *q=p;
for (;q!=NULL;q=q->next)//直接排序法
if(!cmpnode(*p,*q))
{
node t=*p; //交换数据域
*p=*q;
*q=t;
t.next=p->next; //交换指针域防止死循环
p->next=q->next;
q->next=t.next;
}
}
}
int cmpnode(node a,node b) //比较函数
{
int s;
if(a.sum>b.sum)
s=1;
else
s=0;
return s;
}