Aprendiendo C - Proyecto banco

B

Hola, estoy aprendiendo C/C++ con "Curso de programación C/C++" de Miguel Ángel Acera. He aprendido algunas cosillas que he implementado en este codigo. Simula las funciones mas basicas de un cajero automatico. Se que hay errores, como el bucle de 'Error', pero repito estoy aprendiendo.

¡Quiero vuestras ideas para que las pueda implementar y asi tener muchas mas cosas que añadirle a este proyecto! Espero que me mencioneis lo que no os gusta, lo que podria cambiar (o deberia cambiar) y las malas practicas que hayais observado. Estoy abierto a todos los comentarios!

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;

int main (void) {

char nombre [20];
int eleccion;
int deposito;
int balance = 0;
int retiro = balance - retiro;


printf("¡Bienvenido a Vida Bank!");

printf("\n¿Como te llamas? ");
    fflush(stdin);
    fgets(nombre, 20, stdin);
        //Esta linea de codigo elimina el /n final de fgets()
        nombre[strlen(nombre)-1]='\0';

printf("Hola %s, para acceder al menu debes de crear una cuenta.\n", nombre);
printf("Presiona 'G' para crear una cuenta");

int c;
c = fgetc(stdin);

do {
    if ((c == 'G') || (c == 'g')) {

do {
"\n";

printf("\n1. DEPOSITAR DINERO");
printf("\n2. SACAR DINERO");
printf("\n3. CONSULTAR BALANCE");
printf("\n4. SALIR\n\n");

printf("ELIGE UNA OPCION: ");
    scanf("%d", &eleccion);

switch (eleccion) {

    case 1: printf("\n¿CUANTO DINERO QUIERES DEPOSITAR? ");
                scanf("%d", &deposito);
                    printf("\nHAS DEPOSITADO %d€\n", deposito);
    break;

    case 2: printf("¿CUANTO DINERO QUIERES RETIRAR? ");
                scanf("%d", &retiro);
                    printf("HAS RETIRADO %d€\n", retiro);
    break;

    case 3: printf("\nTU BALANCE ES DE %d€", (balance + deposito) - retiro);
    break;

    case 4: printf("¡ADIOS %s!", nombre);
        exit(0);
    break;

    default: printf("\n\n¿QUE HAS PRESIONADO? INTENTALO DENUEVO\n");
}
    }

while (true);



}
else {
    printf("Error.");
}
} while (true);





}

¡Muchas gracias!

B

Hoy mientras hacia el proyecto, lo que mas aprendi fue el uso por encima de scanf() de fgets() y fgetc(). Tambien algo de los buffers (pero no me quedo muy claro), y puse en practica algunos bucles anidados (o eso quiero pensar que hice jaja).

Rebuscando para ver como quitar el /n que salia al final de un fgets(), descubri esta linea en un foro /

/Esta linea de codigo elimina el /n final de fgets()
        nombre[strlen(nombre)-1]='\0';

Pero no se enrealidad como funciona. Calcula el numero de caracteres de nombre (strlen) y le resta 1, en el array de nombre la posicion 0 es la de /n, entonces se la quita. Es asi?

2 respuestas
EnderFX

#2 Estás cambiando el valor del último elemento del string (la última referencia de ese array de punteros) por \0 que es el terminador nulo, sobreescribiendo el \n que habría en ese lugar.

Como consejos: lo primero, estructura el código mejor, es bastante infernal de leer. Créate funciones que te impriman el menú y te devuelvan como int lo que se ha leído, por ejemplo. Luego, las variables y funciones normalmente se suelen nombrar en inglés (como práctica habitual), los comentarios como quieras. Si quieres seguir prácticando, intenta crearte un struct que represente la cuenta y guarde transacciones también. Hace años que no toco C pero básicamente la experiencia era: aprender a manejar punteros, punteros, punteros a punteros, reservar y liberar memoria y crear más punteros a punteros a más arrays de punteros all day long.

1 respuesta
ShodawN

#2 La línea básicamente está cambiando el último carácter del array...

JuAn4k4

Te recomiendo partir en funciones/métodos las cositas (y lo hagas en inglés):

Por ejemplo:

int main (void) {
  printf("¡Bienvenido a Vida Bank!");
  char* username = readName();
  char* account = registerAccount(username);
  if (account == null) {
    exit(1);
  }
  menu(username, account);
}

Y así, con todo, tendrás funciones más cortas que serán más fáciles de leer y entender qué hacen.

1
aIvans

Yo lo que haría para declarar los valores del usuarios sería esto.

typedef struct { 
    float deposit;
    float balance;
} BankAccount;

typedef struct{ 
  char name[20]; 
  BankAccount userAccount;
} Person;

Al menos en C se que se puede usar, en C++ no se si es exactamente así.

1 respuesta
tirutu

#6 Ten en cuenta que C++ está hecho con la idea de que puedas usar todo lo de C, aunque se considere deprecado

Yo recomendaría empezar con una guía centrada específicamente en la sintaxis de C++( o solo C), porque mezclándolos al final te vas a hacer un lío y no vas saber cuál es de cuál.

1 respuesta
B

#7 Aunque el libro diga C/C++, intento solo utilizar cosas de C. ¿He puesto algo que sea de C++? :grinning:

2 respuestas
tirutu

#8 La librería <iostream> diría que es de C++

1 1 respuesta
aIvans

#8 Entonces puedes usar lo que te he pasado sin problema.

Intenta declarar todas las variables arriba.
No uses fgets para escanear un entero (la variable c) utiliza mejor scanf, aunque esa variable yo la hubiera declarado como un character.
Siempre inicializa las variables.
Elimina el salto de línea que tienes en medio del código (no lo estás usando).
En el do, cuando haces la comprobación de si es G o g tienes un bucle infinito.

Además estás usando muchas cosas de C++.

1 respuesta
B

#10 #9 ¡Muchisimas gracias!

JuAn4k4

Hazte un repo opensource en github, crea una rama con tu código, haces un PR a master y pides review.

¿Has probado a compilar y ejecutar el código? La linea 13 yo diría que no compila, y seguro que en ejecución explota.

int retiro = balance - retiro;

retiro la estas definiendo a la izquierda, no la puedes usar en la derecha.
Este calculo lo tienes que hacer cuando sepas cuanto dinero se retira y entiendo que se lo querras quitar al balance. (balance = balance - retiro).

Compila, ejecuta y debuggea.

1 respuesta
B

#12 Utilizo Code::Blocks, el libro esta utilizando este para los ejercicios y me va bien ;). Justo estoy aprendiendo mas afondo las funciones para estructurar mejor el código como me habeís sugerido tu y #3 .

Lo de github tiene muy buena pinta, nunca lo habría pensado (ni lo sabia directamente). Cuando termine el proyecto lo volvere a publicar aquí. Gracias!

Usuarios habituales