矩阵乘法计算实验报告

C++课程设计实验报告

姓名:陈钱      学号:913116120316       班级:材科三班                   

题目:矩阵乘法计算                   难易级别:A级

实验报告成绩         

指导教师           

                                         时间:    年    月    日 

  

1 程序功能介绍

    编写实现矩阵乘法计算的程序。

2 程序设计要求

(1)    设计一个矩阵类,将相应的函数和数据封装在类中,简化程序。

(2)    修改程序结构,使程序可以反复执行,直至按键选择退出为止。

(3)    本程序用数组表示5*5矩阵,将其改为根据输入矩阵的大小动态分配空间[M][N]来放置数据,其中M,N为用户可输入的任意整数。

(4)    增加类的构造函数和成员函数,使得矩阵数据既可以用在对象初始化是赋值,也可以通过键盘赋值,还可以通过读数据文件输入。

(5)    用模板的形式改写矩阵数据类型,使得矩阵中的数据既可以是整型数据,也可以是浮点型数据,执行程序是,分别定义一个整型矩阵和一个浮点型矩阵进行乘法验证。

(6)    完成矩阵的乘法运算,在运算之前判断着两个矩阵是否满足运算条件,如果不满足,给出提示信息。

3 程序设计思想

 1)类的结构

  该矩阵类的定义是将相关的数据和操作封装起来,用于实现乘法运算的矩阵要有两个矩阵类参与,结果放在另一个矩阵类的对象中,建议重载运算符*,并把这个重载函数定义为类的友元函数。参考的类的机构如下:

#include<iostream.h>

#include<fstream.h>

#include<iomanip.h>

#include<stdlib.h>

template<class T>

class CMatrix

       T * * Mat;    //矩阵的头指针

       int nRow;     //矩阵的行数

       int nCol;     //矩阵的列数

public:

       CMatrix();    //缺省的构造函数

       CMatrix(T * * mat,int row,int col); //构造函数

       CMatrix(int row,int col);  //构造函数

       CMatrix(int row,int col,int k);  //构造函数,从键盘输入矩阵    

       void Show();     //输出

       void InputFromFile();  //从文件输入矩阵

       friend CMatrix<T>operator *(CMatrix<T> &mat1,CMatrix<T> &mat2);  //重载乘法

};

4 实际运行程序如下:

#include<iostream.h>

#include<fstream.h>

#include<iomanip.h>

#include<stdlib.h>

template<class T>

class CMatrix

       T * * Mat;    //矩阵的头指针

       int nRow;     //矩阵的行数

       int nCol;     //矩阵的列数

public:

       CMatrix();    //缺省的构造函数

       CMatrix(T * * mat,int row,int col); //构造函数

       CMatrix(int row,int col);  //构造函数

       CMatrix(int row,int col,int k);  //构造函数,从键盘输入矩阵    

       void Show();     //输出

       void InputFromFile();  //从文件输入矩阵

       friend CMatrix<T>operator *(CMatrix<T> &mat1,CMatrix<T> &mat2);  //重载乘法

};

template<class T>

CMatrix<T>::CMatrix()  //缺省的构造函数

{

        nRow=100,nCol=100;

        Mat=new T*[100];

        for(int i=0;i<100;i++)

        {

               Mat[i]=new T[100];

        }

}

template<class T>

CMatrix<T>::CMatrix(int row,int col)  //两个参数的构造函数

{

       int i,j;

       nRow=row,nCol=col;

       Mat=new T*[nRow];

       for(i=0;i<nRow;i++)

       {

              Mat[i]=new T[nCol];

       }

       cout<<"请输入数据: \n";

       for(i=0;i<nRow;i++)

              for(j=0;j<nCol;j++)

              {

                     cout<<"第["<<i+1<<"]["<<j+1<<"]个数据:";

                     cin>>Mat[i][j];

              }

}

template<class T>

CMatrix<T>::CMatrix(int row,int col,int k)  //三个参数的构造函数

