学习二维动态数组指针做矩阵运算的方法
本文分享了利用二维动态数组指针做矩阵运算的实现代码。
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; }
以上就是实现二维动态数组指针做矩阵运算的代码,希望对大家的学习有所帮助。