C语言课程方案设计书报告运动会分数统计系统.docx
《C语言课程方案设计书报告运动会分数统计系统.docx》由会员分享,可在线阅读,更多相关《C语言课程方案设计书报告运动会分数统计系统.docx(33页珍藏版)》请在冰豆网上搜索。
![C语言课程方案设计书报告运动会分数统计系统.docx](https://file1.bdocx.com/fileroot1/2022-12/7/37c229df-2698-4366-ac4c-b7b5f5b24e04/37c229df-2698-4366-ac4c-b7b5f5b24e041.gif)
C语言课程方案设计书报告运动会分数统计系统
封面
作者:
PanHongliang
仅供个人学习
一.需求分析
1问题描述
运动会分数统计系统
参加运动会有n个系,系编号为1……n。
比赛分成m个男子工程,和w个女子工程。
工程编号为男子1……m,女子m+1……m+w。
不同的工程取前五名或前三名积分;取前五名的积分分别为:
7、5、3、2、1,前三名的积分分别为:
5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)
2.基本要求:
(1).运动员检录;
(2).运动员检录,
(3).运动员成绩排序;
(4).运动员评奖
3.测试数据
《1》输入:
1进入添加系的界面,根据提示,再输入:
汽车系。
再输入:
8,成功添加了一个系。
再输入:
2进入运动工程添加界面,根据提示,再输入:
跳高;1;0;1;2;3。
之后输入0。
再次进入系统界面。
《2》输入:
3查看输出结果。
《3》:
输入:
4查看输出结果。
《4》:
输入:
5查看输出结果。
《5》:
输入:
6查看输出结果。
《6》:
输入:
7根据提示输入工程编号:
2。
查看输出结果。
《7》:
输入:
8根据提示输入系编号:
3。
查看输出结果。
二、概要设计
1.数据结构
<1>系:
名称,编号,男子团体总分,女子固体总分。
<2>运动工程:
工程编号,名称,男子工程,女子工程,前三名,前五名,第一名系的编号,第二名系的编号,第三名系的编号,第四名系的编号,第五名系的编号。
2.程序模块及之间的调用关系
三、详细设计1、数据类型定义
(1)系的定义:
typedefstructDepartment//系的结构
{
charname[20]。
//系的名称
intnumber。
//系的编号
intboy。
//男子团体总分
intgirl。
//女子团体总分
Department*next。
}Department。
(2)运动工程定义:
typedefstructSport//运动工程结构
{
charname[20]。
//运动工程名称
intisboy。
//0为女工程,1为男工程
intis3。
//0为取前五名,1为取前五名
intnumber。
//工程编号
intfirst。
//第一名系的编号
intsecond。
//第二名系的编号
intthird。
//第三名系的编号
intfourth。
//第四名系的编号
intfifth。
//第五名系的编号
Sport*next。
}Sport。
、
2、函数之间的调用关系
(1)系调用图
department_add
department_Order
<1>Departmentdepartment_search
department_addmark
department_show
department_isexist
department_output
department_read
department_write
department_getlong
sport_isexist
sport_add
sport_getlong
sport_write
<2>Sportsport_read
sport_output
sport_search
3、算法设计
主要算法的设计思想:
本程序主要是使用链表来实现操作。
一个运动会包括运动工程和参加运动会的成员。
因此构造两个链表Department,Sport。
为了操作的方便,并且能够保存输入数据,所以通过文件操作来实现数据的写和读。
每次添加新的数据后都要输入0退出,数据才能保存。
对于总分的排序使用了冒泡排序。
为了使整个程序看起来更加友好,又添加了程序启动画面。
4、调试分析
本程序相对来说比较容易看明白,其中涉及到的一些函数相对来说比较容易。
通过调试,运行,基本上达到了要求,但还存在一些缺点。
如:
不够人性化等。
5、测试结果
<1>多组数据输入与输出:
(1)输入:
3
输出:
系名编号男团总分女团总分总分
法律系6000
电子系5325
数学系4606
历史系39716
中文系2151126
计算机系1211132
旅游系7077
(2)输入:
4
输出:
系名编号男团总分女团总分总分
法律系6000
电子系5325
数学系4606
旅游系7077
历史系39716
中文系2151126
计算机系1211132
(3)输入:
5
输出:
法律系6000
电子系5325
数学系4606
旅游系7077
历史系39716
中文系2151126
计算机系1211132
(4)输入:
6
输出:
法律系6000
电子系5325
数学系4606
旅游系7077
历史系39716
中文系2151126
计算机系1211132
(5)输入:
7
输出:
请输入工程编号:
输入:
1回车
输出:
工程名:
100m
工程类型:
女子工程
第一名:
计算机系
第二名:
中文系
第三名:
法律系
第四名:
无
第五名:
无
(6)输入:
8
输出:
请输入系的编号:
再输入2
则输出:
系名:
中文系男子团体总分:
3女子团体部分:
10总分:
13
(7)输入:
0退出
6、用户手册1、运行环境
Windows,VC++6.02、用户界面
4、操作过程
(1)用户进入程序启动界面,等load完成后进入主菜单.主菜单有以下9个选项
1.输入系别
2.输入运动工程
3.按系别编号输出总分
4.按总分排序
5.按男团体总分排序
6.按女团体总分排序
7.按工程编号查询
8.按系别编号查询
0.退出
(2)输入0~8中的一个数
(3)输入1,进行添加系操作,分别输入系的名称和编号
(4)输入2,进行添加运动工程操作,分别输入工程名称,编号,工程类型,名次选
取,排名情况
(5)输入0,则退出系统,并且保存输入的信息.每次添加完都要输入0退出系统
才有效
(6)输入3,输出按系编号总分排名.
(7)输入4,输出按总分排名
(8)输入5,输出按男团体总分排序
(9)输入6,输出按女团体总分排序
(10)输入7,进入按工程编号查询界面.输入要查询的工程编号
(11)输入8,进入按系别编号查询界面,输入要查询的系的编号
7、参考文献
【1】《C++程序设计》作者:
郑莉,董渊,张瑞丰出版社:
清华大学出版社时间:
2003/12
【2】《数据结构》作者:
严蔚敏,吴伟民出版社:
清华大学出版社时间:
2006/10
【3】《数据结构教程上机实验指导》作者:
严蔚敏,吴伟民,M宁出版社:
清华大学出版
社时间:
2006/5
【4】网址:
8、附录
1、源程序
#include
#include
#include
#include
#include
#include
#include
#include
typedefstructDepartment//系的结构
{
charname[20]。
//系的名称
intnumber。
//系的编号
intboy。
//男子团体总分
intgirl。
//女子团体总分
Department*next。
}Department。
typedefstructSport//运动工程结构
{
charname[20]。
//运动工程名称
intisboy。
//0为女工程,1为男工程
intis3。
//0为取前五名,1为取前五名
intnumber。
//工程编号
intfirst。
//第一名系的编号
intsecond。
//第二名系的编号
intthird。
//第三名系的编号
intfourth。
//第四名系的编号
intfifth。
//第五名系的编号
Sport*next。
}Sport。
intgetint(inta)//字符转换成数字
{
return(int)(a-'0')。
}
Department*head1。
//-------启动画面函数----------
voidCover()
{system("color1b")。
charline[]={"程序读取中 请耐心等待..."}。
charbar[]={"...."}。
inti,j,k=0,x=0,y=0。
for(i=0。
i<=strlen(line)/2。
)
{
system("cls")。
for(j=0。
j<9。
j++)//改变行坐标
cout<for(j=0。
j<(75-strlen(line))/2。
j++)//改变列坐标
cout<<""。
for(j=1。
j<=i。
j++)//进度显示器
cout<<"●"。
for(x=strlen(line)/2。
x>i。
x--)
cout<<"○"。
if(k==4)
i++。
cout<for(j=0。
j<(75-strlen(line))/2。
j++)//行坐标定位
cout<<""。
cout<//输出线条
cout<for(j=0。
j<(65-strlen(bar))/2。
j++)
cout<<""。
cout<<(i+7)*5<<"%Loading"。
cout.write(bar,k)。
cout<for(j=0。
j<10。
j++)
cout<for(j=0。
j<24。
j++)
cout<<""。
cout<<"程序设计员5080906石行"<for(j=0。
j<24。
j++)
cout<<""。
for(j=0。
j<=18。
j++)
cout<<"─"。
cout<for(j=0。
j<10000000。
j++)。
//延时效果
k++。
if(k>4)
k=0。
}
}
voiddepartment_add()//添加系
{
Department*p。
intmark=0。
p=newDepartment。
cout<<"请输入系的名称:
"。
cin>>p->name。
charc。
while(mark!
=1)
{
cout<<"请输入系的编号:
"。
cin>>c。
if(!
isdigit(c))//是否为数字
{
cout<<"数据非法"<}
else
{
mark=1。
p->number=c。
}
}
p->boy=0。
p->girl=0。
p->next=head1->next。
head1->next=p。
cout<<"成功添加了一个系"<}
intdepartment_getlong(Department*first)//得到链表长度
{
inti=0。
while(first->next!
=NULL)
{
i++。
first=first->next。
}
returni。
}
voiddepartment_write()//将系数据写入文本
{
Department*p。
p=head1。
p=p->next。
ofstreamoutfile("Department.txt",ios:
:
out)。
outfile<while(p!
=NULL)
{
outfile<name<<""<number<<""<boy<<""<girl<<""。
p=p->next。
}
outfile.close()。
cout<<"WriteSuccess!
"<}
voiddepartment_read()//从文本读入系数据
{
inti。
ifstreaminfile("Department.txt",ios:
:
in)。
infile>>i。
while(i>0)
{
Department*p。
p=newDepartment。
infile>>p->name>>p->number>>p->boy>>p->girl。
p->next=head1->next。
head1->next=p。
i--。
}
cout<<"DepartmentDataReadSuccess!
"<}
voiddepartment_output(Department*p)//输出系
{
cout<<" 系名 编号 男团总分 女团总分 总分\t\n"。
while(p)
{
cout<name<<"\t"<number)<<"\t"<boy<<"\t"<girl<<"\t"<<(p->girl+p->boy)<p=p->next。
}
}
intdepartment_isexist(inta)//检验系是否存在
{
intb=0。
Department*p。
p=head1。
p=p->next。
while(p)
{
if(p->number==a)
{
return1。
}
p=p->next。
}
return0。
}
voiddepartment_show(inta)//输出所有系
{
Department*p。
p=head1。
p=p->next。
while(p)
{
if(p->number==a)
{
cout<name<<" "。
return。
}
p=p->next。
}
cout<<" 无 "。
}
voiddepartment_search(inta)//按编号搜索系
{
Department*p。
p=head1。
p=p->next。
while(p)
{
if(p->number==a)
{
cout<<"系名:
"<name<<" "<<"男子团体总分:
"<boy<<" "<<"女子团体总分:
"<girl<<" "<<"总分:
"<<(p->boy+p->girl)<<" "。
return。
}
p=p->next。
}
cout<<"无此编号"。
}
voiddepartment_addmark(inta,intb,intc)//a为分数,b为系编号,c=1表示男,c=0表示女
{
Department*p。
p=head1。
p=p->next。
while(p)
{
if(p->number==b)
{
if(c=='1')
{
p->boy=p->boy+a。
}
else
{
p->girl=p->girl+a。
}
}
p=p->next。
}
}
voiddepartment_order(Department*temp,inttype)//type=0按总分,type=1按男总分,type=2按女总分,
{
Department*p,*q,*small,*temp1。
temp1=newDepartment。
temp1->next=NULL。
p=temp。
while(p)
{
small=p。
q=p->next。
while(q)
{
switch(type)
{
case0:
if((q->boy+q->girl)<(small->girl+small->boy))
{
small=q。
}
break。
case1:
if(q->boyboy)
{
small=q。
}
break。
case2:
if(q->girlgirl)
{
small=q。
}
break。
default:
cout<<"error"<}
if(small!
=p)
{
temp1->boy=p->boy。
p->boy=small->boy。
small->boy=temp1->boy。
temp1->girl=p->girl。
p->girl=small->girl。
small->girl=temp1->girl。
strcpy(temp1->name,p->name)。
strcpy(p->name,small->name)。
strcpy(small->name,temp1->name)。
temp1->number=p->number。
p->number=small->number。
small->number=temp1->number。
//将系的名字互换
}
q=q->next。
}
p=p->next。
}
}
Sport*head2。
intsport_isexist(inta)//检查运动工程(编号)是否已经存在
{
intb=0。
Sport*p。
p=head2。
p=p->next。
while(p)
{
if(p->number==a)
{
return1。
}
p=p->next。
}
return0。
}
voidsport_add()//添加工程
{
Sport*p。
intmark=0。
p=newSport。
cout<<"请输入工程名称:
"。
cin>>p->name。
charc。
while(mark!
=1)
{
cout<<"请输入工程编号:
"。
cin>>c。
if(!
isdigit(c))
{
cout<<"数据非法"<}
else
{
if(sport_isexist(c))
{
cout<<"该编号已存在"<}
else
{
mark=1。
p->number=c。
}
}
}
mark=0。
while(mark!
=1)
{
cout<<"请输入工程类型(0为女子工程,1为男子工程):
"。
cin>>c。
p->isboy=(int)(c-'0')。
//字符转换成数字
if(!
isdigit(c))
{
cout<<"数据非法"<}
elseif(p->isboy<0||p->isboy>1)
{
cout<<"数据非法"<}
else
{
mark=1。
p->isboy=c。
}
}
mark=0。
while(mark!
=1)
{
cout<<"请输入工程名次情况(0为取前3名,1为取前5名):
"。
cin>>c。
p->is3=(int)(c-'0')。
if(!
isdigit(c))
{
cout<<"数据非法"<}
elseif(p->is3<0||p->is3>1)
{
cout<<"数据非法"<}
else
{
mark=1。
p->is3=c。
}
}
mark=0。
while(mark!
=1)
{
cout<<"请输入第一名的系的编号:
"。
cin>>c。
if(!
isdigit(c))
{
cout<<"数据非法"<}
else
{
if(!
department_isexist(c))
{
cout<<"该系不存在,请先添加"。
}
else
{
mark=1。
p->first=c。
if(p->is3=='0')
department_addmark(5,c,p->isboy)。
else
department_addmark(7,c,p->isboy)。
}
}
}
mark=0。
while(mark!
=1)
{
cout<<"请输入第二名的系的编号:
"。
cin>>c。
if(!
isdigit(c))
{
cout<<"数据非法"<}
else
{
if(!
department_isexist(c))
{
cout<<"该系不存在,请先添加"。
}
else
{
mark=1。
p->second=c。
if(p->is3=='0')
department_addmark(3,c,p->isboy)。
else
department_addmark(5,c,p->isboy)。
}
}
}
mark=0。
while(mark!
=1)
{
cout<<"请输入第三名的系的编号:
"。
cin>>c。
if(!
isdigit(c))
{
cout<<"数据非法"<}
else
{
if(!
department_isexist(c))
{
cout<<"该系不存在,请先添加"。
}
else
{
mark=1。
p->third=c。
if(p->is3=='0')
department_addmark(2,c,p->isboy)。
else
department_addmark(3,c,p->isboy)。
}
}
}
mark=0。
if(p->is3=='1')
{
while(mark!
=1)
{
cout<<"请输入第