PI-ITBA / 2024_01

9 stars 0 forks source link

Segundo Parcial 1C 2024 ejercicio 2 #368

Closed mholgadoo closed 1 week ago

mholgadoo commented 1 week ago

Esta bien?


*
#define IS_VALID(size_t num, size_t max)((num < max))

typedef struct pier{
    char * docks;
    size_t pierShips;
    size_t numberOfDocks;
}TPier;

struct piersCDT{
    TPier * piers;
    size_t piersDim;
    size_t piersSize;
}

piersADT newPiers(void){
    piersADT new = calloc(1, struct piersCDT);
    new->piers = calloc(1, TPier);
    return new;
}
/*
* Agrega el muelle #dockNumber al puerto #pierNumber y retorna 1
* Falla si el muelle ya existe en el puerto o si el puerto no existe y retorna 0
* Un muelle inicia sin una embaración amarrada
* Se asume un bajo porcentaje de muelles libres para cada puerto
*/
size_t addPierDock(piersADT piers, size_t pierNumber, size_t dockNumber){
    if (!IS_VALID(pierNumber, piers->piersSize) || IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks)){
        return 0;
    }

    //agrega el muelle
    size_t aux = piers->piers[pierNumber]->numberOfDocks;
    piers->piers[pierNumber]->numberOfDocks = dockNumber + 1;
    piers->piers[pierNumber]->docks = realloc(piers->piers[pierNumber]->docks, sizeof(char) * piers->piers[pierNumber]->numberOfDocks);
    for (int i = aux; i < piers->piers[pierNumber]->numberOfDocks; i++){
        piers->piers[pierNumber]->docks[i] = 0; //inicializo en cero los muelles agregados (no estan ocupados)
    }

    return 1;
}

/*
* Amarra una embaración en el muelle #dockNumber del puerto #pierNumber y retorna 1
* Falla si el muelle ya estaba ocupado o si el muelle no existe en el puerto
* o si el puerto no existe y retorna 0
*/
size_t dockShip(piersADT piers, size_t pierNumber, size_t dockNumber){
    if (!IS_VALID(pierNumber, piers->piersSize) || !IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks) || piers->piers[pierNumber]->docks[dockNumber] == 1){
        return 0;
    }

    piers->piers[pierNumber]->docks[dockNumber] = 1;
    piers->piers[pierNumber]->pierShips++;
    return 1;
}

/*
* Indica si hay una embarcación amarrada en el muelle #dockNumber del puerto #pierNumber
* Retorna:
* 1 si hay una embarcación amarrada
* 0 si no hay una embaración amarrada
* -1 si el muelle no existe en el puerto o si el puerto no existe
*/

int shipInDock(const piersADT piers, size_t pierNumber, size_t dockNumber){
    if (!IS_VALID(pierNumber, piers->piersSize) || !IS_VALID(docksNumber, piers->piers[pierNumber].numberOfDocks))
        return -1;
    return piers->piers[pierNumber]->docks[dockNumber];
}

*