04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

C, esercitazione n. 3,
movimenti bancari gestiti con lista dinamica.
  • a) Definire una struct che permetta di gestire i dati di movimenti bancari da importare da un file in formato csv del seguente tipo:

    data_contabile;data_valuta;descrizione;avere;dare;
    20161116;20161116;prelievo bancomat;0;250.00;
    20161016;20161018;bonifico a vostro favore da ABC;1500.00;0;
    20161217;20161219;assegno a XYZ;0;733.50;


    b) gestire dinamicamente un elenco di movimenti bancari

    c) leggere, con opportuno metodo, da un file di testo in formato csv un elenco di movimenti bancari da gestire dinamicamente

    d) stampare, con opportuno metodo, i dati di ogni elemento presente nell'elenco gestito dinamicamente

    e) definire un metodo per la ricerca di un movimento bancario nell'elenco, lo si ricerchi per data contabile e si restituisca il puntatore all'elemento trovato, se presente altrimenti NULL

    f) definire un metodo per aggiungere in append (in coda) un nuovo elemento all'elenco

    g) definire un metodo per eliminare un elemento, se presente, dall'elenco ricercandolo per data contabile

    h) esportare in un file di testo in formato csv un elenco di movimenti

    i) esportare in un file binario un elenco di movimenti


  • 1) Definizione della struct.

    typedef struct movimento
    {
        int    datacontabile; // formato YYYYMMDD
        int    datavaluta;    // formato YYYYMMDD
        char   descrizione[30];
        float  dare;
        float  avere;
        struct movimento *next;
    } t_movimento;
            
  • 2) Funzione importa in una lista dinamica i dati letti da file di testo in formato CSV.

    t_movimento *importa(char *nomefile) {
         t_movimento *lista = NULL;
         FILE *fcsv;
         fcsv= fopen(nomefile,"r");
    
         if(fcsv!=NULL)
         {
             // elemento precedente nello scorrimento della lista
             t_movimento *prec = NULL; 
             int i=0;
             int dc, dv;
             float d,a;
             char des [30];
             char *titolo;
             
             // lettura prima riga con nomi dei campi
             fscanf(fcsv,"%[^;];%[^;];%[^;];%[^;];%[^;];",
    		             titolo, titolo, titolo, titolo, titolo);
    
             while(fscanf(fcsv,"%d;%d;%[^;];%f;%f;",
    		              &dc, &dv, des, &d, &a) != EOF)
             {
                 t_movimento *ptr= (t_movimento*) malloc (sizeof(t_movimento));
    
                 ptr->datacontabile = dc;
                 ptr->datavaluta = dv;
                 strcpy( ptr->descrizione ,des);
                 ptr->dare = d;
                 ptr->avere = a;
                 ptr->next = NULL;
    
                 printf("DEBUG:: elemento: data %d datavaluta %d dare %f, avere %f\n", dc, dv, d,a);
    
                 if (i == 0) {
                     // caso particolare per il primo elemento letto che è 
                     // anche il primo elemento della lista
                     lista = ptr;
                     prec = lista;
                 }
                 else {
                     // il nuovo elemento letto è inserito in append (in coda)
                     prec->next = ptr;
                     prec = ptr;
                 }
                 i++;
             }
         }
         fclose(fcsv);
    
         return lista;
    }
            
  • 3) Procedura che stampa i dati presenti nella lista.

    void stampa(t_movimento *lista) {
        t_movimento *p = lista;
        
        while(p != NULL) {
            printf("movimento\ndata contabile %d\n
                    data valuta %d\ndescrizione %s\n
                    dare %f\navere %f\n\n", 
                    p->datacontabile,p->datavaluta,
                    p->descrizione,p->dare,p->avere);
            p = p->next;
        }
    }
            
  • 4) Funzione di ricerca di un movimento nella lista.

    t_movimento *ricerca(t_movimento *lista, int data) {
        // movimento ricercato, se c'è
        t_movimento *movimento = NULL;
        t_movimento *p = lista;
        int trovato = 0;
        
        while((trovato == 0) && (p != NULL)) {
            if (p->datacontabile == data) {
                trovato = 1;
                movimento = p;
            }
            p = p->next;
        }
        
        return movimento;
    }
            
  • 5) Procedura per l'inserimento di un nuovo elemento nella lista.
    La funzione Ultimo trova l'ultimo elemento della lista per l'inserimento del nuovo elemento che diverrà il nuovo elemento finale.

    t_movimento *ultimo(t_movimento *lista) {
        t_movimento *prossimo = NULL;
        if (lista != NULL) {
            prossimo = lista;
            while(prossimo->next != NULL) {
                prossimo = prossimo->next;
            }
        }
        return prossimo;
    } 
    
    void inserimento(t_movimento *lista, int datacontabile, 
            int datavaluta, char *descrizione, 
    		float dare, float avere) {
        t_movimento *nuovo = (t_movimento *) malloc(sizeof(t_movimento));
        
        nuovo->datacontabile = datacontabile;
        nuovo->datavaluta = datavaluta;
        // potrebbe dare problemi se la descrizione introdotta 
        // eccede il limite di 30 caratteri
        strcpy(nuovo->descrizione,descrizione);
        nuovo->dare = dare;
        nuovo->avere = avere;
        nuovo->next = NULL;
    
        t_movimento *fine = ultimo(lista);
        fine->next = nuovo;
    }
            
  • 6) Procedura di cancellazione di un elemento dalla lista ricercato per data contabile.

    void cancellazione(t_movimento *lista, int data) {
        t_movimento *prec = NULL;
        t_movimento *prossimo = lista;
    
        if (lista != NULL) {
            int b = 0;
    
            while((prossimo != NULL) && (b == 0)) {
                if (prossimo->datacontabile == data) {
                    b = 1;
                }
                else {
                    prec = prossimo;
                    prossimo = prossimo->next;
                }
            } 
    
            if (b == 1) {
                if (prec != NULL) prec->next = prossimo->next;
                else l = prossimo->next;
    
                free(prossimo);
            }
        }
    }
            
  • 7) Procedura di esportazione della lista in un file di testo in formato CSV.

    void esportaCSV(t_movimento *lista, char *nomefile) {
        if (nomefile != NULL) {
            if (strlen(nomefile) > 0) {
                FILE *f = fopen(nomefile, "w");
    			
                // prima riga con nomi campi
                fprintf(f, "datacontabile;datavaluta;
    			           descrizione;dare;avere;");
                t_movimento *p = lista;
    			
                while (p != NULL) {
                    fprintf(f, "%d;%d;%s;%f;%f;", 
    				        p->datacontabile, p->datavaluta, 
                            p->descrizione, p->dare, p->avere); 
                    p = p->next;
                }
                fclose(f);
            }
        }
    }
            
  • 8) Procedura di esportazione della lista in un file binario.

    void esportaBIN(t_movimento *lista, char *nomefile) {
        if (nomefile != NULL) {
            if (strlen(nomefile) > 0) {
                FILE *f = fopen(nomefile, "wb");
                t_movimento *p = lista;
    			
                while (p != NULL) {
                    fwrite(p, sizeof(t_movimento), 1, f); 
                    p = p->next;
                }
                fclose(f);
            }
        }
    }
            

© Emanuele Scapin 2009-2018

 

Valid HTML 4.01! Valid CSS!