Cpp/Exámenes Resueltos (Primer .../Febrero 2018 (Grupos C, G e I)/ExFeb18CGIv2_Fernando.cpp

282 lines
6.5 KiB
C++

//Examen Febrero 2018 - Grupos C, G e I
//Fernando Méndez Torrubiano
//Versión 2
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
//Constantes:
const int MAX_NAV = 24;
//Tipos:
typedef struct tNavio {
string nombre;
string empresa;
float eslora;
float toneladas;
bool peaje;
};
typedef tNavio tNavios[MAX_NAV];
typedef struct tListaNavios {
tNavios navio;
int contador;
};
//Funciones:
void inicializa(tListaNavios&);
bool cargar(tListaNavios&);
void muestraNavios(tListaNavios&);
bool crearNavio(tListaNavios&);
bool insertarNavio(tListaNavios&, tNavio&);
bool cobrarNavio(tListaNavios&, const string&);
float peajeNavio(tListaNavios&, const int&);
float peajePagado(tListaNavios&);
void ejecutarMenu(tListaNavios&);
int menu();
bool guardar(tListaNavios&);
int main() {
tListaNavios navios;
if (cargar(navios)) {
ejecutarMenu(navios);
if (guardar(navios)) {
cout << "Guardado correctamente." << endl;
}
else {
cout << "Error al guardar el archivo." << endl;
}
}
else {
cout << "Fin del programa." << endl;
}
return 0;
}
void inicializa(tListaNavios& navios) {
navios.contador = 0;
for (int i = 0; i < MAX_NAV; i++){
navios.navio[i].nombre = "";
navios.navio[i].empresa = "";
navios.navio[i].eslora = 0;
navios.navio[i].toneladas = 0;
navios.navio[i].peaje = false;
}
}
bool cargar(tListaNavios& navios) {
bool cargado = false;
ifstream archivo;
string aux = "";
inicializa(navios);
archivo.open("navios.txt");
if(!archivo.is_open()){
cout << "No se ha podido cargar el archivo." << endl;
cargado = false;
}
else {
archivo >> navios.navio[navios.contador].nombre;
while ((navios.navio[navios.contador].nombre != "XXX") && (navios.contador < MAX_NAV)) {
archivo >> navios.navio[navios.contador].empresa;
archivo >> navios.navio[navios.contador].eslora;
archivo >> navios.navio[navios.contador].toneladas;
archivo >> aux;
if (aux == "true") {
navios.navio[navios.contador].peaje = true;
}
else {
navios.navio[navios.contador].peaje = false;
}
navios.contador++;
archivo >> navios.navio[navios.contador].nombre;
}
cargado = true;
}
archivo.close();
return cargado;
}
void muestraNavios(tListaNavios& navios) {
cout << setw(15) << right << "NOMBRE"
<< setw(20) << "EMPRESA"
<< setw(10) << "ESLORA"
<< setw(15) << "TONELADAS"
<< setw(25) << "PEAJE" << endl;
cout << setw(100) << setfill('=') << "\n" << setfill(char(0));
for (int i = 0; i < navios.contador; i++){
cout << setw(15) << right << navios.navio[i].nombre
<< setw(20) << navios.navio[i].empresa
<< setw(10) << fixed << setprecision(2) << navios.navio[i].eslora
<< setw(15) << setprecision(2) << navios.navio[i].toneladas;
cout << setw(10) << peajeNavio(navios, i) << "$" << setw(12);
if (navios.navio[i].peaje == true) {
cout << "PAGADO." << endl;
}
else {
cout << "NO PAGADO." << endl;
}
}
cout << setw(100) << setfill('=') << "\n" << setfill(char(0));
cout << "Total pagado: " << peajePagado(navios) << endl;
}
bool crearNavio(tListaNavios& navios) {
tNavio nuevoNavio;
cout << "Introduzca nombre del navio: ";
cin >> nuevoNavio.nombre;
cout << "Introduzca empressa fabricante: ";
cin >> nuevoNavio.empresa;
cout << "Introduzca eslora (en metros): ";
cin >> nuevoNavio.eslora;
cout << "Introduzca toneladas de carga: ";
cin >> nuevoNavio.toneladas;
nuevoNavio.peaje = false;
return insertarNavio(navios, nuevoNavio);
}
bool insertarNavio(tListaNavios& navios, tNavio& nuevoNavio) {
if (navios.contador < MAX_NAV){
navios.navio[navios.contador].nombre = nuevoNavio.nombre;
navios.navio[navios.contador].empresa = nuevoNavio.empresa;
navios.navio[navios.contador].eslora = nuevoNavio.eslora;
navios.navio[navios.contador].toneladas = nuevoNavio.toneladas;
navios.navio[navios.contador].peaje = nuevoNavio.peaje;
navios.contador++;
}
return (navios.contador < MAX_NAV) ? true : false;
}
bool cobrarNavio(tListaNavios& navios, const string& nombre) {
int i = 0;
bool encontrado = false;
while ((!encontrado) && (i <= navios.contador)) {
if (navios.navio[i].nombre == nombre) {
navios.navio[i].peaje = true;
encontrado = true;
}
else {
i++;
}
}
return (navios.navio[i].nombre == nombre) ? true : false;
}
float peajeNavio(tListaNavios& navios, const int& pos) {
float pago = 0;
if (navios.navio[pos].eslora <= 100) {
pago = navios.navio[pos].toneladas * 2;
}
else {
pago = navios.navio[pos].toneladas * 3;
}
return pago;
}
float peajePagado(tListaNavios& navios) {
float total = 0;
for (int i = 0; i < navios.contador; i++){
if (navios.navio[i].peaje == true) {
total += peajeNavio(navios, i);
}
}
return total;
}
void ejecutarMenu(tListaNavios& navios) {
int opc = 1;
string nombre;
while (opc != 0){
opc = menu();
switch (opc){
case 0: break;
case 1: muestraNavios(navios); break;
case 2:
if (crearNavio(navios)) {
cout << "Insertado correctamente." << endl;
}
else {
cout << "Error al insertar." << endl;
}
break;
case 3:
cout << "Introduzca el nombre del navio a cobrar: ";
cin >> nombre;
if (cobrarNavio(navios, nombre)) {
cout << "Cobrado." << endl;
}
else {
cout << "Navio no encontrado." << endl;
}
break;
default:
break;
}
system("PAUSE");
system("cls");
}
}
int menu() {
int opc = 0;
cout << setw(20) << setfill('=') << "MENU" << setw(20) << "\n" << setfill(char(0));
cout << "1.-Mostrar navios." << endl;
cout << "2.-Insertar nuevo navio." << endl;
cout << "3.-Realizar pago." << endl;
cout << setw(40) << setfill('=') << "\n" << setfill(char(0));
do {
cout << "Introduzca una opcion: ";
cin >> opc;
} while (opc < 0 || opc > 4);
return opc;
}
bool guardar(tListaNavios& navios) {
bool guardado = false;
ofstream archivo;
archivo.open("navios.txt");
if(!archivo.is_open()){
cout << "Error al guardar." << endl;
guardado = false;
}
else {
for (int i = 0; i < navios.contador; i++){
archivo << navios.navio[i].nombre << " "
<< navios.navio[i].empresa << " "
<< navios.navio[i].eslora << " "
<< navios.navio[i].toneladas << " ";
if (navios.navio[i].peaje == true) {
archivo << "true" << endl;
}
else {
archivo << "false" << endl;
}
}
archivo << "XXX";
guardado = true;
}
archivo.close();
return guardado;
}