主题:哈夫曼树的建立及运动会分数统计
recluse
[专家分:0] 发布于 2008-10-10 12:54:00
这是我们的课程设计,10月12号要交,麻烦各位高手帮帮忙!!可以发到我邮箱
recluse.2008@163.com ,也可以直接回帖,最好是发到邮箱,因为每次我都找不到自己的
帖了,真不好意思啊
对编程还是很头痛啊,特别是时间那么紧[em10],如果高手愿意的话是否可以留下Q号,可
以教我编程?
回复列表 (共3个回复)
沙发
recluse [专家分:0] 发布于 2008-10-10 15:59:00
运动会分数统计
一、 任务
参加运动会有n个学校,学校编号为1……n。比赛分成m个项目,项目编号为1……m。项目取前五名积分;积分分别为:7、5、3、2、1;(m<=20,n<=20)
功能要求:
1).可以输入各个项目的前五名的学校编号;
2).能统计各学校总分;
3).可以按学校编号输出、学校总分排序输出,输出内容包括学校编号,总分和名次。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称);各学校分数为整形。
界面要求:有合理的提示,根据提示,可以完成相关的功能要求。
二、 存储分析
由于学校个数、项目个数是确定的,并不会随时需要增加或减少,所以采用顺序存储结构较好,并且能随机存取。即采用数组作为存储结构。
学校个数为数组长度,每个数组元素必须包含如下信息:学校编号,项目1成绩,项目2成绩,……,项目m成绩,总分,名次。(方便完成功能1,2,4和3部分)
由于功能3要求能按学校总分排序输出,宜另外按总分顺序存储学校的总分信息。
综合前面分析,需要两个数组,数组1按学校编号顺序存放学校编号,项目1成绩,项目2成绩,……,项目m成绩,总分,名次。数组2按学校总分存放学校编号,总分,名次。
三、 程序结构安排
1、 输入各个项目的前五名的学校编号,填写数组1;
2、 计算数组1的学校总分;
3、 对数组1按总分排序,结果存放在数组2。填写数组2的名次。
4、 将数组2的名次信息填回数组1。
四、 输出
1、 按学校编号输出:即输出数组1相关信息;
2、 按学校总分排序:即输出数组2相关信息;
3、 按学校编号查询学校各个项目的情况:即输出数组1相应学校信息。
五、 举例
有10个学校,5个项目。
数组1:
数组下标 学校编号 项目1 项目2 项目3 项目4 项目5 总分 名次
0 1 7 3 2 12 3
1 2 1 7 2 10 4
2 3 5 3 8 6
3 4 5 1 7 3 16 1
4 5 1 1 7
5 6 2 7 9 5
6 7 5 2 5 1 13 2
7 8 3 2 5 10 4
8 9 1 1 7
9 10 3 7 10 4
数组2:
数组下标 学校编号 总分 名次
0 4 16 1
1 7 13 2
2 1 12 3
3 2 10 4
4 8 10 4
5 10 10 4
6 6 9 5
7 3 8 6
8 5 1 7
9 9 1 7
我忘记发了
板凳
recluse [专家分:0] 发布于 2008-10-10 16:01:00
哈夫曼树的建立
一、功能
输入组成二叉树的各个叶子值和权值,建立最优二叉树,并输出最优二叉树的数组存储形式。
二、什么是最优二叉数
n个带权叶子组成的所有二叉数中,带权路径长度最小的二叉树。(带权路径长度=所有叶子结点权值乘以其到根结点路径长度之和)
三、建立最优二叉数
简述:每次选择权值最小的两个叶子合并成一个新的叶子结点,新叶子结点权值为这两个叶子结点权值之和。
四、程序分析
由于叶子结点个数n已知,根据二叉树性质得知,整棵二叉树结点总数为(2n-1)个,故可建立长度为(2n-1)的数组。
数组每个元素为二叉树的一个结点,由5个域组成,所以应采用结构体类型,包括结点值,权值,左孩子,右孩子,双亲。
Struct tree1
{char lerves;
int weight;
int rch;
int lch;
int parent;
}tree[9];
五、例子及程序流程
1、 输入叶子个数及初始化。
如叶子结点个数为5,数组长度就为9。
2、 输入各个叶子的值、权值,并对数组初步赋值。
如各个叶子值分别为A、B、C、D、E,各个权值分别为18,12,10,7,11。此部分信息由键盘一边输入,一边对数组初步赋值,结果如下:
数组下标 叶子值 权值 左孩子 右孩子 双亲
0 A 18 0 0 0
1 B 12 0 0 0
2 C 10 0 0 0
3 D 7 0 0 0
4 E 11 0 0 0
5
6
7
8
3、 计算二叉树其余结点信息。
由于5个叶子结点,要合并4次。每次从还无双亲(无双亲代表还未合并过)的叶子结点中选择权值最小的两个叶子结点进行合并,新结点下标为这两个叶子的双亲,新结点的权值为这两个叶子权值之和,左孩子为最小结点下标,右孩子为次小结点下标,叶子值不需要,双亲为0。
如下为合并一次后的结果,如此循环4次即可:
数组下标 叶子值 权值 左孩子 右孩子 双亲
0 A 18 0 0 0
1 B 12 0 0 0
2 C 10 0 0 5
3 D 7 0 0 5
4 E 11 0 0 0
5 17 3 2 0
6
7
8
4、 输出二叉树(即输出数组)。
将二叉树按上表以表格形式在屏幕上输出即可。
3 楼
recluse [专家分:0] 发布于 2008-10-14 12:20:00
#include<stdio.h>
#include<string.h>
struct{
int sport[5];
int zf;
int mc;
}student1[10];
struct{
int snum;
int zf;
int mc;
}student2[10];
void main()
{
int point[5],i,j,temp,bj=1,temp1;
int k=0;
printf("input the sport point:\n");
for(i=0;i<5;i++){
printf("point%d:",i+1);
scanf("%d",&point[i]); }
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){
printf("Input Sport %d 's School Number ( Point is %d ) :\t",i+1,point[j]);
scanf("%d",&k);
student1[k-1].sport[i]=point[j];
}
}
for(i=0;i<10;i++)
{
for(j=0;j<5;j++)
student1[i].zf=student1[i].sport[j]+student1[i].zf;
student2[i].zf=student1[i].zf;
student2[i].snum=i+1;
}
for(i=0;i<9;i++)
{
k=1;
for(j=0;j<9-i;j++)
if (student2[j+1].zf>student2[j].zf) {
temp=student2[j].zf;
temp1=student2[j].snum;
student2[j].zf=student2[j+1].zf;
student2[j].snum=student2[j+1].snum;
student2[j+1].zf=temp;
student2[j+1].snum=temp1;
k=0;
}
if(k) break;
}
for(i=0;i<10;i++)
{
if(student2[i+1].zf==student2[i].zf) student2[i].mc=bj;
else student2[i].mc=bj++;
}
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
if(student2[i].snum==j+1) student1[j].mc=student2[i].mc;
}
printf("\t\t\t\tFORM 1\n\n");
printf("School Number:\tSport1:\tSport2:\tSport3:\tSport4:\tSport5:\tSum:\tResult:\n");
for(i=0;i<10;i++) {
printf(" %d\t ",i+1);
for(j=0;j<5;j++)
printf("%d\t ",student1[i].sport[j]);
printf("%d\t %d\n",student1[i].zf,student1[i].mc);
printf("\n\n");
}
printf("Press Any Butter\n\n");
getch();
printf("\t\t\tFORM 2\n\n");
printf("School Number:\tSum:\tResult:\n");
for(i=0;i<10;i++)
{
printf("\t%d\t %d\t %d\n",student2[i].snum,student2[i].zf,student2[i].mc);
}
printf("\n\nPress Any Butter\n\n");
getch();
printf("\n\n");
while(1)
{
printf("Input You Want To Find The School Number(1-10):\t");
scanf("%d",&k) ;
printf("\n\n");
for(i=0;i<10;i++){
if(k==i+1){
printf("School Number:\tSport1:\tSport2:\tSport3:\tSport4:\tSport5:\tSum:\tResult:\n");
printf(" %d\t ",k);
for(j=0;j<5;j++)
printf("%d\t ",student1[i].sport[j]);
printf("%d\t %d\n\n",student1[i].zf,student1[i].mc); }
}
}
}
我来回复