{

       nRow=row,nCol=col;

       Mat=new T*[nRow];

       for(int i=0;i<nRow;i++)

       {

              Mat[i]=new T[nCol];

       }

}

template<class T>

void CMatrix<T>::Show()  //矩阵输出函数

{

       int i,j;

       for(i=0;i<nRow;i++)

       {

              cout<<endl;

              for(j=0;j<nCol;j++)

                     cout<<Mat[i][j]<<setw(6);

       }

       cout<<endl;

}

template<class T>

void CMatrix<T>::InputFromFile()  //矩阵文件输入函数

{

       ifstream infile;

       infile.open("daijp.txt",ios::nocreate);

       if(!infile)

       {

              cout<<"输入文件不存在,请先建立输入文件\n";

              exit(0);

       }

       for(int i=0;i<nRow;i++)

              for(int j=0;j<nCol;j++)

              {

                     infile>>Mat[i][j];

              }

              infile.close();

}

template<class T>

CMatrix<T>operator* (CMatrix<T> &mat1,CMatrix<T> &mat2) //矩阵乘法运算符重载

{

       CMatrix<T>mat3(mat1.nRow,mat2.nCol,0);

       for(int i=0;i<mat1.nRow;i++)

              for(int j=0;j<mat2.nCol;j++)

              {

                     mat3.Mat[i][j]=0;

                     for(int k=0;k<mat1.nCol;k++)

                            mat3.Mat[i][j]+=mat1.Mat[i][k]*mat2.Mat[k][j];

              }

              return mat3;

}

template<class T>

void choose1(T) //数据输入类型选择函数模板,其中T为伪参数,用于函数模板实列化

{

       cout<<"<1>初始化赋值"<<endl<<"<2>键盘输入"<<endl<<"<3>文件输入"<<endl;

       int srfs;

       cout<<"请选择输入方式: \n";

       cin>>srfs;

       switch(srfs)  //用于选择不同的输入方式

       {

       case 1:

              {

                     CMatrix<T>mata,matb,matc;

              }break;

       case 2:

              {

                     int a,b,c,d;

                     cout<<"输入第一个矩阵的行数和列数: "<<endl;

                     cin>>a>>b;

                     CMatrix<T>mata(a,b);

                     cout<<"输入第二个矩阵的行数和列数: "<<endl;

                     cin>>c>>d;

                     if(b!=c)

                     {

                            cout<<"错误,两个矩阵不能相乘!\n";

                            break;

                     }

                     CMatrix<T>matb(c,d);

                     CMatrix<T>matc(a,d,0);

                     mata.Show();

                     matb.Show();

                     matc=mata*matb;

                     cout<<"两矩阵相乘结果为: \n";

                     matc.Show();

              }break;

       case 3:

              {

                     int a,b,c,d;

                     cout<<"输入第一个矩阵的行数和列数:  "<<endl;

                     cin>>a>>b;

                     CMatrix<T>mata(a,b,0);

                     cout<<"输入第二个矩阵的行数和列数:  "<<endl;

                     cin>>c>>d;

                     if(b!=c)

                     {

                            cout<<"错误,两个矩阵不能相乘!\n";

                            break;

                     }

                     CMatrix<T>matb(c,d,0);

                     CMatrix<T>matc(a,d,0);

                     mata.InputFromFile();

                     matb.InputFromFile();

                     mata.Show();

                     matb.Show();

                     matc=mata*matb;

                     cout<<"两矩阵相乘结果为: \n";

                     matc.Show();

              }break;

          default:cout<<"输入选择错误!"<<endl;

       }

}

    void choose()  //数据类型选择函数

       {

              cout<<"时间:20##年3月22号"<<endl<<"姓名:陈钱 "<<setw(32)<<"学号:913116120316"<<setw(32)<<"班级:材科三班"<<endl;

              cout<<endl<<"<1> 整型!"<<endl<<"<2> 浮点型!"<<endl<<"<3> 双精度型!"<<endl;

              cout<<"选择数据类型: \n";

              int sjlx;

              cin>>sjlx;

              switch(sjlx)

              {

             case 1:

                       {

                       choose1(1);

                       }break;

           case 2:

                       {

                        choose1(0.0);

                       }break;

             case 3:

                       {

                     choose1(1e-10);

                       }break;

             default:cout<<"输入选择错误!"<<endl;

              }

              cout<<endl;

       }

       void main() //主函数部分

       {

      loop:

               cout<<"*******************************\n";

               cout<<"*******************************\n";

             cout<<"\n\n\n********************** 欢迎使用!********************\n";

               cout<<"   ***********\n";

               cout<<"*******************************\n\n";

               choose();

      loop1:

               cout<<"是否继续执行?"<<endl<<"1.继续!"<<endl<<"2.退出!"<<endl;

               int a;

               cin>>a;

               switch(a)

                     {

                 case 1:goto loop;

                    break;

                 case 2:

                              {

                              cout<<"谢谢使用!"<<endl;

                              cout<<"按任意键退出!"<<endl;

                              cin.get();

                              cin.get();  //去除缓冲区的回车符

                              exit(1);

                              }

                 default:cout<<"输入选择错误!"<<endl;

                        goto loop1;

                     }

       }

5 运行结果如下:

************

****************

******************** 欢迎使用!********************

时间:20##年3月22号

姓名:陈钱                学号:913116120316                   班级:材科三班

<1> 整型!

<2> 浮点型!

<3> 双精度型!

选择数据类型:

1

<1>初始化赋值

<2>键盘输入

<3>文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:2

第[1][3]个数据:3

第[2][1]个数据:4

第[2][2]个数据:5

第[2][3]个数据:6

第[3][1]个数据:7

第[3][2]个数据:8

第[3][3]个数据:9

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:9

第[1][2]个数据:8

第[1][3]个数据:7

第[2][1]个数据:6

第[2][2]个数据:5

第[2][3]个数据:4

第[3][1]个数据:3

第[3][2]个数据:2

第[3][3]个数据:1

1     2     3

4     5     6

7     8     9

9     8     7

6     5     4

3     2     1

两矩阵相乘结果为:

30    24    18

84    69    54

138   114    90

是否继续执行?

1.继续!

2.退出!

1

*******************************

*******************************

********************** 欢迎使用!********************

   ***********

*******************************

时间:20##年3月22号

姓名:陈钱                学号:913116120316                   班级:材科三班

<1> 整型!

<2> 浮点型!

<3> 双精度型!

选择数据类型:

3

<1>初始化赋值

<2>键盘输入

<3>文件输入

请选择输入方式:

2

输入第一个矩阵的行数和列数:

3

3

请输入数据:

第[1][1]个数据:11

第[1][2]个数据:12

第[1][3]个数据:13

第[2][1]个数据:14

第[2][2]个数据:15

第[2][3]个数据:16

第[3][1]个数据:14

第[3][2]个数据:1

第[3][3]个数据:7

输入第二个矩阵的行数和列数:

3 3

请输入数据:

第[1][1]个数据:1

第[1][2]个数据:51

第[1][3]个数据:6

第[2][1]个数据:14

第[2][2]个数据:12

第[2][3]个数据:13

第[3][1]个数据:14

第[3][2]个数据:185

第[3][3]个数据:18

11    12    13

14    15    16

14     1     7

1    51     6

14    12    13

14   185    18

两矩阵相乘结果为:

361  3110   456

448  3854   567

126  2021   223

是否继续执行?

1.继续!

2.退出!

2

谢谢使用!

按任意键退出!

6 思考与总结

1)本程序只能进行简单的矩阵乘法,不能做更加复杂的混合运算。

2)当矩阵的行列数超出一定的范围后,不知该如何处理。

3)没有异常处理机制。

7心得与体会

1)    由于上学期的C++课程学的不是很好,在设计程序的时候参考已有程序比较多,所以,还是要自己有真才实学才行。

2)    设计本程序耗时巨大,需要很大的毅力才能完成,贵在坚持。

3)    通过编写这次程序,对C++有了一点理解,对矩阵知识也有所了解。

4版权很重要!

相关推荐