001: #include<stdio.h>
002: #include<stdlib.h>
003: 
004: double *leggifile(void);                                 // funzione che legge il file
005: int     checkdate(int, int, int, int);                   // funzione che verifica le date immesse
006: double  svalutata(double, int, int, int, int, double *); // funzione che calcola il potere d'acquisto aggiornato
007: 
008: // array usato solo a fini cosmetici per la stampa, invece di stampare come mese 4 stampero' aprile
009: char *mesi[] ={"gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"};
010: 
011: int main(int argc, char **argv){
012: 
013:   // #1 lettura e memorizzazione contenuto file
014:   // Uso un array monodimensionale 25x12
015:   double *svals = leggifile();
016: 
017:   // #2
018:   double soldi;  // ammontare euro
019:   printf("Inserire un ammontare in Euro: ");
020:   scanf("%lf", &soldi);
021: 
022:   // #3
023:   int aa, ma, ab, mb; // date A e B
024:   printf("Inserire la prima data   (mese e anno): ");
025:   scanf("%d %d", &ma, &aa);
026:   printf("Inserire la seconda data (mese e anno): ");
027:   scanf("%d %d", &mb, &ab);
028: 
029:   // #4 
030:   if(checkdate(ma, aa, mb, ab))
031:   {
032:     printf("Errore, hai inserito date non valide. Ricordati che il periodo da considerare va da gennaio 2001 a dicembre 2025 e che la prima data deve essere anteriore alla seconda\n");
033:     exit(EXIT_FAILURE);
034:   }
035: 
036:   double finale = svalutata(soldi, ma, aa, mb, ab, svals);
037: 
038:   printf("%.2f EUR di %s %d avevano lo stesso potere d'acquisto di %.2f EUR a %s %d\n", 
039:       soldi, 
040:       mesi[ma-1], aa,
041:       finale,
042:       mesi[mb-1], ab
043:       );
044: 
045: 
046:   free(svals);
047: 
048: 
049:   return 0;
050: }
051: 
052: // funzione che legge il file, in pratica fa quanto richesto al #1
053: double *leggifile(void)
054: {
055:   FILE *fp = fopen("sval.txt", "r");  // apertura file ASCII
056:   if(!fp)
057:   {
058:     perror("");
059:     exit(EXIT_FAILURE);
060:   }
061: 
062:   // il file contiene 25 anni e 12 mesi per ciascun anno
063:   // la scelta piu' ovvia sembrerebbe un array bidimensionale 25x12
064:   // ma in realta' non e' comodo. Ai fini calcoli, infatti, mi devo spostare dalla data
065:   // A alla data B per fare i conti, mese per mese in maniera indipendente dall'anno.
066:   // Molto piu' pratico quindi un array monodimensionale
067:   // i primi 12 elementi conterranno i coefficienti del 2001, i seguenti 12 quelli del 2002 ecc.
068:   // quindi i coefficienti di ogni anno si trovano ogni 12 elementi
069:   double *svals = malloc(25*12*sizeof(double));
070: 
071:   // leggiamo il file, anche se diviso in righe lo posso leggere di seguito
072:   for(int i = 0; i < 25*12; ++i) // ciclo su tutti i valori
073:   {
074:     fscanf(fp, "%lf", &svals[i]);   
075:     //printf("%g ", svals[i]); // stampa di DEBUG
076:   }
077: 
078:   fclose(fp);
079: 
080:   return svals;
081: }
082: 
083: 
084: int checkdate(int ma, int aa, int mb, int ab)
085: {
086:   // controllo che i mesi siano nell'intervallo [1,12]
087:   if(ma < 1 || ma > 12 || mb < 1 || mb > 12) return 1;
088: 
089:   // controllo che gli anni siano nell'intervallo [2001,2025]
090:   if(aa < 2001 || aa > 2025 || ab < 2001 || ab > 2025) return 1;
091: 
092:   // controllo che la data A sia anteriore alla data B
093:   if (ab < aa || ( ab == aa && mb <= ma)) return 1;
094: 
095:   // se arrivo qui, le date sono ok
096:   return 0; 
097: }
098: 
099: // funzione che calcola il potere d'acquisto aggiornato, in pratica realizza (stampa a parte) il punto #5
100: double   svalutata(double amm, int ma, int aa, int mb, int ab, double *coeffs)
101: {
102:   int istart, iend; // indici che mi vanno dalla data A a quella B
103: 
104:   // devo usare tutte le percentuali di svalutazione dal mese successivo
105:   // di quello della data A al mese compreso della data B
106:   // a che indici corrispondono?
107:   // ogni 12 elementi si cambia anno e l'elemento 0 corrisponde a
108:   // gennaio 2001
109: 
110:   // "trucco" gia' visto simile a lezione per calcolare da che indice partire a che indice arrivare
111:   // se ogni 12 elementi si cambia anno, per capire l'indice dell'anno basta moltiplicare indice anno * 12
112:   // 2001 avra' indice 0, 2002 indice 1 ecc. quindi basta sottrarre 2001
113:   // e poi vi sommo l'indice del mese ovvero mese - 1
114:   istart = 12*(aa-2001) + ma;     // qui non c'e' il -1 visto che devo partire dal mese successivo
115:   iend   = 12*(ab-2001) + mb - 1;
116:   //printf("DEBUG: scorro array da %d a %d\n", istart, iend);
117:   for(int i = istart; i <= iend; ++i)
118:   {
119:     amm = amm*(1+coeffs[i]/100); // formola per calcolare la variazione percentuale mese per mese (si cumulano ovviamente)
120:   }
121: 
122:   return amm;
123: }
124: