数据结构实验报告.docx
- 文档编号:17295352
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:59
- 大小:149.65KB
数据结构实验报告.docx
《数据结构实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告.docx(59页珍藏版)》请在冰点文库上搜索。
数据结构实验报告
数据结构
实验一运动会分数统计
一、需求分析
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)数据存入文件并能随时查询
6)规定:
输入数据形式和范围:
可以输入学校的名称,运动项目的名称
输出形式:
有中文提示,各学校分数为整形
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
二、基本思想
本实验中,对不同的对象采取不同的存储结构,对参赛学校采取链式结构,而对于参赛运动员采取一个结构就可以了。
本程序中主要用到线性表的一些基本操作,将各学校信息,运动员信息,项目信息都构造成线性表。
具体功能通过主函数分别调用各函数实现。
参考本实验的功能要求,本程序分为七个模块:
主函数、信息录入函数、信息统计函数、信息查询函数,信息排序函数、存盘函数、读盘函数。
信息录入函数有包括学校信息录入函数(包括学校总数、学校名称等),竞赛项目录入函数(男子竞赛项目总数、女子竞赛项目总数、竞赛项目名称、取名次方法和各名次对应的分值)、比赛结果录入函数(各名次的学生信息等)。
信息统计不再结果中显示出来,为了信息查询和排序输出。
信息查询函数包括按学校编号查询、按学校名称查询、按项目编号查询三个子函数。
信息排序函数包括按男子总分排序函数、按女子总分排序函数、按团体总分排序函数。
三、详细设计
1.本程序中所用到的抽象数据类型和各操作函数说明如下:
/*单个学校信息描述*/
typedefstruct_SchoolInfo{
intSchoolNum;/*学校编号*/
charschoolName[MAXLENGTH];/*学校名称*/
}SchoolInfo,*pSchoolInfo;
/*全部参赛学校描述*/
typedefstruct_School{
SchoolInfoschInfoArray[MAX_N];
intnTotalNmOfSch;/*参赛学校总数*/
}School,*pSchool;
/*某一竞赛项目名次取法*/
typedefstruct_ScrInfo
{
inttotal;/*取前多少名*/
int*power;/*每一名次对应分值*/
}ScrInfo,*pScrInfo;
/*单个竞赛项目信息描述*/
typedefstruct_SportInfo{
intsportNum;/*项目编号*/
charsportName[MAXLENGTH];/*项目名称*/
SportTypesprtTyp;/*项目类型(男子、女子)*/
ScoreTypescrTyp;/*取名次类型(前5、前3、用户自定义)*/
ScrInfoscrInfo;/*名次取法纪录项*/
}SportInfo,*pSportInfo;
/*全部竞赛项目信息描述*/
typedefstruct_Sport{
SportInfosportInfoArray[MAX_M+MAX_W];
intnTotalNmOfMSprt;/*男子项目总数*/
intnTotalNmOfFSprt;/*女子项目总数*/
}Sport,*pSport;
/*比赛成绩记录*/
typedefstruct_Position{
intsportNum;/*竞赛项目编号*/
charname[MAXLENGTH];/*获得名次的运动员姓名*/
intscore;/*得分*/
intschoolNum;/*所属学校编号*/
struct_Position*ptrNext;
}Position,*pPosition;
/*函数声明*/
externintGetPower(int,int);
externvoidGetReport();
externBoolGetSchoolInfo();
externvoidGetScoreBySchool();
externchar*GetSportName(int);
externBoolSetFMSportTotalNum(int*,int);
externvoidSetPositionForAllSports();
externvoidSetPositionForOneSport(int);
externBoolSetSchoolInfo(int*);
externBoolSetSchoolTotalNum(int*);
externBoolSetScoreType(int);
externBoolSetSportInfo();
externvoidGetSportInfo();
externvoidGetList();
staticSchoolg_school;
staticSportg_sport;
pPositionptrHead,ptrThis,ptrNew;
2.各基本操作的实现
(1)输入比赛信息
本程序中n<=20,m<=20,w<=20.。
首先输入学校数目,男子项目和女子项目数。
然后将每个学校的名称输入,在每个项目结束时,将其类型符(区分取前五名还是前三名)输入,而项目的编号则按照输入项目的次序自动生成,并按名次顺序输入运动员姓名,学校编号。
在输入完成后,每个学校的结构体中有一个指针指向该校的运动员。
同时第个项目的结构体中也有获得该项目前三名(或前五名)的学校编号。
(2)统计总分
在输入完信息之后,每个学校的团体部分,男子总分和女子总分便可得出,此时只需将基依学校编号输出即可。
(3)排序
排序可按男子总分,女子总分和团体总分进行。
每个排序实现过程都相同,本程序中采用的是冒泡排序。
定义的数组a[20]中存储的是每个学校的编号,在排序过程中只需将得分第i的学校编号存储在a[i]中,输出时,按a[20]中存储的学校编号进行输出即可。
(4)信息的查找
查找时可以按学校编号和学校名称查找各个学校的情况。
也可以按项目编号查询这个项目前三名(或前五名)的运动员的情况。
由于学校个数和项目个数不是很大,查找时采用的是顺序查找。
(5)存盘
将目前所有的数据存储在一个文件中,文件名称在存储时由用户自己输入。
(6)读盘打开一个文件,读取里面的信息。
当文件不存在是,会提示文件不存在。
四、程序流程图
五、源程序代码
#ifndef__MAINFILE_H__
#define__MAINFILE_H__
#include"stdio.h"
#include"stdlib.h"
#defineMAXLENGTH20/*字符串最大长度*/
#defineMAX_N20/*最大参赛学校数目*/
#defineMAX_M30/*男子项目最大数目*/
#defineMAX_W20/*女子项目最大数目*/
#defineLENsizeof(Position)
#ifndefNULL
#defineNULL(void*)0
#endif/*NULL*/
intN,
M,
W;
typedefenum_Bool{_TRUE=1,_FALSE=0}Bool;
typedefenum_SportType{_MAN,_WOMAN}SportType;/*sporttype*/
typedefenum_ScoreType{_FIVE,_THREE,_CUSTOM}ScoreType;/*scoretype*/
/*单个学校信息描述*/
typedefstruct_SchoolInfo{
intSchoolNum;/*学校编号*/
charschoolName[MAXLENGTH];/*学校名称*/
}SchoolInfo,*pSchoolInfo;
/*全部参赛学校描述*/
typedefstruct_School{
SchoolInfoschInfoArray[MAX_N];
intnTotalNmOfSch;/*参赛学校总数*/
}School,*pSchool;
/*某一竞赛项目名次取法*/
typedefstruct_ScrInfo
{
inttotal;/*取前多少名*/
int*power;/*每一名次对应分值*/
}ScrInfo,*pScrInfo;
/*单个竞赛项目信息描述*/
typedefstruct_SportInfo{
intsportNum;/*项目编号*/
charsportName[MAXLENGTH];/*项目名称*/
SportTypesprtTyp;/*项目类型(男子、女子)*/
ScoreTypescrTyp;/*取名次类型(前5、前3、用户自定义)*/
ScrInfoscrInfo;/*名次取法纪录项*/
}SportInfo,*pSportInfo;
/*全部竞赛项目信息描述*/
typedefstruct_Sport{
SportInfosportInfoArray[MAX_M+MAX_W];
intnTotalNmOfMSprt;/*男子项目总数*/
intnTotalNmOfFSprt;/*女子项目总数*/
}Sport,*pSport;
/*比赛成绩记录*/
typedefstruct_Position{
intsportNum;/*竞赛项目编号*/
charname[MAXLENGTH];/*获得名次的运动员姓名*/
intscore;/*得分*/
intschoolNum;/*所属学校编号*/
struct_Position*ptrNext;
}Position,*pPosition;
/************************************************************************/
/*主程序入口*/
/************************************************************************/
voidsport()
{
charch;
Boolerr=_FALSE;
memset(&g_school,0,sizeof(School));
memset(&g_sport,0,sizeof(Sport));
printf("\n===========================================================");
printf("\n***********************************************************");
printf("\n**");
printf("\n*欢迎进入校际运动会分数统计系统*");
printf("\n**");
printf("\n***********************************************************");
printf("\n===========================================================");
printf("\n\n\n\n按“Q”键退出运行,\n其它任意键继续...");
ch=toupper(getch());
if(ch=='Q'){
exit(0);
}
/*设置参赛学校信息*/
if(SetSchoolInfo(&N)){
GetSchoolInfo();
}
else
{
printf("发生错误,程序将退出");
return;
}
printf("\n\n按任意健继续...");
getch();
system("cls");
/*设置竞赛项目信息*/
err=SetSportInfo();
/*打印竞赛项目信息*/
GetSportInfo();
/*填写竞赛结果信息*/
SetPositionForAllSports();
system("cls");
/*主菜单*/
while
(1){
printf("\n**************************************************");
printf("\n**");
printf("\n*键入'q'退出程序*");
printf("\n*键入's'查询学校成绩*");
printf("\n*键入'r'生成报表*");
printf("\n*键入'i'查看参赛学校*");
printf("\n*键入'p'查看竞赛项目*");
printf("\n*键入'c'刷新屏幕*");
printf("\n**");
printf("\n**************************************************");
printf("\n请输入您的选择:
");
ch=toupper(getch());
printf("\n");
system("cls");
switch(ch)
{
case'Q':
exit(0);
break;
case'R':
/*生成报表*/
GetReport();
break;
case'S':
/*打印成绩*/
GetScoreBySchool();
break;
case'I':
GetSchoolInfo();
break;
case'P':
GetSportInfo();
break;
case'C':
system("cls");
break;
default:
printf("\n请键入一个正确的选择");
}
}
return;
}
/************************************************************************/
/*设置竞赛项目总数*/
/************************************************************************/
BoolSetFMSportTotalNum(int*pnTotalNmOfFMSprt,inttype/*0:
男子;1:
女子*/)
{
if(pnTotalNmOfFMSprt==NULL){
return_FALSE;
}
system("cls");
printf("\n--------------------------");
if(type==0){/*男子*/
printf("\n请输入男子竞赛项目总数:
");
scanf("%d",pnTotalNmOfFMSprt);
if(*pnTotalNmOfFMSprt<=0||*pnTotalNmOfFMSprt>MAX_M){
printf("\n学校总数必须大于0小于%d",MAX_M);
return_FALSE;
}
else
return_TRUE;
}
else{/*女子*/
printf("\n请输入女子竞赛项目总数:
");
scanf("%d",pnTotalNmOfFMSprt);
if(*pnTotalNmOfFMSprt<=0||*pnTotalNmOfFMSprt>MAX_W){
printf("\n学校总数必须大于0小于%d",MAX_W);
return_FALSE;
}
else
return_TRUE;
}
}
/************************************************************************/
/*设置某项目名次的取法及每一名次的分值*/
/************************************************************************/
BoolSetScoreType(intn/*项目编号-1*/)
{
charch;
Boolret=_FALSE;
Boolerr=_FALSE;
inttotalPrv,i,power;
do{
system("cls");
printf("\n请选择编号为%d的竞赛项目取名次类型\n(0:
取前5名;1:
取前3名;2:
用户自定义):
",n+1);
ch=toupper(getch());
printf("\n");
switch(ch){
case'0':
/*取前5名*/
g_sport.sportInfoArray[n].scrTyp=_FIVE;
g_sport.sportInfoArray[n].scrInfo.total=5;
if((g_sport.sportInfoArray[n].scrInfo.power=(int*)malloc(sizeof(int)*5))==NULL){
printf("\nmemoryerr");
return_FALSE;
}
g_sport.sportInfoArray[n].scrInfo.power[0]=7;
g_sport.sportInfoArray[n].scrInfo.power[1]=5;
g_sport.sportInfoArray[n].scrInfo.power[2]=3;
g_sport.sportInfoArray[n].scrInfo.power[3]=2;
g_sport.sportInfoArray[n].scrInfo.power[4]=1;
ret=_TRUE;
break;
case'1':
/*取前3名*/
g_sport.sportInfoArray[n].scrTyp=_THREE;
g_sport.sportInfoArray[n].scrInfo.total=3;
if((g_sport.sportInfoArray[n].scrInfo.power=(int*)malloc(sizeof(int)*3))==NULL){
printf("\nmemoryerr");
return_FALSE;
}
g_sport.sportInfoArray[n].scrInfo.power[0]=5;
g_sport.sportInfoArray[n].scrInfo.power[1]=3;
g_sport.sportInfoArray[n].scrInfo.power[2]=2;
ret=_TRUE;
break;
case'2':
/*用户自定义类型*/
g_sport.sportInfoArray[n].scrTyp=_CUSTOM;
do{
printf("\n请输入本项目取前多少名:
");
scanf("%d",&totalPrv);
if(totalPrv<=0){
printf("\n输入有误。
只能大于0");
}
else
err=_TRUE;
}while(err==_FALSE);
g_sport.sportInfoArray[n].scrInfo.total=totalPrv;
if((g_sport.sportInfoArray[n].scrInfo.power=(int*)malloc(sizeof(int)*totalPrv))==NULL){
printf("\nmemoryerr");
return_FALSE;
}
for(i=0;i err=_FALSE; do{ printf("\n请输入该项目第%d名的分值: ",i+1); scanf("%d",&power); if(power<=0){ printf("\n输入有误。 只能大于0"); } else err=_TRUE; }while(err==_FALSE); g_sport.sportInfoArray[n].scrInfo.power[i]=power; } ret=_TRUE; break; default: /*错误的输入*/ printf("\n错误的选择! "); ret=_FALSE; } }while(ret==_FALSE); returnret; } /************************************************************************/ /*设置竞赛项目信息*/ /************************************************************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告