运动会分数统计系统 数据结构课程设计文档格式.docx
《运动会分数统计系统 数据结构课程设计文档格式.docx》由会员分享,可在线阅读,更多相关《运动会分数统计系统 数据结构课程设计文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
![运动会分数统计系统 数据结构课程设计文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/29/e688611b-a16e-45ee-8880-75391543734a/e688611b-a16e-45ee-8880-75391543734a1.gif)
(2)能统计各学校总分;
(3)可以按学校编号或名称、学校总分、男女团体总分排序输出;
(4)可以按学校编号查询学校某个项目的情况;
可以按项目编号查询取得前三或前五名的学校。
三.概要设计
3.1链表结构的ADT的定义
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
基本操作:
InitList(&
L)
操作结果:
构造一个空的线性表L。
GetElem(L,i,&
e)
初始条件:
线性表L已存在,1≦i≦ListLength(L)
操作结果:
用e返回L中第i个数据元素的值。
LocateElem(L,e,compare())
线性表L已存在,compare()是数据元素判定函数。
返回L中第1个与e满足关系compare()的数据元素的位序。
若这样的数据元素不存在,则返回值为0。
PriorElem(L,cur_e,&
pre_e)
初始条件:
线性表L已存在。
操作结果:
若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,否则操作失败,pre_e无定义。
NextElem(L,cur_e,&
next_e)
初始条件:
若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。
ListInsert(&
L,I,e)
线性表L已存在,1≦i≦ListLength(L)+1
在L中第i个位置之前插入新的元素e,L是表长度加1
ListTraverse(L,visit())
操作结果:
依次对L的每个数据元素调用函数visit()。
一旦visit()失败,则操作失败。
}ADTList
3.2系统功能模块设计
图3-1运动会分数统计系统功能模块图
3.3主要函数调用关系图
图3-2系统函数调用关系图
3.4主界面设计
为了实现运动会分数统计系统,需要设计一个含有多菜单项的主控菜单子程序,以链接系统中各个子项目的调用,为了方便用户使用本系统,本系统主控菜单的运行界面如图3-3所示。
图3-3主菜单运行界面
四.详细设计
实现运动会分数统计系统的开发,采用链表结构类型存储运动会学校名称、男子女子运动项目以及男子女子项目成绩的信息。
4.1数据类型定义
//每一个学校的信息
typedefstructLnode//结点
{
chardata[20];
//学校名称
intda,d1,d2;
//学校编号、学校总分、男女团体分
structLnode*next;
//指向下一学校
}Lnode,*LinkList;
intsz[20];
//每一个项目的信息存取
typedefstructLnode1
chardata[20],data1[20],data2[20],data3[20],data4[20],data5[20];
//该项目前五名学校的名称
intda1,da2,da3,da4,da5;
//该项目前五名学校的编号
structLnode1*next;
//指向下一项目
}Lnode1,*LinkList1;
4.2系统子程序详细设计
输入各学校名称的算法:
//按从头到尾的顺序依次建立线性链表L1共有n个节点
voidschoolname(LinkList&
L1,intn)
inti;
LinkListp,q;
//输入头结点信息,即输入第一个学校的名字
L1=(LinkList)malloc(sizeof(Lnode));
//malloc是动态开辟内存,函数返回为void型指针(指向开辟的内存空间);
(LinkList)定义的指针的类型;
(sizeof(Lnode)malloc开辟的内存空间的大小
printf("
请输入这%d个学校的名字:
\n"
n);
p=(LinkList)malloc(sizeof(Lnode));
//指向一个有意义的地方
L1->
next=p;
//把p的值赋给nextnext指向实际的空间p时指针
scanf("
%s"
&
p->
data);
//修改空间的值,&
取p的数据域的地址
//从第二个节点开始依次输入到第n个节点信息
for(i=2;
i<
=n;
i++)//p是第一个,所以i=2从2开始先指出第一个,然后第一个在指出剩下的
q=p;
//q指向p开辟的空间即q指向p指向的地方
//给新开辟的空间赋值
q->
}
输入男子运动项目名字的算法:
//按从头到尾的顺序依次建立线性链表L2共有n2个节点
voidmansports(LinkList1&
L2,intn2)
//输入第一个节点的信息,即第一个男子项目的名字
LinkList1r,s;
L2=(LinkList1)malloc(sizeof(Lnode1));
请输入这%d个项目的名字:
n2);
r=(LinkList1)malloc(sizeof(Lnode1));
//把新开辟的空间data1-5初始化
for(intt=0;
t<
20;
t++)
r->
data1[t]='
\0'
;
for(t=0;
data2[t]='
data3[t]='
data4[t]='
data5[t]='
L2->
next=r;
//从第二个节点开始输入到第n2个节点的信息
=n2;
i++)
s=r;
//s指向r指向的地方
s->
输入女子运动项目名字的算法:
//按从头到尾的顺序依次建立线性链表L3共有n1个节点
voidwomansports(LinkList1&
L3,intn1)
//输入第一个节点的信息,即第一个女子项目的名字
L3=(LinkList1)malloc(sizeof(Lnode1));
n1);
L3->
//从第二个节点开始依次输入到第n1个节点信息
=n1;
参加比赛的学校的总分排名的算法:
voidschoolrankings(LinkList&
LinkListp;
学校的数据类型上边
intz,i,j,y;
参加这次比赛的学校的总分排名:
);
p=L1->
next;
//下一个地方的指针给pp是学校的数据类型p是一个节点,L1下一个节点给p
//先把每个学校的总分依次遍历,存放在数组sz中。
一个一个取,一个一个找先让p指向一个链表
for(i=0;
=n-1;
sz[i]=p->
da;
//节点的信息指向一个数组,data学校总数的数据域,把所有的学校的总分
p=p->
//再对数组sz用冒泡排序法进行从小到大排序
for(i=1;
for(j=1;
j<
=n-i;
j++)
if(sz[j-1]>
sz[j])
y=sz[j-1];
sz[j-1]=sz[j];
sz[j]=y;
z=1;
//初始化
//把线性链表L1按项目总分从大到小的顺序排列,并打印名次
for(i=n-1;
i>
=0;
i--)
//L1表示一个节点,取出里面一个数据,那个数据的名字是next,next也是一个节点,p也是一个节点,
if(i>
0)//意义是判断下一个是不是
//如果值相等则链表指针直接指向下一个,不用交换位置
while(sz[i]==sz[i-1])相邻的两个数组素不素相等
i--;
//从大到小,从最后一个比较
//在链表L1中找到与sz[i]相等的节点的位置,并打印出名次信息
j++)
if(sz[i]==p->
da)//数组里面的值从最后一个开始取
第%d名%s:
%d分\n"
z,p->
data,p->
da);
z++;
参加这次比赛的学校的男子项目的成绩排名的算法:
//男子项目排名算法代码与上述学校总分的排名算法完全一致,其中男子项目排序的过程为比较男子项目总分
voidmanrankings(LinkList&
参加这次比赛的学校的男子项目的成绩排名:
ne