2D阵列(或表)中每个单列和每行的元素总和,打印出意外值(在C中)

时间:2018-02-23 13:36:35

标签: c multidimensional-array addition

我使用Atom编辑器(1.24.0 x64),使用gpp-compiler(3.0.7,MinGW中的GCC)。我可以在这里添加有关系统环境的其他有用信息吗?顺便说一句,我只有一个学期的编程,所以我不知道如何调试。

问题简介

我试图总结使用2d数组生成的表中的值。循环中有一个双倍的3个总和。执行的金额为:

  1. 表格中的所有元素都已累加。这里没问题。
  2. 添加同一行中的所有元素。问题在这里。返回的值与预期值不同。它们的价值不同,我认为是记忆垃圾。
  3. 添加同一列中的所有元素。这里也有问题。与上述问题相同。
  4. 当然,我期望正确的价值观。我真的不知道问题出在哪里。我已经尝试过不同的方法。我不能再考虑在这里和那里改变一些循环或打印结果以查看循环的行为。当我打印出列和行的结果时,我认为的是内存地址(6487568等)。

    结果和预期结果

    在这里你可以看到结果:

    2       3       4
    5       8       0
    7       5       6
    
    The sum of every element in the chart is: 40
    
    The sum of every element per row is:
    
    8                   //Should add up to 9
    12                  //Should add up to 13
    4200743             //Should add up to  18
    
    The sum of every element per column is:
    15      16      4200611
    
    //Should add up to:
    //14      16      10
    

    代码

    我认为有些问题在这里:

    /*This sums up the the elements, for the entire table,
    for every single row and for every single column.*/
    while (row < ROWS)
    {
       column = 0;
       while (column < COLUMNS)
       {
            sum += array[row][column];
            sumRow[row] += array[row][column];
            sumColumn[column] += array[row][column];
            column++;
       }
       row++;
    }
    

    这里是完整的code。出于某种原因,在添加所有元素时,在线编译器没有返回40的预期结果,但是29.而其他结果也不同。

    我已经尝试了额外的approches:

    sum += array[row][column];
    sumRow[row][COLUMNS+1] += array[row][column];
    sumColumn[ROWS+1][column] += array[row][column];
    

    另:

    sum += array[row][column];
    sumRow[row] += array[row][column];
    sumColumn[column] += array[row][column];
    

    作为旁注:我怀疑不允许在C中使用这种类型的总和,但由于我只是编程的初学者,所以我真的不知道。我已经在网上看过这是否有可能没有成功。

3 个答案:

答案 0 :(得分:1)

创建数组或矩阵时,它们的元素具有随机值。并且sumRow[row] += array[row][column];在第一次迭代中sumRow [row]在求和之前可以是非零值。所以用零初始化它应该运行正常。同样的情况也是如此。

答案 1 :(得分:1)

您似乎忘记使用数组sumRowsumColumn进行初始化。

如果数组不是可变长度数组,那么您可以在声明它们时初始化它们。例如

enum { ROWS = 3, COLUMNS = 3 };
int sumRow[ROWS] = { 0 };
int sumColumn[COLUMNS] = { 0 };

考虑到对于累加器,最好使用long long int类型而不是int

例如

enum { ROWS = 3, COLUMNS = 3 };
long long int sumRow[ROWS] = { 0 };
long long int sumColumn[COLUMNS] = { 0 };

如果数组是可变长度数组,那么在声明它们时可能不会初始化它们。在这种情况下,您可以使用标题memset中声明的标准函数<string.h>

这是一个示范程序。

#include <stdio.h>
#include <string.h>

void output_sums( size_t rows, size_t cols, int a[rows][cols] )
{
    long long int sumRow[rows];
    long long int sumColumn[cols];
    long long int sum = 0;

    size_t i, j;

    memset( sumRow, 0, rows * sizeof( long long int ) );
    memset( sumColumn, 0, cols * sizeof( long long int ) );

    i = 0;
    while ( i < rows)
    {
        j = 0;
        while ( j < cols )
        {
            sum += a[i][j];
            sumRow[i] += a[i][j];
            sumColumn[j] += a[i][j];
            j++;
        }
        i++;
    }   

    for ( i = 0; i < rows; i++ )
    {
        for ( j = 0; j < cols; j++ )
        {
            printf( "%d\t", a[i][j] );
        }
        putchar( '\n' );
    }

    printf( "\nThe sum of every element in the chart is: %lld\n", sum );

    puts( "\nThe sum of every element per row is:" );
    for ( i = 0; i < rows; i++ )
    {
        printf( "%lld\n", sumRow[i] );
    }

    puts( "\nThe sum of every element per column is:" );
    for ( j = 0; j < cols; j++ )
    {
        printf( "%lld\t", sumColumn[j] );
    }
}

#define N   3

int main(void) 
{
    int a[N][N] =
    {
        { 2, 3, 4 },
        { 5, 8, 0 },
        { 7, 5, 6 }     
    };

    output_sums( N, N, a );

    return 0;
}

它的输出是

2   3   4   
5   8   0   
7   5   6   

The sum of every element in the chart is: 40

The sum of every element per row is:
9
13
18

The sum of every element per column is:
14  16  10  

编辑:在提供对原始代码的引用之后,除了使用非初始化数组之外,数组的大小也不正确:

 int sumColumn[2], sumRow[2],
              ^^^        ^^^

尽量不要使用魔术数字。使用instaed命名常量。

答案 2 :(得分:0)

在您开始累积总和之前,

sumRowsumColumn未初始化为零 memset()这些变量在使用之前全部为零