Cpp/Exámenes Resueltos (Primer Semestre)/Febrero 2018 (Grupos C, G e I)/ExFeb18_Fernando.cpp
Fernando Méndez 07651a8047
Exámenes Resueltos FP - Primer Semestre
Para uso exclusivo con fines de estudio. Se prohíbe su uso para entregas calificables y/o uso comercial.
2019-06-20 12:26:55 +02:00

262 lines
5.9 KiB
C++

//Examen Febreo 2018
//Fernando Méndez Torrubiano
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
//Constantes:
const int MAX_NAV = 24;
//Tipos:
typedef string tNombres[MAX_NAV];
typedef float tMedidas[MAX_NAV];
typedef struct tNavios {
tNombres nombre;
tNombres empresa;
tMedidas eslora;
tMedidas toneladas;
tNombres peaje;
int contador;
};
//Funciones:
void inicializa(tNavios&, tNavios&);
bool cargar(tNavios&);
void ejecutarMenu(tNavios&, tNavios&);
int menu();
void muestraNavios(tNavios&);
void crearNavio(tNavios&);
bool insertarNavio(tNavios&, tNavios&);
bool cobrarNavio(tNavios&);
float peajeNavio(tNavios&, const int pos);
float peajePagado(tNavios&);
void guardar(tNavios&);
int main() {
tNavios nave;
tNavios nuevo;
bool carga = false;
inicializa(nave, nuevo);
carga = cargar(nave);
if (carga) {
ejecutarMenu(nave, nuevo);
}
else {
system("PAUSE");
}
guardar(nave);
return 0;
}
void inicializa(tNavios& nave, tNavios& nuevo) {
for (int i = 0; i < MAX_NAV; i++) {
nave.nombre[i] = "";
nave.empresa[i] = "";
nave.eslora[i] = 0;
nave.toneladas [i]= 0;
nave.peaje[i] = "";
}
nave.contador = 0;
nuevo.contador = 0;
}
bool cargar(tNavios& nave) {
ifstream archivo;
bool carga = false;
archivo.open("navios.txt");
if (!archivo.is_open()) {
cout << "Error al cargar el archivo." << endl;
carga = false;
}
else {
archivo >> nave.nombre[nave.contador];
while ((nave.nombre[nave.contador] != "XXX") && (nave.contador < MAX_NAV)) {
archivo >> nave.empresa[nave.contador];
archivo >> nave.eslora[nave.contador];
archivo >> nave.toneladas[nave.contador];
archivo >> nave.peaje[nave.contador];
nave.contador++;
archivo >> nave.nombre[nave.contador];
}
carga = true;
}
archivo.close();
return carga;
}
void ejecutarMenu(tNavios& nave, tNavios& nuevo) {
int opc = 1;
bool insertado = false;
while (opc != 0) {
system("cls");
opc = menu();
switch (opc){
case 1: muestraNavios(nave); break;
case 2: crearNavio(nuevo);
insertado = insertarNavio(nave, nuevo);
if (!insertado) {
cout << "No se ha podido añadir un nuevo navio." << endl;
system("PAUSE");
}
else{
cout << "Navio insertado correctamente." << endl;
system("PAUSE");
}
break;
case 3: cobrarNavio(nave); break;
case 0: break;
default: break;
}
}
}
int menu() {
int opc = 0;
//cout << setfill('-') << setw(25) << "\n";
cout << "1.-VER LISTA DE NAVIOS." << "\n";
cout << "2.-AGREGAR NAVIO." << "\n";
cout << "3.-COBRAR PEAJE." << "\n";
cout << "0.-SALIR." << "\n";
//cout << setfill('-') << setw(25) << "\n";
do{
cout << "\n Intruduzca una opcion: ";
cin >> opc;
} while ((opc < 0) || (opc > 3));
return opc;
}
void muestraNavios(tNavios& nave) {
cout << setfill(char(0)) << setw(15)
<< left << "NOMBRE" << setw(15)
<< left << "EMPRESA" << setw(15)
<< left << "ESLORA" << setw(20)
<< left << "DESPLAZAMIENTO" << setw(20)
<< left << "PEAJE";
cout << setw(85) << setfill('=') << "\n" << setfill(char(0)) << endl;
for (int i = 0; i < nave.contador; i++) {
cout << setw(15) << left << nave.nombre[i] << setw(15)
<< left << nave.empresa[i] << setw(15)
<< left << fixed << setprecision(2) << nave.eslora[i] << setw(20)
<< left << nave.toneladas[i] << setw(10);
if (nave.peaje[i] == "true") {
cout << peajeNavio(nave, i) << "PAGADO\n";
}
else {
cout << peajeNavio(nave, i) << "NO PAGADO\n";
}
}
cout << setw(85) << setfill('=') << "\n";
cout << setw(0) << setfill(char(0)) << "\n";
system("PAUSE");
}
void crearNavio(tNavios& nuevo) {
string nombre;
nuevo.contador++;
cout << "Introduzca NOMBRE del navio: ";
cin >> nuevo.nombre[nuevo.contador];
cout << "Introduzca EMPRESA fabricante: ";
cin >> nuevo.empresa[nuevo.contador];
cout << "Introduzca ESLORA del navio: ";
cin >> nuevo.eslora[nuevo.contador];
cout << "Introduzca TONELADAS del navio: ";
cin >> nuevo.toneladas[nuevo.contador];
cout << "Introduzca PEAJE (true/false): ";
cin >> nuevo.peaje[nuevo.contador];
}
bool insertarNavio(tNavios& nave, tNavios& nuevo) {
bool insertado = false;
if (nave.contador < MAX_NAV) {
nave.nombre[nave.contador] = nuevo.nombre[nuevo.contador];
nave.empresa[nave.contador] = nuevo.empresa[nuevo.contador];
nave.eslora[nave.contador] = nuevo.eslora[nuevo.contador];
nave.toneladas[nave.contador] = nuevo.toneladas[nuevo.contador];
nave.peaje[nave.contador] = nuevo.peaje[nuevo.contador];
nave.contador++;
insertado = true;
}
else {
insertado = false;
}
return insertado;
}
bool cobrarNavio(tNavios& nave) {
bool encontrado = false;
string nom;
int i = 0;
cout << "Introduzca el nombre del navio que quiere pagar: ";
cin >> nom;
while ((i < nave.contador) && (!encontrado)) {
if (nave.nombre[i] == nom) {
nave.peaje[i] = "true";
encontrado = true;
}
i++;
}
return encontrado;
}
float peajeNavio(tNavios& nave, const int pos) {
float precio = 0;
if (nave.eslora[pos] <= 100) {
precio = nave.toneladas[pos] * 2;
}
else {
precio = nave.toneladas[pos] * 3;
}
return precio;
}
float peajePagado(tNavios& nave) {
float pagos = 0;
for (int i = 0; i < nave.contador; i++) {
if (nave.peaje[i] == "true") {
pagos += peajeNavio(nave, i);
}
}
return pagos;
}
void guardar(tNavios& nave) {
ofstream archivo;
archivo.open("navios.txt");
if(archivo.is_open()){
for (int i = 0; i < nave.contador; i++) {
archivo << nave.nombre[i] << " ";
archivo << nave.empresa[i] << " ";
archivo << nave.eslora[i] << " ";
archivo << nave.toneladas[i] << " ";
archivo << nave.peaje[i] << " " << endl;
}
archivo << "XXX";
}
archivo.close();
}