C++实验五模板

Swap

描述

用模板函数Swap实现对不同类型的数据进行交换。

并使用如下主函数测试。

int main()
{
    int a1, a2;
    std::cin >> a1 >> a2;
    Swap(a1, a2);
    std::cout << a1 << "," << a2 << std::endl;

    double b1, b2;
    std::cin >> b1 >> b2;
    Swap(b1, b2);
    std::cout << b1 << "," << b2 << std::endl;

    char c1, c2;
    std::cin >> c1 >> c2;
    Swap(c1, c2);
    std::cout << c1 << "," << c2 << std::endl;

    return 0;
}

注意,本题只需要提交Swap函数代码,头文件和main函数系统已经提供。

输入

输入共三行。第一行两整数,第二行两浮点数,第三行两字符

输出

输出共三行。每一行为对应输入处理后的结果,输出的两个数用逗号隔开

输入样例 1 

2 3
1.2 2.3
a b

输出样例 1

3,2
2.3,1.2
b,a
//注意,本题只需要提交Swap函数代码,头文件和main函数系统已经提供。
#include<iostream>
using namespace std;
template<typename T>
void Swap(T& t1, T& t2)
{
    T temp = t1;
    t1 = t2;
    t2 = temp;
}

SortFunctionTemplate

描述

用模板函数实现数组的输入、排序和输出。并使用如下主函数测试你的模板

int main()
{
    const int LEN = 5;
    int type;
    while (std::cin >> type)
    {
        switch (type) 
        {
            case 0: 
            {
                int a1[LEN];
                Input<int>(a1, LEN); Sort<int>(a1, LEN); Output<int>(a1, LEN);
                break;
            }
            case 1: 
            {
                char a2[LEN];
                Input(a2, LEN); Sort(a2, LEN); Output(a2, LEN); 
                break; 
            }
            case 2: 
            {
                double a3[LEN];
                Input(a3, LEN); Sort(a3, LEN); Output(a3, LEN);
                break;
            }
        }
    }

    return 0;
}

注意:本题只提交Input,Sort, Output函数代码。其余部分系统已包含。

输入

输入包含多组测试数据。每组数据为两行,第一行整数type(0、1、2)。第二行为相应数组的5个元素。

输出

对于每一组测试数据,将其排序后在一行内输出,相邻元素逗号空格分离,最后为换行。

输入样例 1 

0 
3 6 1 4 5
1 
A B C B A

输出样例 1

1, 3, 4, 5, 6
A, A, B, B, C
#include<iostream>
using namespace std;
template<typename T>
void Input(T arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cin >> arr[i];
    }
}

template<typename T>
void Swap(T &a, T &b)
{
    T t = a;
    a = b;
    b = t;
}
template <typename T>
void Sort(T arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        int max = i;
        for (int j = i + 1; j < len; j++)
        {
            if (arr[max] >arr[j])
            {
                max = j;
            }
        }
        if (max != i)
        {
            Swap(arr[max], arr[i]);
        }
    }
}
template<class T>
void Output(T arr[], int len)
{
    for (int i = 0; i < len; i++)
    {
        cout << arr[i];
        if (i < len - 1)
            cout << ", ";
    }
    cout << endl;
}
//本题只提交Input,Sort, Output函数代码,否则编译出错(其余部分系统已包含)

Search

描述

设计一个模板函数,实现在一个给定的数组中查找给定数据是否存在,如果存在则输出该数据在数组中最小的下标,如果不存在,输出-1。以下为测试函数

int main()
{
    int n;
    std::cin >> n;
    int *nValues  = new int[n];
    for (int i = 0; i < n; i++) 
    {
        std::cin >> nValues[i];
    }    
    int d;
    std::cin >> d;
    std::cout << Search(nValues, n, d) << std::endl;
    delete[] nValues;

    double f;
    std::cin >> n;
    double *dValues = new double[n];
    for (int i = 0; i < n; i++) 
    {
        std::cin >> dValues[i];
    }
    std::cin >> f;
    std::cout << Search(dValues, n, f) << std::endl;
    delete[] dValues;

    std::cin >> n;
    char *cValues = new char[n];
    for (int i = 0; i < n; i++)
    {
        std::cin >> cValues[i];
    }
    char c;
    std::cin >> c;
    std::cout << Search(cValues, n, c) << std::endl;
    delete[] cValues;

    return 0;
}

输入

输入共三组数据,每组数据占三行。

第一组第一行整数n1,第二行是n1个整数,第三行待查找整数n

第二组第一行整数n2,第二行是n2个浮点数,第三行待查找浮点数d

第三组第一行整数n3,第二行是n3个字符,第三行待查找字符c

输出

对于每一组输入,如果查找数据存在,则输出其最小下标(下标从0开始计),否则输出-1。

输入样例 1 

