CORSO DI LAUREA IN INGEGNERIA ELETTRICA, CHIMICA e MATERIALI Informatica B, C Anno Accademico 2016-2017 Proff. Danilo ARDAGNA Prima Prova in Itinere 4.5.2017 Cognome Nome Matricola Firma Durata: 2h Valutazioni 1 (4) 2 (4) 3 (12) 4 (6) 5 (6) Si ricorda che non è possibile consultare libri o appunti, o utilizzare la calcolatrice. - 1 - punti 4 Effettuare il tracing delle variabili del seguente programma: in particolare elencare la sequenza di istruzioni che viene eseguita e, per ciascuna di esse, lo stato delle variabili dopo l esecuzione. Indicare infine l output delle printf del programma. 1
#include <stdio.h> 2 void main() int i, j; 1 i=-1; 2 j=1; 3 printf ("i j\n"); 4 while(i<=20 && j <=10) 5 printf ("%d %d\n",i,j); 6 if (i % 2==0) 7 i=3*i-j; 8 else 9 j++; 10 i=j*2; Output delle chiamate a printf i j -1 1 4 2 10 2-2 - punti 4 Convertire in binario complemento a 2 i numeri A=-25 e B=-123 sul numero minimo di bit necessari per rappresentare entrambi i numeri. Effettuare poi le operazioni di somma A+B e sottrazione B-A indicando se si è verificato o meno overflow. Commentare e motivare tutti i passaggi. Per rappresentare i due numeri sono necessari 8 bit. -A 2cpl2 = 00011001 A 2cpl2 = 11100111 -B 2cpl2 = 01111011 B 2cpl2 = 10000101 A+B = 01101000 (OVERFLOW, da due numeri negativi si ottiene un valore positivo, si ha anche riporto perduto come effetto collaterale) B-A = 10011110 (NO OVERFLOW) - 3 - punti 12 Date le seguenti strutture dati (relative all anagrafe clienti, al consumo elettrico orario nell arco della giornata di utenze residenziali e a un archivio consumi su base mensile) e il frammento di codice del programma principale: #include <stdio.h> #define N_CLIENTI 10000 #define MAX_STR 30 #define MAX_COD_FIS 16 #define MAX_LETTURE_PER_MESE 31*24 typedef struct char cognome[max_str+1]; char nome[max_str+1]; char indirizzo[max_str+1]; char codice_fiscale[max_cod_fis+1]; t_cliente; typedef struct 2
int gg, hh; int consumo_orario; t_lettura; 3 typedef struct int mm, aaaa; t_cliente cliente; t_lettura lettura_mensile[max_letture_per_mese]; t_archivio_consumi_cliente; void main() t_archivio_consumi_cliente mese[n_clienti]; /* Acquisizione dati non richiesta l implementazione */ Dopo l acquisizione dei dati dei clienti e dei valori di consumo nell arco di un mese (la scrittura di questa fase non è richiesta e non va svolta), si completi il codice del programma implementando le seguenti funzionalità: Calcolare i consumi totali di tutti i clienti data una certa data (giorno/mese/anno); Stampare i dati dell utente che in un mese ha effettuato il consumo più alto in un certo mese e anno #include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> #define N_CLIENTI 5 #define MAX_STR 30 #define MAX_COD_FIS 16 #define MAX_LETTURE_PER_MESE 31*24 typedef struct char cognome[max_str+1]; char nome[max_str+1]; char indirizzo[max_str+1]; char codice_fiscale[max_cod_fis+1]; t_cliente; typedef struct int gg, hh; int consumo_orario; t_lettura; typedef struct int mm, aaaa; t_cliente cliente; t_lettura lettura_mensile[max_letture_per_mese]; t_archivio_consumi_cliente; int main() t_cliente cliente; int index; int mm, aaaa; t_archivio_consumi_cliente mese[n_clienti]; char cognome[max_str], nome[max_str], indirizzo[max_str], cf[max_str]; 3
4 /* ACQUISIZIONE DATI * * ======================================================= */ srand(time(null)); /* Questa funziona inizialliza un generatore di numeri pseudocasuali */ aaaa = 2017; mm = 3; for (int nomi = 0; nomi < N_CLIENTI; nomi++) index = 0; for (int g = 0; g < 31; g++) for (int h = 0; h< 24; h++) mese[nomi].lettura_mensile[index].gg = g+1; mese[nomi].lettura_mensile[index].hh = h; if ((h >=17 && h<= 23)) mese[nomi].lettura_mensile[index].consumo_orario = rand()%200; /* Numero pseudo-casuale */ else mese[nomi].lettura_mensile[index].consumo_orario = rand()%3; /* Numero pseudocasuale */ index++; /* I codici fiscali (come gli altri dati) sono puramente fittizi */ if (nomi == 0) strcpy(cliente.cognome, "Rossi");strcpy(cliente.nome, "Marco");strcpy(cliente.indirizzo, "via Roma 51, Torino");strcpy(cliente.codice_fiscale, "XYZTRE01A11W111S"); else if (nomi == 1) strcpy(cliente.cognome, "Verdi");strcpy(cliente.nome, "Giuseppe");strcpy(cliente.indirizzo, "via Indipendenza 31, Milano");strcpy(cliente.codice_fiscale, "XYZTRE01B41W111S"); else if (nomi == 2) strcpy(cliente.cognome, "Zucchi");strcpy(cliente.nome, "Maria");strcpy(cliente.indirizzo, "Piazza Felice 11, Pisa");strcpy(cliente.codice_fiscale, "FGZTRE01A13E11S"); else if (nomi == 3) strcpy(cliente.cognome, "Bassetti");strcpy(cliente.nome, "Pina");strcpy(cliente.indirizzo, "via Pascal 23, Trento");strcpy(cliente.codice_fiscale, "QWZTRE01A11W122S"); else if (nomi == 4) strcpy(cliente.cognome, "Bianchi");strcpy(cliente.nome, "Ugo");strcpy(cliente.indirizzo, "via Alloro 45, Pavia");strcpy(cliente.codice_fiscale, "POZTRE01A11W145S"); mese[nomi].cliente = cliente; mese[nomi].aaaa = aaaa; mese[nomi].mm = mm; /* * Lettura dei dati introdotti */ for (int clienti = 0; clienti < N_CLIENTI; clienti++) printf("consumi riferiti al mese %d anno %d\n\n", mese[clienti].mm, mese[clienti].aaaa); printf("%s %s %s cf: %s\n", mese[clienti].cliente.nome, mese[clienti].cliente.cognome, mese[clienti].cliente.indirizzo, mese[clienti].cliente.codice_fiscale ); printf("=========================================================\n"); for (int letture = 0; letture < MAX_LETTURE_PER_MESE; letture++) 4
printf("%d KWh %d/%d/%d ore %d:00\n", mese[clienti].lettura_mensile[letture].consumo_orario, mese[clienti].lettura_mensile[letture].gg, mese[clienti].mm, mese[clienti].aaaa, mese[clienti].lettura_mensile[letture].hh ); printf("----------\n"); 5 /* * Fine della fase di acquisizione dei dati * ======================================================== */ int max = -1; t_cliente persona_con_consumo_massimo; double totale; int gg; gg = 17; /* Primo quesito */ totale = 0; for (int clienti = 0; clienti < N_CLIENTI; clienti++) for (int lettura = 0; lettura < MAX_LETTURE_PER_MESE; lettura++) if (mese[clienti].aaaa == aaaa && mese[clienti].mm == mm && mese[clienti].lettura_mensile[lettura].gg == gg) totale = totale + mese[clienti].lettura_mensile[lettura].consumo_orario; /* 24 letture orarie */ printf("\nprimo quesito:\n================\n\n"); printf("i consumi totali per il giorno %d/%d/%d sono stati: %lf KWh\n", gg, mm, aaaa, totale); printf("\nsecondo quesito:\n================\n\n"); /* Secondo quesito */ for (int clienti = 0; clienti < N_CLIENTI; clienti++) if (mese[clienti].aaaa == aaaa && mese[clienti].mm == mm) totale = 0; for (int lettura = 0; lettura < MAX_LETTURE_PER_MESE; lettura++) totale = totale + mese[clienti].lettura_mensile[lettura].consumo_orario; printf("cliente %s %s: il consumo per il mese %d/%d e' stato %lf kwh\n", mese[clienti].cliente.nome, mese[clienti].cliente.cognome, mese[clienti].mm, mese[clienti].aaaa, totale); if (max < totale) max = totale; persona_con_consumo_massimo = mese[clienti].cliente; printf("\n Il cliente con il consumo più alto e' stato %s %s %s cf %s\n", persona_con_consumo_massimo.nome, persona_con_consumo_massimo.cognome, persona_con_consumo_massimo.indirizzo, persona_con_consumo_massimo.codice_fiscale); return 0; 5
6-4 - punti 6 Specificare le strutture dati necessarie ad un programma per la gestione di un archivio di registrazioni musicali. Ogni registrazione è caratterizzata dalle seguenti informazioni: Autore e titolo dell opera (rispettivamente di al più 50 e 100 caratteri); Il tipo di supporto tra CD, Vinile, Cassetta, file in formato mp3 e flac; Anno di uscita; Titoli dei brani e la loro lunghezza in minuti, secondi; Il genere (musica Classica, Rock, Pop, Indie, ecc.). Le strutture dati devono permettere a un ipotetico programma di gestire l archivio in modo da permettere semplici interrogazioni quali: restituire tutti i gli autori che hanno fatto uscire un lavoro in un certo anno, tutti i lavori per i quali è disponibile sia la versione in vinile che CD, i titoli dei brani e i tempi dati autori e titolo dell opera, tutte le registrazioni per un certo genere musicale. #define MAX_AUTORE_STG 30 #define MAX_TITOLO_STG 40 #define MAX_BRANO_STG 50 #define MAX_N_BRANI 30 typedef struct char titolobrano[max_brano_stg]; int duratamin, duratasec; t_brano; typedef struct char Autore[MAX_AUTORE_STG]; char Titolo[MAX_TITOLO_STG]; enum LP, CD, CT, M3, FL tiposupporto; int annouscita; enum Rk, Cl, Pp, HR, HM, Fl Genere; t_brano Brani[MAX_N_BRANI]; t_articolo; - 5 - punti 6 Scrivere un programma C che acquisisce e memorizza in un array 100 numeri interi. Il programma calcola e visualizza la media e deviazione standard della serie acquisita. Calcolare la deviazione standard come: #include <stdio.h> #include <math.h> #define N_SERIE 100 void main() int i; int v[n_serie]; float media, sigma; 6
float sum; 7 for(i=0; i<n_serie;i++) printf ("Inserirere numero %d\n",i+1); scanf("%d",&v[i]); sum=0; for (i=0; i<n_serie;i++) sum+=v[i]; media=sum/n_serie; sum=0; for (i=0; i<n_serie;i++) sum+=(v[i]-media)*(v[i]-media); sigma=sqrt(sum/n_serie); printf("%f %f",media,sigma); 7