学生成绩管理系统链表版Word文档格式.docx
《学生成绩管理系统链表版Word文档格式.docx》由会员分享,可在线阅读,更多相关《学生成绩管理系统链表版Word文档格式.docx(46页珍藏版)》请在冰豆网上搜索。
系统全局变量intn;
chara;
头文件:
#include"
stdio.h"
time.h"
string.h"
stdlib.h"
conio.h"
2.3系统的函数介绍
把系统中的每个函数的原型列出来,解释一下函数的返回值及形式参数的含义;
最后,再介绍一下每个函数的功能。
voidCreate(intn)//创建链表
voidList()//输出链表内容
voidlist()//输出链表所有内容
voidsave()//文件保存
voidsave1()//文件保存
voidread()//文件读取
voidread1()//文件读取
voidSAVE(){//保存到可浏览文件
voidSAVE1()//保存到可浏览文件
voidsort_data_copy(Lstu*p,Lstu*s)//交换排序时的值
voidsort()//对初始成绩进行排序
voidsort1()//对所有数据进行排序
voidsearch_print(Lstu*p)//输出查找信息
voidsearch_choose()//选择按分数段查找方式
voidsearch()//查找
voidmodify_choose(Lstu*p,intn)//选择修改方式
voidmodify()//按姓名修改
voidInsert()//按序号插入
voiddel()//按姓名删除
voidstatistics()//成绩统计
intmenu()//菜单(主界面)
第3章第3章详细设计
按函数,写出函数的原型声明,并画出每个函数的程序流程图。
3.1主函数设计
函数
3.2录入函数设计
添加的信息包括学号(不允许重复)、姓名(不允许重复)、语文成绩、数学成绩和英语成绩,如流程图所示:
本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。
尾插法建立单链表操作示意图
3.3排序函数设计
可按照学号、语文成绩、数学成绩、英语成绩和平均分分别排序。
如图所示:
3.4查找函数设计
按姓名、学号和分数段查找学生成绩的流程图分别如下图4.3所示。
图4.3按姓名查找学生成绩信息流程图
在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。
当p指向某个结点时判断是否为第i个结点,若是则查找成功;
否则,将工作指针p后移,即将p指向原来所指结点的后继结点。
直到p为NULL时查找失败。
单链表查找过程如图4.4所示。
图4.4单链表查找过程的示意图
按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。
(3)学生成绩修改模块
3.5修改函数设计
首先要查找与要修改数据相匹配的信息,若没有则返回失败。
否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。
3.6插入函数设计
首先要确定插入数据的位置,执行插入操作,然后再输入数据并保存到单链表。
3.7删除函数设计
当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。
其流程图如下:
删除操作定义为将单链表的第i个结点删去。
因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图4.6所示。
在单链表中删除结点指针的变化情况
3.8保存函数设计
输入学生信息应保存到学生基本信息文件中,修改后的信息将可保存到可浏览的文件,如图所示:
3.9显示函数设计
从单链表表头遍历整个单链表,将所有数据输出。
其部分代码如下:
voidread(){//文件读取
FILE*fp;
Lstu*p,*p1;
if((fp=fopen("
初始值二进制.txt"
"
rb"
))==NULL)
{
printf("
Cannotopenthefile\n"
);
exit(0);
}head=(Lstu*)malloc(sizeof(Lstu));
p1=head;
while(!
feof(fp)){
p=(Lstu*)malloc(sizeof(Lstu));
if(fread(p,sizeof(Lstu),1,fp)==1)
p1->
next=p;
p1=p1->
next;
}
}head=head->
fclose(fp);
}
3.10退出函数设计
第4章第4章测试
主要进行功能性测试,即验证各个功能模块是否正确运行。
可以采用运行系统进行截图的方法来验证系统结果的正确性。
在完成了系统各方面的设计后,并不是可以运行就完成的,为了保证系统性能的稳定性跟安全性等,就要对系统做测试。
测试环境如下:
硬件:
P4C2.4GHz,500GB硬盘,2内存;
软件:
Windows7PersonalSP1,分辨率1366*768,MicrosoftVisualC++6.0。
运行的主界面如图所示:
1点击1输入学生相关信息,如图所示:
2浏览初始学生信息,如图所示:
3查看初始学生总分及平均分,如图所示:
4查找,如图所示:
按姓名查找:
5初始学生成绩排序,如图所示:
按平均成绩进行排序:
6插入新成绩,如图所示:
7按姓名修改某位学生的成绩,如图所示:
选择修改数学成绩:
8按姓名删除某位学生的成绩,如图所示:
9浏览所有学生的信息及排名,如图所示:
10保存最终结果到可浏览的文件中,如图所示:
⑾统计,如图所示:
总结
写这次实验课的收获和感想。
参考文献
附录程序源代码
//程序名称:
xsglxt.CPP
//程序功能:
采用链表与文件实现一个简单的学生成绩管理系统。
#defineNULL0
typedefstructLstu{
intcla,ID;
longnum;
charname[20];
charsex[20];
floatchinese,math,english;
floatsum,ave;
Lstu*next;
}Lstu;
Lstu*head;
voidCreate(intn){//创建链表
Lstu*p,*s;
inti;
for(i=0;
i<
n;
i++){
if(i==0){
p=(Lstu*)malloc(sizeof(Lstu));
printf("
请输入第%d个人的信息\n"
i+1);
请输入班级:
"
scanf("
%d"
&
p->
cla);
请输入学号:
%ld"
num);
请输入姓名:
%s"
p->
name);
请输入性别:
sex);
请输入语文成绩:
%f"
chinese);
请输入数学成绩:
math);
请输入英语成绩:
english);
p->
sum=p->
chinese+p->
math+p->
english;
ave=p->
sum/3;
head=p;
if(n==1){
p->
next=NULL;
}}
else{
s=(Lstu*)malloc(sizeof(Lstu));
s->
s->
s->
sum=s->
chinese+s->
math+s->
ave=s->
next=s;
p=s;
voidList(){//输出链表内容
Lstu*p;
inti=0;
p=head;
if(p==NULL){
Sorry,It'
saEmptyList\n"
printf("
\n\n\t------------------------------------------------------------------\n"
\t%-5s%-5s%-10s%-8s%-7s%-10s%-10s%-10s\n"
序号"
班级"
学号"
姓名"
性别"
语文成绩"
数学成绩"
英语成绩"
\t------------------------------------------------------------------\n"
while(p){i++;
ID=i;
\t%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f\n"
ID,p->
cla,p->
num,p->
name,p->
sex,p->
chinese,p->
math,p->
p=p->
voidlist(){//输出链表所有内容
\n----------------------------------------------------------------------------------\n"
%-5s%-5s%-7s%-8s%-7s%-10s%-10s%-10s%-8s%-8s\n"
"
总分"
平均分"
----------------------------------------------------------------------------------\n"
%-4d%-6d%-12d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2f\n"
sex,
english,p->
sum,p->
ave);
voidsave(){//文件保存
wb"
Cannotopenthefile"
while(p){
fwrite(p,sizeof(Lstu),1,fp);
fclose(fp);
voidsave1(){//文件保存
初始值二进制备用.txt"
voidread1(){//文件读取
voidSAVE(){//保存到可浏览文件
inti=0;
初始值可浏览文件.txt"
w+"
fprintf(fp,"
\t------------------------------------------------------------------\n\n"
i++;
fprintf(fp,"
name,
voidSAVE1(){//保存到可浏览文件
charfilename[20];
请输入保存到可浏览文件的文件名:
scanf("
filename);
if((fp=fopen(filename,"
%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2f\n"
-------------------------------------------------------------------------------\n"
voidsort_data_copy(Lstu*p,Lstu*s){//交换排序时的值
intcla1;
cla1=p->
cla;
cla=s->
cla=cla1;
longnum1;
num1=p->
num;
num=s->
num=num1;
charname1[20];
strcpy(name1,p->
strcpy(p->
name,s->
strcpy(s->
name,name1);
charsex1[20];
strcpy(sex1,p->
sex,s->
sex,sex1);
floatchinese1;
chinese1=p->
chinese;
chinese=s->
chinese=chinese1;
floatmath1;
math1=p->
math;
math=s->
math=math1;
floatenglish1;
english1=p->
english=s->
english=english1;
floatsum1;
sum1=p->
sum;
sum=sum1;
floatave1;
ave1=p->
ave;
ave=ave1;
voidsort(){//对初始成绩进行排序
intn;
read();
p=head;
\n按Enter键继续\n"
a=getch();
else{while
(1){system("
cls"
printf("
\n排序前结果为:
\n"
read();
list();
\t*=*=*=*=*=*=*=*=*=*=*=按学号排序
(1)\n"
\t*=*=*=*=*=*=*=*=*=*=*=按语文成绩排序
(2)\n"
\t*=*=*=*=*=*=*=*=*=*=*=按数学成绩排序(3)\n"
\t*=*=*=*=*=*=*=*=*=*=*=按英语成绩排序(4)\n"
\t*=*=*=*=*=*=