上节学了类的友元,这节开始矩阵加法和乘法运算:
(一)加法:
三元组.h文件
#pragma once
#include
using namespace std;
#include
#define Max 100
#define ERROR 0
#define OK 1
typedef struct //三元组
{
int line; //行
int row; //列
int item; //值
}Trip;
class TripMN
{
private:
Trip dat[Max];
int L, R, num; //行 ,列, 非零元个数
public:
TripMN() //自我构造
{
L = 0;
R = 0;
num = 0;
}
TripMN(int m, int n) //创建对象时完成对属性的初始化
{
L = m;
R = n;
num = 0;
}
~TripMN()
{
//空
}
int set_Item(int line, int row, int item) //根据行号列号添加一个三元组
{
//******检查******//
if (line > L || row > R) //越界
{
return ERROR;
}
if (num == Max) //已存元素个数num达到过三元组可以存储的最大位
{
return ERROR;
}
if (item == 0) //输入的数组元素值为0,则不做插入,直接返回
{
return OK;
}
//******插入*******//
int index = 0; //存储元素应该插入的位置
while (index < num)
{
//作比较时看你时先插第一行之后下一行,然后在下一行,三元组如果是按这个方式,就先查行进行插入
if (line>dat[index].line)
{
index++; //先比行,行小于三元组行时,向后继续比较
}
else if (line == dat[index].line && (row > dat[index].row))
{
index++; //当行相等,列号大的时候,向后继续比较
}
else
{
break; //找到了位置
}
}
if (line == dat[index].line && row == dat[index].row)
{
dat[index].item = item; //如果所插正好相等,就覆盖
}
for (int i = num ; i > index ; i--)
{
dat[i].line = dat[i - 1].line;
dat[i].row = dat[i - 1].row;
dat[i].item = dat[i - 1].item; //**从尾部开始移位
}
dat[index].item = item; //插入
dat[index].line = line;
dat[index].row = row;
num++; //个数加一
return OK;
}
int get_Ttem(int line, int row) //根据行号和列号获得一个三元组
{
if (line > L || row > R) //越界检查
{
return 0;
}
for (int i = 0; i < num; i++) //遍历三元组
{
//如果发现行号列号匹配三元组,返回非零元素值
if (dat[i].line == line && dat[i].row == row)
{
return dat[i].item;
}
}
return 0;
}
void printMatrix() //按矩阵方式打印稀疏矩阵
{
int index = 0; //三元组下标
cout << "《打印稀疏矩阵》: " << endl;
for (int i = 1; i <= L; i++)
{
for (int j = 1; j <= R; j++)
{
if (i == dat[index].line && j == dat[index].row)
{
cout << dat[index].item << "\t";
index++;
}
else
{
cout << "0\t";
}
}
cout << "\n";
}
cout << "矩阵行数: " << L << "\n" << "矩阵列数:" << R << "\n" << "矩阵非零元个数: " << num << endl;
}
void printTrip() //打印三元组
{
cout << "\n";
int index = 0;
cout << "打印三元组数组(行,列,值): " << endl;
for(int i = 0; i < num; i++)
{
cout << "(" << dat[i].line << ", " << dat[i].row << ", " << dat[i].item << ")" << endl;
}
}
friend bool TripADD(TripMN& A, TripMN& B, TripMN& C); //加法 ,矩阵:A+B=C 友元
}; //需要被传出去的才加&
bool TripADD(TripMN& A, TripMN& B, TripMN& C)
{
if (A.L != B.L || B.L != C.L || A.R != B.R || B.R != C.R )
{
return false; //检查行列是否相等,矩阵加法前提
}
else
{
for (int i = 0; i < A.L; i++)
{
for (int j = 0; j < A.R; j++)
{
int item = A.get_Ttem(i,j) + B.get_Ttem(i,j); //将A,B矩阵值相加
//如果计算出来不为零,则插入矩阵之中
if (item != 0)
{
C.set_Item(i, j, item);
}
}
}
return true;
}
}
三元组.cpp文件
#include"三元组.h"
void input(int m,int n, int num, TripMN& trip) //初始化三元组
{
int line, row, item;
for (int i = 1; i <= num; i++)
{
cout << "请依次输入,行,列,和非零元:";
cin >> line >> row >> item;
if (item != 0)
{
if(trip.set_Item(line, row, item)==ERROR)
{
cout << "行号列号不正确,或者三元组已满 !!!";
break;
}
}
}
}
int main()
{
int m, n, num;
cout << "请输入第(一)个矩阵A行数列数,非零元个数: ";
cin >> m;
cin >> n;
cin >> num;
TripMN A(m,n); //类的人工初始化
input(m, n, num, A); //创建一个矩阵
//trip.printTrip();
A.printMatrix();
cout << "请输入第(二)个矩阵B行数列数,非零元个数: ";
cin >> m;
cin >> n;
cin >> num;
TripMN B(m, n); //类的人工初始化
input(m, n, num, B); //创建一个矩阵
//trip.printTrip();
B.printMatrix();
TripMN C(m, n);
bool resurt = TripADD(A, B, C);
if (resurt)
{
cout << "矩阵相加后C:" << endl;
C.printMatrix();
}
else
{
cout << "矩阵不能相加!!!" << endl;
}
return 0;
}
(二).乘法:
有i,j, k三个变量,i表示A矩阵的行,j表示A矩阵的列==B矩阵的行,k表示B矩阵的列。
.h文件
#pragma once
#include
using namespace std;
#include
#define Max 100
#define ERROR 0
#define OK 1
typedef struct //三元组
{
int line; //行
int row; //列
int item; //值
}Trip;
class TripMN
{
private:
Trip dat[Max];
int L, R, num; //行 ,列, 非零元个数
public:
TripMN() //自我构造
{
L = 0;
R = 0;
num = 0;
}
TripMN(int m, int n) //创建对象时完成对属性的初始化
{
L = m;
R = n;
num = 0;
}
~TripMN()
{
//空
}
int set_Item(int line, int row, int item) //根据行号列号添加一个三元组
{
//******检查******//
if (line > L || row > R) //越界
{
return ERROR;
}
if (num == Max) //已存元素个数num达到过三元组可以存储的最大位
{
return ERROR;
}
if (item == 0) //输入的数组元素值为0,则不做插入,直接返回
{
return OK;
}
//******插入*******//
int index = 0; //存储元素应该插入的位置
while (index < num)
{
//作比较时看你时先插第一行之后下一行,然后在下一行,三元组如果是按这个方式,就先查行进行插入
if (line>dat[index].line)
{
index++; //先比行,行小于三元组行时,向后继续比较
}
else if (line == dat[index].line && (row > dat[index].row))
{
index++; //当行相等,列号大的时候,向后继续比较
}
else
{
break; //找到了位置
}
}
if (line == dat[index].line && row == dat[index].row)
{
dat[index].item = item; //如果所插正好相等,就覆盖
}
for (int i = num ; i > index ; i--)
{
dat[i].line = dat[i - 1].line;
dat[i].row = dat[i - 1].row;
dat[i].item = dat[i - 1].item; //**从尾部开始移位
}
dat[index].item = item; //插入
dat[index].line = line;
dat[index].row = row;
num++; //个数加一
return OK;
}
int get_Ttem(int line, int row) //根据行号和列号获得一个三元组
{
if (line > L || row > R) //越界检查
{
return 0;
}
for (int i = 0; i < num; i++) //遍历三元组
{
//如果发现行号列号匹配三元组,返回非零元素值
if (dat[i].line == line && dat[i].row == row)
{
return dat[i].item;
}
}
return 0;
}
void printMatrix() //按矩阵方式打印稀疏矩阵
{
int index = 0; //三元组下标
cout << "《打印稀疏矩阵》: " << endl;
for (int i = 1; i <= L; i++)
{
for (int j = 1; j <= R; j++)
{
if (i == dat[index].line && j == dat[index].row)
{
cout << dat[index].item << "\t";
index++;
}
else
{
cout << "0\t";
}
}
cout << "\n";
}
cout << "矩阵行数: " << L << "\n" << "矩阵列数:" << R << "\n" << "矩阵非零元个数: " << num << endl;
}
void printTrip() //打印三元组
{
cout << "\n";
int index = 0;
cout << "打印三元组数组(行,列,值): " << endl;
for(int i = 0; i < num; i++)
{
cout << "(" << dat[i].line << ", " << dat[i].row << ", " << dat[i].item << ")" << endl;
}
}
friend bool TripADD(TripMN& A, TripMN& B, TripMN& C); //加法 ,矩阵:A+B=C 友元
//需要被传出去的才加&
friend bool TripXXX(TripMN& A, TripMN& B, TripMN& C); //乘法法则
};
bool TripXXX(TripMN& A, TripMN& B, TripMN& C)
{
int sum;
if (A.R != B.L)
{
return false;
}
else
{
for (int i = 1; i <= A.L; i++)
{
for (int j = 1; j <= B.R; j++)
{
sum = 0;
for (int k = 1; k <= A.R; k++) //A.R==B.L
{
sum = A.get_Ttem(i, k) * B.get_Ttem(k, j) + sum; //行列分别相加
}
if(sum!=0)
C.set_Item(i, j, sum);
}
}
return true;
}
}
bool TripADD(TripMN& A, TripMN& B, TripMN& C)
{
if (A.L != B.L || B.L != C.L || A.R != B.R || B.R != C.R )
{
return false; //检查行列是否相等,矩阵加法前提
}
else
{
for (int i = 0; i < A.L; i++)
{
for (int j = 0; j < A.R; j++)
{
int item = A.get_Ttem(i,j) + B.get_Ttem(i,j); //将A,B矩阵值相加
//如果计算出来不为零,则插入矩阵之中
if (item != 0)
{
C.set_Item(i, j, item);
}
}
}
return true;
}
}
.cpp文件
#include"三元组.h"
void input(int m,int n, int num, TripMN& trip) //初始化三元组
{
int line, row, item;
for (int i = 1; i <= num; i++)
{
cout << "请依次输入,行,列,和非零元:";
cin >> line >> row >> item;
if (item != 0)
{
if(trip.set_Item(line, row, item)==ERROR)
{
cout << "行号列号不正确,或者三元组已满 !!!";
break;
}
}
}
}
int main()
{
int m, n, num;
cout << "请输入第(一)个矩阵A行数列数,非零元个数: ";
cin >> m;
cin >> n;
cin >> num;
int CL = m; //乘法中C矩阵的行
TripMN A(m,n); //类的人工初始化
input(m, n, num, A); //创建一个矩阵
//trip.printTrip();
A.printMatrix();
cout << endl;
cout << "请输入第(二)个矩阵B行数列数,非零元个数: ";
cin >> m;
cin >> n;
cin >> num;
int CR = n; //乘法中C矩阵的列
TripMN B(m, n); //类的人工初始化
input(m, n, num, B); //创建一个矩阵
//trip.printTrip();
B.printMatrix();
cout << endl;
TripMN C(CL,CR);
bool resurt = TripXXX(A, B, C);
if (resurt)
{
cout << "矩阵相乘后C:" << endl;
C.printMatrix();
}
else
{
cout << "矩阵不能相乘!!!" << endl;
}
return 0;
}