PI-ITBA / 2024_01

8 stars 0 forks source link

TP06_ej04 #19

Closed pedrogonzaleznunez closed 3 months ago

pedrogonzaleznunez commented 6 months ago

Buen dia! Queria saber si el ejercicio estaba bien resuelto, no encontré la soluciones en el campus como para comparar con eso. Tengo una pregunta: ¿Hay alguna forma de hacerlo sin agregarle el primer elemento de original[] al vector resultado[] ?

Buen finde, saludos!

int
eliminaRepetidos( const int original[], int dimOrig, int resultado[]){
    unsigned int dimRes = 0;
    int flag;

    if(dimOrig <= 0)
        return 0;

    if(dimOrig >= 1)
        resultado[0] = original[0];
        dimRes++;

    //por cada elemento, que esta en el vector 'original', recorro el vector 'resultado' para ver si estaba

    for(int i = 1; i < dimOrig ; i++){
        flag = 0;
        for(int j = 0; j < dimRes && !flag; j++){
            //Si encuentro el numero, en resultado[], no lo agrego
            if(original[i] == resultado[j])
                flag = 1;
        }

        //Si el flag sigue en cero, no encontre el numero dentro del vector 'resultado'
        // Caso contrario, lo agrego
        if(!flag){   
            resultado[dimRes] = original[i];
            dimRes++;
        }
    }

    return dimRes;
}
ImNotGone commented 6 months ago

si paso el primer if, este if se ejecuta siempre


    if(dimOrig >= 1)
        resultado[0] = original[0];
        dimRes++;

podrias sacar el condicional.

En cuanto a tu pregunta, si arrancas i en 0 y dimRes en 0, el for ya te va a poner el primer elemento, porque no va a entrar en el loop de j, pq con j = 0, y dimRes = 0, no se cumple j < dimRes (0<0)

pedrogonzaleznunez commented 6 months ago

Genial quedó muy claro. Tal como decis vos, al tener el if(!flag) el primer elemento se agrega solo, no lo habia contemplado. Por otro lado, cambie el return al final con operador condicional.

int
eliminaRepetidos( const int original[], int dimOrig, int resultado[]){
    unsigned int dimRes = 0;
    int flag;

    // if(dimOrig >= 1)
    //     resultado[0] = original[0];
    //     dimRes++;

    //por cada elemento, que esta en el vector 'original', recorro el vector 'resultado' para ver si estaba
    for(int i = 0; i < dimOrig ; i++){
        flag = 0;
        for(int j = 0; j < dimRes && !flag; j++){
            //Si encuentro el numero, en resultado[], no lo agrego
            if(original[i] == resultado[j])
                flag = 1;
        }
        //Si el flag sigue en cero, no encontre el numero
        if(!flag){   
            resultado[dimRes] = original[i];
            dimRes++;
        }
    }

    return (dimOrig <= 0 ? 0 : dimRes );
}
marcelogarberoglio commented 6 months ago

Se podría modularizar, haciendo una función que busque un elemento en un vector, para no tener el for adentro del for ¿Es necesario el condicional? Si no entra al ciclo porque dimOrig es <=0, dimRes queda en cero.