Cpp/Exámenes Resueltos (Primer Semestre)/Febrero 2015 (Grupos C, E y F)/ExFeb15CEF_Fernando.cpp

210 lines
5.4 KiB
C++
Raw Normal View History

//Ex<45>men Febrero 2015 - Grupos C, E y F.
//Fernando M<>ndez Torrubiano
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
//Constantes:
const int MAX_VIAJES = 10;
const int NUM_PREFERENCIAS = 3;
//Tipos:
typedef enum tCategoria{Mochilero, Turista, Lujo};
typedef struct tViaje {
string destino;
int duracion;
int plazas;
tCategoria categoria;
};
typedef tViaje tViajes[MAX_VIAJES];
typedef struct tListaViajes {
tViajes viaje;
int contador;
};
typedef string tPreferencias[NUM_PREFERENCIAS];
//Funciones:
void inicializa(tListaViajes&);
bool cargarCatalogo(tListaViajes&);
void tIntToCategoria(tListaViajes&, const int&);
void mostrarViajesEnCategoria(tListaViajes&, const int&);
void convertirCat(const int&, tCategoria&);
bool guardarCatalogo(tListaViajes&);
void leerPreferencias(tPreferencias&);
int buscarDestino(tListaViajes&, tPreferencias&, const int&);
bool hacerReserva(tListaViajes&, const int&, tPreferencias&);
int main() {
tListaViajes viajes;
tPreferencias preferencia;
int numCat;
if (cargarCatalogo(viajes)) {
cout << "Escriba una categoria (0 Mochilero, 1 Turista, 2 Lujo): ";
cin >> numCat;
mostrarViajesEnCategoria(viajes, numCat);
leerPreferencias(preferencia);
if (hacerReserva(viajes, numCat, preferencia)) {
cout << "Gracias por su reserva." << endl;
guardarCatalogo(viajes);
}
else {
cout << "Vuelva a intentarlo." << endl;
}
}
else {
cout << "FIN DEL PROGRAMA." << endl;
}
system("PAUSE");
return 0;
}
void inicializa(tListaViajes& viajes) {
viajes.contador = 0;
for (int i = 0; i < MAX_VIAJES; i++){
viajes.viaje[i].destino = "";
viajes.viaje[i].duracion = 0;
viajes.viaje[i].plazas = 0;
viajes.viaje[i].categoria = Mochilero;
}
}
bool cargarCatalogo(tListaViajes& viajes) {
bool carga = false;
ifstream archivo;
int aux = 0;
inicializa(viajes);
archivo.open("catalogoViajes.txt");
if (!archivo.is_open()) {
cout << "Error al cargar el archivo." << endl;
carga = false;
}
else {
archivo >> viajes.viaje[viajes.contador].destino;
while ((viajes.viaje[viajes.contador].destino != "XXX") && (viajes.contador < MAX_VIAJES)) {
archivo >> viajes.viaje[viajes.contador].duracion;
archivo >> viajes.viaje[viajes.contador].plazas;
archivo >> aux;
tIntToCategoria(viajes, aux);
viajes.contador++;
archivo >> viajes.viaje[viajes.contador].destino;
}
carga = true;
}
archivo.close();
return carga;
}
void tIntToCategoria(tListaViajes& viajes, const int& aux) {
switch (aux) {
case 0: viajes.viaje[viajes.contador].categoria = Mochilero; break;
case 1: viajes.viaje[viajes.contador].categoria = Turista; break;
case 2: viajes.viaje[viajes.contador].categoria = Lujo; break;
}
}
void mostrarViajesEnCategoria(tListaViajes& viajes, const int& numCategoria) {
tCategoria categoria;
convertirCat(numCategoria, categoria);
cout << setw(10) << right << "DESTINO"
<< setw(15) << "DURACION"
<< setw(15) << "PLAZAS" << endl;
cout << setw(25) << setfill('=') << categoria << setw(25) << "\n" << setfill(char(0));
for (int i = 0; i < viajes.contador; i++){
if (viajes.viaje[i].categoria == categoria) {
cout << setw(10) << right << viajes.viaje[i].destino
<< setw(15) << viajes.viaje[i].duracion
<< setw(15) << viajes.viaje[i].plazas << endl;
}
}
cout << setw(50) << setfill('=') << "\n" << setfill(char(0));
}
void convertirCat(const int& numCategoria, tCategoria& categoria) {
switch (numCategoria) {
case 0: categoria = Mochilero; break;
case 1: categoria = Turista; break;
case 2: categoria = Lujo; break;
}
}
bool guardarCatalogo(tListaViajes& viajes) {
bool guardado = false;
ofstream archivo;
archivo.open("catalogoViajes.txt");
if (!archivo.is_open()) {
cout << "Error al guardar el archivo." << endl;
guardado = false;
}
else {
for (int i = 0; i < viajes.contador; i++){
archivo << viajes.viaje[i].destino << " "
<< viajes.viaje[i].duracion << " "
<< viajes.viaje[i].plazas << " "
<< viajes.viaje[i].categoria << endl;
}
archivo << "XXX";
guardado = true;
}
archivo.close();
return guardado;
}
void leerPreferencias(tPreferencias& preferencia) {
for (int i = 0; i < NUM_PREFERENCIAS; i++) {
cout << "Escriba sus destinos preferentes (de mayor a menor): ";
cin >> preferencia[i];
}
}
int buscarDestino(tListaViajes& viajes, tPreferencias& preferencias, const int& numCategoria) {
int i = 0, pos = viajes.contador - 1;
tCategoria categoria;
bool encontrado = false;
convertirCat(numCategoria, categoria);
while ((i < NUM_PREFERENCIAS) && (!encontrado)) {
pos = viajes.contador - 1;
while ((pos > -1) && (!encontrado)) {
if ((viajes.viaje[pos].destino == preferencias[i]) && (viajes.viaje[pos].categoria == categoria) && (viajes.viaje[pos].plazas > 0)) {
encontrado = true;
}
else {
pos--;
}
}
i++;
}
return pos;
}
bool hacerReserva(tListaViajes& viajes, const int& numCategoria, tPreferencias& preferencias) {
bool reserva = false;
int posReserva = buscarDestino(viajes, preferencias, numCategoria);
if (posReserva != -1) {
cout << "Reservado viaje a " << viajes.viaje[posReserva].destino << endl;
viajes.viaje[posReserva].plazas--;
reserva = true;
}
else {
cout << "No hay disponibilidad para esas preferencias." << endl;
reserva = false;
}
return reserva;
}