软件水平考试(中级)软件设计师下午(应用技术)试题模拟试卷12

0
收藏   分享
  • 卷面总分:75分
  • 试卷类型:模拟考试
  • 测试费用:免费
  • 答案解析:是
  • 练习次数:21次
  • 作答时间:150分钟
试卷简介
试卷预览
1

[说明]

 下面是一个Appkt程序,其功能是从3~100之间(包括3和100)每隔0.5秒显示一个新的数字,如果数字为素数,则显示为灰色,其他为绿色。

 程序运行结果如图4所示。

     import java. awt. *

     import java. applet. Applet

      < applet code = ex2_7, class width = 800 height = 400 >

      </applet >

public class ex2_7 extends Applet {

     public Color color2_7 = Color. black;

     private iht n2_7 = 3;

     public myPrime thPrime2_7;

     public void init( ) {

      thPrime2_7 = new myPrime(this);

  thPrime2_7, start( );

}

public void paint(Graphics g) {

 g, setColor( color2_7 );

 g. drawString( (1),50,50);

}

public int getlnt( ) {

 return n2_7;

}

public void setlnt (int i) {

 n2_7 = i;

}

}

class myPrime extends Thread I

ex2_7 obj2_7;

myPrime (ex2_7 o) {

 this. obj2_7 = o;

}

 public boolean isPrime(int n){

boolean bPrime = true;

iht i =2;

if((2))

 return false;

while( i < n - ]&&bPrime) {

 if((3))

   bPrime = false;

 i++;

}

return bPrime;

}

public void run( ) {

 int i;

 for (i = 3; (4);i++) {

   if (isPrime(i) )

    obj2 _7, color2_7 = Color, gray;

   else

    obj2_7, color2_7 = Color. green;

     (5);

    obj2_7, repaint( );

   try {

    sleep(S00);

    } catch (InterruptedException ie) {

   }

  }

} }

ex2_7, html

< HTML >

 < HEAD >

 <TITLE > ex2_7 </TITLE >

</HEAD >

< BODY >

<appletcode =" ex2_?, class" width =800 height =400 >

</applet >

</BODY >

</HTML >

1

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

[说明]

 ①为类Circle增加一个构造函数,该函数有一个参数,并在构造时将该参数值赋给成员 radius。将该函数实现为一个非内联函数,并且使用参数列表的方式将类成员赋值。

 ②为类Circle增加一个成员函数print(),使得可以输出有关圆的信息,比如下列程序

 Circle c;

 c. SetRadius(5);

 c. Print();

 将输出:The circle has radius of 5!

 ③完成友元函数void CompareR(Circle *c1,Circle *c2)的定义,在屏幕中输出c1与c2比较radius大小结果,要求使用if - else结构完成。

 输出结果如下:

  The circle has radus of 5 !

 The circle has radius of 10 !

 cl <c2

  源程序文件test7_3, cpp 清单如下:

    #include < iostream, h >

    class Circle {

    public:

      Circle( ) :radius(5) {}

       (1) 

      void SetRadius(int r) { radius = r; }

      int GetRadius() { return radius; }

    (2) 

      friend void CompareR(Circle * c1,Circle * c2);

    private:

      int radius;

   };

    void CompareR(Circle * c! ,Circle * c2)

   {

    (3) 

       cout << "c1 > c2" << endl;

     else

       if ( (c1 -> GetRadius( )) == (c2 -> GetRadius( )))

        tout < <"c1=c2' < < endl;

       else

     if ( (c1 -> GetRadius( )) < ( c2 -> GetRadius( )))

      cout <<"c1<c2" <<endl;

 void main( )

  Circle c1

  c1. SetRadius(5)

  c1. Print( )

  Circle c2(10);

  c2. Print( )

  CompareR(&c1 ,&c2);

}

1

阅读以下预备知识、函数说明和C代码,将应填入(n)处的字句写在对应栏内。

[预备知识]

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

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

#define MAXLEAFNUM 20

struct node {

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

int weight;      / * 当前结点的权值*/

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

int Ichild, rchild

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

} Ht[2 * MAXLEAFNUM];

  ②用'0'或'1'标识最优二叉树中分支的规则是:从一个结点进入其左(右)孩子结点,就用'0'('1')标识该分支(示例如图3所示)。

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

 【函数5.1说明】

 函数void LeafCode (int root, int n)的功能是:采用非递归方法,遍历最优二叉树的全部叶子结点,为所有的叶子结点构造前缀编码。其中形参root为最优二叉树的根结点下标;形参 n为叶子结点个数。

 在构造过程中,将Ht[p]. weight域用作被遍历结点的遍历状态标志。

 【函数5.1】

char * * Hc;