7
1 1 2 5 8 10 13
8
5
-1.0 1.1 1.2 1000.10101 8.9
3.5
4
B J F U
j

输出样例 1

4
-1
-1

提示

使用模板函数

使用模板函数

template <class T>
int Search(const T * array, int arrayLen, const T & value)
#include<iostream>
using namespace std;
template <class T>
int Search(const T* array, int arrayLen, const T& value)
{
    
        int index = -1;
        for (int i = 0; i < arrayLen; i++)
        {
            if (value == array[i])

                index = i;
        }
        return index;
}


int main()
{
    int n;
    std::cin >> n;
    int* nValues = new int[n];
    for (int i = 0; i < n; i++)
    {
        std::cin >> nValues[i];
    }
    int d;
    std::cin >> d;
    std::cout << Search(nValues, n, d) << std::endl;
    delete[] nValues;

    double f;
    std::cin >> n;
    double* dValues = new double[n];
    for (int i = 0; i < n; i++)
    {
        std::cin >> dValues[i];
    }
    std::cin >> f;
    std::cout << Search(dValues, n, f) << std::endl;
    delete[] dValues;

    std::cin >> n;
    char* cValues = new char[n];
    for (int i = 0; i < n; i++)
    {
        std::cin >> cValues[i];
    }
    char c;
    std::cin >> c;
    std::cout << Search(cValues, n, c) << std::endl;
    delete[] cValues;

    return 0;
}

TVector3

描述

构造一个模板类(Vector),数据成员如下:

template<typename T>
class Vector
{
private:
    T x, y, z;
};

完成Vector,并用以下函数测试

int main()
{
    double a, b, c;
    std::cin >> a >> b >> c;
    Vector<double> v1(a, b, c), v2(v1), v3, v4;
    double d;
    std::cin >> d;
    v4 = d * v1 + v2;

    std::cout << v4 <<std::endl;

    Vector<double>  v;
    std::cin >> v;

    int flag = (v4 == v);
    std::cout << flag << std::endl; 

    return 0;
}

输入

见样例

输出

见样例

输入样例 1 

3 4 5
2.2
9.6 12.8 16

输出样例 1

9.6 12.8 16
1
#include<iostream>
using namespace std;
template<typename T>
class Vector
{
private:
    T X, Y, Y;
public:
    Vector(T a=0.0,T b=0.0,T c=0.0):X(a),Y(b),Y(c){}
    Vector(const Vector& v)
    {
        this->X = v.X;
        this->Y = v.Y;
        this->Y = v.Y;

    }
    friend Vector operator*(const double X, const Vector &v)
    {
        Vector c;
        c.X = X * v.X;
        c.Y = X * v.Y;
        c.Y = X * v.Y;
        return c;
    }
    friend Vector operator+(const Vector& v1,const Vector &v2)
    {
        Vector c;
        c.X = v1.X + v2.X;
        c.Y = v1.Y + v2.Y;
        c.Y = v1.Y + v2.Y;
        return c;
    }
    friend ostream & operator<<(ostream& os,const Vector &v)
    {
        os << v.X <<" " <<v.Y<<' '<< v.Y;
        return os;
    }
    friend istream & operator>>(istream& is,Vector& v)
    {
        double a, b, c;
        std::cin >> a >> b >> c;
        v.X = a;
        v.Y = b;
        v.Y = c;
        return is;
    }
    friend int operator==(const Vector& v1,const Vector& v2)
    {
        if ((fabs(v1.X - v2.X) < 1e-6) && (fabs(v1.Y - v2.Y) < 1e-6) && (fabs(v1.Y - v2.Y) < 1e-6))
            return 1;
        else return 0;
    }
};



int main()
{
    double a, b, c;
    std::cin >> a >> b >> c;
    Vector<double> v1(a, b, c), v2(v1), v3, v4;
    double d;
    std::cin >> d;
    v4 = d * v1 + v2;

    std::cout << v4 << std::endl;

    Vector<double>  v;
    std::cin >> v;

    int flag = (v4 == v);
    std::cout << flag << std::endl;

    return 0;
}

StackClassTemplate

描述

实现一个Stack类模板并测试这一模板.

template<class T, int SIZE = 20>
class Stack
{
private: 
    T    array[SIZE];        //数组,用于存放栈的元素
    int top;                //栈顶位置(数组下标)
public:
    Stack();                //构造函数,初始化栈
    void Push(const T & );  //元素入栈
    T Pop();                //栈顶元素出栈
    void Clear();           //将栈清空
    const T & Top() const;  //访问栈顶元素
    bool Empty() const;     //测试栈是否为空
    bool Full() const;     //测试是否栈满
    int Size();            //返回当前栈中元素个数
};

测试函数:

