C++实验(3) 运算符重载和模板

时间:2021-05-23 17:34:47


一、实验目的和要求:

1.理解模板的作用。

2.掌握函数模板的声明方法和模板函数的生成方法。

3.掌握类模板的声明方法和模板类的生成方法。

4.掌握运算符重载的基本方法;

5.掌握c++函数的重载机制;

 

二、实验内容和要求

1. 编写一求两个数的最大值的函数Max,要求用模板实现对任意数据类型数据都可应用该函数求取结果,在main()函数中分别用整型、实型、字符型数据进行测试。 

2.编写一冒泡排序的函数模板,能够对不同类型的数据进行排序

3.试编写一个栈的类模板(包括其成员函数定义),以便为任何类型的对象提供栈结构数据的操作。操作至少包括:入栈和出栈操作。

4. 用运算符重载设计复数类,实现复数的+、-、*、/和<<运算

1。
#include <iostream>  
using namespace std;
template<typename T>
T Max(T t1, T t2)
{
	if (t1 >= t2)
		return t1;
	else
		return t2;
}
int main()
{
	cout <<" Max(2.2, 3.3)  "<< Max(2.2, 3.3) << endl;
	cout << " Max(4, 3)  " << Max(4, 3) << endl;
	cout << " Max('b', 'c')  " << Max('b', 'c') << endl;
	return 0;
}

2.
#include "iostream"
using namespace std;
template<typename T>
void Paixu(T array[],int n)
{
	T temp;
	int i, j;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (array[j] > array[j + 1])
			{
				temp = array[j];
				array[j] = array[j + 1];
				array[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int i = 0;
	int A[] = { 1,3,2,4,6,5 };
	Paixu(A, 6);
	for (i = 0; i < 6; i++)
	{
		cout << A[i] << " ";
	}
	cout << endl;
	double B[] = { 1.2,3.1,2.1, 5.1, 6.2,4.2 };
	Paixu(B, 6);
	for (i = 0; i < 6; i++)
	{
		cout << B[i] << " ";
	}
	cout << endl;
	char C[] = { 'a','s','w','y','c','d' };
	Paixu(C, 6);
	for (int i = 0; i < 6; i++)
	{
		cout << C[i]<<" ";
	}
	cout << endl;
	return 0;
}

3.
#include "iostream"
using namespace std;
const int depth = 20;
template <typename T>
class Stack
{
public:
	Stack() { sp = 0; }
	T pop();
	void push(T data);
private:
	T stack[depth];
	int sp;
};
template <typename T>
T Stack<T>::pop()
	{
		if (sp == 0)
		{
			cout << "Stack is empty" << endl;
		}
		if (sp > 0)
		{
			return stack[--sp];
		}
		
			return 0;
	}
template <typename T>
	void Stack<T>::push(T data)
	{
		if (sp < depth)
		{
			stack[sp++] = data;
		}
		else
		{
			cout << "Stack is full" << endl;
		}
	}
int main()
{
	Stack<int>z;
	int a;
	z.push(1);
	z.push(2);
	z.push(3);
	z.push(4);
	for (int i = 0; i < 4; i++)
	{
		a = z.pop();
		cout << a << " ";
	}
	cout << endl;

	char b;
	z.push('a');
	z.push('b');
	z.push('c');
	z.push('d');
	for (int i = 0; i < 4; i++)
	{
		b = z.pop();
		cout << b << " ";
	}
	cout << endl;
	return 0;
}

4.
#include  "iostream"
using namespace std;

class Complex
{
public:
    double real,imag;

    Complex(){real=0;imag=0;}
    Complex(double r,double i){real=r;imag=i;}
    Complex operator+(Complex &c)
    {
        Complex temp;
        temp.real=real+c.real;
        temp.imag=imag+c.imag;
        return temp;
    }
    Complex operator-(Complex &c)
    {
        Complex temp;
        temp.real=real-c.real;
        temp.imag=imag-c.imag;
        return temp;
    }
    Complex operator*(Complex &c)
    {
        Complex temp;
        temp.real=real*c.real-imag*c.imag;
        temp.imag=imag*c.real+real*c.imag;
        return temp;
    }
    Complex operator/(Complex &c)
    {
        Complex temp;
        temp.real=(real*c.real-imag*c.imag)/(c.real*c.real+c.imag*c.imag);
        temp.imag=(imag*c.real-real*c.imag)/(c.real*c.real+c.imag*c.imag);
        return temp;
    }
    void show()
    {
        if(imag>=0)
        cout<<real<<"+"<<imag<<"i"<<endl;
        if(imag<0)
        cout<<real<<imag<<"i"<<endl;
    }

};

int main()
{
    Complex com(2 , 4);
    Complex com2(1 ,-3);
    Complex com3;
    cout<<"com=2+4i "<<"com3=1-3i"<<endl;

    com3=com2+com;
    cout<<"com3=com+com2= ";
    com3.show();

    com3=com-com2;
    cout<<"com3=com-com2= ";
    com3.show();

    com3=com*com2;
    cout<<"com3=com*com2= ";
    com3.show();

    com3=com/com2;
    cout<<"com3=com/com2= ";
    com3.show();

    return 0;
}

5.
#include <iostream>
using namespace std;

class A
{
    private: int x,y;
    public:
        A(){}
        A(int a,int b)
        {
          x=a;
          y=b;
        }
    friend istream & operator>>(istream &is,A &obj);  //声名为友元函数
    friend ostream & operator<<(ostream &os,A &obj);
};
ostream &operator <<(ostream &os,A &obj)  //输出运算符重载
{
    os<<"x="<<obj.x<<"  y="<<obj.y<<endl;
    return os;
}
istream &operator>>(istream &is,A &obj)  //输入运算符重载
{
    is>>obj.x;
    is>>obj.y;
    return is;
}
int main()
{
    A p1(1 ,2);
    A p2;
    cout<<p1<<endl;

    cout<<"input x y="<<endl;
    cin>>p2;
    cout<<p2;
    return 0;
}