PI-ITBA / 2024_02

Consultas 2C 2024
3 stars 0 forks source link

TP 6 EJ 16 (ascendenteODescendente) #45

Open FacuLL opened 3 days ago

FacuLL commented 3 days ago

(Duda para que respondan mañana)

Buenas! Volviendo a la guía me surgió la duda de si este ejercicio está bien hecho:

Escribir una función que reciba una matriz de números enteros y cuya cantidad de filas está dada por la constante simbólica FILS y la cantidad de columnas por la constante simbólica COLS.

Se asegura que ambas constantes son mayores o iguales a 2 (no hace falta validarlo)

La función debe retornar 1 si la matriz es "ascendente", -1 si es "descendente" y 0 si no es ascendente ni descendente. Se dice que una matriz es ascendente si recorriendola en forma ordenada por filas cada elemento es mayor o igual al anterior, En forma análoga se define una matriz descendente.
El recorrido comienza por el elemento [0][0], continúa con el [0][1] y luego de terminar la primera fila hace lo mismo con la segunda fila, tercer fila, etc.

Yo pensé la función de la siguiente manera:

int ascendenteODescendente(const int (m[])[COLS]) {
    unsigned char esAsc = 1;
    unsigned char esDesc = 1;
    for (int i = 0; i < FILS; i++) {
        for (int j = 0; j < COLS; j++) {
            if (i != FILS-1 || j != COLS-1) {
                if (m[i][j] > m[i][j+1]) esAsc = 0;
                else if (m[i][j] < m[i][j+1]) esDesc = 0;
            }
        }
    }
    return esAsc ? 1 : esDesc ? -1 : 0;
}

Quería saber si tiene buen estilo pero, sobre todo, si es buena práctica pasarse de la fila de una matriz intencionalmente, sabiendo que a continuación se encuentra el primer elemento de la siguiente fila.

Gracias y saludos!

marcelogarberoglio commented 2 days ago

Si en algún momento ambos flags son cero, entonces no tiene sentido seguir recorriendo Pero el algoritmo es incompleto, fijate que junto con el enunciado debe haber ejemplos Por ejemplo, si COLS es 4 se tiene que cumplir (para que sea ascendente) que m[i][COLS-1] sea menor que m[i+1][0] No estás contemplando toda la matriz sino cada fila en forma individual Tampoco entiendo por qué ignorás la última fila

FacuLL commented 2 days ago

Hola, tenés razón en cuanto a cortar cuando ambos flags son 0, gracias. En cuanto a checkear ascendencia/descendencia entre el último elemento de una fila y el primero de la siguiente, es justamente lo que hago al checkear que m[i][j+1] ya que, al pasar por el último elemento de una fila, lo compara con el siguiente elemento que, si no me equivoco, corresponde al primero de la siguiente fila. Se pasa de rango intencionalmente y me preguntaba si se considera mala práctica. Incluso podría hacerse considerando a la matriz como un vector de FILS * COLS elementos. No estoy ignorando la última fila, solo ignoro el último elemento de la matriz puesto a que no tiene sentido compararlo con el siguiente (que no corresponde a un elemento de la matriz). Gracias nuevamente.

marcelogarberoglio commented 2 days ago

En este caso, que la matriz se usa completa, se puede hacer el "truco" de pasarse de una fila ya que es el primer elemento de la siguiente fila. Pero si no se usa la matriz completa sino hasta cierta columna, el algoritmo ya no sirve. Por eso es preferible un algoritmo que sea igual de simple pero más genérico. Es suficiente con tener guardada en una variable el valor anterior visitado. De esa forma no hay casos especiales y funciona para todos los casos

FacuLL commented 2 days ago

Muy claro, muchas gracias.