проверьте, сколько доминантных чисел в двумерном массиве - PullRequest
0 голосов
/ 15 февраля 2020

В этой программе я должен найти, сколько доминантных чисел имеет матрица. Доминирующее число - это число, которое больше, чем то, что находится ниже справа впереди (имейте в виду мой engli sh, пожалуйста).

я ввел это:

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;
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Не помещайте все логи c в основную функцию. Попробуйте использовать функции. Это делает вещи намного проще

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

0 голосов
/ 15 февраля 2020

domflag = 1; находится внутри l oop for (l = i + 1; l < NR; l++), но должно быть за его пределами.

Хороший способ уменьшить количество ошибок, подобных этой, - определять идентификаторы только там, где они нужны. Если бы определение int domflag; в верхней части подпрограммы было удалено, а оператор domflag = 1; был изменен на int domflag = 1;, то компилятор позже выдал бы ошибку при проверке domflag == 1, поскольку это было бы за пределами области видимости. определения.

...