Explicarme esto si podeis :P (me urge)

Iniciado por El_Java, 24 Marzo 2011, 23:34 PM

0 Miembros y 2 Visitantes están viendo este tema.

El_Java

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 (cpp) [Seleccionar]

#include <iostream>
using namespace std;

struct teams{ //puse structs porque no conseguia hacerlo con class
   char nombre[30];
   float et1, et2, et3, total;
};

int main(){
   unsigned int numcasos;
   char caso[20];
   teams piloto[30];
   cin >> numcasos;

   for (unsigned int x=0; x<numcasos; x++){
       cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
       for (unsigned int y=0; y<30; y++){
           cin >> piloto[y].nombre >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
           piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;

           cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
       }
   }

   return 0;
}



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?

.:BlackCoder:.

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 (cpp) [Seleccionar]

    for (unsigned int x=0; x<numcasos; x++){
//aca
        cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
        for (unsigned int y=0; y<30; y++){
            //y aca para ignorar el '\n' que deja >> piloto[y].et3;
           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...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




El_Java

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

.:BlackCoder:.

#3
ttp://www.cplusplus.com/reference/iostream/istream/ignore/

Código (cpp) [Seleccionar]
   unsigned int numcasos;
   char caso[20];
   teams piloto[30];
   cin >> numcasos;

   for (unsigned int x=0; x<numcasos; x++){
       cin.ignore();
       cin.ignore(caso,20); //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
       for (unsigned int y=0; y<30; y++){
           cin.ignore();
           cin.getline(piloto[y].nombre,30);
           cin >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
           piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;

           cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
       }
   }


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 :\
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




El_Java

No, no me funciona, con tu codigo puedes escribir todo lo que quieras, que lo ignora xD

mael0c

Ola, usa
cin.get(caso,20);
en vez de
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.

El_Java

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

Garfield07

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

struct teams{ //puse structs porque no conseguia hacerlo con class
   char nombre[30];
   float et1, et2, et3, total;
};

int main(){
   unsigned int numcasos;
   char caso[20];
   teams piloto[30];
   cin >> numcasos;

   for (unsigned int x=0; x<numcasos; x++){
       cin >> caso; //si pongo cin.getline(caso, 20) ni siquiera lo reconoce y no lo guarda
       for (unsigned int y=0; y<30; y++){
           cin >> piloto[y].nombre >> piloto[y].et1 >> piloto[y].et2 >> piloto[y].et3;
           piloto[y].total = piloto[y].et1 + piloto[y].et2 + piloto[y].et3;

           cout << piloto[y].nombre <<" "<< piloto[y].et1 <<" "<< piloto[y].et2 <<" "<< piloto[y].et3 <<" "<< piloto[y].total;
       }
   }

   return 0;
}



No tengo mucha idea de C++, pero creo que las estructuras se definen como
Código (cpp) [Seleccionar]
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


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo