Я пробегаю массив целых чисел, который должен находить конкретный элемент (точка стула, тот, который является несовершеннолетним Вашей линии и самым большим Вашей колонны).
Программа функционирует хорошо, если я использую цикл 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");
}
}
То, что я объясняю, находится в главной функции. Если бы кто-то знал, какова проблема, он был бы очень благодарен. Спасибо.
Ошибка находится в, который 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]);
}
Приветствие.