C语言课程设计报告_运动会分数统计系统
一.需求分析
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)系的定义:
typedef struct Department //系的结构
{
char name[20]; //系的名称
int number; //系的编号
int boy; //男子团体总分
int girl; //女子团体总分
Department *next; }Department;
(2)运动项目定义:
typedef struct Sport //运动项目结构
{
char name[20]; //运动项目名称
int isboy; //0为女项目,1为男项目
int is3; //0为取前五名,1为取前五名
int number; //项目编号
int first; //第一名系的编号
int second; //第二名系的编号
int third; //第三名系的编号
int fourth; //第四名系的编号
int fifth; //第五名系的编号
Sport *next;
}Sport;、
2、函数之间的调用关系
(1)系调用图
3、算法设计
主要算法的设计思想:
本程序主要是使用链表来实现操作。一个运动会包括运动项目和参加运动会的成员。因此构造两个链表Department,Sport。为了操作的方便,并且能够保存输入数据,所以通过文件操作来实现数据的写和读。每次添加新的数据后都要输入0退出,数据才能保存。对于总分的排序使用了冒泡排序。为了使整个程序看起来更加友好,又添加了程序启动画面。
四、调试分析
本程序相对来说比较容易看明白,其中涉及到的一些函数相对来说比较容易。通过调试,运行,基本上达到了要求,但还存在一些缺点。如:不够人性化等。
五、测试结果
<1>多组数据输入与输出:
(1)输入:3
输出:系名 编号 男团总分 女团总分 总分
法律系 6 0 0 0
电子系 5 3 2 5
数学系 4 6 0 6
历史系 3 9 7 16
中文系 2 15 11 26
计算机系 1 21 11 32
旅游系 7 0 7 7
(2)输入:4
输出: 系名 编号 男团总分 女团总分 总分
法律系 6 0 0 0
电子系 5 3 2 5
数学系 4 6 0 6
旅游系 7 0 7 7
历史系 3 9 7 16
中文系 2 15 11 26
计算机系 1 21 11 32
(3)输入:5
输出:法律系 6 0 0 0
电子系 5 3 2 5
数学系 4 6 0 6
旅游系 7 0 7 7
历史系 3 9 7 16
中文系 2 15 11 26
计算机系 1 21 11 32
(4)输入:6
输出:法律系 6 0 0 0
电子系 5 3 2 5
数学系 4 6 0 6
旅游系 7 0 7 7
历史系 3 9 7 16
中文系 2 15 11 26
计算机系 1 21 11 32
(5)输入:7
输出:请输入项目编号:
输入:1回车
输出:
项目名:100m
项目类型:女子项目
第一名:计算机系
第二名:中文系
第三名:法律系
第四名:无
第五名:无
(6)输入:8
输出:请输入系的编号:
再输入2
则输出:
系名:中文系 男子团体总分:3 女子团体部分:10 总分:13
(7)输入:0 退出
六、用户手册
1、运行环境
Windows,VC++6.0
2、用户界面
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,进入按系别编号查询界面,输入要查询的系的编号
七、参考文献
【1】《C++程序设计》作者:郑莉,董渊,张瑞丰 出版社:清华大学出版社 时间:2003/12
【2】《数据结构》作者:严蔚敏,吴伟民 出版社:清华大学出版社 时间:2006/10
【3】《数据结构教程上机实验指导》作者:严蔚敏,吴伟民,米宁 出版社:清华大学出版
社 时间:2006/5
【4】 网址: http://www.chinadforce.com
八、附录
1、源程序
#include
#include
#include
#include
#include
#include
#include
#include
typedef struct Department //系的结构
{
char name[20]; //系的名称
int number; //系的编号
int boy; //男子团体总分
int girl; //女子团体总分
Department *next; }Department;
typedef struct Sport //运动项目结构
{
char name[20]; //运动项目名称
int isboy; //0为女项目,1为男项目
int is3; //0为取前五名,1为取前五名
int number; //项目编号
int first; //第一名系的编号
int second; //第二名系的编号
int third; //第三名系的编号
int fourth; //第四名系的编号
int fifth; //第五名系的编号
Sport *next;
}Sport;
int getint(int a) //字符转换成数字
{
return (int)(a-'0');
}
Department * head1;
//-------启动画面函数----------
void Cover()
{ system("color 1b");
char line[]={"程序读取中 请耐心等待..."};
char bar[]={"...."};
int i,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;
}
}
void department_add() //添加系
{
Department * p;
int mark=0;
p=new Department;
cout<<"请输入系的名称:";
cin>>p->name;
char c;
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<<"成功添加了一个系"<
}
int department_getlong(Department *first)//得到链表长度
{
int i=0;
while (first->next!=NULL)
{
i++;
first=first->next;
}
return i;
}
void department_write()//将系数据写入文本
{
Department * p;
p=head1;
p=p->next;
ofstream outfile("Department.txt",ios::out);
outfile<
while (p!=NULL)
{
outfile<name<<" "<number<<" "<boy<<" "<girl<<" ";
p=p->next;
}
outfile.close();
cout<<"Write Success!"<
}
void department_read()//从文本读入系数据
{
int i;
ifstream infile ("Department.txt",ios::in);
infile>>i;
while(i>0)
{
Department * p;
p=new Department;
infile>>p->name>>p->number>>p->boy>>p->girl;
p->next=head1->next;
head1->next=p;
i--;
}
cout<<"Department Data Read Success!"<
}
void department_output(Department *p)//输出系
{
cout<<" 系名 编号 男团总分 女团总分 总分\t\n";
while(p)
{
cout<name<<" \t"<number)<<"\t"<boy<<"\t"<girl<<"\t "<<(p->girl+p->boy)<
p=p->next;
}
}
int department_isexist(int a)//检验系是否存在
{
int b=0;
Department *p;
p=head1;
p=p->next;
while(p)
{
if(p->number==a)
{
return 1;
}
p=p->next;
}
return 0;
}
void department_show(int a)//输出所有系
{
Department *p;
p=head1;
p=p->next;
while(p)
{
if(p->number==a)
{
cout<name<<" ";
return;
}
p=p->next;
}
cout<<" 无 ";
}
void department_search(int a)//按编号搜索系
{
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<<"无此编号";
}
void department_addmark(int a,int b,int c)//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;
}
}
void department_order(Department *temp,int type) //type=0按总分,type=1按男总分,type=2按女总分,
{
Department *p,*q,*small,*temp1;
temp1=new Department;
temp1->next=NULL;
p=temp;
while(p)
{
small=p;
q=p->next;
while(q)
{
switch(type)
{
case 0:
if((q->boy+q->girl)<(small->girl+small->boy))
{
small=q;
}
break;
case 1:
if(q->boyboy)
{
small=q;
}
break;
case 2:
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;
int sport_isexist(int a) //检查运动项目(编号)是否已经存在
{
int b=0;
Sport *p;
p=head2;
p=p->next;
while(p)
{
if(p->number==a)
{
return 1;
}
p=p->next;
}
return 0;
}
void sport_add() //添加项目
{
Sport * p;
int mark=0;
p=new Sport;
cout<<"请输入项目名称:";
cin>>p->name;
char c;
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<<"数据非法"<
}
else if(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<<"数据非法"<
}
else if(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<<"请输入第四名的系的编号:";
cin>>c;
if (!isdigit(c))
{
cout<<"数据非法"<
}
else
{
if(!department_isexist(c))
{
cout<<"该系不存在,请先添加";
}
else
{
mark=1;
p->fourth=c;
department_addmark(2,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->fifth=c;
department_addmark(1,c,p->isboy);
}
}
}
}
else
{
p->fourth='0';
p->fifth='0';
}
p->next=head2->next;
head2->next=p;
cout<<"成功添加了一个运动项目"<
}
int sport_getlong(Sport *first) //得到项目链表长度
{
int i=0;
while (first->next!=NULL)
{
i++;
first=first->next;
}
return i;
}
void sport_write() //将项目数据写入文本文档
{
Sport * p;
p=head2;
p=p->next;
ofstream outfile("Sport.txt",ios::out);
outfile<
while (p!=NULL)
{
outfile<name<<" "<number<<" "<isboy<<" "<is3<<" "<first<<" "<second<<" "<third<<" "<fourth<<" "<fifth<<" ";
p=p->next;
}
outfile.close();
cout<<"Write Success!"<
}
void sport_read() //从文本读取项目数据
{
int i;
ifstream infile ("Sport.txt",ios::in);
infile>>i;
while(i>0)
{
Sport * p;
p=new Sport;
infile>>p->name>>p->number>>p->isboy>>p->is3>>p->first>>p->second>>p->third>>p->fourth>>p->fifth;
p->next=head2->next;
head2->next=p;
i--;
}
cout<<"Sport Data Read Success!"<
}
void sport_output(Sport *p) //输出项目的情况
{
cout<<"name "<<"\t"<<"Num"<<" "<<"B/G"<<" "<<" 3/5"<<" "<<" first"<<" "<<"second"<<" "<<"third"<<" "<<"fourth"<<" "<<"fifth"<<" "<
while(p)
{
cout<< p->name <<"\t" <<" " <number)<<" " << getint(p->isboy)<<" " <is3)<<" "<<" ";
department_show(p->first);
department_show(p->second);
department_show(p->third);
department_show(p->fourth);
department_show(p->fifth);
//printf("\n");
p=p->next;
cout<<"\n";
}
cout<
}
void sport_search(int a) //搜索项目
{
Sport *p;
p=head2;
p=p->next;
while(p)
{
if(p->number==a)
{
cout<<"项目名:"<name<
if(p->isboy==1)
{
cout<<"男子项目";
}
else
{
cout<<"女子项目";
}
cout<
department_show(p->first);
cout<
department_show(p->second);
cout<
department_show(p->third);
cout<
department_show(p->fourth);
cout<
department_show(p->fifth);
return;
}
p=p->next;
}
cout<<"无此编号";
}
void main() //运动会程序主函数
{
Cover();
system("color 2b"); //改变背景,前景色
head1=new Department;
head1->next=NULL;
head2=new Sport;
head2->next=NULL;
//school_add();
sport_read();
department_read();
//sport_add();
Department * p1;
Sport * p2;
p1=head1;
p1=p1->next;
p2=head2;
p2=p2->next;
char choose;
char temp;
//string ch=" ";
int a=1;
while(a!=0)
{
cout<
cout<<" .oO欢迎使用运动会分数统计系统Oo. "<
cout<<" **********************************************************"<
cout<<" * *"<
cout<<" * 1.输入系别; 2.输入运动项目 *"<
cout<<" * *"<
cout<<" * 3.按系别编号输出总分; 4.按总分排序; *"<
cout<<" * *"<
cout<<" * 5.按男团体总分排序; 6.按女团体总分排序; *"<
cout<<" * *"<
cout<<" * 7.按项目编号查询; 8.按系别编号查询; *"<
cout<<" * *"<
cout<<" * 0.退出 *"<
cout<<" * *"<
cout<<" * 提示:需先输入系别后才能输入运动项目 *"<
cout<<" * *"<
cout<<" **********************************************************"<
cout<<" 请选择:";
//cin>>ch;
//choose=int(ch[0])+int(ch[1])-'0'; //处理异常状态
cin>>choose;
if (!isdigit(choose))
{
system("cls");
cout<<"操作非法1"<
}
else
{
switch(getint(choose))
{
case 1:
system("cls");
department_add();
break;
case 2:
system("cls");
cout<<"当前项目:"<
sport_output(p2);
cout<<"当前系:"<
department_output(p1);
sport_add();
break;
case 3:
system("cls");
department_output(p1);
break;
case 4:
system("cls");
department_order(p1,0);
department_output(p1);
break;
case 5:
system("cls");
department_order(p1,1);
department_output(p1);
break;
case 6:
system("cls");
department_order(p1,2);
department_output(p1);
break;
case 7:
system("cls");
cout<<"请输入项目编号:";
cin>>temp;
sport_search(temp);
break;
case 8:
system("cls");
cout<<"请输入系的编号:";
cin>>temp;
department_search(temp);
break;
case 0:
system("cls");
a=0;
break;
default:
system("cls");
cout<<"操作非法\n";
}
}
}
department_write();
sport_write();
system("exit");
}
九、课程设计体会
本次课程设计检验了我的实践能力,感觉自己还有许多东西要学习,并不仅限于课本上的知识,实践才是真理,在学习中实践,实践中去学习。学习的路很长。
再有要多问,几个人共同讨论会有意想不到的效果