当前位置:文档之家› 运动会运动会分数统计(数据结构)

运动会运动会分数统计(数据结构)

摘要:本文详细介绍了运动会分数统计程序的设计与实现,该程序具有运动会成绩的输入,每个学校所参加的项目成绩的查询,修改,删除,统计操作以及学校成绩单和团体得分报表的输出等功能。

概要设计部分给出了程序功能说明,数据结构设计和函数变量说明。

详细设计和实现部分列出了系统功能模块、算法原理及流程图。

最后还给出了调试和操作说明。

在课程设计中,程序设计语言采用Visual C++,程序运行平台为Windows 98/2000/XP。

对于获得名次的同学在存储其成绩的时候采用了链表的结构,有利于数据的存储与查找。

程序通过调试运行,实现了最初的设计目标,并且经过适当完善后,在实际中可以解决更多的问题。

关键词:运动会分数统计;程序设计;C++;链表目录1需求分析 (3)2概要设计 (4)2.1 程序功能说明 (4)2.2 数据结构设计 (4)2.3 函数及变量说明 (5)3详细设计和实现 (5)3.1 系统功能模块 (5)3.2 算法原理 (6)3.3 流程图 (7)4调试与操作说明 (7)4.1调试过程中出现的问题及处理方式 (7)4.2运行界面 (9)总结 (12)致谢 (13)参考文献 (14)1需求分析运动会问题:参加运动会的N个学校编号为1—N。

比赛分为M个男子项目和W个女子项目,项目编号分别为1—M和M+1—M+W。

由于各项目的参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。

该系统具备的基本功能:该统计程序能产生各种成绩单和得分报表:各校的成绩单,内容包括各学校所取得每项成绩的项目号,名次(成绩),姓名和得分;产生团体总分报表,内容包括校号,男子团体总分,女子团体总分和团体总分。

也能对其中的错误项进行修改或删除。

本课程设计主要解决在运动会上,将各个比赛项目所有获得名次的同学的成绩输入;成绩查询;成绩修改;成绩删除;以及成绩输出。

实验环境:Microsoft Visual C++ 6.0。

Visual C++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。

Visual C++ 6.0提供的控制台应用程序对学习和掌握标准C++内容非常有利。

“可视”的资源编辑器与MFC类以及应用程序向导,为快速高效地开发出功能强大的Windows应用程序提供了极大的方便。

利用Visual C++ 6.0进行Internet、数据库及多媒体等多方面的程序开发也很容易。

本课程设计采用了C++。

C++语言是在C语言的基础上发展起来的,不仅继承了C语言的所有特点,而且引入了面向对象的程序设计方法,改进了程序涉及思路,将编程方式进化到面向对象进行程序设计这一新的思维过程。

C++语言代表着对以往语言之精华的发展和提炼,并能很好的与C语言兼容,既支持面向对象的程序设计,也支持结构化的程序设计。

它修补了C语言中的一些漏洞,提供更好的类型检查和编译时的分析,提供了异常处理机制,简化了程序的出错处理,利用throw、try和catch关键字,出错处理程序不必与正常的代码紧密结合,提高了程序的可靠性和可读性。

函数重载允许相同的函数名具有不同参数表,系统根据参数的个数和类型匹配相应的函数。

提供了模板机制。

摸板包括类摸板和函数模板两种,它们将数据类型作为参数。

对于具体数据类型,编译器自动生成模板类或模板函数,它提供了源代码复用的一种手段。

2概要设计2.1 程序功能说明该程序用于运动会上,涉及到比赛项目成绩的录入,某个学校在某个项目中获得成绩的查询,某个学校在某个运动项目中获得的成绩的修改,某个学校在某个运动项目中获得的成绩的删除,以及某个学校所有获得成绩的得分报表以及团体成绩的得分报表。

其中比赛成绩的录入可以按照运动项目举行的次序输入,也可以输入自己指定的运动项目的成绩;自己扩展的功能是“某个学校在某个项目中获得成绩的查询,某个学校在某个运动项目中获得的成绩的修改,某个学校在某个运动项目中获得的成绩的删除”三项,这三项都要求输入学校以及运动项目编号,通过这两项作为参数具体的函数可以查询、修改成绩或者是删除某项成绩记录,进而影响到最后得分报表的输出。

2.2 数据结构设计创建了学生成绩记录结点:struct RE // 学生成绩记录{int iterm; //项目编号int pos; //名次int score; //成绩int snum; //学校编号char name[10]; //学生姓名RE *next;};RE sc[20]={0};其中具体的操作主要采用的是一个链表的结构,涉及到了链表的插入,链表的查找,以及链表的删除等知识点。

链表的插入解决了各个项目中获得名次的同学的成绩的录入问题;链表的查找解决了运动项目成绩的查询;成绩的删除,先查找到其所在的结点,然后将该结点前后结点相连,再删除该结点。

2.3 函数及变量说明void insertlist(int iterm,int n); 该函数用来添加成绩记录,iterm 是运动项目的编号,n为参加比赛的学校总数,需要注意地是根据运动项目是奇数还是偶数来判定最后结果取前三还是前五名,这里用(iterm%2)是否为零来判断。

