Ejercicios de Repaso

Anuncio
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
Descargar