3 Indicar y explicar el resultado de la ejecución del siguiente código: (10 minutos) ÆLQFOXGHÃLRVWUHDPK!Ã ÆLQFOXGHÃPDWKK!Ã FODVVÃYHFWRUÃ ^Ã SXEOLFÃ YHFWRULQWÃQ GRXEOHÃY 18//Ã double operator[](double ind); ayhfwru^ghohwhã>@ãydoruhv`ã SULYDWHÃ LQWÃQXPÃ GRXEOHÃYDORUHVÃ `Ã YHFWRUYHFWRULQWÃQGRXEOHÃYÃ ^Ã YDORUHVÃ ÃQHZÃGRXEOH>Q@Ã QXP QÃ IRULQWÃL LQLYDORUHV>L@ Y>L@Ã `Ã double vector::operator [](double ind) ^Ã GRXEOHÃWHPSÃ LQWÃVXSLQIÃ Ã LQI LQWIORRULQGÃHQWHURÃUHGRQGHDGRÃDEDMRÃ VXS LQWFHLOLQGÃHQWHURÃUHGRQGHDGRÃDUULEDÃ LILQI!QXPLQI QXPÃ LIVXS!QXPVXS QXPÃ LILQILQI Ã LIVXSVXS Ã LILQIVXSÃ WHPS VXSLQGYDORUHV>LQI@LQGLQIYDORUHV>VXS@Ã HOVHÃWHPS YDORUHV>LQI@Ã UHWXUQÃWHPSÃ `Ã YRLGÃPDLQYRLGÃ ^Ã GRXEOHÃYDO>@ ^`Ã YHFWRUÃPLYHFWRUYDOÃ IRULQWÃL LLÃ cout<<mivector[i*0.2]<<endl; `Ã
4. Ejercicio de programación (45 minutos) El código adjuntado corresponde a la funcion main y a la clase colorrgb que se utilizan en una sencilla base de datos de figuras geométricas. Todas las figuras geométricas heredan de la clase abstracta REMHWR*HRPHWULFR la cual a demás de la interfaz común incluye la información de la posición de su centro de gravedad y el color de la figura. Esta interfaz tiene los siguientes métodos: void pedir() void imprimir() double area() void setcolor(colorrgb) colorrgb getcolor() Se pide: 1.-Representar gráficamente el diagrama de clases. 2.-Escribir el codigo de la clase objetogeometrico. 3.-Escribir el codigo de las clases circulo, cuadrado y triangulo. Nota: Se valorará especialmente respetar el correcto encapsulamiento, evitar repetir código, y la construcción correcta de los objetos. #include <iostream.h> class colorrgb float r,g,b; colorrgb(float mr,float mg, float mb )setcolor(mr,mg,mb); void setcolor(float mr, float mg, float mb) if(mr>1.0f)mr=1.0f; if(mg>1.0f)mg=1.0f; if(mb>1.0f)mb=1.0f; if(mr<0.0f)mr=0.0f; if(mg<0.0f)mg=0.0f; if(mb<0.0f)mb=0.0f; r=mr;g=mg;b=mb; void getcolor(float &mr,float &mg,float&mb)mr=r;mg=g;mb=b; ; void main() objetogeometrico *lista[100]; int num=0,sel=0; while((sel!=4)&&(num<100)) cout<< \n1.-circulo\n2.-cuadrado ; cout<< \n3.-triangulo\n4.-salir"<<endl ; cin>>sel; switch(sel) case 1: lista[num]=new circulo; break; case 2: lista[num]=new cuadrado; break; case 3: lista[num]=new triangulo; break; case 4: cout<<"se imprimira ahora la informacion"<<endl; break; default: cout<<"seleccion Erronea"<<endl; if((sel>0)&&(sel<4)) lista[num]->pedir(); num++; double area=0; for(int i=0;i<num;i++) lista[i]->imprimir(); area+=lista[i]->area(); cout<<"area Total:"<<area;
5. Ejercicio del Proceso Unificado (50 minutos) Para la aplicación informática de una sala de cine, se desea que un taquillero introduzca el número de localidades que desea un comprador y se le aplica el mejor descuento para el espectador. En esta primera versión se considera que las monedas pueden ser EUROS, DOLARES y LIBRAS. Por defecto, se considerará que el dinero se expresa en EUROS y el precio de butaca es de 5¼ÃLas políticas de ventas a introducir, en esta primera iteración, son: a- Si el día de la semana es miércoles se le aplicará un descuento del 50%. b- En cualquier día de la semana, la compra de tres entradas será al precio de dos. Esta política se aplica para número de localidades que sea múltiplo de tres. El arquitecto del programa ha realizado un primer borrador del diagrama de clase de diseño. Obviamente no está toda la información para la codificación. : Vista VentaLocalidades(Dinero, float) : VentaLocalidades getprecio(int) metodofabricacionprecios(fecha&, float) : IPrecioLocalidades getpreciototal(int, Dinero) Vista VentaLocalidades VentaLocalidades() getprecio() <<interface>> IPrecioLocalidades <<abstract>> getpreciototal() <<static>> metodofabricacionprecios() Fecha ismiercoles() DiaDelEspectador DiaDelEspectador() <<virtual>> getpreciototal() DosXTres DosXTres() <<virtual>> getpreciototal() Dinero cantidad : float eltipomoneda : TipoDinero operator=() setcantidad() getcantidad() settipo gettipo <<typedef>> TipoDinero
a) Implementar la clase Dinero (por defecto se considera que el tipo de moneda es el EURO). Dinero cantidad : float eltipomoneda : TipoDinero Dinero(valor : float, eltipo : TipoDinero) Dinero(elValor : Dinero&) operator=(elvalor : Dinero&) : Dinero& setcantidad(lacantidad : float) : void getcantidad( : void) : float settipodinero(eltipo : TipoDinero) : void gettipodinero( : void) : TipoDinero b) Para las estrategias de los precios se ha utilizado un interfaz, de manera que las políticas de ventas se puedan variar en el futuro. Realizar su implementación. <<interface>> IPrecioLocalidades <<abstract>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero <<static>> metodofabricacionprecios(hoy : Fecha&, descuento : float) : IPrecioLocalidades* DiaDelEspectador DiaDelEspectador(descuento : float) <<virtual>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero DosXTres DosXTres() <<virtual>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero c) Implementar la clase de Venta de Localidades VentaLocalidades eldiasemana : Fecha elpreciounitario : Dinero ppreciolocalidades : IPrecioLocalidades * VentaLocalidades(elPrecio : Dinero, descuento : float) getprecio(numerolocalidades : int) : Dinero
Resolución examen Ejercicio 3 Ejercicio 4 class objetogeometrico protected: double x,y; colorrgb color; objetogeometrico(double px=0, double py=0):x(px),y(py),color(0,0,0) virtual double area() =0; virtual void pedir() cout<<"introduce el CG: "; cin>>x>>y; virtual void imprimir() cout<<"cg: "<<x<<", "<<y<<endl; colorrgb getcolor()return color; void setcolor(colorrgb col)color=col; ; class circulo:public objetogeometrico double radio; circulo(double rad=0,double px=0,double py=0) :objetogeometrico(px,py),radio(rad) void pedir() void imprimir()cout<<"circulo"<<endl; double area()return 34.0;; ; class cuadrado:public objetogeometrico double radio; cuadrado(double rad=0,double px=0,double py=0) :objetogeometrico(px,py),radio(rad) void pedir() void imprimir()cout<<"cuadrado"<<endl; double area()return 34.0;; ; class triangulo:public objetogeometrico double radio; triangulo(double rad=0,double px=0,double py=0) :objetogeometrico(px,py),radio(rad) void pedir() void imprimir()cout<<"triangulo"<<endl; double area()return 34.0;; ; LQG LQI VXS 62/8&,Ï1 0 0 1 1 0,2 0 1 2 0,4 0 1 3 0,6 0 1 4 0,8 0 1 5 1 1 1 6 1,2 1 1 6 1,4 1 1 6 1,6 1 1 6 1,8 1 1 6 2 1 1 6
Ejercicio 5 a) Implementación de la clase dinero Dinero cantidad : float eltipomoneda : TipoDinero Dinero(valor : float, eltipo : TipoDinero) Dinero(elValor : Dinero&) operator=(elvalor : Dinero&) : Dinero& setcantidad(lacantidad : float) : void getcantidad( : void) : float settipodinero(eltipo : TipoDinero) : void gettipodinero( : void) : TipoDinero #ifndef _DINERO_INC_ #define _DINERO_INC_ typedef enum EURO, DOLAR, LIBRA TipoDinero; class Dinero TipoDinero eltipomoneda; float cantidad; : eltipomoneda(euro), cantidad(0) Dinero(float valor, TipoDinero eltipo): eltipomoneda(eltipo),cantidad(valor) Dinero(Dinero &elvalor) eltipomoneda = elvalor.eltipomoneda; cantidad = elvalor.cantidad; Dinero& operator= (Dinero &elvalor) eltipomoneda = elvalor.eltipomoneda; cantidad = elvalor.cantidad; return(*this); ; void setcantidad(float lacantidad)cantidad=lacantidad; float getcantidad(void)return cantidad; void settipodinero(tipodinero eltipo)eltipomoneda=eltipo; TipoDinero gettipodinero(void)return eltipomoneda; #endif b) Implementación de las diferentes políticas <<interface>> IPrecioLocalidades <<abstract>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero <<static>> metodofabricacionprecios(hoy : Fecha&, descuento : float) : IPrecioLocalidades* DiaDelEspectador DiaDelEspectador(descuento : float) <<virtual>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero DosXTres DosXTres() <<virtual>> getpreciototal(numerolocalidades : int, elpreciounitario : Dinero) : Dinero
#ifndef _OFERTAS_TAQUILLA_INC_ #define _OFERTAS_TAQUILLA_INC_ #include "Dinero.h" #include "Fecha.h" class IPrecioLocalidades virtual Dinero getpreciototal(int numerolocalidades, Dinero elpreciounitario) = 0; static IPrecioLocalidades *metodofabricacionprecios(fecha &, float); ; class DiaDelEspectador : public IPrecioLocalidades float eldescuento; friend class IPrecioLocalidades; DiaDelEspectador(float descuento): eldescuento(descuento) virtual Dinero getpreciototal(int numerolocalidades, Dinero elpreciounitario) Dinero elvalortotal; elvalortotal.setcantidad(elpreciounitario.getcantidad()*numerolocalidades*eldescuento); elvalortotal.settipodinero(elpreciounitario.gettipo); return (elvalortotal); ; class DosXTres : public IPrecioLocalidades friend class IPrecioLocalidades; DosXTres() virtual Dinero getpreciototal(int numerolocalidades, Dinero elpreciounitario) Dinero elvalortotal; int multiplosdetres = 0; for(int i=1;i<=numerolocalidades;i++) if( i%3 == 0) multiplosdetres++; int localidadessueltas = numerolocalidades - (multiplosdetres*3); elvalortotal.setcantidad(elpreciounitario.getcantidad()* (localidadessueltas+(multiplosdetres*2))); elvalortotal.settipodinero(elpreciounitario.gettipo); return (elvalortotal); ; #endif #include "includes/ventalocalidades.h" IPrecioLocalidades * IPrecioLocalidades::metodoFabricacionPrecios (Fecha &hoy, float descuento = 0) if ((hoy.ismiercoles() == true ) && (descuento > 100/3) ) return new DiaDelEspectador(descuento); else return new DosXTres; c) Implementación de la VentaTaquilla VentaLocalidades eldiasemana : Fecha elpreciounitario : Dinero ppreciolocalidades : IPrecioLocalidades * VentaLocalidades(elPrecio : Dinero, descuento : float) getprecio(numerolocalidades : int) : Dinero
#ifndef _VENTA_LOCALIDADES_INC_ #define _VENTA_LOCALIDADES_INC_ #include "Fecha.h" #include "Dinero.h" #include "OfertasTaquillas.h" class VentaLocalidades Fecha eldiasemana; Dinero elpreciounitario; float eldescuento; IPrecioLocalidades *ppreciolocalidades; VentaLocalidades(Dinero elprecio, float descuento) : elpreciounitario(elprecio),eldescuento(descuento) Dinero getprecio(int numerolocalidades) ppreciolocalidades = IPrecioLocalidades::metodoFabricacionPrecios(elDiaSemana,elDescuento); Dinero eldinero = ppreciolocalidades->getpreciototal(numerolocalidades,elpreciounitario) ; delete ppreciolocalidades; return(eldinero); ; #endifã