东华大学 数据结构课程实验报告.docx

上传人:b****6 文档编号:3622220 上传时间:2022-11-24 格式:DOCX 页数:27 大小:227.28KB
下载 相关 举报
东华大学 数据结构课程实验报告.docx_第1页
第1页 / 共27页
东华大学 数据结构课程实验报告.docx_第2页
第2页 / 共27页
东华大学 数据结构课程实验报告.docx_第3页
第3页 / 共27页
东华大学 数据结构课程实验报告.docx_第4页
第4页 / 共27页
东华大学 数据结构课程实验报告.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

东华大学 数据结构课程实验报告.docx

《东华大学 数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学 数据结构课程实验报告.docx(27页珍藏版)》请在冰豆网上搜索。

东华大学 数据结构课程实验报告.docx

东华大学数据结构课程实验报告

数据结构课程设计报告

 

设计题目:

运动会分数统计

迷宫问题求解

学院:

信息科学与技术学院

年级专业:

10级电气信息大类

学号:

100900905

学生姓名:

刘妍

指导老师:

孙韶媛

 

2012年1月

一、设计目的:

课题一运动会分数统计

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)可以按项目编号查询取得前三或前五名的学校。

课题二迷宫问题求解

问题描述:

迷宫问题是取自心理学的一个古典实验。

实验中,把一只老鼠从一个没有顶的大盒子的门放入,在盒中设置了许多墙,对行进的方向形成了多处阻挡。

盒子仅仅有一个出口,在出口处放置了一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。

重复对老鼠进行上述实验,看老鼠能在多久找到出口。

请设计一个算法实现迷宫问题求解。

 

二、总体设计:

1、运动会分数统计:

设计思路:

所需功能:

成绩输入/输出、查询结果、调用统计结果

输入数据:

学校编号、项目编号、取得的名次、哪些名次

采用结构体数据类型,利用冒泡法实现相应的排序;利用“switch”语句实现功能的选择;利用“for”语句实现各个方式的

数据输入。

详细设计:

voidinputinformation()信息输入模块,开始输入信息**

voidoutput()信息输出模块,选择按不同的方式输出信息**

voidinquiry()**查询模块,用来查询信息**

流程图:

源代码:

#include

#include

#definen2//学校数目

#definem1//男子项目数目

#definew1//女子项目数目

 

typedefstruct//typedef:

为一种数据类型定义新名字。

此数据类型为“自定义数据类型”

{

intprojectnum;//项目编号

intnumber;//项目取名次的数目,由用户定义3或5

intpic[5];//名次projectincompetition

intmark[5];//分数

}projectnode;//定义项目结点类型

typedefstruct

{

intschoolnum;//学校编号

intscore;//学校总分

intmscore;//男团体总分

intwscore;//女团体总分

projectnodec[m+w];//项目数组

}schoolnode;//定义学校结点类型

 

schoolnodeh[n];//定义一个学校结点数组

voidinputinformation()//**信息输入模块,开始输入信息**

