东华大学 数据结构课程实验报告.docx
《东华大学 数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学 数据结构课程实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
![东华大学 数据结构课程实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/24/307ce702-faf6-4b5c-ba40-a469af2c94e5/307ce702-faf6-4b5c-ba40-a469af2c94e51.gif)
东华大学数据结构课程实验报告
数据结构课程设计报告
设计题目:
运动会分数统计
迷宫问题求解
学院:
信息科学与技术学院
年级专业:
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;iFuZhu[i]=i;//用辅助数组记住学校结点下标
for(i=0;i{
for(j=i+1;jif(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;iFuZhu[i]=i;
for(i=0;i{
for(j=i+1;jif(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;iFuZhu[i]=i;
for(i=0;i{
for(j=i+1;jif(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;ifor(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)