Conto Corrente

di il
18 risposte

Conto Corrente

Buonasera,
Devo sviluppare, un programma di gestione del conto corrente di n utenti. Ogni utente è identificato dal Cognome, Nome, numero del conto, lista movimenti, il programma deve permettermi di inserire un nuovo correntista a cui viene assegnato un codice univoco e visualizzare la lista movimenti di un dato correntista.

Io ho abbozzato un po il codice, ma mi da molti problemi. Potete darci un occhiata e darmi qualche indicazione sugli errori, grazie.


//Questo programma è stato realizzato per la gestione delle varie operazioni di un conto corrente(cc)
#include<stdio.h>
#include<stdlib.h>

void prelievo(float a,float saldo);
void versamento(float a,float saldo);
void stampa(int id_conto,char correntista,float saldo);
void crea(int id_conto,char correntista);
void inserisci_correntista(char nome,char cognome,int id_conto);

//Questo main si occupa della gestione generale del programma dove sono presenti sia le funzioni con i loro richiami per le esecuzioni sia il menu
int main(){
	int scelta;
	float a;
    int id_conto;
    float saldo;
    char correntista;
    char nome;
    char cognome;
//Questo ciclo do_while contiene le istruzioni necessarie per corretto funzionamento del menu di scelta dove vengono seleziona a scelta dell'utente
//le varie operazioni del conto corrente
	do{
        printf("1.Inserisci un nuovo correntista\n");
		printf("2.Prelievo\n");
		printf("3.Versamento\n");
		printf("4.Stampa dati del conto\n");
		printf("0.Esci\n");
		printf("Fai una scelta\n");
		scanf("%d",&scelta);
		switch(scelta){
			case 1:
				inserisci_correntista(nome,cognome,id_conto);
            break;
			case 2:
				printf("Inserire la cifra da prelevare\n");
				scanf("%f %f",&a,&saldo);
				prelievo(a,saldo);
			break;
			case 3:
				printf("Inserire la cifra da versare\n");
				scanf("%f %f",&a,&saldo);
				versamento(a,saldo);
			break;
			case 4:
				stampa(id_conto,correntista,saldo);
			break;
			case 5:
				crea(id_conto,correntista);
			break;
		}
	}
	while(scelta!=0);
	return(0);
}

//Questa function si occupa dell'inserimento di un nuovo correntista al quale viene assegnato un codice univoco(parte da fare con Dom)
void inserisci_correntista(char nome,char cognome,int id_conto){
     printf("*************** CORRENTISTA ***************\n\n");
     printf("Inserire il nome %c",nome);
     scanf("%c",&nome);
     printf("Inserire il cognome %c",cognome);
     scanf("%c",&cognome);
     printf("Inserire il numero del conto %d",id_conto);
     scanf("%d",&id_conto);
}


//Questa function realizza l'operazione del prelievo di una data cifra e verifica se è possibile appunto eseguire l'operazione
void prelievo(float a,float saldo){
    if(saldo>a){
        saldo=saldo-a;
        printf("Il saldo attuale e' di euro e' %f",saldo);
        }else{
            printf("Non e' possibile effetuare il prelievo di una cifra superiore al saldo attuale che ammonta a euro %f\n",saldo);
			}
}
//Questa function realizza l'operazione del versamento di una data cifra
void versamento(float a,float saldo){
    saldo=saldo+a;
    printf("Il saldo attuale e' di euro %f",saldo);
}
//Questa fucntion realizza la visualizzazione dei dati del conto corrente
void stampa(int id_conto,char correntista,float saldo){
    printf("Numero conto %d",id_conto);
    printf("Correntista %c",correntista);
    printf("saldo %f",saldo);
}
//Questa function realizza la creazione/apertura di un nuovo conto corrente
void crea(int id_conto,char cognome){
    printf("Inserire numero conto %d",id_conto);
    scanf("%d",&id_conto);
    printf("Inserire il cognome del correntista %c",cognome);
    scanf("%c",&cognome);
}

