题目描述:1.用c++动态创建二维数组 2.实现矩阵的加减乘运算(除法运算规则比较复杂此处就不做具体实现了!)
知识运用:c++基础语法、动态创建数组、撤销数组空间。 矩阵的四则运算(此处只是基本的算法实现不做过多解释,具体的运算规则自行百度理解)
函数声明:
1. 动态创建二维数组(矩阵)
int** createMat(int row,int col);
2.撤销二维数组空间
void deleteMat(int **p,int row);
3.输入
void input(int** p,int row,int col);
4.输出
void output(int** p,int row,int col);
5.矩阵相乘
int** matMul(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
6.矩阵相加
int** matPlus(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
7.矩阵相减
int** matMinus(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
核心函数解释:
函数原型:int** createMat(int row,int col);
函数功能:动态创建二维数组
参数:row 二维数组的行数
col 二维数组的列数
描述:1.定义一个二级指针,动态开辟空间后指向一个 row x col 的二维数组
2.new int* [row]; //开辟一个长度为row的一维 数组指针空间,
其中每一个指针元素都将指向对应行的一维数组。res[i]为指针
3.res[i]=new int[col];//循环创建 row个长度为 col的一维数组空间,
且res[i]指向二维数组每行的首地址。
函数原型:void deleteMat(int **p,int row);
函数功能:撤销二维数组空间
参数:p 指向被撤销数组的指针
row 二维数组的行数,即二维数组中包含的一维数组的个数!
描述:1.循环撤销二维数组每行空间 即 逐个撤销每行一维数组的空间
2.记得还要撤销 指向该二维数组的指针,即撤销在创建时最先定义的那个指针指向的空间
//这俩个函数有因果关系,创建过了才能撤销相应的存储空间!
代码实现:
#include <stdio.h>
#include <iostream>
using namespace std;
// 动态创建二维数组(矩阵)
int** createMat(int row,int col);
//撤销二维数组空间
void deleteMat(int **p,int row);
//输入
void input(int** p,int row,int col);
//输出
void output(int** p,int row,int col);
//矩阵相乘
int** matMul(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
//矩阵相加
int** matPlus(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
//矩阵相减
int** matMinus(int** mat1,int r1,int c1,int** mat2,int r2,int c2);
int main(int argc, char* argv[])
{
int **matArr1;
int **matArr2;
int **res1;
int **res2;
int **res3;
int r1,c1,r2,c2;
cout<<"input matArr1 :row,col \n";//矩阵1
cin>>r1>>c1;
matArr1=createMat(r1,c1);
input(matArr1,r1,c1);
output(matArr1,r1,c1);
cout<<"input matArr2 :row,col \n";//矩阵2
cin>>r2>>c2;
matArr2=createMat(r2,c2);
input(matArr2,r2,c2);
output(matArr2,r2,c2);
res1=matMul(matArr1,r1,c1,matArr2,r2,c2);//乘
output(res1,r1,c2);
res2=matPlus(matArr1,r1,c1,matArr2,r2,c2);//加
output(res2,r1,c1);
res3=matMinus(matArr1,r1,c1,matArr2,r2,c2);//减
output(res3,r1,c1);
deleteMat(matArr1,r1);
deleteMat(matArr2,r2);
deleteMat(res1,r1);
deleteMat(res2,r1);
deleteMat(res3,r1);
return 0;
}
//创建
int** createMat(int row,int col)
{
int** res;
res=new int* [row];
for(int i=0;i<row;i++)
{
res[i]=new int[col];
}
return res;
}
//销毁
void deleteMat(int** p,int r)
{
for(int i=0;i<r;i++)
{
delete []p[i];
}
delete []p;
}
//输入
void input(int** p,int row,int col)
{
cout<<"input elements of matarr\n";
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cin>>p[i][j];
}
}
}
//输出
void output(int** p,int row,int col)
{
cout<<"output the matarr\n";
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cout<<" "<<p[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
//矩阵相乘
int** matMul(int** mat1,int r1,int c1,int** mat2,int r2,int c2)
{
cout<<"\n矩阵相乘:\n";
int **res;
if(c1!=r2) //矩阵1的列数和矩阵2的行数一致才能进行乘法运算(矩阵的具体运算规则自行百度)
return NULL;
res=createMat(r1,c2);
int i,j,k;
for(i=0;i<r1;i++)
{
for(j=0;j<c2;j++)
{
res[i][j]=0;
for(k=0;k<c1;k++)
{
res[i][j]=res[i][j]+mat1[i][k]*mat2[k][i];
}
}
}
return res;
}
//矩阵相加
int** matPlus(int** mat1,int r1,int c1,int** mat2,int r2,int c2)
{
int** res;
cout<<"\n矩阵相加:\n";
if((r1!=r2) || (c1!=c2))//判断是否满足矩阵运算规则(具体运算自行百度)
return NULL;
res=createMat(r1,c1);
int i,j;
for(i=0;i<r1;i++)
{
for(j=0;j<c1;j++)
{
res[i][j]=mat1[i][j]+mat2[i][j];
}
}
return res;
}
//矩阵相减
int** matMinus(int** mat1,int r1,int c1,int** mat2,int r2,int c2)
{
int** res;
cout<<"\n矩阵相减:\n";
if((r1!=r2) || (c1!=c2))//判断是否满足矩阵运算规则(具体运算自行百度)
return NULL;
res=createMat(r1,c1);
int i,j;
for(i=0;i<r1;i++)
{
for(j=0;j<c1;j++)
{
res[i][j]=mat1[i][j]-mat2[i][j];
}
}
return res;
}
写完这个题后的感受:
创建好了一个二维数组空间。因此只要为一个二级指针开辟好存储空间后就创建好了一个二维数组。
这也更好的反应了指针和数组的关系。因此在我看来,数组实际上就相当于被定义了固定存储空间的指针。