资源描述
数据结构课程设计
实验名称: 运动会分数记录
学生班级: 2023级通信二班
学生姓名: 赵玉昌
学生学号:
实验日期: 2023年7月3日
一.需求分析:
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) 可以按学校编号查询学校某个项目的情况;
5) 可以按项目编号查询取得前三或前五名的学校。
3.程序执行的命令涉及:
1) 输入所需要的各项数据2)对成绩进行排序3)查找成绩4)退出结束
4.测试数据:
输入五个学校的名字:东华,上外,外贸,视觉,工技大
输入四个体育项目:篮球,游泳,足球,马拉松。
输入篮球前五名的学校代码排名情况:1 3 5 2 4
输入游泳前三名学校代码排名情况:1 2 3
输入足球前三名学校代码情况:1 4 2
输入马拉松前三名的学校代码排名情况:1 5 3
二.算法设计:
为了实现上述程序需要使用要串和线性表,因此需要两个抽象数据类型:串和线性顺序表。
1.串的抽象数据类型的定义如下:
ADT String{
数据对象:D={ai|ai ∈characterSet,I=1,2,……,n,n>=0}
数据关系:R1={<ai-1,ai>|ai-1,ai∈D,I=2,……,n}
基本操作:
StrAssign(&T,chars)
初始条件:chars是字符串常量。
操作结果:生成一起值等于chars的字符串T.
StrCopy(&T,s)
初始条件: 串S存在
操作结果:由串复制得串T.
StrEmpty(s)
初始条件: 串S存在。
操作结果:若S为空串,则返回TRUE,否则返回FALSE.
Strcompare(S,T)
初始条件:串S和T存在。
操作结果:若S>T,则返回>0;若S=T,则返回值=0,若S<T,则返回值<0.
Strlength(S)
初始条件: 串S存在。
操作结果:返回S的元素个数,称为串的长度。
ClearString(&S)
初始条件: 串S存在。
操作结果:将S清为空串。
Concat(&T,S1,S2)
初始条件:串S1和串S2都存在。
操作结果:用Y返回由S1和S2连接而成的新串。
}
2.现性顺序表的抽象数据定义如下:
Typedef Struct LNode
{
ElemType *elem
Int length
Int listsize;
}LNode,*linklist;
3.本程序分为三个模块:
1) 主程序模块
main()
{while(标志!=0)
{执行命令;
输入标志;
}
switch(标志)
{ case 标志:命令;break;
……
default:命令;
}
}
2)赋值模块——实现各个数据的赋值
Sho fuzhi()
{ for( )
{输入学校的名字
}
for()
{输入几个体育项目
}
For()
{按成绩输入各个体育项目的学校的名次
}
3)排序模块:——对各项成绩进行排序
Void paixu( )
{ 给i,j,赋初值;
For()
If{判断;
排序;
}
输出结果;
}
4)查询模块;——根据规定查询成绩的排名情况
Void chaxun ()
{ 定义临时变量;
输入要查找的代码;
For()
If(命令=进入)
{输出成绩;
}
}
各个模块之间的关系如下:
主程序模块
赋值模块
排序模块
查找模块
三.具体设计:
#include"iostream.h"
#include"malloc.h"
#include <string.h>
#include"stdlib.h"
#define m 4
#define n 5
1.运动项目的类型
typedef struct sport
{
char sportname[20];
int num;int s;
}spo;
typedef struct sport1
{
char schoolname[20];
spo sports[m];
int zong,boy,girl,zong1,boy1,girl1;
}spos,*spor;
2.学校名字的类型
typedef struct school
{
spos shools[n];
}*sho,shos;
3.进行赋值操作,输入学校名字和运动会项目以及其的排名情况
sho fuzhi()
{
sho l;int a,b,c,d,e;
l=(shos*)malloc(sizeof(shos));
int i,j;
for(i=0;i<n;i++)
{
cout<<"请输入"<<i+1<<"个学校的名字"<<endl;
cin>>l->shools[i].schoolname;system("cls");
}
for(i=0;i<m;i++)
{
cout<<"请输入"<<i+1<<"个运动项目的名字"<<endl;
cin>>l->shools[0].sports[i].sportname;system("cls");
for(j=0;j++;j<n)
{
strcpy(l->shools[j].sports[i].sportname,l->shools[0].sports[i].sportname);
}
}
for(i=0;i<n;i++)
{for(j=0;j<m;j++)
{
l->shools[i].sports[j].num=0;l->shools[i].sports[j].s=0;
}l->shools[i].zong=0;l->shools[i].boy=0;l->shools[i].girl=0;}
for(i=0;i<m-3;i++)
{
cout<<"请按各学校的代码进行成绩输入"<<endl;
for(j=0;j<n;j++)
cout<<j+1<<"."<<l->shools[j].schoolname;
cout<<endl;
cout<<"请输入"<<l->shools[0].sports[i].sportname<<"的前5名的学校代码";
cin>>a>>b>>c>>d>>e;system("cls");
l->shools[a-1].sports[i].num=7;
l->shools[b-1].sports[i].num=5;
l->shools[c-1].sports[i].num=3;
l->shools[d-1].sports[i].num=2;
l->shools[e-1].sports[i].num=1;
}
for(i=m-3;i<m;i++)
{
cout<<"请按各学校的代码进行成绩输入"<<endl;
for(j=0;j<n;j++)
cout<<j+1<<"."<<l->shools[j].schoolname<<" ";
cout<<endl;
cout<<"请输入"<<l->shools[0].sports[i].sportname<<"的前3名的学校代码";
cin>>a>>b>>c;system("cls");
l->shools[a-1].sports[i].num=5;
l->shools[b-1].sports[i].num=3;
l->shools[c-1].sports[i].num=2;
}
return l;
}
void sum(sho l)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
l->shools[i].zong=l->shools[i].zong+l->shools[i].sports[j].num;
}
for(j=0;j<m-3;j++)l->shools[i].boy=l->shools[i].boy+l->shools[i].sports[j].num;
for(j=m-3;j<m;j++)l->shools[i].girl=l->shools[i].girl+l->shools[i].sports[j].num;
cout<<l->shools[i].schoolname<<"总分为"<<l->shools[i].zong<<endl;
}
}
4.对输入的分数情况进行排序
void paixu1(sho l)
{
int i,j,k=1;
int temp=0;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].zong>l->shools[j].zong)
{
k++;
}
l->shools[j].zong1=k;
k=1;
}
for(j=1;j<n+1;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].zong1==j)
cout<<"总分第"<<j<<"名学校为:"<<l->shools[i].schoolname<<endl;;
}
}
void paixu2(sho l)
{
int i,j,k=1;
int temp=0;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].boy>l->shools[j].boy)
{
k++;
}
l->shools[j].boy1=k;
k=1;
}
for(j=1;j<n+1;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].boy1==j)
cout<<"男子第"<<j<<"名学校为:"<<l->shools[i].schoolname<<endl;;
}
}
void paixu3(sho l)
{
int i,j,k=1;
int temp=0;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].girl>l->shools[j].girl)
{
k++;
}
l->shools[j].girl1=k;
k=1;
}
for(j=1;j<n+1;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].girl1==j)
cout<<"女子第"<<j<<"名学校为:"<<l->shools[i].schoolname<<endl;
}
}
5.根据需要查询各项成绩排名
void chaxun1(sho l)
{
int j,a,b;
cout<<"请按各学校的代码进行成绩查询"<<endl;
for(j=0;j<n;j++)
cout<<j+1<<"."<<l->shools[j].schoolname;
cout<<endl;
cin>>a;
cout<<"请按各运动的项目的代码进行成成绩查询"<<endl;
for(j=0;j<m;j++)
cout<<j+1<<"."<<l->shools[0].sports[j].sportname;
cout<<endl;
cin>>b;
cout<<"该学校"<<l->shools[0].sports[b-1].sportname<<"项目分数为:"<<l->shools[a-1].sports[b-1].num;
cout<<endl;
}
void chaxun2(sho l)
{
int i,j,a,k=1;
cout<<"请按各运动的项目的代码进行成成绩查询"<<endl;
for(j=0;j<m;j++)
cout<<j+1<<"."<<l->shools[0].sports[j].sportname;
cout<<endl;
cin>>a;
for(j=0;j<n;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].sports[a-1].num>l->shools[j].sports[a-1].num)
{
k++;
}
l->shools[j].sports[a-1].s=k;
k=1;
}
for(j=1;j<n+1;j++)
{
for(i=0;i<n;i++)
if(l->shools[i].sports[a-1].s==j&&l->shools[i].sports[a-1].num>0)
cout<<l->shools[0].sports[a-1].sportname<<"第"<<j<<"名学校为:"<<l->shools[i].schoolname<<endl;
}
}
6.主函数及其他代码的算法
main()
{
sho l;int flog=1;
while(flog!=0)
{
cout<<"请选择您要执行的命令:"<<endl;
cout<<"1。赋值 2.求总 3.总分排序 4.男子项目排序 5。女子项目排序 6.学校某个项目查询";
cout<<"7.某项目排名情况查询 0.退出"<<endl;
cin>>flog;
switch(flog)
{
case 1:system("cls");l=fuzhi();break;
case 2:system("cls");sum(l);break;
case 3:system("cls");paixu1(l);break;
case 4:system("cls");paixu2(l);break;
case 5:system("cls");paixu3(l);break;
case 6:system("cls");chaxun1(l);break;
case 7:system("cls");chaxun2(l);break;
case 0:cout<<"谢谢使用"<<endl;break;
default:system("cls");cout<<"请重新选择"<<endl;
}
}
}
7.函数的调用关系图
Main
Fuzhi() sum(1) paixu1(l) paixu2(l) paixu3(l) chaxun1(l) chaxun2(l)
四.调试分析:
1.在定义学校及运动会项目的类型是直接使用数组去定义,设定了好几个数组,这样在使用的过程中显得非常麻烦,改善方法后运用线性表去将学校及各个运动项目定义为结构变量,结构变量可以作为数组元素,同时这些数组还可以成为结构类型的成员,并且结构变量和志向结构变量的指针都可以作为函数参数和返回值。这样在使用的过程中间少了很多不必要的麻烦。
2.由于学校的个数和运动项目的个数不是很多,所以在查找的选择上没有使用其他计较麻烦的查找方式而是直接使用比较简便的、针对查找对象较少的情况下使用的直接查找法
3.本程序的算法都比较合理,采用了线性顺序表和串的方式,尽也许的减少不必要的麻烦。模块的划分也十分的合理,根据题目的规定,将模块十分情绪的提成四个大的模块,由于数据对象并比较少,所以都是采用最简便最有效的方式。然后通过主函数直接调用这些函数已达成完毕所需要的命令。
4.算法的时空分析
1.由于学校的个数我定义为n个,运动项目的个数我定义为m个,所以在使用穿的操作strcopy时的复杂度是O(n),其他都为字符串数组元素的使用,比较简朴分明在求总的过程的复杂度为O(m*n),在总分排序过程中的时间复杂度为O(m*n2),男子项目和女子项目排序的时间复杂度为O(n2),学校某个项目查询的时间复杂度为O(n*m),某项目排名情况的复杂度为O(m*n2)。
2.本实验采用数据抽象的方式将程序分为三个层次结构:结构模块,串模块,主控模块,很亲系的将设计思绪反映出来,各模块的使用方便实现调试方便。
五.用户手册:
1. 本程序的运营环境为DOS操作系统,执行文献为ydhfstj.cpp。
2. 进入演示程序后,既显示用户界面:
请选择您要执行的命令:
1。赋值 2.求总 3.总分排序 4.男子项目排序 5。女子项目排序 6.学校某个项目查询7.某项目排名情况查询 0.退出
按规定输入你要执行的命令
3. 一方面进入“赋值”的命令,输入1+回车键,然后按照提醒输入所需要的数据值,结束符为回车键,当所有赋值都成功后,按回车键又进入上面的总界面。
4. 根据你所需要的规定可以进行以上的命令,根据命令所相应的数字进行操作,如要查找总分排序就输入“3”然后使用回车键为执行命令符;假如要退出就输入“0”+回车键就可以退出界面。
六.测试数据
测试数据和输出结果分别入下:
请选择您要执行的命令:
1。赋值 2.求总 3.总分排序 4.男子项目排序 5。女子项目排序 6.学校某个项目查询7.某项目排名情况查询 0.退出
1.赋值:
请输入1个学校的名字:东华
请输入1个学校的名字:上外
请输入1个学校的名字:外贸
请输入1个学校的名字:视觉
请输入1个学校的名字:工技大
请输入一个运动项目的名字:篮球
请输入一个运动项目的名字:游泳
请输入一个运动项目的名字:足球
请输入一个运动项目的名字:马拉松
输入篮球前五名的学校代码:
1
4
5
3
2
请输入游泳前三名的学校代码:
1
5
2
请输入足球前三名的学校代码:
1
4
3
请输入马拉松前三名的学校代码:
1
3
5
2.求总:
东华总分为17
上外总分为4
外贸总分为14
视觉总分为8
工技大总分为5
3.总分排序:
总分第1名学校为:东华
总分第2名学校为:外贸
总分第3名学校为:视觉
总分第4名学校为:工技大
总分第5名学校为:上外
4.男子项目排序:
男子第1名学校为:外贸
男子第2名学校为:视觉
男子第3名学校为:工技大
男子第4名学校为:东华
男子第5名学校为:上外
5.女子项目排序:
女子第1名学校为:东华
女子第2名学校为:外贸
女子第3名学校为:上外
女子第4名学校为:视觉
女子第5名学校为:工技大
6.学校某个项目的查询:
请按各学校代码进行查询:
1. 东华2.上外.3.外贸4.视觉5.工技大
1
请按各运动的项目的代码进行查询:
1. 篮球2.游泳3.足球4.马拉松
2
该学校的游泳项目的分数为:5
7.某项目排名情况查询:
请按葛云东的项目代码及逆行成绩查询
1. 篮球2.游泳3.足球4.马拉松
4
马拉松第1名学校为:东华
马拉松第2名学校为:外贸
马拉松第3名学校为:工技大
8.退出:
谢谢使用
Press any key to continue
七.附录
源程序文献名清单:
iostream.h
malloc.h
string.h
stdlib.h
展开阅读全文