elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con ejercicio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con ejercicio  (Leído 1,305 veces)
bigfu

Desconectado Desconectado

Mensajes: 49



Ver Perfil WWW
Duda con ejercicio
« en: 24 Agosto 2011, 20:16 pm »

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
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. const unsigned MAX_NADADORES = 16;
  6. enum TPrueba {espalda, mariposa, croll, braza};
  7. struct TTiempo{
  8. unsigned min, seg;
  9. };
  10. struct TNadador{
  11. string nombre;
  12. unsigned edad;
  13. TPrueba prueba;
  14. TTiempo tiempo;
  15. };
  16. typedef TNadador TArray[MAX_NADADORES];
  17. struct TNatacion{
  18. TArray datos;
  19. unsigned num_nadadores;
  20. };
  21.  
  22. char Menu();
  23. void inicializarEstructura(TNatacion& n);
  24. void leerNadador(TNadador& nadador);
  25. void LeerPrueba(TPrueba& p);
  26. void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok);
  27. string tipoprueba_a_string(const TPrueba& p);
  28. TPrueba SUC(const TPrueba& p);
  29. void introNadador(TNatacion& n, const TNadador nadador);
  30. void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos);
  31. void mostrarNadadores(const TNatacion& n);
  32.  
  33. int main() {
  34. TNatacion n;
  35. TNadador nadador;
  36. bool salir = false, encontrado;
  37. string nombre;
  38. unsigned pos;
  39. char op;
  40.  
  41. inicializarEstructura(n);
  42. while(!salir){
  43. op = Menu();
  44. switch(op){
  45. case 'A': leerNadador(nadador);
  46. break;
  47. case 'B': introNadador(n,nadador);
  48. break;
  49. case 'C': cout << "Introduzca nombre: ";
  50.  getline(cin,nombre);
  51.  buscarNadador(n,nombre,encontrado,pos);
  52.  if(encontrado){
  53.  cout << "El nadador " << n.datos[pos].nombre << " se encuentra en la posicion " << pos << endl;
  54.  }else{
  55.  cout << "El nadador " << nombre << " no se encuentra introducido en la estructura." << endl;
  56.  }
  57. break;
  58. case 'D': mostrarNadadores(n);
  59. break;
  60. case 'X': salir = true;
  61. break;
  62. default: cout << "Opcion Incorrecta." << endl;
  63. }
  64. }
  65.  
  66. return 0;
  67. }
  68.  
  69. char Menu(){
  70. char op;
  71.  
  72. cout << "A: Leer datos de un nadador." << endl;
  73. cout << "B: Implementar datos del nadador en la estructura." << endl;
  74. cout << "C: Buscar nadador." << endl;
  75. cout << "D: Mostrar nadadores." << endl;
  76. cout << "X: Salir." << endl;
  77. cout << endl;
  78. cout << "Introduzca opcion: ";
  79. cin >> op;
  80. op = toupper(op);
  81.  
  82. return op;
  83. }
  84.  
  85. void inicializarEstructura(TNatacion& n){
  86. n.num_nadadores = 0;
  87. }
  88.  
  89. void leerNadador(TNadador& nadador){
  90. TPrueba p;
  91.  
  92. cout << "Introduzca nombre: ";
  93. getline(cin,nadador.nombre,'\n');
  94. cout << "Introduzca edad: ";
  95. cin >> nadador.edad;
  96. LeerPrueba(p);
  97. nadador.prueba = p;
  98. cout << "Introduzca tiempo (mm ss): ";
  99. cin >> nadador.tiempo.min >> nadador.tiempo.seg;
  100. }
  101.  
  102. void LeerPrueba(TPrueba& p){
  103. string s;
  104. bool ok;
  105.  
  106. cout << "Introduzca prueba: ";
  107. getline(cin,s,'\n');
  108. string_a_tipoprueba(s,p,ok);
  109. while(!ok){
  110. cout << "Prueba erronea." << endl;
  111. cout << "Introduzca prueba: ";
  112. string_a_tipoprueba(s,p,ok);
  113. }
  114.  
  115. }
  116.  
  117. void string_a_tipoprueba(const string& s, TPrueba& p, bool& ok){
  118. ok = false;
  119. p = espalda;
  120.  
  121. while((p<braza)&&(!ok)){
  122. if(s==tipoprueba_a_string(p)){
  123. ok = true;
  124. }else{
  125. p = SUC(p);
  126. }
  127. }
  128. ok = ((ok) || tipoprueba_a_string(p)==s);
  129. }
  130.  
  131. string tipoprueba_a_string(const TPrueba& p){
  132. string s;
  133. switch(p){
  134. case espalda: s = "espalda";
  135. break;
  136. case mariposa: s = "mariposa";
  137. break;
  138. case croll: s = "croll";
  139. break;
  140. case braza: s = "braza";
  141. break;
  142. }
  143. return s;
  144. }
  145.  
  146. TPrueba SUC(const TPrueba& p){
  147. unsigned ord;
  148.  
  149. ord = int(p)+1;
  150. return p;
  151. }
  152.  
  153. void introNadador(TNatacion& n, const TNadador nadador){
  154. if(n.num_nadadores>=MAX_NADADORES){
  155. cout << "La estructura esta llena" << endl;
  156. }else{
  157. n.datos[n.num_nadadores] = nadador;
  158. n.num_nadadores++;
  159. }
  160. }
  161.  
  162. void buscarNadador(const TNatacion& n, const string& nombre, bool& encontrado, unsigned& pos){
  163. encontrado = false;
  164.  
  165. for(unsigned i=0;i<n.num_nadadores;i++){
  166. if(n.datos[i].nombre == nombre){
  167. pos = i;
  168. encontrado = true;
  169. break;
  170. }
  171. }
  172. }
  173.  
  174. void mostrarNadadores(const TNatacion& n){
  175. TPrueba p;
  176. bool ok = false;
  177.  
  178. LeerPrueba(p);
  179. for(unsigned i=0;i<n.num_nadadores;i++){
  180. if(n.datos[i].prueba == p){
  181. ok = false;
  182. cout << "Nombre: " << n.datos[i].nombre << endl;
  183. cout << "Tiempo: " << n.datos[i].tiempo.min << "' " << n.datos[i].tiempo.seg << "''" << endl;
  184. }
  185. }
  186. if(n.num_nadadores==0){
  187. cout << "La estructura esta vacia." << endl;
  188. }else if(!ok){
  189. cout << "No hay nadadores inscritos en esa prueba." << endl;
  190. }
  191. }

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!!


