主观

阅读以下函数说明和C代码,将C程序中(1)~(5)空缺处的内容补充完整。

  【说明】

 对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。

结构数组Ht的类型定义如下:

 #define MAXLEAFNUM 20

 struct node{

   char ch;    /*扫当前节点表示的字符,对于非叶子节点,此域不用*/

   Int weight;  /*当前节点的权值*/

   int parent;  /*当前节点的父节点的下标,为0时表示无父节点*/

   int lchild, rchild;

     /*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/

 )Ht[2*MAXLEAFNUM];

 用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。

 若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。

 函数void LeafCode(int root,int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数void LeafCode(int root,int n)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。

 函数void Decode(char *buff,int root)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。

 【函数4.1】

 char **HC;

 void LeafCode(int root, int n)

 {  /*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/

    int I,p=root,cdlen=0;

    char code[20];

    Hc = (char **)malloc((n+1)*sizeof(char *));   /*申请字符指针数组*/

    For(i = 1;i<= p;++I)

      Ht [i]. weight = 0;     /*遍历最优二叉树时用做被遍历节点的状态标志* /

    While (p) {           /*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/

      If(Ht[p].weight == 0) {   /*向左*/

        Ht[p].weight = 1;

        If(Ht[p].lchild != 0) {

          p = Ht[p].lchild;

          code[cdlen++] = '0';

        }

        else if(Ht[p].rchild == 0) { /*若是叶子节点,则保存其前缀编码*/

          Hc[p] = (char *)malloc((cdlen+1)*sizeof(char));

          (1);

          strcpy (Hc [p],code);

        }

     }

     else if(Ht[p].weight == 1) { /*向右*/

       Ht [p].weight = 2;

       If(Ht[p].rchild != 0) {

         p = Ht [p].rchild;

         code[cdlen++] ='1';

       }

     }

     else {   /*Ht[p].weight == 2,回退/

       Ht [p].weight = 0;

       p =(2);

        (3);       /*退回父节点*/

     }

   } / *while .结束* /

 }

