一、實驗目的
1. 掌握函數模板與類模板;
2. 掌握數組類、鏈表類等線性群體數據類型定義與使用;
二、實驗任務
1. 分析完善以下程序,理解模板類的使用:
(1)補充類模板聲明語句。
(2)創建不同類型的類對象,使用時明確其數據類型?
_template<typename T>____________________ //聲明類模板
class A
{
public:
A(T t){ this->t = t; }
T &getT(){ return t;}
void printAA(){cout<<t;}
private:
T t; //類中數據成員類型參數化
};
void main()
{
//模板中如果定義了構造函數,則遵守以前的類的構造函數的調用規則
___A<int> a(1)_______________; //創建數據成員是整型的基類對象a
a.getT();
a.printAA();
__A<double> b(1.1); ________________; //創建數據成員是double類型的的基類對象b
______ b.getT();
b.printAA();____________; //輸出對象b的信息
}
實驗思考題回答與結果分析:
(1)程序運行結果:1和1.1。
(2)該程序主要運用.........知識點?編程時需要注意什么?(不要抄襲!)
該程序主要運用了模板類的知識點。需要注意的是,使用模板類時需要在類名稱后面加上尖括號<>,并在其中指定數據類型,即類實例化。同時,在創建對象時需要明確其數據類型,并傳遞相應的構造函數參數。
- 設計一個分數類 CFraction,再設計一個求數組中最大值的函數模板,并用該模板求一個 CFmction 數組中的最大元素。
參考代碼:
#include <iostream>
using namespace std;
//分數類
class CFraction {
int numerator, denominator; //分子分母
public:
CFraction(int n, int d) :numerator(n), denominator(d) { };
bool operator <(const CFraction & f) const
{//為避免除法產生的浮點誤差,用乘法判斷兩個分數的大小關系
if (denominator * f.denominator > 0)
return numerator * f.denominator < denominator * f.numerator;
else
return numerator * f.denominator > denominator * f.numerator;
}
bool operator == (const CFraction & f) const
{//為避免除法產生的浮點誤差,用乘法判斷兩個分數是否相等
return numerator * f.denominator == denominator * f.numerator;
}
friend ostream & operator <<(ostream & o, const CFraction & f);
};
template <class T> //聲明函數模板
T MaxElement(T a[], int size) //定義函數體
{
//函數功能:找出數組中的最大值
.............. //補充代碼
}
ostream & operator <<(ostream & o, const CFraction & f) //重載 << 使得分數對象可以通過cout輸出
{
________________________; //補充代碼,輸出"分子/分母" 形式
return o;
}
int main()
{
int a[5] = { 1,5,2,3,4 };//定義整數數組
CFraction f[4] = { CFraction(8,6),CFraction(-8,4),
CFraction(3,2), CFraction(5,6) };//定義分數類數組對象
___________________________;//調用模板函數MaxElement輸出整數數組a的最大值
__________________________________; //調用模板函數MaxElement和重載運算符函數”<<”輸出分數數組對象的最大值
return 0;
}
程序代碼:
#include <iostream>
using namespace std;
//定義分數類
class CFraction {
public:
CFraction(int numerator = 0, int denominator = 1) : m_numerator(numerator), m_denominator(denominator) {}
int getNumerator() const { return m_numerator; }
int getDenominator() const { return m_denominator; }
private:
int m_numerator; //分子
int m_denominator; //分母
};
//定義比較函數模板
template<typename T>
T getMax(T arr[], int n) {
T maxVal = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > maxVal) {
maxVal = arr[i];
}
}
return maxVal;
}
int main() {
CFraction arr[] = { CFraction(3,4), CFraction(2,5), CFraction(7,8) };
cout << "The maximum fraction is: " << getMax(arr, 3).getNumerator() << "/" << getMax(arr, 3).getDenominator() << endl;
return 0;
}
實驗思考題回答與結果分析:
- 程序運行結果:
- 該程序主要運用.........知識點?編程時需要注意什么?(不要抄襲!)
在上面的例子中,我們首先定義了一個CFraction類來表示分數,然后定義了一個求最大值的函數模板getMax()
,其中arr[]
表示待比較的數組,n
表示數組元素個數,返回值為最大值。在main函數中,我們創建了一個CFraction類型的數組,并調用getMax()
模板函數來獲取最大值。
- 定義鏈表模板類,使其具備插入結點,輸出結點等功能,現要求:(1)創建鏈表(2)從鍵盤輸入一個待查找整數,在鏈表中查找該數,找到后修改;(3)遍歷鏈表。
參考代碼:
//定義結點模板類
template <class T> //前置申明模板類
class Node //定義一個Node類
{
public:
Node(T _value) //構造函數
{
value = _value;
next = NULL;
}
public:
T value; //結點數據域
Node *next; //結點指針域,指向后繼結點
} ;
//定義鏈表模板類
template <class T> //申明模板類
class List //定義List類
{
public:
List()
{
ptr_head=NULL; //初始化鏈表頭結點
ptr_tail=NULL; //初始化鏈表尾結點