Autor
|
Tema: do while actua en bucle continuo (Leído 2,414 veces)
|
juligarc10
Desconectado
Mensajes: 47
|
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);}
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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)){
|
|
|
En línea
|
|
|
|
juligarc10
Desconectado
Mensajes: 47
|
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 que está dentro del if, parece que no lo tiene en cuenta, y que al llegar al , 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
|
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. 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. 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: 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: 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.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
CalgaryCorpus
|
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.
|
|
« Última modificación: 4 Diciembre 2018, 16:40 pm por CalgaryCorpus »
|
En línea
|
|
|
|
K-YreX
|
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.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
Como primera orden del if tienes una comparación, no una asignación 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
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Papel continuo personalizado XP
Programación Visual Basic
|
F7
|
1
|
4,725
|
21 Marzo 2007, 00:54 am
por CeLaYa
|
|
|
Duda (Parar bucle con dato boolean) [bucle while]
Java
|
Dem0ny
|
5
|
18,600
|
17 Diciembre 2008, 17:43 pm
por Dem0ny
|
|
|
[PYTHON] Fallo continuo con raw_input
Scripting
|
Linton
|
4
|
5,145
|
16 Febrero 2013, 07:59 am
por Linton
|
|
|
Evitar Escaneo continuo puerto 80
Seguridad
|
Cronck
|
5
|
5,993
|
22 Enero 2014, 18:26 pm
por Platanito Mx
|
|
|
Conteo continuo con Batch (Ayuda)
Scripting
|
Mr. Bit
|
7
|
3,605
|
9 Marzo 2024, 20:48 pm
por Tachikomaia
|
|