一起答

2011年程序员考试考前密卷(四)-下午试题

  • 卷面总分:75分
  • 浏览次数:0
  • 测试费用:免费
  • 答案解析:是
  • 练习次数:21次
  • 作答时间:150分钟
试卷简介
该试卷以考试大纲和考试专家委员会编写的考试指导为编写依据,以帮助考生熟悉和掌握专业知识、提高能力和素质为主要目的,切实反映考试对考生在知识点的掌握程度和专业水平上的要求。遵循科学、严谨、客观、规范的原则,严格按照实际考试的科目划分和题型分布进行编写,能够有效地帮助考生考前自测和反馈复习成果。
部分试题预览
  1. ●试题八

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

    【说明】

    设计一个日期类Date包括年、月、日等私有数据成员。要求实现日期的基本运算,如某日期加上天数、某日期减去天数、两日期相差的天数等。

    在Date类中设计如下重载运算符函数:

    Date operator+(int days):返回某日期加上天数得到的日期。

    Date operator-(int days):返回某日期减去天数得到的日期。

    int operator-(Date&b):返回两日期相差的天数。

    【程序】

    #include

    int day tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},

    {31,29,31,30,31,30,31,31,30,31,30,31}};

    ∥day_tab二维数组存放各月天数,第一行对应非闰年,第二行对应闰年class Date

    {

    int year,month,day;∥年,月,日

    int leap(int);∥判断是否为闰年

    int dton(Date&);

    Date ntod(int);

    public:

    Date(){}

    Date(int y,int mint d){year=y;month=m;day=d;}

    void setday(intd){day=d;}

    void setmonth(int m){month=m;}

    void setyear(int y){year=y;}

    int getday(){return day;}

    int getmonth(){return month:}

    int getyear(){return year;)

    Date operator+(int days)∥+运算符重载函数

    {

    static Date date;

    int number= (1) ;

    date=ntod(number);

    return date;

    }

    Date operator-(int days)∥-运算符重载函数

    {

    staffs Date date;

    int number= (2) ;

    number-=days;

    date=ntod(number);

    return date;

    }

    int operator-(Date&b)∥-运算符重载函数

    {

    int days= (3) ;

    return days;

    }

    void disp()

    {

    cout<

    }

    };

    int Date::leap(int year)

    {if( (4) )∥是闰年

    return 1;∥不是闰年

    else

    return0:

    }

    int Date::dton(Date&d)∥求从公元0年0月0日到d日期的天数

    {

    inty,m,days=0;

    for(y=1;y<=d.year;y++)

    if( (5) )days+=366;∥闰年时加366天

    else days+=365;∥非闰年时加365天

    for(m=0;m

    if( (6) )

    days+=day_tab[1][m];

    else

    days+=day_tab[0][m];

    days+=D.day;

    return days;

    }

    Date Date::ntod(intn)∥将从公元0年0月0日的天数转换成日期

    {

    int y=1,m=1,d,rest=n,lp;

    while (1) 

    {if(leap(y))

    if(rest<=366)break;

    else rest-=366;

    else∥非闰年

    if(rest=365)break;

    else rest-=365;

    y++;

    }

    y--;

    Ip=Ieap(y);

    while (1) 

    {

    if(Ip)∥闰年

    if(rest>day_tab[1][m-1])rest-=day_tab[1][m-1];

    else break;

    else∥非闰年

    if(rest>day_tab[0][m-1])rest-=day_tab[0][m-1];

    else break;

    m++;

    }

    d=rest;

    return Date(y;m,d);

    }

    void main()

    {

    Date now(2003,10,1),then(2005,6,5);

    cout<<"now:";now.disp();

    cout<<"then:";then.disp();

    cout<<"相差天数:"<<(then-now)<

    Date dl=now+1000,d2=now-1000;

    cout<<"now+1000:";d1.disp();

    cout<<"now-1000:":d2.disp();

    }

  2. ●试题七

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

    【说明】

    某学校举办了一场奥运知识竞赛,参加竞赛的选手为200名,1~200为选手编号。竞赛时间为9:00~11:00。8道竞赛题目依次从"A"~"H"编号,选手可按任意次序答题,每完成一道题目,可立即提交答案。若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。

    选手提交答案的情况及判定结果由专人即时录入,录入数据包括提交答案的时间、选手编号、题目编号(A~H)、是否正确(Y/N)等。

    对竞赛情况进行统计和排名的规则如下:

    1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间计算如下:

    解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时罚时=提交题目P错误解答的次数×20例如:表1中14号选手在10:27提交了题目A的正确解答,因此该选手正确解答该题目所用时间P为87分钟,由于他在09:37和09:52两次提交了题目A的错误解答,因此罚时为(2×20)分钟=40分钟,所以14号选手解答题目A的用时=(87+40)分钟=127分钟。

    2.已经提交正确答案的题目再次提交时不再计算。

    3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。

    4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为0的选手不参加排名。

    本应用程序的运行窗口如图3所示。

    图3

    窗口中的两个文本框为Txt_time和Txt_player,分别用于录入提交答案的时间和选手编号。组合列表框Combol提供题目编号(A~H),录入时从中选择。检查框Chk_yn用于输入解答是否正确信息。当单击"确定"按钮(Cmd_comfirm)时,录入的提交信息加入列表框Listl中,排名情况在列表框List2输出。单击"关闭"按钮时退出应用程序。

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

    【程序】

    Private Type Info

    No As Integer′选手编号

    Num As Integer′完成题目数量

    Time As Integer′完成题目的总用时

    d (8) As Integer′d用于记录提交第i个题目错误答案的次数

    a (8) As Boolean′a用于记录第i个题目是否已经提交正确答案

    End Type

    Dim R(201)As info′R[j]用于统计编号为j的选手提交答案的情况

    Dim MaxIndex As Integer′MaxIndex记录提交答案的选手中编号最大者

    Private Sub Form_Load()

    For i=1 to 8

    Combo1.AddItem chr( (1) )

    Next

    Combo1.Text=Combo1.List(0):txt_time.Text="":txt_player.Text=""

    For i=1 To 200

    R(i).num=0:R(i).time=0:R(i).no=i

    Forj=1 To 8

    R(i).d(j)=0:R(i).a(j)=False

    Next j,i

    End Sub

    Private Sub cmd_confirm_Click()

    Dim h,m,k,time As Integer,ch,pass,s1 As String

    K=Instr(txt_time.text,"∶"):If k<2 Then Goto error1

    H=Val(Left(txt_time.Text,k-1)):m=Val(Mid(txt_time.Text,k+1))

    If h>11 Or h=11 And m>0 Or m>=60 Then goto errorl

    Time= (2) ′计算答题时间,以分钟为单位

    If txt_plater.text<1 or txt_player.text>200 Then Goto error1

    ch= (3) 

    pass=IIf(chk_yn. (4) =0,"N","Y")

    s1=txt_time.Text+Space (4) +txt_player.Text

    s1=s1+Space(10-Len(txt_player.Text))+ch+Space (8) +pass

    List1.Additem s1

    K=Val(txt_player.Text)′k为选手编号

    R(k).no=k′编号为k的选手的提交信息记录在下标为k的数组元素中

    If k>maxindex Then maxindex=k

    M=Asc(ch)-Asc("a")

    If pass<>"Y"Then′编号为k的选手提交第m个题目的解答不正确

    R(k).d(m)=R(k).d(m)+1

    Else If R(k).a(m)<>True Then′已经提交正确的题目的解答不再计算

    R(k).a(m)=true:R(k).num=R(k).num+1

    R(k).time=R(k).time+ (5) 

    Call statistic′调用过程statistic进行实时排名和输出

    End If

    Exit Sub

    error1:MsgBox"录入信息有错误!",vbOKOnly

    End Sub

  3. ●试题六

    阅读以下说明和Java代码,将解答写入答题纸的对应栏内。【说明】

    下面程序的功能是显示已定义的一个3行3列的二维数组每行的元素,并求所有元素的和并输出。请在程序的每条横线处填写一个适当的语句,使程序的功能完整。

    public class Array{

     (1) static (2) main(String args[])

    {

    int sum=0;

    int b[][]={{11,12,13},{21,22,23},{31,32,33}};

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

    {

    System.out.print("b["+i+"]:  ");

    for(int j=0; (4) j++)

    {

    System.out.print(b[i][j]+" ");

     (5) 

    }

    System.out.println();

    }

    System.out.println("sum="+sum);

    }

     }

  4. ●试题四

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

    【说明4.1】

    假设两个队列共享一个循环向量空间(如图1-2所示),其类型Queue2定义如下:

    typedef struct{

    DateType data[MaxSize];

    int front[2],rear[2];

    }Queue2;

    对于i=0或1,front[i]和rear[i]分别为第i个队列的头指针和尾指针。函数EnQueue(Queue2*Q,int i,DateType x)的功能是实现第i个队列的入队操作。

    【函数4.1】

    int EnQueue(Queue2*Q,int i,DateType x)

    {∥若第i个队列不满,则元素x入队列,并返回1;否则,返回0

    if(i<0‖i>1)return 0;

    if(Q->rear[i]==Q->front[ (1) ]

    return 0;

    Q->data[ (2) ]=x;

    Q->rear[i]=[ (3) ];

    return 1;

    }

    【说明4.2】

    函数BTreeEqual(BinTreeNode*T1,BinTreeNode*T2)的功能是递归法判断两棵二叉树是否相等,若相等则返回1,否则返回0。函数中参数T1和T2分别为指向这两棵二叉树根结点的指针。当两棵树的结构完全相同,并且对应结点的值也相同时才被认为相等。

    已知二叉树中的结点类型BinTreeNode定义为:

    struct BinTreeNode{

    char data;

    BinTreeNode*left,*right;

    };

    其中data为结点值域,left和right分别为指向左、右子女结点的指针域,

    【函数4.2】

    int BTreeEqual(BinTreeNode*T1,BinTreeNode*T2)

    {

    if(T1==NULL&&T2==NULL)return 1;∥若两棵树均为空,则相等

    else if( (4) )return 0;∥若一棵为空一棵不为空,则不等

    else if( (5) )return 1;∥若根结点值相等并且左、右子树

    ∥也相等,则两棵树相等,否则不等

    else return 0;

    }

  5. ●试题五

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

    【应用说明5.1】

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

    【程序代码5.1】

    Private Sub Combol_Click()

    Txt1.Text=Combol. (1) 

    Txt2.Text=Combol. (2) 

    End Sub

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

    【应用说明5.2】

    本应用程序的运行窗口如图2所示。

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

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

    【程序代码5.2】

    Private Sub CmbOp_Click()

    Dim DataIn As Double,DataOut as Double

    DataIn= (3) 

    Select Case (4) 

    Case″取整数部分″

    DataOut=Int(DataIn)

    Case″求平方根″

    If DataIn<0 Then

    MagBox″负数不能开平方!″

    Else

    DataOut=Sqr(DataIn)

    End If

    Case″取绝对值″

    DataOut=Abs(DataIn)

     (5) 

    TxtOut.Text=str$(DataOut)

    End Sub

  6. ●试题三

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

    【说明】

    下面的程序功能的功能是以行为单位对字符串按下面的条件进行排序。排序条件为:从字符串中间一分为二,右边部分按字符的ASCⅡ值降序排序,排序后左边部分与右边部分进行交换。如果原字符串长度为奇数,则最中间的字符不参加排序,字符仍放在原位置上

    例如:位置:0 1 2 3 4 5 6 7

    源字符串:h g f e a b c d

    则处理后字符串:d c b a h g f e

    函数ReadDat()实现从文件in.dat中读取数据(每行字符串长度均小于80),函数WriteDat()把结果dat输出到文件out.dat中。

    【程序】

    #include

    #include

    #include

    char dat[20][80];

    void jsSort()

    {

    int i,j,k,strl;

    char ch;

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

    {

    strl=strlen(dat[i]);

    for(j= (1) ;j

    for(k=j+1;k<strl;k++)

    if( (2) )

    {

    ch=dat[i][j];

    dat[i][j]=dat[i][k];

    dat[i][k]=ch;

    }

    for(j=0; (3) j++)/*前后两部分进行交换*/

    {

    ch=dat[i][j];

    dat[i][j]=dat[i][(strl+1)/2+j];

    dat[i][(strl+1)/2+j]=ch;

    }

    }

    }

    void main()

    {

    readDat();

    jsSort();

    writeDat();

    }

    readDat()

    {

    FILE*in;

    int i=0;

    char*p;

     (4) ;

    while(i<20&&fgets(dat[i],80,in)!=NULL)

    {

    p=strchr(dat[i],"\n");

    if(p)*p=0;

    i++;

    }

    fclose(in);

    }

    writeDat()

    {

    FILE*out;

    int i;

    clrscr();

    out=fopen("out.dat","W");

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

    {

    printf("%s\n",dat[i]);

    printf( (5) );

    }

    fclose(out);

    }

  7. ●试题二

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

    【说明】

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

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

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

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

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

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

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

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

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

    【程序】

    # include

    # define MaxNum50

    # define BASE 800/*免税金额基数*/

    int paylevel[]={0,500,2000,5000,20000,40000,60000,80000,100000,1000001};

    int taxPrate[]={5,10,15,20,25,30,35,40,45};/*税率表*/

    typedef struct{

    int Id;/*职工的工号*/

    long Salary;/*职工的工资*/

    }Info;

    /*查找工号为Id的职工在数组employee中的下标,返回值为0表示没有*/

    int find (int Id,Info employee[],int m){

    int j;

    employee[0].Id=Id;

    for(j=m; (1) ;j--);

    return j;

    }

    void main(void)

    {Info employee[MaxNum+1];

    long Wage;

    double sum=0,K,S;

    int i,j,N=0,Code;

    scanf(″%d %ld″,&Code,&Wage);/*读入职工号、工资或薪金*/

    while(Code>0){

    i=find(Code,empolyee,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);

    }

  8. ●试题一

    阅读下列说明和流程图,将应填入(n)的语句写在答题纸的对应栏内。

    【流程图】

    图1

    下面的流程图描述了对16位二进制整数求补的算法。计算过程是:从二进制数的低位(最右位)开始,依次向高位逐位查看,直到首次遇到"1"时,停止查看。然后,对该"1"位左面的更高位(如果有的话),逐位求反,所得的结果就是对原二进制数求补的结果。

    例如:对二进制整数10111001 10101000求补的结果是01000110 01011000。

    设16位二进制整数中的各位,从低位到高位,依次存放在整型数组BIT的BIT[1]~BIT[16]中。例如,二进制整数10111001 10101000存放在数组BIT后,就有BIT1[1]=0,BIT[2]=0,……,BIT[15]=0,BIT[16]=1。

    流程图(如图1所示)中 (1) 处按"循环变量名:循环初值,增量,循环终值"格式描述。若流程图中存在空操作,则用NOP表示。