RE *findlist(int snum,int fiterm); 该函数用来查找指定的学校的某项目成绩并返回该成绩所在节点的前一个节点的地址,其中snum是要查找的学校的编号,而fiterm为要查找的运动项目编号,返回一个指向RE型的指针,RE为定义的一个结构体类型,用来存储获得名次的学生的基本信息(包括学生姓名,取得的名次,获得的分数,所在的学校编号以及运动项目编号)。

RE *findend(int snum); 查找并返回每个学校的最后一个数据节点的地址,函数返回类型同上,snum为学校编号。

void printlist1(int snum); 输出每项具体的成绩,snum为学校编号。

void printlist2(int snum,int m,int w); 输出团体成绩,m为男生项目数,w为女生项目数。

void modlist(int snum,int miterm); 修改成绩 miterm为要修改的项目编号void deletelist(int snum,int diterm); 删除成绩记录,diterm为要删除的项目编号还有主函数void main( )里用一个嵌套在do—while循环语句中的switch 语句来控制要执行操作的编号,用户可以有多种选择,根据不同的需要选择不同的操作,这个也很关键。

3详细设计和实现3.1 系统功能模块系统功能模块如下:图3.1 系统功能模块图3.2 算法原理该程序先采用了一个嵌套在do—while循环语句中的switch语句来控制要执行操作的编号,用户可以有多种选择,根据不同的需要选择不同的操作。

其中具体的操作主要采用的是一个链表的结构,涉及到了链表的插入,链表的查找,以及链表的删除等知识点。

链表的插入解决了各个项目中获得名次的同学的成绩的录入问题,具体为:为每个学校建立一个头结点,若该学校有同学取得名次,建立一个新的结点来存储该同学的信息,并将其插到该学校所在链表的最后一个结点后面。

链表的查找解决了运动项目成绩的查询,以及后面的成绩的输出、删除都要用到链表的查找,查找时先将头结点的地址赋给查找函数,根据查找的条件依次与每个结点中相应的比较,若相等则输出所需要的信息,否则返回“查找的元素不存在”信息。

而成绩的删除,先查找到其所在的结点,然后将该结点前后结点相连,再删除该结点;成绩的修改要先查找到其所在的结点,然后再重新录入数据;至于学校所获得的各项成绩的输出,将该校所在的头结点的地址赋给控制输出的函数,利用指针的移动依次将各项成绩输出,而团体成绩的输出,先要根据运动项目编号来确定是男生还是女生项目,然后再依次累加,分别得到男女生的团体得分,最后将两者相加,得到学校的团体得分。

3.3 流程图4调试与操作说明4.1调试过程中出现的问题及处理方式在void printlist1(int snum)函数中,当将要输出成绩的学校所在的链表的头结点所指向的下一个结点的地址赋给temp的时候,RE *temp;temp=&sc[snum-1];temp=temp->next;要检测temp是否为NULL,如果为NULL会发生溢出,程序无法向下继续进行解决的方法是加上if(temp==NULL)cout<<"该学校在该项目上没有取得任何成绩"<<endl;此句可以有效的防止溢出发生此类问题还发生在void printlist2(int snum,int m,int w)和void modlist(int snum,int miterm)里面,在后面的那个函数里面RE *curr=findlist(snum,miterm);在这个赋值语句后面也要跟上if(curr==NULL) return;curr=curr->next;if(curr==NULL) {cout<<"该学校在该项目上没有任何成绩记录"<<endl;return;}这也是为了防止溢出的发生而设定的条件。

在插入结点的时候是将其直接插到该学校所在链表的最后,因此需要找到每个学校所在链表的最后一个结点的地址,而函数RE *findlist(int snum,int fiterm); 只是返回需要查找的结点的地址,不一定是最后一个结点解决办法是重新定义一个函数,RE *findend(int snum);尽管这样在效率上可能会有些差,因为每次插入的时候都要从头结点开始查找,时间上的开销会大一些,但还是可以解决上述问题的此外,还有一些就是细节问题了,如:主函数中的if(num>6||num<0) {cout<<"输入有误,请重新输入要操作的项目编号"<<endl;cin>>num;}这个if语句判断输入的操作编号是否在目录中,如果超出范围重新输入;还有函数void insertlist(int iterm,int n)里面在用new申请空间的时候为防止内存分配空间错误用下面的语句来监控if(temp==NULL)cout<<"内存分配错误"<<endl;以及函数void insertlist(int iterm,int n)里面在输入学校编号的时候用下面的if语句判断输入的学校编号是否符合要求,如果超出范围重新输入if(temp->snum>n) {cout<<"输入的学校编号有误,请重新输入"<<endl;cin>>temp->snum;}4.2运行界面图4.1 初始运行界面图4.2 输入具体项目成绩的界面图4.3 查找成功的界面图4.4 修改成绩的界面图4.5 编号为1的学校的成绩单界面图4.6 编号为1的学校的团体得分报表界面总结这次课程设计使我对做系统的认识深刻了许多。

相关主题