测试与光电工程学院
课程设计任务书
测控技术与仪器 系 100814班 学号10081426姓名 李登
课题名称: 学生成绩管理系统的设计
课题要求:
使用C语言设计——学生成绩管理系统设计的编程
学生成绩信息包括:学期,学号,班级,姓名,四门课程成绩(语文,数学,英语,电路)等。
主要功能:
1、能按学期,按班级完成对学生成绩的录入,修改
2、能按班级统计学生的成绩,求学生的总分及平均分
3、能查询学生成绩,不及格科目及学生名单
4、能按班级输出学生的成绩单
课题进程:
(1)回顾C语言设计及数据结构设计的相关知识。2周
(2)设计基本架构。4周
(3)调试、完善、撰写报告。3周
主要参考资料:
[1] 谭浩强主编. C语言程序设计(第二版).清华大学出版社, 2005.
[2] 谭浩强.C程序设计题解与上机指导(第三版)[M]北京:清华大学出版社,20##年7月
[3] 郭翠英主编. C语言课程设计案例精编.中国水利水电出版社,2004
指导教师: 付跃文
摘 要:
随着网络通信技术的迅速发展和信息技术的广泛应用,计算机的应用已普及到经济和社会生活的各个领域。教育领域也不例外,现今已经出现了各种远程网络在线教育系统、图书馆管理系统、学籍管理系统,学生成绩管理系统等。其中成绩管理是任一院校都不可缺少的部分,它的内容对于学校的决策者和教学管理者来说都至关重要,而传统的人工管理方式效率较低,为数据的查询、更新和维护带来了极大的不便。所以学生成绩管理信息系统的开发和应用是必要的,它能够为管理人员提供充足的信息和快捷的查询手段,提高学校学生成绩管理的效率。
本文的学生成绩管理系统提供了强大的学生成绩管理管理功能,方便系统管理员对学生成绩等信息的添加、修改、删除、查询等操作,同时一样的方便学生对自己各科成绩查询,学习的交流。本系统也主要利用C语言实现,因此它具有很强的可移植性,很方便。
关键字:C语言 成绩管理 函数
指导老师签名:
目录
一、设计目的········································································································ 4
二、设计要求与功能描述·············································································· 4
1.设计要求···················································································································· 4
2.功能描述·························································································································································· 4
三、系统分析与设计························································································· 7
1、功能模块的设计分析································································································ 7
2、数据结构设计分析································································································· 10
3、函数功能描述········································································································ 11
四、系统调试与运行······················································································· 13
五、总结················································································································· 17
附录:······················································································································ 18
一、设计目的
进一步加深、巩固所学专业课程(《C程序设计》)的基本理论知识,理论联系实际,进一步培养学生综合分析问题和解决问题的能力。掌握运用C语言独立地编写、调试应用程序和进行其它相关设计的技能,充分发挥广大同学的潜力,通过本次课程设计而得到全面的锻炼。
二、设计要求与功能描述
1.设计要求
设计一个成绩管理系统,成绩管理系统数据信息构成内容可自行设计(如:学期、班级、学号、姓名、语文成绩、数学成绩、英语成绩、电路成绩、总分、平均成绩等等),成绩管理数据类型定义为结构体类型或用数组实现。要求实现成绩录入、修改、删除记录、显示、成绩排序、查询记录等功能。
2.功能描述
1)编辑成绩模块
编辑成绩模块主要完成对学生成绩信息的维护。在此学生成绩管理系统中,它将实生信息的修改、删除、插入操作。一般而言,系统进行了这下而操作之后,需要将修改的数据寻如源数据文件。
2)显示成绩模块
显示成绩模块是完成当使用者完成成绩的录入、修改、删除等操作后,想确认修改后的结果,将操作后的成绩显示出的任务。显示完成后,可以继续进行下一步操作。
3)查询成绩模块
查询成绩模块主要完成在数组中查找满足相关条件的记录。在此成绩管理系统中,用户可以按照学生姓名和不及格学生两种方式在数组中进行查找。若找到该记录,则以表格形式显示出此记录的信息;否则,显示出未找到该记录的提示信息。
4)成绩排序模块
编辑成绩排序模块主要完成对学生成绩进行排序的任务,在此学生成绩管理系统中,主要有按学生的平均成绩和学号进行排序,是由低到高的排序。
5)班级输出成绩模块
班级输出成绩模块就是输出某个班的全部学生成绩。只要输入某个班级,系统就会显示出这个班的成绩管理系统。
6)成绩文件模块
成绩文件模块模块主要完成两个任务。第一,实现对记录的存盘操作,即将数组中各元素之后存储的记录信息写入数据文件中。第二,实现将数组之中存储的记录信息以表格的形式在屏幕上打印显示出来。在此成绩管理系统中,成绩可以从以文本形式存储的数据文件中读入,也可以从键盘逐个输入记录。
如图2-1所示
图2-1 学生成绩管理系统功能模块图
三、系统分析与设计
1、功能模块的设计分析
1)主函数main()执行流程
如图3-1所示main()函数流程图,先进入主菜单程序,显示主菜单,以供使用者选择。
在判断键值时,有效输入为0——6之间的任意数值,其他输入都被视为错误按键。若输入为0,则退出系统,若输入为1——5,则系统会根据用户的选择,进行相应的操作。
图3-1 main()函数流程图
若选择1,则调用bianji()函数,执行对成绩的录入和修改操作;若选择2,则调用xianshi()函数,执行将学生成绩以表格形式打印输出至屏幕的操作;若选择3,则调用chaxun()函数,执行对成绩的查询操作;若选择4,则调用paixu()函数,执行查询成绩操作;若选择5,则调用cjdan()函数,执行以班级为单位输出成绩的操作;若选择6,则调用wenjian()函数,执行从文件读入数据和将数据保存至文件操作;若输入为0——6之外的值,则自动跳转至菜单页面。
2)编辑成绩模块
编辑成绩模块主要实现按学期和班级对学生成绩进行录入、修改和删除的操作。录入成绩时,它调用xianshi(Student stud[],int n)函数,修改成绩时,调用xiugai(Student stud[],int n)函数,删除成绩时,先输入所要删除学生的姓名,调用shanchu(Student stud[],int n) 函数执行删除操作,执行完后系统调用显示函数显示出所最终的成绩,并且这个操作在main()中调用执行。
录入成绩
录入成绩操作完成在所有成绩的随后位置插入新的成绩信息。具体录入成绩则是顺着录入函数显示出来的提示信息一步一步进行录入,如提示使用者输入学期、班级以及各科成绩。
修改成绩
修改成绩操作需要对数组中目标元素的数据域中的值进行修改。分两步完成。第一步,输入要修改学生的学号,输入后系统将输入的学号和结构数据库中的所有学号作比较,进行查找;第二步,若找到该学号的学生,则进行选择修改姓名、各科成绩。
删除记录
删除记录操作操作完成删除指定联系人姓名或电话号码的记录,也分两步完成。第一步,输入要删除的学生姓名,输入后调用删除函数int shanchu(Student stud[],int n)在结构数据库中逐个对学生姓名字段的值进行比较,直到找到该名学生的姓名,返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所在的元素的后续元素起,一次向前移一个元素位置,有值的数组元素个数减1,如图3-2所示,在删除了数组元素A2之后,数组元素A3和A4向前移动了一个位置。
删除A2前
删除A2后
图3-2数组中删除记录示意图
3)显示成绩模块
显示成绩模块主要实现将此时的成绩信息显示出来的功能。在显示函数中,为了遵循模块化编程的原则,将显示操作设计成了一个单独的函数void xianshi(Student stud[],int n)。
4)查询成绩模块
查询成绩模块主要是对成绩的查询操作,此成绩管理系统分为按学生姓名查询和不及格学生信息查询。按学生姓名查询时调用void chaxun_xingming(Student stud[],int n) 函数,先将输入姓名对数据结构中的所有姓名进行比对,当发现有和输入的姓名一致时,则输出所找到的学生成绩信息,同理,查询不及格学生时调用void chaxun_bujige(Student stud[],int n)函数,对数据结构中所有学生所有科目成绩与60相比对,60分以下则将此学生信息按表格输出。
5)成绩排序模块
此成绩管理系统中学生成绩排序分为按平均成绩和按学号排序成绩排序两种,都选用了冒泡排序法,冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。 本程序采用这种排序法来实现按照学生平均成绩或学生学号值从低到高对记录进行升序排序。
冒泡排序有两个优点:1.“编程复杂度”很低,很容易写出代码;2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,而堆排序、快速排序均不具有稳定性。
6)班级成绩输出模块
当需要按班级输出成绩单时,提示使用者输入一班级名,然后调用void cjdan(Student stud[],int n)函数将输入的班级与结构数据中的班级进行对比,最终使用for循环语句将输入班级中的所有学生成绩以表格的方式显示出来。
成绩文件模块
调用void wenjian1(Student stud[],int n)和void wenjian2(Student stud[],int n)两个函数,分别进行将文件中的数据读入和将数据保存至文件的操作,操作后要输入文件名,方可打开文件,否则文件容易丢失。当系统显示Successed!则说明操作成功。
2、数据结构设计分析
程序定义了结构体Student stu[99],用于存放联系人的基本信息。
typedef struct
{
char xq[10];
char cla[10];
char num[10];
char name[10];
int chinese;
int math;
int english;
int dianlu;
int sum;
double aver;
}Student;
xq[10];保存学期; cla[10];保存班级号 num[10];保存学生学号;
name[10]; 保存学生姓名; chinese :语文成绩; math:数学成绩;
english:英语成绩 dianlu电路成绩 sum:总分 aver:平均成绩
3、函数功能描述
1)shuru( )
函数原型:int shuru( )
shuru( )函数用于录入学生的成绩信息。
2)xianshi()
函数原型:void xianshi(Student stud[],int n)
xianshi()函数用于以表格显示的方式,输出所有学生的成绩信息。
3)
xiugai(()
函数原型:void xiugai(Student stud[],int n)
xiugai(()函数用于修改学生成绩和信息中的内容
4)shanchu()
函数原型:int shanchu(Student stud[],int n)
shanchu()函数用于将已录入或文件中的学生成绩进行删除的函数。
5)chaxun()
函数原型:void chaxun_xingming(Student stud[],int n)和void chaxun_bujige(Student stud[],int n)
chaxun()函数用于对学生成绩数据进行查询的函数,void chaxun_xingming(Student stud[],int n)是按学生姓名进行查询,void chaxun_bujige(Student stud[],int n)是按照不及格的学生成绩进行查询。
6)wenjian()
函数原型:void wenjian1(Student stud[],int n)和void wenjian2(Student stud[],int n)
wenjian()函数用于将学生成绩数据存入文件或读入文件成绩数据的函数,void wenjian1(Student stud[],int n)是从文件中读入,void wenjian2(Student stud[],int n)是将学生成绩存入文件。
7)paixu()
函数原型:void paixu_xuehao(Student stud[],int n)和void paixu_pingjun(Student stud[],int n)
paixu()函数用于对相应的学生成绩进行排序,并显示出来。void paixu_pingjun(Student stud[],int n)是按学生平均成绩进行排序void paixu_xuehao(Student stud[],int n)则是按学生的学号进行排序。
13)主函数main()
Main()时整个学生成绩管理系统的控制部分。主要实现对整个程序的运行控制,以及相关功能模块的调用。
四、系统调试与运行
1、主界面
当用户进入成绩管理系统时,主界面如图4-1所示。显示出成绩管理系统的主菜单,可以选择0——6之间的数值,调用相关的功能。当输入为0的时候,退出管理系统。
图4-1
2、编辑成绩
当用户输入1并按enter键后,进入成绩编辑界面,进入录入和修改选择的选项,可以对成绩进行录入或修改、和删除操作。输入过程如下所示。
图4-2
按1进行录入操作时,过程如下图
按2进行修改操作是,过程如下图:
3、显示记录
当执行了输入记录或已经从文件中读取了记录之后,即可输入2并按enter键,查看当前数组中的记录情况。如图4-3所示。
图4-3
4、成绩查询
当输入3并按enter键后,即可进入记录成绩查询界面。如入4-4所示。
图4-4
按姓名查询
在成绩查询的界面输入1进入按姓名查询操作,过程如下图:
不及格科目及学生信息查询:
输入2进入不及格科目及学生信息查询,如下图:
5、成绩排序
当输入4并按enter键后,即可进入成绩排序界面。查找过程如图4-5所示。
可以按学号或平均成绩进行记录查找。
图4-5
6、班级输出成绩单
当输入5并按enter键后,即可进入班级输出成绩界面。如图4-6所示。
图4-6
7、文件保存
当输入6并按enter键后即可进入文件保存界面。如图4-7所示。
图4-7
五、总结
不觉之中计算机课程设计很快结束了,通过这一段时间的设计使我学到了
许多,以前对C语言的认识比较肤浅,不过在不断尝试中我知道能利用C语言解决比较复杂的问题,也对许多函数有了很深的认识。通过这次语言课程设计,感到要想对一门课程了解深刻就必须亲自身入其中的去体验,这样才能发现自己的很多缺点,才能一一的去克服,也才能真正的学到知识,也明白了那句“纸上谈来终觉浅,深知此是要躬行”的真正意义。纵然把结论书本背得滚瓜烂熟而不运用与实际,也不过是纸上谈兵罢了,终究在未来需要动手能力和实践人才的社会竞争中被淘汰,所以我们需要实际的操作,需要更多的实践训练,这样才能成为真正的二十一世纪合格的大学生!学到了设计一个简单的系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。这不仅是程序设计,更是锻炼我们处理问题的能力,同时也使我们了解到团队合作的可贵.编写程序是件细心活,稍不留神就会出错,这就必须要求我们对待事情要认真!在编写程序的过程中,错误不断出现,不同的类型(如少写了一个符号,写错了字母,用错了函数等等)层出不穷,这考验我们待事细心,耐心,能不能坚持到底,不能半途而废。
但我们总结出了一点点的经验如下:
1、要对系统的功能和要求做出详细的分析,并合理分解任务。
2、把分解出来的子任务,做给一个相对独立的模块。
3、在设计一个模块之前,要简单构想一下总界面的显视情况。
4、针对构想出来的界面进行程序的编写。
附录:
程序源代码:
#include"stdio.h"
#include<stdlib.h>
#include<string.h>
#include"process.h"
#include"ctype.h"
typedef struct
{
char xq[10];
char cla[10];
char num[10];
char name[10];
int chinese;
int math;
int english;
int dianlu;
int sum;
double aver;
}Student;
Student stu[99];
int shuru(Student stud[],int n)/*输入若干条记录*/
{
int i=0;
char sign,x[10];
double a=0.0;
while(sign!='n'&&sign!='N')
{
printf("输入学期(如01):");
scanf("%s",stu[n+i].xq);
printf("输入班级:");
scanf("%s",stu[n+i].cla);
printf("输入学生学号(学号为8位 如10010101):");
scanf("%s",stu[n+i].num);
printf("输入学生姓名:");
scanf("%s",stu[n+i].name);
printf("输入学生的语文 数学 英语 电路分数:");
scanf("%d%d%d%d",&stu[n+i].chinese,&stu[n+i].math,&stu[n+i].english,&stu[n+i].dianlu);
stu[n+i].sum=stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu;
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
gets(x); /*清除多余的输入*/
printf("是否继续输入?(Y/N):\n");
scanf("%c",&sign);
i++;
}
return(n+i);
}
void xianshi(Student stud[],int n) /*显示所有记录*/
{
int i ;
double a=0.0;
printf("---------------------------------------------------------------------\n"); /*格式头*/
printf("┃学期┃班级┃ 学号 ┃ 姓名 ┃语文┃数学┃英语┃电路┃总分┃平均成绩┃\n");
printf("---------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
printf("┃%-4s┃%-4s┃%-8s┃%-6s┃%4d┃%4d┃%4d┃%4d┃%4d┃%-8.2f┃\n",stu[i].xq,stu[i].cla,stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu,stu[i].aver);
}
}
void xiugai(Student stud[],int n)/*修改*/
{
int i=0,choice=1; double a=0.0;
char x[10];
while(choice!=0)
{ printf("请输入您要修改的学生的学号(学号为数字 如10010101):\n");
scanf("%s",x);
for(i=0;;i++)
{
if(strcmp(stu[i].num,x)==0) break;
}
printf("请选择您要修改的内容:\n");
printf(" ---------------------- \n");
printf("| 姓名 请按 1 |\n");
printf("| 语文 请按 2 |\n");
printf("| 数学分数 请按 3 |\n");
printf("| 英语分数 请按 4 |\n");
printf("| 电路 请按 5 |\n");
printf("| 退出 请按 0 |\n");
printf("+----------------------+\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch(choice)
{
case 0:break;
case 1:
printf("请输入新姓名:");
scanf("%s", stu[i].name);
break;
case 2:
printf("请输入新的语文分数:");
scanf("%d", &stu[i].chinese);
break;
case 3:
printf("请输入新的数学分数:");
scanf("%d",&stu[i].math);
break;
case 4:
printf("请输入新的英语分数:");
scanf("%d", &stu[i].english);
break;
case 5:
printf("请输入新的电路分数:");
scanf("%d", &stu[i].dianlu);
break;
default:
printf("\n无效选项!");
break;
} break;stu[n+i].sum=stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu;
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
}
return;
}
int shanchu(Student stud[],int n) /*按姓名查找,删除一条记录*/
{ char s[20];
int i;
int j;
i=0;
printf("输入要删除记录的姓名:");
scanf("%s",s);
while(strcmp(stu[i].name,s)!=0&&i<n) i++;
if(i==n)
{printf("not find!\n");
return(n); }
for(j=i;j<n-1;j++) /*删除操作*/
{
strcpy(stu[j].xq,stu[j+1].xq);
strcpy(stu[j].cla,stu[j+1].cla);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].chinese=stu[j+1].chinese;
stu[j].math=stu[j+1].math;
stu[j].english=stu[j+1].english;
stu[j].dianlu=stu[j+1].dianlu;
stu[j].sum=stu[j+1].sum;
stu[j].aver=stu[j+1].aver;
}
printf("Delete Successed!\n");
return(n-1);
}
void chaxun_xingming(Student stud[],int n) /*按姓名查找并显示一个记录*/
{ char s[20];
int i=0; double a=0.0;stu[n+i].sum=stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu;
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
printf("输入姓名:");
scanf("%s",s);
while(strcmp(stu[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{printf("not find!\n"); /*输入失败信息*/
return;
} stu[n+i].sum=stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu;
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
printf("他的姓名、学号是:%s %s\n",stu[i].name,stu[i].num); /*输出该学生信息*/
printf("语文 高数 英语 电路 总分 平均成绩是:%d,%d,%d,%d,%d,%lf\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].sum,stu[i].aver);
}
void chaxun_bujige(Student stud[],int n)/*按不及格成绩查找并显示一个记录*/
{
int i;
printf("****************不及格名单及科目成绩****************\n");
printf("┃学期┃班级┃ 学号 ┃ 姓名 ┃语文┃数学┃英语┃电路┃总分┃平均成绩┃\n");
printf("---------------------------------------------------------------------\n");
for(i=0;i<n;i++)
if((stud[i].chinese<60)||(stud[i].english<60)||(stud[i].math<60)||(stud[i].dianlu<60))
printf("┃%-4s┃%-4s┃%-8s┃%-6s┃%4d┃%4d┃%4d┃%4d┃%4d┃%-8.2f┃\n",stu[i].xq,stu[i].cla,stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu,stu[i].aver);
return;
}
int wenjian2(Student stud[],int n) /*从文件中读入数据*/
{ int i=0,num;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t\t\tInput the filename:");
scanf("\t\t\t%s",filename); /*输入文件名*/
if((fp=fopen(filename,"rb"))==NULL) /*打开文件*/
{ printf("\t\t\tcann't open the file\n"); /*打开失败信息*/
printf("\t\t\t");
system("pause");
return(n);
}
fscanf(fp,"%d",&num); /*读入总记录量*/
while(i<num) /*循环读入数据*/
{
fscanf(fp,"%s %s %d %d %d %d %d %lf\n",stu[n+i].num,stu[n+i].name,&stu[n+i].chinese,&stu[n+i].math,&stu[n+i].english,&stu[n+i].dianlu,&stu[n+i].sum,&stu[n+i].aver);
i++;
}
n+=num;
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void wenjian1(Student stud[],int n) /*将所有记录写入文件*/
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("Input the filename:");/*输入文件名*/
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打开文件*/
{
printf("cann't open the file\n");
return;
}
fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)
{
fprintf(fp,"%s %s %d %d %d %d %d %lf\n",stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].sum,stu[i].aver);
i++;
}
fclose(fp); /*关闭文件*/
printf("Successed!\n"); /*返回成功信息*/
}
void paixu_xuehao(Student stud[],int n) /*按学号排序*/
{ int i,j,p,q,r,w,s;
double y;
char x[20],t[10],o[20],m[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(strcmp(stud[j].num,stud[j+1].num)>0)
{ strcpy(o,stud[j].xq);
strcpy(stud[j].xq,stud[j+1].xq);
strcpy(stud[j+1].xq,o);
strcpy(m,stud[j].cla);
strcpy(stud[j].cla,stud[j+1].cla);
strcpy(stud[j+1].cla,m);
strcpy(t,stud[j].num);
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j+1].num,t);
strcpy(x,stud[j].name);
strcpy(stud[j].name,stud[j+1].name);
strcpy(stud[j+1].name,x);
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
s=stu[j].sum;stu[j].sum=stu[j+1].sum;stu[j+1].sum=s;
}
return;
}
void paixu_pingjun(Student stud[],int n) /*按平均成绩排序*/
{ int i,j,p,q,r,w,s;
double y;
char x[20],t[10],o[20],m[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].aver>stu[j+1].aver)
{ y=stu[j].aver; stu[j].aver=stu[j+1].aver; stu[j+1].aver=y;
p=stu[j].chinese; stu[j].chinese=stu[j+1].chinese; stu[j+1].chinese=p;
q=stu[j].math; stu[j].math=stu[j+1].math; stu[j+1].math=q;
r=stu[j].english; stu[j].english=stu[j+1].english; stu[j+1].english=r;
w=stu[j].dianlu; stu[j].dianlu=stu[j+1].dianlu; stu[j+1].dianlu=w;
s=stu[j].sum; stu[j].sum=stu[j+1].sum; stu[j+1].sum=s;
strcpy(o,stud[j].xq);
strcpy(stud[j].xq,stud[j+1].xq);
strcpy(stud[j+1].xq,o);
strcpy(m,stud[j].cla);
strcpy(stud[j].cla,stud[j+1].cla);
strcpy(stud[j+1].cla,m);
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
int menu() /*菜单函数*/
{
int c;
do{
printf(" *************学生信息管理系统菜单*************\n");
printf("\t\t制作者:10081426 李登\n");
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ ┃\n");
printf("┃ 0.退出系统 1.编辑成绩 ┃\n");
printf("┃ ┃\n");
printf("┃ 2.显示成绩 3.查询成绩 ┃\n");
printf("┃ ┃\n");
printf("┃ 4.成绩排序 5.班级输出 ┃\n");
printf("┃ ┃\n");
printf("┃ 6.成绩文件 ┃\n");
printf("┃ ┃\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("************************************************************\n");
printf("\t\t\t请选择(0-6):");
scanf("%d",&c);
}while(c<0||c>6);
return(c-0); /*返回选择*/
}
int bianji()
{ int i;
printf("\t\t 1. 录入\n");
printf("\t\t 2 .修改\n");
printf("\t\t 3. 删除 \n");
printf("\t\t 按其它数字键退出 \n");
scanf("%d",&i);
return i;
}
int chaxun()
{int i;
printf("\t\t 1.按姓名查询\n");
printf("\t\t 2.不及格科目查询\n");
printf("\t\t 按其它数字键退出\n");
scanf("%d",&i);
return i;
}
int paixu()
{ int i;
printf("\t\t 1. 按学号\n");
printf("\t\t 2 .按平均成绩\n");
printf("\t\t按其它数字键退出\n");
scanf("%d",&i);
return i;
}
int wenjian()
{ int i;
printf("\t\t 1. 从文件中读入数据\n");
printf("\t\t 2 .将所有记录写入文件\n");
printf("\t\t 按其它数字键退出 \n");
scanf("%d",&i);
return i;
}
void cjdan(Student stud[],int n)/*按班级显示学生成绩单*/
{
char number[20];
int i,j=1;
printf("\n请输入待输出的学生班级号,按回车键确认:\n",number);
scanf("%s",number);
printf("*********************所查班级信息如下*******************\n");
printf(" 班级 学号 姓名 语文 数学 英语 电路 总分 \n");
printf("---------------------------------------------------------------------\n");
for(i=0;i<n;i++)
{
if(strcmp(number,stu[i].cla)!=0) continue;
printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\n",stu[i].cla,stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].chinese+stu[i].math+stu[i].english+stu[i].dianlu);
}
}
void main() /*主函数*/
{
int n=0;
for(;;)
{
for(;;)
{
switch(menu())
{
case 1: switch(bianji())
{
case 1:n=shuru(stu,n);xianshi(stu,n); break;
case 2:xiugai(stu ,n);xianshi(stu,n); break;
case 3:shanchu(stu ,n);xianshi(stu,n); break;
} break;
case 2:xianshi(stu,n);break;
case 3:
switch(chaxun())
{
case 1:chaxun_xingming(stu,n);break;
case 2:chaxun_bujige(stu,n);break;
} break;
case 4: switch(paixu())
{
case 1:paixu_xuehao(stu,n);xianshi(stu,n); break ;
case 2:paixu_pingjun(stu ,n);xianshi(stu,n); break;
} break;
case 5:
cjdan(stu,n);break;
case 6:
switch(wenjian())
{
case 1:n=wenjian2(stu,n);break;
case 2:wenjian1(stu ,n);break;
} break;
case 0:
exit(0); /*结束程序*/
}
}
}
}