频道栏目
首页 > 考试 > 等级考试 > 二级 > C语言 > 正文

计算机等级考试二级C++习题与解析:模板

2009-02-28 11:15:42           
收藏   我要投稿

01.分析以下程序的执行结果 
#include<iostream.h> 
template <class T> 
T max(T x,T y) 

return (x>y?x:y); 

void main() 

cout<<max(2,5)<<","<<max(3.5,2.8)<<endl; 

解: 
本题说明函数模板的使用方法。max()函数是一个函数模板,它返回两个参数中的较大者。在调用时自动联编相应的max()函数。所以输出为:5,3.5 
注意:T为类型形式参数,可包含基本数据类型,也可以包含类类型,不能是普通的数据变量。 

02.分析以下程序的执行结果 
#include<iostream.h> 
template <class T> 
class Sample 

T n; 
public: 
Sample(T i){n=i;} 
void operator++(); 
void disp(){cout<<"n="<<n<<endl;} 
}; 
template <class T> 
void Sample<T>::operator++() 

n+=1; // 不能用n++;因为double型不能用++ 

void main() 

Sample<char> s(’a’); 
s++; 
s.disp(); 

解: 
本题说明类模板的使用方法。Sample是一个类模板,由它产生模板类Sample<char>,通过构造函数给n赋初值,通过重载++运算符使n增1,这里n由’a’增1变成’b’。 
所以输出为:n=b
03.编写一个对具有n 个元素的数组x[]求最大值的程序,要求将求最大值的函数设计成函数模板。 
解: 
将max()函数设计成一个函数模板。 
本题程序如下: 
#include<iostream.h> 
template <class T> 
T max(T x[],int n) 

int i; 
T maxv=x[0]; 
for(i=1;i<n;i++) 
if(maxv<x[i]) 
maxv=x[i]; 
return maxv; 

void main() 

int a[]={4,5,2,8,9,3}; 
double b[]={3.5,6.7,2,5.2,9.2}; 
cout<<"a数组最大值:"<<max(a,6)<<endl; 
cout<<"b数组最大值:"<<max(b,5)<<endl; 

本程序的执行结果如下: 
a 数组最大值:9 
b 数组最大值:9.2 


04.编写一个使用类模板对数组进行排序、查找和求元素和的程序。 
解: 
设计一个类模板template<class T>class Array,用于对T类型的数组进行排序、查找和求元素和,然后由此产生模板类Array<int>和Array<double>。 
本题程序如下: 
#include<iostream.h> 
#include<iomanip.h> 
template <class T> 
class Array 

T *set; 
int n; 
public: 
Array(T *data,int i){set=data;n=i;} 
~Array(){} 
void sort(); // 排序 
int seek(T key); // 查找指定的元素 
T sum(); // 求和 
void disp(); // 显示所有的元素 
}; 
template<class T> 
void Array<T>::sort() 

int i,j; 
T temp; 
for(i=1;i<n;i++) 
for(j=n-1;j>=i;j--) 
if(set[j-1]>set[j]) 

temp=set[j-1];set[j-1]=set[j];set[j]=temp; 


template <class T> 
int Array<T>::seek(T key) 

int i; 
for(i=0;i<n;i++) 
if(set[i]==key) 
return i; 
return -1; 

template<class T> 
T Array<T>::sum() 

T s=0;int i; 
for(i=0;i<n;i++) 
s+=set[i]; 
return s; 

template<class T>
void Array<T>::disp() 

int i; 
for(i=0;i<n;i++) 
cout<<set[i]<<" "; 
cout<<endl; 

void main() 

