2004年上半年软件设计师(高级程序员)下午试题

试题至试题四是必答题

试题
  阅读下列说明和数据流图,回答问题1至问题4,将解答填入答题纸的对应栏内。
[
说明]
  某基于微处理器的住宅安全系统,使用传感器(如红外探头、摄像头等)来检测各种意外情况,如非法进入、火警、水灾等。
(此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)
  房主可以在安装该系统时配置安全监控设备(如传感器、显示器、报警器等),也可以在系统运行时修改配置,通过录像机和电视机监控与系统连接的所有传感器,并通过控制面板上的键盘与系统进行信息交互。在安装过程中,系统给每个传感器赋予一个编号(id)和类型,并设置房主密码以启动和关闭系统,设置传感器事件发生时应自动拨出的电话号码。当系统检测到一个传感器事件时,就激活警报,拨出预置的电话号
码,并报告关于位置和检测到的事件的性质等信息。

[数据流图1-3] (此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)

加工4的细化图

[问题1]
  数据流图1-1(住宅安全系统顶层图)中的AB分别是什么?
[
问题2]
  数据流图1-2(住宅安全系统第0DFD图)中的数据存储配置信息会影响图中的哪些加工
[
问题3]
  将数据流图1—3(加工4的细化图)中的数据流补充完整,并指明加工名称、数据流的方向(输入/输出)和数据流名称.
[
问题4]
  请说明逻辑数据流图(LogicalDataFlowDiagram)和物理数据流图(PhysicalData Flow Diagram)之间的主要差别。

试题二
  阅读下列说明和算法,回答问题1和问题2,将解答填入答题纸的对应栏内。
[
说明]
  算法2-1是用来检查文本文件中的圆括号是否匹配。若文件中存在圆括号没有对应的左括号或者右括号,则给出相应的提示信息,如下所示:
(此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)

文件

提示信息

(1+2)

 

abc)

缺少对应左括号:第2行,第4

((def)gx))

缺少对应左括号:第3行,第10

