问题标题:
输入两个行、列数相同的矩阵(实际上是二维数组)A、B,以矩阵的方式分别输出A、B;求矩阵的和并输出.这是我编的,不过求最大值有问题,还有位置,#include"stdio.h"#include"math.h"#defineN3#defineM
问题描述:
输入两个行、列数相同的矩阵(实际上是二维数组)A、B,以矩阵的方式分别输出A、B;求矩阵的和并输出.
这是我编的,不过求最大值有问题,还有位置,
#include"stdio.h"
#include"math.h"
#defineN3
#defineM3
voidMyin_out_put(inta[N][M],intb[N][M])
{
x05inti,j;
x05printf("pleaseinputarryanumbers:n");
x05for(i=0;i
简毅回答:
回答求助.
你的程序实际上不错.有几个没注意到的地方要改一下:
1.FindMax(int(*a)[M],int(*b)[M],...)中的这两个形参是指向有M个元素的指针,而你在本函数体的算法上却出错了:*(*(a+i*M+j))应该改为*(*(a+i)+j)才对,当然包括*(*(b+i*M+j))改为*(*(b+i)+j).a+i是第i行的指针,它的内容*(a+i)就是指向本行第0个元素的指针,*(a+i)+j就指向了这一行的第j个元素,而最后*(*(a+i)+j)就是这个元素的值.你用的算法*(*(a+i*M+j))我没太看懂,似乎是在把二维数组降为一维来计算位置;这也是可以的,但这样的话函数形参就不能是(*p)[M]而应该是*p,在调用时要把A强制转换一直才能赋给p.
2.绝对值的问题出在主函数中的输出语句.你声明的FMAXA、FMAXB变量是double型,但printf()函数中的控制符却是"%d",由于类型不配,输出永远是0,My_fabs_max()的计算并没有错.把相应的printf()函数的控制符改为"%f"或"%g"就可以了.
其余未发现有什么问题.
有问题可续问……
孙瑜回答:
在这个voidSumarry(函数中求和用*(*(c+i)+j)=*(*(a+i)+j)+*(*(b+i)+j);为什么不行的?对于FindMax中的*(*(a+i*M+j)),我原来是用*(a+i*M+j)的,后来不行,我以为它输出的是地址就改为*(*(a+i*M+j))了,我刚查了一下课本,应该是*(a+i*M+j)的,这个算法确实是把二维数组降为一维来计算位置的,但结果不行;你说的函数形参就不能是(*p)[M]而应该是*p,若改为*p的话,那*pmaxA=a[0][0];*pmaxB=b[0][0];这两个就有错了,为什么?
简毅回答:
1.(*p)[X]和p[][X]不是一个概念啊:前者是指向X个元素数组的指针,后者是一个双维数组,p是这个双维数组的首地址(就是p[0][0]的地址)。Sumarry()的形参是后者,是一个双维数组,而FindMax()和My_fabs_max()的形参是前者,是一个指针。指针是个变量,当它指向数组时就可以操作数组;数组的首地址可心当指针用,但它是指针常量,没有指针变量的优势;具体说就是形参是(*p)[X]时,可以用p[][]的形式来操作它指向的数组,而形参是p[][]时,却无法用操作指针的办法来访问数组。2.如果降为一维数组,*(a+i*M+j)这个逻辑是正确的,你原来写的*(*(a+i*M+j))就不太懂了。3.若改为*p的话,那*pmaxA=a[0][0];*pmaxB=b[0][0];这两个就有错了——既然降为一维数组了,还哪儿来的a[0][0]和b[0][0]?只有a[0]和b[0]了……
查看更多
八字精批
八字合婚
八字起名
八字财运
2024运势
测终身运
姓名详批
结婚吉日