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: