C++程序设计基础10:一般模板的建立和使用

237 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

本文为笔者大一《面向对象程序设计》课程章节实验报告,现将题目整理并分享,希望能够帮助正在学习C++的小伙伴!本文将学习到的编程技能包括:模板的用途、建立方法、使用

知识提纲

  • 模板的用途

模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性

  • 模板的建立
template <类型参数表>
class 类模板名{
    成员函数和成员变量
};
  • 模板的使用
类模板名<真实类型参数表> 对象名(构造函数实际参数表);

一、不同类型的三个数求最大值(使用template实现)

  • 题目:用函数模板方法编写程序,对给各种不同类型的三个数分别求最大数。

  • 代码

#include "pch.h"
#include <iostream>
#include <string>
using namespace std;

template <typename T>
class find_max
{
public:
	find_max(T ma, T mb, T mc);  //构造函数
	T max();
	void print();
private:
	T a, b, c;
};

template<typename T>
find_max<T>::find_max(T ma, T mb, T mc)
{
	a = ma, b = mb, c = mc;
}
template<typename T>
T find_max<T>::max()
{
	T d=(a > b ? a : b);
	return c > d ? c : d;
}
template<typename T>
void find_max<T>::print()
{
	cout << a <<"    "<< b<<"    " << c<<endl;
}


int main()
{
	find_max<int>A(3, 6, 1);
	A.print();
	cout<<"三个整数的最大值为:"<<A.max()<<endl;
	find_max<double>B(3.4, 6.3, 1.7);
	B.print();
	cout << "三个小数的最大值为:" << B.max()<<endl;
	find_max<string>C("Guangzhou", "Beijing", "Zhongguo");
	C.print();
	cout << "三个字符串的最大值为:"<<C.max()<<endl;
}

  • 结果 在这里插入图片描述

二、数组运算与操作(使用template实现)

  • 题目:创建一个类模板,可以对不同的数据类型的数组分别进行初始化、添加数据、求和、求平均值、显示数组等功能。
  • 代码
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;

template<typename T>
class Array
{
public:
	Array(T *mp, int msize);
	Array(int msize);
	~Array();
	void input();
	T sum();
	T average();
	void print();
private:
	int size;
	T *p;
};

template<typename T>
Array<T>::Array(T *mp, int msize)
{
	size = msize;
	p = new T[msize];
	for (int i = 0; i < msize; ++i)
	{
		p[i] = mp[i];
	}
}
template<typename T>
Array<T>::Array(int msize)
{
	size = msize;
}
template<typename T>
Array<T>::~Array()
{
	delete[]p;
}
template<typename T>
void Array<T>::input()
{
	p = new T[size];
	cout << "请输入" << size << "个数据:";
	for (int i = 0; i < size; ++i)
	{
		cin >> p[i];
	}
}
template<typename T>
T Array<T>::sum()
{
	T s = 0;
	for (int i = 0; i < size; ++i)
	{
		s += p[i];
	}
	return s;
}
template<typename T>
T Array<T>::average()
{
	T s = sum();
	return s / size;
}
template<typename T>
void Array<T>::print()
{
	cout << "数组数据如下:\n";
	for (int i = 0; i < size; ++i)
	{
		cout << p[i] << ' ';
		if ((i + 1) % 10 == 0) cout << '\n';
	}
}

int main()
{
	char op;
	while (true)
	{
		cout << "选择默认初始化or自行添加数据(1 or 2): ";
		cin >> op;
		if (op == '1')
		{
			int p[] = { 1,2,3,4,5,6,7,8,9,10 };
			Array<int>A(p, sizeof(p) / sizeof(int));
			cout << "总和=" << A.sum() << endl;
			cout << "平均值=" << A.average() << endl;
			A.print();
			double q[] = { 1.5,2.4,3.3,4.2,5.1,6.0,7.6,8.7,9.8,10.9 };
			Array<double>B(q, sizeof(q) / sizeof(double));
			cout << "总和=" << B.sum() << endl;
			cout << "平均值=" << B.average() << endl;
			B.print();
		}
		if (op == '2')
		{
			cout << "请输入要添加的数据类型(int or double):";
			string type;
			cin >> type;
			if (type == "int")
			{
				int msize;
				cout << "请输入数组元素个数:";
				cin >> msize;
				Array<int>C(msize);
				C.input();
				cout << "总和=" << C.sum() << endl;
				cout << "平均值=" << C.average() << endl;
				C.print();
				cout << endl;
			}
			else if (type == "double")
			{
				int msize;
				cout << "请输入数组元素个数:";
				cin >> msize;
				Array<double>D(msize);
				D.input();
				cout << "总和=" << D.sum() << endl;
				cout << "平均值=" << D.average() << endl;
				D.print();
				cout << endl;
			}
		}
		else
		{
			cout << "输入有误!\n";
			continue;
		}
	}
}

  • 结果
  • 在这里插入图片描述