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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  El programa no entra en este "if"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: El programa no entra en este "if"  (Leído 1,427 veces)
juligarc10

Desconectado Desconectado

Mensajes: 47


Ver Perfil
El programa no entra en este "if"
« en: 6 Diciembre 2018, 17:36 pm »

Hola amigos.

Estoy haciendo un proyecto en el cual debemos hacer un programa de gestion de un banco, y una de las opciones que tenemos que habilitar al programa es para eliminar clientes, yo lo he habilitado para que permita buscar a los clientes por DNI o por Numero de cuenta.
El problema en este codigo, en el cual pretendo comparar la longitud de una cadena con un entero dentro de un if, el programa no lo "coge". Esto se ve en el "case 2", que es donde lo estoy intentando implementar primero (cuando funcione irá en los dos case). Es el if en el cual si se cumple, tendrá que ejecutar el cout<<"Se ha detectado un error en el formato de escritura. Escriba de nuevo: "<<endl;

Por favor, ayuda. Espero que no les resulte mucho problema por tantas variables que hay.

Código:
setClientes eliminarClientes (setClientes variosClientes ){
int menu1();
bool x=false;
int n=variosClientes.numClientes,i=0, opcion1;
char comparacionDNI[22];
char comparacionCuenta[22];
    opcion1=menu1();
    switch (opcion1) {
    case 1:
        do{
        x=true;
        leerCadena("Introduzca el DNI\n",comparacionDNI);
        for(int i=0;i<n;i++){
            if (strcmp(variosClientes.Clientes[i].DNI, comparacionDNI)==0){
            cout<<"DNI valido"<<endl;
            x==false;
            for(int j=i;j<n;j++){
                variosClientes.Clientes[j] = variosClientes.Clientes[j+1];
            }break;}
            else if(x==true&&i==(n-1)){
                i++;
                cout<<"Este DNI no existe en nuestros datos"<<endl;
                x==true;
            }
            }}while(x==true);

        break;
    case 2:
        do{
            int t=10, p=0;
            x=true;
        leerCadena("Introduzca el numero de cuenta\n", comparacionCuenta);
        for(int i=0;i<n;i++){
            p=strlen(comparacionCuenta);
            if (p!=t){
                cout<<"Se ha detectado un error en el formato de escritura. Escriba de nuevo: "<<endl;
                }
            else if (strcmp(variosClientes.Clientes[i].numCuenta, comparacionCuenta)==0){
                cout<<"DNI valido"<<endl;
                x==false;
        }
                else if(x=true&&i==n-1){
                    i++;
                    cout<<"Este DNI no existe en nuestros datos"<<endl;
                for(int j=i;j<n;j++){
                    variosClientes.Clientes[j] = variosClientes.Clientes[j+1];
               }}}}
        while(x!=false);
            break;
    }

cout<<"\nEl cliente ha sido eliminado del sistema";
variosClientes.numClientes--;
return variosClientes;
}


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: El programa no entra en este "if"
« Respuesta #1 en: 6 Diciembre 2018, 18:03 pm »

No entiendo esto:
Código
  1. int menu1();

