Foros del Web » Programación para mayores de 30 ;) » C/C++ »

cambiar valor de return

Estas en el tema de cambiar valor de return en el foro de C/C++ en Foros del Web. Hola que tal, estoy haciendo una clase para registrar empleados y para iniciar sesión, y lo que quiero hacer es que si el nombre de ...
  #1 (permalink)  
Antiguo 18/11/2013, 23:39
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 14 años, 8 meses
Puntos: 5
cambiar valor de return

Hola que tal, estoy haciendo una clase para registrar empleados y para iniciar sesión, y lo que quiero hacer es que si el nombre de usuario y contraseña con correctos me muestre varias opciones, la verdad no se como hacerlo bien pero yo lo estoy intentado de esta manera pero no me funciona, les dejo el código abajo haber si me pueden ayudar a resolver mi problema.

Saludos y gracias de antemano : adios:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. class Empleado {
  8.     public:
  9.         void registrar();
  10.         void iniciar_sesion( char *, char * );
  11.         int estado() { return 0; }
  12.        
  13.     private:
  14.         char usuario[ 22 ], contrasena[ 22 ];
  15. } e;
  16.  
  17. void Empleado::registrar() {
  18.     int bandera = 0;
  19.     char comprobar_usuario[ 22 ];
  20.    
  21.     ifstream leer_empleados( "empleados.txt", ios::in | ios::app );
  22.    
  23.     if( leer_empleados.fail() ) {
  24.         cout << "\nError al leer el archivo empleados.txt" << endl;
  25.     } else {
  26.         cout << "Usuario: "; cin >> comprobar_usuario;
  27.        
  28.         while( !leer_empleados.eof() ) {
  29.             leer_empleados.read( (char*)&e, sizeof( e ) );
  30.            
  31.             if(leer_empleados.eof()) {
  32.                 break;
  33.             }
  34.            
  35.             if( strcmp( usuario, comprobar_usuario ) == 0 ) {
  36.                 bandera = 1;
  37.             }
  38.         }
  39.         leer_empleados.close();
  40.        
  41.         if( bandera == 1 ) {
  42.             cout << "\nEl nombre de usuario ya esta en uso" << endl;
  43.         } else {
  44.             ofstream escribir_empleados( "empleados.txt", ios::binary | ios::app );
  45.            
  46.             strcpy( usuario, comprobar_usuario );
  47.             cout << "Contraseña: "; cin >> contrasena;
  48.            
  49.             escribir_empleados.write( (char *) &e, sizeof( e ) );
  50.             escribir_empleados.close();
  51.         }
  52.     }
  53. }
  54.  
  55. void Empleado::iniciar_sesion( char comprobar_usuario[ 22 ], char comprobar_contrasena[ 22 ] ) {
  56.     int bandera = 0, opcion;
  57.    
  58.     ifstream leer_empleados( "empleados.txt", ios::in );
  59.    
  60.     if( leer_empleados.fail() ) {
  61.         cout << "\nError al leer el archivo empleados.txt" << endl;
  62.     } else {
  63.         while( !leer_empleados.eof() ) {
  64.             leer_empleados.read( (char*)&e, sizeof( e ) );
  65.            
  66.             if(leer_empleados.eof()) {
  67.                 break;
  68.             }
  69.            
  70.             if( strcmp( usuario, comprobar_usuario ) == 0 ) {
  71.                 if( strcmp( contrasena, comprobar_contrasena ) == 0 ) {
  72.                     //CAMBIAR VALOR DEL RETURN A 1
  73.  
  74.                 }
  75.             }
  76.         }
  77.         leer_empleados.close();
  78.     }
  79. }
  80.  
  81.  
  82. main() {
  83.     char comprobar_usuario[ 22 ], comprobar_contrasena[ 22 ];
  84.    
  85.     cout << "NOMBRE DE USUARIO: "; cin >> comprobar_usuario;
  86.     cout << "CONTRASEÑA: "; cin >> comprobar_contrasena;
  87.    
  88.     e.iniciar_sesion( comprobar_usuario, comprobar_contrasena );
  89.  
  90.  
  91.     //Si el valor de return es 1 miestra opciones
  92.     if( e.estado() == 1 ) {
  93.         cout << "\nSe ha iniciado sesion correctamente" << endl;
  94.                 cout << "\nOpcion 1" << endl;
  95.                 cout << "Opcion 2" << endl;
  96.  
  97.     } else {
  98.         cout << "\nError al iniciar sesion" << endl;
  99.     }
  100.    
  101.     return 0;
  102. }
  #2 (permalink)  
