Politecnico di Torino INFORMATICA II Esame del 19 Luglio 2008 1. Realizzare un programma in linguaggio C per evidenziare le variazioni percentuali di un insieme di azioni quotate in borsa. In un file di tipo testo sono elencate tutte le società quotate nella borsa di riferimento e le loro sigle. Il file si chiama BORSA.TXT ed ogni riga ha il seguente formato: <sigla> <nome della società> dove <sigla> è una stringa lunga al massimo 4 caratteri (senza spazi intermedi); <nome della società> è formato da un numero imprecisato di parole ed occupa il resto della riga. Esempio (del contenuto del file BORSA.TXT): F Fiat ENEL Ente Nazionale Energia Elettrica ENI Ente Nazionale Idrocarburi PMI Banca Popolare di Milano G Assicurazioni Generali MB Mediobanca STM S.T. Microelectronics CLE Class Editori In due altri files, i cui nomi sono passati sulla linea di comando, rispettivamente come primo e secondo parametro, sono contenuti i dati riguardanti i valori di uno stesso gruppo di azioni (al massimo 100) alla chiusura delle contrattazioni di due giorni consecutivi. Il gruppo di azioni è lo stesso nei due files ma l ordine con cui sono elencate è diverso. (Il gruppo delle azioni elencate in questi due file è pertanto un sottoinsieme dell elenco presente in BORSA.TXT). Ogni riga di questi due file ha il seguente formato: <sigla> <valore di chiusura> dove <sigla> è una delle sigle presenti nel file BORSA.TXT e <valore di chiusura> è il valore in euro al termine della giornata considerata. Il programma deve produrre il resoconto delle variazioni visualizzando sul monitor una riga per ogni azione presente nei due file, con le seguenti informazioni: 1. Sigla. 2. Nome esteso della società. 3. Valore di chiusura del primo dei due giorni considerati. 4. Valore di chiusura del secondo dei due giorni considerati. 5. Incremento percentuale del valore (positivo se ha guadagnato, negativo se ha perduto). L output deve essere ordinato in base all incremento percentuale (dal migliore al peggiore)
Ad esempio, se il primo file (il cui nome sia ad esempio IERI.TXT ) contenesse i seguenti dati: MB 3.950 ENI 7.080 G 39.150 STM 48.250 ed il secondo file (di nome OGGI.TXT ) contenesse i seguenti dati: STM 50.000 MB 4.200 G 40.500 ENI 6.750 Se il nome del programma fosse quotazioni.exe, allora il comando: deve generare il seguente output: quotazione.exe IERI.TXT OGGI.TXT MB Mediobanca 3.950 4.20 +6.3% STM S.T. Microelectronics 48.250 50.00 +3.6% G Assicurazioni Generali 39.150 40.50 +3.4% ENI Ente Nazionale Idrocarburi 7.080 6.75-4.7% 2 Teoria 1) Quali sono le fasi di esecuzione di un istruzione? 2) Che cos è un ipertesto? Programma #include <stdio.h> #include <string.h> typedef enumfalso, vero boolean; /* Base dati: un unica struttura con tutti I dati di output! */ typedef struct
char sigla[5]; char nome[76]; double ieri; double oggi; double perc; dati; /* prototipo funzione di riordinamento in base alla percentuale */ void bubble (dati borsa[], int n); int main(int argc, char *argv[]) dati vett[100]; char sigla[5], nome_soc[76]; boolean trovato; double val; int i, j, k; FILE *fp; if (argc!= 3) printf("\nerrore nel numero dei parametri!"); exit(2); if((fp=fopen(argv[1], "r"))==null) printf("\nerrore nell'apertura di %s", argv[1]); exit(0); /* Lettura del primo file (dati del giorno prima) */ i = 0; while (!feof(fp)) fscanf(fp,"%s%lf", vett[i].sigla, &vett[i].ieri); i++; fclose (fp); if((fp=fopen(argv[2], "r"))==null) printf("\nerrore nell'apertura di %s", argv[2]); exit(1); /* Lettura del secondo file (dati del giorno dopo) */ for(j=0; j<i; j++) fscanf(fp,"%s%lf", sigla, &val); /* Cerca nella struttura la sigla corretta per inserire il valore */ k = 0; trovato = falso; while (!trovato) if (strcmp(sigla, vett[k].sigla)==0)
trovato = vero; vett[k].oggi = val; /* Ora può calcolare la percentuale di variazione */ vett[k].perc = ((vett[k].oggi - vett[k].ieri) / vett[k].ieri) * 100.0; else k++; /* Riordina il vettore di strutture in base al campo percentuale */ bubble (vett, i); if((fp=fopen("borsa.txt", "r"))==null) printf("\nerrore nell'apertura di BORSA.TXT"); exit(0); /* Ora legge il file BORSA.TXT e per ogni sigla che legge controlla se corrisponde a una sigla del vettore di strutture */ while (!feof(fp)) fscanf(fp,"%s", sigla); /* legge il nome completo della società: possono essere molte stringhe */ fgets (nome_soc, 75, fp); /* sostituisce il new line fornito da fgets con fine stringa */ k = strlen(nome_soc); if (nome_soc[k-1] == '\n') nome_soc[k-1] = '\0'; /* Controlla se la sigla compare nel vettore di strutture! */ j = 0; trovato = falso; while (!trovato && j < i) if (strcmp(sigla, vett[j].sigla) == 0) strcpy(vett[j].nome, nome_soc); trovato = vero; else j++; fclose(fp); /* Output finale: visualizza i dati nella struttura */ for (j=0; j<i; j++) printf("\n%s \t%s %lf %lf %+lf \% ", vett[j].sigla, vett[j].nome, vett[j].ieri, vett[j].oggi, vett[j].perc); /* Funzione di riordinamento in base al campo percentuale */ void bubble (dati borsa[], int n) dati provv;
int i; boolean inordine = falso; while (!inordine) inordine = vero; for (i=0; i<n-1; i++) if (borsa[i].perc < borsa[i+1].perc) provv = borsa[i]; borsa[i] = borsa[i+1]; borsa[i+1] = provv; inordine = falso;