// juzhen 2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
typedef struct mat
{
int nRow; /* 行数 */
int nCol; /* 列数 */
int* pData; /* 指向矩??体的指? */
}MAT;
int MATAlloc(MAT *pMat, int nRow, int nCol)
{
pMat->pData =(int *) malloc (nRow * nCol * sizeof(int));
if(pMat->pData == NULL)
{
printf("memary is error!");
return -1;
}
for(int i=0; i<nRow; ++i)
{
for(int j=0; j<nCol; ++j)
{
scanf("%d" ,pMat->pData + i*nCol + j);
}
}
pMat->nRow = nRow;
pMat->nCol = nCol;
return 0;
}
void MATFree(MAT* pMat)
{
for(int i=0; i<pMat->nRow; ++i)
{
free (pMat->pData+i);
}
free(pMat->pData);
pMat->pData=NULL;
}
int MATAssign (MAT* pMat1, const MAT* pMat2)
{
if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
{
for(int i=0; i<pMat1->nRow; ++i)
{
for(int j=0; j<pMat1->nCol; ++j)
{
*(pMat1->pData+i*pMat1->nCol+j)=*(pMat2->pData+i*pMat1->nCol+j);
}
}
return 0;
}
else
{
printf("not assmble");
return -1;
}
}
int MATAdd(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
{
for(int i=0; i<pMat1->nRow; ++i)
{
for(int j=0; j<pMat1->nCol; ++j)
{
*(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)+*(pMat2->pData+i*pMat1->nCol+j);
}
}
return 0;
}
else
{
printf("not add!");
return -1;
}
}
int MATSub(const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
if((pMat1->nRow == pMat2->nRow) && (pMat1->nCol == pMat2->nCol))
{
for(int i=0; i<pMat1->nRow; ++i)
{
for(int j=0; j<pMat1->nCol; ++j)
{
*(pMat3->pData+i*pMat3->nCol+j)=*(pMat1->pData+i*pMat1->nCol+j)-*(pMat2->pData+i*pMat1->nCol+j);
}
}
return 0;
}
else
{
printf("not Sub!");
return -1;
}
}
void MATClear(MAT* pMat)
{
for(int i=0; i<pMat->nRow; ++i)
{
for(int j=0; j<pMat->nCol; ++j)
{
*(pMat->pData+i*pMat->nCol+j)=0;
}
}
}
void MATMulC (MAT* pMat, int C)
{
for(int i=0; i<pMat->nRow; ++i)
{
for(int j=0; j<pMat->nCol; ++j)
{
*(pMat->pData+i*pMat->nCol+j)=C * (*(pMat->pData+i*pMat->nCol+j));
}
}
}
int MATMul (const MAT* pMat1, const MAT* pMat2, MAT* pMat3)
{
if(pMat1->nCol == pMat2->nRow)
{
for(int i=0; i<pMat1->nRow; ++i)
{
for(int j=0; j<pMat1->nCol; ++j)
{
*(pMat3->pData+i*pMat1->nRow)=(*(pMat1->pData+i*pMat1->nCol+j)) * (*(pMat2->pData+j*pMat1->nRow+i));
}
}
return 0;
}
else
{
printf("not Mul");
return -1;
}
}
int MATTransport(const MAT* pMat1, MAT* pMat2)
{
for(int i=0; i<pMat1->nRow; ++i)
{
for(int j=0; j<pMat1->nCol; ++j)
{
*(pMat2->pData+j*pMat1->nRow+i)=*(pMat2->pData+i*pMat1->nCol+j);
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int nRow,nCol,sign,C;
MAT Mat, Mat1, Mat2;
MAT *pMat = &Mat;
MAT *pMat1 = &Mat1;
MAT *pMat2 = &Mat2;
MAT* MATinit(MAT *pMat);
void Print(MAT *pMat);
printf("Welcome To The Matrix Operation system!");
printf("------------------------------------------------\n");
printf("1: Open The Generating matrix function!\n");
printf("2: Open The Release matrix function!\n");
printf("3: Open The Import matrix function!\n");
printf("4: Open The Add matrix function!\n");
printf("5: Open The Matrix subtraction function!\n");
printf("6: Open The Clear matrix function!\n");
printf("7: Open The Matrix multiplication C function!\n");
printf("8: Open The Matrix multiplication function!\n");
printf("9: Open The Matrix transpose function!\n");
printf("------------------------------------------------\n");
printf("Please Select operation type:");
scanf("%d",&sign);
switch(sign)
{
case 1:
{
/*MAT Mat;
pMat = &Mat;
int nRow=0, nCol=0;
printf("Please input the number of rows: ");
scanf("%d",&nRow);
putchar('\n');
printf("Please input the number of columns: ");
scanf("%d",&nCol);
putchar('\n');
printf("Please input %dX%d Matrix:\n",nRow,nCol);
MATAlloc(pMat,nRow,nCol);*/
pMat = MATinit(pMat);
Print(pMat);
}
break;
case 2:
{
MATFree(pMat);
}
break;
case 3:
{
pMat1 = MATinit(pMat1);
pMat2 = MATinit(pMat2);
MATAssign (pMat1, pMat2);
Print(pMat1);
}
break;
case 4:
{
pMat1 = MATinit(pMat1);
pMat2 = MATinit(pMat2);
pMat = MATinit(pMat);
MATAdd(pMat1, pMat2,pMat);
Print(pMat);
}
break;
case 5:
{
pMat1 = MATinit(pMat1);
pMat2 = MATinit(pMat2);
pMat = MATinit(pMat);
MATSub(pMat1, pMat2,pMat);
Print(pMat);
}
break;
case 6:
{
MATClear(pMat);
Print(pMat);
}
break;
case 7:
{
pMat = MATinit(pMat);
printf("Please input the number of C: ");
scanf("%d",&C);
putchar('\n');
MATMulC (pMat, C);
Print(pMat);
}
break;
case 8:
{
pMat1 = MATinit(pMat1);
pMat2 = MATinit(pMat2);
pMat = MATinit(pMat);
MATMul (pMat1, pMat2, pMat);
Print(pMat);
}
break;
case 9:
{
pMat1 = MATinit(pMat1);
pMat2 = MATinit(pMat2);
MATTransport(pMat1, pMat2);
Print(pMat);
}
break;
}
return 0;
}
MAT* MATinit(MAT *pMat)
{
MAT Mat;
pMat = &Mat;
int nRow=0, nCol=0;
printf("Please input the number of rows: ");
scanf("%d",&nRow);
putchar('\n');
printf("Please input the number of columns: ");
scanf("%d",&nCol);
putchar('\n');
printf("Please input %dX%d Matrix:\n",nRow,nCol);
MATAlloc(pMat,nRow,nCol);
return pMat;
}
void Print(MAT *pMat)
{
printf("The result is:\n");
for(int i=0; i<pMat->nRow; ++i)
{
for(int j=0; j<pMat->nCol; ++j)
{
printf("%d ",*(pMat->pData+i*pMat->nCol+j));
}
putchar('\n');
}
while(1);
}
此程序为何当选择1的时候没有矩阵输出,好像是形参与实参的关系错了,求解释,求改正。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- lpfly 2015-08-03 11:46关注
你在MATinit()函数是错的。没有必要申明一个新的Mat变量,直接使用pMat。
另外,如果你想新建一个pMat的话,也要用malloc()之类的函数。你这里的MAT Mat;申明的这个Mat只存在于MATinit()里,当你回到_tmain()的时候,这个Mat变量已经不存在了。这是个潜在的Segmentation Fault
解决 无用评论 打赏 举报
悬赏问题
- ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
- ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
- ¥16 mybatis的代理对象无法通过@Autowired装填
- ¥15 可见光定位matlab仿真
- ¥15 arduino 四自由度机械臂
- ¥15 wordpress 产品图片 GIF 没法显示
- ¥15 求三国群英传pl国战时间的修改方法
- ¥15 matlab代码代写,需写出详细代码,代价私
- ¥15 ROS系统搭建请教(跨境电商用途)
- ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。