C++编程 --【 动态生成三维数组 】

本文介绍了如何在C++中创建Martrix3类,用于动态生成三维数组,并通过友元函数重载+和-运算符,实现了矩阵的加法和减法操作。示例代码展示了如何实例化对象并进行基本的矩阵运算。
摘要由CSDN通过智能技术生成

创建Martrix3类, 能够动态生成一个指定维数的三维数组,继而生成两个对象a,b,最后求两个三维数组之和a+b,以及三维数组差a-b,重载运算符+,-,>>,<<使之实现基于矩阵的+,-,输入和输出。

 方法一:

#include <iostream>
#include<ctime> 
#include<Windows.h> 
using namespace std;

class Martrix3
{
private:
	int x;
	int y;
	int z;
	int* pointer;
public:
	//友元函数重载<< >> 
	friend ostream& operator<<(ostream& output, const Martrix3& martrix3);
	friend istream& operator>>(istream& input, const Martrix3& martrix3);
	//定义+ - 
	friend  Martrix3 operator+(const Martrix3& a, const Martrix3& b);
	friend  Martrix3 operator-(const Martrix3& a, const Martrix3& b);

	Martrix3()
	{
		this->x = 0; //长 
		this->y = 0; //宽 
		this->z = 0; //高 
		pointer = NULL;
	}
	
	Martrix3(int x, int y, int z)
	{
		this->x = x;
		this->y = y;
		this->z = z;
		this->pointer = new int[this->x * this->y * this->z];
		int i, j, k;
		srand((unsigned)time(NULL));
		Sleep(1000);
		for (i = 0; i < x; i++)
		{
			for (j = 0; j < y; j++)
			{
				for (k = 0; k < z; k++)
				{
					pointer[i * x + j * y + k] = rand() % 11;
				}
			}
		}
	}
};

ostream& operator<<(ostream& output, const Martrix3& martrix3)  //<< 
{    
	for (int i = 0; i < martrix3.x; i++)
	{
		for (int j = 0; j < martrix3.y; j++)
		{
			for (int k = 0; k < martrix3.z; k++)
				output << martrix3.pointer[i * martrix3.x + j * martrix3.y + k] << ' ';
			output << endl;
		}
		output << endl;
	}

	return output;
}

istream& operator>>(istream& input, const Martrix3& martrix3)  //>>
{

	for (int i = 0; i < martrix3.x; i++)
	{
		for (int j = 0; j < martrix3.y; j++)
		{
			for (int k = 0; k < martrix3.z; k++)
			{
				input >> martrix3.pointer[i * martrix3.x + j * martrix3.y + k];
			}
			cout << endl;
		}
	}
	return input;
}

Martrix3 operator+(const Martrix3& a, const Martrix3& b) //+
{
	int x = a.x;
	int y = a.y;
	int z = a.z;
	Martrix3 result(x, y, z);
	for (int i = 0; i < x; i++)
	{
		for (int j = 0; j < y; j++)
		{
			for (int k = 0; k < z; k++)
			{
				result.pointer[i * x + j * y + k] = a.pointer[i * x + j * y + k] + b.pointer[i * x + j * y + k];
			}
		}
	}
	return result;
}

Martrix3 operator-(const Martrix3& a, const Martrix3& b)  //-
{
	int x = a.x;
	int y = a.y;
	int z = a.z;
	Martrix3 result(x, y, z);
	for (int i = 0; i < x * y * z; i++)
	{
		 result.pointer[i] = a.pointer[i] - b.pointer[i];
	}
	return result;
}


int main()
{
	Martrix3 a(2,5,4);
	Martrix3 b(2,5,4);
	Martrix3 c;
	Martrix3 d;
	cout << "三维数组a:" << endl;
	cout << a << endl;
	cout << "三维数组b:" << endl;
	cout << b << endl;
	c = a + b;
	d = a - b;
	cout << "矩阵相加:"<< endl;
	cout << c << endl;
	cout << "矩阵相减:" << endl;
	cout << d << endl;
	return 0;
}

方法二:
#include <iostream>
#include <iomanip>
#include<ctime>
#include<Windows.h> 
using namespace std;


class Martrix3 {
private:
    int height, row, col;  //依次为三维数组的高、行、列
    int*** mat;

public:
    Martrix3();
    Martrix3(int height, int row, int col);
    Martrix3(const Martrix3& m);  //拷贝构造函数
    ~Martrix3();
    void filldata();

    Martrix3& operator=(const Martrix3& m)
    {
        int i, j, k;
        int height, row, col;
        height = m.height;
        row = m.row;
        col = m.col;
        this->height = height;
        this->row = row;
        this->col = col;
        this->mat = new int** [this->height];//动态创建三维数组
        for (i = 0; i < height; i++)
        {
            mat[i] = new int* [row];
        }

        for (i = 0; i < height; i++)
        {
            for (j = 0; j < row; j++)
            {
                mat[i][j] = new int[this->col];
            }
        }

        for (i = 0; i < height; i++)
        {
            for (j = 0; j < row; j++)
            {
                for (k = 0; k < col; k++)
                {
                    mat[i][j][k] = m.mat[i][j][k];
                }
            }
        }
        return (*this);
    }