int a[]={6,3,8,1,9,4,7,5,2}; 
double b[]={2.3,6.1,1.5,8.4,6.7,3.8}; 
Array<int>arr1(a,9); 
Array<double>arr2(b,6); 
cout<<" arr1:"<<endl; 
cout<<" 原序列:"; arr1.disp(); 
cout<<" 8在arr1中的位置:"<<arr1.seek(8)<<endl; 
arr1.sort(); 
cout<<" 排序后:"; arr1.disp(); 
cout<<"arr2:"<<endl; 
cout<<" 原序列:"; arr2.disp(); 
cout<<" 8.4在arr2中的位置:"<<arr2.seek(8.4)<<endl; 
arr2.sort(); 
cout<<" 排序后:"; arr2.disp(); 

本程序的执行结果如下: 
arr1: 
原序列:6 3 8 1 9 4 7 5 2 
8在arr1中的位置:2 
排序后:1 2 3 4 5 6 7 8 9 
arr2: 
原序列:2.3 6.1 1.5 8.4 6.7 3.8 
8.4在arr2中的位置:3 
排序后:1.5 2.3 3.8 6.1 6.7 8.4

题1.分析以下程序的执行结果?
#include<iostream.h>?
template?<class?T>?
T?abs(T?x)?
{?
return?(x>0?x:-x);?
}?
void?main()?
{?
cout<<abs(-3)<<","<<abs(-2.6)<<endl;?
}?
解:?
abs()是一个函数模板,它返回参数的绝对值。在调用时自动联编相应的abs()函数。?
所以输出为:3,2.6?

題2.分析以下程序的执行结果?
#include<iostream.h>?
template<class?T>?
class?Sample?
{?
T?n;?
public:?
Sample(){}?
Sample(T?i){n=i;}?
Sample<T>&operator+(consta?Sample<T>&);?
void?disp(){cout<<"n="<<n<<endl;}?
};?
template<class?T>?
Sample<T>&Sample<T>::operator+(const?Sample<T>&s)?
{?
static?Sample<T>?temp;?
temp.n=n+s.n;?
return?temp;?
}?
void?main()?
{?
Sample<int>s1(10),s2(20),s3;?
s3=s1+s2;?
s3.disp();?
}?
解:?
Sample为一个类模板,产生一个模板类Sample<int>,并建立它的三个对象,调用重载运算符+实现s1与s2的加法运算,将结果赋给s3。?
所以输出为:n=30

题3.编写一个函数模板,它返回两个值中的较小者,同时要求能正确处理字符串。?
解:?
这里设计一个函数模板template<class?T>?T?min(T?a,T?b),可以处理int、float和char?等数据类型,为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即char?*min(char?*a,char?*b)。?
本题程序如下:?
#include<iostream.h>?
#include<string.h>?
template<class?T>?
T?min(T?a,T?b)?
{?
return?(a<b?a:b);?
}?
char?*min(char?*a,char?*b)?
{?
return?(strcmp(a,b)<0?a:b);?
}?
void?main()?
{?
double?a=3.56,b=8.23;?
char?s1[]="Hello",s2[]="Good";?
cout<<"输出结果:"<<endl;?
cout<<"?"<<a<<","<<b<<"中较小者:"<<min(a,b)<<endl;?
cout<<"?"<<s1<<","<<s2<<"中较小者:"<<min(s1,s2)<<endl;?
}?
输出结果:?
3.56,8.23中较小者:3.56?
Hello,Good中较小者:Good?

题4.设计一个数组类模板Array<T>,其中包含重载下标运算符函数,并由此产生模板类Array<int>和Array<char>,使用一些测试数据对其进行测试。?
解:?
本题程序如下:?
#include<iostream.h>?
#include<iomanip.h>?
template?<class?T>?
class?Array?
{?
T?*elems;?
int?size;?
public:?
Array(int?s);?//?构造函数?
~Array();?
T&?operator[](int);?//?重载下标运算符?
void?operator=(T);?//?重载等号运算符?
};?
template?<class?T>?
Array<T>::Array(int?s)?
{?
size=s;?
elems=new?T[size];?
for

上一篇:计算机等级考试二级C语言重点测试题:位运算
下一篇:计算机等级考试二级C++练习题(1)及解答
相关文章
图文推荐
文章
推荐
热门新闻

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站