void LeafCode (int root, int n)

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

int i,p = root,cdlen =0;char code[20];

Hc=(char* * )malloc(.(n +]) *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(He[ p] ,code);

  }

  }

   else if (Ht[ pi, 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结束* /

}

  【函数5.2说明】

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

 【函数5.2】

  void Decode( char * buff, int root)

  Iint pre =root,p;

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

       p = root;

       while (p!=0){/*存在下标为p的结点*/

          pre=p;

          if((4))p=Ht[p].lchild; /*进入左子树*/

          else p = Ht[p]. rchild;     / *进入右子树*./

          buff ++;         / * 指向前缀编码序列的下一个字符* /

     }

     (5);

   printf("%c", Ht [ pre]. ch);

 }

}

1

阅读以下说明和流程图8-11,完成程序(n)处的语句写在对应栏内。

 [说明]

 对于数学上一个猜想:任何自然数平方的36倍等于两对孪生素数的和。初始的情形如下:

 12×36=(5+7)+(11+13)

 22×36=(29+31)+(41+43)

 32×36=(11+13)+(149+151)

 再往下,N取4,5,6,时,只要N不太大,也都可以找到N(上标)2×36等于两对孪生素数的和。但是当N是一个任意的正整数时,证明N2×36总是等于两对孪生素数的和,这还是一个目前尚未解决的问题。甚至当考察的数较大时,找出一组符合条件的两对孪生素数都是计算量相当大的工作。每尝试一次,都要作4次是否是素数的判断,要作许多次的尝试,才可能找到一组解。下面流程图设计了一种优化算法来对这个猜想进行验证。仔细阅读流程图8-11,完成程序部分。

[程序部分]

main ()

 {

int t, i, j, prime_index; is_p rime:

long n, p, p1, p2, p3, p4, s, s1;

long primes [ 16000 ];

for (n=1; n<98; ++n)

{

  t=0;

    s= n* n* 36;

  prime_index= 2;

  primes[0]=2; primes[1]=3;

  for (p=5: p<=s/2; p=p+2)

  {

    is_p rime= 1;

       for ( i=1;(1)++i)

       if ( p%primes [i] = = 0 )  is_p rime= 0;

       if ( is_p rime)

       {

        (2) 

       }

  }

 for ( i=1; (3)++i)

  {

  (4) 

      if ( p2=p1+ 2 )

        {

      s1=s- (p1+p2)

      p3=sl/2-1; p4=p3+2:

      for ( j=0; j<=prime_index-1; ++j )

         if ((5))

           {

             printf ( "%d* % d*36= (%d+ %d) + (%d+%d) \n", \ n,n, p1, p2, p3, p4 ) ;

                 ++t;

             }

         }

  }

if ( t! = 0 ) printf ("%d\n", t )

   else

printf ( "%d* %d*36=no so lution\n ", n, n ) ; }

}

}

1

阅读以下说明和流程图,从供选择的答案中选出应填入流程图(n)处的字句写在对应栏内。

  [说明]

 以下是某图像二元树存储与还原算法的主要思想描述。

 设一幅2n×2n的二值图像,以:“1”表示黑像素点,以“0”表示白像素点。图像二元树结构表示依赖于图像的二元分割,即交替在X轴方向和Y轴方向上分割。先进行水平分割,分成两个2n-1×2n图像子块,然后进行垂直分割,分成4个2n-1×2n-1的正方形块,如此分割,直到子块只含同一像素点为止。如图8-8为一“E”字的二值图像,对其进行二元分割,相应的二元树如图8-9所示。根据图像二元树的0叶结点和1叶结点的数目,删除多者,保留少者。如“E”字图像的二元树0叶结点较多,裁剪后如图8-10所示。

  

