一起答
主观

指出该代码是否存在内存泄漏。

试题出自试卷《软件水平考试(初级)程序员下午(应用技术)模拟试卷22》
参考答案
查看试卷详情
相关试题
  1. 阅读以下关于某绘图系统的技术说明、部分UML类图及Java程序,将Java程序中(1)~(6)空缺处的语句填写完整。

      【说明】

     某绘图系统存在Point、Line和Square 3种图元,它们具有Shape接口,图元的类图关系如图5-12所示。

                              

     现要将Circle图元加入此绘图系统以实现功能扩充。已知某第三方库已经提供了XCircle类,且完全满足系统新增的Circle图元所需的功能,但XCircle不是由Shape派生而来,它提供的接口不被系统直接使用。【Java代码7-1】既使用了XCircle又遵循了Shape规定的接口,即避免了从头开发一个新的Circle类,又可以不修改绘图系统中已经定义的接口。【Java代码7-2】根据用户指定的参数生成特定的图元实例,并对它进行显示操作。

     该绘图系统定义的接口与XCircle提供的显示接口及其功能如表5-14所示。

    【Java代码7-1】

       class Circle (1) {

        private (2) pxc;

        publiC Circle(){

     pxc=new (3);

        }

        public void dispiay(){

         pxc. (4);

        }

       }

     【Java代码7-2】

     public class Factory{

      public (5) getShapeInstance(int type)(//生成特定类实例

       Switch(type){

        case 0: return new Point();

        case 1: return new Rectangle();

        case 2: return new Line)();

        case 3: return new Circle();

        default: return null;

       }

      }

     };

     publiC class App{

      public static void main(String argv[]){

       if(argv. length !=1){

        System. out. println("error parameters!");

        Return;

       }

       int type=(new Integer(argv[0])). intValue();

       Factory factory=new Factory();

        Shap s;

        s=factory.(6) 

       if(s==null){

        System. out. println("Error get instance!");

        Return;

       }

       s. display();

       return;

      }

     }

  2. 指出该代码是否存在内存泄漏。

  3. 类Stock的定义中有两处错误,请指出错误所在行号并给出该行修改后的完整结果。

  4. 阅读以下应用说明、图和C++代码,根据要求回答问题1至问题3。

     [说明]

     已知以下C++程序运行时的输出结果如下。

     1:1

     1:1

     1:1

     [C++程序]

     01 #include <iostream>

     02 using namespace std;

     03 class Stock{

     04 protect:

     05    (1) { };

     06   Stock(int n, int pr=1) {

     07     shares = n; share_val=pr;

     08   };

     09   void ~Stock() { };

     10 public:

     11   //成员函数

     12   void output() {

     13      (2)<< shares << ":" << share_val << endl;

     14   }

     15 private:

     16   //成员变量

     17   int shares;

     18   int share_val;

     19 };

     20

     21 void main() {

     22   Stock a(1);     a.output

     23   Stock b;       b.output

     24   Stock c = Stock (); c.output

     25 }

    请根据C++程序运行时的输出结果,将代码中(1)、(2)空缺处的内容补充完整。

  5. 为使应用程序启动时所载入的窗口(图6-16)中具有背景图像(取自用户自定义的某个图像文件“C:\user\background.bmp”),并且在程序运行时,当被遮的该窗口又重现时,其背景图像会自动重画。在开发如图6-16所示窗体时,应对窗体属性对话框(图6-17)中哪些关键属性进行什么样的设置?

  6. 若要求在图6-16窗口中,用户输入月工资(或薪金收入)后,直接按回车键或向下方向箭就能使焦点(当前光标)跳到应扣除的基本费用的输入文本框,而不用【Tab】键进行切换。请将以下文本框ht_salary的KeyDown(按键)事件过程中空缺的程序代码填写完整。

     If KeyCode =13 Or KeyCode = 40 Then

        (6) 

     End If

  7. 阅读以下技术说明和C语言函数,将C程序段中(1)-(5)空缺处的语句填写完整。

     [说明]

     函数DelA - InsB ( LinkedList La, LinkedList Lb, int key 1,int key 2,int len)的功能是,将线性表A中关键码为key 1的节点开始的len个节点,按原顺序移至线性表B中关键码为key 2的节点之前。若移动成功,则返回0;否则返回-1。

     线性表的存储结构为带头节点的单链表,La为表A的头指针,Lb为表B的头指针。单链表节点的类型定义如下。

      typedef struct node{

       int key;

       struct node*next;

     } *LinkedList;

     [C程序]

     int DelA_InsB (LinkedLiSt La, LinkedList Lb, int key1,int key2,int len

     {  LinkedList p, q, S, prep, pres;

        int k;

        if (!La ->next || !Lb ->next || len<=0)

          return-l;

        p = La->next;

        prep = La;

        while (p && p->key != key1){    /* 查找表A中键值为key1的节点 */

          prep = p;

          p = p->next;

        }

        if (!p)

          return -1;          /* 表A中不存在键值为key1的节点 */

        q = p;

        k = 1;

        while (q &&(1)){      /* 在表A中找出待删除的len个节点 */

          (2);

          k++;

       }

       if (!q)

         return -1;           /* 表A中不存在要被删除的len个节点 */

       S = Lb ->next;

        (3);

       while (s && s->key != key2){   /* 查找表B中键值为key2的节点 */

         pres = s;

         s = e->next;

       }

       if (!s)

         return -1;           /* 表B中不存在键值为key2的节点 */

        (4) q->next;         /* 将表A中的len个节点删除 */

       q->next=(5) 

       pres->next = p;          /* 将len个节点移至表B */

       return 0;

     }

  8. 阅读以下应用说明及Visual Basic程序代码,根据要求回答问题1至问题3。

     【说明】

     在Visual Basic程序中,设计一个“个人所得税计算器”,其应用程序的运行窗口如图6-16所示。

     

     窗口中的3个文本框和两个按钮的名称分别为Txt_salary、Txt_base、TxL_tax、Cmd_compute和 Cmd_quit。“个人所得税计算器”程序运行时,文本框Txt_base中存放的是免税金额基数(应扣除的基本费用)。当用户在文本框Txt_salary中输入月收入(工资或薪金)并单击【计算】按钮(Cmd_compute后,Txt_tax框中就显示计算所得的应纳税额。文本框Txt_base和Txt_tax在运行时不接受用户输入,Txt_base的内容以灰色显示。

     个人工资(或薪金)所得税是按照超额累进的税率来征收的,其计算方法如下:以每月收入总额减去免税金额基数后的余额作为该月的月应纳税所得额,再将应纳税所得额按相应级数采用相应的税率进行累进计算。目前的免税金额基数为1 600元,税率如表6-15所示。

    (注:本表所称全月应纳税所得额是指依照本法第六条的规定,以每月收入额减除费用1600元后的余额或者减除附加减除费用后的余额)

     设某个人的全月应纳税所得额为M(元),用下面的公式计算其应缴纳的个人所得税额S(元):

     若0<M≤500,则S=M×5%;

     若500<M≤2000,则S=500×5%+(M-500)×10%;

     若2000<M≤5000,则S=500×5%+1500×10%+(M-2000)×15%;

     若5000<M≤20000,则S=500×5%+1500×10%+3000×15%+(M-5000)×20%;

     假设某程序员2008年5月份工资总额为4700元,减去1600元后,应纳税所得额为3100元,其应缴纳的个人所得税额为500×5%+1500×10%+1100×15%=340元。

     在开发过程中,需要编写的程序代码如下。

     【Visual Bask程序】

     Option Base 0

     Private Sub Cmd compute-Click()

      Dim paylevel,taxPrate

      paylevel=Array(0,500,2000,5000,20000,40000,60000,80000,100000,1000001

      taxPrate=Array(5,10,15,20,25,30,35,40,45)

      M=(1) 

      S = 0

      If (M>0) Then

       For j =1 To 9

        If (2) Then

         s=s+(paylevel(j)-paylevel(j-1))*taxPrate(j-1)/100

        Else

           (3) 

         Exit For

        End if

       Next j

      End if

       (4)=Str$(S)

     End Sub

     Private Sub Cmd_quit_Click()

     End

     End Sub

     Private Sub Form_Load()

      Txt_tax.Text = " "

      Txt_salary.Text = " "

      Txt_base.Text = 1600

      Txt_tax.Locked = True

      Txt_base.Enabled =(5) 

     End Sub

    请根据【说明】信息和如图6-16的显示效果,将【Visual Basic程序】中(1)~(5)空缺处的程序语句填写完整。

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

      [说明]

     以下[C程序]所完成的功能是在3X3方格中填入数字1~N(N≥10)内的某9个互不相同的整数,使所有相邻两个方格内的两个整数之和为质数。系统输出满足该要求的所有填法。系统的部分输出结果如图3-18所示。

     

     图3-18 系统的部分输出结果

     3×3方格从第1行左上角方格开始的序号分别为0、1、2,第2行左边方格开始的序号分别为3、4、 5,第3行左下角方格开始的序号分别为6、7、8。以下[C程序]采用试探法,即从序号为0的方格(左上角)开始,为当前方格寻找一个合理的可填整数,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如不能为当前方格寻找一个合理的可填整数,就要后退到前一方格,调整前一方格的整数。直至序号为8的方格(右下角)也填入合理的整数时,就找到了一个解,将该解输出,并调整序号为8的方格所填的整数,继续去找下一个解。

     为了检查当前方格的填入整数的合理性,C程序引入二维数组checkMatrix,用于存放需要进行合理性检查的相邻方格的序号。

     [C程序]

     #include <stdio.h>

     #define N 12

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

     int b[N+1];

     int pos;

     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 == O)

            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

          (6);

        if (pos < 0)

          return;

        b[a[pos]] = 1;

        a[pos] = j;

        b[j] = 0;

     }

     find ( )

     {  int k = 1;

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

        de {

          if (ok)

            if ( (7) ) {

              write (a);

              change( );

            }

            else

              extend( );

          else

            change( );

          ok = check(pos);

        } while (pos >=0);

     }

     main( )

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

      [说明]

     打保龄球是用一个滚球去打出10个站立的柱,将柱击倒。一局分10轮,每轮可滚球一次或多次,以击倒的柱数为依据计分。一局得分为10轮得分之和,而每轮的得分不仅与本轮滚球情况有关,还可能与后续一两轮的滚球情况有关。即某轮某次滚球击倒的柱数不仅要计入本轮得分,还可能会计入前一两轮得分。具体的滚球击柱规则和计分方法如下:

     1) 若某一轮的第一次滚球击倒全部10个柱,则本轮不再滚球(若是第10轮则还需另加两次滚球)。该轮得分为本次倒柱数(即10)与以后两次滚球所击倒柱数之和。

     2) 若某一轮的第一次滚球未击倒10个柱,则可对剩下未倒的柱再滚球一次。如果这两次滚球击倒全部10个柱,则本轮不再滚球(若是第10轮则还需另加一次滚球),该轮得分为本次倒柱数10与以后一次滚球所击倒柱数之和。

     3) 若某一轮的两次滚球未击倒全部10个柱,则本轮不再继续滚球,该轮得分为这两次滚球击倒的柱数之和。

     总之,若一轮中一次滚球或两次滚球击倒10个柱,则本轮得分是本轮首次滚球开始的连续3次滚球击倒柱数之和(其中有一次或两次不是本轮滚球)。若一轮内二次滚球击倒柱数不足10个,则本轮得分即为这两次击倒柱数之和。表3-15是打保龄球计分的某个实例说明。

    以下[C程序]是模拟打一局保龄球的过程,统计各轮得分和累计总分。程序交互地逐轮逐次输入一次滚球击倒的柱数,计算该轮得分和累计总分。为记录一轮内击倒10柱,但还暂不能计算该轮得分和累计总分的情况,程序引入变量ok,用来记录当前已完成完整计算的轮次。程序每输入一次滚球击倒柱数,就检查还未完成完整计算的轮次,并计算。

     [C程序]

     #include<stdio.h>

     #define N 13

     struct { int n;      /* 一轮内滚球次球 */

           int f;      /* 第一次击倒柱数 */

           int s;      /* 第一次击倒柱数 */

           int score;    /* 本轮得分 */

           int total;    /* 至本轮累计总分 */

           int m;      /* 完成本轮得分计算,还需滚球次数 */

     } a[N];

     int k = 0;          /* 已完成完整计算的轮次数 */

     int ball(int i, int n, int max) /* 完成一次滚球,输入正确击倒柱数 */

     {  int d, j, k;

        static c=1;

        while (1)

        {  if(i <= 10)

            printf(" 输入第%d轮的第%d次滚球击倒柱数。(<=%d)\n", i, n, max );

          else

            printf(" 输入附加的第%d次滚球击倒柱数。(<=%d)\n", C++, max);

          scanf("%d , &d);

          if (d >=0 && d <= max)   break;

            printf(" 不合理的击倒柱数,请重新输入。\n")

        )

        if (ok <(1) )

        {  /* 对以前未完成计算的轮次分别计算得分与累计总分*/

          for(j = ok+1;(2); j++)

          {  a[j].score += d;

             if (--a[j].m == 0)

             {  a[j].total = ( (3) ) + a[j].score;

               k =(4);

             }

          }

        }

       return d;

     }

     main ( )

     {  int i, first, second, k;     /* i表示轮次 */

        for ( i = 1 ; ok < 10 ; i++)

          a[i].score = a[i].f = first = ball(i,1,10);

          if ( first == 10)

            a[i].m = 2;

          a[i].n = 1;

          if (first < 10 && (i <= 10 || i == 11 && ok < 10 ))

          { /* 处理第2次滚球 */

            (5)= second = ball i,2,10-first);

            if (first + second == 10)

              a[i].m = 1;