====== Examen Parcial - 75.41. Algoritmos y Programación II ====== **Cátedra:** Mandrafina\\ **Fecha:** Primera Oportunidad - Primer Cuatrimestre 2005\\ **Día:** 20/05/2005 Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== ==== Punto I ==== Dado el siguiente programa se requiere indicar lo que se mostraría por pantalla: #include #include using namespace std; typedef int* Pint; typedef char* Pchar; /*Datos: '@' es 64 'A' es 65 ... */ int main(){ Pint A,C,F; Pint* B; Pchar D,E; char G; int H; H = 68; G = 'B'; A = new int; *A = 65; B = &C; F = A; C = &H; cout << **B << *A << endl; D = (char*)*B; E = (char*)A; cout << *D << *C << *E << endl; *D = G; if (*C == 68) cout << *E << *C << endl; *A = 67; while (*A > 0){ cout << *A << *E << endl; *F = *F - H; *A = *A - 1; } delete A; } ==== Punto II ==== Construir los TDAs que modelen un **Contenedor** a partir de la siguiente descripción: * Un Contenedor tiene forma cilíndrica, se identifica con un número, y se utiliza para almacenar sustancias líquidas. * Cada Contenedor cuenta con un conjunto de Sensores Térmicos. * Un **Sensor** se identifica por un número, registra una temperatura, y puede estar encendido o apagado. Se pueden agregar o sacar Sensores de un Contenedor. * La temperatura de un Contenedor se calcula como el promedio de los valores de temperatura de sus Sensores encendidos, y la capacidad medida en m^3 está dada por sus dimensiones físicas. ==== Punto III ==== La empresa de Seguridad Industrial Algoritmia S.A., que se dedica a controlar el estado de Contenedores para sustancias líquidas, requiere un informe con la cantidad de Contenedores que superan una temperatura crítica T dada, para cada empresa en donde se encuentran emplazados. El informe debe tener el siguiente formato: ^ Nombre de la Empresa ^ Dirección ^ Teléfono ^ Contacto Técnico ^ Cantidad de contenedores que superan T ^ El listado debe estar ordenado primero por cantidad decreciente y segundo por nombre de empresa creciente. Se dispone de 3 archivos totalmente desordenados, con la siguiente estructura, donde los campos que aparecen en negrita tienen valores únicos: ^ Empresa ^ Contenedor ^ Sensor ^ |**Código de Empresa** (int) |**Código de Contenedor** (int)|**Código de Contenedor** (int)| |Nombre (char[10])|Alto (int)|**Código de Sensor** (int)| |Razón Social (char[50])|Radio (int)|Activado (bool)| |Dirección (char[50])|Sustancia (char[5])|Temperatura (float)| |Teléfono (char[10])|Código de Empresa (int)| | |Contacto técnico (char[100])| | | Nota: - Explicar la estrategia de solución adoptada con claridad (usar esquemas) - Los archivos se procesarán secuencialmente, una sola vez, luego en forma directa - Completar todo lo necesario para la resolución del problema, tipos, variables, procedimientos, etc. ===== Resolución ===== ==== Punto I ==== 6865 D68A 67C ==== Punto II ==== Implementación del **TDA Contenedor**. Observar que está pensado para ser usado como objeto, utilizando punteros a Contenedor. #include "contenedor.h" #include #include "sensor.h" #ifndef PI #define PI 3.14159 #endif /* ListaSensores es una lista cuyo dato tiene la siguiente definición struct Dato{ Sensor* sensor; } El ordenamiento de esa lista se hace por código de sensor */ struct Contenedor { int codigo; float radio; float alto; std::string sustancia; ListaSensores sensores; }; /* Pre: Ninguna Post: Crea un nuevo contenedor, identificado con el código pasado, dejándolo listo para su uso */ void crear(Contenedor* &miContenedor, int codigo, float radio, float alto) { miContenedor = new Contenedor; miContenedor->codigo = codigo; miContenedor->radio = radio; miContenedor->alto = alto; miContenedor->sustancia = "Vacio"; crearLista(miContenedor->sensores); } /* Pre: El contenedor debe haber sido creado Post: El contenedor queda destruido e inutilizado para su uso */ void destruir(Contenedor* &miContenedor) { Dato datoSensor; ptrNodoLista ptrSensor; ptrSensor = primero(miContenedor->sensores); while (ptrSensor != fin(miContenedor->sensores)) { obtenerDato(miContenedor->sensores,datoSensor,ptrSensor); destruir(datoSensor.sensor); ptrSensor = siguiente(miContenedor->sensores,ptrSensor); } eliminarLista(miContenedor->sensores); delete miContenedor; miContenedor = NULL; } /* Pre: El contenedor debe haber sido creado Post: Se le asigna la sustancia pasada al contenedor */ void setSustancia(Contenedor* &miContenedor, string sustancia) { miContenedor->sustancia = sustancia; } /* Pre: El contenedor debe haber sido creado, al igual que el sensor a agregar Post: Agrega el sensor a los pertenecientes al Contenedor */ void agregarSensor(Contenedor* &miContenedor, Sensor* &miSensor) { Dato datoSensor; datoSensor.sensor = miSensor; insertarDato(miContenedor->sensores,datoSensor); } /* Pre: El contenedor debe haber sido creado, al igual que el sensor a quitar Post: Si el sensor existía en el contenedor, es quitado y retorna True. En caso contrario retorna false */ bool quitarSensor(Contenedor* &miContenedor, Sensor* &miSensor) { Dato datoSensor; ptrNodoLista ptrSensor; bool encontrado = false; ptrSensor = primero(miContenedor->sensores); while ((ptrSensor != fin(miContenedor->sensores)) && (!encontrado)) { obtenerDato(miContenedor->sensores,datoSensor,ptrSensor); if (sonIguales(datoSensor.sensor,miSensor)) { encontrado = true; destruir(datoSensor.sensor); eliminarNodo(miContenedor->sensores,ptrSensor); } ptrSensor = siguiente(miContenedor->sensores,ptrSensor); } return encontrado; } /* Pre: El contenedor debe haber sido creado Post: Retorna el código del Contenedor */ int getCodigo(Contenedor* &miContenedor) { return miContenedor->codigo; } /* Pre: El contenedor debe haber sido creado Post: Retorna el radio del Contenedor */ float getRadio(Contenedor* &miContenedor) { return miContedor->radio; } /* Pre: El contenedor debe haber sido creado Post: Retorna el alto del Contenedor */ float getAlto(Contenedor* &miContenedor) { return miContenedor->alto; } /* Pre: El contenedor debe haber sido creado Post: Retorna el volumen del Contenedor */ float getVolumen(Contenedor* &miContenedor) { float base; base = getRadio(miContenedor); base *= base*PI; return base*getAlto(miContenedor); } /* Pre: El contenedor debe haber sido creado Post: Retorna el nombre de la sustancia guardada en el contenedor */ string getSustancia(Contenedor* &miContenedor) { return miContenedor->sustancia; } /* Pre: El contenedor debe haber sido creado Post: Retorna la temperatura promedio del Contenedor */ float getTemperaturaPromedio(Contenedor* &miContenedor) { Dato datoSensor; ptrNodoLista ptrSensor; int cantidadSensores = 0; float temperaturaTotal = 0; ptrSensor = primero(miContenedor->sensores); while (ptrSensor != fin(miContenedor->sensores)) { obtenerDato(miContenedor->sensores,datoSensor,ptrSensor); if (getEstado(datoSensor.sensor)) { cantidadSensores++; temperaturaTotal += getTemperatura(datoSensor.sensor); } ptrSensor = siguiente(miContenedor->sensores,ptrSensor); } if (cantidadSensores != 0) { return (temperaturaTotal/cantidadSensores); } else { return ERROR: } } Implementación del **TDA Sensor**. Observar que está pensado para ser usado como objeto, utilizando punteros a Sensor. const float ERROR = -999999; struct Sensor { int codigo; bool activado; float temperatura; }; /* Pre: Ninguna Post: Crea un nuevo sensor, identificado con el código pasado, dejándolo listo para su uso. Por defecto el sensor está desactivado y la temperatura marcada es ERROR */ void crear(Sensor* &miSensor, int codigo) { miSensor = new Sensor; miSensor->codigo = codigo; miSensor->activado = false; miSensor->temperatura = ERROR; } /* Pre: El sensor debe haber sido creado Post: Destruye el sensor, dejándolo intulizable */ void destruir(Sensor* &miSensor){ delete miSensor; miSensor = NULL; } /* Pre: El sensor debe haber sido creado Post: Activa el sensor */ void activar(Sensor* &miSensor){ miSensor->activado = true; } /* Pre: El sensor debe haber sido creado Post: Desactiva el sensor */ void desactivar(Sensor* &miSensor){ miSensor->activado = false; } /* Pre: El sensor debe haber sido creado Post: Cambia la temperatura marcada por el sensor */ void setTemperatura(Sensor* &miSensor, float temperatura){ miSensor->temperatura = temperatura; } /* Pre: El sensor debe haber sido creado Post: Retorna el código del sensor */ int getCodigo(Sensor* &miSensor){ return miSensor->codigo; } /* Pre: El sensor debe haber sido creado Post: Retorna el estado del sensor: True: Activado False: Desactivado */ bool getEstado(Sensor* &miSensor){ return miSensor->estado; } /* Pre: El sensor debe haber sido creado Post: Retorna la temperatura medida actualmente por el sensor */ float getTemperatura(Sensor* &miSensor){ return miSensor->temperatura; } /* Pre: Los dos sensores deben haber sido creados Post: Retorna true si los sensores son iguales, false en caso contrario */ bool sonIguales(Sensor* &a, Sensor* &b){ return (getCodigo(a) == getCodigo(b); } ===== Discusión ===== Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá