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

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

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

【说明】构造最优二叉查找树。

 具有n个结点的有序序列a1, a2, …, an存在于数组元素a[1]、a[2], …, a[n]之中, a[0]未被使用。结点a1, a2, …, an-1, an的查找成功的概率p1, p2, …, pn-1, pn存在于数组元素 p[1]、p[2], …, p[n—1]、p[n]之中, p[0]未用。另外, 查找失败的概率q0, q1, …, qn-1, qn存在于数组元素q[0]、p[1], …, q[n-1]、q[n]之中。算法计算的序列ai+1, ai+2,…, aj-1, aj的最优二叉查找树Tij的代价Cij存在于数组元素c[i][j]之中, Tij的根结点的序号rij存在于r[i][j]之中, 它的权值存在于w[i][j]之中。为了便于内存的动态分配, 统统使用一维数组取代二维数组。

 const float MAXNUM=99999. 0; //尽可能大的浮点数

 template<(1)>

 void OPtimal_Binary_Search_Tree(float p[], float q[], Type a[], int n) {

   float *C, *W;

   c=(2);

   w=(3);

   int *r;

   r=new int[(n+1)*(n+1)];

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

     { c[i*(n+1)+i]=0. 0;  // 即:c[i][i]=0.0, 用一维数组表示

       w[i*(n+1)+i]=q[i];   // 即:w[i][i]=q[i], 用一维数组表示

     }

     int i, j, k, m, length;  // m表示根结点的下标或序号, 范围为0~n

     float minimum;

     for(length=1; length<=n; length++) //处理的序列长度由1到n

       for(i=0; i<=n-length; i++){ //i为二叉查找树Tij的起始序号

         j=i + length; //j为二叉查找树Tij的终止序号。如:处理序列a1a2a3时,

                //相应的二叉查找树为T03, i=0, 而j=3

         w[i*(n+1)+j]=(4);

         minimum =MAXMUM;

         for(k=i+1; k<=j; k++) //考察以ai+1、ai+2, …, ai为根的情况

           if((5)<minimum)

           { minimum=c[i*(n+1)+k-1]+c[k*(n+1)+j];m=k; }

         c[i*(n+1)+j]=w[i*(n+1)+j]+c[i*(n+1)+m-1]+c[m*(n+1)+j];

         r[i*(n+1)+j]=m;  // r[i][j]=m

       }

 } //构造好的最优二叉查找树的根结点的序号在r[0][n]中

1

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

 【说明】

 本程序在3×3方格中填入1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。试求出满足这个要求的所有填法。3×3方格中的每个方格按行按列(先行后列)序号排列为:0,1,2,3,4,5,6,7,8。

 程序采用试探法,即从序号为0的方格开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入整数;直至序号为8的方格也填入合理的整数后,就找到了一个解,将该解输出。再调整序号为8的方格所填整数,继续去找下一个解。为了检查当前方格的填入整数的合理性,程序引入二维数组check Matrix,存放需要进行合理性检查的相邻方格的序号。

 # include <stdio. h>

 # define N   12

 int b[N+1];

 int pos;

 int a[9];/* 用于存储诸方格所填入的整数*/

 int AllNum=0;/* 统计有多少种填法*/

 int checkMatrix[][3]={ {-1},{0,-1},{1,-1},

               {0,-1},{1,3,-1},{2,4,-1},

               {3,-1},{4,6,-1},{5,7,-1}};

 void write(int a[])

 {  int i, j;

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

    {  for(j=0; j<3; j++)

         printf("%3d", a[3*i+j]);

      printf("\n");

    }

 }

 int isPrime(int m)

 {  int i;

    if(m==2)return 1;

    if(m==1 ‖ m%2==0)return 0;

    for(i=3; i*i<m;)

    {  if(m%i==0)return 0;

      i+=2;

    }

    return 1;

 }

 int selectNum(int start)

 {  int j;

    for(j=start; j<=N; j++)

      if(b[j])return j;

    return 0;

 }

 int check()/*检查填入pos位置的整数是否合理*/

 {  int i,j;

    for(i=0; (j=(1))>=0; i++)

      if(!isPrime(a[pos]+a[j]))

         (2);

    (3);

 }

 extend ()/* 为下一方格找一个尚未使用过的整数*/

 {  a[(4)]=selectNum(1);

    b[a[pos]]=0;

 }

 void change ()/*为当前方格找下一个尚未使用过的整数(找不到回溯)*/

 {  int j;

    while(pos >=0 && (j=selectNum((5)))==0)

      b[a[pos--]]=1;

    if(pos<0)return;

    b[a[pos]]=1; a[pos]=j; b[j]=0;

 }

 int find ()

 {  int k=1;

    pos=0; a[pos]=1; b[a[pos]]=0;

    do{

      if(ok)

         if(pos==8)

         {  write(a);

           change();

           AllNum++;/* 统计有多少种填法*/

         }

         else extend();

      else change();

      k=check();

    }while(pos>=0);

 }

 void main()

 {  int i;

    for(i=1; i<=N; i++) b[i]=1;

    find();

    prinrf("共有%d种不同填法!/n", AllNum);

 }

