Presentacion y pequeña duda en c++

Iniciado por torralbita, 7 Diciembre 2012, 19:09 PM

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

torralbita

Buenas! actualmente estoy estudiando Ingenieria de Computadores y me encanta todo lo relacionado con la programació, linux etc... Hace muchos años que os sigo pero nunca me ha dado por registrarme.

Me gustaría pediros consejo acerca de un código que tengo entre manos para mi clase de programación, me está dando muuucho la lata.
Tengo que leer y escribir mediante ofstream e ifstream en un txt con usuarios y contraseñas para, una vez logueado, poder jugar a un juego.

El problema que tengo es que si fallo la contraseña 2 veces (por ejemplo) y la introduzco bien la tercera vez no hace nada! debería de poder acceder al juego.

Pego parte del código por si alguien pudiese echarme una mano.
Puedo poner el código completo y funcional si hiciese falta.

Mil gracias de antemano!!

Saludos.

cout << "Por favor, introduce tu apodo: ";
cin >> apodo;
cout << "Contraseña: ";
cin >> password;

lecturareg.open("registro.txt");
escrituratmp.open("tmp.txt");

do
{
lecturareg >> d;
escrituratmp << d << endl;

if(d == apodo){
lecturareg >> d;
escrituratmp << d << endl;
if(d == password)
found = true;
else
{
for(i = 1; i <= 2; i++) {
cout << "Contraseña incorrecta! Vuelve a intentarlo: ";
cin >> password;
}
if(i == 3)
{
cout << "Lo siento, pero has fallado demasiadas veces. No puedes jugar." << endl;
opmenu = 0;
}
}
}
} while(found == false && d != "XXX");

lecturareg.close();
escrituratmp.close();

if(found == false && i == 0)
{
lecturatmp.open("tmp.txt");
escriturareg.open("registro.txt");

do
{
lecturatmp >> d;

if(d != "XXX")
escriturareg << d << endl;
else
escriturareg << apodo << endl << password << endl << "XXX";
} while(d != "XXX");

}

lecturatmp.close();
escriturareg.close();


leosansan

#1
Cita de: torralbita en  7 Diciembre 2012, 19:09 PM

El problema que tengo es que si fallo la contraseña 2 veces (por ejemplo) y la introduzco bien la tercera vez no hace nada! debería de poder acceder al juego.


for(i = 1; i <= 2; i++) {
cout << "Contraseña incorrecta! Vuelve a intentarlo: ";
cin >> password;
}
if(i == 3)
{
cout << "Lo siento, pero has fallado demasiadas veces. No puedes jugar." << endl;


Citar
Ya lo dice el código, a la tercera:Lo siento, pero has fallado demasiadas veces. No puedes jugar. ¿O estas preguntando otra cosa?


Saluditos!.

dato000

Exacto, el problema en esta parte del codigo al parecer (al menos para esta sección de tu programa) radica en que dejas la valoracion del condicional por fuera del ciclo, y tomas "i" como un argumento global, pero una vez termina el for, "i" deja de ser utilizable para este proceso.

Yo realmente lo haria con un do-while, pero eso es solo gustos, solo haz un ciclo con mas de tres repeticiones, yo le pongo cinco, me gusta ese numero.


for(i = 1; i <=5 ; i++) {
        cout << "Contraseña incorrecta! Vuelve a intentarlo: ";
cin >> password;
if(i >= 3)
{
cout << "Lo siento, pero has fallado demasiadas veces. No puedes jugar." << endl;
                                        break;
                                }
}



torralbita

#3
Muchísmas gracias a ambos! he probado a modificar el código pero no hay forma. Sigue sin pillar la contraseña una vez se ha introducido mal, me explico.
1º - Creo un nuevo usuario "prueba"  con su contraseña "prueba".
2º - Accedo al programa e intento loguearme poniendo mal dos veces la contraseña.
3º - Al tercer intento introduzco la contraseña correcta pero no me la pilla.

Será mucho pedir pero os dejo el zip con el cpp y los txt corresponidentes por si pudiérais echarle un ojo a esa parte.


https://dl.dropbox.com/u/53489612/main.zip

Saludetes!


leosansan

#4
He cambiado el for, que no tenía mucho sentido, por un while.
No me termina de convencer el código, pero hace lo que quieres:

Código (cpp) [Seleccionar]
do
{
       lecturareg >> d;
escrituratmp << d << endl;
if(d == apodo){
lecturareg >> d;
escrituratmp << d << endl;
if(d == password){
                    found = true;
                    i=0;
           while(found == false){
               i++;
               cout << "Contraseña incorrecta! Vuelve a intentarlo: ";
               cin >> password;
               if(d == password)
                   found = true;
               if(found == false && i == 2){
cout << "Lo siento, pero has fallado demasiadas veces. No puedes jugar." << endl;
return 1;
}
           }
       }

} while(found == false && d != "XXX" );

Saluditos!.

torralbita

leosanan, mil gracias compañero! ahora funciona tal y como quería!! no tengo ni idea por que usé un for en lugar de un while.

¿Se ve muy mal el código? nuestro profesor nos dijo que usáramos lo que habíamos dado en clase y nos liásemos con cosas extrañas.


Lo dicho, muchísimas gracias por la ayuda, me ha quedado más claro como funciona.

Buen finde!

leosansan

CitarFIJATE QUE HE REEDITADO EL CODIGO ¡ ¡ ¡ ¡

torralbita

Cita de: leosansan en  8 Diciembre 2012, 16:41 PM


Lo acabo de ver compañero! el caso es que el registro de nuevos usuarios funcionaba bien con lo que me habías comentado antes de la edición, lo miraré igualmente.

Por cierto, el "return 1"  ¿se podría cambiar por algún equivalente?

Mil gracias por las molestias tomadas.

Un saludo.

leosansan

Cita de: torralbita en  8 Diciembre 2012, 17:23 PM

Por cierto, el "return 1"  ¿se podría cambiar por algún equivalente?

Es una forma de salir del programa, como el "return 0", e indica una salida correcta o prevista.
Podría usarse exit (), creo que con la librería stdlib, pero para gustos colores.
Saluditos!.