Prova scritta del 3 settembre 2018 di Fondamenti di Programmazione / Fondamenti di Informatica I Per studenti di Ing. Elettronica e Ing. Gestionale immatricolati negli anni accademici 2016-17 e precedenti DURATA DELLA PROVA: 2 ore
A pena di annullamento immediato della prova:
1) Non è possibile consultare libri o appunti (in qualunque forma) né utilizzare calcolatrici, telefoni cellulari, ecc.
2) Non è consentito comunicare (con qualunque mezzo) 3) Non è consentito uscire dall’aula
Lo studente è tenuto a scrivere, correggere, compilare ed eseguire su computer (a casa o in laboratorio) gli esercizi di programmazione prima della prova orale. Alla prova orale lo studente deve portare una memory pen USB contenente i sorgenti dei programmi corretti e le stampe dei relativi file.
Esercizio 1 (17 punti)
Il file "rime.dat" contiene un dizionario (lungo al massimo 1000 parole), in cui per ogni parola l'accento è evidenziato dalla lettera maiuscola, mentre le restanti lettere sono scritte in minuscolo. Si veda l’esempio a lato.
Due parole formano una rima se sono identiche le lettere a partire dalla vocale accentata fino al fondo della parola.
Si scriva un programma in linguaggio C che legga dalla riga di comando un elenco di parole (scritte nello stesso formato del dizionario) e stampi, per ciascuna, le parole contenute nel dizionaro che fanno rima con essa. Il formato di stampa deve essere quello che si deduce dall'esempio riportato a sinistra. Se nessuna parola del dizionario fa rima (come nel caso di “anEllo”), l'elenco sarà vuoto.
Suggerimento: si carichi il dizionario in memoria facendo uso di un vettore di strutture in cui siano memorizzate le parole e, per ciascuna, l'indice della lettera dove cade l'accento.
Esercizio 2 (13 punti)
Si consideri il seguente tipo di dato struct persona
{
char nome[32];
int interessi[N];
};
che rappresenta una persona, in cui in vettore interessi rappresenta il valore tra 1 e 10 che la persona attribuisce ai suoi N interessi (ad es. cinema, calcio, . . . ). La costante N e gli interessi rappresentati sono uguali per tutte le persone.
Si scriva una funzione che riceva come parametri una variabile p di tipo struct persona, un vettore vp di tipo struct persona e la dimensione n del vettore.
La funzione deve stampare gli indici delle persone (una o più) in vp che hanno la minima differenza di interessi con p.
La minima differenza, che dovrà essere calcolata da una funzione ausiliaria, si calcola come media delle differenze in valore assoluto tra i valori di pari indice.
Ad esempio, se il vettore contiene i dati riportati a lato (con N = 4 e n = 5) e la persona p ha interessi 1, 2, 3 e 5, la funzione deve stampare gli indici 0 e 2 (corrispondenti a Maria e Mario), con i quali la media delle differenze è minima, pari a 0.25.
Angelo andAi arcAngelo aspEtto aspettAi cercherO rispEtto strEtto tornAi tornerO
>rime dispEtto anEllo portAi fuggirO rime per 'dispEtto':
aspEtto rispEtto strEtto
rime per 'anEllo':
rime per 'portAi':
andAi aspettAi tornAi
rime per 'fuggirO':
cercherO tornerO
nome interessi