Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juligarc10 en 3 Diciembre 2018, 20:09 pm



Título: do while actua en bucle continuo
Publicado por: juligarc10 en 3 Diciembre 2018, 20:09 pm
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.

Código:
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);}


Título: Re: do while actua en bucle continuo
Publicado por: 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:
Código:
}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:
Código:
}else if (x && (i==n-1)){


Título: Re: do while actua en bucle continuo
Publicado por: juligarc10 en 4 Diciembre 2018, 14:06 pm
Tu fallo puede estar en esta línea, de hecha en esta línea hay un fallo gordo que suele pasar desapercibido:
Código:
}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:
Código:
}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í.
Código:
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
Código:
x==false;
que está dentro del if, parece que no lo tiene en cuenta, y que al llegar al
Código:
while(x);
, la x tiene el valor de true, cuando en realidad, cumpliendose el if, debería tener valor false.

Gracias. Un saludo.


Título: Re: do while actua en bucle continuo
Publicado por: K-YreX en 4 Diciembre 2018, 15:50 pm
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
  1. if(x == 0)
  2.    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
  1. if(x == 0)
  2.    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
  1. int x = 1;
  2. if(x = 0)
  3.    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
  1. int x = 1;
  2. if(x == 0)
  3.    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.


Título: Re: do while actua en bucle continuo
Publicado por: 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.

Para el ejemplo:

Código
  1. if( x = 0 ) {
  2.   // cualquier instruccion
  3. }
  4.  

la instruccion nunca se ejecutara.


Título: Re: do while actua en bucle continuo
Publicado por: K-YreX en 4 Diciembre 2018, 16:36 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


Título: Re: do while actua en bucle continuo
Publicado por: MAFUS en 4 Diciembre 2018, 17:21 pm
Como primera orden del if tienes una comparación, no una asignación
Código:
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á.


Título: Re: do while actua en bucle continuo
Publicado por: juligarc10 en 5 Diciembre 2018, 12:44 pm
Muchas gracias a todos, me han sido de gran ayuda. Problema solucionado. Un saludo  :laugh: ;-)