Antiguo 19/11/2013, 06:21
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: cambiar valor de return

Puedes usar otro flag de estado como el que tienes en 'registrar()', pero este será privado y ademas será el valor de retorno de la funcion 'estado()' (que puedes modificar el tipo para que retorne bool en vez de entero)

En la clase añades el flag privado:

Código C++:
Ver original
  1. bool flag_session_status;

Seguramente se iniciará el flag a 0, pero si quieres asegurarte añades el constructor de la clase y reinicias manualmente a 0:

Código C++:
Ver original
  1. Empleado::Empleado() {
  2.     flag_session_status = 0;
  3. }

Luego en el metodo 'iniciar_sesion()' si se consiguió iniciar la sesion asignas 1 al flag de estado, o en caso de error restauras a 0; y lo mismo para finalizar la sesion.

Finalmente modificas el metodo estado para que te retorne el flag de estado que será un indicador de la sesion:

Código C++:
Ver original
  1. bool Empleado::estado() {
  2.     return flag_session_status;
  3. }

Y para que quede redondo puedes añadir un entero a modo de ultimo error, de forma que si durante el inicio de sesion falla el nombre de usuario asignas (por ejemplo) 1 al ultimo error, si falla la contraseña asignas 2, si falla el acceso a la base de datos asignas 3; de esta forma ante cualquier error reseteas el flag de estado de la sesion a 0 y determinas un numero de error, luego en el main si el metodo 'estado()' te retorna 0 (es decir si no pudo iniciar la sesion) llamas al metodo 'get_last_error()' y recibes el numero de error, de forma que sabes lo que falló; junto con esto declaras una lista de errores posibles y una lista de descripciones textuales del error y asi compactas el manejo de errores:


Código C++:
Ver original
  1. enum SESSION_ERROR_INDEX {
  2.     ERROR_SUCCESS,
  3.     ERROR_MISSINGNAME,
  4.     ERROR_WRONGNAME,
  5.     ERROR_COUNT
  6. };
  7.  
  8. static char *SESSION_ERROR_MESSAGES[ERROR_COUNT] = {
  9.     "No error",
  10.     "Missing name",
  11.     "User name does not exist"
  12. };
  13.  
  14. bool Empleado::iniciar_sesion(char *name) {
  15.  
  16.     //comprueba que recibe un nombre
  17.     if(!name || strlen(name) <= 0) {
  18.         flag_session_status = 0;
  19.         last_error = ERROR_MISSINGNAME;
  20.         return flag_session_status;
  21.     }
  22.    
  23.     //evalua el nombre contra la base de datos
  24.     if(strcmp(name, "qwe")) {
  25.         flag_session_status = 0;
  26.         last_error = ERROR_WRONGNAME;
  27.         return flag_session_status;
  28.     }
  29.    
  30.     //inicio correcto
  31.     flag_session_status = 1;
  32.     last_error = ERROR_SUCCESS;
  33.    
  34.     return flag_session_status;
  35. }
  36.  
  37.  
  38. bool Empleado::estado() {
  39.     return flag_session_status;
  40. }
  41.  
  42.  
  43. int Empleado::get_last_error() {
  44.     return last_error;
  45. }
  46.  
  47.  
  48. char *Empleado::get_last_error_message() {
  49.     return SESSION_ERROR_MESSAGES[last_error];
  50. }

Ahora el estado del inicio lo puedes comprobar directamente desde el metodo 'iniciar_sesion()' , y puedes dejar el metodo 'estado()' para siguientes comprovaciones:
Código C++:
Ver original
  1. if(e.iniciar_sesion("qwe")) {
  2.     printf("%s", get_last_error_message());
  3. }

*Nota: normalmente se usa el 0 como ejecucion sin error y >0 como indice de error.

Es solo una idea de implementacion para la clase, hay mas formas de hacerlo.

Saludos
vosk
  #3 (permalink)  
