【问题标题】:Sum of elements, per single column and per single row, in 2D array (or table), prints out unexpected values (in C)二维数组(或表)中每列和每行的元素总和,打印出意外的值(在 C 中)
【发布时间】:2018-02-23 13:36:35
【问题描述】:

我正在使用 Atom 编辑器(1.24.0 x64)和 gpp 编译器(3.0.7,MinGW 中的 GCC)。我可以在此处添加有关系统环境的任何其他有用信息吗?对了,我编程只有一个学期,还不知道怎么调试。

问题介绍

我正在尝试总结使用二维数组生成的表中的值。在一个双 while 循环中有 3 个和。执行的总和是:

  1. 表格中的所有元素都已相加。这里没问题。
  2. 将同一行中的所有元素相加。这里有问题。返回值与预期不同。它们的价值不同,我认为是内存垃圾。
  3. 将同一列中的所有元素相加。这里也有问题。与上述问题相同。

当然,我期望的是正确的值。我真的不知道问题出在哪里。我已经尝试过不同的方法。除了在这里和那里更改一些循环或打印结果以查看循环的行为方式之外,我想不出更多了。当我打印出列和行的结果时,我认为是内存地址(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。其他结果也不同。

我已经尝试了其他方法,但均未成功:

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 中不允许进行这种类型的求和,但由于我只是编程的初学者,我真的不知道。我已经在互联网上查看了这是否可能成功。

【问题讨论】:

  • 请贴一个完整的例子,可以自己验证。你只放了代码sn-ps,并没有显示变量是如何声明的以及在哪里声明的。只有通过一个完整的、可编译的示例,任何人才能看到您的代码中发生了什么。
  • 完整代码在提供的链接中。我认为关于如何提出问题的指南需要代码的 sn-ps,而不是完整的代码。我没有添加变量的声明,因为我认为它们不是理解问题所必需的。在链接中查找完整的代码,并告诉我变量声明对于问题是否必要。如果你看完代码有同样的想法,我会添加它们。
  • 你需要阅读如何发布帮助页面,它会告诉你这在 SO 中是不礼貌的。
  • @LuisColorado SO有什么不礼貌的?请具体点。我仍在学习如何更好地在此网站上发布信息。
  • 我的意思是,你写“那不礼貌”时的意思。

标签: c multidimensional-array addition


【解决方案1】:

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

【讨论】:

  • 此解决方案有效。只需要将数组初始化为零。我为这个程序写的是:sumColumn[3] = {0}, sumRow[3] = {0}; 在此之后程序正常工作。但是在打印出中间结果时,我仍然可以在控制台中看到一些奇怪的值(例如:6487568、6487584)。知道这些是什么吗?
【解决方案2】:

您似乎忘记将数组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 };

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

这是一个演示程序。

#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 命名常量。

【讨论】:

  • 你最后写的代码中的^^^是什么?指示数组可以保存多少元素的标准方法是什么?
  • @CarlosW.Mercado 你有 3 次尝试来理解这意味着什么。:)
  • 我正在详细研究你分享的功能。这里 enum 和 memset() 有什么用?我才刚刚开始了解它们的功能。
  • 答案末尾的“幻数”是什么意思?
  • @CarlosW.Mercado 枚举用于设置数组维度的常量。 memset 对数组进行零初始化。
【解决方案3】:

sumRowsumColumn 在开始累加它们之前不会初始化为零 memset()这些变量在使用前全部归零

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多