东华大学 数据结构课程实验报告.docx
- 文档编号:3622220
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:27
- 大小:227.28KB
东华大学 数据结构课程实验报告.docx
《东华大学 数据结构课程实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学 数据结构课程实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
东华大学数据结构课程实验报告
数据结构课程设计报告
设计题目:
运动会分数统计
迷宫问题求解
学院:
信息科学与技术学院
年级专业:
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)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 东华大学 数据结构课程实验报告 东华 大学 数据结构 课程 实验 报告