Este trozo de código creo que no tiene ni pies ni cabeza. Si <i> vale uno menos que <n>, incrementas <i> (ahora <i  == n>) y asignas el valor de <i> a <j> y mientras <j> sea menor que <n> (cosa que ya no es ya que <j == n>)... da igual lo que haga después ya que no se va a hacer.
Código
  1. else if(x=true&&i==n-1){
  2.                    i++;
  3.                    cout<<"Este DNI no existe en nuestros datos"<<endl;
  4.                for(int j=i;j<n;j++){
  5.                    variosClientes.Clientes[j] = variosClientes.Clientes[j+1];

Además de eso tienes algunos errores de asignación y comparación. Un igual "=" para asignar un valor <x = false>. Dos iguales "==" para comparar un valor <x == false>. En algunos trozos del programa los usas al revés.

Aparte de eso tener un <while(x == true)> equivale a tener <while(x)> y tener un <while(x == false)> equivale a tener <while(!x)>. Así es más fácil de ver.

También es recomendable en programas con muchas variables sobre todo usar nombres que te ayuden a ver qué hace esa variable ya que yo veo de repente una "t" o una "p" y tengo que ir arriba para ver que era eso.

Tampoco sé cómo has implementado las funciones de lectura que aparecen por ahí entonces no soy capaz de ver cuál es el error. Ya que tampoco sé exactamente cuál es el error, si quieres puedes probar a meter un par de <cout> con las variables que estás comparando en el <if> y así ver cuánto valen y poder encontrar el error.


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: El programa no entra en este "if"
« Respuesta #2 en: 6 Diciembre 2018, 19:55 pm »

Me he tomado la libertad de refactorizar tu función y me ha quedado algo así:

Código
  1. setClientes eliminarClientes (setClientes variosClientes ) {
  2.    bool encontrado = false;
  3.    int i;
  4.    char entradaDatos[22];
  5.  
  6.    const int tamNumCuenta = 10;
  7.  
  8.    switch(menu1()) {
  9.    case 1:
  10.        leerCadena("Introduzca el DNI\n", entradaDatos);
  11.        for(i=0; i<variosClientes.numClientes; i++) {
  12.            if(strcmp(variosClientes.Clientes[i].DNI, entradaDatos)==0) {
  13.                encontrado = true;
  14.                break;
  15.            }
  16.        }
  17.        break;
  18.  
  19.    case 2:
  20.        leerCadena("Introduzca el numero de cuenta\n", entradaDatos);
  21.        if(strlen(entradaDatos) != tamNumCuenta) {
  22.            cout<<"El número de cuenta introducido no tiene el formato correcto."<<endl;
  23.        }
  24.        else {
  25.            for(i=0; i<variosClientes.numClientes; i++) {
  26.                if(strcmp(variosClientes.Clientes[i].numCuenta, entradaDatos)==0) {
  27.                    encontrado = true;
  28.                    break;
  29.                }
  30.            }
  31.        }
  32.        break;
  33.    }
  34.  
  35.    if(encontrado) {
  36.        cout<<"\nEl cliente ha sido eliminado del sistema";
  37.        for(int j=i; j<variosClientes.numClientes-1; j++) {
  38.            variosClientes.Clientes[j] = variosClientes.Clientes[j+1];
  39.        }
  40.        --variosClientes.numClientes;
  41.    }
  42.  
  43.    return variosClientes;
  44. }

Puede haber errores, no la he probado.
Parte importante: pon el prototipo int menu1(); fuera de la función, justo después de los includes. Los prototipos no se ponen dentro de las funciones, se puede pero muy mala práctica.
He quitado los bucles porqué no querrás que tu cliente se encuentre en un bucle sin fin si le han pasado un DNI o cuenta que no está en la tabla y se vea obligado a eliminar una entrada buena sólo para que el programa siga ejecutando.

Por otra parte: recibes toda la estructura de datos y devuelves toda la estructura de datos. Depende de lo grande que sea eso es mucho movimiento de datos. Te convendría usar referencias o punteros.
Además: a menos que copies en otro sitio una la nueva estructura modificada te convendría hacer que la función modificara la estructura del argumento directamente.
« Última modificación: 6 Diciembre 2018, 19:59 pm por MAFUS » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: El programa no entra en este "if"
« Respuesta #3 en: 6 Diciembre 2018, 22:20 pm »

Si no necesitas conservar el orden, al momento de borrar puedes copiar el ultimo en el lugar del borrado, en vez de mover todos 1 lugar.

Ejemplo: Borrar "c"

[ a b c d e f ]    moviendo f al lugar de c.

queda:

[ a b f d e ]

En codigo:

Código
  1.     variosClientes.Clientes[i] = variosClientes.Clientes[variosClientes.numClientes-1];
  2.     --variosClientes.numClientes;
  3.  
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines