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)
| | |-+  Cajero automatico
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cajero automatico  (Leído 1,549 veces)
matver

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Cajero automatico
« en: 13 Marzo 2018, 13:51 pm »

Hola gente estoy aprendiendo POO con el problema del cajero automático. Me encuentro con el siguiente problema: Con setMonto inicio la cuenta en 2000, con SetRetiro quito de la cuenta 500 y hasta hay funciona bien pero cuando con SetDeposito intento agregar 100 a los 1500 que hasta hay estan en la cuenta cuando imprimo el saldo no son 1600 como yo creo sino que imprime 2100.


Código
  1. #include <iostream>
  2. using namespace std;
  3. class Cliente{
  4.     public:
  5.  
  6.     void setMonto (int mm) {m=mm;}
  7.     void setRetiro (int rr) {r=rr;}
  8.     void setDeposito (int dd) {d=dd;}
  9.  
  10.    int getMonto(void) {
  11.       return m;
  12. }
  13.    int getRetiro(void) {
  14.       r=m-r;
  15.         return r;
  16. }
  17.    int getDeposito(void) {
  18.       d=m+d;
  19.       return d;
  20. }
  21.  
  22. private:
  23.  
  24. int m,r,d;
  25. };
  26.  
  27. int main (void){
  28. Cliente p1;
  29. p1.setMonto(2000);
  30. p1.setRetiro(500);
  31. p1.setDeposito(100);
  32. cout <<"El saldo es: "<<p1.getMonto()<<endl;
  33. cout <<"El saldo es: "<<p1.getRetiro()<<endl;
  34. cout <<"El saldo es: "<<p1.getDeposito()<<endl;
  35.  
  36. }
  37.  
  38.  
  39.  


me funciona bien si modifico este metodo:
 int getDeposito(void) {
       d=r+d;
       return d;
}
ahora la pregunta es,¿ si es correcto proceder así?


« Última modificación: 13 Marzo 2018, 13:55 pm por matver » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.355


Ver Perfil
Re: Cajero automatico
« Respuesta #1 en: 13 Marzo 2018, 15:26 pm »

Hay propiedades que no deben ser de lectura y escritura...

Monto es un propiedad que requiere ser de lectura y escritura, pero deposito y retiro, deben serlo de solo escritura... esto es, una función única.

Código:
entero m

entero = propiedad lectura monto
  devolver m
fin propiedad
    propiedad escritrua Monto(entero valor)
        m= valor
    fin propiedad

funcion Retiro(entero valor)
   m -= valor
fin funcion

funcion Deposito(entero valor)
  m +=valor
fin funcion

Como ves es más sencillo...
Fíjate que si el valor a retirar es superior al monto, la cuenta quedará en números rojos...
Al caso podría añadirse funcionalidad para indicar si se permite retirar dejando la cuenta en números rojos o no, y si se permite números rojos si hay un límite...
Te pongo lo primero, y te dejo que tu realices lo segundo:

Código:
buleano rojo

buleano = propiedad PermitirCuentaNumerosRojos
    devolver rojo
fin propiedad
    propiedad PermitircuentaNumerosRojos(buleano r)
        rojo = r
    fin propiedad

// esto afecta a la función retiro. Ahora devuelve un buleano indicando si se efectuó o no el retiro, y el retiro sólo se lleva a cabo condicionado por la propiedad previa...
buleano = funcion Retiro(entero valor)
    si (rojo=TRUE)
        si (valor < m)
            m -=valor
            devolver TRUE
        sino
            devolver FALSE
        fin si
    sino
        m -= valor
        devolver TRUE
    fin si
fin funcion

Otra cosa es que puedas retener la última (ó x últimas) operaciones efectuadas...  por eso, comentado:
cout <<"El saldo es: "<<p1.getMonto()<<endl; <---- perfecto, OK
cout <<"El saldo es: "<<p1.getRetiro()<<endl; <---- carece de sentido
cout <<"El saldo es: "<<p1.getDeposito()<<endl; <---- carece de sentido

A cambio deberías teneruna propiedad llamada UltimaOperacion

Código:
entero ct
string op
string = Propiedad lectura UltimaOperacion
    devolver op
fin propiedad

entero = propiedad lectura UltimaCantidad
    devolver ct
fin propiedad

// y modificar lo previo...
...escritura monto(...)
    m = valor
    op = "Monto"
    ct = valor
fin propiedad

... Retiro( ... valor)
   m -= valor
   op = "Retiro
   ct = valor
fin funcion

... Deposito( ... valor)
    m += valor
    op = "Deposito"
    ct = valor
fin funcion
Ahora ya puedes consultar además del saldo, la última operación y el valor de dicha operación... nota que leer el saldo, no se considera una operación, porque nunca  modifica ningún valor (por el mero hecho de consultarse).


« Última modificación: 13 Marzo 2018, 15:37 pm por NEBIRE » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Cajero automatico
« Respuesta #2 en: 13 Marzo 2018, 23:23 pm »

No soy de C++, lo he visto de pincelada, lo mio es el C.

