Problema salvataggio e stampa dati in array di struct.

di il
9 risposte

Problema salvataggio e stampa dati in array di struct.

Ciao a tutti, come scritto nel titolo ho un problema a stampare e probabilmente anche a salvare i dati in una struttura dati c. L' esercizio richiede di implementare un programma per la simulazione di un conto corrente e che stampi a video la lista movimenti di un dato correntista in diversi periodi dell'anno. Allego il codice di quello che sono riuscito ad abbozzare, il problema principale sta nella funzione per effettuare i movimenti di denaro tra utenti. In parole povere dovrei stampare a video tutti i movimenti effettuati da un dato correntista, ma nella function che ho scritto mi stampa solo l'ultimo movimento per num_mov volte.




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20




struct u {

    char nome [MAX];
    char cognome [MAX];
    int saldo;
    int id;

} utenti [MAX];

struct m {

int giorno;
int mese;
int anno;
int importo;
int codice;


} movimento[MAX];




int num_utenti = 0;

int num_movimenti = 0;

int menu();
int ricerca_conto(int id);
int ricerca_movimento(int codice);
void inserisci_utente(void);
void cerca_utente(void);
void deposito(void);
void prelievo(void);
int movim();
void stampa_movimenti(void);
//void stampa(void);


int main (){

int scelta;

    while(scelta = menu()) {

        switch ( scelta ){

    case 1: system("CLS");

            inserisci_utente();

        break;

    case 2: system("CLS");

            cerca_utente();

        break;

    case 3: system("CLS");

            deposito();

        break;

    case 4: system("CLS");

            prelievo();

        break;

    case 5: system("CLS");

            movim();

            break;

    case 6: system("CLS");

            stampa_movimenti();

            break;

    case 0:

         return 0;

        }

}
   }

int ricerca_conto(int id) //Function che cerca la presenza di un dato correntista.
{
    int i;

    for( i = 0; i < num_utenti; i++)
        if ( utenti[i].id == id)
        return i;
    return -1;
}


void inserisci_utente(void) //Function che permette l'inserimento di un nuovo correntista.

{
    int num_conto;

  if ( num_utenti == MAX )
  {
      printf("Numero utenti massimo raggiunto.\n");
      return;
  }

  printf("\nInserire numero di conto: ");
    scanf("%d", &num_conto);

if ( ricerca_conto(num_conto) >= 0){

    printf("Utente già esistente.\n");
    return;
}

utenti[num_utenti].id = num_conto;

fflush(stdin);

printf("\nInserire nome: ");
    gets(utenti[num_utenti].nome);

fflush(stdin);

printf("\nInserire cognome: ");
    gets(utenti[num_utenti].cognome);

printf("\nInserire saldo: ");
    scanf("%d", &utenti[num_utenti].saldo);

num_utenti++;

}




void cerca_utente(void) //Function per la ricerca di un dato correntista.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);
    i = ricerca_conto(n);

    if ( i >= 0) {

        printf("\nNome utente: %s\t     Cognome utente: %s\t    Saldo: %d\n", utenti[i].nome, utenti[i].cognome, utenti[i].saldo);
        //printf("Saldo: %d", utenti[i].saldo);

    }

    else
        printf("Utente non trovato.\n");
}


void deposito(void) //Function che permetta di effettuare un deposito.
{
    int i, n;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi depositare?: ");
            scanf("%d", &movimento[i].importo);
        utenti[i].saldo += movimento[i].importo;
    }
    else
        printf("Conto non trovato.\n");

}


void prelievo(void) //Function che permette di effettuare un prelievo
{
    int i, n, importo;

    printf("\nInserire numero di conto: ");
        scanf("%d", &n);

    i = ricerca_conto(n);

    if ( i >= 0 ){
        printf("Quanto vuoi prelevare?: ");
            scanf("%d", &importo);
        utenti[i].saldo -= importo;
    }
    else
        printf("Conto non trovato.\n");

}



int menu() { //Function che stampa a video il menu di scelta.

int scelta;

    printf("\n\t\t\t\t\t*** Conto Corrente 1.0 ***\n\n");

    printf("[1] Inserisci utente.\n\n");

    printf("[2] Ricerca utente.\n\n");

    printf("[3] Effettua Deposito.\n\n");

    printf("[4] Effettua Prelievo.\n\n");

    printf("[5] Effettua movimento.\n\n");

    printf("[6] Stampa movimenti.\n\n");

    printf("[0] Esci.\n\n");

        scanf("%d", &scelta);

    while ( scelta < 0 || scelta > 6 ){

        printf("Comando non riconosciuto!\n");

        printf("scelta: ");

        scanf("%d", &scelta);

            return scelta;
    }
    return scelta;
}


