Ejercicios de Repaso Fundamentos de Programación Fundamentos de Programación I Compañías aéreas Haz un programa que almacene información sobre vuelos de compañías aéreas. Los datos almacenados son: el número de vuelo, la compañía, la ciudad origen, la ciudad destino, el número de plazas totales y el número de plazas libres. Un ejemplo puede ser: 1 Iberia Valencia Madrid 250 10 2 Iberia Madrid Buenos-Aires 300 50 3 AirFrance Valencia Paris 250 70 El programa deberá permitir realizar desde menú las siguientes operaciones: a. Añadir vuelo b. Borrar vuelo c. Modificar el número de plazas libres. d. Ver todos vuelos e. Ver vuelos con plazas libres a un cierto destino. Además el programa debe permitir cargar los datos de sesiones anteriores (desde fichero) y guardar las actualizaciones en un fichero. 1 Estructura de datos que utilizaremos en este programa Elementos del vector Num_vu elo (int) Compañía (string) Origen (string) Destino (string) Totales (string) Libres (string) Iberia Madrid Barcelona 200 20 v[1] 2 Air France Barcelona Paris 250 150 v[2] 3 Iberia Madrid Buenos Aires 300 50 v[0] 1 Numvuelos = 3 Vector de estructuras: VectorVuelos v; struct vuelo{ int id; string nombre,origen,destino; int totales, libres; } ; const int MAX=200; typedef vuelo VectorVuelos[MAX]; #include <iostream> #include <stdlib.h> #include <string> using namespace std; struct vuelo{ int id; string nombre; string origen; string destino; int totales; int libres; } ; const int MAX=200; Estructura de datos para almacenar la información typedef vuelo VectorVuelos[MAX]; void InsertarVuelo(struct vuelo &miv); void EscribirRegistro(struct vuelo miv); void MostrarTodosVuelos(VectorVuelos v, int tam); void BorrarVuelo(VectorVuelos v,int &tam,int idvuelo); void MostrarVuelosDestino(VectorVuelos v, int tam, string destino); void ModificarPlazasLibres(VectorVuelos v,int tam,int idvuelo,int libres); bool LeerRegistroFichero(ifstream &fe, struct vuelo miv); int LeerDatosdeFichero(ifstream &fe, VectorVuelos v); Void EscribirDatosAFichero(ofstream &fs,const VectorVuelos v); 2 int main() { VectorVuelos losvuelos; //vector de estructuras int numvuelos = 0; //numero de elementos actuales en el vector int opcion, idvuelo, libres; bool seguir = true; string destino; do{ cout << "1. Insertar vuelo." <<endl; cout << "2. Borrar vuelo." << endl; cout << "3. Mostrar vuelo." << endl; cout << "4. Modificar numero de plazas libres para un vuelo." << endl; cout << "5. Mostrar vuelos con plazas libres para un destino." <<endl; cout << "6.Salir" <<endl; cin >> opcion; switch(opcion) { case 1: InsertarVuelo(losvuelos[numvuelos]); numvuelos ++; break; case 2: cout << " Introduce el identificador del vuelo\n"; cin >> idvuelo; BorrarVuelo(losvuelos,numvuelos,idvuelo); break; case 3: MostrarTodosVuelos(losvuelos, numvuelos); break; case 4: cout << "Indica el numero de vuelo y de plazas libres\n"; cin >> idvuelo >> libres; ModificarPlazasLibres(losvuelos,numvuelos,idvuelo,libres); break; case 5: cout << "Consultar plazas vuelo con destino: "; cin >> destino; MostrarVuelosDestino(losvuelos, numvuelos, destino); break; case 6: seguir = false; } }while(seguir); system("PAUSE"); return 0; } void InsertarVuelo(struct vuelo &miv) //leo la información introducida por teclado { cout <<"Id: "; cin >> miv.id; cout <<"Nombre: "; cin >> miv.nombre; cout <<"Origen: "; cin >> miv.origen; cout <<"Destino: "; cin >> miv.destino; cout <<"Numero de plazas totales: "; cin >> miv.totales; miv.libres = miv.totales; } void EscribirRegistro(struct vuelo miv) //muestro el contenido de un registro { cout << miv.id <<" "; cout << miv.nombre<<" "; cout << miv.origen<<" "; cout << miv.destino<<" "; cout << miv.totales<<" "; cout << miv.libres <<endl; } void MostrarTodosVuelos(VectorVuelos v, int tam)//Muestro un vector de registros por pantalla { int i; for (i = 0 ; i < tam ; i++) EscribirRegistro(v[i]); return; } 3 void BorrarVuelo(VectorVuelos v,int &tam,int idvuelo) { int i= 0; int elemento; while (v[i].id != idvuelo && i < tam) //Buscar vuelo { i++; } elemento = i; if ( elemento < tam) //Lo he encontrado { for ( i = elemento ; i < tam -1 ; i++) //Los muevo de lugar v[i] = v[i + 1]; tam --; //decremento el tamaño del vector }else cout << "No existe ese vuelo\n"; return; } void ModificarPlazasLibres(VectorVuelos v,int tam,int idvuelo,int libres) { int i, elemento; i = 0; while (v[i].id != idvuelo && i < tam) //Buscar vuelo { i++; } elemento = i; if ( elemento < tam) //lo he encontrado { v[elemento].libres = libres; //modifico ese elemento cout << "Modificación realizada\n"; } return; } void MostrarVuelosDestino(VectorVuelos v, int tam, string destino) { int i; for (i = 0; i < tam ; i++) //busco vuelo a un destino con plazas libres y lo muestro { if (destino == v[i].destino && v[i].libres > 0) EscribirRegistro(v[i]); } } //leo un registro del fichero especificado. Devuelvo false si hay un error. bool LeerRegistroFichero(ifstream &fe, struct vuelo & miv); { //Leo cada elemento de la estructura de forma independiente fe fe fe fe fe fe >> >> >> >> >> >> miv.id; miv.nombre; miv.origen; miv.destino; miv.totales; miv.totales; La función devuelve true si puede leer todos los campos del registro correctamente //Devuelvo true si todo ha ido bien, false en caso contrario return (!fe.eof()) ; } 4 int LeerDatosdeFichero(ifstream &fe, VectorVuelos v) { int i = 0; while(LeerRegistroFichero(fe,v[i]) //la función devuelve true si ha conseguido leer { i++ } return i;//devuelve el número de elementos leidos } void EscribirDatosAFichero(ofstream &fs,const VectorVuelos v, int tam) { int i; for(i = 0 ; i< tam ; i++) EscribirRegistroFichero(fs,v[i]) //Utilizo Esta función para escribir cada registro return; } void EscribirRegistroFichero(ofstream &fs,struct vuelo miv) { //Imprimo un vuelo por fila en el fichero fs fs<< miv.id << “ “; fs << miv.nombre << “ ”; fs << miv.origen << “ ”; fs << miv.destino << “ ”; fs << miv.totales << “ “ ; fs << miv.totales << endl; return; } Palíndroma en una pasada Escribe un programa que calcula y visualiza los palíndromos en una pasada de los números introducidos por teclado, si los tiene. El proceso consiste en leer un número entero por teclado, calcular si el número tiene un palíndromo en una pasada e indicarlo mediante un mensaje. Ejemplos: Entrada Introduce un número: 216 Proceso Obtiene el traspuesto de 216, que es 612. Suma 216 + 612 = 828. Comprueba que es palíndromo. Salida Su palíndromo en un paso es: 828 Entrada Introduce un número(0 Salir): 154 Proceso Obtiene el traspuesto de 154, que es 451. Suma 154 + 451 = 605. Comprueba que no es palíndromo. Salida El 154 no tiene un palíndromo en una pasada. 5 #include <iostream> #include <stdlib.h> #include <string> using namespace std; void EnteroACadena (int x, string & cadena) { char ch; cadena = ""; while (x > 0) { ch = char( x % 10 + int(‘0’)); cadena= ch + cadena; //anyado a la izquierda x = x / 10; } return; } bool CadenaAEntero (string num, int & x) { bool error = false; int i; i = 0; x = 0; while ( (error == false) && (i < int (num.length () ) ) ) { if ( (int (num[i]) < int('0') ) || (int (num[i]) > int ('9') ) ) error = true; else x = x * 10 + int (num[i] - '0');//desplazo hacia a la izquierda i++; } return error; } int main() { string cadena, icadena, palindro; int n1,n2,i,ultima; bool exito; cout<<"\n\tPROGRAMA QUE HALLA NUMEROS PALINDROMOS EN UN PASO\n\n"; cout<<"\tIntroduce n£mero(0 Salir):"; cin >> cadena; ultima=cadena.length()-1; icadena=cadena; for (i=0;i<cadena.length();i++) icadena[ultima-i]=cadena[i]; //invierto cadena exito=CadenaAEntero(cadena,n1); exito=CadenaAEntero(icadena,n2); //falta comprobar si hay error EnteroACadena(n1+n2,palindro); ultima=palindro.length()-1; compruebo si es palíndroma i=0; while ((palindro[i]==palindro[ultima]) && i < ultima) { i++; ultima--; } if (i>=ultima) cout<<"\n\tEl n£mero pal¡ndromo es: " << n1 + n2 <<endl; else cout<<"\n\tEl n£mero no es pal¡ndromo\n"; system("PAUSE"); return 0; } 6 Suma de elementos en una matriz (ejercicio examen) Escribe una función que dada una matriz realice la suma de sus elementos en una de sus dimensiones según el valor de un parámetro. El resultado lo almacenará en un vector del tamañó adecuado. Ejemplo: 1 2 3 4 5 6 5 7 9 1 2 3 6 4 5 6 15 const int MAX = 10; typedef int matriz[MAX][MAX]; typedef int vector[MAX]; struct Matriz { matriz m; int filas; int columnas; }; Creo una estructura Que contenga también las filas y columnas void SumaMatricial(const Matriz ma,int dim,vector v, int &tam) { int i,j; for (i = 0 ; i < 10 ; i++) v[i] = 0;//inicializo el vector resultado a cero for(i = 0; i < ma.filas ; i++) for (j = 0; j < ma.columnas; j++) { if (dim == 1) //por filas (si sumo por filas...me quedan columnas-> j) { v[j] = v[j] + ma.m[i][j]; tam = ma.columnas;//Se puede sacar fuera para evitar asignar lo mismo //varias veces } else if ( dim == 2) //por columnas (si sumo por columnas..me quedan filas->i) { v[i] = v[i] + ma.m[i][j]; tam = ma.filas; } } return; } 7 Tamaño de un string de forma recursiva Escribe una función recursiva que tome como argumento un string y devuelva su tamaño sin utilizar la función length(). Ejemplo: int LongitudCadena(string s) { int longitud; int algo; if (s == "") //Condición de parada longitud = 0; else { s.erase(0,1); //Actualización de parámetro longitud = 1 + LongitudCadena(s);//Construyo la solución } return longitud; } 8