    定义+ - * /      
    friend Martrix3 operator +(Martrix3& m1, Martrix3& m2);
    friend Martrix3 operator -(Martrix3& m1, Martrix3& m2);
    //    
    //友元函数重载<< >> 
    friend ostream& operator << (ostream& output, Martrix3& A);
    friend istream& operator >> (istream& input, Martrix3& A);

    
};

Martrix3::Martrix3() {
    this->height = 0;
    this->row = 0;
    this->col = 0;
    this->mat = NULL;
}

Martrix3::Martrix3(int height, int row, int col) {
    this->height = height;
    this->row = row;
    this->col = col;

    int i, j;
    mat = new int** [this->height];
    for (i = 0; i < this->height; i++)
    {
        mat[i] = new int* [this->row];
    }

    for (i = 0; i < this->height; i++)
    {
        for (j = 0; j < this->row; j++)
        {
            mat[i][j] = new int[this->col];
        }
    }
}

void Martrix3::filldata()
{
    //输入三维数组值:
    srand((unsigned)time(NULL));
    Sleep(1000);
    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < row; j++)
        {
            for (int k = 0; k < col; k++)
            {
                mat[i][j][k] = rand() % 11;
                //                  cout<<mat[i][j][k]<<"\t";
            }
        }
    }
}

Martrix3::~Martrix3()
{
    int i, j;
    for (i = 0; i < this->height; i++)
    {
        for (j = 0; j < this->row; j++)
        {
            delete[] mat[i][j];
        }
        delete[] mat[i];
    }
    delete[] mat;//先创建的后析构
}

//定义拷贝构造函数
Martrix3::Martrix3(const Martrix3& m)
{
    int i, j, k;
    row = m.row;
    col = m.col;
    height = m.height;
    mat = new int** [this->height];//动态创建三维数组
    for (i = 0; i < height; i++)
        mat[i] = new int* [row];

    for (i = 0; i < height; i++)
        for (j = 0; j < row; j++)
            mat[i][j] = new int[this->col];

    for (i = 0; i < height; i++)
        for (j = 0; j < row; j++)
            for (k = 0; k < col; k++)
                mat[i][j][k] = m.mat[i][j][k];
}

istream& operator >> (istream& input, Martrix3& A)
{
    int i, j, k;
    cout << "请输入三维矩阵:" << endl;
    for (i = 0; i < A.height; i++) {
        //    cout<<"输入第  "<<i+1<<"  高:"<<endl;
        for (j = 0; j < A.row; j++)
        {
            //    cout<<"输入第  "<<j+1<<"  行:"<<endl;
            for (k = 0; k < A.col; k++) {
                input >> A.mat[i][j][k];
            }
        }
    }
    return input;
}

ostream& operator << (ostream& output, Martrix3& A)
{
    int i, j, k;
    for (i = 0; i < A.height; i++)
    {
        //cout<<"height="<<i<<":"<<endl; 
        for (j = 0; j < A.row; j++)
        {
            for (k = 0; k < A.col; k++)
            {
                output << A.mat[i][j][k] << "\t";
            }
            //cout<<endl;
        }
        //cout<<endl;
    }
    return output;
}

Martrix3 operator +(Martrix3& m1, Martrix3& m2) {
    Martrix3 m3(m1.height, m1.row, m1.col);
    int i, j, k;
    if ((m1.row == m2.row) && (m1.col == m2.col) && (m1.height == m2.height)) //判断两个矩阵是否为行数列数高数相同的矩阵,若是,就进行对应元素相加
    {
        for (i = 0; i < m1.height; i++)
            for (j = 0; j < m1.row; j++)
                for (k = 0; k < m1.col; k++)
                    m3.mat[i][j][k] = m1.mat[i][j][k] + m2.mat[i][j][k];
    }
    return m3;
}


Martrix3 operator -(Martrix3& m1, Martrix3& m2) {
    Martrix3 m3(m1.height, m1.row, m1.col);
    int i, j, k;
    if ((m1.row == m2.row) && (m1.col == m2.col) && (m1.height == m2.height)) 
        //判断两个矩阵是否为行数列数高数相同的矩阵,若是,就进行对应元素相减 
    {
        for (i = 0; i < m1.height; i++)
            for (j = 0; j < m1.row; j++)
                for (k = 0; k < m1.col; k++)
                    m3.mat[i][j][k] = m1.mat[i][j][k] - m2.mat[i][j][k];
    }
    return m3;
}

int main()
{
    Martrix3 a(3, 2, 2);
    a.filldata();
    cout << "三维数组a:" << endl;
    cout << a << endl;

    Martrix3 b(3, 2, 2);
    b.filldata();
    cout << "三维数组b:" << endl;
    cout << b << endl;

    Martrix3 c;
    c = a + b;
    cout << "矩阵相加:" << endl;
    cout << c << endl;

    Martrix3 d(a - b);
    //d = a - b;   //d.operatore=(a-b); 
    cout << "矩阵相减:" << endl;
    cout << d << endl;

    //    Martrix3 e(2,2,2);
    //    cin >>e;
    //    cout <<e;

    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值