2016年計(jì)算機(jī)二級(jí)考試C++過關(guān)練習(xí)題及答案

字號(hào):

1[簡(jiǎn)答題]定義內(nèi)聯(lián)函數(shù)實(shí)現(xiàn)求三個(gè)實(shí)數(shù)中的大值。
    參考解析:
    解:內(nèi)聯(lián)函數(shù)只適用于功能簡(jiǎn)單,代碼短小而又被重復(fù)使用的函數(shù)。函數(shù)體中包含復(fù)雜結(jié)構(gòu)控制語句,如switch、復(fù)雜if嵌套、while語句等,以及無法內(nèi)聯(lián)展開的遞歸函數(shù),都不能定義為內(nèi)聯(lián)函數(shù),即使定義,系統(tǒng)也將作為一般函數(shù)處理。
    #include
    inline max(int a,int b,int c){
    if(a>b&&a>c) return a;
    if(b>a&&b>c) return b;
    if(c>a&&c>b) return c;
    }
    void main(){
    cout<
    }
    2[簡(jiǎn)答題]設(shè)計(jì)一個(gè)單向鏈表類模板,節(jié)點(diǎn)數(shù)據(jù)域中數(shù)據(jù)從小到大排列,并設(shè)計(jì)插入、刪除節(jié)點(diǎn)的成員函數(shù)。
    參考解析:
    #include
    using namespace std;
    templateclass List;
    templateclass Node{
    T info; //數(shù)據(jù)域
    Node *link; //指針域
    public:
    Node(); //生成頭結(jié)點(diǎn)的構(gòu)造函數(shù)
    Node(const T & data);//生成一般結(jié)點(diǎn)的構(gòu)造函數(shù)
    friend class List;
    };
    template Node::Node(){link=NULL;}
    template Node::Node(const T & data){
    info=data;
    link=NULL;
    }
    //定義鏈表類
    templateclass List{
    Node *head; //鏈表頭指針和尾指針
    public:
    List(); //構(gòu)造函數(shù),生成頭結(jié)點(diǎn)(空鏈表)
    ~List(); //析構(gòu)函數(shù)
    void MakeEmpty(); //清空一個(gè)鏈表,只余表頭結(jié)點(diǎn)
    Node* Find(T data); //搜索數(shù)據(jù)域與data相同的結(jié)點(diǎn),返回該結(jié)點(diǎn)的地址
    void PrintList(); //打印鏈表的數(shù)據(jù)域
    void InsertOrder(Node *p); //按升序生成鏈表
    Node* CreatNode(T data); //創(chuàng)建一個(gè)結(jié)點(diǎn)(孤立結(jié)點(diǎn))
    Node* DeleteNode(Node* p); //刪除指定結(jié)點(diǎn)
    };
    templateList::List(){
    head=new Node(-9999);//頭結(jié)點(diǎn),小的數(shù)據(jù)從小到大插入
    }
    templateList::~List(){
    MakeEmpty();
    delete head;
    }
    templatevoid List::MakeEmpty(){
    Node *tempP;
    while(head->link!=NULL){
    tempP=head->link;
    head->link=tempP->link; //把頭結(jié)點(diǎn)后的第一個(gè)節(jié)點(diǎn)從鏈中脫離
    delete tempP; //刪除(釋放)脫離下來的結(jié)點(diǎn)
    }
    }
    template Node* List::Find(T data){
    Node *tempP=head->link;
    while(tempP!=NULL && tempP->info!=data) tempP=tempP->link;
    return tempP; //搜索成功返回該結(jié)點(diǎn)地址,不成功返回NULL
    }
    templatevoid List::PrintList(){
    Node* tempP=head->link;
    while(tempP!=NULL){
    cout
    tempP=tempP->link;
    }
    cout<
    }
    templatevoid List::InsertOrder(Node *p){
    Node *tempP=head,*tempQ=head; //tempQ指向tempP前面的一個(gè)節(jié)點(diǎn)
    while(tempP!=NULL){
    if(p->infoinfo)break; //找第一個(gè)比插入結(jié)點(diǎn)大的結(jié)點(diǎn),由tempP指向
    tempQ=tempP;
    tempP=tempP->link;
    }
    p->link=tempP;
    tempQ->link=p;
    }
    templateNode* List::CreatNode(T data){//建立新節(jié)點(diǎn)
    Node*tempP=new Node(data);
    return tempP;
    }
    templateNode* List::DeleteNode(Node* p){
    Node* tempP=head->link,*tempQ=head,*tempC;
    while(tempP!=NULL && tempP!=p){
    tempQ=tempP;
    tempP=tempP->link;
    }
    tempC=tempP;
    tempQ->link=tempP->link;
    return tempC;
    }
    int main(){
    Node * P1;
    List list1;
    int a[10]={20,12,0,-5,9,-18,6,11,5,3},i,j;
    for(i=0;i<10;i++){
    P1=list1.CreatNode(a[i]);
    list1.InsertOrder(P1);
    }
    list1.PrintList();
    cout<<"請(qǐng)輸入一個(gè)要求刪除的整數(shù)"<
    cin>>j;
    P1=list1.Find(j);
    if(P1!=NULL){
    P1=list1.DeleteNode(P1);
    delete P1;
    list1.PrintList();
    }
    else cout<<"未找到"<
    cout<<"請(qǐng)輸入一個(gè)要求插入的整數(shù)"<
    cin>>j;
    P1=list1.CreatNode(j);
    list1.InsertOrder(P1);
    list1.PrintList();
    list1.MakeEmpty();//清空list1
    list1.PrintList();
    return 0;
    }
    3[單選題] 下列關(guān)于虛函數(shù)與函數(shù)重載區(qū)別的敘述中不正確的是(  )。
    A.函數(shù)說明形式上不同
    B.函數(shù)允許非成員函數(shù)重載,虛函數(shù)只能是成員函數(shù)
    C.函數(shù)重載的調(diào)用依據(jù)參數(shù)和類型的差別,虛函數(shù)則依據(jù)對(duì)象
    D.函數(shù)重載的本體可以在類外定義,虛函數(shù)不可以
    參考答案:D
    參考解析:A項(xiàng)、B項(xiàng)、C項(xiàng)均為虛函數(shù)與函數(shù)重載的不同之處。但有一點(diǎn)它們是相同的:在類內(nèi)外定義均可。故D項(xiàng)錯(cuò)誤。
    4[單選題] 設(shè)有表示學(xué)生選課的3張表,學(xué)生S(學(xué)號(hào)、姓名、性別、年齡、身份證號(hào))、課程C(課號(hào)、課名)、選課SC(學(xué)號(hào)、課號(hào)、成績(jī)),則表SC的關(guān)鍵字(鍵或碼)為(  )。
    A.課號(hào)、成績(jī)B.學(xué)號(hào)、成績(jī)C.學(xué)號(hào)、課號(hào)D.學(xué)號(hào)、姓名、成績(jī)
    參考答案:C
    參考解析:關(guān)鍵字是指屬性或?qū)傩缘慕M合,其功能是地標(biāo)識(shí)一個(gè)元組或數(shù)據(jù),而SC中學(xué)號(hào)和課號(hào)的組合可以對(duì)元組進(jìn)行的標(biāo)識(shí)。
    6[單選題]執(zhí)行下列語句后,輸出結(jié)果為(  )。
    cout.put('s');
    cout<<'c'<<'a';
    A.ca
    B.sca
    C.s
    D.a
    參考答案:B
    7[單選題]在一棵二叉樹的前序遍歷、中序遍歷、后序遍歷所產(chǎn)生的序列中,所有葉結(jié)點(diǎn)的先后順( )。
    A.都不相同
    B.完全相同
    C.前序和中序相同,而與后序不同
    D.中序和后序相同,而與前序不同
    參考答案:B
    參考解析:對(duì)二叉樹的訪問有3種方式,其中任意的兩種可惟一確定一顆二叉樹,但無論是前序、后序還是中序遍歷二叉樹時(shí),其區(qū)別在于訪問根的先后次序不同,而訪問葉結(jié)點(diǎn)的順序完全相同。
    8[單選題] 下列語句都是程序運(yùn)行時(shí)的第一條輸出語句,其中一條語句的輸出效果與其他三條語句不同,該語句是(  )。
    A.cout<
    參考答案:D
    參考解析:setw(6)將輸出寬度設(shè)為6,如果位數(shù)不夠則在左邊補(bǔ)齊,因此該項(xiàng)輸出一定不會(huì)與其他三項(xiàng)一致。
    9[簡(jiǎn)答題]
    請(qǐng)使用VC6或使用【答題】菜單打開考生文件夾proj2下的工程proj2,此工程包含有一個(gè)源程序文件proj2.cpp,其中定義了Stack類和ArrayStack類。
    Stack是一個(gè)用于表示數(shù)據(jù)結(jié)構(gòu)“?!钡念悾瑮V械脑厥亲址蛿?shù)據(jù)。Stack為抽象類,它只定義了棧的用戶接口,如下所示:
    公有成員函數(shù) 功能
    push 入棧:在棧頂位置添加一個(gè)元素
    pop 退棧:取出并返回棧頂元素
    ArrayStack是Stack的派生類,它實(shí)現(xiàn)了Stack定義的接口。ArrayStack內(nèi)部使用動(dòng)態(tài)分配的字符數(shù)組作為棧元素的存儲(chǔ)空間。數(shù)據(jù)成員maxSize表示的是棧的大容量,top用于記錄棧頂?shù)奈恢?。成員函數(shù)push和pop分別實(shí)現(xiàn)具體的入棧和退棧操作。
    請(qǐng)?jiān)诔绦蛑械臋M線處填寫適當(dāng)?shù)拇a,然后刪除橫線,以實(shí)現(xiàn)上述功能。此程序的正確輸出結(jié)果應(yīng)為:
    a,b,C
    C,b,a
    注意:只在指定位置編寫適當(dāng)代碼,不要改動(dòng)程序中的其他內(nèi)容,也不要?jiǎng)h除或移動(dòng)“//****料found****”。
    //proj2.cpp
    #include
    using namespacc std;
    class Stack{
    public:
    virtual void push(char C)=0;
    virtual char pop()=0;
    };
    class ArrayStack:public Stack{
    char*P;
    int maxSizc;
    int top;
    public:
    ArravStack(int s)
    {
    top=0;
    maxSize=s:
    //*********found*********
    P=______;
    }
    ~ArrayStack()
    {
    //*********found*********
    _______;
    }
    void push(char c)
    }
    if(top==maxSize){
    cerr<<”O(jiān)verflow! \n”:
    return;
    }
    //*********found*********
    _______;
    top++:
    }
    char pop()
    {
    if(top==0){
    cerr<<”Underflow!、n”;
    return‘\0’;
    }
    Top--;
    //*********found*********
    ______;
    }
    };
    void f(Stack&sRef)
    {
    char ch[]={‘a(chǎn)’,‘b’,‘c’};
    cout<
    sRef.push(oh[0]);sRef.push(ch[1]);sRef.push(ch[2]);
    cout<
    cout<
    cout<
    }
    int main()
    {
    ArrayStack as(10);
    f(as):
    return 0:
    }
    參考解析:
    (1)Ilew char[s]
    (2)delete[]P
    (3)P[top]=e
    (4)return P[top]
    【考點(diǎn)分析】
    本題主要考查的是表示棧的抽象類Stack類及它的派生類ArrayStaek類、純虛函數(shù)和成員函數(shù)。棧的節(jié)點(diǎn)一般使用指針表示,定義構(gòu)造函數(shù)時(shí)要給指針分配空間,使用New語句來完成?!獳rrayStack()是析構(gòu)函數(shù),因?yàn)榍懊嬉呀?jīng)使用new來分配空間了,因此在這里要用delete語句來釋放指針。
    【解題思路】
    (1)主要考查的是ArrayStack類的構(gòu)造函數(shù),在函數(shù)中要為P申請(qǐng)S個(gè)char型空間,應(yīng)使用語句P=flew char[s];。
    (2)主要考查析構(gòu)函數(shù),使用delete語句釋放指針,即delete[]P;。
    (3)主要考查push函數(shù),top表示棧頂元素下標(biāo),添加的數(shù)據(jù)放到棧頂,因此使用語句P[top]=c;。
    (4)主要考查pop函數(shù),輸出棧頂數(shù)據(jù),top表示棧頂元素下標(biāo),因此使用語句return P[top];。
    10[單選題]有以下函數(shù)
    fun(char *a,char *b)
    {
    while((*a!=’\0’) &&(*b!=’\0’)&&(*a==*b))
    { a++; b++;}
    return (*a-*b);
    }
    該函數(shù)的功能是( )
    A.計(jì)算a和b所指字符串的長度之差
    B.將b所指字符串復(fù)制到a所指字符串中
    C.將b所指字符串連接到a所指字符串后面
    D.比較a和b所指字符串的大小
    參考答案:D