【函数4.2】

 void Decode(char *buff,int root)

 { int pre = root,p;

   while(*buff != '\0') {

     p = root;

&

参考答案
您可能感兴趣的试题

阅读以下说明和C++程序,将应填入(n)处的字句写在对应栏内。

 【说明】

 以下程序的功能是计算正方体、球体和圆柱体的表面积和体积并输出。

 程序由4个类组成:类cube、sphere和cylinder分别表示正方体、球体和圆柱体;抽象类 container为抽象类,提供了两个纯虚拟函数surface_area()和volum(),作为通用接口。

 【C++程序】

 #include<iostream.h>

 #define pi 3.1416

 class container{

 protected:

 double radius;

 public:

   container(double radius) {container::radius=radius;}

   virtual double surface_area()=0;

   virtual double velum()=0;

   };

 class cube:(1){   //定义正方体类

 public:

   cube(double radius):container(radius){};

   double surface_area () {return 6 * radius * radius;}

 double volum() {return radius * radius * radius;}

 };

 class sphere:(2){   //定义球体类

 public:

   sphere(double radius): container(radius){};

   double surface_area() { return (3);}

   double volum() {return pi * radius * radius * radius * 4/3;}

 };

 class cylinder:(4){   //定义圆柱体类

 double height;

 public:

   cylinder(double radius,double height):container(radius)

   {

     container::height=height;

   }

   double surface_are a () { return 2 * pi * radius * (height+radius); }

   double volum () {return (5);}

 };

 void main()

 {

   container * p;

   cube obj1 (5);

   sphere obj2(5);

   cylinder obj3(5,5);

   p=&obj1;

   cout<<“正方体表面积”(<<p->surface_area()<<end1;

   cont<<“正方体体积”<<p->volume()<<end1;

   p=&obj2;

   cout<<“球体表面积”<<p->surface_area()<<end1;

   cout<<“球体体积”<<p->volume()<<end1;

   p=&obj3;

   cout<<“球体表面积”<<p->surface_area()<<end1;

   cout<<“球体体积”<<p->volume()<<end1;

 }

阅读以下应用说明及Visual Basic部分程序代码,将应填入(n)处的字句写在对应栏内。

 【说明】

  本应用程序是一个小写数字转换成大写格式的转换器,其运行窗口如图5所示。

窗口中有两个标签(lblNumber和lblChinese)、两个文本框(txtNnmber和txtChinese)和一个命令按钮(cmdChange)。当单击按钮cmdChange时,将文本框txtNumber中数字转换成中文大写,并显示在文本框txtChinese中。例如,在文本框txtNumber输入0076845,单击cmdChange按钮,将在文本框txtChinese中显示“柒万陆仟捌佰肆拾伍”。

 程序中调用的函数CChinse(Strdigit As String)的功能是先删除字符串的所有前导0,再调用函数Change(Strdigit As String),将数字字符串Strdigit转换成中文大写格式。

 为了防止用户在文本框txtNumber输入非数字形式的字符,程序将以空字符代替所输入的非数字有形字符。

 【程序】

  Private Function Transfer(Strdigit As String)As String

 ′完成小写向大写的转换,这段代码省略

 End Function

 Private Function CChinese(Strdigit As String)As String

   Dim intLen,intCounter As Integer

   intLen = Len (Strdigit)

   If intLen>0 Then

     intcounter = 0

      Do      '过滤数字串Strdigit的前导0

       intcounter = intcounter + 1

     Loop Until Mid(Strdigit,(1))

     intLen =(2) 

     Strdigit =(3) (Strdigit,intLen)

     CChinese = Transfer(Strdigit)

   End If

 End Function

 Private Sub cmdChange_Click( )

   txtChinese.Text=CChinese((4))   '调用Cchinese函数

 End Sub

 Private Sub txtNumber_KeyPress(KeyAscii As Integer)

   Select Case KeyAscii  '根据输入字符的ASCII码的值进行判断

     Case KeyAscii<32  '保留输入的控制字符

     Case 48 To 57    '保留输入的数字字符

     Case Else      '其他情况以空字符代替

      (5)=0

   End Select

 End Sub

阅读以下函数说明和C代码,将C程序中(1)~(5)空缺处的内容补充完整。

  【说明】

 对给定的字符集合及相应的权值,采用哈夫曼算法构造最优二叉树,并用结构数组存储最优二叉树。例如,给定字符集合{a,b,c,d}及其权值2、7、4、5,可构造如图6-15所示的最优二叉树,以及相应的结构数组Ht(如表6-14所示,其中数组元素Ht[0]不用)。

结构数组Ht的类型定义如下:

 #define MAXLEAFNUM 20

 struct node{

   char ch;    /*扫当前节点表示的字符,对于非叶子节点,此域不用*/

   Int weight;  /*当前节点的权值*/

   int parent;  /*当前节点的父节点的下标,为0时表示无父节点*/

   int lchild, rchild;

     /*当前节点的左、右孩子节点的下标,为0时表示无对应的孩子节点*/

 )Ht[2*MAXLEAFNUM];

 用“0”或“广标识最优二叉树中分支的规则是:从一个节点进入其左(右)孩子节点,就用“0”(或“1”)标识该分支,如图6-15所示。

 若用上述规则标识最优二叉树的每条分支后,从根节点开始到叶子节点为止,按经过分支的次序将相应标识依次排列,可得到由“0”、“1”组成的一个序列,称此序列为该叶子节点的前缀编码。例如,图6-15所示的叶子节点a、b、c、d的前缀编码分别是110、0、111、10。

 函数void LeafCode(int root,int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子节点,为所有的叶子节点构造前缀编码。其中,形参root为最优二叉树的根节点下标;形参n为叶子节点个数。在函数void LeafCode(int root,int n)构造过程中,将Ht[p].weight域用做被遍历节点的遍历状态标志。

 函数void Decode(char *buff,int root)的功能是:将前缀编码序列翻译成叶子节点的字符序列,并输出。其中,形参root为最优二叉树的根节点下标;形参buff指向前缀编码序列。

 【函数4.1】

 char **HC;

 void LeafCode(int root, int n)

 {  /*为最优二叉树中的n个叶子节点构造前缀编码,root是树的根节点下标*/

    int I,p=root,cdlen=0;

    char code[20];

    Hc = (char **)malloc((n+1)*sizeof(char *));   /*申请字符指针数组*/

    For(i = 1;i<= p;++I)

      Ht [i]. weight = 0;     /*遍历最优二叉树时用做被遍历节点的状态标志* /

    While (p) {           /*以非递归方法遍历最优二叉树,求树中每个叶子节点的编码*/

      If(Ht[p].weight == 0) {   /*向左*/

        Ht[p].weight = 1;

        If(Ht[p].lchild != 0) {

          p = Ht[p].lchild;

          code[cdlen++] = '0';

        }

        else if(Ht[p].rchild == 0) { /*若是叶子节点,则保存其前缀编码*/

          Hc[p] = (char *)malloc((cdlen+1)*sizeof(char));

          (1);

          strcpy (Hc [p],code);

        }

     }

     else if(Ht[p].weight == 1) { /*向右*/

       Ht [p].weight = 2;

       If(Ht[p].rchild != 0) {

         p = Ht [p].rchild;

         code[cdlen++] ='1';

       }

     }

     else {   /*Ht[p].weight == 2,回退/

       Ht [p].weight = 0;

       p =(2);

        (3);       /*退回父节点*/

     }

   } / *while .结束* /

 }

【函数4.2】

 void Decode(char *buff,int root)

 { int pre = root,p;

   while(*buff != '\0') {

     p = root;

&

请阅读以下技术说明和C代码,将程序段中(1)~(5)空缺处的语句填写完整。

 【说明】

 著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。以下C程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。该程序中用1~4分别表示4种颜色。要着色的N个区域用0~-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域了相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i,所着颜色。

 【C程序】

 #include <stdio.h>

 #define N 10

 void output(int color[]) {         /*输出一种着色方案*/

   int i ;

   for ( i = 0 ; i < N ; i++ )

     printf( "%4d" , color[i] ) ;

   printf ("\n") ;

 }

 int back(int *ip ,int color[] ) {      /*回溯*/

   intc = 4 ;

   while ( c == 4 ) {

     if ( *ip <= 0 )

       return 0 ;

     -- (*ip) ;

     c =(1);

     color[*ip] =-1 ;

   }

   return c ;

 }

 /*检查区域i,对c种颜色的可用性*/

 int colorOk(int i , intc , int [] [N] ,int color[ ] ) {

   int j ;

   for (j = 0 ; j < i ; j++ )

     if ( (2) )

       return 0 ;

   return 1 ;

 }

 /*为区域i选一种可着色的颜色*/

 int select (int i ,int c ,int adj [] [N] ,int color[ ] ){

   int k ;

   for(k = c ; k <= 4 ; k++ )

     if( colorOK( (3) ))

       return k ;

   return 0 ;

 }

 int coloring(int adj [] [N]) {       /*寻找各种着色方案*/

   int color[N] , i , c , cnt ;

   for(i = 0 ; i < N ; i++)

     color[i] =-1 ;

   i = c = 0 ;

   cnt = 0 ;

   while(1) {

     if((c =(4) ) == 0 {

       c = back( &i , color);

       if( c == 0 )

         return cnt;

     }

     else {

        (5);

       i++ ;

       if i == N) {

         output(color);

         ++cnt ;

         c = back( &i , color ) ;

       }

       else  c = 0 ;

     }

   }

 }

 void main()(

   int adj[N] [N] =

      { {0,1,0,1,1,1,1,1,1,1},

       {1,0,1,1,0,1,1,1,1,0},

       {0,1,0,1,0,1,1,0,1,1},

       {1,1,1,0,1,1,0,0,1,1},

       {1,0,0,1,0,1,0,0,0,0},

       {1,1,1,1,1,0,1,0,0,1},

       {1,1,1,0,0,1,0,0,1,0},

       {1,1,0,0,0,0,0,0,1,1},

       {1,1,1,1,0,0,1,1,0,1},

       {1,0,1,1,0,1,0,1,1,0},

      } ;

   printf("共有%d组解.\n",coloring(adj));

 }

阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。

  【说明】

 以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。

 

 该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。

 该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。

 【C程序】

 #include<stdio.h>

 #define M 30

 #define NLEN 10

 typedef struct node {

     int cur_s;        /* 最近输入成绩的科目*/

     Char no[NLEN];

     int score;

     struct node *next;

 } NODE;

 int s[M], sp, ss, i, mark, order, C;

 FILE *fp; NODE *h, *U, *V, *p;

 Char fname[80], no[NLEN], ans;

 main()

 { for(h = NULL, sp = 0; ;)

   { printf("输入科目成绩文件名(输入aaaa表示强行结束)。 \n");

     while(1)

     { scanf("%s", fname);

       if (strcmp(fname, "aaaa") == 0)

         break;

       if ((fp = fopen(fname, "r")) == NULL)

          printf("不能打开文件%s, 请重新输入科目文件名。 \n", fname);

       else

         break;

     }

     if (strcmp(fname, "aaaa") == 0) break;

     fscanf(fp, "%d", &ss); /* 输入科目号 */s[sp]=s;

     for (i=0; s[i] ! = ss; 1++);

       if ( (1) )

       { printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");

         continue;

       }

       sp++;

       while (fscanf(fp, "%s%d", no, &mark) == 2)

       {  /* 在链表中寻找最近输入的学号 */

          for(v = h; v != NULL && strcmp(v-> no, no)<0; u=v, v= v-> next);

          if (v !=NULL && strcmp(v->no, nb) == 0)

          { /* 该生已有成绩 */

            if (V->cur_s != ss)

            { /* 该生的当前科目成绩是第一次输入 */

              v->score += mark; /* 累计总成绩 */

              v->cur_s = ss;

            } /* 同一科目成绩重复输入,后输入成绩被忽略 */

          }

          else

       {  p = (NODE *)malloc(sizeof(NODE)); /* 一位新的学生 */

          strcpy(p->no,no);

          p->score = mark;

          p->cur_s = ss;

          p-> next = v;

        

阅读以下应用程序说明和C程序,将C程序段中(1)~(6)空缺处的语句填写完整。

 【说明】

 某大学征询学生意见,从各学院预选的n(n≤60)位优秀大学生中,评选出“十佳大学生”。以下【C程序】对各位学生选票进行相关的统计、排序等处理。

 (1)各学院预选的优秀大学生按1,2,…顺序连续编号,每个编号用两个字符表示,即01,02,…。

 (2)所回收的选票按以下格式存于文件source中,每行字符串对应一张选票。其中,姓名占10个字符,学院名称占30个字符,大学生编号占20个字符。

 (3)对应名次的大学生编号可以有空缺,但必须用00表示。

 (4)若编号超出规定范围,或编号重复出现,按照废票处理。

 (5)按选票中所列“十佳大学生”顺序给出各名大学生的得分。评分标准如下:

   一 二 三 四 五 六 七 八 九 十

   15 12 9 7 6 5 4 3 2 1

 (6)按各位大学生得分数由高到低顺序排队,并按以下格式列出“十佳大学生”排行表。

   名次   大学生编号   合计得分   合计得票数

 若得分相同,则得票数多的在前;若得分和得票数都相同,则编号小的在前。

 以下【C程序】中所应用到的函数fopen、fclose和fgets都是I/O程序库中的函数。

 【C程序】

 #include <stdio. h>

 #define n 60

 long int tn[n], td[n], score[n+1][10], order[n];

 char s[80];

 int mark[]=(15,12,9,7,6,5,4,3,2,1);

 FILE *fp, *fopen();

 Main()

 { int c, g, k, I, j, b[10];

   long int e, d, t, tt, dd;

   char * p;

   for(i=0; i<=n; i++)

     for(j=0; j<10; j++)

       score[i][j]=0;

   fP=fopen("source", "r");    /*以读方式打开文件source*/

   p=fgets(s, 80, fp);  /*读fp所指文件的下一行字符串于s*/

   while(*p){

     g=l; k=0; p+=40;

       while(k<10){

         c=((*p++)-'0')*10+((*p++)-'0');

         b[k++]=c)

         if(c<=n){

           if(c)

           { i=0;

             While( (1) );

             If( (2) ){g=0; break;}

           }

           else{g=0; break;}

         }

           If(g)

             For(i=0; i<k; i++)

               If(b[i])

                 (3);

           p=fgets(s, 80, fP);

         }

         Fclose(fp);  /*关闭fp所指文件*/

         For(i=1; i<n; i++){

           For(t=0, d=0, j=0; j<10; j++){

             t +=(e=score[i][j]);

             d +=e * mark[j];

           }

           tn[i-1]=t; td[i-1]=d; order[i-1]=i;

         }

         For(i=0; i<n-1; i++){

           k=i;

           for(j=i+1; j<n; j++)

             if(

¥

订单号:

遇到问题请联系在线客服

订单号:

遇到问题请联系在线客服