Проблема после того, как искали конкретный элемент массива

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

Программа функционирует хорошо, если я использую цикл for, чтобы пробегать массив, который выражает сообщение для каждого положения. Моя проблема состоит в том, что я хочу, что единственный писец сообщение: если он нашел точку стула, или если он не нашел ни одного.

#include <stdio.h>
#define M 3
#define N 4

void leeMat(int mat[M][N]);
int puntoSilla(int mat[M][N], int posFila, int posColumna);
void escribeMat(int mat[M][N]);

void main()
{
    int mat[M][N]=
    {
        1, 4, 0, 3,
        1, 3, 0, 7,
        3, 3, 2, 3,  //punto de silla en posicion 2-2
    }, posFila, posColumna, existe=1;

    printf("\n");
    escribeMat(mat);

    for(posFila=0; posFila<M && existe; posFila++)
    {
        for(posColumna=0; posColumna<N && existe; posColumna++)
        {
            if(puntoSilla(mat, posFila, posColumna)!=1)
                existe=0;
        }
    }

    printf("\n");

    if(existe)
     printf("Tiene punto de silla en la posicion %d-%d\n", posFila, posColumna);

    else printf("No tiene punto de silla\n");
}

void leeMat(int mat[M][N])
{
    int i, j;

    for(i=0; i<M; i++)
    {
        for(j=0; j<N; j++)
        {
            printf("Escribe valor para la posicion %d-%d: ", i, j);
            scanf("%d", &mat[i][j]);
        }
    }
}

int puntoSilla(int mat[M][N], int posFila, int posColumna)
{
    int i, j, enc=1;

    for(j=0; j<N && enc; j++)
    {
        if(mat[posFila][posColumna]>mat[posFila][j])
            enc=0;
    }

    if(enc)
    {
        for(i=0; i<M && enc; i++)
        {
            if(mat[posFila][posColumna]<mat[i][posColumna])
                enc=0;
        }
    }

    else enc=0;

    return enc;
}

void escribeMat(int mat[M][N])
{
    int i, j;

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

То, что я объясняю, находится в главной функции. Если бы кто-то знал, какова проблема, он был бы очень благодарен. Спасибо.

2
задан 25.04.2019, 20:16
1 ответ

Ошибка находится в, который esás понимая, что у тебя есть точка стула, и ты посвящаешь себя тому, чтобы повторять из-за массива до тех пор, пока ты не находишь точку, которая не выполняет обязательное условие, и он должен бы быть наоборот:

int existe=0;

for(posFila=0; posFila<M && !existe; posFila++)
{
    for(posColumna=0; posColumna<N && !existe; posColumna++)
    {
        existe = puntoSilla(mat, posFila, posColumna);
    }
}

Почему? Главным образом, потому что перед тем, как повторять, ты не нашел точку стула, потом existe=1 это большая ложь. Тот факт, что puntoSilla возвратите 0, если настоящая точка не искавшая, он делает, чем в первом повторении existe перейдите к тому, чтобы стоить 0, что способствует тому, чтобы алгоритм не продолжил искать... только, ты спасся бы, если точка стула находится в первой ячейке.

Этот тип ошибок ты нашел бы их быстро, если бы ты научился использовать отладчик кода. Это необходимый инструмент, чтобы программировать, так что я рекомендую тебе спешить они в учении использовать.

С другой стороны, если ты позволяешь мне критику, попробуй предотвращать избыточный код. Я объясняюсь. В этом коде, например:

if(enc)
{
  for(i=0; i<M && enc; i++)
  {
    if(mat[posFila][posColumna]<mat[i][posColumna])
      enc=0;
  }
}
else enc=0;

Мы можем удалять условные оба. Внешняя сторона излишней, потому что сам for он имеет как условно, что enc имейте различную стоимость 0 и давайте не забудем, что условный одного for он работает для каждого повторения, первого incluída. Кроме того, else он также избыточный, так как в твоей функции enc только смоги стоить 1 или 0, потом, если он не стоит 1, ясно, что он будет стоить 0.

Чтобы удалять второго условного нужно понимать, что в C условие возвращает 1 или 0, если та же самая истинная или фальшивая. Если намерение - что enc стойте 0, если находится более высокая стоимость, достаточно находить условие, которое было бы фальшивым только в этом случае.

Упрощенный эквивалент остался бы таким:

for(i=0; i<M && enc; i++)
{
  enc = (mat[posFila][posColumna]>=mat[i][posColumna]);
}

И даже мы могли бы избегать объявлять переменные в начале функции и иметь их внутри цикла. Таким образом, переменная прекращает существовать, закончив цикл. Не годится иметь живые переменные однажды они выполнили Вашу миссию:

for(int i=0; i<M && enc; i++)
{
  enc = (mat[posFila][posColumna]>=mat[i][posColumna]);
}

Приветствие.

1
ответ дан 03.12.2019, 22:23

Теги

Похожие вопросы