(0902)矩阵相乘

前几天写的,原因现在还不明,可能是二维数组初始化的时候有些问题:

void MatrixMultiple( int A[2][3], int B[3][4], int C[2][4])
{

//m n 与n r 最终是m r矩阵
int m = 2, n = 3, r = 4;
int i, j, k;
for (i = 0; i < m; i++)
for (j = 0; j < r; j++)
C[m][r] = 0;
for(i = 0; i < m; i++)
for (j = 0; j < r; j++)
for(k = 0; k < n; k++)
C[i][j] += A[i][k] * B[k][j];
for (i = 0; i < m; i++)
for (j = 0; j < r; j++)
cout<<C[m][r]<<" ";
cout<<endl;
}

int main()
{
int a[2][3] = {{3,4,5},{1,2,3}};
int b[3][4] = {{1,2,3,4},{1,1,1,1},{2,2,2,2}};
int c[2][4] = {0};
MatrixMultiple(a, b, c);

}

正确的结果应该是:
17 20 23 26
9  10 11 12

输出的结果却是:
17 20 14 26
9  10  8 12

调试的时候发现:
b刚开始的初值,运行中变成了{{1,2,0,4},{1,1,1,1},{2,2,2,2}};
b[0][2]从3变成了0!!!导致了最终结果的错误!不知为什么?
将代码改为
void MatrixMultiple( int A[2][3], int B[3][4], int C[2][4])
{

//m n 与n r 最终是m r矩阵
int m = 2, n = 3, r = 4;
int i, j, k;
for(i = 0; i < m; i++)
for (j = 0; j < r; j++)
{
C[i][j] = 0;
for(k = 0; k < n; k++)
C[i][j] += A[i][k] * B[k][j];
}
for (i = 0; i < m; i++)
for (j = 0; j < r; j++)
cout<<C[m][r]<<" d";
cout<<endl;
}

2012-8-27 20:32:27
实现string库函数strcat出现的问题
char* my_strcat(char* strDes, const char* strsrc)
{
assert(strDes != NULL && strsrc != NULL);
char* newstr = (char*)malloc(strlen(strDes) + strlen(strsrc) + 1);
while(*strDes != '\0')
*newstr++ = *strDes++;
while(*strsrc != '\0')
*newstr++ = *strsrc++;
*newstr = '\0';
return newstr;

}

这样写有问题,最终newstr里面没有值,而我将newstr拷贝到一个char*变量ptmp里面,然后操纵ptmp,ptmp里面的值就可以被改变!

char* my_strcat(char* strDes, const char* strsrc)
{
assert(strDes != NULL && strsrc != NULL);
char* newstr = (char*)malloc(strlen(strDes) + strlen(strsrc) + 1);
char* ptmp = newstr;
while(*strDes != '\0')
*ptmp++ = *strDes++;
while(*strsrc != '\0')
*ptmp++ = *strsrc++;
*ptmp = '\0';
return ptmp;

}


另外,提供了另外一种不另外开辟存储空间,直接在strDes后面追加的方法

char* my_strcat(char* strDes, const char* strsrc)
{
assert(strDes != NULL && strsrc != NULL);
char* ptmp = strDes;
while(*ptmp != '\0')
++ptmp;
while(*strsrc != '\0')
*ptmp++ = *strsrc++;
*ptmp = '\0';
return strDes;
}


这样也可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值