APELLIDOS NOMBRE Nº Mat. UNIVERSIDAD POLITÉCNICA DE MADRID ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL Departamento El.A.I. ASIGNATURA INFORMÁTICA INDUSTRIAL Calificación CURSO 2º GRUPO Junio 2011 Convocatoria del trabajo de Informática Industrial presentado... 1. Test teórico: Acertada +1, error -0.33 (2 puntos-20 minutos) 2. Pregunta Teórica (1 punto 15 minutos) Clases abstractas e Interfaces. Explica para qué se utiliza cada una de ellas y sus características en cuanto a implementación, mencionando diferencias y similitudes. Pon un ejemplo de cada caso y dibuja los diagramas UML correspondientes. 3. Indicar la salida por pantalla (2 puntos 15 minutos) #include <iostream.h> class figura protected: double x, y; void set_dim(double i, double j) x = i;y = j; virtual void mostrar_area() cout << "No hay calculo de area definido "; cout << " para esta clase.\n"; figura ()cout << "Figura Creada"<<endl; ~figura()cout <<"Figura Destruida\n"; ; class triangulo : public figura void mostrar_area() cout << "Triángulo con alto "<< x << " y base " << y; cout << " tiene un área de "<< x * 0.5 * y << ".\n"; triangulo ()cout << "Triángulo Creado"<<endl; ~triangulo()cout <<"Triángulo Destruido\n"; ; class rectangulo : public figura void mostrar_area() cout << "Rectángulo con dimensiones " << x << " x " << y; cout << " tiene un área de " << x * y << ".\n"; ; rectangulo ()cout << "Rectángulo Creado"<<endl; ~rectangulo()cout <<"Rectángulo Destruido\n"; ; void main(void) figura *p; p=new triangulo; p->set_dim(10.0, 5.0); p->mostrar_area(); delete p; rectangulo r; p = &r;
p->set_dim(10.0, 5.0); p->mostrar_area(); Impresión por pantalla Figura Creada Triángulo Creado Triángulo con alto 10 y base 5 tiene un área de 25. Figura Destruida Figura Creada Rectángulo Creado Rectángulo con dimensiones 10 x 5 tiene un área de 50. Rectángulo Destruido Figura Destruida
APELLIDOS NOMBRE Nº Mat. UNIVERSIDAD POLITÉCNICA DE MADRID ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL Departamento El.A.I. ASIGNATURA INFORMÁTICA INDUSTRIAL Calificación CURSO 2º GRUPO Junio 2011 4. Ejercicio de programación (2,5 puntos 50 minutos) Se desea realizar una pequeña base de datos que clasifique la música del hogar. Para ello se define la clase base genérica Cancion, la cual contiene el título, el artista, y el estilo de la canción. Los dos primeros atributos pueden ser de longitud totalmente libre. Los metodos de interfaz pueden ser los que se requieran, pero al menos la clase contiene: Se pide: enum Estilo CLASICA, POP, ROCK, COUNTRY, FLAMENCO, JAZZ, REGGAE, SALSA, GRUNGE; class Cancion char *titulo; char *autor; Estilo estilo; Cancion(char * tit, char *aut, Estilo est); virtual void imprime(); void imprimeestilo(); virtual ~Cancion(); //métodos que se decidan como convenientes. ; 1. Escribir el código de la definición del metodo imprimeestilo, el cual según el estilo de la canción imprimirá por pantalla el texto correspondiente 2. Escribir el código necesario que complete la clase Canción. Esta clase solo puede tener un contructor, sin parámetros por defecto, que es el indicado en la declaración. Para almacenar las distitas canciones se diseña la clase MyTunes, la cual es un contenedor de canciones, que admite hasta un máximo de 10000 referencias. Se incluye parcialmente el código de su declaración como orientacion: #define MAX_CANCIONES 10000 class MyTunes Cancion *lista[max_canciones]; int num; MyTunes(); ~MyTunes(); //métodos adicionales. ; 3. Escribir el código del constructor, del destructor, y una sobrecarga del operador += que permita agregar la dirección de una canción a MyTunes. 4. Escribir un método de MyTunes que permita imprimir sólo las canciones de un estilo dado como parámetro de dicho método. 5. Escribir la clase CancionCD la cual hereda de Canción, pero agrega un identificador numérico de CD, y el número de canción. Cuando se imprima la información de dicho objeto se incluirán estos datos además de los propios de la clase Canción. 6. Escribir la clase CancionWEB que análogamente a la anterior, incluye además de la información relativa a Canción, un texto que codifica la URL del sitio que contiene la canción referenciada. 7. Escribir una función main que agregue una serie de canciones tanto de CDs como de internet a una base de datos, e imprimir después la lista de canciones de algunos de los estilos incluidos. P.D.: No es necesario en ningun apartado hacer un código de interactuación con el usuario (de hecho se considerará como muy negativo la utilización de cin, o de scanf, o de cualquier función de petición de datos) La puntuación del ejercicio irá no sólo en funcion del resultado, sino de la correcta programación usando las herramientas propias de la POO.
//Solucion del ejercicio de programación de Junio de 2011 enum Estilo CLASICA, POP, ROCK, COUNTRY, FLAMENCO, JAZZ, REGGAE, SALSA, GRUNGE; class Cancion char *titulo; char *autor; Estilo estilo; Cancion(char * tit, char *aut, Estilo est); virtual void imprime(); void imprimeestilo(); virtual ~Cancion(); //métodos que se decidan como convenientes. Estilo getestilo()return estilo; ; //apartado 1 #include <iostream> using namespace std; void Cancion::imprimeEstilo() switch(estilo) case CLASICA: cout<<"clásica"; break; case POP: cout<<"pop"; break; case ROCK: cout<<"rock & Roll"; break; case COUNTRY: cout<<"country"; break; case FLAMENCO: cout<<"flamenco"; break; case JAZZ: cout<<"jazz"; break; case REGGAE: cout<<"reggae"; break; case SALSA: cout<<"salsa"; break; case GRUNGE: cout<<"grunge"; break; default: cout<<"estilo Libre"; //apartado 2 Cancion::Cancion(char *tit, char *aut, Estilo est) titulo=new char[strlen(tit)+1]; strcpy(titulo,tit); autor=new char[strlen(aut)+1]; strcpy(autor, aut); estilo=est; void Cancion::imprime() cout<<"titulo: "<<titulo<<endl; cout<<"autor: "<<autor<<endl; cout<<"estilo:"; imprimeestilo(); cout<<endl; Cancion::~Cancion() delete [] titulo; delete [] autor;
APELLIDOS NOMBRE Nº Mat. UNIVERSIDAD POLITÉCNICA DE MADRID ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL Departamento El.A.I. ASIGNATURA INFORMÁTICA INDUSTRIAL Calificación CURSO 2º GRUPO Junio 2011 #define MAX_CANCIONES 10000 class MyTunes Cancion *lista[max_canciones]; int num; MyTunes(); ~MyTunes(); //métodos adicionales. //apartado 3 bool operator+=(cancion *c); //apartado4 void imprimeestilo(estilo estilo); ; //definiciones apartado 3 MyTunes::MyTunes():num(0) MyTunes::~MyTunes() //por diseño se podria establecer que no es responsable de la //destruccion en este caso, puesto que no hace la reserva for(int i=0;i<num;i++)delete lista[i]; bool MyTunes::operator +=(Cancion *c) if(num>= MAX_CANCIONES)return false; if(c==0)return false; lista[num++]=c; return true; //definiciones apartado 4 void MyTunes::imprimeEstilo(Estilo estilo) for(int i=0;i<num;i++) if(lista[i]->getestilo()==estilo) lista[i]->imprime(); //apartado 5 class CancionCD: public Cancion int numcd; int numcancion; CancionCD(char *tit, char *aut, Estilo est, int num_cd, int pista):cancion(tit,aut,est) numcd=num_cd; numcancion=pista; void imprime() Cancion::imprime(); cout<<"cd: "<<numcd<<" Pista:"<<numCancion<<endl; ; //apartado 6 class CancionWEB: public Cancion char *url; CancionWEB(char *tit, char *aut, Estilo est, char *dir):cancion(tit,aut,est) url=new char[strlen(dir)+1]; strcpy(url,dir);
~CancionWEB() delete [] url; void imprime() Cancion::imprime(); cout<<endl<<"url: "<<url<<endl; ; //apartado 7 void main() MyTunes tunes; tunes+=new CancionCD("Jueves","LOV",POP,12,1); tunes+=new CancionWEB("True Colors","Phyl Collins",POP,"www.music.net/id?=1234"); tunes.imprimeestilo(pop);
APELLIDOS NOMBRE Nº Mat. UNIVERSIDAD POLITÉCNICA DE MADRID ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL Departamento El.A.I. ASIGNATURA INFORMÁTICA INDUSTRIAL Calificación CURSO 2º GRUPO Junio 2011 5. Problema de Análisis y Diseño Orientado a Objetos (2.5 puntos 50 minutos) Se desee desarrollar una aplicación para calcular los precios de alquiler de una empresa de alquiler de vehículos. Cada vehículo se identifica por medio de su matrícula. La empresa dispone de una flota de vehículos para alquilar. Existen distintos tipos de vehículos, unos son para transportes de personas y otros para mercancías. En la actualidad los vehículos alquilados por la empresa son: coches, microbuses, furgonetas de carga y camiones. El precio de alquiler de cualquier vehículo tiene una componente base que depende de los días de alquiler a razón de 50 /día. En el caso de alquiler de un coche, al precio base se le suma la cantidad de 1.5 por plaza y día. El precio de alquiler de los microbuses es igual que el de los coches, salvo que se le añade una cantidad de 2 /plaza independientemente de los días de alquiler. El precio de los vehículos de carga es el precio base más 20 * PesoMáximoAutorizado en toneladas. Además, en el caso de los camiones, al precio se suma un fijo de 40 independientemente de los días de alquiler. Se pide: a Redacta el escenario principal de éxito para el caso de uso Obtener precio de alquiler, que calcula en el momento de devolución de un vehículo el precio según el número de días que ha estado alquilado. b Diagrama de Clases de Diseño de la solución. Indica los patrones utilizados. c Implementación de la solución en C++. d Un Diagrama de Secuencias del servicio MostrarPrecios(numDias: int) el cual, a partir de un número de días indicados, muestra el precio que supondría alquilar cada uno de los vehículos de la aplicación.
Ejercicio 5 Solución a) Caso de uso CalcularPrecioAlquilerVehículo. Escenario principal de éxito: 1. El Vendedor inicia la operación para calcular el precio de alquiler. 2. El Vendedor introduce la matrícula del vehículo. 3. El Vendedor introduce el número de días que ha estado alquilado el vehículo. 4. El Sistema muestra el precio de alquier de dicho vehículo. b) c) Vehiculo.h class Vehiculo Vehiculo(string m) matricula = m; ; virtual float calcularprecioalquiler(int dias) = 0; string getmatricula() return matricula; ; private: string matricula; ;
APELLIDOS NOMBRE Nº Mat. UNIVERSIDAD POLITÉCNICA DE MADRID ESCUELA UNIVERSITARIA DE INGENIERÍA TÉCNICA INDUSTRIAL Departamento El.A.I. ASIGNATURA INFORMÁTICA INDUSTRIAL Calificación CURSO 2º GRUPO Junio 2011 VehiculoCarga.h class VehiculoCarga: public Vehiculo VehiculoCarga(string m, float peso) : Vehiculo(m) PMA = peso; precioportonelada = 20.0; float calcularprecioalquiler(int dias); protected: float PMA; float precioportonelada; ; VehiculoCarga.cpp float VehiculoCarga::calcularPrecioAlquiler(int dias) return 60.0*dias + precioportonelada*pma*dias; Camion.h class Camion: public VehiculoCarga Camion(string m, float peso) : VehiculoCarga(m, peso) preciofijo = 40.0; float calcularprecioalquiler(int dias); private: float preciofijo; ; Camion.cpp float Camion::calcularPrecioAlquiler(int dias) return VehiculoCarga::calcularPrecioAlquiler(dias) + preciofijo; Furgoneta.h class Furgoneta: public VehiculoCarga Furgoneta(string m, float peso) : VehiculoCarga(m, peso) ; VehiculoPasajeros.h class VehiculoPasajeros: public Vehiculo VehiculoPasajeros(string m, int p) : Vehiculo(m) plazas = p; virtual float calcularprecioalquiler(int dias) = 0; int getplazas(); protected: int plazas; ; VehiculoPasajeros.cpp float VehiculoPasajeros::calcularPrecioAlquiler(int dias) return 50.0 * dias; int VehiculoPasajeros::getPlazas() return plazas; Microbus.h class Microbus: public VehiculoPasajeros Microbus(string m, int p) : VehiculoPasajeros(m, p) precioporplaza = 2.5;
float calcularprecioalquiler(int dias); private: float precioporplaza; ; Microbus.cpp float Microbus::calcularPrecioAlquiler(int dias) return VehiculoPasajeros::calcularPrecioAlquiler(dias) + plazas*2.0; Coche.h class Coche: public VehiculoPasajeros Coche(string m, int p) : VehiculoPasajeros(m, p) float calcularprecioalquiler(int dias); ; Coche.cpp float Coche::calcularPrecioAlquiler(int dias) return VehiculoPasajeros::calcularPrecioAlquiler(dias) + 1.5*dias*plazas; d)