Pero a mi modo de ver el cliente solo debería guardar su saldo, aumentarlo o disminuirlo. Para más seguridad estas deberían ser incluso operaciones privadas a las que no se pudieran acceder desde ningún lugar, solo desde el cajero. Deberían ser funciones amigas.

El encargado de ingresar, retirar o ver el capital del cliente es el cajero y de éste dependen las reglas para hacerlo. Por ejemplo: si se intenta sacar más del capital que hay la operación falla.

Algo así:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Cliente{
  5. public:
  6.    Cliente() {
  7.        capital = 0;
  8.    }
  9.  
  10.    double obtenerCapital() {
  11.        return capital;
  12.    }
  13.  
  14.    void ingreso(double cantidad) {
  15.        capital += cantidad;
  16.    }
  17.  
  18.    void retiro(double cantidad) {
  19.        capital -= cantidad;
  20.    }
  21.  
  22. private:
  23.    double capital;
  24. };
  25.  
  26. class Cajero {
  27. public:
  28.    Cajero() {
  29.        _cliente = NULL;
  30.    }
  31.  
  32.    void nuevoCliente(Cliente &cliente) {
  33.        _cliente = &cliente;
  34.    }
  35.  
  36. #define SI_HAY_CLIENTE() if(!_cliente) { \
  37.     cout << "No hay un cliente definido para realizar esta accion." << endl; \
  38.     return; } else ;
  39.  
  40. #define SI_TIENE_PERMISO(permiso, mensajeError) if(!permiso) { \
  41.     cout << "Operacion denegada.\nRazon: " << mensajeError << "\n" << endl; \
  42.     return; } else ;
  43.  
  44.    void ingreso(double cantidad) {
  45.        bool permiso = true;
  46.        string razon = "";
  47.  
  48.        SI_HAY_CLIENTE() {
  49.            // Condiciones que permiten el ingreso. Si no es posible
  50.            // hacer permiso false y rellenar la razón
  51.  
  52.            SI_TIENE_PERMISO(permiso, razon) {
  53.                _cliente->ingreso(cantidad);
  54.                cout << "Ingresados " << cantidad << " creditos.\n" << endl;
  55.            }
  56.        }
  57.    }
  58.  
  59.    void retiro(double cantidad) {
  60.        bool permiso = true;
  61.        string razon = "";
  62.  
  63.        SI_HAY_CLIENTE() {
  64.            // Condiciones que permiten el retiro. Si no es posible
  65.            // hacer permiso false y rellenar la razón
  66.            // Un ejemplo sería que no hubiera suficiente capital
  67.  
  68.            if(cantidad > _cliente->obtenerCapital()) {
  69.                permiso = false;
  70.                razon = "No hay capital suficiente para realizar esta operacion.";
  71.            }
  72.  
  73.            SI_TIENE_PERMISO(permiso, razon) {
  74.                _cliente->retiro(cantidad);
  75.                cout << "Retirados " << cantidad << " creditos de la cuenta.\n" << endl;
  76.            }
  77.        }
  78.    }
  79.  
  80.    void obtenerCapital() {
  81.        SI_HAY_CLIENTE()
  82.            cout << "Capital actual: " << _cliente->obtenerCapital() << " creditos.\n" << endl;
  83.    }
  84.  
  85. #undef SI_TIENE_PERMISO
  86. #undef HAY_CLIENTE
  87.  
  88.    void cerrarCliente() {
  89.        _cliente = NULL;
  90.    }
  91.  
  92. private:
  93.    Cliente *_cliente;
  94. };
  95.  
  96. int main() {
  97.    Cliente p1;
  98.    Cajero cajero;
  99.  
  100.    cajero.nuevoCliente(p1);
  101.  
  102.    cajero.ingreso(2000);
  103.    cajero.retiro(500);
  104.    cajero.obtenerCapital();
  105.    cajero.ingreso(100);
  106.    cajero.obtenerCapital();
  107.    cajero.retiro(3000);
  108.    cajero.obtenerCapital();
  109.    cajero.cerrarCliente();
  110.    cajero.obtenerCapital();
  111.  
  112.    return 0;
  113. }
« Última modificación: 14 Marzo 2018, 01:21 am por MAFUS » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Cooler de Cajero Automatico.
Hardware
Elemental Code 3 5,096 Último mensaje 21 Octubre 2010, 13:34 pm
por APOKLIPTICO
[Ayuda] Cajero automatico en C++
Programación C/C++
Lobialkon 1 10,324 Último mensaje 17 Octubre 2016, 19:48 pm
por eduardo1012
ayuda cajero automatico « 1 2 »
Programación Visual Basic
themindmaster 16 6,899 Último mensaje 22 Septiembre 2013, 15:48 pm
por themindmaster
Cajero automatico
Programación Visual Basic
ellandax 2 4,048 Último mensaje 5 Noviembre 2013, 21:04 pm
por dainodaibouken
Cajero automatico MEXICO
Análisis y Diseño de Malware
n3n3 3 4,790 Último mensaje 23 Noviembre 2014, 03:00 am
por r32
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines