Advertisement
VRonin

Contabilita'

Jul 6th, 2012
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.98 KB | None | 0 0
  1. /*Considero la typedef struct { int mese, giorno;
  2. char tip_op[30];
  3. float importo; } Dati;
  4.  
  5. Organizzando il programma con funzioni devo leggere un file di testo che ha dei dati interi e delle stringhe.
  6. Aprendo il file compaiono sia cifre che parole.
  7. Dunque, devo leggere il file di testo, inserendo gli elementi in un array di strutture allocato dinamicamente.
  8. Poi devo ordinare l'array per giorno e mese.
  9. Stampare l'array ordinato.
  10. Stampare il saldo (somma delle entrate e delle uscite) raggruppato per trimestre,
  11. e poi stamparlo pure raggruppato per tipologia operazione,
  12. e la tipologia può assumere i valori: vendita, pagamento_fattura, pagamento_iva, Reso_da_cliente, reso_a_fornitore, pagamento_tasse.
  13.  
  14. L'input è in formato csv con i dati così disposti:
  15. importo,mese,giorno,tip_op
  16.  
  17. esempio di dati nel file di testo:
  18. 20.35,5,30,vendita
  19. 50.01,2,1,pagamento_iva
  20. 7.0,9,12,Reso_da_cliente
  21. */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26.  
  27. typedef struct {
  28.     int mese;
  29.     int giorno;
  30.     char tip_op[30];
  31.     float importo;
  32. } Dati;
  33.  
  34. int Minore(Dati* a, Dati* b){
  35.     //Ritorna 1 se a viene prima o nello stesso giorno di b
  36.     if (a->mese>b->mese) return 0;
  37.     else if (a->mese<b->mese) return 1;
  38.     else {
  39.         if (a->giorno>b->giorno) return 0;
  40.         else if (a->giorno<b->giorno) return 1;
  41.         else return 1;
  42.     }
  43. }
  44.  
  45. void swap(Dati *a, Dati *b)
  46. {
  47.   Dati t;
  48.   t.mese=a->mese;
  49.   t.giorno=a->giorno;
  50.   strcpy(t.tip_op,a->tip_op);
  51.   t.importo=a->importo;
  52.  
  53.   a->mese=b->mese;
  54.   a->giorno=b->giorno;
  55.   strcpy(a->tip_op,b->tip_op);
  56.   a->importo=b->importo;
  57.  
  58.   b->mese=t.mese;
  59.   b->giorno=t.giorno;
  60.   strcpy(b->tip_op,t.tip_op);
  61.   b->importo=t.importo;
  62. }
  63. void sort(Dati *arr, int beg, int end)
  64. //algoritmo quicksort standard
  65. {
  66.   if (end > beg + 1)
  67.   {
  68.     Dati piv;
  69.     piv.mese=(arr+beg)->mese;
  70.     piv.giorno=(arr+beg)->giorno;
  71.     strcpy(piv.tip_op,(arr+beg)->tip_op);
  72.     piv.importo=(arr+beg)->importo;
  73.     int l = beg + 1, r = end;
  74.     while (l < r)
  75.     {
  76.       if (Minore(arr+l , &piv))
  77.         l++;
  78.       else
  79.         swap(arr+l, &arr[--r]);
  80.     }
  81.     swap(&arr[--l], arr+beg);
  82.     sort(arr, beg, l);
  83.     sort(arr, r, end);
  84.   }
  85. }
  86.  
  87. Dati* LeggiDati(Dati* Destinazione, int* n, char* Path){
  88.     int cont;
  89.     Dati* temp;
  90.     FILE* pFile=NULL;
  91.     pFile=fopen (Path , "r");
  92.     if (pFile){
  93.         Destinazione= (Dati*) malloc(sizeof(Dati));
  94.        for (
  95.             cont=0;
  96.             fscanf(pFile, "%f,%d,%d,%s", &((Destinazione+cont)->importo), &((Destinazione+cont)->mese), &((Destinazione+cont)->giorno), (Destinazione+cont)->tip_op) != EOF;
  97.         ){
  98.             cont++;
  99.             temp= (Dati*) realloc(Destinazione,(cont+1)*sizeof(Dati));
  100.             Destinazione=temp;
  101.         }
  102.         fclose(pFile);
  103.         *n=cont;
  104.         return Destinazione;
  105.     }
  106.     else{
  107.         *n=0;
  108.         return NULL;
  109.     }
  110. }
  111.  
  112. void Stampadato(Dati* a){
  113.     char Mesi[12][10]={"Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"};
  114.     printf("\n%d-%s: %s - %f$", a->giorno, Mesi[(a->mese)-1], a->tip_op, a->importo);
  115. }
  116.  
  117. void RicaviTrimestri(Dati* Fonte, int dim, float trimestri[4]){
  118.     if (Fonte==NULL || dim<=0) return;
  119.     int i;
  120.     for(i=0;i<4;i++){trimestri[i]=0.0;}
  121.     for(i=0;i<dim;i++){
  122.         trimestri[((Fonte+i)->mese-1)/3]+=(Fonte+i)->importo;
  123.     }
  124. }
  125.  
  126. void RicaviOperazioni(Dati* Fonte, int dim, float operazioni[6]){
  127.     if (Fonte==NULL || dim<=0) return;
  128.     char Tipi[6][30]={"vendita", "pagamento_fattura", "pagamento_iva", "Reso_da_cliente", "reso_a_fornitore", "pagamento_tasse"};
  129.     int i,j;
  130.     for(i=0;i<6;i++){operazioni[i]=0.0;}
  131.     for(i=0;i<dim;i++){
  132.         for(j=0;j<6;j++){
  133.             if(strcmp((Fonte+i)->tip_op,Tipi[j])==0) break;
  134.         }
  135.         if (j>=6) return;
  136.         operazioni[j]+=(Fonte+i)->importo;
  137.     }
  138. }
  139.  
  140. int main(){
  141.     int i;
  142.     char Tipi[6][30]={"vendita", "pagamento_fattura", "pagamento_iva", "Reso_da_cliente", "reso_a_fornitore", "pagamento_tasse"};
  143.     char percorso[151];
  144.     printf("Inserisci il percorso al file (Max 150 Caratteri): ");
  145.     fgets(percorso,151,stdin);
  146.     if (percorso[strlen(percorso)-1]=='\n') percorso[strlen(percorso)-1]='\0'; //elimino il \n dovuto alla pressione di invio al termine dell'input
  147.     Dati* Registro=NULL;
  148.     int dim=0;
  149.     Registro=LeggiDati(Registro,&dim,percorso);
  150.     if (!Registro){
  151.         printf("\nErrore nella lettura del file!");
  152.         return 1;
  153.     }
  154.     sort(Registro,0,dim-1);
  155.     for(i=0;i<dim;i++) Stampadato(Registro+i);
  156.     float RicaviTrim[4];
  157.     RicaviTrimestri(Registro,dim,RicaviTrim);
  158.     for(i=0;i<4;i++) printf("\nRicavi %d^o Trimestre: %f",i+1,RicaviTrim[i]);
  159.     float RicaviOp[6];
  160.     RicaviOperazioni(Registro,dim,RicaviOp);
  161.     for(i=0;i<6;i++) printf("\nRicavi %s: %f",Tipi[i],RicaviOp[i]);
  162.     free(Registro);
  163.     printf("\nPremere Invio per Terminare..."); fflush(stdin); getchar(); //mette in pausa
  164.     return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement