数据结构 基于顺序存储结构对学生成绩表的设计 课程设计 实验报告Word文档格式.docx
《数据结构 基于顺序存储结构对学生成绩表的设计 课程设计 实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构 基于顺序存储结构对学生成绩表的设计 课程设计 实验报告Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构 基于顺序存储结构对学生成绩表的设计 课程设计 实验报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/7/273c60f2-bec6-4157-8efc-59fcb2deee66/273c60f2-bec6-4157-8efc-59fcb2deee661.gif)
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
在当今信息时代,信息技术己成为当代知识经济的核心技术。
我们时刻都在和数据打交道。
比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。
实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。
数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。
数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。
学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。
通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。
通过此次课程设计主要达到以下目的:
(1)、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(2)、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(3)、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
(4)、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
试验目的如下:
(1)、掌握线性表的顺序存储结构和链式存储结构;
(2)、熟练掌握顺序表和链表基本算法的实现;
(3)、掌握利用线性表数据结构解决实际问题的方法和基本技;
(4)、按照实验题目要求独立正确地完成实验内容(编写、调试算法程序,提交程序清单及相关实验数据与运行结果);
(5)、按时提交实验报告。
二、需求分析:
当今时代是飞速发展的时代,在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境.计算机的最大好处在于利用它能够进行信息管理.使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性.尤其对于复杂的信息管理,计算机能够充分发挥它的优越性.学生成绩管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段,对学生来说可以轻松的查阅自己在校的成绩。
2.1、问题描述
统计学生的成绩信息,这些信息包括学生的姓名,学号以及各门课的成绩,将这些信息录入以后,进行相关的系统管理,如插入、删除学生信息、求平均成绩、排序以及查找等管理。
2.2、数据需求分析:
本系统的主要数据信息有学生实验课成绩信息表。
学生信息表包括:
学号,姓名,实验成绩,平时成绩,总成绩等。
2.3、功能需求分析:
本系统主要实现对学生实验课成绩信息进行管理,需要实现以下几个方面的管理功能:
(1)学生管理:
学生信息的添加、删除、修改、查询、排序。
(2)打印输出:
学生实验课成绩信息。
2.4、课程设计思想及开发环境:
设计思想:
本课题的实质是完成对学生成绩表的合并、提取、排序、查询等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。
可将此系统分为如下模块,合并两个信息表、从表中提取信息、降序排序模块、按条件进行查询、退出系统。
编写语言:
C语言开发工具:
VisualC++6.0VC++是微软公司开发的一个IDE(集成开发环境)。
学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在Windows平台无所不能。
最大缺点是开发效率不高。
三、概要设计
3.1、系统模块划分
数据结构的研究内容:
数据的逻辑结构,数据的存储结构,数据的操作。
线性表是一种典型的线性数据结构,它可以采用链式结构与顺序存储结构来存储。
本课程设计采用的是顺序存储结构,并上施加了一些操作:
插入,删除,查找,排序,修改等。
(1)主界面模块提供实验课成绩管理系统的主菜单界面,供用户选择与执行各项管理工作。
(2)查询模块用于用户根据学号进行成绩的查询。
(3)录入模块用于将用户的基本信息存储到数据库。
(4)删除模块用于根据学号删除用户的基本信息。
(5)插入模块用于将用户的基本信息插入到记录中。
(6)排序模块用于根据用户的要求进行排序。
本学生所负责的模块是完成记录的排序与输出,不仅可以自动对学号进行排序还可以对平均成绩进行排序。
3.2系统模块结构图
根据系统功能设计,对应的系统模块结构图如图3.2所示。
图3.2系统模块图
四、详细设计
4.1结构类型定义
要想让计算机对数据进行处理,首先要将数据存储到计算机。
为此,必须先定义数据的存储类型。
定义数据存储类型时要注意各学生信息应对应什么样的类型,由于本课题采用的顺序存储结构,结构类型定义如下:
/*结构类型的定义*/
#include<
stdio.h>
#definem2
#definemaxsize1024
typedefintdatatype;
typedefstruct
{
intnum;
charname[20];
floatscore[3];
floatave;
}std;
stdstu[maxsize];
intlast;
}sqlist;
sqlist*l;
4.2初始化
在创建学生信息前,先要将顺序存储结构的线性表置成空表,即进行初始化。
/*初始化*/
voidsetnull(sqlist*l)
l->
last=0;
}
4.3创建学生成绩信息表
即将学生的姓名、学号以及成绩输入,在输入的程序中,注意输入的各学生信息所定义的类型以及所要输入的顺序
思想:
本课程能够提示用户输入相应的信息,并能够自动进行运算,将数据保存到文件中,并进行输出。
相关代码:
/*构建学生信息库*/
voidcreat_stu(sqlist*l)
inti,j;
printf("
输入学生的基本信息:
\n"
);
for(i=0;
i<
m;
i++)
{
输入第%d学生的学号:
i+1);
scanf("
%d"
&
l->
stu[i].num);
输入第%d学生的姓名:
scanf("
%s"
l->
stu[i].name);
stu[i].ave=0;
请输入学生的成绩:
数据结构:
英语:
数学分析:
for(j=0;
j<
3;
j++)
%f"
stu[i].score[j]);
last++;
4.4插入和删除学生信息
有时候输入的学生信息不够完整,或者输入的学生信息多余,所以需要对其进行增加和删除。
对于插入函数,首先要确定插入的位置,并且需要判断该顺序表的空间是否已满,若没有满,则需要再判断插入的位置是否合法。
在满足上述判断以后,在插入要插入的学生信息,并且最后需要将表长加1;
插入函数如下:
/*插入学生信息*/
intinsert(sqlist*l,stdx,inti)
intj;
if((l->
last)>
=maxsize-1)
overflow"
return0;
else
if((i<
1)||(i>
(l->
last)+1))
error"
for(j=l->
last;
j>
=i-1;
j--)
stu[j+1]=l->
stu[j];
stu[i-1]=x;
return1;
对于删除学生信息,首先也需要对删除的位置进行判断,判断它的位置是否合法,然后对所要删除的学生信息进删除,并且删除过后需将表长减1.
删除函数如下:
/*删除学生信息*/
intdeleter(sqlist*l,inti)
if(i<
1||il->
last+1)
for(j=i;
=l->
stu[j-1]=l->
last--;
return
(1);
4.5求每个学生的平均成绩
对于输入的学生信息往往需要对它进行相关的处理,如对各学生的成绩求总和,再算出平均分。
先求每个学生的总成绩,然后再除以课门数。
/*求学生的平均成绩*/
voidaverage(sqlist*l)
floatsum=0;
sum=sum+l->
stu[i].score[j];
stu[i].ave=sum/3;
第%d学生的平均成绩%.2f:
i+1,l->
stu[i].ave);
4.6对学生的平均成绩排序
将学生的平均成绩算出来以后,可以对学生的平均成绩进行排序。
对于学生平均成绩的排序,本程序主要用冒泡法对其进行排序,关于冒泡法排序,就是从让第一个学生的平均成绩和下一个学生的平均成绩进行比较,若第二个学生的成绩比第一个学生的成绩高,则将他们的位置进行调换,否则位置不变。
接着让排好序的第二个学生的成绩与下一个进行比较再排序,依此类推,直到比较完为止。
/*对学生平均成绩排序*/
voidsort(sqlist*l)
inti,j;
stdt;
for(i=0;
{
for(j=0;
last-i;
j++)
if(l->
stu[j].ave<
stu[j+1].ave)
t=l->
stu[j]=l->
stu[j+1];
stu[j+1]=t;
}
4.7查找学生的信息
对于创建好的学生信息,有时候需要对此进行查找。
本程序是根据学生的学号查找学生的成绩信息,就是输入学号,从第一个学生的学号开始进行筛选,直到找到相应的学号为止。
/*查找学生的信息*/
voidget(sqlist*l)
inti,j,k;
printf("
输入要查找学生的学号:
k);
stu[i].num==k)
{
学号\t姓名\n"
%d\t%s\n"
stu[i].num,l->
学生的成绩:
%.2f\t"
4.8输出学生信息表
在对学生的成绩进行创建、插入、删除、求平均分以及排序以后,往往需要将学生的成绩信息进行输出。
对于输出函数,就是根据所需要求进行输出就可以了。
/*输出学生信息*/
voidprint(sqlist*l)
第%d学生的学号:
%d\n"
第%d学生的姓名:
%s\n"
第%d学生的平均成绩:
.2%f\n"
%.2f\n"
4.9主函数
主函数是一个完整的程序不可或缺的,其它的辅助函数都需要通过主函数进行调用。
为了使编译出来的函数清晰明了,所以本程序用菜单来将每个子程序将它们的结果运行出来。
这就需要运用循环语句和情况语句。
/*主函数*/
voidmain()
inti=1,j;
sqlistl;
stdx;
while(i)
############################################\n"
#学生成绩管理系统#\n"
#1:
初始化#\n"
#------------------------------------------#\n"
#2:
输入学生的信息#\n"
#3:
插入学生的信息#\n"
#4:
删除学生的信息#\n"
#5:
求每个学生的平均成绩#\n"
#6:
对学生的平均成绩排序#\n"
#7:
查找学生的信息#\n"
#8:
输出学生的成绩信息#\n"
请输入你的选择:
i);
switch(i)
case1:
setnull(&
l);
break;
case2:
creat_stu(&
case3:
请输入插入学生的位置:
输入插入学生的学号:
x.num);
输入插入学生的姓名:
x.name);
x.ave=0;
输入学生的成绩:
x.score[j]);
}insert(&
l,x,i);
case4:
请输入删除的学生的位置:
deleter(&
l,i);
case5:
average(&
case6:
sort(&
case7:
get(&
case8:
print(&
\n1:
继续\n0:
结束\n"
五、运行结果和分析
5.1、主界面:
图5.1主界面
5.2、创建学生成绩信息并输出以后的结果:
图5.2创建学生成绩信息
5.3、插入学生成绩信息并输出后的运行结果:
图5.3插入学生信息
5.4、求出学生的平均成绩、进行排序并输出以后的结果:
图5.4排序输出后的结果
5.5、根据学号查找学生的成绩信息后的结果:
图5.5按学号查找学生的信息
六、实验总结:
在这次课程设计中,我做的是建立学生的成绩信息系统,学生信息主要包括:
学号、姓名、成绩等。
运用了冒泡法来编写算法,加深了我对该算法的理解。
同时,我还了解了编写算法的基本流程。
通过本次课程设计,我第一次体会到了编写程序的艰辛,在此过程中,将编写的程序是改了又改,但是,当我费了好大劲将程序运行出来的时候,我才真正体会到了快乐的滋味。
在编写过程中我对数据结构的基本编程方法也有了更加深层的理解,虽然只是短短的两个星期,但这已经足够了。
这两个星期过得真的很充实。
但看到自己所编写的程序能够运行的时候,感到很有成就感。
也要我懂得了做任何事要细心,有时候细节正的决定成败。
我现在对于我所学习的课程有了更加深刻的认识,对数据结构也更加感兴趣了。
感谢学校给我们提供了这个平台,让我们能够把理论运用到实践中去。
同时,我还要感谢老师,在这次课程设计中老师也对我们提供了很大的帮助。
七、源代码:
voidsetnull(sqlist*l)
sum=0;
stdt;
if(l->
t=l->
st