PI-ITBA / 2024_02

Consultas 2C 2024
4 stars 0 forks source link

2Do Ejercicio Parcial 1C 2024 #181

Open HoltzTomas opened 2 days ago

HoltzTomas commented 2 days ago

Ejercicio 2

Duda

Simplemente quería saber si estaba bien encarado en cuanto a los structs. No tuve en cuenta la función addPiers para plantear los structs dado que no me especificaba que los structs tenían que hacer que esta fuese eficiente

#include "piersADT.h"

typedef enum { vacio = 0, ocupado } Estado;

typedef struct {
  Estado estado;
  Estado existe;
} Dock;

typedef struct {
  Dock* docks; // Vector donde guardo si los muelles estan ocupados o no
  Estado existente; // 0 si no existe el puerto, 1 si existe
  size_t ocupados;
  size_t reservados_dock;
} Pier;

typedef struct piersCDT {
  Pier* vec;
  size_t reservados_pier;
} piersCDT;

static int existPier(piersADT piers, size_t pierNumber) {
  return pierNumber < piers->reservados_pier && piers->vec[pierNumber].existente == 1;
}

piersADT newPiers(void) {
   return calloc(1, sizeof(piersCDT));
}

size_t addPierDock(piersADT piers, size_t pierNumber, size_t dockNumber) {
  if ( !existPier(piers, pierNumber) ) {
    return 0; // Retorno 0 si el puerto no existe
  }
  if(piers->vec[pierNumber].reservados_dock <= dockNumber) {
    piers->vec[pierNumber].docks = realloc(piers->vec[pierNumber].docks, sizeof(Dock) * (dockNumber + 1));
    for (size_t i = piers->vec[pierNumber].reservados_dock; i <= dockNumber; i++)
    {
        piers->vec[pierNumber].docks[i].estado = 0;
        piers->vec[pierNumber].docks[i].existe = 0;
    }

    piers->vec[pierNumber].reservados_dock = dockNumber + 1; 
  }

  if(piers->vec[pierNumber].docks[dockNumber].existe)
    return 0;

  //Ahora el muello existe, cuando se creo se marco como vacio
  //por ende no hace falta hacer eso
  piers->vec[pierNumber].docks[dockNumber].existe = 1;

  return 1;

}

size_t dockShip(piersADT piers, size_t pierNumber, size_t dockNumber) {
  if ( !existPier(piers, pierNumber) ) {
    return 0;
  }

  //Si dock number es mayor a la cantidad de muelles reservados, o no existe o esta ocupado
  if(piers->vec[pierNumber].reservados_dock <= dockNumber || !(piers->vec[pierNumber].docks[dockNumber].existe) || piers->vec[pierNumber].docks[dockNumber].estado == ocupado)
    return 0;

  piers->vec[pierNumber].docks[dockNumber].estado = ocupado;
  piers->vec[pierNumber].ocupados++;
  return 1;
}

int shipInDock(const piersADT piers, size_t pierNumber, size_t dockNumber) {
  if ( !existPier(piers, pierNumber) || piers->vec[pierNumber].reservados_dock <= dockNumber || piers->vec[pierNumber].docks[dockNumber].existe == 0 ) {
    return -1;
  }
  return piers->vec[pierNumber].docks[dockNumber].estado;
}
#include <stdlib.h>

typedef struct piersCDT * piersADT;

/* Crea un sistema de administración de muelles de los puertos de una ciudad */
piersADT newPiers(void);

/* Agrega el puerto #pierNumber y retorna 1
* Falla si el puerto ya existe y retorna 0
* Un puerto inicia sin muelles. Se asume un bajo porcentaje de puertos libres */
size_t addPier(piersADT piers, size_t pierNumber);

/* 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);

/* 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);

/* 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);

/* Indica la cantidad de embarcaciones amarradas en todos los muelles del puerto * #pierNumber
* Falla si el puerto no existe y retorna -1
*/
size_t pierShips(const piersADT piers, size_t pierNumber);

/* Desamarra una embaración en el muelle #dockNumber del puerto #pierNumber y retorna 1 * Falla si el muelle estaba libre o si el muelle no existe en el puerto
* o si el puerto no existe y retorna 0
*/
size_t undockShip(piersADT piers, size_t pierNumber, size_t dockNumber);

/* Libera los recursos utilizados por el TAD */
void freePiers(piersADT piers);
marcelogarberoglio commented 2 days ago

Tiene que ser un vector (puertos) de vectores (muelles), donde hace falta marca para saber si existe el puerto y también si se habilitó cada muelle y además si está ocupado o no. Así que las estructuras parecen estar bien.