1、 实验报告 (数据结构) 学院:信息科学与技术学院 班级: 姓名: 日期: 课题一 运动会分数统计 任务: 参加运动会有n个学校,学校编号为1……n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1~m,女子m+1~m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些项目取前五名或前三名由学生自己设定。(m<=20,n<=20) 功能要求: 1) 可以输入各个项目的前三名或前五名的成绩; 2) 能统计各学校总分; 3) 可以按学校编号、学校总分、男女
2、团体总分排序输出; 4) 可以按学校编号查询学校某个项目的情况; 5) 可以按项目编号查询取得前三或前五名的学校。 需求分析: 本演示程序中,用户可以对运动会的的成绩一不同的方式进行输入输出等操作。首先由用户输入运动会的成绩及相关的信息,然后程序会自动将输入的信息进行统计处理。用于测试程序的数据如下所示: 学校数据 校名 东华大学 上海交大 复旦大学 同济大学 华东师范大学 编号 1 2 3 4 5 项目数据: 项目编号 项目名称 项目编号 项目名称 1 男子100米 6 女子跳高 2 男子200米 7 女子跳远 3 男子400米
3、 8 女子铅球 4 男子跳高 9 女子100米 5 男子跳远 10 女子400米 概要设计: void Scanf(); 输入学校运动会成绩 void Grade(); 查询成绩 void Show(); 输出 void Rank(); 查询名次 void Show_sumscore();学校总分排序输出 void Show_boyscore();男团总分排序输出 void Show_girlscore();女团总分排序输出 void Show_num(); 学校编号排序输出 vo
4、id Menu(); 总菜单 程序图:主函数 开始
5、 输出学校、项目
6、 Init() Scanf() Menu() 结束 Scanf输入函数 开始 输入项目前三名或前五名的成绩 统计女生团体总分 统计男生团体总分 统计学校总分 开始 Init初始化函数 j<10 j=j+1 Sc
7、hool[i].event[j]=0
j=1
School[i].num=i+1
School[i].girlscore=0
School[i].boyscore=0
School[i].sumscore=0
InitList_Sq()
i 8、 N
结束
9、
10、
i=i+1
N
11、
Menu总菜单
开始
choose
12、
1 2 3
4 5 6 7
按项目编号查询前三名或前五名的学校
按学校编号查询项目情况
按女生团体总分排序输出
按学校编号排序输出
按男生团体总分排序输出
按学校总分排序输出
退出
13、
14、
15、
详细设计:
#include 16、 w=5; //女子项目个数
void Init();//初始化学校总分、男女团体总分
void Scanf();//输入学校运动会成绩
void Grade();//查询成绩
void Show();//输出
void Rank();//查询名次
void Show_sumscore();//学校总分排序输出
void Show_boyscore();//男团总分排序输出
void Show_girlscore();//女团总分排序输出
void Show_num();//学校编号排序输出
void Menu(); //总菜单
typedef s 17、truct{
char *event;
int num;
int sumscore;
int boyscore;
int girlscore;
int length;
int listsize; //当前分配的存储容量
}SqList;
// 初始化自定大小的线性表L
void InitList_Sq(SqList &L,int LIST_SIZE)
{
L.event=(char *)malloc(LIST_SIZE* sizeof(char));
18、
if(!L.event) exit (0);
L.length=0;
L.listsize=LIST_SIZE;
}
//初始化默认大小的线性表L
void InitList_Sq(SqList &L)
{
L.event=(char *)malloc(LIST_INIT_SIZE* sizeof(char));
if(!L.event)exit (0); //存储分配失败
L.length=0; //空表长度为0
L.listsize=LIST_INIT_SIZE; // 19、初始存储容量
}
void ShowList_Sq(SqList &L,int Lenth)
{
int i;
for (i=0;i 20、].boyscore=0;
School[i].girlscore=0;
School[i].num=i+1;
for(j=0;j 21、n");
for(i=0;i 22、
School[x-1].event[i]=b[j-1];
}
}
else
{
for(j=1;j<=3;j++)
{
do{
printf("项目%d 第%d名 学校编号:",i+1,j);
scanf("%d",&x);
printf("\n");
if(x>n||x<=0)
printf("输入错误, 23、请重新输入!\n");
}while(x>n||x<=0);
School[x-1].event[i]=a[j-1];
}
}
}
printf("\n");
//统计各校总分
for(i=0;i 24、
{
School[i].boyscore+=School[i].event[j];
}
}
//统计女子总分
for(i=0;i 25、canf("%d",&k);
if(k>n||k<=0)
printf("输入出错,请重新输入!\n\n");
}while(k>n||k<=0);
do
{
printf("\n请输入需要查询的项目编号:");
scanf("%d",&t);
printf("\n");
if(t>m+w||t<=0)
printf("输入出错,请重新输入!\n\n");
}while(t>m+w||t<=0);
int i=0;
while(School[i++].num!= 26、k);
printf("第%d个学校 项目%d 积分为:%d\n",k,t,School[--i].event[t-1]);
}
void Show()
{
for(int i=0;i 27、intf(" 学校总分为:%d\n",School[i].sumscore);
printf("\n\n");
}
}
void Rank()
{
int i,j,t;
do
{
printf("请输入需要查询的项目编号:");
scanf("%d",&t);
if(t>m+w||t<=0)
printf("输入出错,请重新输入!\n\n");
}while(t>m+w||t<=0);
for(i=n-1;i>=0;i--)
{
for(j=0 28、j 29、 {
printf("第%d个学校\n",School[i].num);
}
}
else if(t>m&&t<=m+w)
{
printf("项目%d 前三名:\n",t);
for(i=0;i<3;i++)
{
printf("第%d个学校\n",School[i].num);
}
}
else
printf("输入错误,请重新输入!\n");
}
void Show_sumscore()
{
int i,j;
for(i=n-1 30、i>=0;i--)
{
for(j=0;j 31、
}
void Show_boyscore()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;j 32、列:\n\n");
Show();
}
void Show_girlscore()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;j 33、 }
printf("按女子总分排列:\n\n");
Show();
}
void Show_num()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;jSchool[i].num)
{
SqList temp=School[i];
School[i]=School[j];
34、School[j]=temp;
}
printf("按学校编号排列:\n\n");
Show();
}
void Menu() //菜单函数
{
int choose;
while(1)
{
printf(" 运动会统计系统\n\n");
printf("*****************************************************************\n");
printf(" 35、 1、按学校编号排序输出\n");
printf(" 2、按学校总分排序输出\n");
printf(" 3、按男团总分排序输出\n");
printf(" 4、按女团总分排序输出\n");
printf(" 5、按学校编号查询学校某个项目的情况\n");
printf(" 6、按项目编号查询取得前三名或前五名的学校\n");
printf(" 36、 7、退出\n");
printf("*****************************************************************\n");
printf("\n\n -------------选择编号------------\n");
scanf("%d",&choose);
if(choose==1)Show_num();
if(choose==2)Show_sumscore();
if(choose==3)S 37、how_boyscore();
if(choose==4)Show_girlscore();
if(choose==5)Grade();
if(choose==6)Rank();
if(choose==7)break;
}
}
int main()
{ int i=0;
for(i=0;i<80;i++)
printf("*");
printf("\n 编号 运动会项目 \n");
38、printf(" 1 男子100米 \n");
printf(" 2 男子200米 \n");
printf(" 3 男子400米 \n");
printf(" 4 男子跳高 \n") 39、
printf(" 5 男子跳远 \n");
printf(" 6 女子跳高 \n");
printf(" 7 女子跳远 \n");
printf(" 8 女子铅球 40、 \n");
printf(" 9 女子100米 \n");
printf(" 10 女子400米 \n\n");
for(i=0;i<80;i++)
printf("*");
printf("\n");
printf(" 编号 参与运动会的学校 \n");
p 41、rintf(" 1 东华大学 \n");
printf(" 2 上海交大 \n");
printf(" 3 复旦大学 \n");
printf(" 4 同济大学 \n");
p 42、rintf(" 5 华东师范大学 \n\n");
for(i=0;i<80;i++)
printf("*");
printf("\n");
Init();
Scanf();
Menu();
return 0;
}
调试分析:
1,在编译过程中使用了结构体来存储航班和客户的相关信息,注意到使用结构体可以定义自己需要的类型,同时还可以对其成员进行各种操作,有效地解决了数据的建立和修改;
2,在编程时建立了文件,将自己输入的文件和系 43、统内部存入文档,有效地实现了大容量数据的操作;
3,运用菜单功能,是程序和实际生活中的情况更加接近,有利于程序的广泛利用;
4,在编程中学习到了编程的很多好的习惯,养成了添加注释的习惯。
5,注意编程的细节,如:printf输出语句后记得加上“;”等。
运行结果:
1、初始用户界面
2、用户首先输入在各个项目中各个学校获得的名次,系统自动统计后,得到如下的DPS界面:
其中项目1-5取前五名,6-10取前三名
3、输入选择编号
输入选择编号1,按学校编号排序输出:
输入选择编号2,按学校总分排序输出:
44、
输入选择编号3,按男团总分排序输出:
输入选择编号4,按女子团体总分输出:
选择编号5,按学校编号查询某个项目的情况:
选择编号6,按项目编号查询前三名或前五名的学校:
选择编号7,退出系统:
课题三 迷宫问题求解
问题描述:
迷宫问题是取自心理学的一个古典实验。实验中,把一只老鼠从一个没有顶的大盒子的门放入,在盒中设置了许多墙,对行进的方向形成了多处阻挡 45、盒子仅仅有一个出口,在出口处放置了一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。重复对老鼠进行上述实验,看老鼠能在多久找到出口。
请设计一个算法实现迷宫问题求解。
需求分析:
要求设计程序输出如下:
(1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;
(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。
(3)在屏幕上输出迷宫和通路;
源代码:
#include 46、t mark //定义迷宫内点的坐标类型
{
int x;
int y;
};
struct Element //链栈元素
{
int x,y; //x行,y列
int d; //d下一步的方向
};
typedef struct LStack //链栈
{
Element elem;
struct LStack *next;
}*PLStack;
/*************栈函数****************/
int InitStack(PLStack &S)//构造空栈
{
S=NULL;
ret 47、urn 1;
}
int StackEmpty(PLStack S)//判断栈是否为空
{
if(S==NULL)
return 1;
else
return 0;
}
int Push(PLStack &S, Element e)//压入新数据元素
{
PLStack p;
p=(PLStack)malloc(sizeof(LStack));
p->elem=e;
p->next=S;
S=p;
return 1;
}
int Pop(PLStack &S,Element &e) //栈顶元素出栈
{
48、
PLStack p;
if(!StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
free(p);
return 1;
}
else
return 0;
}
/***************求迷宫路径函数***********************/
void MazePath(struct mark start,struct mark end,int maze[M][N],int diradd[4][2])
{
int i,j,d;int a,b;
Element elem,e;
PL 49、Stack S1, S2;
InitStack(S1);
InitStack(S2);
maze[start.x][start.y]=2; //入口点作上标记
elem.x=start.x;
elem.y=start.y;
elem.d=-1; //开始为-1
Push(S1,elem);
while(!StackEmpty(S1)) //栈不为空 有路径可走
{
Pop(S1,elem);
i=elem.x;
j=elem.y;
d=elem.d+1; //下一个方向
while(d<4) //试探东南西北各个方向
{
a=i+ 50、diradd[d][0];
b=j+diradd[d][1];
if(a==end.x && b==end.y && maze[a][b]==0) //如果到了出口
{
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem);
elem.x=a;
elem.y=b;
elem.d=88; //方向输出为-1 判断是否到了出口
Push(S1,elem);
printf("\n0=东(右) 1=南(下) 2=西(左) 3=北(上) 88(byebye!)则为走出迷宫\n\n通路为:(行坐标,列坐标,方向)\n");






