PI-ITBA / 2024_01

8 stars 0 forks source link

Ej16 TP11 #376

Closed martunud closed 3 months ago

martunud commented 3 months ago

Hola, queria consultar si las funciones que hice de este ejercicio estan bien y preguntar como puedo hacer las funciones de concatenar de forma eficiente. Por que lo unico que se me ocurre es copiar caracter por caracter de todas las frases en un mismo string, pero siento que de alguna manera se podria ir copiando de a "bloques" que serian las frases, pero no se como plantearlo.

#define BLOCK 20

typedef struct oracion{
    char * sentence;
    size_t code;
    char flag; // 1 si esta, 0 si no
} Oracion;

typedef struct phrasesCDT{
    Oracion * frases; // vector de punteros a struct de oraciones (que constan de una frase y su codigo)
    size_t cantFrases; // cantidad de frases que hay
    size_t claveDesde;
    size_t claveHasta
}phrasesCDT;

/*
* Recibe cuál será el rango de claves válidas a utilizar, por ejemplo si
* keyFrom=1001, keyTo=1500 habrá un máximo de 500 frases a almacenar
* keyFrom=1001, keyTo=3500 habrá un máximo de 2500 frases a almacenar
* Si los parámetros son inválidos retorna NULL
*/
phrasesADT newPhrasesADT(size_t keyFrom, size_t keyTo){
    if(keyTo < keyFrom){
        return NULL;
    }
    phrasesADT nuevaFrase = calloc(1, sizeof(struct phrasesCDT));
    nuevaFrase->cantFrases = keyTo - keyFrom + 1;
    nuevaFrase->claveDesde = keyFrom;
    nuevaFrase->claveHasta = keyTo;
    nuevaFrase->frases = calloc(1, sizeof(Oracion)); // tambien tengo que inicializar el string
    return nuevaFrase;
}

/* Libera toda la memoria reservada por el TAD */
void freePhrases(phrasesADT ph){
    size_t i;
    for(i = 0; i < ph->cantFrases; i++){
        free(ph->frases[i].sentence); // libear cada frase
    }
    free(ph->frases); // libero las posiciones inicializadas en unos y ceros
    free(ph); // libero el CDT
}

static char * copyStr(const char * frase){
    char * copia = NULL;
    size_t i;
    for(i = 0; frase[i]; i++){
        if(! (i % BLOCK)){
            copia = realloc(copia, (i + BLOCK) * sizeof(char));
        }
        copia[i] = frase[i];
    }
    copia = realloc(copia, (i + 1) * sizeof(char));
    copia[i] = '\0';
    return copia;
}

/*
* Agrega una frase. Si la clave key es inválida retorna 0, sinó retorna 1 (uno)
* Si ya hay una frase asociada a la clave, actualiza la frase almacenada,
* reemplazándola por el parámetro phrase.
* Se almacena una copia de la frase.
*/
int put(phrasesADT ph, size_t key, const char * phrase){
    if(key < ph->claveDesde || key > ph->claveHasta){
        return 0;
    }
    size_t index = key - ph->cantFrases + 1;
    ph->frases[index].sentence = copyStr(phrase);
    ph->frases[index].code = key;
    ph->frases[index].flag = 1;
    return 1;
}

/*
* Retorna una copia de la frase asociada a la clave key. Si no hay frase asociada
* a la clave key retorna NULL, lo mismo si la clave es inválida.
*/
char * get(const phrasesADT ph, size_t key){
    size_t index = key - ph->cantFrases + 1;
    if((key < ph->claveDesde || key > ph->claveHasta) || ph->frases[index].flag == 0){
        return NULL;
    }
    return copyStr(ph->frases[index].sentence);
}

/*
* Cantidad de frases almacenadas
*/
size_t size(const phrasesADT ph){
    size_t count = 0, i;
    for(i = 0; i < ph->cantFrases; i++){
        if(ph->frases[i].flag){
            count++;
        }
    }
    return count;
}

/*
* Retorna un string con todas las frases concatenadas 
* Si no hay frases retorna un string vacío
*/
char * concatAll(const phrasesADT ph){

}

/*
* Retorna un string con todas las frases concatenadas cuyas claves estén entre
* from y to inclusive. Si from o to son inválidas (están fuera del rango)
* retorna NULL
* Si no hay frases en ese rango, retorna un string vacío
*/
char * concat(const phrasesADT ph, size_t from, size_t to){

}