厦大计算机系C++程序设计实验(五)

1 实验目的

模板使类和函数可在编译时定义所需处理和返回的数据类型,一个模板并非一个实实在在的类或函数,仅仅是一个类和函数的描述。由于模板可以实现逻辑相同、数据类型不同的程序代码复制,所以使用模板机制可以减轻编程和维护的工作量和难度。模板一般分为模板函数和类模板。以所处理的数据类型的说明作为参数的类就叫类模板,或者模板类,而以所处理的数据类型的说明作为参数的函数,则称为函数模板。

本实验通过编写一些简单的程序,使学生掌握泛型编程,并能够基本运用模板的语法,培养理论联系实际的和自主学习的能力,提高程序设计水平。

2 实验内容

(1)编写模板函数,它将一个包含5个T类型元素的数组作为参数,并返回数组的最小值。在一个程序中使用该函数,将T替换为一个包含5个int值的数组和一个包含5个double值的数组,以测试该函数。

(2)定义一个模板类(BinaryOperation),包含构造函数BinaryOperation(T x, T y)以及方法add、sub、mul、div、operator(char op),通过调用operator,判断传入的op变量的值,如果是“+”,则进行加法,并输出结果,其他方法类似。

例:BinaryOperation bo = new BinaryOperation(1,1);

    bo.operator(’+’);会输出结果2

    bo.operator(’-’);会输出结果0

3 实验步骤

(1)模板函数

首先编写一个寻找T类型数组的最小值的函数,然后在主函数内对int型和double型数组分别进行调用,输出数组的最小值。

源代码如下:

#include <iostream>

using namespace std;

template <typename T>
T getMin(T a[5])
{
    T min = a[0];
    for(int i = 1; i < 5; ++i)
    {
        if(a[i] < min)
            min = a[i];
    }
    return min;
}

int main()
{
    int intA[5] = {3, 8, 1, 4, 9};
    double doubleA[5] = {4.3, 2.9, 1.4, 5.5, 8.3};

    cout << "The smallest element in intA is " << getMin(intA) << endl;
    cout << "The smallest element in doubleA is " << getMin(doubleA) << endl;

    return 0;
}

(2)类模板

首先声明一个BinaryOperation的模板类,包括数据域x和y,以及题目要求的成员函数。由于题目中要求计算结果通过函数Operator获得,所以add、sub、mul、div函数通通设置为私有成员。在主函数中实例化一个int型和一个double型的实例,并进行测试。

源代码如下:

#include <iostream>

using namespace std;

template <class T>
class BinaryOperation
{
    T x, y;
public:
    BinaryOperation(T x, T y);
    T Operator(char op);
private:
    T add();
    T sub();
    T mul();
    T div();
};

template <class T>
BinaryOperation<T>::BinaryOperation(T x, T y)
{
    this->x = x;
    this->y = y;
}

template <class T>
T BinaryOperation<T>::add()
{
    return (this->x + this->y);
}

template <class T>
T BinaryOperation<T>::sub()
{
    return (this->x - this->y);
}

template <class T>
T BinaryOperation<T>::mul()
{
    return (this->x * this->y);
}

template <class T>
T BinaryOperation<T>::div()
{
    return (this->x / this->y);
}

template <class T>
T BinaryOperation<T>::Operator(char op)
{
    switch(op)
    {
        case '+': return add(); break;
        case '-': return sub(); break;
        case '*': return mul(); break;
        case '/': return div(); break;
        default: return 0;
    }
}

int main()
{
    BinaryOperation<int> intBO(1, 1);
    BinaryOperation<double> doubleBO(3.0, 1.5);

    cout << "int type: " << endl;
    cout << "add: " << intBO.Operator('+') << endl;
    cout << "subtract: " << intBO.Operator('-') << endl;
    cout << "multiply: " << intBO.Operator('*') << endl;
    cout << "divide: " << intBO.Operator('/') << endl;
    cout << endl;

    cout << "double type: " << endl;
    cout << "add: " << doubleBO.Operator('+') << endl;
    cout << "subtract: " << doubleBO.Operator('-') << endl;
    cout << "multiply: " << doubleBO.Operator('*') << endl;
    cout << "divide: " << doubleBO.Operator('/') << endl;
    cout << endl;

    return 0;
}

4 实验结果

(1)模板函数

若int型数组内数据为3, 8, 1, 4, 9,而double型数组内数据为4.3, 2.9, 1.4, 5.5, 8.3。输出结果为:

(2)类模板

若int型实例内数据为1, 1,double型实例内数据为3.0, 1.5。输出结果为:

5 心得小结

通过本次实验,我掌握了C++中泛型编程的模式,学会了如何定义并使用模板函数和模板类。在实际编程中,需要注意的是类构造函数的类名后面必须跟着<实际类型名>,否则将会报错。

这是本学期C++的最后一次实验了,通过一学期的学习,我了解了C++语言,提高了编程能力。但是,我距离高水平的C++编程还有很长的路要走,需要我不断学习,提高自我。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值