實驗八

實驗目的和要求

1.能夠使用C++模板機制定義重載函數。

2.能夠實例化及使用模板函數。

3.能夠實例化和使用模板類。

4.應用標準C++模板庫(STL)通用算法和函數對象實現查找和排序。

實驗內容

1.分析並調試下列程序,瞭解函數模板的使用。

#include<iostream>  
using namespace std;  
template <class T>  
T max(T a,T b)  
{  
    return a>b?a:b;  
}  
int main()  
{  
    cout<<"max(6,5)is"<<max(6,5)<<endl;  
    cout<<"max('6','5')is"<<max(6,5)<<endl;  
    return 0;  
}

(1)寫出運行結果,分析編譯系統工作過程。

(2)如果定義函數重載,代碼如下:

int max(int a,int b){return a>b?a:b;}  
float max(float a,float b){return a>b?a:b;} 

如果程序中有max('6','5');調用時會出現什麼錯誤?爲什麼?上機調試並分析原因。

定義函數重載後程序如下:

#include<iostream>    
using namespace std;    
template <class T>    
T max(T a,T b)    
{return a>b?a:b;}    
    int max(int a,int b){return a>b?a:b;}    
    float max(float a,float b){return a>b?a:b;}    
    
int main()    
{    
    cout<<"max(6,5)is "<<max(6,5)<<endl;    
    cout<<"max('6','5')is "<<max(6,5)<<endl;    
    return 0;    
} 


程序運行結果如下:

2.分析調試下列程序,瞭解特定模板函數的作用。

#include<iostream>  
using namespace std;  
template<typename T>  
T max(T a,T b)  
{  
   return a>b?a:b;  
}  
char *max(char *a,char *b)  
{  
    return strcmp(a,b)>0?a:b;  
}  
int main()  
{  
    cout<<"max(6,5)is"<<max(6,5)<<endl;  
    cout<<"max(\"China\",\"Japan\")is"<<max("China","Japan")<<endl;  
    return 0;  
}
(2) 說明特定模板函數的作用。

       答:特定模板函數的作用是可以替換原本會自動從函數模板中創建的模板實例,用來替換的函數。

3.聲明一個類模板,利用它實現10個整數、浮點數和字符的排序。(sy8_3.cpp)

編寫程序如下:


#include <iostream>    
#include<cstdio>  
template <class T>    
class MySort    
{    
public:    
    MySort(T _stores[10])    
    {    
        stores = _stores;    
    }    
    void DoSort(bool up = true)    
    {    
        for(int i = 0; i < 10; i++)    
        {    
            for(int j = i+1; j < 10; j++)    
            {    
                if(up)//升序    
                {    
                    if(stores[i] > stores[j])    
                    {    
                        T temp = stores[i];    
                        stores[i] = stores[j];    
                        stores[j] = temp;    
                    }    
                }    
                else//降序    
                {    
                    if(stores[i] < stores[j])    
                    {    
                        T temp = stores[i];    
                        stores[i] = stores[j];    
                        stores[j] = temp;    
                    }    
                }    
            }    
        }    
    }    
private:    
    T *stores;    
};    
    
int main()    
{    
    //int    
    int nums[10] = { 1, 3, 2, 9, 7, 6, 8, 10, 4, 5};    
    MySort<int> mySort(nums);    
    mySort.DoSort(true);//升序    
    for(int i = 0; i < 10; i++)    
        printf("%d ", nums[i]);    
    printf("\n");    
    //float    
    float nums1[10] = { 99.7f, 99.1f, 81.2f, 1.1f, 2.2f, 7.7f, 7.8f, 49.1f, 75.3f, 89.99f};    
    MySort<float> mySort1(nums1);    
    mySort1.DoSort(false);    
    for(int i = 0; i < 10; i++)    
        printf("%0.2f ", nums1[i]);    
    printf("\n");    
    // char    
    char chars[10] = {'a', 'A', 'B', 'b', 'z', 'X', 'W', 'e', 'g', 'H'};    
    MySort<char> mySort2(chars);    
    mySort2.DoSort();    
    for(int i = 0; i < 10; i++)    
        printf("%c ", chars[i]);    
    printf("\n");    
    return 0;    
}

程序輸出結果入下:

4.聲明一個整型數組,使用C++標準模板庫(STL)中的查找算法find()進行數據的查找,然後應用排序算法sort()對數據進行升序和降序排序。(sy8_4.cpp)

編寫程序如下:


#include<iostream>  
#include<vector>  
#include<algorithm>  
using namespace std;  
  
bool  largeThan(int x,int y)  
{  
    return x>y;  
}  
int main()  
{  
    int a[7]={4,8,3,9,5,1,7};  
    size_t arrSize=7;  
    int searchValue=5;  
    vector<int> vec(a,a+arrSize);  
    vector<int>::iterator it=find(vec.begin(),vec.end(),searchValue);  
    if(it==vec.end())  
        cout<<"not found"<<endl;  
    else  
        cout<<searchValue<<"'s index is "<<(it-vec.begin())<<endl;  
    //升序  
    sort(vec.begin(),vec.end());  
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)  
        cout<<*it<<ends;  
    cout<<endl;  
  
    //降序;  
    sort(vec.begin(),vec.end(),largeThan);  
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)  
        cout<<*it<<ends;  
    cout<<endl;  
}

程序輸出結果如下:


分析與討論

1.結合實驗內容中第1題和第2題,說明編譯器匹配函數的過程。

2.結合實驗內容中第3題和第4題,比較利用自定義類模板排序和使用C++標準模板庫排序的過程。

實驗總結:

   本次實驗要求我們能夠使用C++模板機制定義重載函數,能夠實例化及使用模板函數,能夠實例化和使用模板類,以及應用標準C++模板庫(STL)通用算法和函數對象實現查找和排序。實驗過程中,遇到了很多問題,有些老師上課時講過,但沒理解,問了兩位同學把問題解決,但還有些不能理解導致實驗沒有完全做完。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章