回 帖 发 新 帖 刷新版面

主题:用函数复制二维数组???

题目我全抄出来,如下:
编写一个程序,初始化一个二维数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来复制数组的每一个子数组)

先贴上题目中所说的练习2的函数,功能就是把一个数组的内容传给函数,在函数中又把内容赋给主调函数中定义的一个同样类型的数组,就是出题作者所说的“复制”。说实话,对于这种题目,我很无语,但不做不行,既是作业又为了考量自己的掌握程度,

void copy_arr(double source[], double target1[], int n) // 使用数组符号 
{
    int i;
    
    for(i = 0; i < n; i++)
        target1[i] = source[i];

    return ;
}
另说明一下,这个所谓的练习2其实也是复制数组内容,但是呢,操作的对象是一维数组,用两种方法,一个函数用数组符号,就[]。另一个用指针符号,*。我随便选的一个函数,后来,做到练习6,书要求用练习2的函数做嘛,我看题的意思,最让我纠结的一句话就是

“并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的函数来复制数组的每一个子数组)”

看起来,并不让修改那个函数来做题,我写出代码,结果不尽如人意,代码如下:

#include <stdio.h>
#define FIVE 5

void copy_arr(double source[], double target1[], int n);

int main(void)
{
    double source[FIVE][FIVE] = {
                 {1.10, 1.11, 1.12, 1.13, 1.14},
                 {2.20, 2.21, 2.22, 2.23, 2.24},
                 {3.30, 3.31, 3.32, 3.33, 3.34},
                 {4.40, 4.41, 4.42, 4.43, 4.44},
                 {5.50, 5.51, 5.52, 5.53, 5.55}};
    double target1[FIVE][FIVE];
    
    copy_arr(source[0], target1[0], FIVE);

    
    printf("source %.2f\n", source[3][0]);
    printf("%.2f\n", target1[3][0]);        // 查验结果

    getch();
    return 0;
}

void copy_arr(double source[], double target1[], int n) // 使用数组符号 
{
    int i;
    
    for(i = 0; i < n; i++)
        target1[i] = source[i];

    return ;
}
target1数组只有前5个元素被赋值为source数组同样的元素里同样的数据。。。而其它元素被自动默认为0了,这不是我想要的结果。

这样子说我是想说明什么呢?是不是我看题看错了?题目其实是可以改函数的,我却理解成在不能改函数的情况下进行编程,可以改这题我可以做出来。

又或者,我没看错题,确实不能改函数,但是我的水平问题,代码有问题,所以,我来求助了。一开始,我看题就简单的认为,main中的两个数组,改为二维数组,函数不用改,这么一套就行了,后来,想想类型不对,就改了函数调用部分,因为我是直接从练习2复制那个函数代码到新文件里,出现Warning,我就改写了函数调用部分,加了[0],警告消失了,结果仍然不对。

怎么都好吧,由于对指针和数组的一知半解,产生这个问题,我应该怪那个作者说“处理一维数组的函数也能处理二维数组”吗?有点迷茫,求人指点迷津,谢谢。

我是不是有点傻。。。

回复列表 (共4个回复)

沙发

不傻,有点罗嗦。 
没时间仔细看, 晚上仔细看你的代码。

板凳

我有点不清楚为什么lz纠结这个问题,如果你想copy整个二维数组,函数不用改,循环中copy啊。。
for(index = 0; index < FIVE; index++)
{
    copy_arr(source[index], target1[index], FIVE);
}

是我理解错了么?

3 楼

int main(void)
{
    double source[FIVE][FIVE] = {
                 {1.10, 1.11, 1.12, 1.13, 1.14},
                 {2.20, 2.21, 2.22, 2.23, 2.24},
                 {3.30, 3.31, 3.32, 3.33, 3.34},
                 {4.40, 4.41, 4.42, 4.43, 4.44},
                 {5.50, 5.51, 5.52, 5.53, 5.55}};
    double target1[FIVE][FIVE];
    
    copy_arr(source[0], target1[0], FIVE*FIVE); //取巧了,请看题目要求“每一个子数组”

    
    printf("source %.2f\n", source[3][0]);
    printf("%.2f\n", target1[3][0]);        // 查验结果

    getch();
    return 0;
}

4 楼


实在是太郁闷了,原来问题在这,我就是死在这个“子数组”上,谢谢

我来回复

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