学生成绩管理系统(链表版).doc
《学生成绩管理系统(链表版).doc》由会员分享,可在线阅读,更多相关《学生成绩管理系统(链表版).doc(47页珍藏版)》请在冰点文库上搜索。
![学生成绩管理系统(链表版).doc](https://file1.bingdoc.com/fileroot1/2023-4/28/d10c6906-8c04-4923-8554-dd04d107e7a8/d10c6906-8c04-4923-8554-dd04d107e7a81.gif)
《C语言应用》实验报告
题目
学生成绩管理系统(链表版)
目录
第1章 需求分析 3
第2章 总体设计 3
2.1系统的程序流程图 3
2.2系统的全局变量和常量 3
2.3系统的函数介绍 3
第3章 详细设计 3
3.1主函数设计 3
3.2录入函数设计 4
3.3排序函数设计 4
3.4查找函数设计 4
3.5修改函数设计 4
3.6插入函数设计 4
3.7删除函数设计 4
3.8保存函数设计 4
3.9显示函数设计 4
3.10退出函数设计 4
第4章 测试 5
总结 5
参考文献 5
附录程序源代码 5
第1章第1章需求分析
(1)能完成学生成绩的插入、查询、修改、删除、输出等功能;
(2)采用单链表存储结构实现;
(3)所有数据以外部文件方式保存
第2章第2章总体设计
2.1系统的程序流程图
绘制一个系统的总体程序流程图,主要展示系统从开始以后,可以经过哪些流程,最后结束。
按姓名修改某位同学的成绩按姓名修改某位同学的成绩输出链表内容输出链表内容进入系统
浏览初始学生信息
按姓名修改某位同学的成绩
输入同学的相关信息
查找
按姓名删除某位同学的成绩
初始学生成绩排序
浏览所有同学的信息及排名
插入新的成绩
查看初始学生总分及平均分
保存最终结果到可浏览文件
退出系统
主菜单
统计
学生信息录入
2.2系统的全局变量和常量
系统全局变量intn;chara;
头文件:
#include"stdio.h"
#include"time.h"
#include"string.h"
#include"stdlib.h"
#include"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排序函数设计
可按照学号、语文成绩、数学成绩、英语成绩和平均分分别排序。
如图所示:
结束
输入排序编号
判断
抱歉,没有此排序
输出学生的信息
排序开始
N
Y
3.4查找函数设计
按姓名、学号和分数段查找学生成绩的流程图分别如下图4.3所示。
结束
输入要查找姓名
判断
抱歉没有该学生
输出该学生的信息
按姓名
查找开始
N
Y
图4.3按姓名查找学生成绩信息流程图
在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。
当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。
直到p为NULL时查找失败。
单链表查找过程如图4.4所示。
图4.4单链表查找过程的示意图
按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。
(3)学生成绩修改模块
3.5修改函数设计
首先要查找与要修改数据相匹配的信息,若没有则返回失败。
否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。
返回主菜单
开始修改操作
输入姓名
姓名一致
执行修改功能
N
Y
3.6插入函数设计
首先要确定插入数据的位置,执行插入操作,然后再输入数据并保存到单链表。
开始插入操作
选择要插入的位置
判断插入的位置
执行插入功能
N
Y
返回主菜单
3.7删除函数设计
当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。
其流程图如下:
开始删除操作
输入姓名
姓名姓名一致
执行删除功能
返回主菜单
N
Y
删除操作定义为将单链表的第i个结点删去。
因为在单链表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai的后继结点,即把结点ai从链上摘下来,最后释放结点ai的存储空间,如图4.6所示。
在单链表中删除结点指针的变化情况
3.8保存函数设计
输入学生信息应保存到学生基本信息文件中,修改后的信息将可保存到可浏览的文件,如图所示:
开始保存操作
输入保存到文件名
判断文件名的格式
执行删除功能
返回主菜单
N
Y
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->next;fclose(fp);
}
3.10退出函数设计
第4章第4章测试
主要进行功能性测试,即验证各个功能模块是否正确运行。
可以采用运行系统进行截图的方法来验证系统结果的正确性。
在完成了系统各方面的设计后,并不是可以运行就完成的,为了保证系统性能的稳定性跟安全性等,就要对系统做测试。
测试环境如下:
l硬件:
P4C2.4GHz,500GB硬盘,2内存;
l软件:
Windows7PersonalSP1,分辨率1366*768,MicrosoftVisualC++6.0。
运行的主界面如图所示:
①点击1输入学生相关信息,如图所示:
②浏览初始学生信息,如图所示:
③查看初始学生总分及平均分,如图所示:
④查找,如图所示:
按姓名查找:
⑤初始学生成绩排序,如图所示:
按平均成绩进行排序:
⑥插入新成绩,如图所示:
⑦按姓名修改某位学生的成绩,如图所示:
选择修改数学成绩:
⑧按姓名删除某位学生的成绩,如图所示:
⑨浏览所有学生的信息及排名,如图所示:
⑩保存最终结果到可浏览的文件中,如图所示:
⑾统计,如图所示:
总结
写这次实验课的收获和感想。
参考文献
附录程序源代码
//程序名称:
xsglxt.CPP
//程序功能:
采用链表与文件实现一个简单的学生成绩管理系统。
#include"stdio.h"
#include"time.h"
#include"string.h"
#include"stdlib.h"
#include"conio.h"
#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;iif(i==0){
p=(Lstu*)malloc(sizeof(Lstu));
printf("请输入第%d个人的信息\n",i+1);
printf("请输入班级:
");scanf("%d",&p->cla);
printf("请输入学号:
");scanf("%ld",&p->num);
printf("请输入姓名:
");scanf("%s",p->name);
printf("请输入性别:
");scanf("%s",p->sex);
printf("请输入语文成绩:
");scanf("%f",&p->chinese);
printf("请输入数学成绩:
");scanf("%f",&p->math);
printf("请输入英语成绩:
");scanf("%f",&p->english);
p->sum=p->chinese+p->math+p->english;
p->ave=p->sum/3;
head=p;
if(n==1){
p->next=NULL;}}
else{
s=(Lstu*)malloc(sizeof(Lstu));
printf("请输入第%d个人的信息\n",i+1);
printf("请输入班级:
");scanf("%d",&s->cla);
printf("请输入学号:
");scanf("%ld",&s->num);
printf("请输入姓名:
");scanf("%s",s->name);
printf("请输入性别:
");scanf("%s",s->sex);
printf("请输入语文成绩:
");scanf("%f",&s->chinese);
printf("请输入数学成绩:
");scanf("%f",&s->math);
printf("请输入英语成绩:
");scanf("%f",&s->english);
s->sum=s->chinese+s->math+s->english;
s->ave=s->sum/3;
p->next=s; p=s;
s->next=NULL;}
}
}
voidList(){//输出链表内容
Lstu*p;
inti=0;
p=head;
if(p==NULL){
printf("Sorry,It'saEmptyList\n");}
else{
printf("\n\n\t------------------------------------------------------------------\n");
printf("\t%-5s%-5s%-10s%-8s%-7s%-10s%-10s%-10s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩","英语成绩");
printf("\t------------------------------------------------------------------\n");
while(p){i++;p->ID=i;
printf("\t%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f\n",p->ID,p->cla,p->num,p->name,p->sex,p->chinese,p->math,p->english);
printf("\t------------------------------------------------------------------\n");
p=p->next;
}
}
}
voidlist(){//输出链表所有内容
Lstu*p;
inti=0;
p=head;
if(p==NULL){
printf("Sorry,It'saEmptyList\n");}
else{
printf("\n----------------------------------------------------------------------------------\n");
printf("%-5s%-5s%-7s%-8s%-7s%-10s%-10s%-10s%-8s%-8s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩",
"英语成绩","总分","平均分");
printf("----------------------------------------------------------------------------------\n");
while(p){i++;p->ID=i;
printf("%-4d%-6d%-12d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2f\n",p->ID,p->cla,p->num,p->name,p->sex,
p->chinese,p->math,p->english,p->sum,p->ave);
printf("----------------------------------------------------------------------------------\n");
p=p->next;
}
}
}
voidsave(){//文件保存
FILE*fp;
Lstu*p;
p=head;
if((fp=fopen("初始值二进制.txt","wb"))==NULL)
{
printf("Cannotopenthefile");
exit(0);
}
while(p){
fwrite(p,sizeof(Lstu),1,fp);
p=p->next;}
fclose(fp);
}
voidsave1(){//文件保存
FILE*fp;
Lstu*p;
p=head;
if((fp=fopen("初始值二进制备用.txt","wb"))==NULL)
{
printf("Cannotopenthefile");
exit(0);
}
while(p){
fwrite(p,sizeof(Lstu),1,fp);
p=p->next;}
fclose(fp);
}
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->next;fclose(fp);
}
voidread1(){//文件读取
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->next;fclose(fp);
}
voidSAVE(){//保存到可浏览文件
FILE*fp;
Lstu*p;inti=0;
p=head;
if((fp=fopen("初始值可浏览文件.txt","w+"))==NULL)
{
printf("Cannotopenthefile");
exit(0);
}
fprintf(fp,"\n\n\t------------------------------------------------------------------\n");
fprintf(fp,"\t%-5s%-5s%-10s%-8s%-7s%-10s%-10s%-10s\n","序号","班级","学号","姓名","性别","语文成绩","数学成绩","英语成绩");
fprintf(fp,"\t------------------------------------------------------------------\n\n");
while(p){
i++;p->ID=i;
fprintf(fp,"\t%-4d%-5d%-7d%-8s%-7s%-10.2f%-10.2f%-10.2f\n",p->ID,p->cla,p->num,p->name,
p->sex,p->chinese,p->math,p->english);
fprintf(fp,"\t------------------------------------------------------------------\n");
p=p->next;
}
fclose(fp);
}
voidSAVE1(){//保存到可浏览文件
FILE*fp;charfilename[20];
Lstu*p;inti=0;
p=head;
printf("请输入保存到可浏览文件的文件名:
");
scanf("%s",filename);
if((fp=fopen(filename,"w+"))==NULL)
{
printf("Cannotopenthefile");
exit(0);
}
fprintf(fp,"\n----------------------------------------------------------------------------------\n");
fprintf(fp,"%-5s%-5s%-7s%-8s%-7s%-10s%-10s%-