первый индекс в матрице игнорируется - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь понять, симметрична ли матрица 4x4, и ниже показано то, что я имею до сих пор.После компиляции я получаю сообщение:

pExam3p2.c:12:13: warning: expression result unused [-Wunused-value]  
                                if (Num[r,c]==Num[c,r]){  
                                        ^
pExam3p2.c:12:23: warning: expression result unused [-Wunused-value]
                                if (Num[r,c]==Num[c,r]).

Я думал, что добавление оператора else решит эту проблему.Но это не так.Любые идеи с благодарностью.Спасибо!

#include <stdio.h>
char isSymm (int Num[][4], int rows, int cols){
    int r,c, count=0;

    for (r=0; r<rows; r++){
        for (c=0; c<cols; c++){
            if (Num[r,c]==Num[c,r]){
                count=count+1;
            }
            else{
                count=count;
            }
        }
    }
    if (count==16){
        return 'y';
    }
    else {
        return 'n';
    }
}

int main (void){
    int Num[4][4];
    int c;
    int r;
    int size =4;

    for (r=0;r<size; r++){
        for (c=0; c<size; c++){
            printf("Enter your number: ");
            scanf("%d", &Num[r][c]); //NOTE THE &...
        }
    }

    char result= isSymm(Num, 4, 4);
    printf("%c", result);
}

Ответы [ 5 ]

0 голосов
/ 04 июня 2018

Пробламетический оператор равен Num[r,c]==Num[c,r] и почему он таков, он сообщается компилятором при запуске gcc -Wall -Wstrict-prototypes -Werror test.c как

ошибка: левый операнд выражения запятой не действует [-Werror= unused-value]

В Num[r,c] есть оператор запятая между r и c, а свойство оператора запятой состоит в том, что он будет решать все аргументы, но учитывать толькоправые операнды, поэтому Num[r,c] приводит к Num[c], и теперь вы сравниваете указатели Num[c] и Num[r], которые не дадут правильного результата.

Вы хотели проверить, является ли матрица symmetric или нет, для этого

Num[r,c]==Num[c,r] ==> Num[r][c] == Num[c][r]

А поскольку Num является симметричной матрицей,Вы должны вычислить число rows так, чтобы оно работало для любого массива, не жестко запрограммированного как size=4.

size=4; ==> size = sizeof(Num)/sizeof(Num[0]);

И при сравнении Num[r][c] и Num[c][r] часть else бесполезна, лучше удалите ее.

else{ /* not needed as if if block is false count value doesn't need to change */
    count=count;
}
0 голосов
/ 04 июня 2018

Доступ к элементу в двумерном массиве осуществляется с помощью индексов, то есть row index и column index массива.Например: -

int val = a[2][3];

Приведенный выше оператор возьмет 4-й элемент из 3-й строки массива.

Итак, в вашей функции char isSymm (int Num[][4], int rows, int cols) необходимо внести некоторые изменения: -

char isSymm (int Num[][4], int rows, int cols){
    int r,c, count=0;

    for (r=0; r<rows; r++){
        for (c=0; c<cols; c++){
            if (Num[r][c]==Num[c][r]){        // not  Num[r,c]==Num[c,r]
                count=count+1;
            }                                 // not needed count=count; else statement.
        }
    }
    if (count==16){
        return 'y';
    }
    else {
        return 'n';
    }
}

comma-operator вычисляет оба подвыражения и отбрасывает результат левого выражения, а результат - результат правого выражения.Таким образом, при r, c вычисляются как r, так и c, а затем результат r отбрасывается и результат r,c равен c. Здесь он становится Num[c], что недопустимо, поскольку Num равно 2-Размерный массив.

0 голосов
/ 04 июня 2018

Чтобы получить доступ к массиву массивов, используйте

Num[r][c]

Оператор ,, который вы использовали, выполняет оценку детали до ,, но игнорирует результат.Результатом оператора является значение второго вычисленного выражения, следующего за ,.
. Поэтому компилятор сообщает вам, что r игнорируется.

0 голосов
/ 04 июня 2018

Измените (Num[r,c]==Num[c,r]) на (Num[r][c]==Num[c][r])

Также удалите оператор else.

else{
    count=count;
}
0 голосов
/ 04 июня 2018

Num - это не «многомерный» массив (у C их нет), это массив массивов .Таким образом, чтобы получить элемент этого, вам нужно сделать, например, Num[r][c].

Чтобы объяснить, что происходит с Num[r,c], вам нужно узнать о оператор запятой .

Оператор запятой вычисляет оба подвыражения и отбрасывает результат левого выражения, а результат - результат правого выражения.Таким образом, с r,c оба r и c оцениваются, а затем результат r отбрасывается, а результат r,c равен c.

Это означает, что ваше выражение Num[r,c] действительно Num[c]Num[c] - это массив, который распадается на указатель на его первый элемент, то есть &Num[c][0], и вы сравниваете эти два указателя.


На неродственной ноте

else{
    count=count;
}

практически ничего не стоит, и вы можете удалить его полностью.

...