int movim() //Function che permette di effettuare un movimento di denaro.
{
    int i, n, mittente, destinatario;

    printf("\nInserire numero di conto del mittente: ");

        scanf("%d", &mittente);

    i = ricerca_conto(mittente);

    if ( i >= 0 ){

        printf("\nQuanto vuoi inviare?: ");

            scanf("%d", &movimento[i].importo);

        utenti[i].saldo -= movimento[i].importo;
    }

    else{
        printf("Utente inesistente.\n");
        return menu();
    }

    printf("\nInserire numero di conto del destinatario: ");

        scanf("%d", &destinatario);

    n = ricerca_conto(destinatario);

    printf("\nInserire giorno: ");

        scanf("%d", &movimento[i].giorno);

    printf("\nInserire mese: ");

        scanf("%d", &movimento[i].mese);

    printf("\nInserire anno: ");

        scanf("%d", &movimento[i].anno);

    if ( n >= 0 ){
        utenti[n].saldo += movimento[i].importo;

    printf("Movimento effettuato con successo!\n");

    num_movimenti++; movimento[i].codice++;

    return menu();
    }

    else{
        printf("Utente inesistente.\n");

    return menu();
    }
}


int ricerca_movimento(int codice) //Function che verifica la presenza di un movimento.
{
    int i;

    for( i = 0; i < num_movimenti; i++)
        if (movimento[i].codice == codice)
        return i;
    return -1;
}


void stampa_movimenti(void) //Function che stampa a video la lista movimenti di un dato correntista.
{
    int i, n, utente, x;

    printf("\nInserire il numero del conto di cui stampare i movimenti: ");

        scanf("%d", &utente);

    x = ricerca_conto(utente);

    if ( i >= 0 ){
        n = ricerca_movimento(utente);

        printf("Lista movimenti Numero conto:%d\t Nome: %s\t Cognome: %s\n", utente, utenti[i].nome, utenti[i].cognome);

        for (x = 0; x < num_movimenti; x++){
            printf("Importo: %d\t   Giorno: %d\t   Mese: %d\t   Anno: %d\t", movimento[i].importo, movimento[i].giorno, movimento[i].mese, movimento[i].anno);
        }

    }


}

