一、改錯題
使用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類的對象引用可直接使用原來意義的符號“<<”進行輸出。
使用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類的對象引用可直接使用原來意義的符號“<<”進行輸出。