主题:多维数组作为形参
napoleongjc
[专家分:0] 发布于 2010-04-21 23:54:00
求一个二维数组各行元素之和,并保存到一个一维数组中
这是我写的,但总是无法编译出可执行文件,希望高手指点一下
#include<iostream>
#define n 3
#define m 4
using namespace std;
int main()
{
int sum(int a[][],int i,int n);
int a[m][n],b[m],i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
for(i=0;i<m;i++)
b[i]=sum(a,i,n);
for(i=0;i<m;i++)
cout<<" "<<b[i];
cout<<endl;
return 0;
}
int sum(int a[][],int x,int y)
{
int s=0, k;
for(k=0;k<y;K++)
s+=a[x][k];
return s;
}
这是我刚才提的问题,有高手帮我解决了:
多维数组作为形参的时候除了第一维的大小可以不写,其他各维还是要写的
所以多维数组的形参还要调整
我把题中的形参数组的二维都改成了常量,但我还是不懂,如果不改成常量,有什么办法解决这个问题
回复列表 (共8个回复)
沙发
雪光风剑 [专家分:27190] 发布于 2010-04-22 00:40:00
我突然发现一个问题……就是你实际上没必要传递整个二维数组
传递一维数组就可以了
int sum(int a[],int len)足矣
然后调用的时候直接b[i]=sum(a[i],N);就可以了,没必要特意给函数里传一个实际上根本用不到的数组维度
板凳
napoleongjc [专家分:0] 发布于 2010-04-23 00:40:00
您的看法正确,不过我题目的要求是对一个二维数组操作,如果我在函数形参中用了一维的数组,那我在函数中可以把它当做二维使用吗?
int sum(int a[],int len)
{
int s=0, k;
for(k=0;k<N;K++)
s+=a[len][k];
return s;
}
就像那样,上面是一维,当二维来用?
而且我刚才照您的方法改了一下,无法生成可执行文件。
希望您能为我指点一下
3 楼
雪光风剑 [专家分:27190] 发布于 2010-04-23 01:06:00
我写出来的代码其实并没有改变你的题意,也就是说你其实还是在对原二维数组进行计算,只不过每次只计算这个二维数组的一行,因此在函数里处理的只是一个一维数组而已。循环里只要处理s+=a[k]即可。注意,对二维数组的处理不等于一定要按照a[i][j]这样的形式去计算。只要你对原始数据的存储是个二维数组就可以了
4 楼
napoleongjc [专家分:0] 发布于 2010-04-24 23:40:00
雪光风剑
你好,首先感谢你的回答,而且貌似我所有的帖子你都回答过。
你跟我讲的我貌似不能完全理解,而且按你的方法,代码执行不了。如果可以的话,你可以帮改一下代码吗?谢谢。
我的邮箱是napoleonggjc@yahoo.com
5 楼
雪光风剑 [专家分:27190] 发布于 2010-04-25 00:44:00
简单拆解一下我的说法好了
对于一个二维数组的实例,比如int a[3][3]
这个数组实际上可以拆成两个部分理解
第一部分是一个int* b[3],这一部分代表每一行的首地址
第二部分是一个int c[3],这一部分代表某一行储存的具体内容
那么,当你要计算a[1][0] a[1][1] a[1][2]的和的时候,你可以传递b[1]作为实参
函数中把b[1]解析为一个c[3],然后你对这个数组求和得到的就是b[1]也即是a[1][0~2]的和了
按照如上思路,实际上你的计算函数只要如下写法就可以了
int sum(int a[],int y)
{
int s=0, k;
for(k=0;k<y;k++)
s+=a[k];
return s;
}
声明对应修改,而在调用的时候则直接用b[i]=sum(a[i],n);就可以了。注意实参的a[i]对应上文中的b[1],而函数中的a[]对应c[]
6 楼
napoleongjc [专家分:0] 发布于 2010-04-25 14:10:00
谢谢
按照你说的,我修改了代码,而且成功了。你所说的是不是就是在主函数中,将每行首元素的地址传递给形参,然后,就在计算函数中,把每行当一个一维数组使用。
理论还是要有实践啊,上课老师就这么说,以为自己掌握了,没想到还有这么大的距离。
7 楼
雪光风剑 [专家分:27190] 发布于 2010-04-25 22:22:00
理解正确。我最近身体不太好,可能说话条理比较差,引起你一开始的误解了。致歉
8 楼
cxxcomp [专家分:2370] 发布于 2010-04-25 22:25:00
雪光兄分析的很对。可以这么做:
[code=c]
/*
* 求一个二维数组各行元素之和,并保存到一个一维数组中
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdlib>
using namespace std;
const int nCol = 6;
int DoSum(int (*)[nCol], int);
int main()
{
int ia[][nCol] ={
{5,6,4,3,5,2},
{3,2,3,5,3,5},
{1,2,1,2,3,4},
{23,4,5,3,4,6},
{12,1,1,3,4,5}
};
// cout << DoSum(ia, 0) << endl;
vector<int> coll;
for (int ix = 0; ix < 5; ++ix)
{
coll.push_back(DoSum(ia, ix));
}
cout << "sum of line: \n";
copy(coll.begin(), coll.end(), ostream_iterator<int>(cout, "\n"));
cout << endl;
system("pause");
}
int DoSum(int (*pArray)[nCol], int row)
{
int nSum = 0;
for (int ix = 0; ix < nCol; ++ix)
{
nSum += pArray[row][ix];
}
return nSum;
}
[/code]
我来回复