资源描述
南昌大学实验报告
学生姓名: 学 号: 专业班级:
实验类型:■ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:
一、实验项目名称
函数模板与类模板的应用
二、实验目的
1、掌握模板的概念与应用
2、掌握函数模板的定义和使用方法
3、掌握多个模板参数的类模板的定义和使用方法
4、掌握泛型程序设计的基本方法
三、实验任务
利用VC++6.0编写程序,然后编译、运行,并查看结果是否正确。
题目1、3、4(p211)
四、主要仪器设备及耗材
软件:visual c++
五、实验步骤
1、阅读实验指导中实验 8的相关内容,了解实验目的和实验要求。
2、根据实验指导把每个要解决的问题罗列出来。
3、根据要求分别编写代码,上机实验,查错,并将结果截图。
六、实验数据及处理结果
题目一:
(1) 代码:
#include<iostream.h>
#include<string.h>
template <class T>
T Max(T value[], int size)
{
T max = value[0];
T temp;
for (int i = 0;i < size;i++)
if (value[i] > max)
{
temp = max;
max = value[i];
value[i] = temp;
}
return max;
}
const int N=5;
#include"exp8_1.h"
int main()
{
int i,arr[N];
double dou[N];
cout<<"输入"<<N<<"个整数"<<endl;
for (i=0;i<N;i++)
cin>>arr[i];
cout<<"最大值为"<<Max(arr,N)<<endl;
cout<<"输入"<<N<<"个双精度型数据"<<endl;
for (i=0;i<N;i++)
cin>>dou[i];
cout<<"最大值为"<<Max(dou,N)<<endl;
return 0;
}
(2)结果:
题目二:
(1) 代码:
#include<iostream.h>
template <class T1,class T2,class T3>
class Test
{
public:
Test(T1 x,T2 y,T3 z)
{
data1=x;
data2=y;
data3=z;
}
void Display();
private:
T1 data1;
T2 data2;
T3 data3;
};
template <class T1,class T2,class T3>
void Test<T1,T2,T3>::Display()
{
cout<<data1<<" "<<data2<<" "<<data3<<" "<<endl;
}
#include"exp8_2.h"
int main()
{
Test<int,int,double> obj1(1,2,3.3);
obj1.Display();
Test<char,double,double> obj2('A',1.1,2.2);
obj2.Display();
Test<char*,int,char*> obj3("C++",98,"分");
obj3.Display();
return 0;
}
(2) 结果:
题目三:
(1) 代码:
#include<iostream>
using namespace std;
template <class T1,class T2>
class Complex
{
public:
Complex(T1 r,T2 i);
void Print();
Complex operator + (const Complex &a);
Complex operator - (const Complex &a);
private:
T1 real;
T2 imag;
};
//构造函数
template <class T1,class T2>
Complex<T1,T2>::Complex(T1 r,T2 i)
{
real=r;
imag=i;
}
//打印函数
template <class T1,class T2>
void Complex<T1,T2>::Print()
{
cout<<real;
if(imag != 0)
{
if(imag > 0)
cout<<"+";
cout<<imag<<"i";
}
cout<<endl;
}
//以成员函数形式重载运算符+
template <class T1,class T2>
Complex<T1,T2> Complex<T1,T2>::operator + (const Complex &a)
{
real+=a.real;
imag+=a.imag;
return *this;
}
//以成员函数形式重载运算符-
template <class T1,class T2>
Complex<T1,T2> Complex<T1,T2>::operator - (const Complex &a)
{
real-=a.real;
imag-=a.imag;
return *this;
}
#include"exp8_3.h"
int main()
{
Complex<int,int> A1(1,2);
A1.Print();
Complex<double,double> A2(1.1,2.2);
A2.Print();
Complex<int,double> A3(1,2.2);
A3.Print();
Complex<int,int> A4(4,4),A5(5,5);
A1=A4+A5;
cout<<"(4+4i)-(5+5i)=";
A1.Print();
Complex<double,double> A6(6.6,6.6),A7(7.7,7.7);
A2=A7-A6;
cout<<"(7.7+7.7i)-(6.6+6.6i)=";
A2.Print();
return 0;
}
(2) 结果:
题目四:
(1) 代码:
#include<algorithm>
#include<vector>
#include<iostream>
#include<functional>
using namespace std;
int main()
{
ostream_iterator<int>output(cout," ");
//用输出迭代子output来输出,其中第二参数" "表示用空格分隔各个整数。
int ia[18]={47,29,5,37,13,23,11,61,7,31,41,2,59,19,17,53,43,3};
vector<int> vec(ia,ia+9);
//定义向量vec,用数组ia中前9个元素来初始化vec
vector<int> vec2(18);//声明有18个元素的vector向量vec2
if(vec.empty())
cout<<"vector空"<<endl;
else{
cout<<"vector不空,"<<"vector中的元素:"<<endl;
unique_copy(vec.begin(),vec.end(),output);
//将容器中不重复的元素输出
cout<<endl;
}
cout<<"当前分配元素空间数量:"<<vec.capacity()<<endl;
//输出容器的容量
vec.reserve(12);
//完成向量vec中元素逆序排列
cout<<"当前为vector保留的最小分配元素空间数量:"<<vec.capacity()<<endl;
vec.erase(vec.begin(),vec.end());
//删除向量中的元素
cout<<"当前分配元素空间数量:"<<vec.capacity()<<endl;
vec.resize(10);
//重新分配10个元素空间
cout<<"当前重新分配元素空间数量为10,实际分配元素空间数量:"<<vec.capacity()<<endl;
vec.assign(ia+10,ia+16);
//用ia中的第10~18个元素给vec赋值
cout<<"vector存放序列容许最大长度:"<<vec.max_size()<<endl;
cout<<"vector中的元素:"<<endl;
unique_copy(vec.begin(),vec.end(),output);
//输出vec中的元素
cout<<endl;
vec.assign(ia,ia+18);
//用ia中全部元素来给vec赋值
cout<<"vector中的元素:"<<endl;
unique_copy(vec.begin(),vec.end(),output);
//输出vec中的元素
cout<<endl;
sort(vec.begin(),vec.end(),greater<int>());
//降序排列
cout<<"vector中的元素:"<<endl;
unique_copy(vec.begin(),vec.end(),output);
cout<<endl;
cout<<"用逆向迭代子输出vector中的元素:"<<endl;
unique_copy(vec.rbegin(),vec.rend(),output);
cout<<endl;cout<<"第1个元素:"<<vec.front()<<endl;
//输出第1个元素
cout<<"最后1个元素:"<<vec.back()<<endl;
//输出最后1个元素
cout<<"第8个元素:"<<vec[6]<<endl;
cout<<"原vector2中的元素:"<<endl;
unique_copy(vec2.begin(),vec2.end(),output);
//输出vec2中的元素
cout<<endl;
vec2.swap(vec);
//交换两个向量中的元素
cout<<"交换后vector2中的元素:"<<endl;
unique_copy(vec2.begin(),vec2.end(),output);
cout<<endl;
return 0;
}
(2) 结果:
七、思考讨论题或体会或对改进实验的建议
初步了解了泛型程序设计的基本方法,基本掌握了函数模板、模板参数的类模板的定义和使用。
八、参考资料
[1] 朱立华等 面向对象程序设计及C++(第2版),人民邮电出版社 2012.2
[2] 朱立华等 面向对象程序设计及C++实验指导(第2版),人民邮电出版社 2012.2
[3] 苏小红等C语言程序设计,高等教育出版社 2011年8月
[4] 苏小红等 C语言程序设计学习指导,高等教育出版社 2011年8月
展开阅读全文