数据结构课设报告_运动会分数统计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
一、设计任务 (2)
二、功能需求分析 (2)
三、功能算法设计 (3)
四、编码实现 (4)
五、调试分析 (5)
六、课设总结 (7)
七、参考文献 (7)
一、设计任务
问题描述:
参加运动会的n个学校编号为1~n。

比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。

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

写一个统计程序产生各种成绩单和得分报表。

基本要求:
⑴每个项目结束时,输入前三名或前五名的项目编号、运动员姓名、校名和名次(成绩);
⑵产生各学校的成绩单,内容包括各学校所取得的每项成绩的项目号、名次(成绩)、姓名和得分,并统计各学校总分;
⑶产生团体总分报表,内容包括校号、男子团体总分、女子团体总分和团体总分。

二、功能需求分析
1.int InitList(SqList &L)
操作结果构造一个空的顺序线性表
2.int ListInsert(SqList &L,int i,ElemType e)
初始条件:顺序线性表L已存在,≤i≤ListLength(L)+1
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加
3.void InsertSort(List &L)
操作结果:对顺序表L作直接插入排序。

算法.1
4.void print(List L)
操作结果:打印线性表:
5.int main()
操作结果:完成系统的主要设计;
三、功能算法设计InitList()流程图ListInsert()流程图
Print()流程图InsertSort(List &L)流程图
四、编码实现
struct RedType // 记录类型
{
KeyType key; // 关键字项
InfoType otherinfo; // 其它数据项,具体类型在主程中定义
};
typedef struct
{
int schnum;//学校的编号
int mscore[20];//学校在各个男生项目的积分
int wscore[20];//学校在各个女生项目的积分
}school;//学校记录类型
typedef int ElemType;
struct SqList
{
ElemType *elem;// 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
struct List
{
RedType r[20];
int length;
};
int InitList(SqList &L) // 算法.3
{ // 操作结果:构造一个空的顺序线性表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(-1); // 存储分配失败
L.length=0; // 空表长度为
L.listsize=LIST_INIT_SIZE; // 初始存储容量
return 1;
}
int ListInsert(SqList &L,int i,ElemType e) // 算法.4
{ // 初始条件:顺序线性表L已存在,≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加ElemType *newbase,*q,*p;
if(i<1||i>L.length+1) // i值不合法
return 0;
if(L.length>=L.listsize) // 当前存储空间已满,增加分配
{
if(!(newbase=(ElemType
*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)))) exit(-1); // 存储分配失败
L.elem=newbase; // 新基址
L.listsize+=LISTINCREMENT; // 增加存储容量
}
q=L.elem+i-1; // q为插入位置
for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移*(p+1)=*p;
*q=e; // 插入e
++L.length; // 表长增
return 1;
}
void InsertSort(List &L)
{ // 对顺序表L作直接插入排序。

算法.1
int i,j;
for(i=2;i<=L.length;++i)
if LT(L.r[i].key,L.r[i-1].key) // "<",需将L.r[i]插入有序子表
{
L.r[0]=L.r[i]; // 复制为哨兵
for(j=i-1;LT(L.r[0].key,L.r[j].key);--j)
L.r[j+1]=L.r[j]; // 记录后移
L.r[j+1]=L.r[0]; // 插入到正确位置
}
}
void print(List L)
{
int i;
for(i=1;i<=L.length;i++)
printf("(%d,%d,%d)\n",L.length-i+1,L.r[i].otherinfo,L.r[i].key);
printf("\n");
}
五、调试分析
1.输入学校数量和男女生项目数量
2.输入个项目成绩
3.选择运算项目输出查看
4.按学校总分排序运行情况
5. 按难团总分排序运行情况
6. 按女团总分排序运行情况
六、课设总结
七、参考文献
附录代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define LT(a,b) ((a)<(b))
#define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
#define LISTINCREMENT 10//线性表存储空间的分配增量
using namespace std;
typedef int InfoType; // 定义其它数据项的类型
typedef int KeyType; // 定义关键字类型为整型
struct RedType // 记录类型
{
KeyType key; // 关键字项
InfoType otherinfo; // 其它数据项,具体类型在主程中定义};
typedef struct
{
int schnum;//学校的编号
int mscore[20];//学校在各个男生项目的积分
int wscore[20];//学校在各个女生项目的积分
}school;//学校记录类型
typedef int ElemType;
struct SqList
{
ElemType *elem;// 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位) };
struct List
{
RedType r[20];
int length;
};
int InitList(SqList &L) // 算法.3
{ // 操作结果:构造一个空的顺序线性表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(-1); // 存储分配失败
L.length=0; // 空表长度为
L.listsize=LIST_INIT_SIZE; // 初始存储容量
return 1;
}
int ListInsert(SqList &L,int i,ElemType e) // 算法.4
{ // 初始条件:顺序线性表L已存在,≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加ElemType *newbase,*q,*p;
if(i<1||i>L.length+1) // i值不合法
return 0;
if(L.length>=L.listsize) // 当前存储空间已满,增加分配
{
if(!(newbase=(ElemType
*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType)))) exit(-1); // 存储分配失败
L.elem=newbase; // 新基址
L.listsize+=LISTINCREMENT; // 增加存储容量
}
q=L.elem+i-1; // q为插入位置
for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移
*(p+1)=*p;
*q=e; // 插入e
++L.length; // 表长增
return 1;
}
void InsertSort(List &L)
{ // 对顺序表L作直接插入排序。

算法.1
int i,j;
for(i=2;i<=L.length;++i)
if LT(L.r[i].key,L.r[i-1].key) // "<",需将L.r[i]插入有序子表
{
L.r[0]=L.r[i]; // 复制为哨兵
for(j=i-1;LT(L.r[0].key,L.r[j].key);--j)
L.r[j+1]=L.r[j]; // 记录后移
L.r[j+1]=L.r[0]; // 插入到正确位置
}
}
void print(List L)
{
int i;
for(i=1;i<=L.length;i++)
printf("(%d,%d,%d)\n",L.length-i+1,L.r[i].otherinfo,L.r[i].key);
printf("\n");
}
int main() //规定男生项目前三名分别积分、、,女生项目前五名分别积分、、、、
//规定没有名次则积分为,不考虑并列的情况
//请正确输入各学校对应项目的积分
{
int n,m,w,i,j;
school a[20];
int summscore[20],sumwscore[20],sumscore[20];//定义存储各个学校男团、女团、总分RedType d[20];//定义排序所需的数组为RedType型
SqList L,Lm,Lw;//定义存放各个学校总分、男团、女团积分的顺序线性表
List Lr;//定义积分排序所需的顺序线性表
InitList(L);//初始化各线性表
InitList(Lm);
InitList(Lw);
cout<<"请输入参加运动会的学校数目(~20):"<<endl;
cin>>n;
while(n<5||n>20)
{
cout<<"输入学校数目有误,请重新输入!"<<endl;
cout<<"请输入参加运动会的学校数目(~20):"<<endl;
cin>>n;
}
cout<<"请分别输入男生、女生的项目数目(~20):"<<endl;
cin>>m>>w;
cout<<"规定男生项目前三名分别积分、、"<<endl;
cout<<"女生项目前五名分别积分、、、、"<<endl;
cout<<"没有名次则积分为,且本程序不涉及并列排名的情况!"<<endl;
cout<<"请正确输入各学校对应项目的积分!\n"<<endl;
for(i=1;i<=n;i++)
{
a[i-1].schnum=i;//赋给学校对应的编号
printf("请输入学校%d 男生各个项目的成绩:\n",i);
for(j=1;j<=m;j++)//分别输入对应学校的各个男生项目的积分情况
cin>>a[i-1].mscore[j-1];
printf("请输入学校%d 女生各个项目的成绩:\n",i);
for(j=1;j<=w;j++)//分别输入对应学校的各个女生项目的积分情况
cin>>a[i-1].wscore[j-1];
}
for(i=0;i<n;i++)
{
summscore[i]=a[i].mscore[0];
for(j=1;j<m;j++)
summscore[i]+=a[i].mscore[j];//求出学校男团总分并存储到数组中对应位置ListInsert(Lm,i+1,summscore[i]);//将学校男团总分插入存放在线性表对应位置
sumwscore[i]=a[i].wscore[0];
for(j=1;j<w;j++)
sumwscore[i]+=a[i].wscore[j];//求出学校女团总分并存储到数组中对应位置ListInsert(Lw,i+1,sumwscore[i]);//将学校女团总分插入存放在线性表对应位置
sumscore[i]=summscore[i]+sumwscore[i];//求出学校总分并存储到数组中对应位置
ListInsert(L,i+1,sumscore[i]);//将学校总分插入存放在线性表对应位置
}
int flag=1;
char ch;
while(flag)//当flag为真时执行循环
{ printf("请选择:\n");
printf("1.查看各学校总分统计,并按学校编号排序输出查看\n");
printf("2.按学校总分排序输出查看\n");
printf("3.按男团总分排序输出查看\n");
printf("4.按女团总分排序输出查看\n");
printf("5.按学校编号查询学校某个项目的情况\n");
printf("6.按项目编号查询取得前三或前五名的学校\n");
printf("7.退出程序\n");
cin>>ch;
switch(ch)
{
case '1'://查看各学校总分统计,并按学校编号排序输出查看
for(i=0;i<n;i++)
{
printf("学校编号:%d 学校总分:%d\n",i+1,L.elem[i]);
}
break;
case '2'://按学校总分排序输出查看
Lr.length=n;
for(i=0;i<n;i++)
{
d[i].key=L.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按学校总分排序后以(名次,学校编号,学校总分)形式输出为:"<<endl;
print(Lr);
break;
case '3'://按男团总分排序输出查看
Lr.length=n;
for(i=0;i<n;i++)
{
d[i].key=Lm.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按男团总分排序后以(名次,学校编号,男团总分)形式输出为:"<<endl;
print(Lr);
break;
case '4'://按女团总分排序输出查看
Lr.length=n;
for(i=0;i<n;i++)
{
d[i].key=Lw.elem[i];
d[i].otherinfo=i+1;
Lr.r[i+1]=d[i];
}
InsertSort(Lr);
cout<<"按女团总分排序后以(名次,学校编号,女团总分)形式输出为:"<<endl;
print(Lr);
break;
case '5'://按学校编号查询学校某个项目的情况
int s,t;
cout<<"请输入要查询的学校编号:"<<endl;
cin>>s;
while(s<1||s>n)//输入学校编号不在初始定义范围之内
{
cerr<<"输入学校编号有误,请重新正确输入!"<<endl;
cout<<"请输入要查询的学校编号:"<<endl;
cin>>s;//重新输入
}
i=0;
while(a[i].schnum!=s)
++i;//通过循环找到输入编号的对应学校在数组a中的位置
cout<<"请输入要查询的项目序号:"<<endl;
cin>>t;
while(t<1||t>m+w)//输入项目序号不在初始定义范围之内
{
cout<<"输入项目序号有误,请重新正确输入!"<<endl;
cout<<"请输入要查询的项目序号:"<<endl;
cin>>t;//重新输入
}
if(t<=m)//该项目属于男生项目
printf("该学校该项目积分为:%d\n",a[i].mscore[t-1]);//从学校男生项目积分数组里输出
else //该项目属于女生项目
printf("该学校该项目积分为:%d\n",a[i].wscore[t-m-1]);//从学校女生项目积分数组里输出
break;
case '6'://按项目编号查询取得前三或前五名的学校
cout<<"请输入要查询的项目序号:"<<endl;
cin>>t;
while(t<1||t>m+w)//输入项目序号不在初始定义范围之内
{
cout<<"输入项目序号有误,请重新正确输入!"<<endl;
cout<<"请输入要查询的项目序号:"<<endl;
cin>>t;//重新输入
}
if(t<=m)//该项目属于男生项目
{
i=0;
while(a[i].mscore[t-1]!=5)
++i;//通过循环找到该项目第一名学校在a中的位置
printf("获得该项目第一名的是学校:%d 号\n",i+1);
i=0;
while(a[i].mscore[t-1]!=3)
++i;//通过循环找到该项目第二名学校在a中的位置
printf("获得该项目第二名的是学校:%d 号\n",i+1);
i=0;
while(a[i].mscore[t-1]!=2)
++i;//通过循环找到该项目第三名学校在a中的位置
printf("获得该项目第三名的是学校:%d 号\n",i+1);
}
else//该项目属于女生项目
{
i=0;
while(a[i].wscore[t-m-1]!=7)
++i;//通过循环找到该项目第一名学校在a中的位置
printf("获得该项目第一名的是学校:%d 号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!=5)
++i;//通过循环找到该项目第二名学校在a中的位置
printf("获得该项目第二名的是学校:%d 号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!=3)
++i;//通过循环找到该项目第三名学校在a中的位置
printf("获得该项目第三名的是学校:%d 号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!=2)
++i;//通过循环找到该项目第四名学校在a中的位置printf("获得该项目第四名的是学校:%d 号\n",i+1);
i=0;
while(a[i].wscore[t-m-1]!=1)
++i;//通过循环找到该项目第五名学校在a中的位置printf("获得该项目第五名的是学校:%d 号\n",i+1);
}
break;
default:flag=0;printf("程序结束,按任意键退出!\n");//退出程序
}
}
getchar();
}。

相关文档
最新文档