一起答

软件水平考试(初级)程序员下午(应用技术)模拟试卷25

如果您发现本试卷没有包含本套题的全部小题,请尝试在页面顶部本站内搜索框搜索相关题目,一般都能找到。
  1. 阅读以下说明和Java代码,将解答写入对应栏内。

     【说明】

     下面程序的功能是找出所有三位数中,个、十、百位数字的立方和等于该数本身的三位数并显示。在程序的每条横线处填写一个适当的词或语句,使程序的功能完整。

      public (1) class cube_Root {

      public static void (2) main(String args[]) {

       System. out. println ("个、十、百位数字的立方和等于该数本身的三位数有:");

       for(int n=100;n<1000;n++)

        {

         int a,b,c;

         (3) 

         b=n/10%10;

         (4) 

        if((5))

         System.out.println(n);

        }

       }

     }

  2. 阅读以下说明和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;

     }

  3. 阅读以下应用说明及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

  4. 阅读以下函数说明和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;

    &

  5. 以下是与Visual Basic开发应用有关的5个问题。对每一个问题,请将解答填入对应栏内。

    1. 在Visual Basic中,工程文件、窗体文件和标准模块文件的扩展名是什么?请从下列选项中选择:

     prg、prj、exe、vbp、form、frm、win、fra、std、bas、vbs、vbm

     2.设某窗体上有一个命令按钮,其名称为CmdSave,运行时该按钮上显示有“保存(S(下划线))”字样的信息。为使热键Alt+S与该命令按钮相关联,应该对按钮CmdSave的Caption属性设置什么样的属性值?

     3.设某窗口内有一个图像框Imagel,以及两个命令按钮“放大”和“缩小”。单击“放大”按钮就会使该图像框的长和宽都放大10%;单击“缩小”按钮就会使该图像框的长和宽都缩小 10%(该图像框的左上角不动)。请分别写出这两个命令按钮的单击事件过程中的程序代码。

     4.为使某个单选按钮初始时默认被选中,在开发时应怎样做?

     5.若有语句Tmpval=MsgBox(“非法操作!”,vbOKCancel+vbCritical,“提示”),请简要描述程序运行时弹出的消息框的主要特征。

  6. 请阅读以下技术说明和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));

     }

  7. 以上C程序段中,采用了哪种算法对大学生得分进行排序?

  8. 阅读以下应用程序说明和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;

            

  9. 阅读以下应用程序说明和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(