Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Considero la typedef struct { int mese, giorno;
- char tip_op[30];
- float importo; } Dati;
- Organizzando il programma con funzioni devo leggere un file di testo che ha dei dati interi e delle stringhe.
- Aprendo il file compaiono sia cifre che parole.
- Dunque, devo leggere il file di testo, inserendo gli elementi in un array di strutture allocato dinamicamente.
- Poi devo ordinare l'array per giorno e mese.
- Stampare l'array ordinato.
- Stampare il saldo (somma delle entrate e delle uscite) raggruppato per trimestre,
- e poi stamparlo pure raggruppato per tipologia operazione,
- e la tipologia può assumere i valori: vendita, pagamento_fattura, pagamento_iva, Reso_da_cliente, reso_a_fornitore, pagamento_tasse.
- L'input è in formato csv con i dati così disposti:
- importo,mese,giorno,tip_op
- esempio di dati nel file di testo:
- 20.35,5,30,vendita
- 50.01,2,1,pagamento_iva
- 7.0,9,12,Reso_da_cliente
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct {
- int mese;
- int giorno;
- char tip_op[30];
- float importo;
- } Dati;
- int Minore(Dati* a, Dati* b){
- //Ritorna 1 se a viene prima o nello stesso giorno di b
- if (a->mese>b->mese) return 0;
- else if (a->mese<b->mese) return 1;
- else {
- if (a->giorno>b->giorno) return 0;
- else if (a->giorno<b->giorno) return 1;
- else return 1;
- }
- }
- void swap(Dati *a, Dati *b)
- {
- Dati t;
- t.mese=a->mese;
- t.giorno=a->giorno;
- strcpy(t.tip_op,a->tip_op);
- t.importo=a->importo;
- a->mese=b->mese;
- a->giorno=b->giorno;
- strcpy(a->tip_op,b->tip_op);
- a->importo=b->importo;
- b->mese=t.mese;
- b->giorno=t.giorno;
- strcpy(b->tip_op,t.tip_op);
- b->importo=t.importo;
- }
- void sort(Dati *arr, int beg, int end)
- //algoritmo quicksort standard
- {
- if (end > beg + 1)
- {
- Dati piv;
- piv.mese=(arr+beg)->mese;
- piv.giorno=(arr+beg)->giorno;
- strcpy(piv.tip_op,(arr+beg)->tip_op);
- piv.importo=(arr+beg)->importo;
- int l = beg + 1, r = end;
- while (l < r)
- {
- if (Minore(arr+l , &piv))
- l++;
- else
- swap(arr+l, &arr[--r]);
- }
- swap(&arr[--l], arr+beg);
- sort(arr, beg, l);
- sort(arr, r, end);
- }
- }
- Dati* LeggiDati(Dati* Destinazione, int* n, char* Path){
- int cont;
- Dati* temp;
- FILE* pFile=NULL;
- pFile=fopen (Path , "r");
- if (pFile){
- Destinazione= (Dati*) malloc(sizeof(Dati));
- for (
- cont=0;
- fscanf(pFile, "%f,%d,%d,%s", &((Destinazione+cont)->importo), &((Destinazione+cont)->mese), &((Destinazione+cont)->giorno), (Destinazione+cont)->tip_op) != EOF;
- ){
- cont++;
- temp= (Dati*) realloc(Destinazione,(cont+1)*sizeof(Dati));
- Destinazione=temp;
- }
- fclose(pFile);
- *n=cont;
- return Destinazione;
- }
- else{
- *n=0;
- return NULL;
- }
- }
- void Stampadato(Dati* a){
- char Mesi[12][10]={"Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"};
- printf("\n%d-%s: %s - %f$", a->giorno, Mesi[(a->mese)-1], a->tip_op, a->importo);
- }
- void RicaviTrimestri(Dati* Fonte, int dim, float trimestri[4]){
- if (Fonte==NULL || dim<=0) return;
- int i;
- for(i=0;i<4;i++){trimestri[i]=0.0;}
- for(i=0;i<dim;i++){
- trimestri[((Fonte+i)->mese-1)/3]+=(Fonte+i)->importo;
- }
- }
- void RicaviOperazioni(Dati* Fonte, int dim, float operazioni[6]){
- if (Fonte==NULL || dim<=0) return;
- char Tipi[6][30]={"vendita", "pagamento_fattura", "pagamento_iva", "Reso_da_cliente", "reso_a_fornitore", "pagamento_tasse"};
- int i,j;
- for(i=0;i<6;i++){operazioni[i]=0.0;}
- for(i=0;i<dim;i++){
- for(j=0;j<6;j++){
- if(strcmp((Fonte+i)->tip_op,Tipi[j])==0) break;
- }
- if (j>=6) return;
- operazioni[j]+=(Fonte+i)->importo;
- }
- }
- int main(){
- int i;
- char Tipi[6][30]={"vendita", "pagamento_fattura", "pagamento_iva", "Reso_da_cliente", "reso_a_fornitore", "pagamento_tasse"};
- char percorso[151];
- printf("Inserisci il percorso al file (Max 150 Caratteri): ");
- fgets(percorso,151,stdin);
- if (percorso[strlen(percorso)-1]=='\n') percorso[strlen(percorso)-1]='\0'; //elimino il \n dovuto alla pressione di invio al termine dell'input
- Dati* Registro=NULL;
- int dim=0;
- Registro=LeggiDati(Registro,&dim,percorso);
- if (!Registro){
- printf("\nErrore nella lettura del file!");
- return 1;
- }
- sort(Registro,0,dim-1);
- for(i=0;i<dim;i++) Stampadato(Registro+i);
- float RicaviTrim[4];
- RicaviTrimestri(Registro,dim,RicaviTrim);
- for(i=0;i<4;i++) printf("\nRicavi %d^o Trimestre: %f",i+1,RicaviTrim[i]);
- float RicaviOp[6];
- RicaviOperazioni(Registro,dim,RicaviOp);
- for(i=0;i<6;i++) printf("\nRicavi %s: %f",Tipi[i],RicaviOp[i]);
- free(Registro);
- printf("\nPremere Invio per Terminare..."); fflush(stdin); getchar(); //mette in pausa
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement