历年计算机软考程序员笔试真题及答案

时间:2016-05-03 16:20:00   来源:开云网页版     [字体: ]

试题一是必答题

试题一   阅读下列说明、流程图和算法,将应填入__(n)__处的字句写在答题纸的对应栏内.

[流程图说明]

  下面的流程图用N—S盒图形式描述了数组A中的元素被划分的过程.其划分方法是:

  以数组中的第一个元素作为基准数,将小于基准数的元素向低下标端移动,而大于基准数的元素向高下标端移动.当划分结束时,基准数定位于A[i],并且数组中下标小于i的元素的值均小于基准数,下标大子i的元素的值均大于基准数。设数组A的下界为low,上界为high,数组中的元素互不相同。例如,对数组(4,2,8,3,6),以4为基准数的划分过程如下:

[算法说明]

  将上述划分的思想进一步用于被划分出的数组的两部分,就可以对整个数组实现递增排序。设函数int p(int A[],int low,int high)实现了上述流程图的划分过程并返回基准数在数组A中的下标。递归函数void sort(int A[],iht L,int H)的功能是实现数组A中元素的递增排序。

[算法]

 void sort(int A[],iht l,int H) {  if ( L < H ) {   k=p(A,L,R);     //p()返回基准数在数组A中的下标   sort(__ (4)__;     //小于基准数的元素排序   sortl__ (5)__);    //大于基准数的元素排序   }  }

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

试题二

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

[函数2.1说明]

  函数palindrome(chars[])的功能是:判断字符串s是否为回文字符串,若是,则返回0,否则返回-1。若一个字符串顺读和倒读都一样时,称该字符串是回文字符串,例如:“LEVEL”是回文字符串,而“LEVAL”不是。

[函数2.1]

 int palindrome(char S[])  { char *pi,*pj;   pi=S;pj=s+strlen(S)-1:   while ( pi

[函数2.2说明]

  函数f(char *str,char del)的功能是;将非空字符串str分割成若干个子字符串并输出,del表示分割时的标志字符。

  例如若str的值为“33123333435”,del的值为‘3’,调用此函数后,将输出三个子字符串,分别为“12”、“4”和“5”。

[函数2.2]

 void f(char*str,char del)  { int i,j,len;   len = strlen(str);   i = 0;   while (i

试题三   以下是与Visual Basic开发应用有关的5个问题.对每一个问题,请将解答填入答题纸的对应栏内。

  (1)在Visual Basic中,工程文件、窗体文件和标准模块文件的扩展名是什么?

  请从下列选项中选择:

  prg、prj、exe、vbp、rom、frm、win、fra,std、bas、vbs、Vbm

  (2)设某窗体上有一个命令按钮,其名称为 CmdSave,运行时该按钮上显示有“保存(S)”字样的信息。为使热键 ALT+S 与该命令按钮相关联,应该对按钮 CmdSave 的 Caption属性设置什么样的属性值?

  (3)设某窗口内有一个图像框 Image1,以及两个命令按钮“放大”和“缩小”。单击“放大”按钮就会使该图像框的长和宽都放大10%;单击“缩小”按钮就会使该图像框的长和宽都缩小10%(该图像框的左上角不动)。请分别写出这两个命令按钮的单击事件过程中的程序代码。

  (4)为使某个单选按钮初始时默认被选中,在开发时应怎样做?

  (5)若有语句 Tmpval=MsgBox(非法操作!,ybOKCancel+vbCritical,"提示"),请简要描述程序运行时弹出的消息框的主要特征。

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

试题四

  阅读以下说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。

[说明]

  函数 MultibaseOutput(long n,int B)的功能是:将一个无符号十进制整数 n 转换成 B(2≤B≤16)进制数并输出。该函数先将转换过程中得到的各位数字入栈,转换结束后再把 B 进制数从栈中输出。有关栈操作的诸函数功能见相应函数中的注释。C代码中的符号常量及栈的类型定义如下:

 #define KAXSIZE 32  typedef struct{   int *elem;  /* 栈的存储区 */   int max;   /* 栈的容量,即找中最多能存放的元素个数 */   int top;   /* 栈顶指针 */  }Stack; [C代码]  int lnitStack(Stack *S,int n)  /* 创建容量为n的空栈 */  { S->elem = (int *)matloc(n * sizeof(int));   if (S->elem == NULL) return -1;   S->max = n;__(1)__= 0;return 0;  }  int Push(Stack*S,int item)   /* 将整数item压入栈顶 */  { if(S->top == S->max){ printf("Stack is full!\n");return -1;}   __(2)__;item;return 0;  }  int StackEmpty(Stack S){ return(!S.top) ? 1;0;) /* 判断栈是否为空 */  int Pop(Stack*S)        /* 栈顶元素出栈 */  { if (!S->top){ printf("Pop an empty stack!\n");return -1;)   return __(3)__;  }  void MultibaseOutput(long n,int B)  { int m;Stack S;   if (init Stack(&S,MAXSIZE)) { printf("Failure!\n");return;}   do {    if (Push(&s,__(4)__)) { printf("Failure!\n");return;}    n = __(5)__:   } while (n != 0);   while (!StackEmpty(S)) {     /* 输出B进制的数 */    m = Pop(&S);    if (m < 10) printf("Kd",m);  /* 小于10,输出数字 */    else printf("%c,m + 55);    /* 大于或等于10,输出相应的字符 */   }   printf("\n");  }

试题五

  阅读以下应用说明及Visual Basic程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内。

[应用说明5.1]

  本应用程序的窗体中有一个下拉式列表框(名称为Combol)和两个文本框(名称分别为Txtl和Txt2)。运行时,用户从Combol的列表中进行选择,程序就会将选中条目的内容以及编号(从0开始)分别在文本框 Txt1 和 Txt2 中显示出来。

[程序代码5.1]

 Private Sub Combol_C1ick()   Txtl.Text = Combol.__(1)__   Txt2.Text = Combol.__(2)__  End Sub

  (注:可供(2)处选择的选项:List,Index,Listlndex,ListCount,Number)

[应用说明5.2]

  本应用程序的运行窗口如下图所示:

 当用户在输入框(名为Txtln)中输入数值数据,并从下拉式列表框(名为CmbOp)中选择所需的运算后,输出框(名为TxtOut)中就会显示运算的结果。用户单击“清除”按钮(名为CmdClear)后,输入框和输出框都清空。

开发该应用的部分程序代码如下:

[程序代码5.2]

 Private Sub CmbOp_Click()   Dim DataIn As Double,DataOut as Double   DataIn = __(3)__   Select Case __(4)__    Case "取整数部分"     DataOut = Int(Dataln)    Case "求平方根"     If Dataln < O Then      MsgBox$("负数不能开平方!")     Else      DataOut = Sqr(Dataln)     End If    Case "取绝对值"     DataOut = Abs(Dataln)     (TxtOut.Text = str$(DataOut)     __5)__  End Sub

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

试题六   阅读下列函数说明和 C 函数,将应填入__(n)__处的字句写在答题纸的对应栏内。

[函数6说明]

  函数DelAInsB(LinkedList La,LinkedList lb,int key1,int key2,int len)的功能是,将线性表A中关键码为keyl的结点开始的len个结点,按原顺序移至线性表B中关键码为key2的结点之前,若移动成功,则返回0;否则返回-1。线性表的存储结构为带头结点的单链表,La为表A的头指针,Lb为表B的头指针。单链表结点的类型定义为:

 typedef struct node{   int key;   struct node*next;  }*Linkedhist;

[函数6]

 int DelllnsB(LinkedLiSt La,LinkedList Lb,int keyl,int key2,int len)  { LinkedList p,q,S,prep,pres;   int k;   if (!La->next || !Lb->next || len<=0) return-1;   p = La->next; prep = La;   while (p && p->key != keyl){   /* 查找表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 = s->next;   }   if (!s)return -1;        /* 表B中不存在键值为key2的结点 */   __(4)__q->next;         /* 将表A中的len个结点删除 */   q->next:__(5)__   pres->next = p;         /* 将len个结点移至表B */   return 0;  }

试题七   阅读以下应用说明、属性设置及VisualBasic程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内。

[应用说明7]

  本应用程序的运行窗口如下图所示:

  只要用户单击“闪烁”按钮,文字“欢迎光临”就会以0.3秒消失、0.3秒显示反复进行闪烁;单击“停止”按钮时,闪烁停止,恢复图示的初态。

  在开发过程中,需要设置的属性如下:

[属性设置7]

对象 对象名 属性名 属性值
窗体 Frm1 Caption 闪烁显示演示
标签 Labe1 Caption 欢迎光临
命令按钮 CmdF Caption 闪烁
命令按钮 CmdT Caption 停止
定时器 Timer1 Enabled __(1)__
    Interval __(2)__

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

[程序代码7]

 Private Sub CmdF Click()   Timerl.__(3)__ = True   Label.Visible = False  End Sub  Private Sub Timerl_ Timer()   __(4)__ = not Label.Visible  End Sub  Private Sub CmdT Click()   Timerl.Enabled = __(5)__   Label.Visible = true  End Sub

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

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

[程序8说明]

  程序8用于计算某公司每个职工应缴纳的个人所得税额和全体职工缴纳的个人所得税总额。职工的当月收入(工资或薪金)通过键盘输入,每次输入一个职工的工号和工资(或薪金)。由于该公司的工资或薪金是不定时发放的,所以输入过程中每个职工的收入会出现多次输入,整个输入以工号小于等于0结束。

  假设个人所得税法规定;个人收入所得,按月计税,以每月收入总额减除免税金额800元后的余额作为该月的月应纳税所得额,适用税率如下表所示。

级数 月应纳税所得额 适用税率(%)
1 2 3 4 5 6 7 8 9

 不超过500元的部分  501元~2000元的部分  2001元~5000元的部分  5001元~20000元的部分  20001元~40000元的部分  40001元~60000元的部分  60001元~80000元的部分  80001元~100000元的部分  超过100000元的部分

5 10 15 20 25 30 35 40 45

  上表表明,个人收入所得税是按照超额累进的税率来征收的。

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

  若0

  若500

  若2000

  若5000

  例如,某人某月工资总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。

[程序8]

 #include   #define MaxNum 50  #define BASE 800     /*免税金额基数*/  int paylevel[]={0,500,2000,5000,20000,40000,60000,80000,100000,100000¨:  int taxPrate[]={5,10,15,20,25,30,35,40,45): /*税率表*/  typedef struct{   int ld;    /*职工的工号*/ .   long Salary;  /*职工的工资*/  }Info;  /* 查找工号为Id的职工在数组employee中的下标,返回值为0表示没有 */  int find(int ld,Info employee[],int m){   int j;   employee[0].Id=Id;   for(j=m;__(1)__;j--);    return j;  }  void main(void)  { Info employeeCHaxNum+1];   long Wage;   double sum s 0,K,S:   int i,j,N=0,Code;   scanf("M%ld",&Code,&Wage);   /*读入职工号、工资或薪金*/   while(Code>0) {    i=find(Code,employee,N);    if (i>0)employee[i].Salary += Wage:    else{ __ (2)__;    employee[N].Id=Code;employee[N].Salary=Wage;    }    scanf("%d%ld",&Code,&Wage):   }   for (i=1;i<=N;i++){    K = __(3)__;         /*计算月应纳税所得额*/    S=0;             /*月应纳税额赋初值*/    if (K > 0) {     for (j=1;j<=9;j++)      if(__(4)__)        /*月应纳税所得额超过第j级*/       S=S+(paylevel[j]-paylevel[j-1])*taxPrate[j-1]/100;      else{ S=S+(__ (5)__)*taxPrate[j-1]/100;break;}    }    printf("职工%d应缴纳的个人所得税额:%10.21f\n",employee[i].Id,S);    sum += S;   }   printf("全体职工个人所得税总额:%10,21f\n",sum);  }

试题九   阅读以下应用说明及VisualBasic程序代码,将应填入__(n)__处的字句写在答题纸的对应栏内. [应用说明9]

  本应用程序的运行窗口如下图所示:

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

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

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

级数 月应纳税所得额 适用税率(%)
1 2 3 4 5 6 7 8 9

  不超过500元的部分   501元~2000元的部分   2001元~5000元的部分   5001元~20000元的部分   20001元~40000元的部分   40001元~60000元的部分   60001元~80000元的部分   80001元~100000元的部分   超过100000元的部分

5 10 15 20 25 30 35 40 45

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

  若0

  若500

  若2000

  若5000

  例如,某人某月工资总额为4100元,减去800元后,应纳税所得额为3300元,其应缴纳的个人所得税额为500*5%+1500*10%+1300*15%=370元。

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

[程序代码]

 Option Base 0  Private Sub Cmd compute-C1ick()   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)   K=__(1)__   S = 0   If (K>0) Then    For j=1 To 9     If __(2)__ Then      S=S+(paylevel(j)-paylevel(j-1))*taxPrate(j-1)/100     Else      S=S+(__(3)__)*taxPrate(j-1)/100      Exit For     End lf    Next j   End lf   __(4)__=Str$(S)  End Sub

 Private Sub Cmd_quit_C1ick()  End  End Sub

 Private Sub Form_Load()   Txt_tax.Text = " "   Txt_salary.Text = " "   Txt_base.Text = 800   Txt_tax.Locked = True   Txt_base.Enabled =__(5)__  End Sub

答案

试题一

(1)i:1,1,8 (2)1→sw (3) 0→BIT[i] (4)NOP,或空操作 (5)1→BIT[i]

试题二

(1)j%2,及其等价形式 (2)i+=2,及其等价形式 (3)tag>2,或tag==3或tag>=3,及其等价形式 (4)9 (5)45 试题三

(1)p && knext,及其等价形式 (3)q->next (4)prep->next (5)q->next=p

试题四

(1)(h-9)*60+m,及其等价形式 (2)time + R[k].d[ch-'a']*20 其中ch-'a'可以表示为ch-97,R[k]可以表示为R[R[k].no] (3)R[t].num == R[j].num && R[t].time > R[j].time,及其等价形式 (4)t!=i,及其等价形式,表达式的值为真也正确 (5)R[i],及其等价形式

试题五 (1)Asc("A")+i-1,或64+i,及其等价形式 (2)(h-9)*60+m,及其等价形式 (3)Combol.Text (4)Value (5)Time+R(k).d(m)*20 其中m可表示为Asc(ch)-Asc("A")或Asc(ch)-65,k可表示为R(R(k).no) 试题六

(1)public Figure (2)height*width (3)public Rectangle (4)this->height=this->width=width (5)public Figure 若填public Rectangle只给1分

试题七

(1)False (2)True (3)SetFocus (4)Delete (5)Update

试题八 (Java)

(1)Figure (2)height*width (3)Rectangle (4)super(width,width) (5)Figure