用一维数组实现矩阵,并完成加,减,乘运算

一道oj刷题中见到的,对于一维数组实现矩阵的坐标变化还想了好一阵,现在总结一下。
这里重载了<<和>>运算符

//错误:一开始没有写复制构造函数,并且重载赋值函数里没有delete,所以导致溢出错误,切记切记
//vs就出现了未加载wtndll的错误,就是因为指针指向错误导致的栈溢出
#include<iostream>
using namespace std;
class integer {
protected:
	int n;
};


class Vector :public integer {
protected:
	int* v;
public:
	Vector(int nu)
	{
		n = nu; v = new int[nu];
		for (int i = 0; i < nu; i++)
			v[i] = 0;
	}
	Vector(int num, int* vec) {
		n = num;
		v = new int[num];
		for (int i = 0; i < num; i++)
		{
			v[i] = vec[i];
		}
	}
	Vector() {
		n = 1;
		v = new int[n];
	}
	~Vector() { delete[]v; v = NULL; n = 0; }
};
class Matrix :public Vector {
	int column, row;
public:
	Matrix(int r, int c) :Vector(c* r) {
		column = c; row = r;
	}
	Matrix() { column = 1; row = 1; }
	Matrix(const Matrix& m) {
		column = m.column; row = m.row; v = new int[column * row];
		for (int i = 0; i < column * row; i++) {
			v[i] = m.v[i];
		}
	}
	friend Matrix operator+(const Matrix& m1, const Matrix& m2);
	friend Matrix operator- (const Matrix& m1, const Matrix& m2);
	Matrix operator* (const Matrix& m1);
	Matrix& operator =(const Matrix&);
	friend ostream& operator<<(ostream& output, const Matrix& m);
	friend istream& operator>>(istream& input, Matrix& m);

};
Matrix operator+(const Matrix& m1, const Matrix& m2) {
	if (m1.column != m2.column || m1.row != m2.row) {
		cout << "matrix size not match" << endl;
		exit(0);
	}
	else {
		Matrix temp(m1.row, m1.column);
		for (int i = 0; i < m1.row; i++) {
			for (int j = 0; j < m1.column; j++) {
				temp.v[i * m1.column + j] = m1.v[i * m1.column + j] + m2.v[i * m2.column + j];//
			}
		}
		return temp;
	}
}
Matrix operator-(const Matrix& m1, const Matrix& m2) {
	if (m1.column != m2.column || m1.row != m2.row) {
		cout << "matrix size not match" << endl;
		exit(0);
	}
	else {
		Matrix temp(m1.row, m1.column);
		for (int i = 0; i < m1.row; i++) {
			for (int j = 0; j < m1.column; j++) {
				temp.v[i * m1.column + j] = m1.v[i * m1.column + j] - m2.v[i * m2.column + j];//注意此处的下标变化
			}
		}
		return temp;
	}
}
Matrix& Matrix::operator =(const Matrix& m) {
	delete[]v;
	column = m.column;
	row = m.row;
	n = m.column * m.row;
	v = new int[n];
	for (int i = 0; i < row * column; i++) {
		v[i] = m.v[i];
	}
	return *this;
}
ostream& operator<<(ostream& output, const Matrix& m) {
	for (int i = 0; i < m.row; i++)
	{
		for (int j = 0; j < m.column; j++)
		{
			output << m.v[i * m.column + j];
			if (j != m.column - 1)
				output << " ";
			else
				output << "\n";
		}
	}
	return output;
}
istream& operator>>(istream& input, Matrix& m) {
	for (int i = 0; i < m.row; i++) {
		for (int j = 0; j < m.column; j++) {
			input >> m.v[i * m.column + j];
		}
	}
	return input;
}
Matrix Matrix::operator*(const Matrix& m1) {
	if (column != m1.row)
	{
		cout << "matrix size not match" << endl;
		exit(0);
	}
	else
	{
		int re = row;
		int ce = m1.column;
		Matrix result(re, ce);
		for (int i = 0; i < re; i++)
		{
			for (int j = 0; j < ce; j++)
			{
				for (int k = 0; k < column; k++) {
					result.v[i * ce + j] += v[i * column + k] * m1.v[k * ce + j];
				}
			}
		}
		return result;
	}
}
/*int main() {
	int r1, r2, c1, c2;
	cout << "Input the numble of row and column of Matrix A:\n";
	cin >> r1 >> c1;
	Matrix A(r1, c1);
	cout << "Input the elements of Matrix A:\n";
	cin >> A;
	cout << "Input the numble of row and column of Matrix B:\n";
	cin >> r2 >> c2;
	Matrix B(r2, c2);
	cout << "Input the elements of Matrix B:\n";
	cin >> B;
	Matrix C;
	cout << "A+B=" << endl;
	C = A + B;
	cout << C;
	cout << "A-B=" << endl;
	C = A - B;
	cout << C;
	cout << "A*B=" << endl;
	C = A * B;
	cout << C;
}*/