裁剪后图像二元树有4类结点,分别用二进制编码如下:

 ◆ 左右儿子都有的结点,编码为11;

 ◆ 仅有左儿子的结点,编码为10;

 ◆ 仅有右儿子的结点,编码为01;

 ◆ 叶结点,编码为00。

 存储时,先存储剩余叶结点的类型编码,二进制码00表示0叶结点,11表示1叶结点。再按层次顺序,自左至右存储裁剪后图像二元树各结点的编码。

 图像二元树的存储算法用C语言描述所定义的数据结构及函数如下:

 struct Node{                /*图像二元树结点*/

 street Node*Left;

 street Node*Righ t;

   char Pixel;

  }

 struct Node Queue[MaxLen];       /*队列*/

  InitQueue()              /*初始化队列Queue的函数; */

  EmptyQueue ()            /*判断队列Queue是否为空的数,若空返回1,否则返回0; */

  AddQueue(Item)            /*将Item加到队列Queue的数; */

  GetQueue()              /*取队列Queue第一个元素的函数; */

  PutCode(Code)            /*写2位二进制码Code到文件的函数*/

 还原算法是存储算法的逆过程,将文件中的二进制码序列转换成图像二元树。还原算法的数据结构与函数与存储算法的相同,还原算法新增了一个函数GetCode ()。

 GetCode()               /*从文件中读2位二进制码的函数*/

 [C程序]

 存储算法

 void Backup (char CutPixel,st ruct Node ImageTree)'/*Cu tP ixel=0表示裁剪0叶结点*/

  { InitQueue();

    AddQueue ( ImageTree ) ;

    PutCode ( 1-CutPixel ) ;

   While ( !EmptyQueue ( ) )

   { TreeNode= GetQueue ( ) ;

 if (TreeNode→Left==NULL)

  { PutCode (0) ;

  continue:

  }

  Tl= TreeNode→Left;

  Tr= TreeNode→R igh t;

 if ( Tl→Left= = NULL && Tl→Pixel= = CutPixel )

   L=0;

  else

  {

    (1);

   AddQueue ( Tl ) ;

  }

  if ( Tr→Left= = NULL && Tr→Pixel= = CutPixel )

    R=0;

  else

 {

   (2) 

  AddQueue (T) ;

  }

   (3) 

 }

  }

  还原算法

  void Restore ( struct Node *TreeRoot )

  { TreeRoot= ( strut Node*)malloc ( sizeof (struct Node)

  InitQueue ( );

  AddQueue ( TreeRoot ) ;

  CutPixel= 1- GetCode ( ) ;

  while ( ! EmptyQueue ( ) )

   { TrecNode= GetQueue ( Queue ) ;

    NodeCode= GetCode ( ) ;

    switch ( NodeCode )

     {

      case 0:

             TreeNode→Left = NULL ;

             TreeNode→Right= NULL

          &

1

阅读以下说明和图,回答问题1~问题3,将解答写在对应栏内。

 [说明]

 通行费征收计算机管理系统包括收费部门业务活动管理和固定资产管理两大功能。

 收费部门采取站(库)、队、收费员三级管理模式。站是一个基层收费单位,由几个征收队组成,收费员是队的基本组成部分。征收队设有队长,和跟班会计。员工配带工号才能上岗,并且需要进行口令验证才能使用本系统。站总票证员负责全站票据管理,各队跟班会计负责本队票据管理,收费员从过往车辆处收取通行费。该系统要求如下所述。

 (1)站总票证员的业务要求①总票员累计库初始化,生成上期结余。②从上级主管部门领票,登记总票员台账,即本期领入台账。③发票给跟斑会计,登记总票员台账和跟班会计台账。④接收跟班会计退回票据,登记总票员台账和跟班会计台账。⑤接收跟班会计票根,登记总票员台账和跟班会计台账,打印跟班会计核销单。⑥接收跟班会计向银行交款的回执,登记总票员台账和跟班会计台账,打印队报核表。

 (2)跟班会计的业务要求①从总票员处领票,接受领票单,登记征收队台账。②向收费员发票,登记征收队,收费员台账,打印收费员领票单。③接受收费员退回票据,登记征收队,收费员台账,打印收费员退票单。④接受收费员票款,即上交钱款,同时报核,登记征收队,收费员台账,打印收费员报核表。⑤接受收费员票根,登记征收队,收费员台账,打印收费员核销单。⑥跟班会计初始化,生成上期结余。⑦跟班会计向银行交款,领回交款回执。

 (3)收费员的业务要求①从跟班会计处领票,接受领票单,登记收费员台账。②向跟班会计交款,报核,登记收费员台账,领报核表。③向跟班会计退票,领取退票单,登记收费员台账。④向跟班会计交回票根,领取核销单,登记收费员台账。⑤向驾驶员收费,发票。

 (4)办公室的业务要求 登记固定资产出库,入库情况,发放劳保服装,登记人事档案;

 (5)财务室的业务要求 制作工资表,发放员工工资,负责票款的银行入账。

 固定资产管理软件主要管理固定资产库存情况,固定资产出库情况,通过改软件可以查询打印出、入库登记卡及固定资产清单等。

 固定资产定义:

 属性:编号、名称、购置日期、使用保管人、存放地点、价值。

 含义:记录固定资产基础信息。

 固定资产出、入库定义:

 属性:编号、操作日期、出库原因、批文号、出入标志。

 含义:记录固定资产出入库操作。

 操作:固定资产增加或出库时更新。

收费部门业务活动数据流图如图8-6所示,图中缺少了与“票根上缴”相关的数据流,请指出该数据流的起点和终点。