7-2 矩阵的乘法运算 二维指针的初始化以及分类讨论思想

文章描述了一个C++程序,用于创建一个整数矩阵类,包括构造函数、矩阵乘法的运算符重载以及输出函数。程序接收两个矩阵作为输入,判断它们是否可进行乘法运算,并执行运算后输出结果。如果矩阵无法相乘,则输出错误信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7-2 矩阵的乘法运算线性代数中的矩阵可以表示为一个row*column的二维数组,当row和column均为1时,退化为一个数,当row为1时,为一个行向量,当column为1时,为一个列向量。
建立一个整数矩阵类matrix,其私有数据成员如下:

int row;
int column;
int **mat;

建立该整数矩阵类matrix构造函数;
建立一个 *(乘号)的运算符重载,以便于对两个输入矩阵进行乘法运算;
建立输出函数void display(),对整数矩阵按行进行列对齐输出,格式化输出语句如下:

cout<<setw(10)<<mat[i][j];
//需要#include <iomanip>

主函数里定义三个整数矩阵类对象m1、m2、m3.
###输入格式:
分别输入两个矩阵,分别为整数矩阵类对象m1和m2。
每个矩阵输入如下:
第一行两个整数 r c,分别给出矩阵的行数和列数
接下来输入r行,对应整数矩阵的每一行
每行输入c个整数,对应当前行的c个列元素
###输出格式:
整数矩阵按行进行列对齐(宽度为10)后输出
判断m1和m2是否可以执行矩阵相乘运算。
若可以,执行m3=m1*m2运算之后,调用display函数,对m3进行输出。
若不可以,输出"Invalid Matrix multiplication!"
提示:输入或输出的整数矩阵,保证满足row>=1和column>=1。

输入样例:

4  5
1 0 0 0 5
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
5  5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 8 9
5 6 7 8 9

输出样例:

        26        32        38        44        50
         4         6         8        10        12
         9        12        15        18        21
        16        20        24        32        36
#include<iostream>
#include<iomanip>
class matrix
{
private:
	int row;
	int column;
	int** mat;
	int shulie;   //判断是数列还是数(当row==1&&column==1不用对称也可以相乘)
public:
	matrix(int r=0,int c=0):row(r),column(c)   //重点:构造函数  二维数组指针的初始化
	{
		int i, j;
		mat = new int* [row];
		for (i = 0; i < row; i++)
			mat[i] = new int[column];
		for (i = 0; i < row; i++)
			for (j = 0; j < column; j++)
				mat[i][j] = 0;
	}
	void m_cin();                             //用来输入数列
	matrix operator* (matrix);                //数列相乘乘号重载
	void display();                           //输出
	bool panduan();                           //判断是数列还是数
};
bool matrix::panduan()     //判断是数列还是数
{
	if (row == 1 && column == 1)
	{
		shulie = 0;
		return 0;
	}
	else
	{
		shulie = 1;
		return 1;
	}
}
void matrix::m_cin()       //用来输入数列
{
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < column;j++) 
			std::cin >>mat[i][j];
}
matrix matrix::operator* (matrix m)     //数列相乘乘号重载
{
	int i, j;
	int k = 0;                        //注意分类讨论
	if (shulie==0)
	{
		matrix m3(m.row, m.column);      //初始化的不同
		for (i = 0; i < m.row; i++) 
			for (j = 0; j < m.column; j++) 
				m.mat[i][j] = mat[0][0] * m.mat[i][j];
		return m;
	}
	else if(m.shulie==0)
	{
		matrix m3(row, column);        //初始化的不同
		for (i = 0; i < row; i++) 
			for (j = 0; j < column; j++) 
				m.mat[i][j] =m. mat[0][0] * mat[i][j];
			return m;
		}

	else
	{
		matrix m3(row, m.column);          //初始化的不同
		for (i = 0; i < row; i++)
			for (j = 0; j < m.column; j++)
				for (k = 0; k < m.row; k++)
					m3.mat[i][j] += mat[i][k] * m.mat[k][j];
		return m3;
	}
}
void matrix:: display()       //输出
{
	int i, j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < column; j++)
		{
			std::cout << std::setw(10) << mat[i][j];
		}
		std::cout << std::endl;
	}
}
int main()
{
	int m1_r, m2_r, m1_c, m2_c;
	std::cin >> m1_r >> m1_c;
	matrix m1(m1_r, m1_c);
	m1.m_cin();
	std::cin >> m2_r >> m2_c;
	matrix m2(m2_r, m2_c);
	m2.m_cin();
	int m1_shulie=m1.panduan();
	int m2_shulie = m2.panduan();
	if (m1_c != m2_r&&m1_shulie*m2_shulie!=0)         //注意要排除是数的情况
		std::cout << "Invalid Matrix multiplication!" << std::endl;
	else
	{
		m1 = m1 * m2;
		m1.display();
	}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值