Antiguo 20/11/2013, 00:04
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 14 años, 8 meses
Puntos: 5
Respuesta: cambiar valor de return

Hola que tal, gracias por responder. La verdad no tengo mucha experiencia en c y con lo que te entendí modifique así mi código, pero siempre me sale que inicie sesión correctamente. Si me puedieras ayudar a corregir esto te lo agradecería demasiado. Saludos

Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. class Empleado {
  8.     public:
  9.         Empleado();
  10.         void registrar();
  11.         void iniciar_sesion( char *, char * );
  12.         bool estado();
  13.        
  14.     private:
  15.         bool flag_session_status;
  16.         char usuario[ 22 ], contrasena[ 22 ];
  17. } e;
  18.  
  19. Empleado::Empleado() {
  20.     flag_session_status = 0;
  21. }
  22.  
  23. bool Empleado::estado() {
  24.     return flag_session_status;
  25. }
  26.  
  27. void Empleado::registrar() {
  28.     int bandera = 0;
  29.     char comprobar_usuario[ 22 ];
  30.    
  31.     ifstream leer_empleados( "empleados.txt", ios::in | ios::app );
  32.    
  33.     if( leer_empleados.fail() ) {
  34.         cout << "\nError al leer el archivo empleados.txt" << endl;
  35.     } else {
  36.         cout << "Usuario: "; cin >> comprobar_usuario;
  37.        
  38.         while( !leer_empleados.eof() ) {
  39.             leer_empleados.read( (char*)&e, sizeof( e ) );
  40.            
  41.             if(leer_empleados.eof()) {
  42.                 break;
  43.             }
  44.            
  45.             if( strcmp( usuario, comprobar_usuario ) == 0 ) {
  46.                 bandera = 1;
  47.             }
  48.         }
  49.         leer_empleados.close();
  50.        
  51.         if( bandera == 1 ) {
  52.             cout << "\nEl nombre de usuario ya esta en uso" << endl;
  53.         } else {
  54.             ofstream escribir_empleados( "empleados.txt", ios::binary | ios::app );
  55.            
  56.             strcpy( usuario, comprobar_usuario );
  57.             cout << "Contraseña: "; cin >> contrasena;
  58.            
  59.             escribir_empleados.write( (char *) &e, sizeof( e ) );
  60.             escribir_empleados.close();
  61.         }
  62.     }
  63. }
  64.  
  65. void Empleado::iniciar_sesion( char comprobar_usuario[ 22 ], char comprobar_contrasena[ 22 ] ) {
  66.     int bandera = 0, opcion;
  67.    
  68.     ifstream leer_empleados( "empleados.txt", ios::in );
  69.    
  70.     if( leer_empleados.fail() ) {
  71.         cout << "\nError al leer el archivo empleados.txt" << endl;
  72.     } else {
  73.         while( !leer_empleados.eof() ) {
  74.             leer_empleados.read( (char*)&e, sizeof( e ) );
  75.            
  76.             if(leer_empleados.eof()) {
  77.                 break;
  78.             }
  79.            
  80.             if( strcmp( usuario, comprobar_usuario ) == 0 ) {
  81.                 if( strcmp( contrasena, comprobar_contrasena ) == 0 ) {
  82.                    
  83.                     flag_session_status = 1;
  84.                    
  85.                 }
  86.             }
  87.         }
  88.         leer_empleados.close();
  89.     }
  90. }
  91.  
  92.  
  93. main() {
  94.    
  95.     char comprobar_usuario[ 22 ], comprobar_contrasena[ 22 ];
  96.    
  97.     cout << "NOMBRE DE USUARIO: "; cin >> comprobar_usuario;
  98.     cout << "CONTRASEÑA: "; cin >> comprobar_contrasena;
  99.    
  100.     e.iniciar_sesion( comprobar_usuario, comprobar_contrasena );
  101.    
  102.     if( e.estado() == 1 ) {
  103.         cout << "\nSe ha iniciado sesion correctamente" << endl;
  104.     } else {
  105.         cout << "\nError al iniciar sesion" << endl;
  106.        
  107.     }
  108.    
  109.     return 0;
  110. }

Etiquetas: funcion, int, nombre, return, string, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:44.