Lab8 part2矩阵操作分数操作

8.设计一个Rational类,进行带分数的运算。要求:
(1)包含两个整数成员变量表示分子和分母。
(2)包含一个对所声明对象初始化的构造函数。不提供参数时,构造函数应提供默认值。分数存放成简化形式,例如分数“2/4”应在对象中存放成分子1和分母2的形式。
(3)对下列情况提供public成员函数:
a)两个Rational值相加,结果保存成简化形式。
b)两个Rational值相减,结果保存成简化形式。
c)两个Rational值相乘,结果保存成简化形式。
d)两个Rational值相除,结果保存成简化形式。
e)按a/b形式打印Rational值,其中a为分子,b为分母。
(4)编写主函数,测试Rational类。
(5)将上述成员函数改为运算符重载的形式,分别作为成员函数和友元函数实现上述功能。

#include<iostream>
using namespace std;
int Gcd(int a, int b)
{
	if (a < b) swap(a, b);
	if (a % b == 0) return b;
	else return Gcd(b, a % b);
}
class Rational
{
private:
	int fenz;
	int fenm;
public:
	Rational(int z, int m)
	{
		int gcd = Gcd(abs(z), abs(m));
		fenz = z / gcd;
		fenm = m / gcd;
	}
	Rational operator +(Rational A)
	{
		int fm = A.fenm * fenm;
		int aa = A.fenz * fenm;
		int bb = A.fenm * fenz;
		aa += bb;
		int gcd = Gcd(abs(aa), abs(fm));
		aa = aa / gcd;
		fm = fm / gcd;
		Rational B(aa, fm);
		return B;
	}
	Rational operator -(Rational A)
	{
		int fm = A.fenm * fenm;
		int aa = A.fenz * fenm;
		int bb = A.fenm * fenz;
		aa = bb - aa;
		int gcd = Gcd(abs(aa), abs(fm));
		aa = aa / gcd;
		fm = fm / gcd;
		Rational B(aa, fm);
		return B;
	}
	Rational operator *(Rational A)
	{
		int fm = A.fenm * fenm;
		int fz = A.fenz * fenz;
		int gcd = Gcd(abs(fz), abs(fm));
		fz = fz / gcd;
		fm = fm / gcd;
		Rational B(fz, fm);
		return B;
	}
	Rational operator /(Rational A)
	{
		int fz = A.fenm * fenz;
		int fm = A.fenz * fenm;
		int gcd = Gcd(abs(fz), abs(fm));
		fz = fz / gcd;
		fm = fm / gcd;
		Rational B(fz, fm);
		return B;
	}
	Rational& operator =(Rational A)
	{
		fenm = A.fenm;
		fenz = A.fenz;
		return *this;
	}
	void Print()
	{
		cout << fenz << "/" << fenm;
	}
};
int main()
{
	//请把符号带在分子上
	Rational C(2, 4);
	Rational D(5, 6);
	Rational E = C / D;
	E.Print();
	return 0;
}

9.定义一个二维方阵类 matrix。通过重载二元运算符“+”、“-”、“”和一元运算符“~”, 来实现矩阵加、矩阵减、矩阵乘以及矩阵转置。
Matrix类定义如下:
class matrix {
public:
int r, c; //r行c列的矩阵
int** mem; //矩阵数据
matrix(int a,int b); //二参构造函数,分配a行b列的mem动态数组存放数据
~matrix(); //析构函数,释放 mem 动态数组
matrix operator+ (matrix & m); //矩阵加
matrix operator- (matrix & m); //矩阵减
matrix operator
(matrix & m); //矩阵乘
matrix operator~ (); //矩阵转置
void display(); //输出矩阵
}; 输入 输入一共有 3 行,第一行输入 4 个正整数 r1,c1,r2,c2,分别代表矩阵 x 的行 r1 和列 c1,以及矩阵 y 的行 r2 和列 c2。其中 r1,c1,r2,c2 均大于 0。 第二行输入r1c1个整数,代表矩阵x的元素。第三行输入r2c2个整数,代表矩阵y的元素。输出 输出有 4 部分,每部分之间需要空一行,最后不空行 4 部分分别输出 x+y,x-y,x*y,~x 的结果 如果两个矩阵不能相加、相减或相乘就在对应部分输出“err” 提示:需要在类里面添加另外的函数才能保证正确性!

#include<iostream>
using namespace std;
class matrix {
public:
	int r, c; //r行c列的矩阵
	int** mem; //矩阵数据
	matrix(int a, int b) //二参构造函数,分配a行b列的mem动态数组存放数据
	{
		r = a;
		c = b;
		mem = new int* [a];
		for (int i = 0; i < a; i++)
		{
			mem[i] = new int[b];
		}
	}
	~matrix() //析构函数,释放 mem 动态数组
	{
		for (int i = 0; i < r; i++)
		{
			delete[]mem[i];
		}
		delete[]mem;
	}
	matrix(const matrix& p)
	{
		r = p.r;
		c = p.c;
		mem = new int* [r];
		for (int i = 0; i < r; i++)
		{
			mem[i] = new int[c];
		}
		for(int i=0;i<r;i++)
			for (int j = 0; j < c; j++)
			{
				mem[i][j] = p.mem[i][j];
			}
	}
	matrix operator + (matrix& m) //矩阵加
	{
		matrix X(r, c);
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
			{
				X.mem[i][j] = mem[i][j] + m.mem[i][j];
			}
		return X;
	}
	matrix operator- (matrix& m) //矩阵减
	{
		matrix X(r, c);
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
			{
				X.mem[i][j] = mem[i][j] - m.mem[i][j];
			}
		return X;
	}
	matrix operator* (matrix& m) //矩阵乘
	{
		matrix X(r, m.c);
		for (int i = 0; i < r; i++)
			for (int j = 0; j < m.c; j++)
			{
				X.mem[i][j] = 0;
				for (int k = 0; k < c; k++)
				{
					X.mem[i][j] += mem[i][k] * m.mem[k][j];
				}
			}
		return X;
	}
	matrix operator~ () //矩阵转置
	{
		matrix X(c, r);
		for (int i = 0; i < c; i++)
			for (int j = 0; j < r; j++)
			{
				X.mem[i][j] = mem[j][i];
			}
		return X;
	}
	void display() //输出矩阵
	{
		for (int i = 0; i < r; i++)
		{
			for (int j = 0; j < c; j++)
			{
				cout << mem[i][j];
				if (j != c - 1) cout << " ";
			}
			if (i != r - 1) cout << endl;
		}
	}
};
int main()
{
	int r1, c1, r2, c2;
	cin >> r1 >> c1 >> r2 >> c2;
	matrix A(r1, c1);
	matrix B(r2, c2);
	for (int i = 0; i < r1; i++)
		for (int j = 0; j < c1; j++)
		{
			cin >> A.mem[i][j];
		}
	for (int i = 0; i < r2; i++)
		for (int j = 0; j < c2; j++)
		{
			cin >> B.mem[i][j];
		}
	if (r1 != r2 || c1 != c2) cout << "无法做加法和减法";
	else
	{
		matrix C = A + B;
		C.display();
		cout << endl;
		matrix F = A - B;
		F.display();
	}
	cout << endl;
	if (c1 != r2) cout << "无法做乘法";
	else
	{
		matrix D = A * B;
		D.display();
	}
	cout << endl;
	matrix E =~A;
	E.display();
}//逆操作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值