石家庄经济学院华信学院课程设计报告学院:专业:班级:学号:姓名:运动会分数统计系统的设计与实现一.问题描述大学作为一个提供学生全面发展的高等教育机构,不仅要培养学生的学习能力,而且更要注重学生的德智体美全面发展。在大学中有很多丰富多彩的比赛和活动,例如运动会,演讲比赛,歌唱比赛,书法比赛等,在比赛和竞争中,我们的这些素质和能力更容易得到培养提升。但是比赛最后的分数统计和查询往往是举办者头疼的事情,分数的统计和查询需要快速准确,因此我们设计了这个运动会分数统计系统,以方便分数的统计查询。参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。写一个统计程序产生各种成绩单和得分报表。二.需求分析系统功能描述:(1)可以输入各个项目的前三名或前五名的成绩;(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)初始条件:线性表L已存在。操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,否则操作失败,next_e无定义。ListInsert(&L,I,e)初始条件:线性表L已存在,1≦i≦ListLength(L)+1操作结果:在L中第i个位置之前插入新的元素e,L是表长度加1ListTraverse(L,visit())初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。}ADTList3.2系统功能模块设计图3-1运动会分数统计系统功能模块图运动会分数统计系统输入各学校名称输入男子运动项目输入女子运动项目输入男子项目的成绩输入女子项目的成绩查询某校各个项目的成绩查询某校各个项目的成绩3.3主要函数调用关系图图3-2系统函数调用关系图main()womansports(LinkList&L,intn)循环语句依次输入每个值ListTraverse(L,visit())schoolname(LinkList&L,intn)mansports(LinkList&L,intn)循环语句依次输入每个值ListTraverse(L,visit())ListTraverse(L,visit())ListTraverse(L,visit())3.4主界面设计为了实现运动会分数统计系统,需要设计一个含有多菜单项的主控菜单子程序,以链接系统中各个子项目的调用,为了方便用户使用本系统,本系统主控菜单的运行界面如图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];图3-3主菜单运行界面//该项目前五名学校的名称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指向的地方p=(LinkList)malloc(sizeof(Lnode));//给新开辟的空间赋值scanf(%s,&p-data);q-next=p;}}开始输入n个学校的名字i=0in将第i个结点加入链表LNY输入男子运动项目名字的算法://按从头到尾的顺序依次建立线性链表L2共有n2个节点voidmansports(LinkList1&L2,intn2){//输入第一个节点的信息,即第一个男子项目的名字inti;LinkList1r,s;L2=(LinkList1)malloc(sizeof(Lnode1));printf(请输入这%d个项目的名字:\n,n2);r=(LinkList1)malloc(sizeof(Lnode1));//把新开辟的空间data1-5初始化for(intt=0;t20;t++)r-data1[t]='\0';for(t=0;t20;t++)r-data2[t]='\0';for(t=0;t20;t++)r-data3[t]='\0';for(t=0;t20;t++)r-data4[t]='\0';for(t=0;t20;t++)r-data5[t]='\0';L2-next=r;scanf(%s,&r-data);//从第二个节点开始输入到第n2个节点的信息for(i=2;i=n2;i++){s=r;//s指向r指向的地方r=(LinkList1)malloc(sizeof(Lnode1));for(intt=0;t20;t++)r-data1[t]='\0';for(t=0;t20;t++)r-data2[t]='\0';for(t=0;t20;t++)r-data3[t]='\0';for(t=0;t20;t++)r-data4[t]='\0';for(t=0;t20;t++)r-data5[t]='\0';scanf(%s,&r-data);s-next=r;}}开始输入n个男子项目的名字i=0in将第i个结点加入链表L结束NY输入女子运动项目名字的算法://按从头到尾的顺序依次建立线性链表L3共有n1个节点voidwomansports(LinkList1&L3,intn1){//输入第一个节点的信息,即第一个女子项目的名字inti;LinkList1r,s;L3=(LinkList1)malloc(sizeof(Lnode1));printf(请输入这%d个项目的名字:\n,n1);r=(LinkList1)malloc(sizeof(Lnode1));L3-next=r;scanf(%s,&r-data);//从第二个节点开始依次输入到第n1个节点信息for(i=2;i=n1;i++){s=r;r=(LinkList1)malloc(sizeof(Lnode1));scanf(%s,&r-data);s-next=r;}}开始输入n个女子项目的名字i=0in将第i个结点加入链表L结束NY参加比赛的学校的总分排名的算法:voidschoolrankings(LinkList&L1,intn){LinkListp;学校的数据类型上边intz,i,j,y;printf(参加这次比赛的学校的总分排名:\n);p=L1-next;//下一个地方的指针给pp是学校的数据类型p是一个节点,L1下一个节点给p//先把每个学校的总分依次遍历,存放在数组sz中。一个一个取,一个一个找先让p指向一个链表for(i=0;i=n-1;i++){sz[i]=p-da;//节点的信息指向一个数组,data学校总数的数据域,把所有的学校的总分p=p-next;}//再对数组sz用冒泡排序法进行从小到大排序for(i=1;i=n-1;i++){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--){p=L1-next;//L1表示一个节点,取出里面一个数据,那个数据的名字是next,next也是一个节点,p也是一个节点,if(i0)//意义是判断下一个是不是//如果值相等则链表指针直接指向下一个,不用交换位置while(sz[i]==sz[i-1])相邻的两个数组素不素相等{i--;//从大到小,从最后一个比较}//在链表L1中找到与sz[i]相等的节点的位置,并打印出名次信息for(j=1;j=n;j++){if(sz[i]==p-da)//数组里面的值从最后一个开始取{printf(第%d名%s:%d分\n,z,p-data,p-da);z++;}p=p-next;}}}开始结束i=0i++inYN将每个学校的总分赋给数组sz[n]对数组sz[n]进行冒泡排序遍历链表L找到与sz[i]相等的结点并输出总分参加这次比赛的学校的男子项目的成绩排名的算法://男子项目排名算法代码与上述学校总分的排名算法完全一致,其中男子项目排序的过程为比较男子项目总分voidmanrankings(LinkList&L1,intn){LinkListp;intz,i,j,y;printf(参加这次比赛的学校的男子项目的成绩排名:\n);p=L1-next;//先把每个学校的男子项目总分依次遍历,存放在数组sz中。for(i=0;i=n-1;i++){z[i]=p-d1;p=p-next;}//再对数组sz用冒泡排序法进行从小到大排序for(i=1;i=n-1;i++){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--){p=L1-next