1

阅读下列说明和有关图表,回答问题1至问题3。

  【说明】

 A公司决定开发一套公共交通自动售票系统,系统要求如下所述。

 (1)乘客能按以下3步操作购票:选定目的地,投入钱币,获得一张票。

 (2)并且仅当乘客选定目的地后,系统才接收投钱;每次投入的钱只购买一张票。

 (3)只要投入的钱不少于所需的票价,且票库中有所要求的票,则应尽快出票。

 (4)如需找钱,则在出票的同时应退还多余的钱。

 (5)如果乘客投入的钱不够票价,或者票库中没有所需要的票时,系统将全额退钱,并允许乘客另选目的地,继续购票。

 (6)出票前乘客可以单击“取消”按钮取消购票,系统将全额退出该乘客投入的钱,并允许乘客另选目的地,继续购票。

 (7)出票结束(包括退还多余的钱)后,系统应保存销售记录,并等待乘客购票。

 该系统还要求快速响应和操作同步,所以它应是一个实时系统。为此,A公司在该系统的数据流程图中附加了过程控制部分,形成转换图。在该图中,控制流(事件流)用虚

             

线表示,数据流用实线表示。图中的数据流并没有画全,需要考生填补。

 对售票全过程进行的控制可以用系统内部各个状态之间的迁移来描述,从而形成状态迁移图。在状态迁移图中,用双线框表示状态,用有向边表示状态的迁移。引起状态迁移的事件以及由该事件引起的动作,在有向边旁用“”形式注明。

             

 该公司还制定了一个过程启动表,用以表明状态迁移图中的4个动作与转换图中的4个过程之间的“启动”关系,即说明哪个动作将启动哪个过程。用1表示启动,用0表示不启动。启动的过程将根据获得的输入数据产生输出数据,未唐动的过程则不会产生输出数据,该表中没有列出的过程,其执行与否与事件无关。

             

 【问题1】

 转换图中缺少哪3条数据流?请指明每条数据流的名称、起点和终点。

 【问题2】

 在状态迁移图中,a、b、c分别表示什么事件?请用转换图中给出的事件名解答。

 【问题3】

 在过程启动表中,d、e处应填什么?请分别用4位二进制码表示。

根据以下关于学校构成的说明回答问题1至问题3。

  【说明】

 学校中有若干系,每个系有若干班级和教研室,每个教研室有若干教员,其中有的教授和副教授各带有若干研究生;每个班有若干学生,每个学生选修若干课程,每门课可由若干学生选修。

 【问题1】

 用E-R图画出此学校的概念模型,用文字写出各实体和联系的属性。

 【问题2】

 将E-R图转换成关系模型。

 【问题3】

 指出各关系模型的候选键。