Duda con ejercicio

Iniciado por bigfu, 24 Agosto 2011, 20:16 PM

0 Miembros y 1 Visitante están viendo este tema.

bigfu

Hola, me piden el siguiente ejercicio:
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 (cpp) [Seleccionar]
#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!!
A reader lives a thousand lives before he dies. The man who never reads lives only one

satu

#1
Hola

Ahora no puedo probar el código pero a simple vista te falta aquí

EDITO:
el fallo está en la función SUC, debes retornar
Código (cpp) [Seleccionar]
return (TPrueba)ord;

y también deberías introducir el nadador en la estructura una vez que lees los datos y no en otro case, es mi opinión

No se si habrá más cosas

Saludos
Breakbeat como forma de vida

bigfu

Cita de: satu en 24 Agosto 2011, 21:23 PM
Hola

Ahora no puedo probar el código pero a simple vista te falta aquí

EDITO:
el fallo está en la función SUC, debes retornar
Código (cpp) [Seleccionar]
return (TPrueba)ord;

y también deberías introducir el nadador en la estructura una vez que lees los datos y no en otro case, es mi opinión

No se si habrá más cosas

Saludos

Muchísimas gracias. Creo que tienes razón, no sé por qué lo he puesto así... y lo que es peor, que no he visto un fallo tan tonto después de haber estado mirando varias veces el código.
Voy a hacer esa modificación y veré si funciona.
Muchas gracias!
A reader lives a thousand lives before he dies. The man who never reads lives only one