18 Risposte

  • Re: Conto Corrente

    Il codice che hai scritto NON HA SENSO: non serve nemmeno andare nel dettaglio. E' CONCETTUALMENTE SBAGLIATO.

    PRIMA ragiona con carta e matita (MA SUL SERIO, non e' solo un modo di dire), sui seguenti punti:

    1) QUALI SONO le funzionalita'' che ti servono?
    2) QUALI SONO le strutture dati che ti servono per soddisfare le sudette funzionalita'?
    3) prova a fare degli esercizi MENTALI sulla validita' delle struture dati e delle funzionalita'

    SOLO A QUESTO PUNTO puoi iniziare a pensare di scrivere il codice.

    GIA' come hai definiti 'prelievo' e 'versamento' NON HANNO SENSO!

    1) CHI preleva e CHI versa?
    2) il controllo del saldo NON E' a carichi di chi preleva o versa, MA DI QUALCUN ALTRO !!!!

    Pensa: chiedi il prelievo di 1.000.000 di euro e allo stesso tempo richiedi che il tuo saldo sia di 10.000.000 di euro
    E chi te lo fa fare di studiare/andare a lavorare ?

    Non scherzavo!! CARTA E MATITA, o, se vuoi, CARTA E PENNA !!!!

    NIENTE CODICE/computer fino a che non hai le idee chiare !!!!
  • Re: Conto Corrente

    Va bene.
    Grazie del consiglio
  • Re: Conto Corrente

    Ho rielaborato il tutto ed ho scritto il seguente codice.
    Io inserisco i dati di un utente, senza inserire nè versamenti nè prelivevi, vado nella sezione stampa e mi da un numero a caso molto grande, qualcuno può darmi qualche indizio
    Di seguito il codice:
    
    
    #include<stdio.h>
    #define MAXUTENTI 10
    typedef struct {
    int numero;
    }contoC;
    
    typedef struct {
    char nome[20];
    char cognome[20];
    contoC id_conto;
    float saldo;
    }correntista;
    
    typedef enum{false,true} Boolean;
    
    int main(){
        correntista CORRENTISTI[MAXUTENTI];
        char nome[20],cognome[20];
        int inseriti,op,i,j,numero;
        Boolean fine,trovato;
        char scelta,c;
        float a, saldo;
        inseriti=0;
        fine=false;
    do{
    printf("\n");
    printf("Quale operazione vuoi svolgere?\n");
    printf("1: Inserimento\n");
    printf("2: Versamento\n");
    printf("3: Prelievo\n");
    printf("4: Ricerca\n");
    printf("5: Cancellazione\n");
    printf("6: Stampa\n");
    printf("7: Uscita\n");
    scanf("%d",&op);
    c=getchar();
    switch(op){
    
      case(1): /* inserimento */
    if(inseriti<MAXUTENTI){
        printf("Inserisci il dati della persona da inserire: \n");
        printf("Nome: ");
        gets(CORRENTISTI[inseriti].nome);
        printf("Cognome: ");
        gets(CORRENTISTI[inseriti].cognome);
        printf("Numero conto corrente: ");
        scanf("%d",&CORRENTISTI[inseriti].id_conto.numero);
        inseriti++;
    }
    else printf("Archivio pieno\n");
    break;
    
    case 2: /*versamento*/
        printf("Inserisci i dati della persona da ricercare: \n");
        printf("Nome: ");
        gets(nome);
        printf("Cognome: ");
        gets(cognome);
        i=0;
        trovato=false;
        while(i<inseriti && !trovato){
        if(strcmp(CORRENTISTI[i].nome,nome)==0 &&strcmp(CORRENTISTI[i].cognome,cognome)==0){
        trovato=true;
        printf("Inserire la cifra da versare\n");
        scanf("%f",&a);
        CORRENTISTI[i].saldo= CORRENTISTI[i].saldo+a;
        printf("Il saldo attuale e' di euro %f",CORRENTISTI[i].saldo);
    }
    i++;
    }
    if(!trovato)
    printf("L' utente da cancellare non appartiene all' archivio!");
    break;
    
    case 3: /*prelievo*/
        printf("Inserisci i dati della persona da ricercare: \n");
        printf("Nome: ");
        gets(nome);
        printf("Cognome: ");
        gets(cognome);
        i=0;
        trovato=false;
        while(i<inseriti && !trovato){
        if(strcmp(CORRENTISTI[i].nome,nome)==0 &&strcmp(CORRENTISTI[i].cognome,cognome)==0){
        trovato=true;
        printf("Inserire la cifra da prelevare\n");
        scanf("%f",&a);
        CORRENTISTI[i].saldo = CORRENTISTI[i].saldo-a;
        printf("Il saldo attuale e' di euro %f",CORRENTISTI[i].saldo);
    
    }
    i++;
    }
    if(!trovato)
    printf("L' utente da cancellare non appartiene all' archivio!");
    break;
    
    
    case 4: /* ricerca */
    printf("Inserisci i dati della persona da ricercare: \n");
    printf("Nome: ");
    gets(nome);
    printf("Cognome: ");
    gets(cognome);
    i=0;
    trovato=false;
    while(i<inseriti && !trovato){
    if(strcmp(CORRENTISTI[i].nome,nome)==0 && strcmp(CORRENTISTI[i].cognome,cognome)==0){
    trovato=true;
    printf("Il codice associato e': %d \n", CORRENTISTI[i].id_conto.numero);
    }
    i++;
    }
    if(!trovato)
    printf("L?utente ricercato non appartiene all' archivio!\n");
    break;
    
    
    
    case(5): /* cancellazione */
    printf("Inserisci il dati della persona da cancellare: \n");
       printf("Nome: ");
       gets(nome);
       printf("Cognome: ");
       gets(cognome);
    i=0;
    trovato=false;
    while(i<inseriti && !trovato){
    if(strcmp(CORRENTISTI[i].nome,nome)==0 &&strcmp(CORRENTISTI[i].cognome,cognome)==0){
    trovato=true;
    for(j=i+1;j<inseriti;j++){
    strcpy(CORRENTISTI[j+1].nome,CORRENTISTI[j].nome);
    strcpy(CORRENTISTI[j+1].cognome,CORRENTISTI[j].cognome);
    strcpy(CORRENTISTI[j+1].id_conto.numero,CORRENTISTI[j].id_conto.numero);
    }
    inseriti--;
    }
    i++;
    }
    if(!trovato)
    printf("L' utente da cancellare non appartiene all' archivio!");
    break;
    
       case 6: /* stampa */
    for(i=0;i<inseriti;i++){
    printf("Dati dell'utente %d: \n",i+1);
    printf("Nome: %s\n",CORRENTISTI[i].nome);
    printf("Cognome: %s\n",CORRENTISTI[i].cognome);
    printf("Il codice associato e': %d \n",CORRENTISTI[i].id_conto.numero);
    printf("Saldo: %f \n",CORRENTISTI[i].saldo);
    }
    break;
    
    case(7): /* uscita */
    fine=true;
    break;
    default: printf("Errore!");
    }
    }while(!fine);
    }
    
    Grazie in anticipo
  • Re: Conto Corrente

    I "numeri a caso" sono puntatori o variabili/elementi non inizializzate.

    E' questo quello che devi controllare ... hai inizializzato tutto quello che vai a stampare?
  • Re: Conto Corrente

    No hai ragione, non ho inizializzato il saldo, giusto?
  • Re: Conto Corrente

    Se hai il problema con il saldo ...
  • Re: Conto Corrente

    Infatti...ora l'ho inizializzata e comunque e mi esce quel valore elevato
  • Re: Conto Corrente

    Hai sbagliato posto dove inizializzarlo .... ovviamente va fatto nell'inserimento ... magari vediamo il codice dell'inserimento?
  • Re: Conto Corrente

    Ci sono riuscito facendo una piccola furbata inserendo da input il saldo iniziale, ti inserisco il codice dell'inserimento
    
    
      case(1): /* inserimento */
    if(inseriti<MAXUTENTI){
        printf("Inserisci il dati della persona da inserire: \n");
        printf("Nome: ");
        gets(CORRENTISTI[inseriti].nome);
        printf("Cognome: ");
        gets(CORRENTISTI[inseriti].cognome);
        printf("Numero conto corrente: ");
        scanf("%d",&CORRENTISTI[inseriti].id_conto.numero);
        printf("Saldo iniziale: ");
        scanf("%f", &CORRENTISTI[inseriti].saldo);
        inseriti++;
    }
    else printf("Archivio pieno\n");
    break;
    
    
    Può andare bene secondo te?
  • Re: Conto Corrente

    Ma allora non hai capito. Altro che furbata ... Eppure è semplice.

    Devi scrivere

    CORRENTISTI[inseriti].saldo = 0;

    nell'inserimento per inizializzarlo.
  • Re: Conto Corrente

    L'avevo fatto, poi ho pensato di risolverlo così, perchè mi sembrava più logico anche dal punto di vista pratico, se uno va ad aprire un conto corrente qualcosa gli metterà all'interno.
    Grazie mille lo stesso.

    Un'altra domanda se è possibile.
    Se volessi inserire la data ad ogni inserimento, versamento o prelievo, come potrei fare?
  • Re: Conto Corrente

    Ma non funziona così. Si apre sempre a zero. Poi si fa un primo versamento (che è comunque un'operazione di cui si tiene traccia).

    Per la data, manca completamente la struttura per i Movimenti.
    Crea una struttura apposita con Data, TipoMovimento, Importo.

    Per fare i movimenti su c/c si usa il "numero di conto" per cercare, non il nome e cognome.
  • Re: Conto Corrente

    Va bene, seguirò il tuo consiglio.
    Ma poi che tipo i variabile devo dare alla Data?
    Ho letto un po su internet ed ho trovato che c'è la libreria time.h, ma non ci ho capito granchè.
    Va bene anche se mi indichi qualche fonte più specifica dove attingere queste informazioni.
  • Re: Conto Corrente

    La data va nella struttura e potrebbe essere una stringa di 8 caratteri (9 per il terminatore).
Devi accedere o registrarti per scrivere nel forum
18 risposte