全國計(jì)算機(jī)等級考試二級筆試樣卷C++語言程序設(shè)計(jì)

字號:

 
    一、選擇題((1)~(35)每小題2分,共70分)
    下列各題A)、B)、C)、D)四個(gè)選項(xiàng)中,只有一個(gè)選項(xiàng)是正確的,請將正確選項(xiàng)涂寫在答題卡相應(yīng)位置上,答在試卷上不得分。
     
    (1)下列選項(xiàng)中不符合良好程序設(shè)計(jì)風(fēng)格的是
    A)源程序要文檔化       B)數(shù)據(jù)說明的次序要規(guī)范化
    C)避免濫用goto語句    D)模塊設(shè)計(jì)要保證高耦合、高內(nèi)聚
     
    (2)從工程管理角度,軟件設(shè)計(jì)一般分為兩步完成,它們是
    A)概要設(shè)計(jì)與詳細(xì)設(shè)計(jì)   B)數(shù)據(jù)設(shè)計(jì)與接口設(shè)計(jì)
    C)軟件結(jié)構(gòu)設(shè)計(jì)與數(shù)據(jù)設(shè)計(jì)   D)過程設(shè)計(jì)與數(shù)據(jù)設(shè)計(jì)
     
    (3)下列選項(xiàng)中不屬于軟件生命周期開發(fā)階段任務(wù)的是
        A)軟件測試     B)概要設(shè)計(jì) C)軟件維護(hù) D)詳細(xì)設(shè)計(jì)
     
    (4)在數(shù)據(jù)庫系統(tǒng)中,用戶所見的數(shù)據(jù)模式為
        A)概念模式 B)外模式   C)內(nèi)模式   D)物理模式
     
    (5)數(shù)據(jù)庫設(shè)計(jì)的四個(gè)階段是:需求分析、概念設(shè)計(jì)、邏輯設(shè)計(jì)和
    A)編碼設(shè)計(jì) B)測試階段 C)運(yùn)行階段 D)物理設(shè)計(jì)
     
    (6)設(shè)有如下三個(gè)關(guān)系表
    

      
    

    R
    

     
    

    S
    

     
    

     
    

    T
    

     
    

     
    

     
    

    A
    

     
    

    B
    

    C
    

     
    

    A
    

    B
    

    C
    

     
    

     
    

    m
    

     
    

    1
    

    3
    

     
    

    m
    

    1
    

    3
    

     
    

     
    

    n
    

     
    

     
    

     
    

     
    

    n
    

    1
    

    3
    

     
    

     
    

     
    

     
    

     
    

     
    

     
    

     
    

     
    

     
    

     
    

    下列操作中正確的是
    A)T=R∩S      B)T=R∪S
    C)T=R×S      D)T=R/S
     
    (7)下列敘述中正確的是
        A)一個(gè)算法的空間復(fù)雜度大,則其時(shí)間復(fù)雜度也必定大
        B)一個(gè)算法的空間復(fù)雜度大,則其時(shí)間復(fù)雜度必定小
        C)一個(gè)算法的時(shí)間復(fù)雜度大,則其空間復(fù)雜度必定小
    D)上述三種說法都不對
     
    (8)在長度為64的有序線性表中進(jìn)行順序查找,最壞情況下需要比較的次數(shù)為
    A)63   B)64   C)6    D)7
     
    (9)數(shù)據(jù)庫技術(shù)的根本目標(biāo)是要解決數(shù)據(jù)的
    A)存儲問題 B)共享問題 C)安全問題         D)保護(hù)問題
     
    (10)對下列二叉樹
    進(jìn)行中序遍歷的結(jié)果是
    A)ACBDFEG  B)ACBDFGE  C)ABDCGEF  D)FCADBEG
     
    (11)下列有關(guān)內(nèi)聯(lián)函數(shù)的敘述中,正確的是
    A)內(nèi)聯(lián)函數(shù)在調(diào)用時(shí)發(fā)生控制轉(zhuǎn)移
        B)內(nèi)聯(lián)函數(shù)必須通過關(guān)鍵字inline來定義
        C)內(nèi)聯(lián)函數(shù)是通過編譯器來實(shí)現(xiàn)的
        D)內(nèi)聯(lián)函數(shù)函數(shù)體的最后一條語句必須是return語句
     
    (12)下列情況中,不會調(diào)用拷貝構(gòu)造函數(shù)的是
        A)用一個(gè)對象去初始化同一類的另一個(gè)新對象時(shí)
        B)將類的一個(gè)對象賦值給該類的另一個(gè)對象時(shí)
        C)函數(shù)的形參是類的對象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時(shí)
        D)函數(shù)的返回值是類的對象,函數(shù)執(zhí)行返回調(diào)用時(shí)
     
    (13)下列有關(guān)繼承和派生的敘述中,正確的是
    A)如果一個(gè)派生類私有繼承其基類,則該派生類對象不能訪問基類的保護(hù)成員
    B)派生類的成員函數(shù)可以訪問基類的所有成員
    C)基類對象可以賦值給派生類對象
    D)如果派生類沒有實(shí)現(xiàn)基類的一個(gè)純虛函數(shù),則該派生類是一個(gè)抽象類
     
    (14)下列運(yùn)算符不能重載為友元函數(shù)的是
        A)=  ()  [ ]  ->                      B)+  -  ++  -- 
        C)>  <  >=  <=                         D)+=  -=  *=  /=
     
    (15)關(guān)于在調(diào)用模板函數(shù)時(shí)模板實(shí)參的使用,下列表述正確的是
    A)對于虛擬類型參數(shù)所對應(yīng)的模板實(shí)參,如果能從模板函數(shù)的實(shí)參中獲得相同的信息,則都可以省略
    B)對于虛擬類型參數(shù)所對應(yīng)的模板實(shí)參,如果它們是參數(shù)表中的最后的若干個(gè)參數(shù),則都可以省略
    C)對于虛擬類型參數(shù)所對應(yīng)的模板實(shí)參,若能夠省略則必須省略
    D)對于常規(guī)參數(shù)所對應(yīng)的模板實(shí)參,任何情況下都不能省略
     
    (16)下列關(guān)于輸入流類成員函數(shù)getline()的描述中,錯(cuò)誤的是
        A)該函數(shù)是用來讀取鍵盤輸入的字符串的
        B)該函數(shù)讀取的字符串長度是受限制的
        C)該函數(shù)讀取字符串時(shí),遇到終止符便停止
        D)該函數(shù)讀取字符串時(shí),可以包含空格
     
    (17)下列符號中,正確的C++標(biāo)識符是
    A)enum B)2b   C)foo-9    D)_32
     
    (18)下列語句中,錯(cuò)誤的是
        A)const int buffer=256;    B)const double *point;
        C)int const buffer=256;    D)double * const point;
     
    (19)if語句的語法格式可描述為:
        格式1:if(<條件>) <語句>
    或
        格式2:if(<條件>) <語句1> else <語句2>
    關(guān)于上面的語法格式,下列表述中錯(cuò)誤的是
        A)<條件>部分可以是一個(gè)if語句,例如if(if(a==0) …) …
        B)<語句>部分可以是一個(gè)if語句,例如if(…) if(…) …
        C)如果在<條件>前加上邏輯非運(yùn)算符!并交換 <語句1> 和 <語句2> 的位置,語句功能不變
        D)<語句>部分可以是一個(gè)循環(huán)語句,例如if(…) while(…) …
     
    (20)有如下說明
        int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
    則數(shù)值為9的表達(dá)式是
        A)*p+9 B)*(p+8)   C)*p+=9            D)p+8
     
    (21)若有下面的函數(shù)調(diào)用:
    fun(a+b, 3, max(n-1, b))
    則fun的實(shí)參個(gè)數(shù)是
        A)3    B)4    C)5        D)6
     
    (22)以下關(guān)鍵字不能用來聲明類的訪問權(quán)限的是
        A)public   B)static   C)protected        D)private
     
    (23)在公有繼承的情況下,允許派生類直接訪問的基類成員包括
        A)公有成員     B)公有成員和保護(hù)成員  
        C)公有成員、保護(hù)成員和私有成員 D)保護(hù)成員
     
    (24)關(guān)于運(yùn)算符重載,下列表述中正確的是
        A)C++已有的任何運(yùn)算符都可以重載
    B)運(yùn)算符函數(shù)的返回類型不能聲明為基本數(shù)據(jù)類型
    C)在類型轉(zhuǎn)換符函數(shù)的定義中不需要聲明返回類型
    D)可以通過運(yùn)算符重載來創(chuàng)建C++中原來沒有的運(yùn)算符
     
    (25)關(guān)于關(guān)鍵字class和typename,下列表述中正確的是
        A)程序中的typename都可以替換為class
            B)程序中的class都可以替換為typename  
        C)在模板形參表中只能用typename來聲明參數(shù)的類型
        D)在模板形參表中只能用class或typename來聲明參數(shù)的類型
     
    (26)有如下程序
    #include
    #include
    using namespace std;
    int main( ){
        cout<        cout<<12.345<<___________<<34.567;
        return 0;
    }
    若程序的輸出是:
    **12.345**34.567
    則程序中下劃線處遺漏的操作符是     
        A)setprecision(3)  B)fixed    C)setfill('*')     D)setw(8)
     
    (27)有如下程序
    #include
    #include
    using namespace std;
    class MyClass{
    public:
        MyClass( ){ cout<<'A'; }
        MyClass(char c){ cout<        ~MyClass( ){ cout<<'B'; }
    };
    int main( ){
        MyClass p1,*p2;
        p2=new MyClass('X');
        delete p2 ;
        return 0;
    }
    執(zhí)行這個(gè)程序屏幕上將顯示輸出
     A)ABX         B)ABXB         C)AXB              D)AXBB
     
    (28)有如下程序
    #include
    using namespace std;
    int i=1;
    class Fun{
    public:
        static int i;
        int value( ){ return i-1;}
        int value( )const{ return i+1;}
    };
    int Fun::i=2;
    int main( ){
        int i=3;
        Fun fun1;
        const Fun fun2;
        ____________
        return 0;
    }
    若程序的輸出結(jié)果是:
    123
    則程序中下劃線處遺漏的語句是
    A)cout<
    B)cout<
    C)cout<
    D)cout<
     
    (29)有如下程序:
    #include
    using namespace std;
    class Obj{
       static int i;
    public:
       Obj( ){ i++; }
       ~Obj( ){ i--; }
        static int getVal( ){ return i;}
    };
    int Obj::i=0;
    void f(){Obj ob2; cout<int main( ){
        Obj ob1;
        f( );
        Obj *ob3=new Obj; cout<getVal( );
        delete ob3; cout<    return 0;
    }
    程序的輸出結(jié)果是
    A)232  B)231  C)222  D)221
     
    (30)有如下程序
    #include
    using namespace std;
    class Base {
    protected:
        Base( ){ cout<<'A'; }
        Base(char c){ cout<    };
    class Derived: public Base{
    public:
        Derived( char c ){ cout<    };
    int main( ){
        Derived d1('B');
        return 0;
    }
    執(zhí)行這個(gè)程序屏幕上將顯示輸出
        A)B    B)BA   C)AB       D)BB
     
    (31)有如下類定義:
    class MyBase{
       int k;
    public:
       MyBase(int n=0):k(n){ }
       int value( )const{ return k;}
    };
    class MyDerived: MyBase{
       int j;
    public:
       MyDerived(int i): j(i) {}
       int getK( )const{ return k; }
       int getJ( )const{ return j; }
    };
    編譯時(shí)發(fā)現(xiàn)有一處語法錯(cuò)誤,對這個(gè)錯(cuò)誤最準(zhǔn)確的描述是
        A)函數(shù)getK試圖訪問基類的私有成員變量k
        B) 在類MyDerived的定義中,基類名MyBase前缺少關(guān)鍵字public、protected或private
        C)類MyDerived 缺少一個(gè)無參的構(gòu)造函數(shù)  
        D)類MyDerived的構(gòu)造函數(shù)沒有對基類數(shù)據(jù)成員k進(jìn)行初始化
     
    (32)在一個(gè)派生類對象結(jié)束其生命周期時(shí)
    A)先調(diào)用派生類的析構(gòu)函數(shù)后調(diào)用基類的析構(gòu)函數(shù)      
    B)先調(diào)用基類的析構(gòu)函數(shù)后調(diào)用派生類的析構(gòu)函數(shù)  
    C)如果基類沒有定義析構(gòu)函數(shù),則只調(diào)用派生類的析構(gòu)函數(shù)  
    D)如果派生類沒有定義析構(gòu)函數(shù),則只調(diào)用基類的析構(gòu)函數(shù)
     
    (33)有如下的運(yùn)算符重載函數(shù)定義:
    double operator +(int i, int k){ return double(i+k); }
    但定義有錯(cuò)誤,對這個(gè)錯(cuò)誤最準(zhǔn)確的描述是
    A)+ 只能作為成員函數(shù)重載,而這里的 + 是作為非成員函數(shù)重載的
        B)兩個(gè)int型參數(shù)的和也應(yīng)該是int型,而這里將 + 的返回類型聲明為double  C)沒有將運(yùn)算符重載函數(shù)聲明為某個(gè)類的友元
        D)C++已經(jīng)提供了求兩個(gè)int型數(shù)據(jù)之和的運(yùn)算符 +,不能再定義同樣的運(yùn)算符
     
    (34)語句ofstream f("SALARY.DAT", ios_base::app); 的功能是建立流對象f,并試圖打開文件SALARY.DAT與f關(guān)聯(lián),而且
            A)若文件存在,將其置為空文件;若文件不存在,打開失敗
        B)若文件存在,將文件指針定位于文件尾;若文件不存在,建立一個(gè)新文件
        C)若文件存在,將文件指針定位于文件首;若文件不存在,打開失敗
        D)若文件存在,打開失??;若文件不存在,建立一個(gè)新文件
     
    (35)有如下程序
    #include
    using namespace std;
    class A{
    public:
        virtual void func1( ){ cout<<"A1"; }
        void func2( ){ cout<<"A2"; }
    };
    class B:public A{
    public:
        void func1( ){ cout<<"B1"; }
        void func2( ){ cout<<"B2"; }
    };
    int main( ){
        A *p=new B;
        p->func1( );
        p->func2( );
        return 0;
    }
    運(yùn)行此程序,屏幕上將顯示輸出
        A) B1B2     B) A1A2 C) B1A2 D) A1B2
     
    二、填空題(每空2分,共30分)
        請將每一個(gè)空的正確答案寫在答題卡【1】~【15】序號的橫線上,答在試卷上不得分。
     
    (1)下列軟件系統(tǒng)結(jié)構(gòu)圖
    的寬度為  【1】 
     
    (2)  【2】  的任務(wù)是診斷和改正程序中的錯(cuò)誤。
     
    (3)一個(gè)關(guān)系表的行稱為   【3】   。
     
    (4)按“先進(jìn)后出”原則組織數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是   【4】    。
     
    (5)數(shù)據(jù)結(jié)構(gòu)分為線性結(jié)構(gòu)和非線性結(jié)構(gòu),帶鏈的隊(duì)列屬于  【5】    。
     
    (6)若有定義語句:int* a, b;,則變量b的數(shù)據(jù)類型是   【6】  。
    (7)已知數(shù)組a中的元素個(gè)數(shù)為n,下列語句的作用是將下標(biāo)為i的元素移動(dòng)到下標(biāo)為
    i1的單元,其中1≤in。例如,當(dāng)n=4,a中原有數(shù)據(jù)為1,2,3,4時(shí),則移動(dòng)后a中元素變?yōu)?,3,4,4。請將語句補(bǔ)充完整:
        for (int i=0; i  【7】  ];
     
    (8)已知遞歸函數(shù)f的定義如下:
    int f(int n)
    {
         if (n <= 1) return 1;  //遞歸結(jié)束情況
         else return n * f(n-2); //遞歸}
    則函數(shù)調(diào)用語句f(5)的返回值是  【8】  。
     
    (9)創(chuàng)建對象數(shù)組時(shí),對數(shù)組的每一個(gè)元素都將調(diào)用一次構(gòu)造函數(shù),如果沒有顯式給出數(shù)組元素的初值,則調(diào)用缺省構(gòu)造函數(shù)。下列程序涉及到對象數(shù)組的創(chuàng)建和單個(gè)對象的創(chuàng)建,其輸出結(jié)果是  【9】  。
    #include
    using namespace std;
    class Foo {
    public:
        Foo(int x) { cout << 'A'; }
        Foo() {}
    };
    int main()
    {
        Foo f[3], g(3);
        return 0;
    }
     
    (10)已知下列程序的輸出結(jié)果是42,請將畫線處缺失的部分補(bǔ)充完整。
    #include
    using namespace std;
    class Foo {
        int value;
    public:
        Foo( ) : value(0) {}
        void setValue(int value)
        {  【10】   = value;  //給Foo的數(shù)據(jù)成員value賦值}
        void print( ) { cout << value; }
    };
    int main( )
    {
        Foo f;
        f.setValue(42);
        f.print();
        return 0;
    }
     
    (11)如果不使用多態(tài)機(jī)制,那么通過基類的指針雖然可以指向派生類對象,但是只能訪問從基類繼承的成員。下列程序沒有使用多態(tài)機(jī)制,其輸出結(jié)果是  【11】 
    #include
    using namespace std;
    class Base {
    public:
        void print ( ) { cout << 'B'; }};
    class Derived : public Base {
    public:
        void print ( ) { cout << 'D'; }};
    int main( )
    {
        Derived* pd = new Derived( );
        Base* pb = pd;
        pb->print( );
        pd->print( );
        delete pd;
        return 0;
    }
     
    (12)在聲明派生類時(shí),如果不顯式地給出繼承方式,缺省的類繼承方式是私有繼承private。已知有如下類定義:
    class Base {
    protected:
        void fun( ) {}
    };
    class Derived : Base { };
    則Base類中的成員函數(shù)fun(),在Derived類中的訪問權(quán)限是  12  (注意:要求填寫private、protected或public中的一項(xiàng))。
    (13)在MyClass類的定義中,對賦值運(yùn)算符=進(jìn)行重載。請將畫線處缺失的部分補(bǔ)充完整。
       【13】   MyClass::operator=(const MyClass& rhs)
    {
        if (this == &rhs) return *this;
        value = rhs.value;
        return *this;
    }
       
    (14)插入排序算法的主要思想是:每次從未排序序列中取出一個(gè)數(shù)據(jù),插入到已排序序列中的正確位置。InsertSort類的成員函數(shù)sort()實(shí)現(xiàn)了插入排序算法。請將畫線處缺失的部分補(bǔ)充完整。
    class InsertSort{
    public:
        InsertSort(int* a0, int n0) :a(a0), n(n0) {} //參數(shù)a0是某數(shù)組首地址,n是數(shù)組元素個(gè)數(shù)
        void sort( )
        {//此函數(shù)假設(shè)已排序序列初始化狀態(tài)只包含a[0],未排序序列初始為a[1]...a[n-1]
            for (int i=1; i
                int t=a[i];
                int j;
                for (  【14】  ; j>0; --j){
                    if (t>=a[j-1]) break;
                    a[j]=a[j-1];}
                a[j]=t;}}
    protected:
        int *a, n; //指針a用于存放數(shù)組首地址,n用于存放數(shù)組元素個(gè)數(shù)
    };
     
    (15)下列程序的輸出結(jié)果是  【15】  。
    #include
    using namespace std;
    class A {
        int a;
    public: 
        A():a(9){}
        virtual void print() const { cout<
    };
    class B : public A {
        char b;
    public:
        B( ){b='S';}
        void print( ) const { cout <
    };
    void show(A &x){ x.print();}
    int main()
    {   A d1,*p;
        B d2;
        p=&d2;
        d1.print();
        d2.print();
        p->print();
        show(d1);
        show(d2);
        return 0;}