2016年計算機等級考試二級《C++》基礎(chǔ)練習(xí)題

字號:


    1[單選題]下列關(guān)于面向?qū)ο蟾拍畹拿枋鲋?,錯誤的是(  )。
    A.面向?qū)ο蠓椒ū让嫦蜻^程方法更加先進
    B.面向?qū)ο蠓椒ㄖ惺褂昧艘恍┟嫦蜻^程方法中沒有的概念
    C.面向?qū)ο蠓椒ㄌ娲私Y(jié)構(gòu)化程序設(shè)計方法
    D.面向?qū)ο蟪绦蛟O(shè)計方法要使用面向?qū)ο蟮某绦蛟O(shè)計語言
    參考答案:C
    2[簡答題] 有以下兩個程序,分析它們的執(zhí)行結(jié)果有什么不同。
    程序1:
    #include
    class Point
    {
    int x,y;
    public:
    Point(){x=y=0;}
    Point(int i,int j){x=i;y=j;}
    Point operator+(Point);
    void disp() ( cout<<”(”<
    }
    Point Point::operator+(Point P)
    {
    this->x+=P.x; this->y+=p.y;
    return *this;
    }
    void main()
    {
    Point pl(2,3),p2(3,4),p3;
    cout<<”p1:”;p1.disp();
    cout<<”p2:”;p2.disp();
    p3=pl+p2;
    cout<<”執(zhí)行p3=p1+p2后”<
    cout<<”p1:”,p1.disp();
    cout<<”p2:”;p2.disp();
    cout<<”p3:”;p3.disp();
    }
    程序2:
    #include
    class Point{
    int x,Y;
    public:
    Point(){x=y=O;}
    Point(int i,int j){x=i,y=j;}
    Point operator+(Point);
    void disp f){cout<< ”(”<
    }
    Point Point::operator+(Point P)
    {
    Point s;
    s.x=x+p.x; s.y=y+p.y;
    return s;
    }
    void main()
    {
    Point pl(2,3),p2(3,4),p3;
    cout<<”p1:”;p1.disp();
    cout<<”p2:”;p2.disp();
    p3=pl+p2;
    cout<<”執(zhí)行p3=p1+p2后”<
    cout<<”p1:”;p1.disp();
    cout<<”p2:”;p2.disp();
    cout<<”p3:”;p3.disp();
    }
    參考解析:這兩個程序中的main函數(shù)完全相同,類Point中的運算符重載均采用成員函數(shù)方式實現(xiàn),只是程序1的運算符重載函數(shù)使用this指針,而程序2的運算符重載函數(shù)使用局部對象。
    p3=p1+p2 等價于p3=p1.operator+(p2)。對于程序1,this指針指向p1對象,執(zhí)行this->x+=p.x;this->y十一 p.y;語句,修改p l對象的x和y成員值,執(zhí)行return*this;語句,將pl對象賦給p3。所以p1和p3兩個對象的x、Y值相同,即p3=pl+p2等價于 p1=p1+p2,p3:p1,其運行結(jié)果如下:
    p1:(2,3)
    p2:(3,4)
    執(zhí)行p3=pl+p2后
    P1:(5,7)
    p2:(3,4)
    P3:(5,7)
    對于程序2,執(zhí)行運算符重載函數(shù),Point s;語句定義一個對象,s.x=x+p.x;s.y=y+p.y;語句用于修改s對象的x、Y值,ret%il~l s;語句返回該對象,賦給p3,而p1和p2對象不改變。其運行結(jié)果如下:
    p1:(2,3)
    p2:(3,4)
    執(zhí)行p3=pl+p2后
    p1:(2,3)
    p2:(3,4)
    p3:(5,7)第
    3[單選題]C++語言對C語言做了很多改進,C++語言相對于C語言的最根本的變化是
    A.增加了一些新的運算符
    B.允許函數(shù)重載,并允許設(shè)置缺省參數(shù)
    C.規(guī)定函數(shù)說明符必須用原型
    D.引進了類和對象的概念
    參考答案:D
    4[單選題] 若x和y是程序中的兩個整型變量,則下列if語句中正確的是(  )。
    A.if(x==O)y=1;elsey=2;
    B.if(x==0)theny=1elsey=2
    C.if(x==O)y=1elsey=2;
    D.ifx==0y=1elsey=2;
    參考答案:A
    參考解析:if…else語句的格式“if(<條件>)<語句1>else<語句2>”注意語句結(jié)束要以分號結(jié)尾,對照題中選項可知A正確。
    5[單選題]
    

    A.3B.4C.5D.6
    參考答案:C
    參考解析:
    

    

    6[單選題]友元函數(shù)的作用是(  )。
    A.提高程序的效率
    B.加強類的封裝性
    C.實現(xiàn)數(shù)據(jù)的隱蔽性
    D.增加成員函數(shù)的種類
    參考答案:A
    參考解析:友元函數(shù)的引入是為了提高程序的效率,減少通過接口訪問的限制,但卻破壞了類的封裝性。
    7[單選題]下列描述中,錯誤的是(  )。
    A.公有繼承時基類中的公有成員在派生類中仍是公有成員
    B.公有繼承時基類中的保護成員在派生類中仍是保護成員
    C.保護繼承時基類中的公有成員在派生類中仍是公有成員
    D.保護繼承時基類中的保護成員在派生類中仍是保護成員
    參考答案:C
    參考解析:保護繼承時基類中的公有成員在派生類中是保護成員。
    8[單選題] 下列關(guān)于C++函數(shù)的說明中,正確的是(  )。
    A.內(nèi)聯(lián)函數(shù)就是定義在另一個函數(shù)體內(nèi)部的函數(shù)
    B.函數(shù)體的最后一條語句必須是return語句
    C.標準C++要求在調(diào)用一個函數(shù)之前,必須先聲明其原型
    D.編譯器會根據(jù)函數(shù)的返回值數(shù)型和參數(shù)表來區(qū)分函數(shù)的不同重載形式
    參考答案:C
    參考解析:內(nèi)聯(lián)函數(shù)不是定義在另一個函數(shù)體內(nèi)部的函數(shù),而是將inline放在函數(shù)定義中函數(shù)類型之前;函數(shù)體的最后一條語句可以是任意的語句;編譯器不會根據(jù)函數(shù)返回值的類型來區(qū)分重載形式,選項D錯誤。標準C++要求在調(diào)用一個函數(shù)之前,必須先聲明其原型。
    9[簡答題]使用VC++6.0打開考生文件夾下的源程序文件1.cpp,該程序運行時有錯,請改正其中的錯誤,使程序正常運行,即使程序在屏幕輸出以下類似內(nèi)容:
    0012FF6810012FF3C5
    0012FF6C20012FF444
    0012FF7030012FF4C3
    0023FF7440012FF542
    0012FF7850012FF5C1
    006AFDCC~006AFDEF數(shù)據(jù)可能因為機器的不同,程序輸出的內(nèi)容會有差異。只要相差為4的連續(xù)地址即可。
    注意:不要改動main函數(shù),不能增加或刪除行,也不能更改程序的結(jié)構(gòu),錯誤的語句在//******error******的下面。
    試題程序:
    #include
    usingnamespacestd;
    intmain()
    {
    int*P,a[5]={1,2,3,4,5};
    double*q,b[5]={5.0,4.0,3.0,2.0,1.0);
    intx;
    P=a;
    q=b;
    //********error********
    for(x=0;x<=5;X++)
    //********error********
    cout<
    (q+x)<
    return0;
    }
    參考解析:
    (1)應(yīng)改為“for(x=0;x<5;x++)”。
    (2)應(yīng)改為“cout<
    【解析】本題中根據(jù)數(shù)組a、b的定義。它們都有5個元素,而第1處的“for(x=0;x<=5;x++)”循環(huán)了6次,應(yīng)該是5次,所以在第1處將其修改為“for(x=0;x<5;x++)”;第2處的P變量為指針型變量,p+x為糯向數(shù)組中第X個元素的地址,這里要輸出的是存儲單元的內(nèi)容,所以使用“*”指針元素符,即修改為“cout<
    11[填空題]在C++中,三種派生方式的說明符號為(  )、(  )、(  )不加說明,則默認的派生方式為(  )。
    參考解析:public 、private 、 protected、private
    12[單選題]線性表常采用的兩種存儲結(jié)構(gòu)是(  )。
    A.順序存儲結(jié)構(gòu)和鏈式存儲結(jié)構(gòu)
    B.散列方法和索引方式
    C.鏈表存儲結(jié)構(gòu)和數(shù)組
    D.線性存儲結(jié)構(gòu)和非線性存儲結(jié)構(gòu)
    參考答案:A
    參考解析:線性表的存儲通常要用兩種存儲結(jié)構(gòu):順序存儲結(jié)構(gòu)和鏈式存儲結(jié)構(gòu)。
    13[單選題]下列程序段執(zhí)行后,j值是(  )。
    for(int i(0), j(0); i<10; i++)
    if(i) j++;
    A.0 B.9C.10 D.無限
    參考答案:B
    14[單選題]有以下程序,執(zhí)行后輸出結(jié)果是(  )。
    

    A.3,4,5 B.5,3,4 C.5,4,3 D.4,3,5
    參考答案:D
    參考解析:考生根據(jù)分析可以得知f函數(shù)的功能是交換兩個變量的值。表明看起來,在main函數(shù)中,使用三次f函數(shù)完成三個變量的交換。真的如此么?只要考生注意到f函數(shù)采用值傳遞,而值傳遞的缺點就是不會改變形參的值,因此,上述操作根本無法改變原來三個變量的值!故三個變量的值依然保持不變。
    15[單選題] 已知類A有公用數(shù)據(jù)成員a,并重載了=運算符,且有Aobj2;constA*ptr=newA;,則下列語句錯誤的是(  )。
    A.ptr->a=100;B.ptr=&obj2;C.ptr++;D.obj2=*ptr;
    參考答案:A
    參考解析:本題考查const修飾符的作用。注意,const位置不同,其修飾的部分也是不同的。本題中const修飾的是ptr所指的對象本身,所以,ptr可以重新指向新的對象,而ptr->a則無法被更新。
    16[單選題]下列函數(shù)的運行結(jié)果是(  )。
    

    A.25B.30C.20D.15
    參考答案:A
    參考解析:
    

    17[單選題] 對于循環(huán)隊列,下列敘述中正確的是(  )。
    A.隊頭指針是固定不變的
    B.隊頭指針一定大于隊尾指針
    C.隊頭指針一定小于隊尾指針
    D.隊頭指針可以大于隊尾指針,也可以小于隊尾指針
    參考答案:D
    參考解析:所謂循環(huán)隊列,就是將隊列存儲空間的最后一個位置繞到第一個位置,形成邏輯上的環(huán)狀空間,供隊列循環(huán)使用。在循環(huán)隊列結(jié)構(gòu)中,當(dāng)存儲空間的最后一個位置已被使用而再要進行入隊運算時,只要存儲空間的第一個位置空閑,可將元素加入到第一個位置,即將存儲空閑的第一個位置作為隊尾。
    18[單選題]以下程序的輸出結(jié)果是(  )。
    

    A.1234B.123C.12D.1
    參考答案:B
    參考解析:本題考察的是循環(huán)次數(shù)的判定。有while后的邏輯表達式可知,整個循環(huán)體需要執(zhí)行3次,故可直接選定正確答案為B。
    19[填空題]十進制28和3.6的類型分別是_______。
    參考解析:int和double
    【解析】整型和雙精度型。注意除非定義了float變量。實型常量隱含為 double型。
    20[簡答題]請使用VC6或使用【答題】菜單打開考生文件夾prosS下的工程pr093,其中包含了類TaxCaleulator(“個稅計算器”)和主函數(shù)main的定義。創(chuàng)建“個稅計算器”需要接收稅率表信息和起征額信息。在main函數(shù)中,通過兩個數(shù)組創(chuàng)建了如下的稅率表:
    

    利用這個稅率表創(chuàng)建“個稅計算器”時,假定起征額為2 000元(即不超過2 000元的所得不征收個人所得稅)。請補充完成計算應(yīng)納個人所得稅額的成員函數(shù)getTaxPayable,其中的參數(shù)income為月收入。此程序的正確輸出結(jié)果應(yīng)為:
    月收入為800元時應(yīng)繳納個人所得稅0元
    月收入為l 800元時應(yīng)繳納個人所得稅0元月收入為2 800元時應(yīng)繳納個人所得稅 55元 月收入為3 800元時應(yīng)繳納個人所得稅l55元
    月收入為4 800元時應(yīng)繳納個人所得稅295元月收入為5 800元時應(yīng)繳納個人所得稅455元
    注意:只能在函數(shù)9etTaxPayable中的“//**********333**********”和“//**********666**********”之間
    填人若干語句,不要改動程序中的其他內(nèi)容。 //Tax Calculator.h #include #include
    using flamespace std; class TaxCalculator{ public:
    TaxCalculator(double the—limits[],double the_rates[],int the—length,double the_threshold) :lower_limits(new double[the_length]),rates(new double[the—length]),
    list_len(the_length),threshold(the—threshold){ for(int i=0;i
    lower_limits[i]=the_limits[i]; rates[i]=the_rates[i];
    } f
    —TaxCalculator(){delete[]lower_limits;delete[]rates;}
    double getTaxPayable(double income)eonst;//返回指定月收入的應(yīng)納個人所得稅額 void showTaxPayable(double income)const;//顯示指定月收入的應(yīng)納個人所得稅額 private:
    double$lower—limits;//適用收入段下限 double *rates; //適用稅率
    int list—len;//稅率表項數(shù)
    double threshold; //起征額 };
    void writeToFile(consl char * path); //TaxCalcnlator.cpp
    ‘#include”TaxCalculator.h”
    double TaxCalculator::getTaxPayable(double income)const{ double taxable=income—threshold;
    //應(yīng)納稅工資額
    double tax_payable=0.0; //應(yīng)納個人所得稅額
    int i=list_len-1;
    //從稅率表的適用段開始計算 while(i>=0){
    //**********333**********
    //**********666**********
    --i; }
    return tax_payable;
    } void TaxCalculator::showTaxPayable(double income)const{
    cout<<”月收入為”<
    }
    //main.cpp
    #include”TaxCalculator.h” int main(){
    double limits[]={0.0,500.0,2000.0,5000.0,20000.0,40000.0,60000.0,80000。0,100000.0}; double rates[]={0.05,0.1,0.15,0.2,0.25,0.3,O.35,0.4,0.45};
    TaxCaleulator calc(1imits,rates,9,2000.0); calc.showTaxPayable(800.0);
    calc.showTaLPayable(1800.0); cale.showTaxPayable(2800.0); calc.showTaxPayable(3800.0); calc.showTaxPayable(4800.0); eaie.showTaxPayable(5800.0); writeToFile(””);
    return 0;
    }
    參考解析:
    if f income<=2000)//如果收入小于2000
    return tax—payable;
    //直接tex—payable(初始代為零)
    i“taxable>lower_limits[i]){
    //如果taxable(收入超出起征額的部分)大于lower—limits
    [i]階段最低限額
    tax_payable+=(taxable-lower-limits[i])*
    rates[i]:
    //把起過階段最低限額的部分乘以該階段的稅率后,加到tax_payable(個人所得稅)
    taxable=lower_limits[i];
    //把fower_limits[i]賦值于taxable
    }