C++篇:使用C++的类完成读写文件的矩阵乘法

题目:使用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++代码文件同一文件夹下。

此程序为本人原创,经测试有效,如有其他不足之处,还望大家批评指正。

猜你喜欢

转载自blog.csdn.net/qq_36163358/article/details/83783783