{

inti,j,k,s;

for(i=0;i

{

h[i].score=0;

h[i].mscore=0;

h[i].wscore=0;

}//初始化各结点

for(i=0;i

{

do//输入学校信息

{

printf("####学校编号:

");

scanf("%d",&h[i].schoolnum);

}while(h[i].schoolnum>n||h[i].schoolnum<=0);

for(j=0;j

{

do

{

printf("####项目编号:

");

scanf("%d",&h[i].c[j].projectnum);

}while(h[i].c[j].projectnum>m+w||h[i].c[j].projectnum<=0);

do

{

printf("####取前3名or前5名:

");

scanf("%d",&h[i].c[j].number);

}while(h[i].c[j].number!

=3&&h[i].c[j].number!

=5);

printf("####获得几个名次:

");

scanf("%d",&k);//输入项目信息

for(s=0;s<5;s++)

h[i].c[j].pic[s]=0,h[i].c[j].mark[s]=0;//初始化排名和分数

for(s=0;s

{

printf("####名次:

");

scanf("%d",&h[i].c[j].pic[s]);//输入所获名次信息

//按取前三名还是取前五名分别记分、

if(h[i].c[j].number==3)//取前三名

switch(h[i].c[j].pic[s])//利用switch语句来输入名次所对应的分数

{

case0:

h[i].c[j].mark[s]=0;break;

case1:

h[i].c[j].mark[s]=5;break;

case2:

h[i].c[j].mark[s]=3;break;

case3:

h[i].c[j].mark[s]=2;break;

}

else//取前五名

switch(h[i].c[j].pic[s])

{

case0:

h[i].c[j].mark[s]=0;break;

case1:

h[i].c[j].mark[s]=7;break;

case2:

h[i].c[j].mark[s]=5;break;

case3:

h[i].c[j].mark[s]=3;break;

case4:

h[i].c[j].mark[s]=2;break;

case5:

h[i].c[j].mark[s]=1;break;

}

h[i].score=h[i].score+h[i].c[j].mark[s];//统计总分

if(j<=m-1)

h[i].mscore=h[i].mscore+h[i].c[j].mark[s];//是男子项目则记到男子分数里面去

else

h[i].wscore=h[i].wscore+h[i].c[j].mark[s];//其他的是女子项目则记到女子项目里面去

}

printf("\n");

}

}

}

 

voidoutput()//**信息输出模块,选择按不同的方式输出信息**

{

intchoice,i,j,k;

intFuZhu[n];//辅助数组FuZhun为学校个数在程序开头给出

charsign;

do

{

printf("################1.按学校编号输出.################\n");

printf("################2.按学校总分输出.################\n");

printf("################3.按男团总分输出.################\n");

printf("################4.按女团总分输出.################\n");

printf("\n\n################请选择编号####################\n\n:

");

scanf("%d",&choice);

switch(choice)

{

case1:

//按编号顺序输出

for(i=0;i

{

printf("\n\n####学校编号:

%d\n",h[i].schoolnum);

printf("####学校总分:

%d\n",h[i].score);

printf("####男团总分:

%d\n",h[i].mscore);

printf("####女团总分:

%d\n\n\n",h[i].wscore);}

break;

case2:

//按学校总分输出

for(i=0;i

FuZhu[i]=i;//用辅助数组记住学校结点下标

for(i=0;i

{

for(j=i+1;j

if(h[FuZhu[i]].score

{

k=FuZhu[i];

FuZhu[i]=FuZhu[j];

FuZhu[j]=k;

}

}//用冒泡排序方法,

for(i=0;i

{

printf("\n\n####学校编号:

%d\n",h[FuZhu[i]].schoolnum);

printf("####学校总分:

%d\n",h[FuZhu[i]].score);

printf("####男团总分:

%d\n",h[FuZhu[i]].mscore);

printf("####女团总分:

%d\n\n\n",h[FuZhu[i]].wscore);//按所记下标顺序输出

}

break;

case3:

//按男团总分输出

for(i=0;i

FuZhu[i]=i;

for(i=0;i

{

for(j=i+1;j

if(h[FuZhu[i]].score

{

k=FuZhu[i];

FuZhu[i]=FuZhu[j];

FuZhu[j]=k;

}

}

for(i=0;i

{

printf("\n\n####学校编号:

%d\n",h[FuZhu[i]].schoolnum);

printf("####学校总分:

%d\n",h[FuZhu[i]].score);

printf("####男团总分:

%d\n",h[FuZhu[i]].mscore);

printf("####女团总分:

%d\n\n\n",h[FuZhu[i]].wscore);

}

break;

case4:

//按女团总分输出

for(i=0;i

FuZhu[i]=i;

for(i=0;i

{

for(j=i+1;j

if(h[FuZhu[i]].score

{

k=FuZhu[i];

FuZhu[i]=FuZhu[j];

FuZhu[j]=k;

}

}

for(i=0;i

{

printf("\n\n####学校编号:

%d\n",h[FuZhu[i]].schoolnum);

printf("####学校总分:

%d\n",h[FuZhu[i]].score);

printf("####男团总分:

%d\n",h[FuZhu[i]].mscore);

printf("####女团总分:

%d\n\n\n",h[FuZhu[i]].wscore);

}

break;

}

printf("请选择1继续,0跳出\n");

scanf("%d",&sign);

}while(sign==1);//循环执行输出语句}

voidinquiry()//**查询模块,用来查询信息**inquiry:

查询

{

intchoice;

inti,j,k;

ints;

printf("\n####1:

按学校编号查询\n");

printf("\n####2:

按项目编号查询\n");

printf("\n\n####请选择查询方式:

");//提供两种查询方式

scanf("%d",&choice);

switch(choice)//利用switch语句自动按照所选的查询方式查询

{

case1:

do

{

printf("要查询的学校编号:

");

scanf("%d",&i);

if(i>n)

printf("错误:

这个学校没有参加此次运动会!

\n\n");

else

{

printf("要查询的项目编号:

");

scanf("%d",&j);

if(j>m+w||j==0)

printf("此次运动会没有这个项目\n\n\n");//项目编号超出范围

else

{

printf("这个项目取前%d名,该学校的成绩如下:

\n",h[0].c[j-1].number);

for(k=0;k<5;k++)

if(h[i-1].c[j-1].pic[k]!

=0)

printf("名次:

%d\n",h[i-1].c[j-1].pic[k]);//输出要查询学校项目的成绩}

}

printf("请选择1继续,0跳出\n");

scanf("%d",&s);

printf("\n\n\n");

}while(s==1);//循环执行输出语句

break;

case2:

do

{

printf("要查询的项目编号:

");

scanf("%d",&s);

if(s>m+w||s==0)

printf("此次运动会不包括这个项目.\n\n\n");//项目编号超出范围

else

{

printf("该项目取前%d名,取得名次的学校\n",h[0].c[s-1].number);

for(i=0;i

for(j=0;j<5;j++)

if(h[i].c[s-1].pic[j]!

=0)

printf("学校编号:

%d,名次:

%d\n",h[i].schoolnum,h[i].c[s-1].pic[j]);

//输出该项目取得名次学校的成绩

}

printf("\n\n\n继续1,跳出0\n");

scanf("%d",&i);

printf("\n\n\n");

}while(i==1);

break;//

}

}

//*****************主函数******************

voidmain()

{

intchoice;

printf("======================欢迎使用O(∩_∩)O~======================\n");

printf("\n\n##############运动会分数统计系统################\n");

printf("\n\n################1.输入信息####################\n");

printf("################2.输出信息####################\n");

printf("################3.查询信息####################\n");

printf("################4.退出系统####################\n\n\n");

printf("================================================\n\n");

printf("#######请选择要实现步骤的编号(请先确保信息已经输入!

):

\n\n");

scanf("%d",&choice);

switch(choice)

{

case1:

printf("输入信息:

\n");

inputinformation();

printf("信息已存入档案!

");

main();//输入完毕后回到主界面

case2:

printf("输出信息:

\n");

output();

main();

case3:

printf("查询信息:

\n");

inquiry();

main();

case4:

printf("退出系统!

谢谢使用!

\n\n\n");

default:

printf("输入错误!

\n");

}

}

调试与执行结果:

1欢迎界面

②输入信息

③输出信息

按学校编号输出信息

按学校总分输出

按男团、女团分数输出信息

查询信息

按学校查询

按项目查询

2、迷宫问题求解:

设计思路:

从给定的某一起点出发,向各个方向都有走动的可能,按照一定顺序进行。

判断该方向上是否可以走(可以走的条件:

不能重复,不是死路,不是迷宫外面)就走,然后记录。

若不能走就换下一个方向。

若各个方向都不可以走,说明到了死路,返回上一步走下一个方向。

如此反复每走一步就要检测是否达到指定坐标(即终点)若达到终点就输出。

若怎么走都达不到终点,即返回到最初起点也不能走了,说明无解。

对一个任意设定的迷宫求一条从入口到出口的道路,或得出无通道的结论。

详细设计:

设定一个二维数组maze[i][j]表示迷宫,其中1≤i≤M,1≤j≤N.。

数组元素值为0表示可以通过,数组元素1表示遇到墙壁。

假定统一入口为maze[1][1],出口为maze[M][N];移动方向为8个方向。

用数字5表示该通路。

流程图:

pop函数

draw函数

inimaze函数

 

path函数

push函数

 

源代码:

#include

#include

#defineM220

#defineN218

#definemaxlenM2

#defineTrue1

#defineFalse0

#defineNull0

typedefintStatus;

 

intM=M2-2,N=N2-2;//迷宫实际大小为M=M2-2,N=N2-2;两行外围

typedefstruct

{intx,y,dir;//xydirection

}elemtype;

typedefstruct

{elemtypestack[maxlen];

inttop;//栈顶

}sqMAZE;

structmoved

{intdx,dy;};//directionx;directiony;

voidinimaze(intmaze[M2][N2])

{inti,j,num;

for(i=1;i<=M;i++)

{for(j=1;j<=N;j++)

{num=(800*(i+j)+1500)%327;//用随便的一个函数的不能走的路(墙壁‘1’)其他的就是能走的

if((num<150)&&(i!

=M||j!

=N))

maze[i][j]=1;

else

maze[i][j]=0;

printf("%3d",maze[i][j]);

}//for

printf("\n");

}//for//输出迷宫(二维数组输出)

printf("\n");

 

}//inimaze

voidinimove(structmovedmove[])//可以移动的8个方向

{move[0].dx=0;move[0].dy=1;

move[1].dx=1;move[1].dy=1;

move[2].dx=1;move[2].dy=0;

move[3].dx=1;move[3].dy=-1;

move[4].dx=0;move[4].dy=-1;

move[5].dx=-1;move[5].dy=-1;

move[6].dx=-1;move[6].dy=0;

move[7].dx=-1;move[7].dy=1;

}//inimove

voidinistack(sqMAZE*s)

{s->top=-1;

}//栈MAZE的栈顶指针s

intpush(sqMAZE*s,elemtypex)//插入元素X为新的栈顶元素

{if(s->top==maxlen-1)//mazlen-1=M2-1已经大于迷宫长度M=M2

return(False);

else

{s->stack[++s->top]=x;//x为新的栈顶元素s++

return(True);

}//else

}//push

elemtypepop(sqMAZE*s)

{elemtypeelem;

if(s->top<0)

{elem.x=Null;

elem.y=Null;

elem.dir=Null;

return(elem);

}//if

else

{s->top--;

return(s->stack[s->top+1]);//s指向新的栈顶元素的上面s--x--(x-1)

}//else

}//pop

//*********开始走迷宫************

voidpath(intmaze[M2][N2],structmovedmove[],sqMAZE*s)

{inti,j,dir,x,y,f;

elemtypeelem;

i=1,j=1;dir=0;//起点x=1,y=1,第一个方向

maze[1][1]=-1;

do{x=i+move[dir].dx;

y=j+move[dir].dy;

if(maze[x][y]==0)//如果这步可以走,则记录下来,变成新的栈顶

{elem.x=i;

elem.y=j;

elem.dir=dir;

f=push(s,elem);

if(f==False)

printf("栈长度不够,没法继续走\n");

else{i=x;

j=y;

dir=0;

maze[x][y]=-1;}

}//if

else//如果这步不能走则换下一方向

if(dir<7)

dir++;

else

{elem=pop(s);

if(elem.x!

=Null)

{i=elem.x;

j=elem.y;

dir=elem.dir+1;

}//if

}//else

}while(!

((s->top==-1)&&(dir>=7)||(x==M)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1