【问题标题】:Counting negative numbers in each column in an 2d array计算二维数组中每一列的负数
【发布时间】:2019-12-11 15:33:46
【问题描述】:

我正在尝试计算方阵(2D 数组)的每一列中的负数,并且我在两个数组上进行。我的问题是我的程序似乎读取的是行而不是列,并且它为第一个数组给出的结果是不正确的,即使第二个数组的结果很好。

这是我的代码:

#include <stdlib.h>
#include <stdio.h>

void function(int Z[20][20], int z)
{
    int i, j;
    int count[10];

    for (i = 0; i < z; i++)
    {
        count[i] = 0;
        for (j = 0; j < z; j++)
        {
            if(Z[i][j] < 0)
            {
                count[i]++;
            }
        }
    }
    for (i = 0; i < z; i++)
    {
        printf("\n Col %d = %d", i, count[i]);
    }
}

int main()
{
    int A[10][10], B[15][20];
    int i, j, n = 3;

    printf("\n Table A: ");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d",&A[i][j]);
        }
    }

    printf("\n Table B: ");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++){
            scanf("%d ",&B[i][j]);
        }
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ",A[i][j]);
        }
        printf("\n");
    }
    printf("\n");

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            printf("%d ",B[i][j]);
        }
        printf("\n");
    }

    function(A,n);
    function(B,n);
    return 0;
}

我的矩阵是:

A:             B:
 3 -4 -5        3 -5  2
-2  1  3       -3 -1  6
 5 -7 -4        8 -5  4

这是我得到的输出:

 Table A:
3
-4
-5
-2
1
3
5
-7
-4

 Table B: 3
-5
2
-3
-1
6
8
-5
4
3
3 -4 -5
-2 1 3
5 -7 -4

3 -5 2
-3 -1 6
8 -5 4

 Col 0 = 2
 Col 1 = 2
 Col 2 = 0
 Col 0 = 1
 Col 1 = 2
 Col 2 = 1

【问题讨论】:

  • 您的代码格式错误。请一致地重新格式化它,因此每行只有一个语句。
  • 您的 function 需要一个 20x20 数组,但您传递给它的是一个 10x10 数组和一个 15x20 数组。编译器可能会输出一些关于不兼容指针类型的警告。
  • 好的,所以也许我在这里“吹响自己的号角”,但是我几天前给出的答案可能会帮助您理解为什么需要一致 i> 使用您的数组尺寸,在mainfunction 之间;看这里:stackoverflow.com/a/59216754/10871073
  • void function(int Z[20][20], int z)int A[10][10]function(A,n); 是令人不安的代码。启用所有编译器警告。

标签: c arrays


【解决方案1】:

您正在尝试查找每列中的负数计数。但是在您的函数中,您正在计算每一行(而不是列)中的负数。您可以通过计算负数并将其与程序的输出相匹配来验证这一点。您可以通过简单地更改函数中的索引来修复它 -

void function(int Z[20][20], int z) {
    int i,j;
    int count[10];
    for (i=0; i<z; i++) {
        count[i]=0;
        for(j=0; j<z; j++) {
            if (Z[j][i]<0)
                count[i]++;
        }
    }
    for (i=0; i<z; i++) {
        printf("\n Col %d = %d",i,count[i]);
    }
}

注意 if 条件从 if (Z[i][j]&lt;0)if (Z[j][i]&lt;0) 的变化。这样,当在内部循环中说 i 为 0 时,您正在访问 Z[0][0]Z[1][0]Z[2][0],从而为您提供第 0 列中的数字。第 1 列和第 2 列相同。

在您的问题中,您提到您的代码为第二个数组提供了正确的答案。但是,如果您仔细观察,它会为第 1 列和第 2 列提供错误的值。

另外,根据其他人给出的建议更改您的代码。

【讨论】:

    【解决方案2】:

    我正在尝试计算方阵(2D 数组)的每一列中的负数,并且我在两个数组上进行。

    这是第一个问题,因为发布的 sn-p 中显示的数组之一不是 square

    int A[10][10], B[15][20];
    //               ^^  ^^
    

    它们也有不同数量的列(一个 10,另一个 20),但函数 function 被声明为

    void function(int Z[20][20], int z)
    { //                    ^^       ^  Expects an int [][20] and a number of columns
        int i, j;
        int count[10];
        //        ^^   Only 10, while you pass a matrix with 15 columns
        for (i = 0; i < z; i++)
        {
            count[i] = 0;
            //    ^          Out of bounds if i >= 10
    // ...
    

    您可以通过更改函数签名并使用可变长度数组来存储值来修复它

    void function(size_t rows, size_t cols, int Z[rows][cols])
    { //                 ^^^^         ^^^^        ^^^^  ^^^^
        size_t count[cols];
        //           ^^^^
        for (size_t i = 0; i < cols; ++i)
            count[i] = 0;   // This is a job for memset, though
    
        for (size_t i = 0; i < rows; ++i)
        {
            for (size_t j = 0; j < cols; ++j)
            {
                if( Z[i][j] < 0 )
                { //  ^  ^
                    ++count[j];
                    //      ^
                }
            }
        }
    // ...
    

    但请注意,此任务不需要数组来存储总和。您可以在计算出这些值后立即打印它们,您只需要按列优先顺序遍历数组:

    void function(size_t rows, size_t cols, int Z[rows][cols])
    {
        for (size_t col = 0; col < cols; ++col)
        { 
            size_t count = 0;
            for (size_t row = 0; row < rows; ++row)
            {
                if( Z[row][col] < 0 )
                { 
                    ++count;
                }
            }
            printf("Col %zu = %zu\n", col, count);
        }
    }
    

    【讨论】:

      【解决方案3】:

      [已编辑]

      我认为你对int count[10]; 有疑问,我假设你假设你所有的数组都是 20 长,所以你声明它是 10 长,在 c 中你可以做到,但你会在内存中写入你不拥有。

      尝试类似:

      void function(int inputArray[20][20], int arrayLength) {
          int i,j;
          int count[arrayLength];
          for (i = 0; i < arrayLength; i++){
              count[i] = 0;
              for(j = 0; j < arrayLength; j++){
                  if(inputArray[i][j] < 0){
                      count[i]++; 
                  }
              }
          }
          for(i = 0; i < arrayLength; i++){
              printf("\n Col %d = %d", i, count[i]);
          } 
      }
      

      也尝试编写有序的代码,这样更易​​于阅读和调试。

      【讨论】:

      • 你会写一些你不知道的其他变量最好说你会写在你不拥有的内存中
      • 我已经安排好了代码,但问题仍然存在。我使用count[10] 作为数组的限制。它还向我显示了这样的警告passing argument 1 of 'function' from incompatible pointer type [-Wincompatible-pointer-types]
      猜你喜欢
      • 1970-01-01
      • 2016-06-28
      • 2015-01-15
      • 2021-03-12
      • 2021-12-23
      • 2016-12-07
      • 2013-09-26
      • 2020-12-09
      • 2018-08-30
      相关资源
      最近更新 更多