数据结构课程设计论文运动会分数统计Word下载.docx
《数据结构课程设计论文运动会分数统计Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计论文运动会分数统计Word下载.docx(31页珍藏版)》请在冰豆网上搜索。
}program;
typedefstructschool//学校
//学校编号
//学校名称
programpro[Pro];
//学校的各个项目
intman_sum;
//该学校男子总分
intwomen_sum;
//该学校女子总分
}school;
voidinit_school(school*p)//初始化所有学校
voidinput_in1(school*p)//输入各个项目的前三名的成绩
voidinput_in2(school*p)//输入各个项目前五名的成绩
voidsum(school*p)//计算各学校总分=男子总分+女子总分
voidSearch_out3(school*p)//排序输出
intSearch_out4(schoolp[])/按学校编号查询学校某个项目的情况
intpro_sum(people*L,intstyle)//计算各链表中获奖人员的总分
voidSearch_out5(schoolp[],intstyle)//按项目编号查询取得前style名的学校
程序调用关系如下:
主程序模块
运用链表初始化运用链表输入模块链表排序输出模块查询模块
详细设计
#include"
stdafx.h"
string.h"
stdlib.h"
chara[5][20]={{"
东华大学"
},{"
上海交大"
复旦大学"
同济大学"
华东师范大学"
}};
charb[10][20]={{"
男子米"
男子跳高"
男子跳远"
女子跳高"
女子跳远"
女子铅球"
女子米"
intc1[3]={5,3,2};
//取前三名次得分
intc2[5]={7,5,3,2,1};
//取前五名得分
typedefstructpeople//参赛人员
//结构指针
programpro[10];
intn,m;
for(n=0;
n<
5;
n++)//建立循环,Sch个学校
{
p[n].i=n+1;
//初始化学校编号
strcpy(p[n].name,a[n]);
//初始化学校名字
for(m=0;
m<
10;
m++)//初始化每个学校的每个分数为
{
p[n].pro[m].i=m+1;
//初始化学校的项目编号
strcpy(p[n].pro[m].name,b[m]);
//初始化学校的项目名字
if(!
(p[n].pro[m].L=(people*)malloc(sizeof(people))))exit(0);
p[n].pro[m].L->
next=NULL;
}
p[n].women_sum=p[n].man_sum=0;
//初始化学校的男女总分
}
}
intn,d,m,j;
charf[20];
people*q,*s;
while
(1)
printf("
请输入你要输入的项目编号:
"
);
//选择要输入的项目编号
scanf("
%d"
&
n);
for(j=0;
j<
3;
j++)//为输入前三名的信息而建的循环
printf("
请输入项目%d.%s的第%d名的学校编码:
n,b[n-1],j+1);
d);
及获奖人的名字:
scanf("
%s"
f);
//把编号和获奖人的名字分别赋给d和f
m++)//根据输入的学校编号找到相应的学校
{
if(d==p[m].i)break;
}
if(m>
=5){printf("
输入的学校编码有误!
!
\n请重新输入!
\n"
j--;
else
{//在该校的该项目的链表中中插入数据
q=p[m].pro[n-1].L;
//q等于链表的表头指针
while(q->
next)//依次下去该链表,知道到链表尾
{
q=q->
next;
}
if(!
(s=(people*)malloc(sizeof(people))))exit(0);
//申请s结点
strcpy(s->
name,f);
//把获奖人的名字赋给s结点处
s->
i=j+1;
//s节点处的编号
next=q->
//修改指针来实现插入
q->
next=s;
if(n<
5)//依次把此次循环男子获得的分数加到该校男子项
{p[m].man_sum+=c1[j];
}
else{p[m].women_sum+=c1[j];
//依次把此次循环女子获得的分数加到该校女子项
是否继续输入项目数据.(y/n)"
//判定是否跳出
getchar();
//输入
if(getchar()=='
n'
)break;
//当为no时跳出循环
}
getchar();
printf("
按任意键(除去)回到主菜单....或按退出程序...."
if(getchar()=='
6'
)exit(0);
system("
cls"
//清屏
voidinput_in2(school*p)//输入各个项目的前五名的成绩
请输入你要输入的项目编号:
j++)
next)
5){p[m].man_sum+=c2[j];
else{p[m].women_sum+=c2[j];
intm;
各学校总分:
for(m=0;
m++)
%d.%s:
%d\n"
p[m].i,p[m].name,p[m].man_sum+p[m].women_sum);
//第m+1个学校的名字和总分
男子总分:
%d女子总分:
%d\n"
p[m].man_sum,p[m].women_sum);
voidSearch_out3(school*p)//按学校编号、学校总分、男女团体总分分别排序输出
intn,e,j=0,d[5];
按学校编号排序:
n++)
%d%s%d\n"
++j,p[n].name,p[n].man_sum+p[n].women_sum);
按学校总分排序:
n++)//找出各学校总分的顺序储存在数组d[Sch]中
e=0;
j++)
if((p[n].man_sum+p[n].women_sum)<
(p[j].man_sum+p[j].women_sum))e++;
//找到第n+1各学校总分小于几个学校
d[n]=e;
//标记哪个学校分数小于几个
n++)//根据数组d[Sch]中的值确定输出顺序
if(d[j]==n)printf("
%s%d\n"
p[j].name,p[j].man_sum+p[j].women_sum);
//根据上面小于几个数来输出信息,小于数越小越先输出
按学校男子总分排序:
n++)//找出各学校男子总分的顺序储存在数组d[Sch]中
if(p[n].man_sum<
p[j].man_sum)e++;
j++)//根据数组d[SCH]中的值确定输出顺序
p[j].name,p[j].man_sum);
按学校女子总分排序:
n++)//找出各学校女子总分的顺序储存在数组d[Sch]中
if(p[n].women_sum<
p[j].women_sum)e++;
p[j].name,p[j].women_sum);
intSearch_out4(schoolp[])//按学校编号查询学校某个项目的情况
intd,e;
people*q;
请输入学校编号和项目编号:
scanf("
%d%d"
d,&
e);
if(d<
0||d>
5){printf("
getchar();
printf("
system("
return0;
if(e<
0||e>
10){printf("
输入的项目编码有误!
}
%s%s:
p[d-1].name,p[d-1].pro[e-1].name);
if((q=p[d-1].pro[e-1].L->
next)==NULL){printf("
在该项目无获奖\n"
else{
while(q->
next)//找出该学校在该项目所有的获奖人员,并输出
%9s第%d名\n"
q->
name,q->
i);
q=q->
}
return1;
intpro_sum(people*L,intstyle)//计算各链表中所有获奖人员的总分
intsum=0;
people*p;
if((p=L->
next)==NULL)returnsum;
{if(style==3)
sum+=c1[p->
i];
if((p=p->
elseif(style==5)
sum+=c1[p->
inte,n,j,m,d[5];
请输入项目编号:
m);
n++)//找出各学校在该项目名次顺序储存在数组d[Sch]中
{
if(pro_sum(p[n].pro[m-1].L,style)<
pro_sum(p[j].pro[m-1].L,style))
e++;
m=0;
{
j++)//根据数组d[Sch]中的值确定输出顺序
if(d[j]==n){printf("
%s"
p[j].name);
m++;
if(m>
=3)break;
system("
voidmain()
{
intd,style,t=1;
schoola[5];
init_school(a);
\t运动会分数统计\n"
请输入比赛是取前几名:
style);
if(style!
=3)style=5;
while(t)
\t菜单\n"
\t1.输入各个项目的前%d名信息\n"
style);
\t2.统计各学校总分\n"
\t3.按学校编号、学校总分、男女团体总分排序输出\n"
\t4.按学校编号查询学校某个项目的情况\n"
\t5.按项目编号查询取得前%d的学校\n"
\t6.退出\n"
\t\n"
\t请输入所要操作的编号:
if(style==3)
switch(d)
case1:
input_in1(a);
break;
case2:
sum(a);
case3:
Search_out3(a);
case4:
Search_out4(a);
case5:
Search_out5(a,3);
case6:
t=0;
default:
代码错误!
exit(0);
input_in2(a);
Search_out5(a,5);
调试分析
1、本题中的难点是建立学校和项目表以及之间的相互访问等较为复杂也容易出错,后经仔细的分析及改善得到成功。
2、本题中的排序,本是用经典比较法来实现,但中间出现了逻辑上的错误后改进为用了把一个数据与其他数据进行比较,如小于几个数,然后输出时小于的数越小越先输出。
3、在某个学校的某个项目的排名中运用到了链表指针修改的问题,在运行过程出现了差错,主要是插入位置等的错误。
用户手册
(1)演示程序的运行环境为Windows8系统,MicrosoftVisualC++2005ExpressEdition中运行。
执行文件为:
运动会.exe
(2)进入演示程序后即显示DOS形式的界面:
(3)、根据选择比赛是取前几名可以进入相应的界面
(4)、进入相应界面接受其他命令后即执行相应功能。
测试结果
输入取前三名得到下面界面
输入取前五名得到下面界面
操作编号:
1
2
3
4
5
6
迷宫问题求解
任务
迷宫问题是取自心理学的一个古典实验。
实验中,把一只老鼠从一个没有顶的大盒子的门放入,在盒中设置了许多墙,对行进的方向形成了多处阻挡。
盒子仅仅有一个出口,在出口处放置了一块奶酪,吸引老鼠在迷宫中寻找道路以到达出口。
重复对老鼠进行上述实验,看老鼠能在多久找到出口。
请设计一个算法实现迷宫问题求解。
测试数据:
0表示可以行走的区域,1表示不可行走的区域。
入口
出口
该程序的实现需要用到栈,用栈来储存正确的步骤。
首先要建立一个迷宫,用数组来实现。
然后通过规定的放向依次探索,一步步找到正确的路径。
typedefstructStackElem
intx;
inty;
intf;
}StackElem;
//定义栈
typedefstruct
StackElem*base;
StackElem*top;
intStackSize;
}Stack;
//初始化栈
voidStackInit(Stack*s)
//向栈中添加元素
voidPush(Stack*s,StackEleme)
//获得栈顶元素
StackElemGetTop(Stack*s)
/删除栈顶元素
voidP