9 Risposte

  • Re: Problema salvataggio e stampa dati in array di struct.

    Visto che stai imparando comincia a prendere delle buone abitudini:
    - dai dei nomi ESPLICATIVI a struct, variabili e quanto altro: "u" è ENORMEMENTE SBAGLIATO come nome! Anche "MAX" non va bene, troppo vago.
    - non unire definizione di una struct e dichiarazione di variabili: mantienile separate.
    - sii rigoroso con indentazione e spaziature: al compilatore non gliene frega una cippa ma a chi rilegge il tuo codice, invece, tanto.
    - commenta il codice: scrivi PERCHÉ fai una certa cosa. Scrivi quello che non è evidente dal codice ma è importante, quello che va ricordato.
    - sii coerente con i nomi delle variabili: non chiamare "id" in una struttura ciò che chiami "codice" in un'altra!

    Eorrori rinvenuti, leggendo velocemente:
    - ripensa a come usi m.Codice, temo che non sia il modo giusto.
    - guarda l'ultima e la penultima riga di codice (tralasciando le graffe) e confronta variabile di controllo del ciclo e indice del vettore: ti sembrano corretti?

    Per il resto si intravvede un inizio di programmazione strutturata, bene!
  • Re: Problema salvataggio e stampa dati in array di struct.

    Attenzione a scrivere

    return menu();

    è un grave errore.
  • Re: Problema salvataggio e stampa dati in array di struct.

    Saittone ha scritto:


    
    void stampa_movimenti(void) //Function che stampa a video la lista movimenti di un dato correntista.
    {
        int i, n, utente, x;
    
        printf("\nInserire il numero del conto di cui stampare i movimenti: ");
    
            scanf("%d", &utente);
    
        x = ricerca_conto(utente);
    
        if ( i >= 0 ){
            n = ricerca_movimento(utente);
    
            printf("Lista movimenti Numero conto:%d\t Nome: %s\t Cognome: %s\n", utente, utenti[i].nome, utenti[i].cognome);
    
            for (x = 0; x < num_movimenti; x++){
                printf("Importo: %d\t   Giorno: %d\t   Mese: %d\t   Anno: %d\t", movimento[i].importo, movimento[i].giorno, movimento[i].mese, movimento[i].anno);
            }
    
        }
    
    }
    Quanto vale i quando controlli che sia maggiore o uguale a zero? Cosa rischi se non lo inizializzi?
    A che serve n?
    A che serve x? Perché la inizializzi sul conto per poi usarla come variabile di ciclo sui movimenti? Perché comunque scegli di stampare il movimento indicizzato a i che è fisso?
  • Re: Problema salvataggio e stampa dati in array di struct.

    nicolap ha scritto:


    Visto che stai imparando comincia a prendere delle buone abitudini:
    - dai dei nomi ESPLICATIVI a struct, variabili e quanto altro: "u" è ENORMEMENTE SBAGLIATO come nome! Anche "MAX" non va bene, troppo vago.
    - non unire definizione di una struct e dichiarazione di variabili: mantienile separate.
    - sii rigoroso con indentazione e spaziature: al compilatore non gliene frega una cippa ma a chi rilegge il tuo codice, invece, tanto.
    - commenta il codice: scrivi PERCHÉ fai una certa cosa. Scrivi quello che non è evidente dal codice ma è importante, quello che va ricordato.
    - sii coerente con i nomi delle variabili: non chiamare "id" in una struttura ciò che chiami "codice" in un'altra!

    Eorrori rinvenuti, leggendo velocemente:
    - ripensa a come usi m.Codice, temo che non sia il modo giusto.
    - guarda l'ultima e la penultima riga di codice (tralasciando le graffe) e confronta variabile di controllo del ciclo e indice del vettore: ti sembrano corretti?

    Per il resto si intravvede un inizio di programmazione strutturata, bene!
    Wow, grazie dei consigli. Era mia intenzione sistemare il tutto una volta appurato che funzionasse correttamente dato che si tratta di un progetto d'esame ed anche perchè andrà sistemato in file header.h e main.c.
  • Re: Problema salvataggio e stampa dati in array di struct.

    oregon ha scritto:


    Attenzione a scrivere

    return menu();

    è un grave errore.
    Ciao e grazie per aver risposto. Immaginavo non fosse il modo migliore ma in quel punto in fase di esecuzione il programma terminava, non sapendo come fare ho scritto in quel modo.
  • Re: Problema salvataggio e stampa dati in array di struct.

    Saittone ha scritto:


    Era mia intenzione sistemare il tutto una volta appurato che funzionasse correttamente dato che si tratta di un progetto d'esame ed anche perchè andrà sistemato in file header.h e main.c.
    Devi sapere che i programmatori
    - sono pigri
    - sono sempre in ritardo

    Diciamo tutti "poi lo sistemo" ma... poi non lo facciamo. Per questo è importante prendere subito certe buone abitudini!
  • Re: Problema salvataggio e stampa dati in array di struct.

    nicolap ha scritto:


    Saittone ha scritto:


    Era mia intenzione sistemare il tutto una volta appurato che funzionasse correttamente dato che si tratta di un progetto d'esame ed anche perchè andrà sistemato in file header.h e main.c.
    Devi sapere che i programmatori
    - sono pigri
    - sono sempre in ritardo

    Diciamo tutti "poi lo sistemo" ma... poi non lo facciamo. Per questo è importante prendere subito certe buone abitudini!
    Ahahahah hai ragione ho notato , per quanto riguarda la function incriminata che restituisce valori a cacchio hai qualche consiglio da darmi? Te ne sarei molto riconoscente.
  • Re: Problema salvataggio e stampa dati in array di struct.

    Saittone ha scritto:


    per quanto riguarda la function incriminata che restituisce valori a cacchio hai qualche consiglio da darmi? Te ne sarei molto riconoscente.
    Hai letto con cura l'ultimo punto del mio primo messaggio?
    Cosa ne pensi?
  • Re: Problema salvataggio e stampa dati in array di struct.

    Ciao ho provato a sistemare un po' le cose tuttavia il risultato non cambia
    /* Si supponga di voler gestire i conti correnti di n utenti. Ogni utente è identificato dal
    Cognome, Nome, numero del conto, lista movimenti in diversi giorni dell’anno.
    Gestire i conti corrente e gestire le seguenti operazioni
    • Inserire un nuovo correntista a cui viene assegnato un codice univoco.
    • Visualizzare la lista movimenti di un dato correntista (dato il numero del
    conto o Cognome/Nome) in una fissata data. */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAX 20
    
    
    
    
    struct u {
    
        char nome [MAX];
        char cognome [MAX];
        int saldo;
        int id;
        unsigned int num_mov;
    
    } utenti [MAX];
    
    struct m {
    
    int giorno;
    int mese;
    int anno;
    int importo;
    
    
    } movimento[MAX];
    
    
    
    
    int num_utenti = 0;
    
    int num_movimenti = 0;
    
    int menu();
    int ricerca_conto(int id);
    int ricerca_movimento();
    void inserisci_utente(void);
    int cerca_utente();
    void deposito(void);
    void prelievo(void);
    int movim();
    void stampa_movimenti(int num_movimenti);
    int ricerca_utente();
    //void stampa(void);
    
    
    int main (){
    
    int scelta, id;
    
        while(scelta = menu()) {
    
            switch ( scelta ){
    
        case 1: system("CLS");
    
                inserisci_utente();
    
            break;
    
        case 2: system("CLS");
    
                cerca_utente();
    
            break;
    
        case 3: system("CLS");
    
                deposito();
    
            break;
    
        case 4: system("CLS");
    
                prelievo();
    
            break;
    
        case 5: system("CLS");
    
                movim();
    
                break;
    
        case 6: system("CLS");
    
                stampa_movimenti(num_movimenti);
    
                break;
    
        case 7: system("CLS");
    
                ricerca_movimento();
    
                break;
    
        case 0:
    
             return 0;
    
            }
    
    }
       }
    
    int ricerca_conto(int id) //Function che cerca la presenza di un dato correntista.
    {
        int i;
    
        for( i = 0; i < num_utenti; i++)
            if ( utenti[i].id == id)
            return i;
        return -1;
    }
    
    
    void inserisci_utente(void) //Function che permette l'inserimento di un nuovo correntista.
    
    {
        int num_conto;
    
      if ( num_utenti == MAX )
      {
          printf("Numero utenti massimo raggiunto.\n");
          return;
      }
    
      printf("\nInserire numero di conto: ");
        scanf("%d", &num_conto);
    
    if ( ricerca_conto(num_conto) >= 0){
    
        printf("Utente già esistente.\n");
        return;
    }
    
    utenti[num_utenti].id = num_conto;
    
    fflush(stdin);
    
    printf("\nInserire nome: ");
        gets(utenti[num_utenti].nome);
    
    fflush(stdin);
    
    printf("\nInserire cognome: ");
        gets(utenti[num_utenti].cognome);
    
    printf("\nInserire saldo: ");
        scanf("%d", &utenti[num_utenti].saldo);
    
    num_utenti++;
    
    }
    
    
    
    
    int cerca_utente() //Function per la ricerca di un dato correntista.
    {
        int i, n;
    
        printf("\nInserire numero di conto: ");
            scanf("%d", &n);
        i = ricerca_conto(n);
    
        if ( i >= 0) {
    
            printf("\nNome utente: %s\t     Cognome utente: %s\t    Saldo: %d\n", utenti[i].nome, utenti[i].cognome, utenti[i].saldo);
            //printf("Saldo: %d", utenti[i].saldo);
    
        }
    
        else
            printf("Utente non trovato.\n");
    }
    
    
    void deposito(void) //Function che permetta di effettuare un deposito.
    {
        int i, n;
    
        printf("\nInserire numero di conto: ");
            scanf("%d", &n);
    
        i = ricerca_conto(n);
    
        if ( i >= 0 ){
            printf("Quanto vuoi depositare?: ");
                scanf("%d", &movimento[i].importo);
            utenti[i].saldo += movimento[i].importo;
        }
        else
            printf("Conto non trovato.\n");
    
    }
    
    
    void prelievo(void) //Function che permette di effettuare un prelievo
    {
        int i, n, importo;
    
        printf("\nInserire numero di conto: ");
            scanf("%d", &n);
    
        i = ricerca_conto(n);
    
        if ( i >= 0 ){
            printf("Quanto vuoi prelevare?: ");
                scanf("%d", &importo);
            utenti[i].saldo -= importo;
        }
        else
            printf("Conto non trovato.\n");
    
    }
    
    
    
    int menu() { //Function che stampa a video il menu di scelta.
    
    int scelta;
    
        printf("\n\t\t\t\t\t*** Conto Corrente 1.0 ***\n\n");
    
        printf("[1] Inserisci utente.\n\n");
    
        printf("[2] Ricerca utente.\n\n");
    
        printf("[3] Effettua Deposito.\n\n");
    
        printf("[4] Effettua Prelievo.\n\n");
    
        printf("[5] Effettua movimento.\n\n");
    
        printf("[6] Stampa movimenti.\n\n");
    
        printf("[7] Ricerca movimenti.\n\n");
    
        printf("[0] Esci.\n\n");
    
            scanf("%d", &scelta);
    
        while ( scelta < 0 || scelta > 7 ){
    
            printf("Comando non riconosciuto!\n");
    
            printf("scelta: ");
    
            scanf("%d", &scelta);
    
                return scelta;
        }
        return scelta;
    }
    
    
    int movim() //Function che permette di effettuare un movimento di denaro.
    {
        int i, n, mittente, destinatario;
    
        printf("\nInserire numero di conto del mittente: ");
    
            scanf("%d", &mittente);
    
        i = ricerca_conto(mittente);
    
        if ( i >= 0 ){
    
            printf("\nQuanto vuoi inviare?: ");
    
                scanf("%d", &movimento[i].importo);
    
            utenti[i].saldo -= movimento[i].importo;
    
            utenti[i].num_mov++;
        }
    
        else{
            printf("Utente inesistente.\n");
            return -1;
        }
    
        printf("\nInserire numero di conto del destinatario: ");
    
            scanf("%d", &destinatario);
    
        n = ricerca_conto(destinatario);
    
        printf("\nInserire giorno: ");
    
            scanf("%d", &movimento[i].giorno);
    
        printf("\nInserire mese: ");
    
            scanf("%d", &movimento[i].mese);
    
        printf("\nInserire anno: ");
    
            scanf("%d", &movimento[i].anno);
    
        if ( n >= 0 ){
            utenti[n].saldo += movimento[i].importo;
    
        printf("Movimento effettuato con successo!\n");
    
        num_movimenti++;
    
        return -1;
        }
    
        else{
            printf("Utente inesistente.\n");
    
        getchar();
        }
    }
    
    
    int ricerca_movimento() //Function che verifica la presenza di un movimento.
    {
        int g, m, a, i, trovato = 0;
    
        printf("\nInserire giorno: ");
    
            scanf("%d", &g);
    
        printf("\nInserire mese: ");
    
            scanf("%d", &m);
    
        printf("\nInserire anno: ");
    
            scanf("%d", &a);
    
            for( i = 1, trovato = 0; i < utenti[i].num_mov && i < movimento[i].giorno && i < movimento[i].mese && i < movimento[i].anno; i++)
            {
                if ( g == movimento[i].giorno && m == movimento[i].mese && a == movimento[i].anno)
    
                    trovato += 1;
            }
    
            if ( trovato == 0 )
    
                printf("Non ci sono movimenti nella data selezionata.\n");
    
            else
    
                printf("Sono stati trovati %d movimenti\n", trovato);
    
    
        }
    
    
    
    
    void stampa_movimenti(int num_movimenti) //Function che stampa a video la lista movimenti di un dato correntista.
    {
        int i, x, utente;
    
            printf("\nInserire il numero del conto di cui stampare i movimenti: ");
    
                scanf("%d", &i);
    
            utente =ricerca_conto(i);
    
        if ( utente > 0 ){
    
    
    
                printf("Lista movimenti\n Numero conto:%d\t Nome: %s\t Cognome: %s\n", utente, utenti[utente].nome, utenti[utente].cognome);
    
                    for (x = 0; x < utenti[utente].num_mov; x++){
    
                        printf("Importo: %d\t   Giorno: %d\t   Mese: %d\t   Anno: %d\t", movimento[x].importo, movimento[x].giorno, movimento[x].mese, movimento[x].anno);
                }
    
            }
    
    
    }
    
    
    
    
    int ricerca_utente() //Function per la ricerca di un dato correntista.
    {
        int i, n;
    
        printf("\nInserire numero di conto di cui stampare i movimenti: ");
            scanf("%d", &n);
        i = ricerca_conto(n);
    
        if ( i >= 0) {
    
            return i;
        }
    
        else
        {
            printf("Utente non trovato.\n");
    
            return -1
            ;
    
        }
    
    
    return 0;
    }
    
    
    
    
    
Devi accedere o registrarti per scrivere nel forum
9 risposte