(((h)

 

ij)(k

 

(1ml)

缺少对应右括号:第5行,第4列; 第4行,第1

在算法2-1中,stack为一整数。算法中各函数的说明如下表所示:

函数名

函数功能

push(int i)

将整数i压入stack中。

pop()

stack顶元素出

empty()

判断stack是否为空.若为空,函数返回1,否则函数返回0

nextch()

读取文本文件中的下一个字符,并返回该字符的ASCII值,将字符所在的行号以及字 符在行中的位置分别存储到变量rowcol中,若遇到文件结束符,则将变量EOF 置为true

kind(charch)

判断字符ch是左括号还是右括号,若是左括号,函数返回1,若是右括号,函数返回2, 若两者都不是,函数返回0

[算法2-1]
  将stack置空,置EOFfalse
  ch←nextch()
  while(not EOF)
   k←kind(ch)
   if (k ==__(1)__)
    push(__(2)__) push(__(3)__)
   elseif( k ==__(4)__)
    if(not empty())
     pop()pop()
    else
     显示错误信息(缺少对应左括号或右括号)
     显示行号row;显示列号col
    endif
   endif
   ch←nextch()
  endwhile
  if(not empty())
   显示错误信息(缺少对应左括号或右括号)
   while(not empty())
    row←pop() col←pop()
    显示行号row;显示列号col
   endwhile
  endif
  为了识别更多种类的括号,对算法2-1加以改进后得到算法2-2。算法2-2能够识别圆括号,方括号和花括号(不同类型的括号不能互相匹配)。改进后,函数kind(charch)的参数及其对应的返回值如下表所示:

ch

(

)

{

}

[

]

其它

返回值

1

2

3

4

5

6

0

[算法2-2] (此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)
  将stack置空,置EOFfalse
  ch←nextch()
   while(not EOF)
   k←kind(ch)
   if(k > 0)
    if(判断条件1)
     push(__(5)__)push(__(6)__)push(__(7)__)
    elseif( 判断条件2 and 判断条件3 )
     pop() pop() pop()
    else
     显示错误信息(缺少对应左括号或右括号)
     显示行号row;显示列号col
    endif
   endif
   ch←nextch()
  endwhile
  if(not empty())
   显示错误信息(缺少对应左括号或右括号)
   while(not empty())
    pop()row←pop()col←pop()
    显示行号row;显示列号col
   endwhile
  endif
[
问题1
  请将[算法2-1][算法2-2](1)(7)处补充完整。
[
问题2]
  请从下面的选项中选择相应的判断逻辑填补[算法2-2]中的判断条件广至判断条件3”。注意,若判断条件2”的逻辑判断结果为假,就无需对判断条件3”进行判断。
  (a)字符是括号 (b)字符是左括号 (c)字符是右括号 (d)空 (e)不空
  (f)顶元素表示的是与当前字符匹配的左括号
  (g)顶元素表示的是与当前字符匹配的右括号

试题三
  阅读下列说明以及图3-1和图3-2,回答问题1、问题2和问题3,将解答填入答题纸的对应栏内。
[
说明]
  某电话公司决定开发一个管理所有客户信息的交互式网络系统。系统的功能如下:
  1.浏览客户信息:任何使用Internet的网络用户都可以浏览电话公司所有的客户信息(包括姓名、住址、电话号码等)
 
 2.登录:电话公司授予每个客户一个帐号。拥有授权帐号的客户,可以使用系统提供的页面设置个人密码,并使用该帐号和密码向系统注册。
  3.修改个.人信息:客户向系统注册后,可以发送电子邮件或者使用系统提供的页面,对个人信息进行修改。
  4.删除客户信息:只有公司的管理人员才能删除不再接受公司服务的客户的信息。
  系统采用面向对象方法进行开发,在开发过程中认定出的类如下表所示:

编号

类名

描述

1

InternetClient

网络用户

2

CustomerList

客户信息表,记录公司所有客户的信息

3

Customer

客户信息,记录单个客户的信息

4

CompanyCustomer

公司客户

5

InternalClient

公司的管理人员

[3-1]  

[问题1]
  在需求分析阶段,采用UML的用例图(use case diagram)描述系统功能需求,如图3-1所示。请指出图中的ABCD分别是哪个用例? (此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)
[
问题2]
  在 UML 中,重复度(Multiplicity)定义了某个类的一个实例可以与另一个类的多少个实例相关联。通常把它写成一个表示取值范围的表达式或者一个具体的值。例如图 3-2 中的类 InternetClient CustomerListInternetClient 端的“0..*”表示:一个 Custo~erList 的实例可以与 0 或多个 InternetClient 的实例相关联;CustomerList 端的1”表示:一个InternetClient的实例只能与一个CustomerList的实例相关。
  请指出图3-2(1)(4)处的重复度分别为多少?
[
问题3]
  类通常不会单独存在,因此当对系统建模时,不仅要识别出类,还必须对类之间的相互关系建模。在面向对象建模中,提供了四种关系:依赖(dependency)、概括(generalization)、关联(aassociation)和聚集(aggregation)。请分别说明这四种关系的含义,并说明关联和聚集之间的主要区别。

试题四
  在COMET型计算机上可以使用试卷上所附的CASL汇编语言,阅读程序说明和CASL程序,把应填入__(n)__处的字句写在答卷的对应栏内。
[
程序4说明
  本程序将16位无符号二进制数转换为5位十进制数,转换结果用ASCII码表示,并从高位至低位依次存放在首地址为BTASC的连续5个内存单元中。待转换的16位无符号二进制数存放在DATA内存单元中。
[
程序4]
     START
 PROGBC LD  GRODATA
     LEA  GR10
     LEA  GR348
 LOOP1  CPL  GROWDTGR1
     JPZ  LOOP2
     ST  GR3BTASCGR1
     LEA  GR11GR1
     LEA  GR2-4GR1
     JNZ  LOOP1
     __(1)__
 LOOP2  LEA  GR248
 LOOP3  CPL  GROWDTGR1
     JMI  NEXT
     __(2)__
     LEA  GR21GR2
     JMP LOOP3
 NEXT  __(3)__
     LEA  GR11GR1
     LEA  GR2-4GR1
     JNZ  LOOP2
 LAST  __(4)__         ;处理个位数
     __(5)__
     EXIT
 C48   DC  48
 WDT   DC  10000
     DC  1000
     DC  100
     DC  10
 BTASC  DS  5
 DATA  DC  #FA59H
     END

  从下列的2道试题(试题五至试题六)中任选1道解答。
如果解答的试题数超过1道,则题号小的1道解答有效。


试题五
  阅读下列函数说明和C函数,将应填入__(n)__处的字句写在答题纸的对应栏内。
[
函数5说明]
  函数DeleteNode(Bitree*rinte)的功能是:在树根结点指针为r的二叉查找(排序)树上删除键值为e的结点,若删除成功,则函数返回0,否则函数返回-1二叉查找树结点的类型定义为:
typedef struct Tnode{
  int data            /*结点的键值*/
  struct Tnode *Lchild*Rchiid; /*指向左、右子树的指针*/
}*Bitree

  在二叉查找树上删除一个结点时,要考虑三种情况:
  若待删除的结点p是叶子结点,则直接删除该结点;
  若待删除的结点p只有个子结点,则将这个子结点与待删除结点的父结点直接连接,然后删除结点;
  若待删除的结点p有两个子结点,则在其左子树上,用中序遍历寻找关键值最大的结点s,用结点s的值代替结点p的值,然后删除结点s,结点s必属于上述情况之一。
[
函数5]
int DeleteNode(Bitree *r
int e) {
 Bitree p*r pp S C
 while(__(1)__ ){       /*从树根结点出发查找键值为e的结点*/
  pp=p
  if (e <p->data) p = p->Lchild
  else p = p->Rchild
 }
 if(!p) return -1;       /*查找失败*/
 if (p->Lchiid && p->Rchild){  /*处理情况③*/
 s = __(2)__ pp = p
 while(__(3)__) { pp = ss = s->Rchild)
  p->data = S->data p = s
 }
 /* 处理情况②* /
 if(__(4)__) c = p->Lchild
 else c=p->Rchild
 if (p == *r) *r = C
 else if (__(5)__) pp->Lchild = c
  else pp->RchildC
 free(p)
 return 0

试题六(此括号内不是试题部分。欢迎访问软件考试网www.hbsoft.net)
  阅读下列说明和C++程序,将应填入__(n)__处的字句写在答题纸的对应栏内.
[
程序6说明]
  C++语言本身不提供对数组下标越界的判断.为了解决这一问题,在程序6中定义了相应的类模板,使得对于任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息.
[
程序6]
#include <iostream.h>
template <class T> class Array

template <Class T> class ArrayBody {
 friend__(1)__
 T* tpBody
 int iRowsiColumnsiCurrentRow
 ArrayBody(int iRszint iCsz){
  tpBody = __(2)__
  iRows = iRsziColumns = iCsziCurrentRow = -1
}
public

 T& operator[](int j){
  bool row_errorcolumn_error
  row_error = column_error =false
  try {
   ifiCurrentRow < 0 || iCurrentRow >= iRows
    row_error = true
   ifj<0 || j> iColumns
    column_error = true
   ifrow_error == true || column_ error == true)
    __(3)__
  }
  catch(char){
   ifrow_error == true
    cerr << "行下标越界[" << iCurrentRow << "]"
   ifcolumn_error = true
    cerr << "列下标越界[" << j << "]"
   cout << "\n"
  }
  return tpBody[iCurrentRow * iColumns + j]
 }
 ~Arraygody(){delete[]tpBody}
}

template <class T> class Array {
 ArrayBody<T> tBody
 public
  ArrayBody<T> & operator[](int i) {
   __(4)__
   return tBody
  }
 Array(int iRszint iCsz):__(5)__ { }
 }

void main()
{
 Array<int> a1(10,20)
 Array<double> a2(3,5)
 int b1
 double b2 ·
 b1 = a1[-5][10] //有越界提示:行下标越界[-5]
 b1 = a1[10][15] //有越界提示:行下标越界[10]
 b1 = a1[1][4];  //没有越界提示
 b2 = a2[2][6];  //有越界提示:列下标越界[6]
 b2 = a2[10][20] //有越界提示;行下标越界[10]列下标越界[20]
 b2 = a2[1][4];  //没有越界提示

©2005Copyright By hbsoft.net,All rights Reserved |联系我们 鄂ICP备05009730号