PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

ej 1 REC1C 2024 #53

Open pelufoo opened 1 month ago

pelufoo commented 1 month ago

Hola buenas tardes, tengo una duda con este ejercicio y queria ver si mi respuestas esta bien. Mi duda surge en el vector de apariciones, como dice el enunciado, la suma tiene que estar en n y 2n entonces hice un vector de dimension n ya que el rango de las sumas es n (2n - n = n). la idea era en la posicion cero poner un 1 si la suma coincide con n, la posicion 1 poner un 1 si la suma coincide con n+1, y asi sucesivamente hasta llegar a 2n. Mi duda era ver si estaba bien la inicializacion el vector porque la dimension depende de la dimension de la matriz.

Se dice que una matriz de enteros de dimensión NxN es escalar si se cumple que: a) A lo sumo dos filas coinciden en la suma de sus elementos b) Todas las sumas están entre N y 2*N inclusive Escribir la función escalar que reciba los siguientes parámetros: ● dim: la dimensión de la matriz ● m: la matriz de dim x dim y retorne 1 si es escalar y 0 si no lo es.

mi codigo:

int inRange(int n, int range){

    return (n >= range && n <= 2*range);
}

int sumVec(const int vec[], int dim){
    int sum;
    for(int i = 0; i < dim; i++){
        sum += vec[i];
    }
    return sum;
}

int escalar(unsigned int dim, const int m[][dim]){
    if(dim < 3 && dim >= 0){
        return 1;
    }
    int vecSum[]={0};     //vector de apariciones que guarda cuantas veces aparece una suma entre n y 2n
    for(int i = 0; i < dim; i++){
        int sum = sumVec(m[i], dim);
        vecSum[sum-dim]++;
        if(vecSum[sum-dim] > 2 || !inRange(sum, dim)){    //sum-dim convierte la suma a un indice 
            return 0;
        }
    }
    return 1;
}
marcelogarberoglio commented 1 month ago

Está bien usar un vector de apariciones pero no así int vecSum[]={0};
pues falta indicar la dimensión. Si la dimensión no es una constante tienen que inicializarlo en un ciclo

pelufoo commented 1 month ago

ahhhh perfecto, ahi lo hice (no se si sigue estando bien el codigo en si), pero estuve entre dos opciones (para inicializar el vec de apariciones) y queria ver si ambas esta bien :

en este caso lo hice sin punteros:

int aux[dim];

    for(int i = 0; i < dim; i++){
        aux[i] = 0;
    }

y este es el caso que quiero ver si esta bien (usando punteros):

int *aux = 0;

    for(int i = 0; i < dim; i++){
        aux[i] = 0;
    }

y dejando esos cambios de lado si llegan a estar bien por lo menos uno de ellos, el codigo restante con esas modificaciones esta bien?

Muchas gracias Marcelo!

marcelogarberoglio commented 1 month ago

El de punteros no está bien, cuando hacés int *aux = 0;

le estás asignando NULL a aux

El algoritmo está bien

pelufoo commented 1 month ago

ah es verdad, eso era lo que me sonaba. Ahi lo modifico, Muchas gracias y perdon por la molestia!!