【问题标题】:check how many dominant numbers there are in a 2D array检查二维数组中有多少个显性数字
【发布时间】:2020-05-30 23:05:32
【问题描述】:

在这个程序中,我应该找出矩阵有多少个显性数字。占主导地位的数字是比右下方的数字更大的数字(请忍受我的英语)。

我输入了这个:

5 (9) 2  4  1 (7)  2  4///
3  5  6  2  5 (6)  1  2///
1  3  4  7  8 (8) (3) 0///
1  3  5  6  7  8   2  1///

我圈出的那些应该是占主导地位的,但它给了我 6,出了什么问题?

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

#define NR 4
#define NC 8

int dominants(int a[NR][NC]);
int main(int argc, char * argv[]){
int array[NR][NC];
int ndom;
int i,j;


for(i=0;i<NR;i++){
        for(j=0;j<NC;j++){

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

        printf("%d  ", array[i][j]);
        }
}

ndom=dominants(array);

printf("amount of dominant numbers:%d", ndom);
return 0;
}
int dominants(int a[NR][NC]){
int domflag;
int i,j, l, m;
int numdom=0;
for(i=0;i<NR-1;i++){
    for(j=0;j<NC-1;j++){
        for(l=i+1;l<NR;l++){
                domflag=1;
                for(m=j+1;m<NC;m++){
                if(a[i][j]<=a[l][m]){
                    domflag=0;
                                    }
                                   }
                           }
            if(domflag==1){
                numdom++;
                          }
        }

    }
    return numdom;
}

【问题讨论】:

    标签: c arrays function multidimensional-array


    【解决方案1】:

    domflag = 1; 在循环内 for (l = i + 1; l &lt; NR; l++) 但应该在循环外。

    减少此类错误的一个好方法是仅在需要的地方定义标识符。如果删除了例程顶部的定义 int domflag; 并将语句 domflag = 1; 更改为 int domflag = 1;,那么编译器稍后会在测试 domflag == 1 时给出错误,因为那将超出范围的定义。

    【讨论】:

      【解决方案2】:

      不要把所有的逻辑都放到主函数中。尝试使用函数。它使事情变得更容易

      int isdominant(int *arr, size_t cols, size_t rows, size_t col, size_t row)
      {
          int *rowend = arr + (row + 1) * cols - 1;
          int *pos = arr + row * cols + col;
          while(rowend > pos)
              if(*pos <= *rowend--) return 0;
          return 1;
      }
      
      #define COLS 10
      #define ROWS 7
      
      int main()
      {
          int arr[ROWS][COLS];
          int *ptr = &arr[0][0];
          unsigned dominants = 0;
      
      
          for(size_t index = 0; index < ROWS * COLS; index++) *ptr++ = rand() % 50;
      
          for(size_t row = 0; row < ROWS; row++)
          {
              for(size_t col = 0; col < COLS; col++)
              {
                  int dom = 0;
                  if(col != COLS - 1) dom = isdominant(arr[0], COLS, ROWS, col, row);
                  printf("%s%d%s\t", dom ? "(" : "", arr[row][col], dom ? ")" : "");
                  dominants += dom;
              }
              printf("\n");
          }
          printf("Dominant numbers: %u\n", dominants);
      }
      

      https://godbolt.org/z/tpwnm2

      【讨论】:

      • (a) 在问题中给出的输入上得到错误答案,因为它允许最后一行中的元素占主导地位(原始代码要求右下方的子矩阵非空)。 (b) 在其他输入上得到错误答案,因为它只将候选与一行进行比较,而不是与原始代码尝试的右下方子矩阵进行比较。 (c) 不必要地使用指针和指针算术而不向该级别的学生解释。 (d) 对代码的荒谬重写(没有文档)没有回答 OP 的“出了什么问题?”的问题。通过解释他们代码中的错误。
      猜你喜欢
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多