FONDAMENTI DI INFORMATICA II (A-M) ESAME SCRITTO 22 Luglio 2009 NOTE SULLO SVOLGIMENTO DELLA PROVA SCRITTA: 1. CHI HA GIA’ SUPERATO IL 1° ESONERO PUO’ SVOLGERE SOLO LA SECONDA PARTE 2. SCRIVERE IL PROPRIO NOME, COGNOME E NUMERO DI MATRICOLA IN ALTO SU OGNI FOGLIO UTILIZZATO 3. NON E’ POSSIBILE CONSULTARE NESSUN TIPO DI DOCUMENTAZIONE 4. NON E’ POSSIBILE UTILIZZARE DISPOSITIVI ELETTRONICI 5. PRIMA DI SCRIVERE LA SOLUZIONE DELL’ESERCIZIO, INSERIRE IL NUMERO DI ESERCIZIO CHE SI STA RISOLVENDO E LA PARTE ASSOCIATA (PER ESEMPIO “ESERCIZIO N. 1 PARTE 1”) 6. NON COPIARE DAL VICINO E NON PERMETTETE AL VICINO DI COPIARE (IN TAL CASO I DUE COMPITI VERRANNO ANNULLATI) 7. ALLA FINE DELLA PROVA, RICONSEGNARE TUTTI I FOGLI UTILIZZATI. LA CONSEGNA DEVE ESSERE EFFETTUATA ENTRO E NON OLTRE GLI ORARI INDICATI SULLA LAVAGNA 8. SPEGNERE I CELLULARI a 1 PARTE ESERCIZIO 1 (10 punti) Sia data una immagine (costituita da 320x640 pixel) caratterizzata quindi da 320 righe di 640 interi, dove ciascun elemento indica l’intensità luminosa dei pixel di un’immagine con range da 0 a 255. Sia data inoltre una matrice “rumore” [320][640] che si determina dalla matrice “mat” con questa regola: se il valore medio dell’intensità dei pixel adiacenti è maggiore o uguale all’intensità del pixel stesso, ha valore 0 altrimenti 1. Leggere da file la matrice immagine “mat” e scrivere su file la matrice “rumore” utilizzando le funzioni di gestione file C-like. Implementare in C++ un programma con le seguenti funzioni: 1) Caricamento da tastiera e salvataggio dei dati nei due file “immagine.dat” (per la matrice “mat”) e “rumore.dat” (per la matrice “rumore” ) 2) Visualizzazione della riga della matrice “mat” che ha la media di intensità piu’ alta rispetto alle altre righe 3) Correzione dell’intensità (filtraggio), diminuendo di 1 l’intensità dei pixel che hanno 1 come indice di rumore 4) Ordinamento in ordine decrescente di intensità media delle righe della matrice “mat” ottenuta dopo il filtraggio del passo 3, salvandola quindi su file di nome “filtr.dat” ESERCIZIO 2 (4 punti) Scrivere un programma in C++ con una funzione che prenda in ingresso una matrice di numeri reali “mat” di dimensione n x n. La funzione deve restituire una matrice “trasp” determinata dalla trasposta della matrice “mat” secondo la diagonale principale. Inoltre implementare una funzione per verificare se la matrice “mat” è simmetrica, ossia se è uguale alla sua trasposta “trasp”. L’esercizio deve essere risolto allocando dinamicamente la memoria per le matrici “mat” e “trasp”. ESERCIZIO 3 (2 punti) Indicare che cosa si intende in C++ per variabile “reference” e variabile “puntatore”, facendo degli esempi. Inoltre indicare le differenze (vantaggi/svantaggi) nell’usare i “reference” o i “puntatori”. 1 FONDAMENTI DI INFORMATICA II (A-M) ESAME SCRITTO 22 Luglio 2009 1a PARTE ESERCIZIO 4 (3 punti) Descrivere la sintassi in C++ della macro “assert” e le modalità di utilizzo illustrando alcuni esempi. ESERCIZIO 5 (4 punti) Scrivere la seguente funzione ricorsiva in C++: void hiphurra(int k) che stampa k “hip” seguiti da k “hurra”. Ad esempio hiphurra(3) stampa: hip hip hip hurra hurra hurra Modificare la funzione hiphurra(int k) per stampare a video la sequenza (per esempio k=3): hip hip hip ! hurra hurra hurra ESERCIZIO 6 (4 punti) Dato un array di interi A={43, 81, 2, 80, 42, 23, 9, 30), implementare una funzione che utilizza l’algoritmo di bubblesort per l’ordinamento decrescente. Descrivere il funzionamento dell’algoritmo e illustrare passo per passo come viene ordinato l’array utilizzando il suddetto algoritmo. ESERCIZIO 7 (3 punti) Calcolare la complessità computazionale del seguente algoritmo: int calcola(int v[ ],int n) { int i=0; while(i<n) { if (v[i]!= k) { v[i] = (v[i] * v[i]) /3; } else { v[i] = (v[i] * v[i]) /2 ; return 1; } i=i+1; } return 0; } In particolare, dopo aver descritto il significato di O( ), Ω( ) e Θ( ), definire queste funzioni per il suddetto algoritmo. 2 FONDAMENTI DI INFORMATICA II (A-M) ESAME SCRITTO 22 Luglio 2009 2a PARTE ESERCIZIO 1 (9 punti) Per un grande parcheggio di auto multipiano di un aeroporto, implementare un applicativo gestionale che utilizza le seguenti classi: a. Piano (idPiano, numero_piano, capienza, indirizzo, città, telefono, fax) con i metodi : get e set degli attributi privati + costruttore/distruttore b. Auto (idAuto, modello, marca, targa, anno_imatricolazione, data_ora_ingresso, data_ora_uscita, posto_auto, settore, idPiano) con i metodi : get e set degli attributi privati + costruttore/distruttore c. Autovettura derivata da Auto con l’attributo privato numero_posti e i relativi metodi get e set (eventualmente in overloading) d. Furgone derivata da Auto con l’attributo privato max_carico e i relativi metodi get e set (eventualmente in overloading) Il parcheggio è gestito tramite una array di oggetti Autovettura con 1500 entità, un array di oggetti Furgone con 500 entità e un array di 7 oggetti Piano. Implementare in linguaggio C++ (gestione file stream C++) il programma con le seguenti funzioni: 1) Caricamento da tastiera e salvataggio dei dati nei file “piani.dat”, “autovetture.dat” e “furgoni.dat” (con modalità accesso sequenziale) 2) Stampa su stampante della targa del furgone che è entrato per ultimo (data_ora_ingresso piu’ recente) e la capienza del piano in cui è parcheggiato 3) Cancellazione logica dal file “autovetture.dat” dell’autovettura con targa =”CE 871 AB” (con modalità ad accesso sequenziale) 4) Ordinamento del file “furgoni.dat” (con modalità ad accesso diretto) in ordine crescente di max_carico. ESERCIZIO 2 (2 punti) Considerando l’esercizio precedente introdurre per la classe Furgone l’overloading dell'operatore ‘-’ per ridurre l’attributo max_carico della quantità passata in input al metodo di overloading. 3 FONDAMENTI DI INFORMATICA II (A-M) ESAME SCRITTO 22 Luglio 2009 2a PARTE ESERCIZIO 3 (4 punti) Implementare una classe template in C++ che abbia i seguenti membri : 1) tabella di 50 elementi, ciascuno costituito da tre numeri (giorno, mese e anno); 2) “get” dei dati dalla tabella; 3) “set” dei dati nella tabella; 4) metodo per l’ordinamento in ordine temporale crescente degli elementi nella tabella Infine indicare le operazioni riguardanti la compilazione con i relativi metodi di gestione delle classi template. ESERCIZIO 4 (6 punti) Implementare una classe che permetta di gestire una coda di interi mediante una lista doppiamente linkata che, oltre ai metodi tradizionali (pop, push), implementi le seguenti funzioni: a) funzione friend per calcolare la media degli elementi di valore pari all’interno della coda b) funzione friend per prelevare un elemento e contemporaneamente inserire un elemento all’interno della coda ESERCIZIO 5 (3 punti) Implementare l’esercizio n.4 utilizzando il contenitore list della STL. Illustrare infine i contenitori piu’ comuni della STL. ESERCIZIO 6 (3 punti) Implementare una pagina web con una form che richiama uno script CGI implementato in C++ con le seguenti funzionalità: 1) Dati in input la base minore, la base maggiore e l’altezza di un trapezio rettangolo (forniti tramite tre numeri interi in una web form con il metodo get), determinare il perimetro e l’area del trapezio (da fornire al client) ESERCIZIO 7 (3 punti) Considerata una Windows Form in C++ con tre “textbox” e un “button” (e le relative “label”), indicare i passi da compiere per gestire la finestra implementando le seguenti funzionalità: 1) acquisire i dati dalle prime due “textbox”, supponendo di avere due dati di tipo intero 2) visualizzare il dato nella terza “textbox”, ottenuto dalla media dei due dati acquisiti in precedenza 4