do while actua en bucle continuo

Iniciado por juligarc10, 3 Diciembre 2018, 20:09 PM

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

juligarc10

Hola.

He estado intentando hacer un ficticio programa de gestión bancaria, donde entre una serie de "clientes" (ya introducidos en el programa) deben de poder ser localizados por su DNI. El principal problema es que aunque el DNI introducido sea correcto el programa no para de pedirme el DNI de nuevo. Aquí les dejo la porción del código. El programa compila perfectamente. Gracias.

setClientes buscarDNI(setClientes variosClientes){
    bool x=true;
    char comparacionDNI[10];
    int n=variosClientes.numClientes, i=0;
    do{
        x=true;
    leerCadena("Introduzca el DNI del cliente que desea buscar ", comparacionDNI);
    for (i=0;i<n;i++){
        if (strcmp(variosClientes.Clientes[i].DNI, comparacionDNI)==0){
            cout<<"El DNI que ha introducido se corresponde con el cliente "<<variosClientes.Clientes[i].nombre<<endl;
            cout<< "Sus datos son..."<<endl;
            cout << "\nCliente : " << i;
        mostrarCliente( variosClientes.Clientes[ i ] );
            x==false;
        }else if (x=true&&(i==n-1)){
                cout<<"El DNI no es valido\n";}
}}while (x!=false);}

MAFUS

Tu fallo puede estar en esta línea, de hecha en esta línea hay un fallo gordo que suele pasar desapercibido:
}else if (x=true&&(i==n-1)){

Si te fijas asignas true a x: x=true

Para evitarte esto: cuando se evalúa una variable para C o C++ devuelve false si de alguna forma vale 0 (que valga false, 0, NULL, '\0'), para todo lo demás vale true.

Todo esto viene a decir que lo podrías haber escrito:
}else if (x && (i==n-1)){

juligarc10

Cita de: MAFUS en  3 Diciembre 2018, 20:30 PM
Tu fallo puede estar en esta línea, de hecha en esta línea hay un fallo gordo que suele pasar desapercibido:
}else if (x=true&&(i==n-1)){

Si te fijas asignas true a x: x=true

Para evitarte esto: cuando se evalúa una variable para C o C++ devuelve false si de alguna forma vale 0 (que valga false, 0, NULL, '\0'), para todo lo demás vale true.

Todo esto viene a decir que lo podrías haber escrito:
}else if (x && (i==n-1)){

Hola. He probado a hacer lo que me has dicho, en el else if, y no ha dado resultado. El codigo compila, pero sigue funcionando igual que antes. El código ha quedado así.
setClientes buscarCuenta(setClientes variosClientes){
    bool x=true;
    char comparacionCuenta[11];
    int n=variosClientes.numClientes, i=0;
    do{
    leerCadena("Introduzca la cuenta del cliente que desea buscar ", comparacionCuenta);
    for (i=0;i<n;i++){
            if (strcmp(variosClientes.Clientes[i].numCuenta, comparacionCuenta)==0){
                    x==false;
                    cout<<"La cuenta que ha introducido se corresponde con el cliente "<<variosClientes.Clientes[i].nombre<<endl;
                    cout<< "Sus datos son..."<<endl;
                    cout << "\nCliente : " << i;
            mostrarCliente( variosClientes.Clientes[ i ] );
                    }
            else if (x &&(i==n-1)){
                    cout<< "La cuenta no es valida"<<endl;}}
    }while (x);
return(variosClientes);
}


Lo que parece pasar es que el x==false; que está dentro del if, parece que no lo tiene en cuenta, y que al llegar al while(x);, la x tiene el valor de true, cuando en realidad, cumpliendose el if, debería tener valor false.

Gracias. Un saludo.

K-YreX

Hay una gran diferencia entre usar "="(asignación) o usar "=="(comparación).
Cuando quieres VER si una variable vale algo concreto hay que usar la comparación.
Código (cpp) [Seleccionar]

if(x == 0)
    cout << "x vale 0";


Pero si lo que quieres es ASIGNAR un valor a una variable pues entonces usas la asignación. Por ejemplo, para que veas las dos cosas juntas.
Código (cpp) [Seleccionar]

if(x == 0)
    x = 1;

Ahí lo tienes. Compruebas que <x> vale 0 y de ser así, le asignas el valor de 1, entonces ahora <x> vale 1.

Si en un código haces:
Código (cpp) [Seleccionar]

int x = 1;
if(x = 0)
    cout << "x vale = " << x;

La salida va a ser: "x vale = 0". Por qué?? Porque una asignación en un <if> se traduce como verdadera siempre. Entonces <x> empieza valiendo 1, llega al <if>, como es una asignación se hace, ahora <x> vale 0 y como una asignación siempre es cierta te muestra el valor de <x> que es 0.

En cambio si tienes:
Código (cpp) [Seleccionar]

int x = 1;
if(x == 0)
    cout << "x vale = " << x;

Ese programa no muestra nada por pantalla. Ya que <x> empieza valiendo 1, comparas <x> con 0 y como no es igual no se ejecuta lo que hay dentro del <if>.

En resumen, si quieres hacer que una variable valga algo, usa un igual "=". Si quieres comprobar que una variable vale algo, usa dos iguales "==". Suerte.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

CalgaryCorpus

#4
Una precision, pues hay algo incorrecto en lo anterior, una asignacion es una expresion, y las expresiones tienen un valor. El valor de la expresion de asignacion es el valor que se asigna.

Dado esto, x = 0 tiene valor 0, no tiene valor 1 (o "siempre es cierta") como se indico en el comentario anterior.

Para el ejemplo:

if( x = 0 ) {
  // cualquier instruccion
}


la instruccion nunca se ejecutara.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

K-YreX

Cita de: CalgaryCorpus en  4 Diciembre 2018, 16:12 PM
Una precision, pues hay algo incorrecto en lo anterior, una asignacion es una expresion, y las expresiones tienen un valor. El valor de la expresion de asignacion es el valor que se asigna.

Dado esto, x = 0 tiene valor 0, no tiene valor 1 (o "siempre es cierta") como se indico en el comentario anterior.

Cierto, no lo había probado y yo pensaba que una asignación se evaluaba como cierta si la asignación se hacía con éxito (me sonaba que era así y no sé por qué). Bueno pues haciendo la asignación con otro número distinto de 0 sí se muestra lo que quería decir. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

MAFUS

Como primera orden del if tienes una comparación, no una asignación
x==false;
Lo que haces ahí es comparar x con false y el resultado se pierde. No se cambia el valor de x. Es decir: en vez de == debe haber =.

Para evitar tu próximo posible fallo lógico:
Las dos cadenas a comparar deben ser exactamente iguales
Es decir que si numCuenta tiene un salto de línea porque lo has capturado con un fgets (y esa función obtiene saltos de línea) y comparacionCuenta no tiene saltos de línea o viceversa, las dos cadenas no serán iguales y la comprobación fallará.

juligarc10

Muchas gracias a todos, me han sido de gran ayuda. Problema solucionado. Un saludo  :laugh: ;-)