C语言学生系统增删排序查功能.docx
《C语言学生系统增删排序查功能.docx》由会员分享,可在线阅读,更多相关《C语言学生系统增删排序查功能.docx(14页珍藏版)》请在冰豆网上搜索。
C语言学生系统增删排序查功能
题目学生成绩管理系统
某班学生有若干人(不超过40人),期末共考5门课,每个学生的成绩按学号顺序存入计算机。
学生信息如下表所示:
学号
姓名
高等数学
大学英语读写
大学英语听说
计算机科学导论
程序设计基础
(一)
设计一个程序,实现学生成绩管理功能。
1、提供菜单式的用户界面;
2、输入学生的基本信息(应考虑学生学号的唯一性);
3、增加或删除学生记录;
4、输入姓名或学号,查找某个学生的成绩;
5、统计某门课程在100-90,89-80,79-70,69-60,60分以下各分数段人数并显示;
6、对学生成绩按总分排序,并将排序结果输出
7、使用文件记载学生信息,程序启动时加载学生信息,程序退出时保存学生信息。
(进一步功能)
要求:
1、用C语言实现程序设计;
2、系统的各个功能模块要求用函数的形式实现;
3、界面友好(良好的人机交互),程序加必要的注释。
三.需求分析
1.建立一个学生管理系统,包括姓名、学号、高等数学成绩、大学英语读写成绩、大学英语听说成绩、计算机科学导论成绩、程序设计基础
(一)成绩。
2.建立一个链表保存学生的信息。
3.设计一个input()函数,输入所有学生的信息。
4.设计一个output()函数,输出所有学生的信息。
5.设计一个insert()函数,把新学生的信息插入到连表中。
6.设计一个del()函数,根据输入的学号,删除相应的学生信息。
7.设计一个search()函数,根据输入的学号,输出相应的学生信息。
8.设计一个sort()函数,根据总分成绩对学生进行排序。
9.设计一个save()函数,将学生信息保存到“陈原彬.txt”中。
10.该程序有报错机制,出现错误,会执行exit(0)函数,退出程序。
四.详细设计
1、程序包括7个函数:
input()、output()、insert()、del()、search()、sort()、save(),分别进行输入、输出、添加、删除、查找、排序和保存到文件。
菜单图图如下:
2、数据定义为:
structstudent
{
charname[20];
charnum[20];
intmath;//高等数学
intEnglish_rw;//大学英语读写
intEnglish_ls;//大学英语听说
intdl;//计算机导论
intpdb;//程序设计基础
structstudent*next;
};
3、建立链表
函数:
node*input(node*head)
功能:
建立链表,向链表中输入信息
4、显示链表
voidoutput(node*head)
显示链表中的内容
5、添加节点
node*insert(node*head)
向链表中插入一条记录
6、删除节点
node*del(node*head)
按照学号方式删除一条记录
7、查找节点
node*search(node*head)
按照学号的方式对学生信息进行查找,并将该信息输出
8、节点排序
node*sort(node*head)
按照总分的方式对链表中的节点进行排序
9、保存到文件
node*save(node*head)
将链表中各记录的内容保存到指定文件中
.源程序
#include
#defineN3
#defineMAXSIZE1000
voidmenuname();
typedefstructstudentnode;
voidsa(int*a,int*b)
inttemp;
temp=*a;
*a=*b;
*b=temp;
}
voidmenuname()/*定义菜单函数*/
printf("\n*****************************功能菜单******************************\n\n");
printf("\n输入学生信息--1\n");
printf("\n输出学生信息--2\n");
printf("\n添加新的学生--3\n");
printf("\n删除某学生信息--4\n");
printf("\n查找某学生信息--5\n");
printf("\n将学生按总分排序--6\n");
printf("\n将学生信息保存到文件中--7\n");
printf("\n退出--0\n");
printf("\n\n");
node*input(node*head)//输入学生信息
node*p,*pri;//定义一个指向链表结构的指针变量
inti=0;/*定义一个整形变量i并赋值0*/
printf("\n\n———————————————请输入学生成绩信息:
———————————————\n\n");
p=(node*)malloc(sizeof(node));/*分配存储空间,生成头结点,malloc返回值赋给p*/
if(p!
=NULL)
printf("姓名:
");
getchar();
scanf("%s",p->name);
printf("学号:
scanf("%s",p->num);
printf("高等数学:
scanf("%d",&(p->math));
printf("大学英语读写:
scanf("%d",&(p->English_rw));
printf("大学英语听说:
scanf("%d",&(p->English_ls));
printf("计算机导论:
scanf("%d",&(p->dl));
printf("程序设计基础:
scanf("%d",&(p->pdb));
p->next=NULL;
head=p;
pri=p;
printf("\n");
for(inti=0;i{p=(node*)malloc(sizeof(node));printf("姓名:");scanf("%s",p->name);printf("学号:");scanf("%s",p->num);printf("高等数学:");scanf("%d",&(p->math));printf("大学英语读写:");scanf("%d",&(p->English_rw));printf("大学英语听说:");scanf("%d",&(p->English_ls));printf("计算机导论:");scanf("%d",&(p->dl));printf("程序设计基础:");scanf("%d",&(p->pdb));pri->next=p;pri=p;pri->next=NULL;printf("\n");}printf("\n\n");printf("添加信息结束!按2键可查看学生信息!\n\n");returnhead;}else{printf("outofmemory!!!\n");exit(-1);}}voidoutput(node*head)//输出学生信息{node*p;/*定义一个指向链表结构的指针变量*/p=head;/*将head的值赋给p,使p指向head所指的结点*/if(p==NULL)/*如果头指针为空,则链表为空*/printf("\n学生信息为空!请先输入或添加学生信息!!!\n\n");else{printf("\n\n---------------学生成绩信息--------------\n\n");while(p!=NULL)/*按链表顺序输出各结点数据域信息*/{printf("姓名学号高等数学大学英语读写大学英语听说计算机导论程序设计基础\n\n");printf("%s\t%s\t%d\t%6d\t%8d\t%7d\t%6d\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);p=p->next;/*将p->next的值赋给p,使p指向下一结点*/}printf("\n\n");}}node*insert(node*head)/*定义插入函数*/{node*p;/*定义一个指向链表结构的指针变量*/p=(node*)malloc(sizeof(node));/*分配存储空间,生成新结点,malloc返回值赋给p*/printf("\n\n——————————请输入新添加的学生信息————————————\n\n");printf("姓名:");//输入新结点信息scanf("%s",p->name);printf("学号:");scanf("%s",p->num);printf("高等数学:");scanf("%d",&(p->math));printf("大学英语读写:");scanf("%d",&(p->English_rw));printf("大学英语听说:");scanf("%d",&(p->English_ls));printf("计算机导论:");scanf("%d",&(p->dl));printf("程序设计基础:");scanf("%d",&(p->pdb));p->next=head;/*新结点插入头结点之前*/head=p;/*记录新的头指针*/printf("\n\n");printf("添加学生信息成功,按2键可查看!\n\n");returnhead;/*返回头指针*/}node*del(node*head)/*定义删除函数*/{node*p1,*p2;/*定义两个指向链表结构的指针变量*/char*num;/*定义一个指向字符的指针变量name*/num=(char*)malloc(sizeof(char));/*分配字符存储空间,malloc返回值赋给name*/if(head==NULL)/*如果头指针为空,则链表为空*/{printf("\n成绩系统无信息!请先输入或添加学生信息!\n\n");returnNULL;/*返回空指针*/}else{printf("请输入要删除的学生学号:");scanf("%s",num);printf("\n");p1=head;/*将head的值赋给p1,使p1指向head所指的结点*/while(strcmp(p1->num,num)!=0&&p1->next!=NULL)/*如果p1->num不是要删除成员学号并且后面还有结点*/{p2=p1;/*将p1的值赋给p2,使p2指向p1所指,记录p1*/p1=p1->next;/*p1后移一个结点*/}if(strcmp(p1->num,num)==0)/*找到要删除的结点(学号)*/{printf("————————您要删除的学生信息为:————————\n\n");/*输出要删除结点数据域信息*/printf("姓名学号高等数学大学英语读写大学英语听说计算机导论程序设计基础\n");printf("%s\t%s\t%d\t%d\t%3d\t%5d\t%7d\n",p1->name,p1->num,p1->math,p1->English_rw,p1->English_ls,p1->dl,p1->pdb);if(p1==head)/*如果要删除结点是头结点*/head=p1->next;/*则把第2个结点地址赋给head*/elsep2->next=p1->next;/*否则将下一个结点地址赋给前一结点地址*/printf("\n删除成功!\n\n");printf("要查看删除后的学生信息请按2!\n\n");free(p1);/*释放p1所指空间*/}elseprintf("\n对不起,删除失败!!!\n\n");}returnhead;/*返回头指针*/}node*search(node*head)/*定义查找函数*/{node*p;/*定义一个指向链表结构的指针变量p*/char*num;/*定义一个指向字符的字符指针变量name*/num=(char*)malloc(sizeof(char));/*分配字符存储空间,malloc返回值赋给name*/p=head;/*将head的值赋给p,使p指向头结点*/if(p==NULL)/*如果头指针为空,则链表为空*/{printf("\n该学生信息系统为空!请先输入或添加学生信息!!!\n\n");returnNULL;/*返回空指针*/}else{printf("\n请输入要查找的学生学号:");scanf("%s",num);printf("\n");while(p!=NULL)/*p非空*/{if(strcmp(p->num,num)==0)/*找到要查找的结点(姓名)*/{printf("\n——————————您要查找的学生信息为————————\n\n");/*输出要查找结点数据域信息*/printf("姓名学号高等数学大学英语读写大学英语听说计算机导论程序设计基础\n");printf("%s\t%s\t%d\t%d\t%3d\t%5d\t%7d\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);returnhead;/*返回头指针*/}elsep=p->next;/*p后移一个结点*/}if(p==NULL)/*p为空*/printf("\n对不起,查无此人!!!\n\n");returnhead;/*返回头指针*/}}node*sort(node*head)/*定义排序函数*/{intscore1,score2;charname1[20],num1[20];node*p,*q;/*定义三个指向链表结构的指针变量和一个结构体变量t*/if(head==NULL)/*如果头指针为空,则链表为空*/{printf("\n该学生信息系统为空!请先输入或添加学生信息!!!\n\n");returnNULL;/*返回空指针*/}else{for(p=head;p;p=p->next)/*冒泡排序*/{score1=p->math+p->English_rw+p->English_ls+p->dl+p->pdb;for(q=p->next;q;q=q->next){score2=q->math+q->English_rw+q->English_ls+q->dl+q->pdb;if(score1{strcpy(name1,p->name);strcpy(p->name,q->name);strcpy(q->name,name1);strcpy(num1,p->num);strcpy(p->num,q->num);strcpy(q->num,num1);sa(&(q->math),&(p->math));sa(&(q->English_rw),&(p->English_rw));sa(&(q->English_ls),&(p->English_ls));sa(&(q->dl),&(p->dl));sa(&(q->pdb),&(p->pdb));}}}printf("\n\n已按学号排序!\n\n");printf("要查看按学号的顺序重新排序后学生管理系统的信息请按2!\n\n");returnhead;/*返回头指针*/}}node*save(node*head)/*定义保存文件函数*/{node*p=head;/*定义一个指向SNODE结构体的指针p,并赋给头指针的值*/FILE*fp;/*定义文件指针fp*/if((fp=fopen("成绩管理.txt","w"))==NULL)/*以写的方式打开record.txt文件且其为空*/{printf("Cannotopenthefile!");exit(0);/*退出*/}if(p==NULL)printf("\n该学生管理系统为空!没有学生信息!!!\n\n");else{while(p)/*结点数据域信息顺序写入文件*/{fprintf(fp,"姓名:%s学号:%s高等数学:%d大学英语读写:%d大学英语听说:%d计算机导论:%d程序设计基础:%d\n\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);/**/p=p->next;/*p后移一个结点*/}printf("\n已将学生的信息保存到文件中!!!\n\n");}fclose(fp);/*关闭文件*/returnhead;/*返回头指针*/}voidmain(){intkey;structstudent*head=NULL;while(key!=0){menuname();printf("请输入相应的功能键:");scanf("%d",&key);printf("\n");switch(key){case1:head=input(head);/*调用输入函数返回值赋给head*/break;case2:output(head);/*调用输入函数*/break;case3:head=insert(head);/*调用插入函数返回值赋给head*/break;case4:head=del(head);/*调用删除函数返回值赋给head*/break;case5:head=search(head);/*调用查找函数返回值赋给head*/break;case6:head=sort(head);/*调用排序函数返回值赋给head*/break;case7:head=save(head);/*调用保存文件函数返回值赋给head*/break;case0:printf("Thanks!");/*退出*/return;/*返回*/}}}
p=(node*)malloc(sizeof(node));
pri->next=p;
pri->next=NULL;
printf("添加信息结束!
按2键可查看学生信息!
\n\n");
returnhead;
else
printf("outofmemory!
!
\n");
exit(-1);
voidoutput(node*head)//输出学生信息
node*p;/*定义一个指向链表结构的指针变量*/
p=head;/*将head的值赋给p,使p指向head所指的结点*/
if(p==NULL)/*如果头指针为空,则链表为空*/
printf("\n学生信息为空!
请先输入或添加学生信息!
printf("\n\n---------------学生成绩信息--------------\n\n");
while(p!
=NULL)/*按链表顺序输出各结点数据域信息*/
printf("姓名学号高等数学大学英语读写大学英语听说计算机导论程序设计基础\n\n");
printf("%s\t%s\t%d\t%6d\t%8d\t%7d\t%6d\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);
p=p->next;/*将p->next的值赋给p,使p指向下一结点*/
node*insert(node*head)/*定义插入函数*/
p=(node*)malloc(sizeof(node));/*分配存储空间,生成新结点,malloc返回值赋给p*/
printf("\n\n——————————请输入新添加的学生信息————————————\n\n");
");//输入新结点信息
p->next=head;/*新结点插入头结点之前*/
head=p;/*记录新的头指针*/
printf("添加学生信息成功,按2键可查看!
returnhead;/*返回头指针*/
node*del(node*head)/*定义删除函数*/
node*p1,*p2;/*定义两个指向链表结构的指针变量*/
char*num;/*定义一个指向字符的指针变量name*/
num=(char*)malloc(sizeof(char));/*分配字符存储空间,malloc返回值赋给name*/
if(head==NULL)/*如果头指针为空,则链表为空*/
printf("\n成绩系统无信息!
returnNULL;/*返回空指针*/
printf("请输入要删除的学生学号:
scanf("%s",num);
p1=head;/*将head的值赋给p1,使p1指向head所指的结点*/
while(strcmp(p1->num,num)!
=0&&p1->next!
=NULL)/*如果p1->num不是要删除成员学号并且后面还有结点*/
p2=p1;/*将p1的值赋给p2,使p2指向p1所指,记录p1*/
p1=p1->next;/*p1后移一个结点*/
if(strcmp(p1->num,num)==0)/*找到要删除的结点(学号)*/
printf("————————您要删除的学生信息为:
————————\n\n");/*输出要删除结点数据域信息*/
printf("姓名学号高等数学大学英语读写大学英语听说计算机导论程序设计基础\n");
printf("%s\t%s\t%d\t%d\t%3d\t%5d\t%7d\n",p1->name,p1->num,p1->math,p1->English_rw,p1->English_ls,p1->dl,p1->pdb);
if(p1==head)/*如果要删除结点是头结点*/
head=p1->next;/*则把第2个结点地址赋给head*/
p2->next=p1->next;/*否则将下一个结点地址赋给前一结点地址*/
printf("\n删除成功!
printf("要查看删除后的学生信息请按2!
free(p1);/*释放p1所指空间*/
printf("\n对不起,删除失败!
node*search(node*head)/*定义查找函数*/
node*p;/*定义一个指向链表结构的指针变量p*/
char*num;/*定义一个指向字符的字符指针变量name*/
p=head;/*将head的值赋给p,使p指向头结点*/
printf("\n该学生信息系统为空!
printf("\n请输入要查找的学生学号:
=NULL)/*p非空*/
if(strcmp(p->num,num)==0)/*找到要查找的结点(姓名)*/
printf("\n——————————您要查找的学生信息为————————\n\n");/*输出要查找结点数据域信息*/
printf("%s\t%s\t%d\t%d\t%3d\t%5d\t%7d\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);
p=p->next;/*p后移一个结点*/
if(p==NULL)/*p为空*/
printf("\n对不起,查无此人!
node*sort(node*head)/*定义排序函数*/
intscore1,score2;
charname1[20],num1[20];
node*p,*q;/*定义三个指向链表结构的指针变量和一个结构体变量t*/
for(p=head;p;p=p->next)/*冒泡排序*/
score1=p->math+p->English_rw+p->English_ls+p->dl+p->pdb;
for(q=p->next;q;q=q->next)
score2=q->math+q->English_rw+q->English_ls+q->dl+q->pdb;
if(score1{strcpy(name1,p->name);strcpy(p->name,q->name);strcpy(q->name,name1);strcpy(num1,p->num);strcpy(p->num,q->num);strcpy(q->num,num1);sa(&(q->math),&(p->math));sa(&(q->English_rw),&(p->English_rw));sa(&(q->English_ls),&(p->English_ls));sa(&(q->dl),&(p->dl));sa(&(q->pdb),&(p->pdb));}}}printf("\n\n已按学号排序!\n\n");printf("要查看按学号的顺序重新排序后学生管理系统的信息请按2!\n\n");returnhead;/*返回头指针*/}}node*save(node*head)/*定义保存文件函数*/{node*p=head;/*定义一个指向SNODE结构体的指针p,并赋给头指针的值*/FILE*fp;/*定义文件指针fp*/if((fp=fopen("成绩管理.txt","w"))==NULL)/*以写的方式打开record.txt文件且其为空*/{printf("Cannotopenthefile!");exit(0);/*退出*/}if(p==NULL)printf("\n该学生管理系统为空!没有学生信息!!!\n\n");else{while(p)/*结点数据域信息顺序写入文件*/{fprintf(fp,"姓名:%s学号:%s高等数学:%d大学英语读写:%d大学英语听说:%d计算机导论:%d程序设计基础:%d\n\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);/**/p=p->next;/*p后移一个结点*/}printf("\n已将学生的信息保存到文件中!!!\n\n");}fclose(fp);/*关闭文件*/returnhead;/*返回头指针*/}voidmain(){intkey;structstudent*head=NULL;while(key!=0){menuname();printf("请输入相应的功能键:");scanf("%d",&key);printf("\n");switch(key){case1:head=input(head);/*调用输入函数返回值赋给head*/break;case2:output(head);/*调用输入函数*/break;case3:head=insert(head);/*调用插入函数返回值赋给head*/break;case4:head=del(head);/*调用删除函数返回值赋给head*/break;case5:head=search(head);/*调用查找函数返回值赋给head*/break;case6:head=sort(head);/*调用排序函数返回值赋给head*/break;case7:head=save(head);/*调用保存文件函数返回值赋给head*/break;case0:printf("Thanks!");/*退出*/return;/*返回*/}}}
strcpy(name1,p->name);
strcpy(p->name,q->name);
strcpy(q->name,name1);
strcpy(num1,p->num);
strcpy(p->num,q->num);
strcpy(q->num,num1);
sa(&(q->math),&(p->math));
sa(&(q->English_rw),&(p->English_rw));
sa(&(q->English_ls),&(p->English_ls));
sa(&(q->dl),&(p->dl));
sa(&(q->pdb),&(p->pdb));
printf("\n\n已按学号排序!
printf("要查看按学号的顺序重新排序后学生管理系统的信息请按2!
node*save(node*head)/*定义保存文件函数*/
node*p=head;/*定义一个指向SNODE结构体的指针p,并赋给头指针的值*/
FILE*fp;/*定义文件指针fp*/
if((fp=fopen("成绩管理.txt","w"))==NULL)/*以写的方式打开record.txt文件且其为空*/
{printf("Cannotopenthefile!
exit(0);/*退出*/
if(p==NULL)
printf("\n该学生管理系统为空!
没有学生信息!
while(p)/*结点数据域信息顺序写入文件*/
fprintf(fp,"姓名:
%s学号:
%s高等数学:
%d大学英语读写:
%d大学英语听说:
%d计算机导论:
%d程序设计基础:
%d\n\n",p->name,p->num,p->math,p->English_rw,p->English_ls,p->dl,p->pdb);/**/
printf("\n已将学生的信息保存到文件中!
fclose(fp);/*关闭文件*/
voidmain()
intkey;
structstudent*head=NULL;
while(key!
=0)
menuname();
printf("请输入相应的功能键:
scanf("%d",&key);
switch(key)
case1:
head=input(head);/*调用输入函数返回值赋给head*/
break;
case2:
output(head);/*调用输入函数*/
case3:
head=insert(head);/*调用插入函数返回值赋给head*/
case4:
head=del(head);/*调用删除函数返回值赋给head*/
case5:
head=search(head);/*调用查找函数返回值赋给head*/
case6:
head=sort(head);/*调用排序函数返回值赋给head*/
case7:
head=save(head);/*调用保存文件函数返回值赋给head*/
case0:
printf("Thanks!
");/*退出*/
return;/*返回*/
}}
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1