回 帖 发 新 帖 刷新版面

主题:哈夫曼树的建立及运动会分数统计

这是我们的课程设计,10月12号要交,麻烦各位高手帮帮忙!!可以发到我邮箱

     recluse.2008@163.com ,也可以直接回帖,最好是发到邮箱,因为每次我都找不到自己的 

     帖了,真不好意思啊
     
     对编程还是很头痛啊,特别是时间那么紧[em10],如果高手愿意的话是否可以留下Q号,可

     以教我编程?

回复列表 (共3个回复)

沙发

运动会分数统计

一、    任务
参加运动会有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

我忘记发了

板凳

哈夫曼树的建立
一、功能
输入组成二叉树的各个叶子值和权值,建立最优二叉树,并输出最优二叉树的数组存储形式。

二、什么是最优二叉数
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 楼

#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); }
}
}
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册