El programa no entra en este "if"

Iniciado por juligarc10, 6 Diciembre 2018, 17:36 PM

0 Miembros y 1 Visitante están viendo este tema.

juligarc10

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.

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;
}


K-YreX

No entiendo esto:
Código (cpp) [Seleccionar]

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 (cpp) [Seleccionar]

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];


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.
Código (cpp) [Seleccionar]

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

MAFUS

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

Código (c++) [Seleccionar]
setClientes eliminarClientes (setClientes variosClientes ) {
   bool encontrado = false;
   int i;
   char entradaDatos[22];
   
   const int tamNumCuenta = 10;
   
   switch(menu1()) {
   case 1:
       leerCadena("Introduzca el DNI\n", entradaDatos);
       for(i=0; i<variosClientes.numClientes; i++) {
           if(strcmp(variosClientes.Clientes[i].DNI, entradaDatos)==0) {
               encontrado = true;
               break;
           }
       }
       break;
       
   case 2:
       leerCadena("Introduzca el numero de cuenta\n", entradaDatos);
       if(strlen(entradaDatos) != tamNumCuenta) {
           cout<<"El número de cuenta introducido no tiene el formato correcto."<<endl;
       }
       else {
           for(i=0; i<variosClientes.numClientes; i++) {
               if(strcmp(variosClientes.Clientes[i].numCuenta, entradaDatos)==0) {
                   encontrado = true;
                   break;
               }
           }
       }
       break;
   }
   
   if(encontrado) {
       cout<<"\nEl cliente ha sido eliminado del sistema";
       for(int j=i; j<variosClientes.numClientes-1; j++) {
           variosClientes.Clientes[j] = variosClientes.Clientes[j+1];
       }
       --variosClientes.numClientes;
   }
   
   return variosClientes;
}


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.

CalgaryCorpus

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:

     variosClientes.Clientes[i] = variosClientes.Clientes[variosClientes.numClientes-1];
     --variosClientes.numClientes;

Aqui mi perfil en LinkedIn, invitame un cafe aqui