« Última modificación: 24 Agosto 2011, 20:32 pm por bigfu » En línea

A reader lives a thousand lives before he dies. The man who never reads lives only one
satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: Duda con ejercicio
« Respuesta #1 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
  1. 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


« Última modificación: 24 Agosto 2011, 21:41 pm por satu » En línea

Breakbeat como forma de vida
bigfu

Desconectado Desconectado

Mensajes: 49



Ver Perfil WWW
Re: Duda con ejercicio
« Respuesta #2 en: 24 Agosto 2011, 22:43 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
  1. 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!
En línea

A reader lives a thousand lives before he dies. The man who never reads lives only one
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda en ejercicio++
Ejercicios
Lamarkus 1 2,207 Último mensaje 1 Diciembre 2010, 17:31 pm
por [L]ord [R]NA
duda con un ejercicio..
Programación C/C++
fer_fer_73 8 3,014 Último mensaje 4 Febrero 2011, 01:24 am
por negux
Duda ejercicio C
Programación C/C++
cortex123 1 1,327 Último mensaje 13 Junio 2011, 21:09 pm
por El_Java
duda con un ejercicio
Programación C/C++
Freelancer 4 1,704 Último mensaje 10 Septiembre 2011, 04:31 am
por Freelancer
Duda con un ejercicio
Programación C/C++
goll9d 4 1,375 Último mensaje 13 Mayo 2012, 01:47 am
por goll9d
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines