2012年3月計算機二級C++第十一套上機模擬試題及答案解析

字號:

一、改錯題
    使用VC6打開考生文件夾下的工程kt17_1,此工程包含一個源程序文件kt17_1.cpp,但該程序運行有問題,請改正函數(shù)中的錯誤,使該程序的輸出結(jié)果為:
    0149162536496481
    源程序文件kt17_1.cpp清單如下:
    #include
    templateclassVector
    { Tvec[N];
    public:
    voidset(intpos,Tval);
    Tget(intpos);
    /*****************found*****************/ }
    templatevoidVector::set(intpos,Tval)
    { vec[pos]=val; }
    /*****************found*****************/
    templateVector::get(intpos)
    { returnvec[pos]; }
    intmain()
    { Vectorv;
    inti=0;
    doubled=0.0;
    for(i=0;i<10;i++)
    v.set(i,double(i*i));
    for(i=0;i<10;i++)
    cout<  cout<  /*****************found*****************/ }
    【參考答案】
    (1)在“}”后添加分號。
    (2)將template Vector::get(int pos)
    改為:template T Vector::get(int pos)
    (3)將缺少返回值
    改為:加入return 0;
    【試題解析】
    (1)主要考查對于類定義的理解,即使使用了類模板,在類定義的結(jié)尾仍然需要使用分號,這是C++的規(guī)定;
    (2)主要考查是模板類的定義,template是關(guān)鍵字,在<>中間是類型的定義,題目中Vector是一個類的名稱,前面應(yīng)該有該模板的名稱,即T,這樣才是完整的定義;
    (3)主要考查對函數(shù)返回值的掌握,任何返回值類型不為int型的函數(shù)最后都必須使用returen語句返回對應(yīng)類型的值,就算是main函數(shù)也不例外。
    二、簡單應(yīng)用題
    請編寫函數(shù)fun(),其功能是計算并輸出下列多項式值
    Sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n!
    例如:從鍵盤輸入15,則輸出為s=2.718282。
    注意:部分源程序以存在文件kt17_2.cpp中。
    請勿改動主函數(shù)main和其他函數(shù)中的內(nèi)容,僅在函數(shù)fun的花
    括號中填入所編寫的若干語句。
    文件kt17_2.cpp的內(nèi)容如下:
    #include
    #include
    doublefun(intn)
    {
    }
    voidmain()
    { int n;
    doubles;
    cout<<"Inputn:"<  cin>>n;
    s=fun(n);
    cout<<"s="<  【參考答案】
    double fun(int n)
    { double t,sn=1.0;
    int i,j;
    for(i=1;i<=n;i++)
    { t=1.0;
    for(j=1;j<=i;j++)
    t*=j;
    sn+=1.0/t; }
    return sn; }
    【試題解析】
    本題解法是通過觀察所給的多項式,可以找出該多項式相應(yīng)的數(shù)學(xué)規(guī)律。本題中,多項式是一個累加求和的多項式,并且每一項總是比前一項多乘一個整數(shù),所乘整數(shù)恰好等于每一項的編號,這樣利用循環(huán)語句進行階乘、累加就可以實現(xiàn)功能。由于函數(shù)中出現(xiàn)了"/"的運算,所以最終的函數(shù)值要考慮到用double類型。
    三、綜合應(yīng)用題
    使用VC6打開考生文件夾下的工程kt17_3。此工程包含一個kt17_3.cpp,其中定義了類Letter和Number以及Grid,其中Grid類由Letter類和Number類public派生,但三個類的定義并不完整。請按要求完成下列操作,將程序補充完整。
    (1)添加類Letter的帶一個參數(shù)c的構(gòu)造函數(shù),c是char型的數(shù)據(jù),默認值為“A”,該函數(shù)把參數(shù)c的值賦給類的保護成員ch,請在注釋“//**1**”之后添加適當?shù)恼Z句。
    (2)添加類Number的帶一個參數(shù)n的構(gòu)造函數(shù),n是int型的數(shù)據(jù),默認值為0,該函數(shù)把參數(shù)n的值賦給類的保護成員num,請在注釋“//**2**”之后添加適當?shù)恼Z句。
    (3)添加派生類Grid構(gòu)造函數(shù)的定義,傳入的參數(shù)為char型的c和int型的n,并將其分別賦值給基類的ch和num,請在注釋“//**3**”之后添加適當?shù)恼Z句。
    (4)完成派生類Grid的友元函數(shù)--"<<"運算符重載的定義,使其以格式"[g.ch,g.num]"輸出,請在注釋“//**4**”之后添加適當?shù)恼Z句。
    源程序文件kt17_3.cpp清單如下:
    #include
    classLetter
    { protected:
    charch;
    public:
    //**1** };
    classNumber
    { protected:
    intnum;
    public:
    //**2** };
    classGrid:publicLetter,publicNumber
    { public:
    //**3**
    friendostream&operator<<(ostream&o,Grid&g); };
    //**4**
    { o<<"["<  returno; }
    intmain()
    { Gridg(’C’,3);
    cout<<"Gridreference:"<  return0; }
    【參考答案】
    (1)Letter(char c = ’A’) {ch = c;}
    (2)Number(int n = 0) {num = n;}
    (3)Grid(char c = ’A’, int n = 0) : Letter(c), Number(n){}
    (4)ostream &operator<<(ostream &o,Grid &g)
    【試題解析】
    主要考查對類和派生類的構(gòu)造函數(shù)的定義,以及重載為友元的運算符函數(shù)的定義的掌握,其中(3)使用了參數(shù)列表進行變量賦值,這是派生類構(gòu)造函數(shù)中經(jīng)常使用的,(4)對于友元函數(shù)在類體外的定義不需要使用作用域符,而ostream類的對象引用可直接使用原來意義的符號“<<”進行輸出。