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


一、实验目的和要求:

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;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是在C++中采取运算符重载模板编写五子棋游戏的代码实现。 首先是棋子类的定义,需要记录棋子的颜色和位置信息: ```c++ enum class ChessColor { BLACK, WHITE, NONE }; class Chess { public: ChessColor color; int x, y; Chess(ChessColor _color, int _x, int _y) : color(_color), x(_x), y(_y) {} }; ``` 接下来是棋盘类的定义,使用一个二维数组来表示棋盘,同时定义了一些常量和运算符重载: ```c++ const int BOARD_SIZE = 15; class Board { public: Chess board[BOARD_SIZE][BOARD_SIZE]; Board() { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { board[i][j].color = ChessColor::NONE; board[i][j].x = i; board[i][j].y = j; } } } Chess& operator()(int x, int y) { return board[x][y]; } const Chess& operator()(int x, int y) const { return board[x][y]; } bool operator==(const Board& rhs) const { for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board[i][j].color != rhs.board[i][j].color) { return false; } } } return true; } bool operator!=(const Board& rhs) const { return !(*this == rhs); } }; ``` 接着是游戏类的定义,使用模板类来支持不同类型的玩家: ```c++ template <typename Player1, typename Player2> class Game { public: Board board; Player1 player1; Player2 player2; Game(const Player1& _player1, const Player2& _player2) : player1(_player1), player2(_player2) {} void start() { int turn = 0; ChessColor current_color = ChessColor::BLACK; while (true) { Board prev_board = board; ChessMove move; if (current_color == ChessColor::BLACK) { move = player1.play(board, current_color); } else { move = player2.play(board, current_color); } if (!is_valid_move(move)) { std::cerr << "Invalid move, try again!" << std::endl; continue; } board(move.x, move.y).color = current_color; if (is_game_over()) { std::cout << "Game over!" << std::endl; break; } if (board == prev_board) { std::cerr << "No progress made, try again!" << std::endl; continue; } turn++; current_color = (turn % 2 == 0) ? ChessColor::BLACK : ChessColor::WHITE; } } private: bool is_valid_move(const ChessMove& move) const { if (move.x < 0 || move.x >= BOARD_SIZE || move.y < 0 || move.y >= BOARD_SIZE) { return false; } if (board(move.x, move.y).color != ChessColor::NONE) { return false; } return true; } bool is_game_over() const { // Check rows for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE - 4; j++) { if (board(i, j).color != ChessColor::NONE && board(i, j).color == board(i, j + 1).color && board(i, j).color == board(i, j + 2).color && board(i, j).color == board(i, j + 3).color && board(i, j).color == board(i, j + 4).color) { return true; } } } // Check columns for (int i = 0; i < BOARD_SIZE - 4; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board(i, j).color != ChessColor::NONE && board(i, j).color == board(i + 1, j).color && board(i, j).color == board(i + 2, j).color && board(i, j).color == board(i + 3, j).color && board(i, j).color == board(i + 4, j).color) { return true; } } } // Check diagonals for (int i = 0; i < BOARD_SIZE - 4; i++) { for (int j = 0; j < BOARD_SIZE - 4; j++) { if (board(i, j).color != ChessColor::NONE && board(i, j).color == board(i + 1, j + 1).color && board(i, j).color == board(i + 2, j + 2).color && board(i, j).color == board(i + 3, j + 3).color && board(i, j).color == board(i + 4, j + 4).color) { return true; } } } for (int i = 0; i < BOARD_SIZE - 4; i++) { for (int j = 4; j < BOARD_SIZE; j++) { if (board(i, j).color != ChessColor::NONE && board(i, j).color == board(i + 1, j - 1).color && board(i, j).color == board(i + 2, j - 2).color && board(i, j).color == board(i + 3, j - 3).color && board(i, j).color == board(i + 4, j - 4).color) { return true; } } } return false; } }; ``` 最后是玩家类的定义,需要实现play方法来返回一个合法的下棋位置: ```c++ class HumanPlayer { public: ChessMove play(const Board& board, ChessColor color) { while (true) { std::cout << "Enter your move (x y): "; int x, y; std::cin >> x >> y; if (std::cin.fail()) { std::cin.clear(); std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); std::cerr << "Invalid input, try again!" << std::endl; continue; } return ChessMove(x, y); } } }; class RandomPlayer { public: ChessMove play(const Board& board, ChessColor color) { std::vector<ChessMove> moves; for (int i = 0; i < BOARD_SIZE; i++) { for (int j = 0; j < BOARD_SIZE; j++) { if (board(i, j).color == ChessColor::NONE) { moves.push_back(ChessMove(i, j)); } } } std::random_device rd; std::mt19937 g(rd()); std::shuffle(moves.begin(), moves.end(), g); return moves.front(); } }; ``` 在main函数中,可以使用如下代码来开始游戏: ```c++ int main() { Game<HumanPlayer, RandomPlayer> game(HumanPlayer(), RandomPlayer()); game.start(); return 0; } ``` 这样就完成了在C++中采取运算符重载模板编写五子棋游戏的实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值