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

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

请认真阅读以下关于某传输系统的技术说明、状态转换图及C++代码,根据要求回答问题1和问题2。

 【说明】

 传输门是传输系统中的重要装置。传输门具有Open(打开)、Closed(关闭)、Opening(正在打开)、StayOpen(保持打开)和Closing(正在关闭)5种状态。触发状态的转换事件有click、complete和timeout 3种,事件与其相应的状态转换如图6-18所示。

 

 下面的【C++代码1】与【C++代码2】分别用两种不同的设计思路对传输门进行状态模拟,请填补代码段中的空缺语句。

 【C++代码1】

    const int CLOSED = 1; const int PENING = 2;

    const int PEN = 3; const int CLOSING = 4;

    const int STAYOPEN = 5;  //定义状态变量,用不同整数表示不同状态

    class Door {

    private:

    private:

     int state;                       //传输门当前状态

     void setState(int state) { this->state = stale; }   //设置当前状态

    public:

     Door () :state (CLOSED) { };

     void getState() {              //根据当前状态输出相应的字符串

      switch(state) {

       case OPENING: cout <<"OPENING" << endl;   break;

       case CLOSED: cout << "CLOSED" << endl;    break;

       case OPEN: cout << "OPEN" << endl;      break;

       case CLOSING: cout << "CLOSING" << endl;   break;

       case STAYOPEN: cout << "STAYOPEN" << endl;  break;

      }

     }

     void click() {              //发生click事件时进行状态转换

      if ( (1) ) setState(OPENING);

      else if ( (2) )   setState(CLOSING);

      else if ( (3) )   setState(STAYOPEN);

     }

     void timeout() {               //发生timeout事件时进行状态转换

      if (state == OPEN)  setState(CLOSING);

     }

     void complete() {            //发生complete事件时进行状态转换

      if (state == OPENING)  setState(OPEN);

      else if (state == CLOSING)  setState(CLOSED);

     }

    };

    int main(){

     Door aDoor;

     aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.complete();

     aDoor.getState(); aDoor.click(); aDoor.getState(); aDoor.click();

     aDoor.getState(); return 0;

    }

 【C++代码2】

    class Door {

    public:

     DoorState *CLOSED, *OPENING, *OPEN, *CLOSING, *STAYOPEN, *state;

     Door();

     virtual ~Door() { ...         //释放申请的内存,此处代码省略};

     void s

1

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

  【说明】

 以下【C程序】完成从指定数据文件中读入职工的工号和他完成产品个数的数据信息,对同一职工多次完成的产品个数进行累计,最后按如表5-11所示的格式输出职工完成产品数量的名次(ORDER),该名次是按每位职工完成的产品数量(QUANTITY)排序,之后是同一名次的职工人数(COUNT)和他们的职工号(NUMBER,同一名次的职工号以从小到大的顺序输出)。

以下【C程序】采用链表结构存储有关信息,链表中的每个表元对应一位职工。在数据输入的同时,形成一个有序链表(按完成的产品数量和工号排序)。当一个职工有新的数据输入,在累计他的完成数量时会改变原来链表的有序性,为此应对链表进行删除、查找和插入等操作。

 【C程序】

 #include<stdio. h>

 typedef struct ele{

   int no, q;

   struct ele * next;

 }elem;

 main(int argc, char ** argv){

   FILE *fp; elem *h, *u, *proc();

   if(argc==2 &&(fp=fopen(argv[1], "r"))!=NULL){

     h=proc(fp);

     fclose(fp);

     output(h);

     while(h I=NULL){

       u=h→*next; free(h); h=u;

     }

   }

 }

 elem * proc(FILE *fp){

   int n, m; elem *u, *v, *p, *base;

   base=NULL;

   fscanf(fp, "%d', &m);

   while(!feof(fp)){

     fscanf(fp, '%d', &m);

     for(v=base; v!=NULL && v->no !=n; u=v, v=v->next);

     if( (1) )

     if( (2) )

       base=v->next;

     else

       u->next=v-next;

     v->q+=m;

   else

     v=(elem *)malloc(Sizeof)elem));

   v->no=n; v->q=m; p=base;

   while(p !=NULL)

   if( (3) )break;

   else {

     u=p; p=p->next;

   }

   if( (4) )

     base=v;

   else

     u->next=v;

    (5);

   Fscanf(fp, "%d", &n);

 }

     return base;

   }

   Output(elem *head){

   int count, order; elem *u, *v;

   printf("ORDER QUANTITY COUNT NUMBER\n");

   u=head; rder=1;

   while(u !=NULL){

     for(count=1, v=u->next;(6);count++, v=v->next);

     printf("%4d%9d%6d", order, u->q, count);

     order+=count;

     for(; (7) ;printf("%4d", u->no), u=u->next);

     printf("\n");

   }

 }

1

请认真阅读以下函数说明、图及C程序,将程序段中(1)~(7)空缺处的语句填写完整。

  【说明】

 一般的树结构常采用孩子一兄弟表示法表示,即用二叉链表代表树的存储结构,链表中节点的两个链域分别指向该节点的第一个孩子节点和下一个兄弟节点,例如,如图5-9(a)所示的树和如图5-9(b)所示的树的孩子一兄弟表示。

                         

 函数LevelTraverse()的功能是对给定树进行层序遍历。例如,对如图5-9所示的树进行层序遍历时,节点的访问次序为DBAEFPC。

 对树进行层序遍历时使用了队列结构,实现队列基本操作的函数原型如表5-12所示。

Bool、Status类型定义如下:

   typedef enum{FALSE=0, TRUE=1}Bool;

   typedef enum{OVERFLOW=-2, UNDERFLOW=-1, ERROR=0, K=1)Status;

 树的二叉链表节点定义如下:

 typedef struct N6de{

   char data;

   struct Node *firstchild, *nextbrother;

 }Node, *TreeNode;

 【C函数程序】

 Status LevelTraverse(TreeNode root){

 /*层序遍历树,树采用孩子一兄弟表示法,root是树根节点的指针*/

 Queue tempQ;

 TreeNode ptr, brotherptr;

 if(!root)

   return ERROR;

 InitQueue(&tempQ);

  (1);

 brotherptr=root->nextbrother;

 while(brotherptr)(EnQueue(&tempQ, brotherptr);

     (2);

 }  /*end-while*/

 while( (3) ){

   (4);

  Printf("%c\t", ptr->data);

  if( (5) ) continue;

   (6);

  brotherptr=ptr->firstchiid->nextbrother;

  while(brotherptr){

    EnQueue(&tempQ, brotherptr);

    (7);

  } /*end-while*/

 }/*end-while*/

 return OK;

 } /*LevelTraverse*/