回 帖 发 新 帖 刷新版面

主题:多维数组作为形参

求一个二维数组各行元素之和,并保存到一个一维数组中
这是我写的,但总是无法编译出可执行文件,希望高手指点一下
#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个回复)

沙发

我突然发现一个问题……就是你实际上没必要传递整个二维数组
传递一维数组就可以了
int sum(int a[],int len)足矣
然后调用的时候直接b[i]=sum(a[i],N);就可以了,没必要特意给函数里传一个实际上根本用不到的数组维度

板凳

您的看法正确,不过我题目的要求是对一个二维数组操作,如果我在函数形参中用了一维的数组,那我在函数中可以把它当做二维使用吗?
int sum(int a[],int len)
{
  int s=0, k;
    for(k=0;k<N;K++)
        s+=a[len][k];
    return s;
}
就像那样,上面是一维,当二维来用?
而且我刚才照您的方法改了一下,无法生成可执行文件。
希望您能为我指点一下

3 楼

我写出来的代码其实并没有改变你的题意,也就是说你其实还是在对原二维数组进行计算,只不过每次只计算这个二维数组的一行,因此在函数里处理的只是一个一维数组而已。循环里只要处理s+=a[k]即可。注意,对二维数组的处理不等于一定要按照a[i][j]这样的形式去计算。只要你对原始数据的存储是个二维数组就可以了

4 楼


雪光风剑
你好,首先感谢你的回答,而且貌似我所有的帖子你都回答过。
你跟我讲的我貌似不能完全理解,而且按你的方法,代码执行不了。如果可以的话,你可以帮改一下代码吗?谢谢。
我的邮箱是napoleonggjc@yahoo.com

5 楼

简单拆解一下我的说法好了
对于一个二维数组的实例,比如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 楼


谢谢
按照你说的,我修改了代码,而且成功了。你所说的是不是就是在主函数中,将每行首元素的地址传递给形参,然后,就在计算函数中,把每行当一个一维数组使用。
理论还是要有实践啊,上课老师就这么说,以为自己掌握了,没想到还有这么大的距离。

7 楼

理解正确。我最近身体不太好,可能说话条理比较差,引起你一开始的误解了。致歉

8 楼

雪光兄分析的很对。可以这么做:
[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]

我来回复

您尚未登录,请登录后再回复。点此登录或注册