资源描述
实验报告
(数据结构)
学院:信息科学与技术学院
班级:
姓名:
日期:
课题一 运动会分数统计
任务:
参加运动会有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) 可以按学校编号、学校总分、男女团体总分排序输出;
4) 可以按学校编号查询学校某个项目的情况;
5) 可以按项目编号查询取得前三或前五名的学校。
需求分析:
本演示程序中,用户可以对运动会的的成绩一不同的方式进行输入输出等操作。首先由用户输入运动会的成绩及相关的信息,然后程序会自动将输入的信息进行统计处理。用于测试程序的数据如下所示:
学校数据
校名
东华大学
上海交大
复旦大学
同济大学
华东师范大学
编号
1
2
3
4
5
项目数据:
项目编号
项目名称
项目编号
项目名称
1
男子100米
6
女子跳高
2
男子200米
7
女子跳远
3
男子400米
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(); 学校编号排序输出
void Menu(); 总菜单
程序图:主函数
开始
输出学校、项目
Init()
Scanf()
Menu()
结束
Scanf输入函数
开始
输入项目前三名或前五名的成绩
统计女生团体总分
统计男生团体总分
统计学校总分
开始
Init初始化函数
j<10
j=j+1
School[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<n
i=0,j
Y
N
结束
i=i+1
N
Menu总菜单
开始
choose
1 2 3
4 5 6 7
按项目编号查询前三名或前五名的学校
按学校编号查询项目情况
按女生团体总分排序输出
按学校编号排序输出
按男生团体总分排序输出
按学校总分排序输出
退出
详细设计:
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
const int n=5; //参加运动会的学校个数
const int m=5; //男子项目个数
const int 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 struct{
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));
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; //初始存储容量
}
void ShowList_Sq(SqList &L,int Lenth)
{
int i;
for (i=0;i<Lenth;i++)
printf("项目%d 成绩:%d\n",i+1,L.event[i]);
}
SqList School[n];
void Init()
{
int i,j;
for(i=0;i<n;i++)
{
InitList_Sq(School[i],m+w);
School[i].sumscore=0;
School[i].boyscore=0;
School[i].girlscore=0;
School[i].num=i+1;
for(j=0;j<m+w;j++)
{
School[i].event[j]=0;
}
}
}
void Scanf()
{
int i,j,x;
int a[3]={5,3,2};
int b[5]={7,5,3,2,1};
int c[10],d[10];
printf("\n\n 输入各个项目的前三名或前五名的成绩\n\n\n");
for(i=0;i<m+w;i++)
{
if(i<m)
{
for(j=1;j<=5;j++)
{
do{
printf("项目%d 第%d名 学校编号:",i+1,j);
scanf("%d",&x);
printf("\n");
if(x>n||x<=0)
printf("输入错误,请重新输入!\n");
}while(x>n||x<=0);
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("输入错误,请重新输入!\n");
}while(x>n||x<=0);
School[x-1].event[i]=a[j-1];
}
}
}
printf("\n");
//统计各校总分
for(i=0;i<n;i++)
{
for(j=0;j<m+w;j++)
{
School[i].sumscore+=School[i].event[j];
}
}
//统计男子总分
for (i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
School[i].boyscore+=School[i].event[j];
}
}
//统计女子总分
for(i=0;i<n;i++)
{
for(j=m;j<m+w;j++)
{
School[i].girlscore+=School[i].event[j];
}
}
}
void Grade()
{
int k,t;
do
{
printf("\n请输入需要查询的学校编号:");
scanf("%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!=k);
printf("第%d个学校 项目%d 积分为:%d\n",k,t,School[--i].event[t-1]);
}
void Show()
{
for(int i=0;i<n;i++)
{
printf("第%d个学校:\n\n",i+1);
ShowList_Sq(School[i],m+w);
printf(" 男子总分为:%d\n",School[i].boyscore);
printf(" 女子总分为:%d\n",School[i].girlscore);
printf(" 学校总分为:%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;j<i;j++)
{
if(School[j].event[t-1]<School[i].event[t-1])
{
SqList temp=School[i];
School[i]=School[j];
School[j]=temp;
}
}
}//冒泡排序
if(t<=m)
{
printf("项目%d 前五名:\n",t);
for(i=0;i<5;i++)
{
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;i>=0;i--)
{
for(j=0;j<i;j++)
{
if(School[j].sumscore<School[i].sumscore)
{
SqList temp=School[i];
School[i]=School[j];
School[j]=temp;
}
}
}
printf("按学校总分排列:\n\n");
Show();
}
void Show_boyscore()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;j<i;j++)
if(School[j].boyscore<School[i].boyscore)
{
SqList temp=School[i];
School[i]=School[j];
School[j]=temp;
}
printf("按男子总分排列:\n\n");
Show();
}
void Show_girlscore()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;j<i;j++)
if(School[j].girlscore<School[i].girlscore)
{
SqList temp=School[i];
School[i]=School[j];
School[j]=temp;
}
printf("按女子总分排列:\n\n");
Show();
}
void Show_num()
{
int i,j;
for(i=n-1;i>=0;i--)
for(j=0;j<i;j++)
if(School[j].num>School[i].num)
{
SqList temp=School[i];
School[i]=School[j];
School[j]=temp;
}
printf("按学校编号排列:\n\n");
Show();
}
void Menu() //菜单函数
{
int choose;
while(1)
{
printf(" 运动会统计系统\n\n");
printf("*****************************************************************\n");
printf(" 1、按学校编号排序输出\n");
printf(" 2、按学校总分排序输出\n");
printf(" 3、按男团总分排序输出\n");
printf(" 4、按女团总分排序输出\n");
printf(" 5、按学校编号查询学校某个项目的情况\n");
printf(" 6、按项目编号查询取得前三名或前五名的学校\n");
printf(" 7、退出\n");
printf("*****************************************************************\n");
printf("\n\n -------------选择编号------------\n");
scanf("%d",&choose);
if(choose==1)Show_num();
if(choose==2)Show_sumscore();
if(choose==3)Show_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");
printf(" 1 男子100米 \n");
printf(" 2 男子200米 \n");
printf(" 3 男子400米 \n");
printf(" 4 男子跳高 \n");
printf(" 5 男子跳远 \n");
printf(" 6 女子跳高 \n");
printf(" 7 女子跳远 \n");
printf(" 8 女子铅球 \n");
printf(" 9 女子100米 \n");
printf(" 10 女子400米 \n\n");
for(i=0;i<80;i++)
printf("*");
printf("\n");
printf(" 编号 参与运动会的学校 \n");
printf(" 1 东华大学 \n");
printf(" 2 上海交大 \n");
printf(" 3 复旦大学 \n");
printf(" 4 同济大学 \n");
printf(" 5 华东师范大学 \n\n");
for(i=0;i<80;i++)
printf("*");
printf("\n");
Init();
Scanf();
Menu();
return 0;
}
调试分析:
1,在编译过程中使用了结构体来存储航班和客户的相关信息,注意到使用结构体可以定义自己需要的类型,同时还可以对其成员进行各种操作,有效地解决了数据的建立和修改;
2,在编程时建立了文件,将自己输入的文件和系统内部存入文档,有效地实现了大容量数据的操作;
3,运用菜单功能,是程序和实际生活中的情况更加接近,有利于程序的广泛利用;
4,在编程中学习到了编程的很多好的习惯,养成了添加注释的习惯。
5,注意编程的细节,如:printf输出语句后记得加上“;”等。
运行结果:
1、初始用户界面
2、用户首先输入在各个项目中各个学校获得的名次,系统自动统计后,得到如下的DPS界面:
其中项目1-5取前五名,6-10取前三名
3、输入选择编号
输入选择编号1,按学校编号排序输出:
输入选择编号2,按学校总分排序输出:
输入选择编号3,按男团总分排序输出:
输入选择编号4,按女子团体总分输出:
选择编号5,按学校编号查询某个项目的情况:
选择编号6,按项目编号查询前三名或前五名的学校:
选择编号7,退出系统:
课题三 迷宫问题求解
问题描述:
迷宫问题是取自心理学的一个古典实验。实验中,把一只老鼠从一个没有顶的大盒子的门放入,在盒中设置了许多墙,对行进的方向形成了多处阻挡。盒子仅仅有一个出口,在出口处放置了一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。重复对老鼠进行上述实验,看老鼠能在多久找到出口。
请设计一个算法实现迷宫问题求解。
需求分析:
要求设计程序输出如下:
(1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏幕上显示出来;
(2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。
(3)在屏幕上输出迷宫和通路;
源代码:
#include<stdio.h>
#include<stdlib.h>
#define M 100
#define N 100
struct 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;
return 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) //栈顶元素出栈
{
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;
PLStack 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+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");
展开阅读全文