int main()
{
    Stack<int, 10> intStack;

    int n;
    cin >> n; //n<=10
    for (int i = 0; i < n; i++)
    {
        int temp;
        cin >> temp;
        intStack.Push(temp);
    }

    for (int i = 0; i < n; i++)
    {
        cout << intStack.Top() << " ";
        intStack.Pop();
    }
    cout<<endl;

    if(intStack.Empty())
        cout<<"Now, intStack is empty."<<endl;

    Stack<string,5> stringStack;
    stringStack.Push("One");
    stringStack.Push("Two");
    stringStack.Push("Three");
    stringStack.Push("Four");
    stringStack.Push("Five");
    cout<<"There are "<<stringStack.Size()<<" elements in stringStack."<<endl;
    stringStack.Clear();
    if(stringStack.Empty()) 
        cout<<"Now, there are no elements in stringStack"<<endl;

    return 0;
}

输入

参考样例

输出

参考样例

输入样例 1 

3
1
2
3

输出样例 1

3 2 1 
Now, intStack is empty.
There are 5 elements in stringStack.
Now, there are no elements in stringStack
#define _CTR_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<stack>

using namespace std;
template<class T, int SIZE = 20>
class Stack
{
private:
    T array[SIZE];
    int top;
public:
    Stack();
    void Push(const T &);
    T Pop();
    void Clear();
    const T & Top() const;
    bool Empty() const;
    bool Full() const;
    int Size();
};


void Stack<T, SIZE>::Push(const T &x)
{
    array[top] = x;
    top++;
}
template<class T, int SIZE>
T Stack<T, SIZE>::Pop()
{
    top--;
    return array[top + 1];
}
template<class T, int SIZE>
Stack<T, SIZE>::Stack()
{
    top = 0;
}
template<class T, int SIZE>
template<class T, int SIZE>
void Stack<T, SIZE>::Clear()
{
    top = 0;
}
template<class T, int SIZE>
const T& Stack<T, SIZE>::Top()const
{
    return array[top - 1];
}
template<class T, int SIZE>
bool Stack<T, SIZE>::Empty()const
{
    return top == 0;
}
template<class T, int SIZE>
bool Stack<T, SIZE>::Full()const
{
    return top == SIZE;
}
template <class T, int SIZE>
int Stack<T, SIZE>::Size()
{
    return top;
}

int main()
{
    Stack<int, 10> intStack;

    int n;
    cin >> n; //n<=10
    for (int i = 0; i < n; i++)
    {
        int temp;
        cin >> temp;
        intStack.Push(temp);
    }

    for (int i = 0; i < n; i++)
    {
        cout << intStack.Top() << " ";
        intStack.Pop();
    }
    cout << endl;

    if (intStack.Empty())
        cout << "Now, intStack is empty." << endl;

    Stack<string, 5> stringStack;
    stringStack.Push("One");
    stringStack.Push("Two");
    stringStack.Push("Three");
    stringStack.Push("Four");
    stringStack.Push("Five");
    cout << "There are " << stringStack.Size() << " elements in stringStack." << endl;
    stringStack.Clear();
    if (stringStack.Empty())
        cout << "Now, there are no elements in stringStack" << endl;
    return 0;
}

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴为您回答这个问题。以下是关于C++模板与异常的实验报告: 一、实验目的 通过实验,掌握C++模板和异常的使用方法,提高编程技能。 二、实验内容 1. 实现一个模板类,可以实现数组的基本操作,并能够处理异常情况。 2. 实现一个函数模板,可以实现两个数的交换,并能够处理异常情况。 三、实验步骤及方法 1. 实现模板类 (1)定义一个模板类,包含数组的大小和指向数组元素的指针。 (2)实现数组基本操作,包括初始化数组、释放数组、获取数组元素等。 (3)使用try-catch语句,处理数组越界的异常情况。 2. 实现函数模板 (1)定义一个函数模板,可以实现两个数的交换。 (2)使用try-catch语句,处理类型不匹配的异常情况。 四、实验结果 1. 实现模板模板类的定义如下: ```c++ template<typename T> class Array { public: Array(int size); ~Array(); T & operator[](int i); private: T * m_ptr; int m_size; }; ``` 模板类的实现如下: ```c++ template<typename T> Array<T>::Array(int size) { m_size = size; m_ptr = new T[size]; } template<typename T> Array<T>::~Array() { delete [] m_ptr; } template<typename T> T & Array<T>::operator[](int i) { if (i < 0 || i >= m_size) { throw std::out_of_range("Index out of range."); } return m_ptr[i]; } ``` 2. 实现函数模板 函数模板的定义如下: ```c++ template<typename T> void swap(T & a, T & b); ``` 函数模板的实现如下: ```c++ template<typename T> void swap(T & a, T & b) { T temp = a; a = b; b = temp; } ``` 实验总结 通过本次实验,我学会了如何使用C++模板和异常,这对我的编程技能提高有很大帮助。同时,我也发现了异常处理的重要性,可以有效地避免程序崩溃的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值