PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

armaFilas - R1 2C 2018 #4

Open matsdah opened 2 months ago

matsdah commented 2 months ago

Buenas noches, como les va? Queria preguntarles si esta solucion es valida, desde ya muchas gracias. Les paso la consigna:

Escribir una función armaFilas que recibe una matriz de enteros de N filas y M columnas, y un vector de dimensión N. La función debe armar los números que se forman con cada fila y guardarlos en el vector. Si hubiera números negativos o de más de una cifra en una fila, no se completa el armado de ese número, pero se sigue con la próxima fila. La función retorna en su nombre la dimensión final del vector de números.


#define M 5
#define N 5
#include "math.h"

int checkFila(int m[]);
int sumaNumero(int m[]);

int armaFilas(int m[N][M], int *v){
    int dim = 0;
    int estado;
    for(int i = 0; i < N; i++) {
        /* Recorro todas las filas viendo cuales copio y cuales no. */
        estado = checkFila(m[i]);
        if(estado){
            /* Copio el numero representado en el vector. */
            v[dim++] = sumaNumero(m[i]);
        }
    }
    /* Retorno la nueva dimension del vector. */
    return dim;
}

/* Convierte la fila en un numero. */
int sumaNumero(int m[]){
    int suma = 0;
    int k = 0;
    for(int j = M; j > 0; j--){
        suma += m[j] * pow(10, k++);
    }
    return suma;
}

/* Chequea si la fila es valida. */
int checkFila(int m[]) {
    for(int j = 0; j < M; j++) {
        if(m[j] < 0 || m[j] > 9) {
            return 0;
        }
    }
    return 1;
}
marcelogarberoglio commented 2 months ago

Algunas observaciones: En el caso de que sea correcta, estás recorriendo dos veces cada fila. Se podría hacer que sumaNumero vaya haciendo el chequeo y en caso de que algún dígito sea inválido retornar un negativo Estás usando pow para calcular primero 10 "a la cero", luego "10 a la 1", etc. Podrías guardar en una variable la potencia a usar (empezando en 1) y multiplicarla por 10 en cada paso En las funciones que reciben vectores deberías agregar un const al parámetro, ya que el vector no se modifica

matsdah commented 2 months ago

Gracias por la corrección Marcelo, no se me había ocurrido que retorne negativo si hay algún digito invalido. El uso del pow() se me hace mas claro, no se cuanto se descontaría en este caso. Te paso el nuevo código :)


#define M 5
#define N 5
#include "math.h"

int checkFila(int m[]);

int armaFilas(const int m[N][M], int *v){
    int dim = 0;
    int suma;
    for(int i = 0; i < N; i++) {
        /* Recorro todas las filas viendo cuales copio y cuales no. */
        suma = checkFila(m[i]);
        if(suma >= 0) {
            /* Caso valido. */
            v[dim++] = suma;
        }
    }
    /* Retorno la nueva dimension del vector. */
    return dim;
}

/* Chequea si la fila es valida y devuelve la suma de la misma. */
int checkFila(const int m[]) {
    int suma = 0;
    int k = 0;
    for(int j = M; j > 0; j--) {
        if(m[j] < 0 || m[j] > 9) {
            /* Caso invalido, retorno -1 pues 0 puede ser una suma valido. */
            return -1;
        }
        suma += m[j] * pow(10, k++);
    }
    return suma;
}
marcelogarberoglio commented 2 months ago

El tema es que pow va a ser más pesada que multiplicar por 10. Y como necesitás las potencias de 10, empezado de 0 en adelante podés hacer lo siguiente s.e.u.o.

int checkFila(const int m[]) {
    int suma = 0;
    int pot10 = 1;
    for(int j = M-1; j >= 0; j--) {    // Acá había un error que antes se me pasó. Asumí que había pasado un testeo
        if(m[j] < 0 || m[j] > 9) {
            /* Caso invalido, retorno -1 pues 0 puede ser una suma valido. */
            return -1;
        }
        suma += m[j] * pot10;
        pot10 *= 10;
    }
    return suma;
}

Espero que esta solución te sea útil. Si tenés más preguntas o necesitás más asistencia, no dudes en decírnoslo.

matsdah commented 2 months ago

Joya Marce, no sabia que pow era mas pesado.