焦头烂额了好半天,都是粗心惹的祸。
写程序不能心浮气躁,要静下心来一点点调试。

实现有两个 CVector 存放数据的自定义动态数组,采用一维动态数组存储矩阵数据 CMatrix 实现矩阵 使用的时候包含#include "Matrix.h"就行 CMatrix的接口函数都在"Matrix.h"里面 CVector的接口函数在"Vector.h"里,"Matrix.h"里包含了"Vector.h" 具体用法与测试用例Main.cpp里有3个测试用例,分别是针对构造函数属性计算与运算符重载的 内已包含测试工程xp\vc6.0\上亲测通过,并经过BoundsChecker测试没有内存泄漏。有兴趣的童鞋可以下作参考。 注意: 1、下标都是从0开始,数学课上矩阵下标都是从1开始,但是工作后习惯0开始,矩阵M的第一个元素是M(0,0) 2、型定死为double,原来作业是模板,由于vc6对模版支持不好,另矩阵计算double比较理想、整型几乎只能作 提供了多种初始化方式,int[]、float[]、double[]均可构造初始化,或则先构造出CVector再由CVector初始化。 3、定义了一个最大允许误差#define permit_eof (1.0e-13),判断相等使用宏 #define EQUAL(a,b) ( ((b) - (a) < permit_eof)&&((a) - (b) < permit_eof) ? (TRUE) : (FALSE) ) 正常输出的时候绝对值小于permit_eof 的时候清零处理,想要指定精度输出请用PrintOut 鸣谢:CSDN上supermegaboy君的C/C++左值性精髓,读后略有所感,空闲时重构了下大学时的作业,着重区分了函数返回值的左右值 =================================================附录:接口函数========================================================================== 开放的接口: CVector //构造函数 CVector(); virtual ~CVector(); CVector(const size_t &nSize;); CVector(const CVector & vIn);//拷贝构造函数 CVector(const double* const pData,const size_t &nSize;); CVector(const float* const pData,const size_t &nSize;); CVector(const int* const pData,const size_t &nSize;); //公开的成员函数 double at(const size_t& uIndex)const;//作右值 BOOL push_back(const double& dbIn ); BOOL resize(const size_t& nSize); size_t size()const; //重载操作符 double& operator()(const UINT& uIndex);//重载()运算符,可作左值 //重载的运算符 double& operator()(const size_t& xr,const size_t& xc);//重载()运算符,可作左值 CVector& operator=(const CVector &);//重载=运算符 double operator*(const CVector & )const;//重载*运算符,两向量相乘 CVector operator*(const double α)const;//重载*运算符,向量乘以实数alpha CVector& operator*=(const double α);//重载*=算符,向量乘以实数alpha CVector operator+(const CVector & )const;//重载+运算符,向量上向量 CVector& operator+=(const CVector & );//重载+=算符,向量上向量 CVector operator-(const CVector & )const;//重载+运算符,向量上向量 CVector& operator-=(const CVector & );//重载+=算符,向量上向量 CVector operator+(const double α)const;//重载+运算符,向量上实数alpna CVector& operator+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值