Diseña una estructura de datos (TNatacion) para almacenar los datos de un grupo de nadadores que se presentan a una competicion de natacion. De cada nadador (TNadador) es necesario almacenar su nombre, edad, prueba en la que participa (espalda,mariposa,croll,braza) (TPrueba) y tiempo (minutos y segundos). La estructura contendrá un máximo de 16 nadadores. Se pide:
a) Define los tipos de datos (TNatacion, TNadador, TPrueba y aquellos que consideres necesarios), asi como un procedimiento para inicializar la estructura.
b) Implementa una función que permita leer los datos de un nadador. A la hora de leer el tipo de competición en la que participa, el programa seguirá pidiendo este dato hasta que se introduzca un tipo de competición correcto.
c) Implementa un procedimiento para introducir los datos de un nadador dentro de la estructura. Controla la posibilidad de que se produzca un error por falta de espacio en la misma.
d) Implementa un procedimiento que busque si un determinado nadador (identificado por su nombre) está dentro de la competición. El procedimiento habrá de devolver si el nadador ha sido encontrado o no y en caso afirmativo la posición de la estructura donde se encuentra.
e) Implementa un procedimiento que muestre para todos los nadadores inscritos en la competición en una determinada prueba (espalda,braza...), la diferencia entre su tiempo y el tiempo medio de todos los nadadores en este tipo de prueba. Controla la posibilidad de que la estructura este vacia, o que no haya nadadores participantes en este tipo de prueba.
He implementado el siguiente código:
Código
#include <iostream> #include <string> using namespace std; const unsigned MAX_NADADORES = 16; enum TPrueba {espalda, mariposa, croll, braza}; struct TTiempo{ unsigned min, seg; }; struct TNadador{ string nombre; unsigned edad; TPrueba prueba; TTiempo tiempo; }; typedef TNadador TArray[MAX_NADADORES]; struct TNatacion{ TArray datos; unsigned num_nadadores; }; char Menu(); void inicializarEstructura(TNatacion& n); void leerNadador(TNadador& nadador); void LeerPrueba(TPrueba& p); void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok); string tipoprueba_a_string(const TPrueba& p); TPrueba SUC(const TPrueba& p); void introNadador(TNatacion& n, const TNadador nadador); void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos); void mostrarNadadores(const TNatacion& n); int main() { TNatacion n; TNadador nadador; bool salir = false, encontrado; string nombre; unsigned pos; char op; inicializarEstructura(n); while(!salir){ op = Menu(); switch(op){ case 'A': leerNadador(nadador); break; case 'B': introNadador(n,nadador); break; case 'C': cout << "Introduzca nombre: "; getline(cin,nombre); buscarNadador(n,nombre,encontrado,pos); if(encontrado){ cout << "El nadador " << n.datos[pos].nombre << " se encuentra en la posicion " << pos << endl; }else{ cout << "El nadador " << nombre << " no se encuentra introducido en la estructura." << endl; } break; case 'D': mostrarNadadores(n); break; case 'X': salir = true; break; default: cout << "Opcion Incorrecta." << endl; } } return 0; } char Menu(){ char op; cout << "A: Leer datos de un nadador." << endl; cout << "B: Implementar datos del nadador en la estructura." << endl; cout << "C: Buscar nadador." << endl; cout << "D: Mostrar nadadores." << endl; cout << "X: Salir." << endl; cout << endl; cout << "Introduzca opcion: "; cin >> op; op = toupper(op); return op; } void inicializarEstructura(TNatacion& n){ n.num_nadadores = 0; } void leerNadador(TNadador& nadador){ TPrueba p; cout << "Introduzca nombre: "; getline(cin,nadador.nombre,'\n'); cout << "Introduzca edad: "; cin >> nadador.edad; LeerPrueba(p); nadador.prueba = p; cout << "Introduzca tiempo (mm ss): "; cin >> nadador.tiempo.min >> nadador.tiempo.seg; } void LeerPrueba(TPrueba& p){ string s; bool ok; cout << "Introduzca prueba: "; getline(cin,s,'\n'); string_a_tipoprueba(s,p,ok); while(!ok){ cout << "Prueba erronea." << endl; cout << "Introduzca prueba: "; string_a_tipoprueba(s,p,ok); } } void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok){ ok = false; p = espalda; while((p<braza)&&(!ok)){ if(s==tipoprueba_a_string(p)){ ok = true; }else{ p = SUC(p); } } ok = ((ok) || tipoprueba_a_string(p)==s); } string tipoprueba_a_string(const TPrueba& p){ string s; switch(p){ case espalda: s = "espalda"; break; case mariposa: s = "mariposa"; break; case croll: s = "croll"; break; case braza: s = "braza"; break; } return s; } TPrueba SUC(const TPrueba& p){ unsigned ord; ord = int(p)+1; return p; } void introNadador(TNatacion& n, const TNadador nadador){ if(n.num_nadadores>=MAX_NADADORES){ cout << "La estructura esta llena" << endl; }else{ n.datos[n.num_nadadores] = nadador; n.num_nadadores++; } } void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos){ encontrado = false; for(unsigned i=0;i<n.num_nadadores;i++){ if(n.datos[i].nombre == nombre){ pos = i; encontrado = true; break; } } } void mostrarNadadores(const TNatacion& n){ TPrueba p; bool ok = false; LeerPrueba(p); for(unsigned i=0;i<n.num_nadadores;i++){ if(n.datos[i].prueba == p){ ok = false; cout << "Nombre: " << n.datos[i].nombre << endl; cout << "Tiempo: " << n.datos[i].tiempo.min << "' " << n.datos[i].tiempo.seg << "''" << endl; } } if(n.num_nadadores==0){ cout << "La estructura esta vacia." << endl; }else if(!ok){ cout << "No hay nadadores inscritos en esa prueba." << endl; } }
El problema es que no funciona correctamente. Sospecho que tiene que ver con la lectura de la prueba al leer un nadador, pero la verdad, es que no tengo ni idea de porque no va... ¿le podéis echar un vistazo al código?
Muchas gracias!!