题目:使用C++的类完成读写文件的矩阵乘法
要求:1.分别从两个文件Matrix_A.txt以及Matrix_B.txt中读取两个矩阵。
2.计算两个矩阵的相乘结果,并将乘积矩阵输出至Matrix_mul.txt中。
3.整个程序要求使用C++语言中的类操作实现。
4.包含安全性检查:文件找不到、文件为空、相乘的两矩阵维数不匹配等
输入输出样例
输入文件Matrix_A.txt中内容:
1
2
输入文件Matrix_B.txt中内容:
1 2
输出文件Matrix_mul.txt中内容:
The matrix result of A*B is
1 2
2 4
C++代码实现
#include<iostream>
#include<fstream>
using namespace std;
//建立矩阵类
class Matrix
{
public:
int ROW_A,COL_A,ROW_B,COL_B;
int *Matrix_A=new int [ROW_A*COL_A];//使用动态分配内存
int *Matrix_B=new int [ROW_B*COL_B];
int *Matrix_mul=new int [ROW_A*COL_B]();
void Matrix_input(int *matrix_X,int row,int col,const char* filename);
void Matrix_output(int *matrix_X,int row,int col,const char* filename);
void Matrix_mulr(int *matrix_A,int row_A,int col_A,int *matrix_B,int row_B,int col_B,int *matrix_mul);
Matrix(int a,int b,int c,int d);
~Matrix();
};
//构造函数初始化列表 &析构函数
Matrix::Matrix(int a,int b,int c,int d):ROW_A(a),COL_A(b),ROW_B(c),COL_B(d)
{
}
Matrix::~Matrix()
{
delete []Matrix_A;//释放分配的内存
delete []Matrix_B;
delete []Matrix_mul;
cout<<"The program is completed successfully!" <<endl;
}
// 从文件读出矩阵,将其存入需要相乘的矩阵中
void Matrix::Matrix_input(int *matrix_X,int row,int col,const char* filename)
{
ifstream infile;
infile.open(filename);
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
infile >> *(matrix_X+j+i*row);
}
}
infile.close();
}
//将乘积得到的矩阵结果输出到txt中
void Matrix::Matrix_output(int *matrix_X,int row,int col,const char* filename)
{
ofstream outfile;
outfile.open(filename);
outfile<<"The matrix result of A*B is" <<endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
outfile<<*(matrix_X+i*row+j)<<'\t';
}
outfile<<endl;
}
outfile.close();
}
//计算矩阵相乘过程
void Matrix::Matrix_mulr(int *matrix_A,int row_A,int col_A,int *matrix_B,int row_B,int col_B,int *matrix_mul)
{
if(col_A==row_B)
{
for(int i=0;i<row_A;i++)
{
for(int j=0;j<col_B;j++)
{
for(int k=0;k<col_A;k++)
{
*(matrix_mul+i*row_A+j)+=*(matrix_A+i*row_A+k) * (*(matrix_B+k*col_A+j));
}
}
}
}
else
{
cout<<"The dimension of matrix A and matrix B is not matched"<<endl;
exit(1);
}
}
//从输入文件读取矩阵行数
int Read_row(const char* filename)
{
ifstream infile;
infile.open(filename);
if(!infile)
{
cout<<filename<<" is not found";//判断输入文件是否存在
exit(1);
return -1;
}
else
{
char c;
c=infile.get();
int count_row=0;
if(infile.eof())
{
cout<<filename<<" is empty";//判断输入文件是否为空
exit(1);
return -1;
}
else
{
while(!infile.eof())
{
c=infile.get();
if(c=='\n'||c=='\r')
count_row++;
}
infile.close();
return count_row+1;
}
}
}
//从输入文件读取矩阵列数
int Read_col(const char* filename)
{
ifstream infile;
infile.open(filename);
char c;
c=infile.get();
int count_col=0;
while(c!='\n'&&c!='\r'&&(!infile.eof()))
{
count_col++;
c=infile.get();
}
infile.close();
return (count_col+1)/2;
}
int main()
{
int Row_A,Col_A,Row_B,Col_B;
Row_A=Read_row("Matrix_A.txt");
Col_A=Read_col("Matrix_A.txt");//分别读取两输入文件的 的矩阵行数、列数
Row_B=Read_row("Matrix_B.txt");
Col_B=Read_col("Matrix_B.txt");
if(Col_A!=Row_B)//判断矩阵维数是否相匹配
{
cout<<"The matrix dimension of A and B is not matched"<<endl;
exit(1);
}
Matrix M(Row_A,Col_A,Row_B,Col_B);//初始化矩阵类
M.Matrix_input((int*)M.Matrix_A,M.ROW_A,M.COL_A,"Matrix_A.txt");//将输入文件Matrix_A.txt中的矩阵A存入类中矩阵A
M.Matrix_input((int*)M.Matrix_B,M.ROW_B,M.COL_B,"Matrix_B.txt");//将输入文件Matrix_B.txt中的矩阵B存入类中矩阵B
M.Matrix_mulr((int*)M.Matrix_A,M.ROW_A,M.COL_A,(int*)M.Matrix_B,M.ROW_B,M.COL_B,(int*)M.Matrix_mul);//计算A*B并存入Matrix_mul
M.Matrix_output((int*)M.Matrix_mul,M.ROW_A,M.COL_B,"Matrix_mul.txt"); //将乘积结果输出至Matrix_mul.txt中
}
特别提示:实现代码时,需将输入文件的目录设置在与C++代码文件同一文件夹下。
此程序为本人原创,经测试有效,如有其他不足之处,还望大家批评指正。