Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: El_Java en 24 Marzo 2011, 23:34 pm



Título: Explicarme esto si podeis :P (me urge)
Publicado por: El_Java en 24 Marzo 2011, 23:34 pm
Hola, vereis, estoy haciendo un ejercicio en el que hay que comparar los tiempos de unos pilotos durante 3 tamos de carrera y mostrar el mayor, pero como no me salia, me he puesto a hacerlo paso por paso comprobando todos los pasos. Y he encontrado un fallo y no se porque ocurre esto:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct teams{ //puse structs porque no conseguia hacerlo con class
  5.    char nombre[30];
  6.    float et1, et2, et3, total;
  7. };
  8.  
  9. int main(){
  10.    unsigned int numcasos;
  11.    char caso[20];
  12.    teams piloto[30];
  13.    cin >> numcasos;
  14.  
  15.    for (unsigned int x=0; x<numcasos; x++){
  16.        cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
  17.        for (unsigned int y=0; y<30; y++){
  18.            cin >> piloto[y].nombre >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
  19.            piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;
  20.  
  21.            cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
  22.        }
  23.    }
  24.  
  25.    return 0;
  26. }
  27.  
  28.  

El caso es que si omito la line cin >> code (que me pide el ejercicio que la ponga, pues debe introducirse para cada caso "caso N") funciona, pero si no lo quito aparecen muchisimos caracteres extraños, podeis decirme porque?


Título: Re: Explicarme esto si podeis :P
Publicado por: .:BlackCoder:. en 24 Marzo 2011, 23:54 pm
no tengo compilador a la mano pero quizas es que debes limpiar el buffer despues de leer el entero numcasos... coloca un cin.ignore() en la entrada de cada bucle y quizas se resuelva el problema:

Código
  1.    for (unsigned int x=0; x<numcasos; x++){
  2. //aca
  3.        cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
  4.        for (unsigned int y=0; y<30; y++){
  5.            //y aca para ignorar el '\n' que deja >> piloto[y].et3;
  6.           cin >> piloto[y].nombre >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;

Quizas sea ese el error quizas no xD si no es avisas y cuando tenga compiler a la mano te ayudo

Saludos...


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: El_Java en 25 Marzo 2011, 00:01 am
aun asi me pasa igual... ademas, es que necesito usar cin.getline porque en los casos de prueba habra que poner " Caso 1", y no "Caso1"... lo mismo es que no coloque bien el cin.ignore(), es una funcion que nunca he entendido demasiado bien...


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: .:BlackCoder:. en 25 Marzo 2011, 00:10 am
ttp://www.cplusplus.com/reference/iostream/istream/ignore/

Código
  1.    unsigned int numcasos;
  2.    char caso[20];
  3.    teams piloto[30];
  4.    cin >> numcasos;
  5.  
  6.    for (unsigned int x=0; x<numcasos; x++){
  7.        cin.ignore();
  8.        cin.ignore(caso,20); //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
  9.        for (unsigned int y=0; y<30; y++){
  10.            cin.ignore();
  11.            cin.getline(piloto[y].nombre,30);
  12.            cin >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
  13.            piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;
  14.  
  15.            cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
  16.        }
  17.    }

Estas seguro que eso no te funciona?...  :-X No tengo compiler...

edit: es cin.getline(caso,20)... luego veo bien cual es el problema entonces :\


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: El_Java en 25 Marzo 2011, 00:23 am
No, no me funciona, con tu codigo puedes escribir todo lo que quieras, que lo ignora xD


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: mael0c en 25 Marzo 2011, 00:58 am
Ola, usa
Código:
cin.get(caso,20); 
en vez de
Código:
cin >> caso; 

El motivo del error creo que es el que te dice .:BlackCoder:., de todas formas, haciendo la substitución anterior, a mi me compiló y se ejecutó perfectamente.


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: El_Java en 25 Marzo 2011, 20:34 pm
Si que me funciona ahora, pero al mostrarlo me muestra el nombre del piloto sin la primera letra, por ejemplo, de Juan me muestra uan :S


Título: Re: Explicarme esto si podeis :P (me urge)
Publicado por: Garfield07 en 26 Marzo 2011, 11:20 am
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct teams{ //puse structs porque no conseguia hacerlo con class
  5.    char nombre[30];
  6.    float et1, et2, et3, total;
  7. };
  8.  
  9. int main(){
  10.    unsigned int numcasos;
  11.    char caso[20];
  12.    teams piloto[30];
  13.    cin >> numcasos;
  14.  
  15.    for (unsigned int x=0; x<numcasos; x++){
  16.        cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
  17.        for (unsigned int y=0; y<30; y++){
  18.            cin >> piloto[y].nombre >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
  19.            piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;
  20.  
  21.            cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
  22.        }
  23.    }
  24.  
  25.    return 0;
  26. }
  27.  
  28.  

No tengo mucha idea de C++, pero creo que las estructuras se definen como
Código
  1. struct teams piloto [30]

¿Y si probases con funciones de C? Tipo fgets ()...


Por el resto debería de funcionar, no veo tus fallos...
Un saludo. Sagrini