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();
}//逆操作