Escuela Superior de Ingenieros - Tecnun - Paul Bustamante 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 #include <iostream.h> #include <string.h> #include <stdio.h> //para gets() // **** Clase Agencia **** class Agencia { private: char *nombre; //el constr. pide el nombre long duracion; //debe pedirlo la clase derivada protected: static double precio; //precio del hotel public: Agencia(){ //constructor char tmp[80]; cout << "Dar el nombre:"<<flush; gets(tmp); nombre = new char[strlen(tmp)+1]; strcpy(nombre,tmp); } virtual ~Agencia(){ delete [] nombre; } //destructor virtual void SetDuracion(long d){ duracion = d; } long GetDuracion() { return duracion; } virtual void Display(){ cout << "Nombre: " << nombre << " Dias:" << duracion; } double Costo(){ return 0;} }; // **** Clase Turismo **** class Turismo:public Agencia { protected: int tipo; static int plazas; public: Turismo(){ //constructor long dur; cout << "Dar Duracion del viaje (dias):"; cin >> dur; cout << "Alojamiento: 1-SA 2-AD 3-MP 4-PC ?"; cin >> tipo; SetDuracion(dur); //Actualizar variable duracion plazas--; } ~Turismo() { plazas++; } //libera plazas void Display(){ cout << "Reserva Turismo:\n\t" ; Agencia::Display(); cout << " Alojam.:"; switch(tipo){ case 1: cout << "SA"; break; case 2: cout << "AD"; break; case 3: cout << "MP"; break; case 4: cout << "PC"; break; } cout << " Costo: " << Costo() << endl; } double Costo(){ double costo=0; switch(tipo){ case 1: costo = precio; break; case 2: costo = precio*1.1; break; //10% case 3: costo = precio*1.2; break; case 4: costo = precio*1.4; break; } if (GetDuracion()>=7) costo *= 0.9; //10% de dcto return costo*GetDuracion(); } static int GetPlazas() { return plazas;} }; // **** Clase Libre **** Escuela Superior de Ingenieros - Tecnun - Paul Bustamante 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 class Libre: public Agencia { private: char *hotel; protected: static int plazas; public: Libre(){ //Constructor char tmp[80]; long dur; cout << "Dar Duracion del viaje (dias):"; cin >> dur; SetDuracion(dur); plazas--; cout << "Hotel:"<<flush; gets(tmp); hotel = new char[strlen(tmp)+1]; strcpy(hotel,tmp); } ~Libre(){ delete [] hotel; plazas++; } //destructor void Display(){ cout << "Reserva Libre:\n\t" ; Agencia::Display(); cout << " Hotel: " << hotel; cout << " Costo: " << Costo() << endl; } double Costo(){ double costo; long dias=GetDuracion(); if (dias >= 5) costo = precio*dias*0.9; //10% dcto. else costo = precio*dias; return costo; } static int GetPlazas() { return plazas;} }; // **** Inicializacion de variables estaticas **** int Turismo::plazas = 5; int Libre::plazas = 5; double Agencia::precio = 50; //50 euros la noche #define NUM 20 // **** Main() **** void main() { int opc,num=0,i=0; Agencia *lista[NUM]; while(true){ cout << "\n*** Menu ***\n"; cout << "1. Ver Plazas Libres\n"; cout << "2. Ver Reservas\n"; cout << "3. Reserva de Turismo\n"; cout << "4. Reserva Libre\n"; cout << "5. Salir\n"; cout << "\tOpcion:"; cin >> opc; switch(opc){ case 1: cout << "*** Plazas Libres:\n"; cout << "\tTurismo:" << Turismo::GetPlazas() << endl; cout << "\tLibre:" << Libre::GetPlazas() << endl; break; case 2: //reservas if (num<1) cout << ">>No hay reservas todavia\n"; for (i=0;i<num;i++) lista[i]->Display(); break; case 3: if (Turismo::GetPlazas() > 0) { lista[num] = new Turismo; num++; } else cout << "No hay más plazas libres\n" ; break; case 4: if (Libre::GetPlazas() > 0) { lista[num] = new Libre; num++; } Escuela Superior de Ingenieros - Tecnun - Paul Bustamante 141 142 143 144 145 146 147 } else cout << "No hay más plazas libres\n" ; break; case 5: for (i=0;i<num;i++) delete lista[i]; //liberar memoria return; } }