学习二维动态数组指针做矩阵运算的方法
本文分享了利用二维动态数组指针做矩阵运算的实现代码。
1.头文件
//juzhen2.cpp:Definestheentrypointfortheconsoleapplication.
//
#include"stdafx.h"
#include"stdlib.h"
#include"windows.h"
#defineOK0
#defineNG-1
typedefstructmat
{
intnRow;/*行数*/
intnCol;/*列数*/
int*pData;/*指向矩??体的指?*/
}MAT;
2.程序代码
#include"stdafx.h"
#include"Matrix_cal.h"
/*Entityandinitialmatrixoftheapplicationmatrixfunction*/
intMATAlloc(MAT*pMat,intnRow,intnCol)
{
pMat->pData=(int*)malloc(nRow*nCol*sizeof(int));
if(NULL==pMat->pData)
{
printf("Memaryiserror!\n");
returnNG;
}
for(inti=0;i<nRow;++i)
{
for(intj=0;j<nCol;++j)
{
*(pMat->pData+i*nCol+j)=0;
}
}
pMat->nRow=nRow;
pMat->nCol=nCol;
returnOK;
}
/*Releasethememoryspaceandresetthematrixdatafunction*/
voidMATFree(MAT*pMat)
{
free(pMat->pData);
pMat->pData=NULL;
pMat->nRow=0;
pMat->nCol=0;
}
/*Importofmatrixfunction*/
intMATAssign(MAT*pMat1,constMAT*pMat2)
{
MATAlloc(pMat1,pMat2->nRow,pMat2->nCol);
for(inti=0;i<pMat1->nRow;++i)
{
for(intj=0;j<pMat1->nCol;++j)
{
*(pMat1->pData+i*pMat1->nCol+j)=*(pMat2->pData+i*pMat1->nCol+j);
}
}
returnOK;
}
/*Matrixsumfunction*/
intMATAdd(constMAT*pMat1,constMAT*pMat2,MAT*pMat3)
{
MATAlloc(pMat3,pMat1->nRow,pMat1->nCol);
if((pMat1->nRow==pMat2->nRow)&&(pMat1->nCol==pMat2->nCol))
{
for(inti=0;i<pMat1->nRow;++i)
{
for(intj=0;j<pMat1->nCol;++j)
{
*(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)+*(pMat2->pData+i*pMat1->nCol+j);
}
}
returnOK;
}
else
{
printf("Notadd!\n");
returnNG;
}
}
/*Matrixsubtractionfunction*/
intMATSub(constMAT*pMat1,constMAT*pMat2,MAT*pMat3)
{
MATAlloc(pMat3,pMat1->nRow,pMat1->nCol);
if((pMat1->nRow==pMat2->nRow)&&(pMat1->nCol==pMat2->nCol))
{
for(inti=0;i<pMat1->nRow;++i)
{
for(intj=0;j<pMat1->nCol;++j)
{
*(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)-*(pMat2->pData+i*pMat1->nCol+j);
}
}
returnOK;
}
else
{
printf("NotSub!\n");
returnNG;
}
}
/*Matrixclear*/
voidMATClear(MAT*pMat)
{
for(inti=0;i<pMat->nRow;++i)
{
for(intj=0;j<pMat->nCol;++j)
{
*(pMat->pData+i*pMat->nCol+j)=0;
}
}
}
/*MatrixmultiplicationCfunction*/
voidMATMulC(MAT*pMat,intC)
{
for(inti=0;i<pMat->nRow;++i)
{
for(intj=0;j<pMat->nCol;++j)
{
*(pMat->pData+i*pMat->nCol+j)=C*(*(pMat->pData+i*pMat->nCol+j));
}
}
}
/*Matrixmultiplicationfunction*/
intMATMul(constMAT*pMat1,constMAT*pMat2,MAT*pMat3)
{
MATAlloc(pMat3,pMat1->nRow,pMat2->nCol);
if(pMat1->nCol==pMat2->nRow)
{
for(inti=0;i<pMat1->nRow;++i)
{
for(intj=0;j<pMat2->nCol;++j)
{
for(intk=0;k<pMat1->nCol;++k)
{
*(pMat3->pData+i*pMat2->nCol+j)+=*(pMat1->pData+i*pMat2->nRow+k)*(*(pMat2->pData+k*pMat2->nCol+j));
}
}
}
returnOK;
}
else
{
printf("notMul\n");
returnNG;
}
}
/*Matrixtransposefunction*/
intMATTransport(constMAT*pMat1,MAT*pMat2)
{
MATAlloc(pMat2,pMat1->nCol,pMat1->nRow);
for(inti=0;i<pMat1->nRow;++i)
{
for(intj=0;j<pMat1->nCol;++j)
{
*(pMat2->pData+j*pMat1->nRow+i)=*(pMat1->pData+i*pMat1->nCol+j);
}
}
returnOK;
}
/*
boolCheck_digit(char*kk)
{
inta=strlen(kk);
for(inti=0;i<a;++i)
{
if(((int)(*(kk+i))>48)&&((int)(*(kk+i))<57||(int)(*(kk+i))==32))
{
return1;
}
}
return0;
}
*/
/*Matrixinitialization*/
voidMATinit(MAT*pMat)
{
boolkos=1;
intnRow=0,nCol=0;
printf("Pleaseinputthenumberofrows:");
scanf_s("%d",&nRow);
putchar('\n');
printf("Pleaseinputthenumberofcolumns:");
scanf_s("%d",&nCol);
putchar('\n');
printf("Pleaseinput%dX%dMatrix:\n",nRow,nCol);
kos=MATAlloc(pMat,nRow,nCol);
for(inti=0;i<nRow;++i)
{
for(intj=0;j<nCol;++j)
{
scanf("%d",pMat->pData+i*nCol+j);
}
}
}
/*chararr[100][100]={0};
for(inti=0;i<nRow;++i)
{
for(intj=0;j<nCol;++j)
{
scanf("%c",&arr[i][j]);
kos=Check_digit(&arr[i][j]);
}
}
//ks=atoi(arr[0]);
while(kos)
{
printf("inputiserror,Pleaseinputagain!");
for(inti=0;i<nRow;++i)
{
for(intj=0;j<nCol;++j)
{
scanf("%c",arr[i]);
}
}
kos=Check_digit(arr[0]);
//ks=atoi(arr[0]);
}
for(inti=0;i<nRow;++i)
{
for(intj=0;j<nCol;++j)
{
*(pMat->pData+i*nCol+j)=atoi(&arr[i][j]);
}
}
}
*/
/*Outputmatrix*/
voidPrint(MAT*pMat)
{
printf("Theresultis:\n");
for(inti=0;i<pMat->nRow;++i)
{
for(intj=0;j<pMat->nCol;++j)
{
printf("%d",*(pMat->pData+i*pMat->nCol+j));
}
putchar('\n');
}
}
int_tmain(intargc,_TCHAR*argv[])
{
intnRow=1,nCol=1,sign=1,C=1,work=1,sigal=0;
MATMat,Mat1,Mat2;
MAT*pMat=&Mat;
MAT*pMat1=&Mat1;
MAT*pMat2=&Mat2;
while(work)
{
system("cls");
printf("WelcomeToTheMatrixOperationsystem!\n");
printf("------------------------------------------------\n");
printf("1:OpenTheGeneratingmatrixfunction!\n");
printf("2:OpenTheReleasematrixfunction!\n");
printf("3:OpenTheImportmatrixfunction!\n");
printf("4:OpenTheAddmatrixfunction!\n");
printf("5:OpenTheMatrixsubtractionfunction!\n");
printf("6:OpenTheClearmatrixfunction!\n");
printf("7:OpenTheMatrixmultiplicationCfunction!\n");
printf("8:OpenTheMatrixmultiplicationfunction!\n");
printf("9:OpenTheMatrixtransposefunction!\n");
printf("------------------------------------------------\n");
printf("PleaseSelectoperationtype:");
scanf("%d",&sign);
switch(sign)
{
case1:
{
MATinit(pMat);
Print(pMat);
}
break;
case2:
{
MATinit(pMat);
Print(pMat);
MATFree(pMat);
}
break;
case3:
{
MATinit(pMat2);
MATAssign(pMat1,pMat2);
Print(pMat1);
}
break;
case4:
{
MATinit(pMat1);
MATinit(pMat2);
sigal=MATAdd(pMat1,pMat2,pMat);
if(0==sigal)
{
Print(pMat);
}
}
break;
case5:
{
MATinit(pMat1);
MATinit(pMat2);
sigal=MATSub(pMat1,pMat2,pMat);
if(0==sigal)
{
Print(pMat);
}
}
break;
case6:
{
MATinit(pMat);
Print(pMat);
MATClear(pMat);
Print(pMat);
}
break;
case7:
{
printf("PleaseinputthenumberofC:");
scanf("%d",&C);
putchar('\n');
MATinit(pMat);
MATMulC(pMat,C);
Print(pMat);
}
break;
case8:
{
MATinit(pMat1);
MATinit(pMat2);
sigal=MATMul(pMat1,pMat2,pMat);
if(0==sigal)
{
Print(pMat);
}
}
break;
case9:
{
MATinit(pMat1);
MATTransport(pMat1,pMat2);
Print(pMat2);
}
break;
default:printf("inputiserror!");
}
printf("WhetherexittheMatrixcalculationsystem?(1isnotexit,0isexit)\n");//whetherexitthesystem.
scanf("%d",&work);
fflush(stdin);
while(work!=0&&work!=1)//workmustis1or0.
{
printf("Inputiserror,Pleaseinputagain!\n");
scanf("%d",&work);
fflush(stdin);
}
}
printf("\n-------------ThanksForYouUsingTheMatrixCalculationSystem!--------------\n");
Sleep(2000);//deleysometimes.
return0;
}
以上就是实现二维动态数组指针做矩阵运算的代码,希望对大家的学习有所帮助。