elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  do while actua en bucle continuo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: do while actua en bucle continuo  (Leído 2,414 veces)
juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
do while actua en bucle continuo
« 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);}


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #1 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)){


En línea

juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #2 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.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #3 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.
En línea

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


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: do while actua en bucle continuo
« Respuesta #4 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.
« Última modificación: 4 Diciembre 2018, 16:40 pm por CalgaryCorpus » En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #5 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
En línea

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


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #6 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á.
En línea

juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
Re: do while actua en bucle continuo
« Respuesta #7 en: 5 Diciembre 2018, 12:44 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Papel continuo personalizado XP
Programación Visual Basic
F7 1 4,725 Último mensaje 21 Marzo 2007, 00:54 am
por CeLaYa
Duda (Parar bucle con dato boolean) [bucle while]
Java
Dem0ny 5 18,600 Último mensaje 17 Diciembre 2008, 17:43 pm
por Dem0ny
[PYTHON] Fallo continuo con raw_input
Scripting
Linton 4 5,145 Último mensaje 16 Febrero 2013, 07:59 am
por Linton
Evitar Escaneo continuo puerto 80
Seguridad
Cronck 5 5,993 Último mensaje 22 Enero 2014, 18:26 pm
por Platanito Mx
Conteo continuo con Batch (Ayuda)
Scripting
Mr. Bit 7 3,605 Último mensaje 9 Marzo 2024, 20:48 pm
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines