1、学生成绩管理系统链表版 C语言应用实验报告题 目学生成绩管理系统(链表版)第1章 需求分析 3第2章 总体设计 32.1 系统的程序流程图 32.2系统的全局变量和常量 32.3系统的函数介绍 3第3章 详细设计 33.1 主函数设计 33.2 录入函数设计 43.3 排序函数设计 43.4 查找函数设计 43.5修改函数设计 43.6插入函数设计 43.7 删除函数设计 43.8 保存函数设计 43.9 显示函数设计 43.10 退出函数设计 4第4章 测试 5总结 5参考文献 5附录 程序源代码 5第1章第1章需求分析(1) 能完成学生成绩的插入、查询、修改、删除、输出等功能;(2)采用单
2、链表存储结构实现;(3) 所有数据以外部文件方式保存第2章第2章总体设计2.1 系统的程序流程图绘制一个系统的总体程序流程图,主要展示系统从开始以后,可以经过哪些流程,最后结束。按姓名修改某位同学的成绩按姓名修改某位同学的成绩输出链表内容输出链表内容2.2系统的全局变量和常量系统全局变量int n;char a;头文件:#include stdio.h#include time.h#include string.h#include stdlib.h#include conio.h2.3系统的函数介绍把系统中的每个函数的原型列出来,解释一下函数的返回值及形式参数的含义;最后,再介绍一下每个函数的
3、功能。void Create(int n) /创建链表void List() /输出链表内容void list() /输出链表所有内容void save() /文件保存void save1() /文件保存void read() /文件读取void read1() /文件读取void SAVE() /保存到可浏览文件void SAVE1() /保存到可浏览文件void sort_data_copy(Lstu *p,Lstu *s) /交换排序时的值void sort() /对初始成绩进行排序void sort1() /对所有数据进行排序void search_print(Lstu *p) /输出
4、查找信息void search_choose() /选择按分数段查找方式void search() /查找void modify_choose(Lstu *p,int n) /选择修改方式void modify() /按姓名修改void Insert() /按序号插入void del() /按姓名删除void statistics() /成绩统计int menu() /菜单(主界面)第3章第3章详细设计按函数,写出函数的原型声明,并画出每个函数的程序流程图。 3.1 主函数设计函数3.2 录入函数设计添加的信息包括学号(不允许重复)、姓名(不允许重复)、语文成绩、数学成绩和英语成绩,如流程图所
5、示:本程序采用的是尾插法,就是每次将新申请的结点插在终端结点的后面,其执行过程如图所示。尾插法建立单链表操作示意图3.3 排序函数设计可按照学号、语文成绩、数学成绩、英语成绩和平均分分别排序。如图所示:3.4 查找函数设计按姓名、学号和分数段查找学生成绩的流程图分别如下图4.3所示。图4.3按姓名查找学生成绩信息流程图在单链表中,即使知道被访问结点的位置i,也不能像顺序表那样直接按序号访问,而只能从头指针出发,设置一个工作指针p,顺next域逐个结点往下搜索。当p指向某个结点时判断是否为第i个结点,若是则查找成功;否则,将工作指针p后移,即将p指向原来所指结点的后继结点。直到p为NULL时查找
6、失败。单链表查找过程如图4.4所示。图4.4单链表查找过程的示意图按学号查询学生成绩信息同按姓名查找学生成绩信息,此处不再详细列出。(3)学生成绩修改模块3.5修改函数设计首先要查找与要修改数据相匹配的信息,若没有则返回失败。否则把相应的信息输出,然后再重新输入新的数据并保存到单链表。3.6插入函数设计首先要确定插入数据的位置,执行插入操作,然后再输入数据并保存到单链表。3.7 删除函数设计当选择删除功能时,首先输入要删除的同学的姓名,然后输入要删除的同学的学号,如果该同学存在并且姓名与学号匹配的上,则进行删除操作,否则返回失败。其流程图如下:删除操作定义为将单链表的第i个结点删去。因为在单链
7、表中结点ai存储地址在其前驱结点ai-1的指针域,所以必须首先找到ai-1的存储地址p,然后令p的next域指向ai 的后继结点,即把结点ai 从链上摘下来,最后释放结点ai的存储空间,如图4.6所示。 在单链表中删除结点指针的变化情况3.8 保存函数设计输入学生信息应保存到学生基本信息文件中,修改后的信息将可保存到可浏览的文件,如图所示:3.9 显示函数设计从单链表表头遍历整个单链表,将所有数据输出。其部分代码如下:void read() /文件读取 FILE *fp; Lstu *p,*p1; if(fp=fopen(初始值二进制.txt,rb)=NULL) printf(Cannot o
8、pen the filen); 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章测试主要进行功能性测试,即验证各个功能模块是否正确运行。可以采用运行系统进行截图的方法来验证系统结果的正确性。在完成了系统各方面的设计后,并不是可以运行就完成的,为了保证系统
9、性能的稳定性跟安全性等,就要对系统做测试。测试环境如下: 硬件:P4C 2.4GHz,500GB硬盘,2内存; 软件:Windows 7 Personal SP1,分辨率1366*768,Microsoft Visual C+ 6.0。运行的主界面如图所示:1点击1输入学生相关信息,如图所示:2浏览初始学生信息,如图所示:3查看初始学生总分及平均分,如图所示:4查找,如图所示:按姓名查找:5初始学生成绩排序,如图所示:按平均成绩进行排序:6插入新成绩,如图所示:7按姓名修改某位学生的成绩,如图所示:选择修改数学成绩:8按姓名删除某位学生的成绩,如图所示:9浏览所有学生的信息及排名,如图所示:1
10、0保存最终结果到可浏览的文件中,如图所示:统计,如图所示:总结写这次实验课的收获和感想。参考文献附录 程序源代码/程序名称:xsglxt.CPP/程序功能:采用链表与文件实现一个简单的学生成绩管理系统。#include stdio.h#include time.h#include string.h#include stdlib.h#include conio.h#define NULL 0typedef struct Lstu int cla,ID; long num; char name20; char sex20; float chinese,math,english; float sum
11、,ave; Lstu *next;Lstu;Lstu *head;void Create(int n) /创建链表 Lstu *p,*s; int i; for(i=0;icla); 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
12、-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(请输入语文成
13、绩: );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; void List() /输出链表内容 Lstu *p; int i=0; p=head; if(p=NULL) printf(Sorry,Its a Empty Listn); else printf(nnt-n); printf(t%
14、-5s%-5s %-10s%-8s%-7s%-10s%-10s%-10sn,序号,班级,学号,姓名,性别,语文成绩,数学成绩,英语成绩); printf(t-n); while (p)i+;p-ID=i; printf(t %-4d%-5d %-7d %-8s%-7s%-10.2f%-10.2f%-10.2fn,p-ID,p-cla,p-num,p-name,p-sex,p-chinese,p-math,p-english); printf(t-n); p=p-next; void list() /输出链表所有内容 Lstu *p; int i=0; p=head; if(p=NULL) pr
15、intf(Sorry,Its a Empty Listn); else printf(n -n); printf( %-5s%-5s %-7s %-8s%-7s%-10s%-10s%-10s%-8s%-8sn,序号,班级,学号,姓名,性别,语文成绩,数学成绩, 英语成绩,总分,平均分); printf( -n); while (p)i+;p-ID=i; printf( %-4d%-6d%-12d%-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f%-8.2fn,p-ID,p-cla,p-num,p-name,p-sex, p-chinese,p-math,p-english,
16、p-sum,p-ave); printf( -n); p=p-next; void save() /文件保存 FILE *fp; Lstu *p; p=head; if(fp=fopen(初始值二进制.txt,wb)=NULL) printf(Cannot open the file ); exit(0); while(p) fwrite(p,sizeof(Lstu),1,fp); p=p-next; fclose(fp);void save1() /文件保存 FILE *fp; Lstu *p; p=head; if(fp=fopen(初始值二进制备用.txt,wb)=NULL) print
17、f(Cannot open the file ); exit(0); while(p) fwrite(p,sizeof(Lstu),1,fp); p=p-next; fclose(fp);void read() /文件读取 FILE *fp; Lstu *p,*p1; if(fp=fopen(初始值二进制.txt,rb)=NULL) printf(Cannot open the filen); exit(0); head=(Lstu*)malloc(sizeof(Lstu); p1=head; while(!feof(fp) p=(Lstu *)malloc(sizeof(Lstu); if(
18、fread(p,sizeof(Lstu),1,fp)=1) p1-next=p; p1=p1-next; head=head-next;fclose(fp);void read1() /文件读取 FILE *fp; Lstu *p,*p1; if(fp=fopen(初始值二进制备用.txt,rb)=NULL) printf(Cannot open the filen); exit(0); head=(Lstu*)malloc(sizeof(Lstu); p1=head; while(!feof(fp) p=(Lstu *)malloc(sizeof(Lstu); if(fread(p,size
19、of(Lstu),1,fp)=1) p1-next=p; p1=p1-next; head=head-next;fclose(fp);void SAVE() /保存到可浏览文件 FILE *fp; Lstu *p;int i=0; p=head; if(fp=fopen(初始值可浏览文件.txt,w+)=NULL) printf(Cannot open the file ); exit(0); fprintf(fp,nnt-n); fprintf(fp,t%-5s%-5s %-10s%-8s%-7s%-10s%-10s%-10sn,序号,班级,学号,姓名,性别,语文成绩,数学成绩,英语成绩);
20、 fprintf(fp,t-nn);while(p) i+;p-ID=i; fprintf(fp,t %-4d%-5d %-7d %-8s%-7s%-10.2f%-10.2f%-10.2fn,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);void SAVE1() /保存到可浏览文件 FILE *fp;char filename20; Lstu *p;int i=0; p=head; printf(请输入保存到可浏览文件的文件名: ); scanf
21、(%s,filename); if(fp=fopen(filename,w+)=NULL) printf(Cannot open the file ); exit(0); fprintf(fp,n -n); fprintf(fp, %-5s%-5s %-7s %-8s%-7s%-10s%-10s%-10s%-8s%-8sn,序号,班级,学号,姓名,性别,语文成绩,数学成绩, 英语成绩,总分,平均分); fprintf(fp, -n);while(p) i+;p-ID=i; fprintf(fp, %-4d%-5d %-7d %-8s%-7s%-10.2f%-10.2f%-10.2f%-8.2f
22、%-8.2fn,p-ID,p-cla,p-num,p-name,p-sex, p-chinese,p-math,p-english,p-sum,p-ave); fprintf(fp,-n); p=p-next; fclose(fp);void sort_data_copy(Lstu *p,Lstu *s) /交换排序时的值 int cla1; cla1=p-cla;p-cla=s-cla;s-cla=cla1; long num1; num1=p-num;p-num=s-num;s-num=num1; char name120; strcpy(name1,p-name);strcpy(p-na
23、me,s-name);strcpy(s-name,name1); char sex120; strcpy(sex1,p-sex);strcpy(p-sex,s-sex);strcpy(s-sex,sex1); float chinese1; chinese1=p-chinese;p-chinese=s-chinese;s-chinese=chinese1; float math1; math1=p-math;p-math=s-math;s-math=math1; float english1; english1=p-english;p-english=s-english;s-english=e
24、nglish1; float sum1; sum1=p-sum;p-sum=s-sum;s-sum=sum1; float ave1; ave1=p-ave;p-ave=s-ave;s-ave=ave1;void sort() /对初始成绩进行排序 Lstu *p,*s; int n;char a; read();p=head; if(p=NULL) printf(Sorry,Its a Empty Listn); printf(n按Enter键继续n);a=getch(); elsewhile(1)system(cls);printf(n排序前结果为:n);read();list(); printf(t *=*=*=*=*=*=*=*=*=*=*=按学号排序(1)n); printf(t *=*=*=*=*=*=*=*=*=*=*=按语文成绩排序(2)n); printf(t *=*=*=*=*=*=*=*=*=*=*=按数学成绩排序(3)n); printf(t *=*=*=*=*=*=*=*=*=*=*=按英语成绩排序(4)n); printf(t *=*=*=*=*=*=*=*=*=*=*=按平均分排序(5)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1