27
Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento ` e realizzato, ` e rilasciato sotto licenza Creative-Commons Attribution-NonCommercial- ShareAlike 4.0. http://creativecommons.org/licenses/by-nc-sa/4.0/, il codice di cui ` e corredato, sotto licenza GPLv3 o successive, https://www.gnu.org/licenses/gpl-3.0.html 1 Esercizi tratti da temi d’esame 1.1 Sintesi di codice C 1.1.1 24 gennaio 2014 - punti totali 16 Si consideri un sistema informatico dedicato alla gestione dei trasporti pubblici di una grande citt` a. Per poter analizzare i percorsi dei mezzi pubblici, l’area (supposta rettangolare) della citt` a viene suddivisa in N × M sottoaree rettangolari. Ciascuna sottoarea ` e caratterizzata dalle sue coordinate lungo gli assi x e y, ciascuna delle quali ` e espressa da un numero intero (compreso tra 1 e N nel caso della coordinata x,e tra 1 ed M nel caso della coordinata y). Ad esempio la sottoarea di coordinate x = 3, y = 14 fa parte della terza colonna e della 14a riga. Un PercorsoLinea ` e una struttura dati che rappresenta la successione di fermate di una linea di trasporto pubblico. Un PercorsoLinea ` e una lista sequenziale con al massimo 100 elementi. Ciascun elemento, il cui tipo di dato ` e chiamato ZonaFermata, contiene le coordinate x e y della sottoarea nella quale la fermata considerata si trova, e il tempo, in minuti, che un mezzo della linea di trasporto pubblico considerata impiega a raggiungere la fermata a partire dal capolinea di partenza. Quest’ultimo dato, chiamato DurataViaggio,` e rappresentato da un numero reale. Il primo elemento di un PercorsoLinea rappresenta il capolinea di partenza; per semplicit` a si consideri solo la corsa di andata della linea di trasporto pubblico considerata. Un dato di tipo LineaTrasporto contiene: PercorsoLinea associato ad una determinata linea di trasporto pubblico il nome della linea di trasporto, NomeLinea, rappresentato da un numero intero la frequenza della linea di trasporto, FrequenzaLinea, rappresentata da un numero reale che indica ogni quanti minuti un mezzo pubblico parte dal capolinea corrispondente al primo elemento del Percorso- Linea Un dato di tipo MappaTrasporti ` e un array di N ×M elementi, ciascuno dei quali corrisponde ad una delle sottoaree in cui ` e stata suddivisa la citt` a. Ciascun elemento della MappaTrasporti ` e una lista sequenziale in grado di contenere al massimo 25 dati di tipo NomeLinea. Definizione di tipi di dato – Punti 2 Si definiscano i tipi di dato DurataViaggio, NomeLinea, Frequen- zaLinea, ZonaFermata, PercorsoLinea, LineaTrasporto, MappaTrasporti. Si considerino N e M sono parametri del programma al quale dare i valori 700 e 900. Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei prototipi dei seguenti sottoprogrammi: 1

Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Eserciziario - Informatica

Revisione 0.1

Alessandro Barenghi, Andrea Romanoni

February 25, 2016

Il presente documento e realizzato, e rilasciato sotto licenza Creative-Commons Attribution-NonCommercial-ShareAlike 4.0.http://creativecommons.org/licenses/by-nc-sa/4.0/, il codice di cui e corredato, sotto licenza GPLv3o successive, https://www.gnu.org/licenses/gpl-3.0.html

1 Esercizi tratti da temi d’esame

1.1 Sintesi di codice C

1.1.1 24 gennaio 2014 - punti totali 16

Si consideri un sistema informatico dedicato alla gestione dei trasporti pubblici di una grande citta.Per poter analizzare i percorsi dei mezzi pubblici, l’area (supposta rettangolare) della citta viene suddivisa

in N ×M sottoaree rettangolari. Ciascuna sottoarea e caratterizzata dalle sue coordinate lungo gli assi xe y, ciascuna delle quali e espressa da un numero intero (compreso tra 1 e N nel caso della coordinata x, etra 1 ed M nel caso della coordinata y). Ad esempio la sottoarea di coordinate x = 3, y = 14 fa parte dellaterza colonna e della 14a riga.

Un PercorsoLinea e una struttura dati che rappresenta la successione di fermate di una linea di trasportopubblico. Un PercorsoLinea e una lista sequenziale con al massimo 100 elementi.

Ciascun elemento, il cui tipo di dato e chiamato ZonaFermata, contiene le coordinate x e y della sottoareanella quale la fermata considerata si trova, e il tempo, in minuti, che un mezzo della linea di trasporto pubblicoconsiderata impiega a raggiungere la fermata a partire dal capolinea di partenza.

Quest’ultimo dato, chiamato DurataViaggio, e rappresentato da un numero reale. Il primo elemento diun PercorsoLinea rappresenta il capolinea di partenza; per semplicita si consideri solo la corsa di andatadella linea di trasporto pubblico considerata.

Un dato di tipo LineaTrasporto contiene:

• PercorsoLinea associato ad una determinata linea di trasporto pubblico

• il nome della linea di trasporto, NomeLinea, rappresentato da un numero intero

• la frequenza della linea di trasporto, FrequenzaLinea, rappresentata da un numero reale che indica ogniquanti minuti un mezzo pubblico parte dal capolinea corrispondente al primo elemento del Percorso-Linea

Un dato di tipo MappaTrasporti e un array di N×M elementi, ciascuno dei quali corrisponde ad una dellesottoaree in cui e stata suddivisa la citta. Ciascun elemento della MappaTrasporti e una lista sequenziale ingrado di contenere al massimo 25 dati di tipo NomeLinea.

Definizione di tipi di dato – Punti 2 Si definiscano i tipi di dato DurataViaggio, NomeLinea, Frequen-zaLinea, ZonaFermata, PercorsoLinea, LineaTrasporto, MappaTrasporti.

Si considerino N e M sono parametri del programma al quale dare i valori 700 e 900.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei prototipi dei seguentisottoprogrammi:

1

Page 2: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

• StampaOrario: legge da tastiera il nome di una linea (numero intero) e stampa a schermo un elencodelle fermate della linea, con le coordinate e il tempo impiegato da un mezzo di trasporto della lineaper raggiungerla ognuna di esse.

• TuttoCoperto: riceve in ingresso la descrizione delle linee di trasporto pubblico e verifica se tutte lesottoaree della citta contengono almeno una fermata. Le linee di trasporto sono descritte tramite unarray di 1000 dati di tipo LineaTrasporto. Per determinare se un’area contiene una fermata dei mezzipubblici occorre verificare se le sue coordinate compaiono in almeno uno dei dati di tipo ZonaFermata dialmeno una delle linee di trasporti pubblici. La funzione restituisce 1 se tutte le sottoaree sono coperte,0 altrimenti. Dal momento che le linee di trasporto pubblico della citta possono essere meno di 1000,il programma chiamante scrivera 0 nel campo NomeLinea degli elementi dell’array non effettivamenteutilizzati. La funzione TuttoCoperto deve ignorare gli elementi aventi campo NomeLinea pari a zero(non necessariamente consecutivi).

• EsisteIncrocio: riceve in ingresso due dati di tipo PercorsoLinea, e verifica se le due linee di trasportopubblico da essi descritte si incrociano. In caso affermativo restituisce un dato di tipo ZonaFermatache descrive l’incrocio. Si dice che due linee di trasporto pubblico si incrociano se i rispettivi Per-corsoLinea hanno almeno una ZonaFermata in comune; ovverosia se una o piu coppie di coordinate(x, y) compaiono nei PercorsoLinea di entrambe le linee di trasporto pubblico. Il dato restituito daEsisteIncrocio deve rappresentare l’ incrocio, tra quelli rilevati, per il quale la somma delle Durate-Viaggio delle due linee e minima. Tale somma va inserita nel campo DurataViaggio del dato restituito,mentre le coordinate x e y nel dato restituito dovranno essere quelle della sottoarea dell’incrocio.

• GeneraMappa: riceve in ingresso gli stessi dati della funzione TuttoCoperto e in aggiunta unastruttura MappaTrasporti di cui sovrascrive il contenuto come segue. In ciascun elemento della Map-paTrasporti va inserito l’elenco dei NomeLinea di tutte le linee di trasporto pubblico che hanno unafermata nella corrispondente zona della citta.

Implementazione – Punti 5 Si implementi la funzione TuttoCoperto descritto nel punto 2.2.

Implementazione – Punti 7 Si implementi la funzione EsisteIncrocio descritto nel punto 2.2.

1.1.2 13 febbraio 2014 - punti totali 16

Un segnale acustico e costituito dalla somma di molte componenti, ciascuna caratterizzata dalla propriafrequenza F . L’ ampiezza di una di queste componenti e rappresentabile tramite un numero reale. L’ampiezza delle componenti puo variare nel tempo.

Una possibile rappresentazione di un brano musicale, lo Spettrogramma, e da una matrice di numeri reali.Una riga della matrice rappresenta l’ evoluzione della componente con frequenza F nel tempo. Una colonnadella matrice rappresenta l’ ampiezza delle componenti all’ istante di tempo T .

Si considerino spettrogrammi rappresentanti 10000 componenti in frequenza, per 3000 istanti di tempo.Il tipo di dato Spettrogramma e dunque rappresentato da una matrice di 10000 righe e 3000 colonne. Lospettrogramma di un frammento di brano e rappresentato da una matrice di 10.000 righe per 300 colonnedi valori reali: questo tipo di dato e chiamato SpettrogrammaRidotto.

Si definisce Impronta di un brano una matrice di interi, grande quanto lo spettrogramma riempita comesegue:

• Una cella dell’ impronta ha valore 1 se la corrispondente cella dello spettrogramma e un massimolocale nel tempo per la componente in frequenza che essa rappresenta. Questo implica che il valoredella corrispondente cella nello spettrogramma deve essere piu grande sia di quello che lo precede nellariga, sia di quello che lo segue.

• Tutte le altre celle dell’ impronta hanno valore zero

Si definisce ImprontaRidotta una matrice riempita secondo lo stesso schema di Impronta, ma ottenuta dauno SpettrogrammaRidotto.

Un riconoscitore di brani musicali ha a disposizione un Elenco, che puo contenere al piu 100000 elementi,ognuno dei quali costituito da un’ Impronta e da un identificativo numerico intero del brano.

Definizione di tipi di dato – Punti 2 Definire i tipi di dato Spettrogramma, SpettrogrammaRidotto,Impronta, ImprontaRidotta ed Elenco.

2

Page 3: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Definizione di prototipi di funzione – Punti 2 Il riconoscitore di brani musicali opera a partire da unoSpettrogrammaRidotto del brano da riconoscere e restituisce l’ identificativo numerico del brano piu similead esso presente nella sua variabile Elenco, attraverso il seguente processo: ricava l’ ImprontaRidotta dalloSpettrogrammaRidotto e la confronta con le Impronte presenti nell’ elenco, trovando la piu simile.

Un confronto tra un’ ImprontaRidotta e un’ Impronta avviene sovrapponendo l’ ImprontaRidotta auna porzione contigua di Impronta a partire da un certo istante di tempo della seconda. Date le dimensionidi Impronta e ImprontaRidotta e possibile sovrapporre la seconda a una porzione della prima in 2701posizioni diverse, aumentando ogni volta il numero di istanti di tempo (colonne) di Impronta che vengonosaltate a partire dall’ inizio. L’ indice di similitudine viene calcolato come il numero di celle sovrapposte chehanno valore 1 sia nell’ Impronta, che nell’ImprontaRidotta.

Il massimo indice di similitudine tra tutti quelli ricavati con i confronti tra ImprontaRidotta e Impronta

rappresenta la similitudine del brano con quello da riconoscere. Il riconoscitore restituisce quindi il branonell’ elenco che risulta essere piu simile.

Si esplicitino le dichiarazioni dei soli prototipi delle seguenti funzioni:

• CostruisciImprontaRidotta: riceve un parametro di tipo SpettrogrammaRidotto e uno di tipo Im-prontaridotta. Calcola l’ impronta dello spettrogramma e la salva nel secondo parametro.

• Confronta: riceve in ingresso un’Impronta e un’ImprontaRidotta e restituisce il massimo numero dipicchi coincidenti al variare delle possibili sovrapposizioni tra ImprontaRidotta e Impronta.

• Riconosci: riceve in ingresso un Elenco e uno SpettrogrammaRidotto e restituisce l’ indice del branodell’ Elenco la cui Impronta ha il massimo numero di picchi coincidenti con l’ImprontaRidotta ricevutain ingresso.

Implementazione – Punti 3 Si implementi la funzione CostruisciImprontaRidotta descritto nelpunto 2.2.

Implementazione – Punti 7 Si implementi la funzione Confronta descritto nel punto 2.2.

Implementazione – Punti 3 Si implementi la funzione Riconosci descritto nel punto 2.2. Si consigliadi utilizzare le funzioni CostruisciImprontaRidotta e Confronta implementate in precedenza.

1.1.3 6 marzo 2014 - punti 16

Si consideri il sistema per gestire i risultati e le tempistiche di un campionato di sci. Uno sciatore erappresentato dal suo nome e cognome (due array di caratteri da 20 elementi terminati da \0) e la suaeta (un intero senza segno). Una gara di sci e rappresentata dai risultati di 30 sciatori. Un risultato erappresentato da uno sciatore e un tempo d’ arrivo, espresso in centesimi di secondo e rappresentato da unintero. Un campionato e rappresentato da una lista sequenziale di al piu 10 gare.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato gara, risultato, sciatore, campionato.

Definizione di prototipi di funzione – Punti 2 Si consideri il punteggio ottenuto da uno sciatorearrivato in posizione n-esimo in gara come 30− n.

Si esplicitino le dichiarazioni dei soli prototipi delle seguenti funzioni:

• La funzione riordina accetta una gara come parametro in ingresso e la restituisce dopo aver ordinatoi risultati che la compongono in ordine crescente rispetto ai tempi d’arrivo.

• La funzione ottieni punteggio accetta una gara e uno sciatore come parametri in ingresso e calcolail punteggio ottenuto dallo sciatore in quella gara. La gara passata alla funzione si assume essere giastata ordinata in precedenza.

• La funzione classifica accetta un campionato, un array di sciatori contenente tutti i partecipanti alcampionato in ingresso e il numero di partecipanti come un intero senza segno. Essa stampa a videola lista dei partecipanti, insieme alla somma dei punteggi da loro ottenuti in tutto il campionato.

Implementazione – Punti 3 Si implementi la funzione riordina descritto nel punto 2.2.

3

Page 4: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Implementazione – Punti 7 Si implementi la funzione ottieni punteggio descritto nel punto 2.2.

Implementazione – Punti 3 Si implementi la funzione classifica descritto nel punto 2.2. Si consigliadi utilizzare le funzioni riordina e ottieni punteggio implementate in precedenza.

1.1.4 24 giugno 2014 - punti totali 16

In un vocabolario, grazie all’ordinamento e facile l’accesso rapido (mediante ricerca binaria) a parole intere.Si vuole scrivere un programma C che permetta l’accesso rapido anche alla parti finali delle parole. Adesempio, in un vocabolario che contiene “ciao”, deve essere possibile l’ accesso rapido anche a “iao”, “ao”,“o”.

Una parola e un array di 20 caratteri terminato da carattere nullo ‘\0’. Un vocabolario e un arraydi 20000 parole ordinate alfabeticamente.

Un finale di parola e rappresentato da un puntatore al primo carattere della parte finale di una parolapresente nel vocabolario.

Una estensione di vocabolario, e una lista sequenziale di al piu 400000 finali di parola: contienequindi i puntatori alle parti finali delle parole di un intero vocabolario. I finali contenuti in un’Estensionesono ordinati in base all’ordinamento alfabetico delle parti puntate.

Nel caso ci sia piu di un’ occorrenza di una parte finale di parola del vocabolario, ad ogni sua occorrenzae associato un diverso puntatore nell’ estensione. Ad esempio un vocabolario contenente Roma e toma

avra due puntatori nell’ estensione, uno che punta alla stringa oma, parte finale di Roma, l’ altro alla stringaoma parte finale di toma.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato parola, vocabolario, finale, estensione.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• InserisciInOrdine: accetta in ingresso una estensione e un nuovo finale da inserire, e inserisce ilfinale nell’estensione mantenendo l’ordinamento alfabetico delle parti finali puntate.

• CostruisciEstensione, che accetta in ingresso un vocabolario e ne costruisce l’ estensione.

• CercaParteFinale che accetta in ingresso una estensione di vocabolario e una stringa da cercare,e restituisce una lista sequenziale contenente tutti i finali di parola che puntano alla stringa cercata.La lista sequenziale da restituire e di tipo estensione.

Implementazione – Punti 6 Si implementi la funzione CostruisciEstensione descritto nel punto 2.2.Gli elementi dell’ estensione costruita, devono essere ordinati in base all’ordinamento alfabetico delleparti puntate. E consentito (e vivamente consigliato) utilizzare il sottprogramma InserisciInOrdine nell’implementazione di CostruisciEstensione assumendo che sia gia stato implementato.

Implementazione – Punti 8 Si implementi la funzione CercaParteFinale descritto nel punto 2.2. Perraggiungere il punteggio pieno e necessario implementare una ricerca efficiente che sfrutti l’ordinamentoalfabetico delle parti puntate. E’ consentito l’ uso di funzioni di confronto tra stringhe presenti nella libreriastandard del C (in particolare, in strings.h)

1.1.5 21 luglio 2014 - punti totali 16

Si implementi un sistema per la gestione della classifica del ranking mondiale dei giocatori di scacchi. Ungiocatore e modellato da

• un array di caratteri contenente il suo nome e cognome (massimo 50 caratteri)

• i suoi anni di inizio e fine attivita, rappresentati da interi. L’ anno di fine attivita e impostato a -1 nelcaso il giocatore sia ancora attivo

• il suo rating ELO (un intero senza segno)

4

Page 5: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Una classifica e un vettore di puntatori a giocatore di 30 elementi. Una torneo e rappresentato comeuna lista sequenziale, contenente al piu 60 puntatori ai giocatori partecipanti e una lista sequenziale dialtrettanti interi rappresentanti la posizione ottenuta dal giocatore al torneo. Un archivio e costituito dauna lista sequenziale di al piu 1000 giocatori, che si assume contenerne almeno 100.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato definire i tipi di dato giocatore, archivio,classifica, torneo.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• aggiorna archivio: riceve l’ archivio dei giocatori e un torneo, aggiorna il rating ELO dei giocatoripresenti al torneo in base alla posizione ottenuta.

• ottieni migliori: riceve l’ archivio dei giocatori e una classifica, aggiorna la classifica inmodo che punti ai migliori 30 giocatori dell’ archivio.

• stelle nascenti: riceve una classifica e stampa a video i 5 migliori giocatori in attivita da menodi 2 anni.

Implementazione – Punti 3 Si implementi la funzione aggiorna archivio. Per ogni giocatore pre-sente al torneo, ovvero quelli puntati dai puntatori del torneo, il nuovo ELO rating e calcolato comeELOprecedente + 10 × (posizione − bnumero partecipanti

2 c). Nel caso un aggiornamento del rating ELO loporti ad essere negativo, esso e posto a 0.

Implementazione – Punti 8 Si implementi la funzione ottieni migliori.

Implementazione – Punti 5 Si implementi la funzione stelle nascenti che riceve una classifica estampa a video i 5 migliori giocatori in attivita da meno di 2 anni. Nel caso i giocatori con meno di dueanni di attivita siano meno di 5, stampa solamente quelli presenti.

1.1.6 9 settembre 2014 - punti totali 16

In un servizio di prenotazione di biglietti, una cinema da m file di n posti e rappresentato tramite unamatrice di m×n posti. Un posto e rappresentato da un codice di prenotazione (un intero) e da un interoche indica se il posto e assegnato (valore 1) o libero (valore 0).

Nella sala, il posto centrale (ovvero quello di coordinate ( (m−1)2 , (m−1)

2 ) e considerato il posto migliore.La qualita di un posto di coordinate (i, j) e valutata secondo la sua “distanza” dal posto centrale definita

come |i− (m−1)2 |+ |j − (m−1)

2 |. Minore e la distanza, maggiore e la qualita del posto.Il servizio di prenotazione analizza una richiesta di prenotazione da parte di un gruppo di persone e

cerca di soddisfarla assegnando loro posti liberi, consecutivi e su una stessa fila. Una richiesta e rappre-sentata da un codice di prenotazione e da un intero r che indica il numero di posti richiesti. Per semplicitasi suppone r dispari e r ≤ n. Il programma procede alla ricerca di r posti liberi, consecutivi e in una stessafila.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato definire i tipi di dato cinema, posto,richiesta, codice.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• verificaliberi: accetta in ingresso un cinema, una coppia di coordinate intere i e j indicanti unposto nel cinema e un numero intero k. Verifica che siano liberi: il posto di coordinate (i, j), i kposti consecutivi all’immediata destra di (i, j), e i k posti consecutivi all’immediata sinistra di (i, j).Restituisce 1 se il posto e libero, 0 altrimenti.

5

Page 6: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

• prenotamigliore: accetta in ingresso un cinema e una richiesta. Se la richiesta puo essere sod-disfatta, tra le diverse possibili assegnazioni, esso determina quella per cui la distanza tra il postobaricentrico della richiesta (ovvero quello al centro del gruppo di r persone) posto centrale del cinemasia minima. In questo caso, il sottoprogramma procede con l’assegnazione, modificando il valore da“libero” a “occupato” per i posti assegnati. Inoltre, esso associa a tali posti il Codice di prenotazionepresente nella Richiesta. In caso contrario, il sottoprogramma non procede ad alcuna assegnazione.

Implementazione – Punti 3 Si implementi la funzione verificaliberi.

Implementazione – Punti 12 Si implementi la funzione prenotamigliore. E vivamente consigliato uti-lizzare la funzione verificaliberi nell’ implementazione di prenotamigliore. Per raggiungere il punteggiopienoe necessario implementare una strategia di ricerca ottimale, in cui le varie posizioni vengono analizzatein ordine decrescente di qualita a partire da quella centrale del cinema, in modo che VerificaLiberi dia esitopositivo per la prima volta in corrispondenza della miglior posizione. Se si implementa una strategia nonottimale, il punteggio assegnabile parte da un massimo di 6 punti.

1.1.7 21 settembre 2014 - punti totali 16

Un appezzamento di terreno in cui crescono alberi alberi deve essere organizzato tramite un programmain C. Un albero e modellato dalla sua eta in anni, espressa come un intero senza segno, dal nome dellapianta, rappresentato da una stringa di 30 caratteri e dal peso raggiunto, espresso come un numero a virgolamobile. L’ appezzamento di terreno, di dimensioni 1000×1000 metri e rappresentare come suddiviso in lottida 10 × 10 metri, all’ interno dei quali possono crescere al piu 15 alberi. Puo essere dunque rappresentatoconvenientemente come una matrice di liste sequenziali di alberi Un inventario di alberi e una lista sequenzialedi puntatori ad albero contenente al piu 50 puntatori.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato definire i tipi di dato albero, lotto,appezzamento, inventario.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• invecchia: La funzione invecchia riceve un appezzamento in ingresso e ne aggiorna lo stato, con-siderando gli effetti della crescita degli alberi presenti trascorso un anno. In particolare quindi, lafunzione incrementa di 1 l’ eta di ogni albero, e ne aumenta il peso p di una quantita pari a 2 + p

10 .

• ispeziona: La funzione ispeziona riceve in ingresso una appezzamento e un inventario di alberi vuoto.In seguito ricerca in tutto l’ appezzamento gli alberi piu vecchi di 100 anni, o piu pesanti di 1000 unita,salvandone gli indirizzi nell’ inventario. La funzione ritorna l’ inventario cosı riempito, ritornandoquando esso e pieno o quando tutti i lotti dell’ appezzamento sono stati esaminati.

• trapianta: La funzione trapianta riceve in ingresso un appezzamento e le coordinate di un suo lottoe trapianta tutti gli alberi contenuti nel lotto, collocandoli uno per lotto, in altri lotti dove non ve nesia presente nessuno. A questo scopo l’ albero viene rimosso dalla lista sequenziale del lotto sorgente,e inserito in quella del lotto destinazione. Nel caso tutti i trapianti abbiano successo, la funzionerestituisce 0, altrimenti 1.

Implementazione – Punti 3 Si implementi la funzione invecchia.

Implementazione – Punti 6 Si implementi la funzione ispeziona.

Implementazione – Punti 6 Si implementi la funzione trapianta.

6

Page 7: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

1.1.8 29 gennaio 2015 - punti totali 16

Si consideri un programma C avente il compito di riordinare un elenco di indirizzi di posta elettronicaproducendo una rubrica. Ogni indirizzo e una stringa di forma [email protected], ad [email protected].

Il nome utente e il server sono costituiti da lettere minuscole e caratteri ’.’, mentre il dominio contienesolamente lettere minuscole. La lunghezza massima di ciascun indirizzo e di 99 caratteri.

Un tipo Indirizzo e un array di 100 caratteri contenente la stringa dell’ indirizzo (99 caratteri piu ilterminatore ’\0’).

Un ElencoIndirizzi e rappresentato da un array di 1000 elementi di tipo Indirizzo.Una Rubrica e una struttura a due campi, contenente un array di 1000 VoceRubrica e un contatore intero

per indicare quanti di essi sono pieni. Ciascuno degli elementi di una Rubrica e di tipo VoceRubrica, ed eutilizzato per rappresentare l’indirizzo contenuto in uno degli elementi non vuoti di un ElencoIndirizzi.Una VoceRubrica si compone di tre campi stringa chiamati nomeutente, server e dominio, usati perstoccare le rispettive porzioni dell’ indirizzo.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato Indirizzo, ElencoIndirizzi, VoceRubrica,Rubrica.

typedef char Indirizzo [100];

typedef Indirizzo ElencoIndirizzi [1000];

typedef struct {

char nomeutente [100];

char server [100];

char dominio [1000];

} VoceRubrica ;

typedef struct {

VoceRubrica elementi [1000];

int pieni;

}

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• TrovaCarattere: riceve in ingresso un carattere (CarDaTrovare) e un puntatore (PuntoDiInizio) adun elemento di un array di caratteri contenente una stringa terminata da ’\0’. TrovaCarattere cercail carattere CarDaTrovare a partire da PuntoDiInizio e, se lo trova ritorna il puntatore all’elementodell’array che lo contiene. Se il carattere non e presente, restituisce NULL.

• Precede: riceve in ingresso due array ArrA e ArrB, contenenti stringhe e restituisce un intero cheindica quale delle due stringhe precede lessicograficamente l’altra. In particolare, restituisce -1 se ArrA

precede ArrB, 0 se sono uguali, 1 se ArrA segue ArrB.

• RiempiRubrica: riceve in ingresso un ElencoIndirizzi e una Rubrica vuota. La funzione inseriscenella Rubrica tutti gli indirizzi contenuti nell’ ElencoIndirizzi, trasformandoli in VoceRubrica,ignorando eventuali elementi Indirizzo vuoti. L’inserimento degli elementi VoceRubrica va effettuatoin ordine, secondo il seguente criterio:

– Ordinati lessicograficamente secondo il dominio

– Nel caso il dominio di due elementi sia lo stesso, ordinati lessicograficamente per server

– Nel caso dominio e server siano identici, ordinati lessicograficamente per nomeutente

Nell’ ElencoIndirizzi non ci sono ne duplicati, ne indirizzi malformati.

• SalvaLista: riceve in ingresso una Rubrica e salva i dati di tipo VoceRubrica in essa contenuti in unfile chiamato “IndirizziMail”. La funzione restituisce un intero. La funzione procede al salvataggio erestituisce il numero di VoceRubrica salvati. Nel caso vi siano problemi nel salvataggio, restituisce -1.

7

Page 8: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

char* TrovaCarattere (char CarDaTrovare , char *PuntoDiInizio);

int Precede(char *ArrA , char *ArrB);

void RiempiRubrica(ElencoIndirizzi e, Rubrica r);

int SalvaLista(Rubrica r);

Implementazione – Punti 3 Si implementi la funzione TrovaCarattere.

char* TrovaCarattere (char CarDaTrovare , char *PuntoDiInizio){

for( ; *PuntoDiInizio !=’\0’; PuntoDiInizio ++){

if (* PuntoDiInizio == CarDaTrovare) {

return PuntoDiInizio;

}

}

return NULL;

}

Implementazione – Punti 5 Si implementi la funzione RiempiRubrica. E possibile, e vivamente con-sigliato, utilizzare la funzione TrovaCarattere e la funzione Precede di cui e stato descritto il prototipo.Non e necessario implementare la funzione Precede, la si assuma disponibile.

Rubrica RiempiRubrica(ElencoIndirizzi e, Rubrica r){

VoceRubrica tmp , new;

int i,j;

char* p_cur ,p_chi ,p_dot;

for (i=0;i <1000;i++){

if(e[i][0]){

p_cur=e[i];

p_chi=TrovaCarattere(’@’, e[i]);

p_cur=p_chi +1;

do { p_dot=p_cur;

p_cur=TrovaCarattere(’.’, p_cur);

} while(p_cur !=NULL);

strcpy(new.dominio , p_dot +1);

for(p_cur=e[i]; p_cur!= p_chi;p_cur ++){

new.nomeutente =* p_cur;

}

for(p_cur=p_chi +1; p_cur!= p_dot;p_cur ++){

new.server =* p_cur;

}

for(j=0;j<r.pieni;j++){

if(Precede(new.dominio ,r.elementi[j]. dominio)==-1){

break;

}

if( (Precede(new.dominio ,r.elementi[j]. dominio)==0) &&

(Precede(new.server ,r.elementi[j]. server )==-1) ) {

break;

}

if( (Precede(new.dominio ,r.elementi[j]. dominio)==0) &&

(Precede(new.server ,r.elementi[j]. server )==0) &&

(Precede(new.nomeutente ,r.elementi[j]. nomeutente)==0)){

break;

}

}

for(;j <= r.pieni ; j++){

tmp=r.elementi[j];

r.elementi[j]=new;

new=tmp;

}

8

Page 9: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

r.pieni=r.pieni ++;

}

}

return r;

}

Implementazione – Punti 5 Si implementi la funzione SalvaLista.

int SalvaLista(Rubrica r){

FILE* fp;

int i;

fp=fopen("./ IndirizziMail","w");

if (!fp){

return -1;

}

for (i=0;i < r.pieni; i++){

fwrite(r[i]. nomeutente , 1, strlen(r[i]. nomeutente), fp);

fwrite(r[i].server , 1, strlen(r[i]. server), fp);

fwrite(r[i].dominio , 1, strlen(r[i]. dominio), fp);

}

fclose(fp);

return i;

}

1.1.9 12 febbraio 2015 - punti titoli 16

Si consideri un programma C avente il compito di gestire un sistema di car-sharing per un’ area metropolitana.Un’ area metropolitana e rappresentata da una matrice di 1000x1000 zone. Ogni zona e individuata da duecoordinate X e Y intere (usate come indici della matrice).

Ciascuna zona puo contenere al massimo un’ auto del servizio di car sharing. Un utente del servizio egeo-localizzato, ovvero e associato alla sua posizione, indicata dalle due coordinate intere X e Y secondo lostesso sistema di riferimento delle zone.

Un utente puo occupare al piu un’ auto tra quelle non occupate e spostarsi con l’ auto occupata all’interno dell’ area metropolitana oppure annullare l’ occupazione dell’auto senza spostarla. Nota bene: epossibile posteggiare l’ auto solo in una zona in cui non sia presente alcuna altra auto del servizio.

La distanza tra due zone A e B di coordinate (xA, yA) e (xB , yB) e calcolata come la somma del valoreassoluto delle differenze tra le rispettive coordinate x e quella delle coordinate y, ovvero d = |xA − xB | +|yA − yB |.

Il servizio addebita all’utente un importo pari a un centesimo di Euro, moltiplicata per la distanza trala zona di prelievo dell’auto e la zona di rilascio della stessa.

Definizione di tipi di dato – Punti 4 Definire i tipi di dato area, zona, utente.Nel progettare la struttura dati si ponga attenzione a quanto segue:

• la zona deve contenere le informazioni circa l’eventuale auto del servizio che si trova al suo interno (see libera oppure occupata e, nel caso sia occupata, da chi)

• l’ utente dovra contenere le informazioni per addebitargli i costi per lo spostamento in auto

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• OccupaAuto: che riceve in ingresso un’area, un utente e le coordinate X,Y che indicano la sua po-sizione. Il sottoprogramma cerca l’auto libera piu vicina all’ utente (ovvero a minima distanza dallasua posizione) e la occupa per conto dell’utente.

9

Page 10: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

• Viaggia: che riceve in ingresso un’area, un utente (che ha gia occupato un’auto), e le due coordinate Xe Y che indicano la zona di destinazione del viaggio. Il sottoprogramma libera la zona in cui si trovaval’auto da lui occupata, determina la zona libera (in cui cioe non siano presenti auto del servizio) piuvicina a quella di destinazione, aggiorna la zona di destinazione segnandola come occupata dall’ auto.Infine, calcola il costo del viaggio in Euro, e lo ritorna.

Implementazione – Punti 5 Si implementi la funzione OccupaAuto.

Implementazione – Punti 5 Si implementi la funzione Viaggia.

1.1.10 5 marzo 2015 - punti 17

Si consideri la rappresentazione di un filmato, di cui ogni fotogramma puo essere costituito da 1920 × 540pixels, oppure da 1920× 1080 pixels.

Allo scopo di rappresentare i fotogrammi, viene utilizzata una matrice, detta frame di 1920× 540 interipositivi.

A seconda del numero di righe del fotogramma, il frame puo costituirne una rappresentazione:

• progressiva: il fotogramma e di dimensioni 1920 × 540, il frame contiene tutte le 540 righe del fo-togramma.

• interlacciata: il fotogramma e di dimensioni 1920× 1080, ogni frame contiene dunque meta delle righedel fotogramma, per la precisione, tutte le righe dispari oppure tutte le righe pari.

Un timed frame e una struttura contenente un frame e un dato di tipo long int utilizzato come timestamp,ovverosia come indicatore dell’ istante di tempo nel quale il frame e stato catturato dalla telecamera.

Un video e una lista sequenziale di al piu 10000 dati di tipo timed frame.Uno stream video e una struttura composta da un video e da un parametro intero che segnala se i

timed frame contenuti nel video sono di tipo interlacciato o progressivo (il parametro vale 1 se i frame sonointerlacciati).

All’interno di un dato di tipo stream video i timestamp dei timed frame componenti il video sono inordine crescente, senza vincoli sulla distanza temporale tra un timed frame e il successivo.

Nello stesso stream video non possono esistere due timed frame aventi lo stesso timestamp.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato frame, timed frame, video, stream video.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• TrovaFrameNero: riceve in ingresso uno stream video con frame progressivi, lo esamina per trovareeventuali timed frame rappresentanti fotogrammi neri e restituisce il timestamp del primo tra essi(quello con timestamp minimo). Un fotogramma e nero se tutti i dati del frame hanno valore zero.

• FondiStream: unisce due stream video allineandone temporalmente i timed frame. La funzionericeve in ingresso tre stream video chiamati VideoIn1, VideoIn2 e VideoOut. Essa svuota VideoOute successivamente inserisce al suo interno tutti i timed frame di VideoIn1 e VideoIn2, in ordine ditimestamp crescente. Nel caso in cui due timed frame abbiano esattamente lo stesso timestamp, lafunzione scarta uno qualunque dei due timed frame. La funzione restituisce 1 se lo spazio disponibilein VideoOut e stato sufficiente per contenere tutti i timed frame, 0 in caso contrario.

• CalcolaSpostamento: che riceve in ingresso due frame chiamati Frame1 e Frame2 e un intero N. Lafunzione confronta la riga di indice N di Frame1 con ciascuna riga di Frame2 e trova quella di Frame2 lacui differenza da essa e minima. La differenza tra due righe A e B e la somma del valore assoluto delledifferenze degli interi contenuti nelle due righe, calcolate elemento per elemento. La funzione restituisceun intero il cui valore e la differenza tra l’indice della riga con differenza minima e il numero N. SeFrame1 e Frame2 rappresentano porzioni della stessa immagine, la differenza e una misura di quantoFrame2 e spostato verticalmente rispetto a Frame1. Nel caso in cui l’indice di R2 risulti inferiore adN, il valore restituito dalla funzione sara negativo.

10

Page 11: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

• RicostruisciFotogramma: unisce tra loro due frame contenenti due rappresentazioni interlacciatedello stesso fotogramma composto da 1920x1080 pixel. La funzione riceve in ingresso due frame,chiamati FramePari e FrameDispari, e una matrice di interi, chiamata Out, di 1920x1080 elementidestinata a contenere la fusione tra di essi.

Implementazione – Punti 3 Si implementi la funzione TrovaFrameNero.

Implementazione – Punti 5 Si implementi la funzione FondiStream.

Implementazione – Punti 6 Si implementi la funzione RicostruisciFotogramma. Allo scopo di ri-costruire il fotogramma, si consideri che FramePari contiene le righe di indice pari del fotogramma originale.FrameDispari, che dovrebbe contenere le righe di indice dispari, puo essere affetto da disallineamento ver-ticale a causa di difetti di acquisizione. Le righe di FrameDispari possono essere spostate rispetto allerighe del fotogramma di al massimo 270 righe. Di conseguenza, la riga i di FrameDispari puo corrispon-dere alla riga 2i + 1 + d del fotogramma, dove d e la quantita di disallineamento, Nel caso una riga diFrameDispari corrisponda a una riga del fotogramma con indice oltre 1079, essa contiene dati invalidi e vaignorata. La funzione RicostruisciFotogramma utilizza la funzione CalcolaSpostamento per stabilire diquanto FrameDispari sia spostato rispetto a FramePari e ricostruisce il fotogramma in Out. Le 1080 righe delfotogramma originale cosı ottenute: per ciascuna riga di indice i di valore pari, prendendola direttamente daFramePari; per ciascuna riga di indice i di valore dispari, prendendola da FrameDispari se e valida, oppurecopiando la riga di FramePari avente indice i− 1 in caso contrario.

1.1.11 30 giugno 2015 - punti totali 16

Un istogramma e una rappresentazione discreta di una distribuzione. Nel nostro caso, l’Istogramma dei voticonseguiti da uno studente negli esami universitari indica, per ogni possibile voto v compreso tra 18 e 30 elode, il numero di esami superati dallo studente conseguendo il voto v.

Un Istogramma si rappresenta come un array di 14 numeri interi (14 sono i possibili voti compresi tra 18e 30 e lode): il primo intero dell’array indica il numero di esami superati con la votazione di 18, il secondointero dell’ array rappresenta il numero di esami superati con 19, e cosı via, mentre il 13oe il 14ointerodell’array rappresentano rispettivamente il numero di esami superati con 30 e il numero di esami superaticon lode.

L’IstogrammaIntegrale dei voti rappresenta invece, per ogni possibile voto v tra 18 e 30 e lode, il numerodegli esami superati con votazione minore o uguale al voto v considerato. Anche l’ IstogrammaIntegralee rappresentato come un array di 14 interi. Ad esempio, l’ ottavo intero dell’ array, ovvero il valore dell’IstogrammaIntegrale in corrispondenza al voto 25, indica il numero di esami superati dallo studente convoto compreso tra 18 e 25.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• CalcolaMedia: che riceve in ingresso un Istogramma dei voti conseguiti da uno studente e restituiscela media dei voti conseguiti dallo studente.

• AggiornaIstogramma: che riceve in ingresso un Istogramma e un intero tra 18 e 31 che rappresentaun nuovo voto conseguito (31 rappresenta il voto 30 e lode). Essa verifica che l’ intero ricevuto iningresso rappresenti effettivamente un voto valido, e in caso positivo modifica l’ Istogramma in modoche comprenda anche il nuovo voto conseguito.

• CostruisciIntegrale: che riceve in ingresso un Istogramma e costruisce l’ IstogrammaIntegralecorrispondente.

• DisegnaIstogramma: che riceve in ingresso un Istogramma e ne stampa una rappresentazione grafica:il grafico prodotto comprende 14 colonne di caratteri affiancate, ciascuna corrispondente a un votocompreso tra 18 e 30 e lode. In ciascuna colonna vengono stampati a partire dall’ alto tanti asterischi(uno sotto l’altro) quanti indicati dal valore dell’istogramma associato al voto corrispondente allacolonna.

11

Page 12: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Implementazione – Punti 3 Si implementi la funzione AggiornaIstogramma.

Implementazione – Punti 5 Si implementi la funzione CostruisciIntegrale.

Implementazione – Punti 7 Si implementi la funzione DisegnaIstogramma.La rappresentazione grafica ha la forma di un diagramma a barre verticali. Ognuna delle 14 barre cor-

risponde ad uno dei punteggi compresi tra 18 e 30 e lode, e l’altezza di ogni barra rappresenta il numerodi esami superati con il punteggio corrispondente. Per la rappresentazione grafica si utilizzi un array bidi-mensionale di caratteri, ciascun elemento del quale vale * oppure -. Una volta stampata a schermo, talerappresentazione grafica deve assumere un aspetto simile all’esempio sottostante:

*-*---**-*-*-*

*-*---**-*-*--

*-*---**-*-*--

*-*---**---*--

*------*---*--

*------*------

-------*------

--------------

--------------

--------------

--------------

--------------

Le barre dell’ istogramma partono dall’ alto e sono composte da caratteri *; tutti i caratteri dell’arraynon appartenenti alle barre hanno valore -. Il numero di caratteri in ciascuna colonna e pari a 50.

1.1.12 20 luglio 2015 - punti titoli 17

Si consideri un correttore ortografico realizzato in C. Ogni parola e rappresentata come un vettore di caratteriterminato dal carattere nullo. Il correttore ortografico dispone del dizionario della lingua rappresentato daun vettore di 100.000 parole, lunghe al piu 35 caratteri.

La distanza di battitura tra due lettere e definita come il valore assoluto della loro distanza alfabetica.Ad esempio le lettere a e c hanno distanza 2, mentre f e a sono a distanza 5.

La distanza di battitura tra due parole della stessa lunghezza e definita come la somma del valore assolutodelle distanze delle lettere che le compongono, calcolata posizione per posizione. Ad esempio, la distanzatra casa e cane e di 0 + 0 + 5 + 4 = 9.

La distanza di battitura tra due parole di lunghezza diversa e calcolata allo stesso modo di quella tradue parole della stessa lunghezza, considerando uguale a 26 la distanza di una lettera da una mancante nell’altra parola. Ad esempio, la distanza tra test e tasto e di 0 + 4 + 0 + 0 + 26 = 30.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• esiste: riceve in ingresso una parola e un dizionario e ritorna 1 nel caso la parola esista (ovvero siacontenuta) nel dizionario, 0 altrimenti.

• distanza: riceve in ingresso due parole e ne restituisce il valore della distanza di battitura.

• suggerimento: riceve una parola e un dizonario e ricerca nel dizionario la parola a distanza di battituraminima da quella data. Restituisce la posizione della suddetta parola a distanza minima nel dizionario,considerando la prima parola del dizionario in posizione 1, la seconda in posizione 2 e cosı via.

Implementazione – Punti 3 Si implementi la funzione esiste.

Implementazione – Punti 7 Si implementi la funzione distanza.

Implementazione – Punti 5 Si implementi la funzione suggerimento. Si consiglia vivamente di utiliz-zare la funzione distanza, assumendo a priori che sia stata implementata in modo corretto.

12

Page 13: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

1.1.13 8 settembre 2015 - punti totali 16

Una vasca quadrata (il cui lato e lungo 1000m) a profondita variabile e rappresentata mediante una matricedi 1000 × 1000 interi. L’elemento di indice (i, j) di tale matrice rappresenta la profondita in metri delquadratino (di un metro di lato) posizionato nelle coordinate x = i, y = j rispetto all’origine della vasca.Due elementi della matrice sono detti vicini se si trovano sulla stessa riga e a distanza 1 oppure sulla stessacolonna e a distanza 1.

Ogni elemento della vasca non puo avere piu di due vicini alla sua stessa profondita.Le profondita non subiscono variazioni repentine: percio elementi vicini possono avere profondita che

differiscono di al massimo 1 m.Un contorno chiuso e una sequenza di elementi tali che:

1. il primo elemento e vicino al secondo, ciascun elemento e vicino al successivo tranne l’ultimo elementoche e vicino al primo

2. ogni elemento del contorno ha due vicini che fanno parte del contorno stesso e due vicini che non nefanno parte

Un contorno chiuso e rappresentato da una lista sequenziale di al piu 500 elementi.Una isoipsa e un contorno chiuso composto da elementi tutti aventi la stessa profondita.

Definizione di tipi di dato – Punti 1 Definire i tipi di dato contorno, vasca.

Definizione di prototipi di funzione – Punti 2 Si esplicitino le dichiarazioni dei soli prototipi delleseguenti funzioni:

• trovaisoipsa: che riceve in ingresso una vasca e un intero positivo che rappresenta una profondita,e restituisce una isoipsa, ovvero un contorno chiuso, costituita da elementi la cui profondita sia paria quella ricevuta in ingresso.

• calcolavolume: che riceve in ingresso una vasca e una isoipsa, e restituisce il volume, in metri cubi,dell’acqua che si troverebbe all’interno della isoipsa se questa dovesse essere riempita. Questo volumee il volume sovrastante l’area del fondo della vasca contenuta nel contorno dell’ isoipsa.

Implementazione – Punti 4 Si implementi la funzione trovaisoipsa. Nel caso esistano piu isoipseaventi la profondita richiesta, la funzione restituisce una sola tra esse, selezionata con un criterio a piacere.Si consiglia di scandire la matrice per righe alla ricerca del primo elemento avente la profondita desiderata.In tal modo questo elemento costituira il primo e ultimo elemento della sequenza. Si suppone che una isoipsache non intersechi alcun lato della vasca, cioe non possa contenere elementi con una delle coordinate pari a0 o a 999.

Implementazione – Punti 9 Si implementi la funzione calcolavolume nel caso di isoipsa convessa.Una isoipsa e detta convessa se, dati due elementi della isoipsa che si trovano sulla stessa riga di matrice, ilsegmento (orizzontale) che li collega si trova in una di queste due condizioni:

1. non contiene altri elementi dell’isoipsa

2. contiene solo elementi dell’isoipsa

Per semplicita si supponga che l’isoipsa sia stata trovata seguendo le indicazioni di cui al punto precedente.

1.2 Sintesi di codice FORTRAN

1.2.1 24 gennaio 2014 - Punti 9

Un’ immagine e rappresentata da una matrice di 1024 × 1024 elementi detti pixel: ogni pixel e caratter-izzato da un valore intero. I pixel possono avere valore pari a 1 (rappresentano il colore nero), oppure 0(rappresentano il colore bianco).

Una lente e un dispositivo che permette di ingrandire di un fattore 3 una parte quadrata dell’immagine:essa e rappresentata dalla sua dimensione (il lato del quadrato) e dalla sua posizione nell’immagine. Ladimensione L della lente e data da un multiplo dispari di 3: pertanto L = 3 × k, con k dispari. Laposizione della lente sull’immagine e identificata dalla posizione del centro della lente stessa: tale posizione

13

Page 14: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

e rappresentata tramite una coppia di coordinate intere Xc e Yc. Sovrapponendo la lente all’immagine si hal’effetto di modificare la parte di immagine compresa nella zona quadrata di lato L il cui centro si trova nellecoordinate (Xc, Yc). La restante parte dell’immagine resta invariata. La modifica di tale parte di immagineavviene nel modo seguente. La porzione quadrata di immagine originale, di lato k, centrato sul pixel dicoordinate (Xc, Yc) e la parte che verra ingrandita fino ad occupare completamente l’area della lente. Talesottoquadrato e detto “sottoquadrato centrale della lente”. Ciascun pixel compreso in questo sottoquadratoverra elaborato dalla lente: in particolare esso verra ingrandito e allontanato dal centro della lente.

In dettaglio, ogni pixel compreso nel sottoquadrato centrale della lente subira un ingrandimento, origi-nando un quadratino di 3× 3 pixel tutti dello stesso colore del singolo pixel originario. Inoltre, il quadratinooriginato verra spostato allontanandolo dal centro della lente. Il riposizionamento del quadratino di 3 × 3pixel, prodotto dall’ingrandimento di un pixel originario che si trovava in posizione (X,Y ) all’interno delsottoquadrato centrale della lente, avviene nel modo seguente:

• si consideri il vettore v = (∆x,∆y) che collega il centro della lente al pixel originario

• si calcoli il vettore u = (3×∆x, 3×∆y), e lo si applichi al centro della lente (Xc, Yc): si raggiungeracosı una nuova posizione (X ′, Y ′)

• si collochi il centro del quadratino 3×3 (prodotto dall’ ingrandimento del pixel) sulla posizione raggiunta(X ′, Y ′)

Si scriva un sottoprogramma FORTRAN che, ricevendo in ingresso un’immagine binaria di 1024× 1024pixel, un numero dispari k, e due coordinate (Xc, Yc), restituisca il risultato dell’ingrandimento della partedi immagine che si trova nel quadrato (centrale) di lato k centrato in posizione (Xc, Yc).

NOTA: la regione di immagine occupata dalla lente si suppone tutta compresa nell’immagine: nonoccorre prevedere controlli che verifichino tale condizione.

1.2.2 13 febbraio 2014 - Punti 9

Si consideri una vasca cubica da 12 × 12 × 12 metri, contenente acqua e colorante. La concentrazione dicolorante nella vasca e stata rilevata suddividendo idealmente la vasca in cubi di 10 × 10 × 10 centimetri,e i dati ottenuti sono rappresentati come una matrice tridimensionale, di lato 120, contenente numeri reali.Siano dette X, Y e Z le tre dimensioni della matrice.

Si chiede allo studente di scrivere una subroutine FORTRAN che riceve in ingresso la matrice che rap-presenta la vasca e la modifichi per rappresentare l’effetto di un’azione di mescolamento. Il mescolamentoconsidera la vasca suddivisa in cubi da 30× 30× 30 cm e avviene in due fasi:

1. Per ciascun cubo di 30 cm di lato, viene scambiato lo strato superiore spesso 10 cm (quello con massimaZ), con lo strato inferiore spesso 10 cm (quello con minima Z).

2. Per ciascun cubo di 30 cm di lato, viene scambiato lo strato frontale spesso 10 cm (quello con massimaX), con quello posteriore spesso 10 cm (quello con minima X).

1.2.3 6 marzo 2014 - Punti 9

Si consideri una sua porzione quadrata del piano bidimensionale, delimitata dai vertici di coordinate (0, 0),(1000, 0), (1000, 1000), (0, 1000). Si suddivida questa porzione rettangolare in celle quadrate di lato 1. Unagenerica cella e rappresentata tramite due indici interi: entrambi gli indici interi variano tra 1 e 1000. Adesempio (1,1) indica la cella con vertici di coordinate (0, 0), (1, 0), (1, 1), (0, 1).

Si scriva un programma che determina l’insieme di celle attraversate da una retta. A tal fine il programmadeve:

• Leggere due numeri reali m e q che rappresentano rispettivamente il coefficiente angolare della retta ela sua intercetta sull’asse Y nella consueta equazione della retta y = mx + q.

• determinare le celle attraversate dalla retta salvandole in un array di 2000 celle.

Poiche il numero di celle attraversate dalla retta potrebbe essere inferiore a 2000, si riempiano gli elementidell’ array inutilizzati con la coppia di valori (−1,−1).

14

Page 15: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

1.2.4 24 giugno 2014 - Punti 8

Una immagine digitale in scala di grigi e rappresentata da un array bidimensionale di INTEGER. Ciascunelemento dell’array assume un valore compreso tra 0 (nero) e 999 (bianco). Si implementino le seguenti duesubroutine:

1. CropQuesta subroutine elimina i bordi da una immagine e inserisce l’immagine cosı troncata in un nuovoarray. L’immagine originale non viene modificata. La subroutine accetta i seguenti parametri:

• Immagine, un array bidimensionale di interi contenente l’immagine digitale da elaborare

• H e V, due interi che rappresentano le dimensioni orizzontale e verticale di Immagine

• ImmagineCrop, un array bidimensionale di interi in cui inserire la nuova immagine digitale ot-tenuta eliminando i bordi da quella originale

• HCrop e VCrop, due interi che rappresentano le dimensioni orizzontale e verticale di Immag-ineCrop. E’ sempre HCrop≤H e VCrop≤V.

La subroutine inserisce in ImmagineCrop l’immagine troncata che si ottiene da Immagine eliminandonele prime H−HCrop colonne e le prime V−VCrop righe.

2. FlipQuesta subroutine modifica un immagine ribaltandola a specchio in senso orizzontale e/o verticale. Lasubroutine accetta i seguenti parametri:

• Immagine, un array bidimensionale di interi contenente l’immagine digitale da modificare;

• H e V, due interi che rappresentano le dimensioni (rispettivamente) orizzontale e verticale diImmagine;

• FlipH e FlipV, due LOGICAL che, se assumono valore .TRUE., attivano il ribaltamento in sensoorizzontale e verticale.

Se e attivo il ribaltamento orizzontale, il contenuto della prima colonna viene scambiato con quellodell’ultima, il contenuto della seconda colonna viene scambiato con quello della penultima, e cosı via.

Una volta terminato l’eventuale ribaltamento orizzontale, se e attivo il ribaltamento verticale, vieneeseguito un processo di scambio analogo tra la prima e l’ultima riga, tra la seconda e la penultima riga,e cosı via.

1.2.5 21 luglio 2014 - Punti 8

Si consideri il problema di rappresentare con una mappa oceanografica il fondale di un’area oceanica ela distribuzione della biomassa all’interno del volume di acqua sovrastante tale area. Occorre scrivere unprogramma Fortran che gestisca tali informazioni per un volume parallelepipedale la cui base superiorerettangolare rappresenta un’area della superficie marina. Il parallelepipedo e suddiviso in celle: ciascunadelle due basi e suddivisa in L × H rettangoli uguali tra loro, e in altezza il parallelepipedo e alto P celle(L, H e P sono tre parametri del programma ai quali vanno assegnati i valori 23, 17 e 44 rispettivamente).Per ogni cella del parallelepipedo vanno memorizzate le seguenti informazioni:

1. l’informazione a due valori (.TRUE. o .FALSE.) sul fatto che tale cella rappresenti un volume d’acqua(.TRUE.) o di fondale marino (.FALSE.)

2. la biomassa presente nella cella, espressa in tonnellate e rappresentata da un numero reale (nel caso diuna cella corrispondente ad un volume di fondale, questo dato va posto a -1.0)

Il programma deve:

1. Definire una struttura dati adatta alla memorizzazione delle informazioni sopra descritte;

2. Chiedere all’utente, per ciascuna delle L × H × P celle, se si tratta di una cella contenente acqua ofondale;

3. Per le sole celle contenenti acqua, chiedere all’utente il valore della biomassa presente (per le celle difondale il valore va posto a −1.0);

15

Page 16: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

4. Esaminare ciascuna delle L × H colonne di celle ottenute considerando tutte le celle sottostanti aciascuno degli L × H rettangoli in cui e suddivisa la base superiore, calcolare la biomassa contenutanell’intera colonna, trovare la massima tra le biomasse cosı calcolate, e infine stamparne a schermo ilvalore.

1.2.6 9 settembre 2014 - Punti 8

Un programma di manipolazione per materiale edilizio e in grado di rappresentare fino a un volume di10× 10× 10 metri con una precisione di 1× 1× 1 cm, lungo ciascuna delle tre coordinate cartesiane X,Y,Z.Per ogni volumetto, il programma contiene l’ informazione riguardante il materiale di cui e pieno sotto formadi un intero. Il numero 0 rappresenta un volumetto pieno d’ aria, il numero 1 di cemento, il numero 2 diferro.

Si implementi una procedura Fortran che :

1. Riceve in ingresso la rappresentazione di una parete, ovvero di un volume convesso di cemento noncontenente bolle d’aria, all’ interno del volume massimo rappresentabile: la parete e disposta paralle-lamente al piano x-z.

2. Trova, nella parete, il parallelepipedo con base 1 × 1 cm sul piano x-z a spessore minimo (ovvero diminima profondita sull’ asse y), tra quelli privi di ferro, e lo stampa a video, insieme alle sue coordinatex e z.

1.2.7 21 settembre 2014 - Punti 8

Un’immagine binaria consiste in una matrice di 1000× 1000 pixel. Nell’ immagine, i pixel neri costituisconolo sfondo, mentre i pixel bianchi, nel loro insieme, costituiscono uno piu oggetti. Un oggetto e dunque uninsieme di pixel bianchi.

Un pixel e caratterizzato da un intero a due valori che rappresenta il suo colore: il valore 1 rappresenta ilbianco mentre il valore 0 rappresenta il nero. Due pixel sono vicini se le loro posizioni (rappresentata dagliindici interi i e j nella matrice) sono confinanti, ovvero se i valori di uno dei due indici coincidono, mentre ivalori dell’altro indice differiscono di 1. Un cammino nell’immagine e una sequenza di pixel (P1, P2, . . . , Pn)tali che due pixel consecutivi della sequenza sono vicini, ovvero P1 e P2 sono vicini, P2 e P3 sono vicini,Pn−1 e Pn sono vicini. Due pixel di un oggetto sono connessi se esiste un cammino, formato da soli pixeldell’oggetto, a cui appartengono entrambi. Un oggetto si dice connesso se due qualunque dei suoi pixel sonoconnessi.

Scrivere un sottoprogramma che, ricevendo in ingresso un’immagine binaria, scandisce l’immagine perrighe e calcola il numero di pixel che formano il primo oggetto connesso trovato durante la scansione.

1.2.8 29 gennaio 2015 - Punti 8

Si definisce quadrato magico una matrice quadrata, n×n, di numeri interi, dove sono tutte uguali le somme

• degli elementi di ciascuna delle righe

• degli elementi di ciascuna delle colonne

• degli elementi di ciascuna delle due diagonali

Si implementi una funzione in Fortran che riceve in ingresso una matrice quadrata di interi e controllase essa e un quadrato magico, dato un n ≥ 10 a piacere. La funzione restituisce un valore di tipo LOGICAL:.TRUE. nel caso la matrice in ingresso sia effettivamente un quadrato magico, .FALSE. altrimenti.

FUNCTION ismagic(mat) RESULT(ismagicsquare)

IMPLICIT NONE

LOGICAL :: ismagicsquare

INTEGER , INTENT(IN), DIMENSION (10 ,10) :: mat

INTEGER :: somma ,sommadiag1 ,sommadiag2 ,i

ismagicsquare = .TRUE.

somma= SUM(mat(1,:))

DO i=2,10

ismagicsquare = ismagicsquare .AND. (SUM(mat(i,:)) .EQ. somma)

END DO

16

Page 17: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

DO i=1,10

ismagicsquare = ismagicsquare .AND. (SUM(mat(:,i)) .EQ. somma)

END DO

sommadiag1 =0

sommadiag2 =0

DO i=1,10

sommadiag1= sommadiag1+mat(i,i)

sommadiag2= sommadiag2+mat(i,11-i)

END DO

ismagicsquare = ismagicsquare .AND. (sommadiag1 .EQ. somma) .AND.

(sommadiag2 .EQ. somma)

RETURN

END FUNCTION ismagic

1.2.9 12 febbraio 2015 - Punti 8

Un mazzo di carte e rappresentato da un vettore monodimensionale di 40 stringhe da 2 caratteri (si ricordiche in Fortran le stringhe sono caratteri a precisione multipla, espressi come CHARACTER*precisione dunquesi comportano come tipi base).

Si implementi una subroutine in Fortran che restituisce il mazzo di carte mescolato effettuando in sequenzale seguenti azioni:

1. Scambia la prima meta del mazzo, con la seconda, mantenendo le carte ordinate all’ interno di ciascunameta del mazzo

2. Scambia ogni carta in posizione dispari con la carta in posizione pari che la segue immediatamente

3. Inverte l’ ordine delle carte di tutto il mazzo (la prima carta diventa l’ ultima, la seconda la penultimae cosı via)

4. Scambia il primo quarto del mazzo con l’ ultimo quarto, invertendo l’ ordine delle carte all’ interno deiquarti. Nota bene: la porzione centrale del mazzo resta invariata.

1.2.10 5 marzo 2015 - Punti 8

Un segnale audio e rappresentato da un vettore monodimensionale di 64 numeri reali. La compressione di unsegnale ha come obiettivo la riduzione della memoria occupata dal segnale. La compressione di un segnaleavviene in tre fasi:

• Il segnale s viene trasformato cambiando la base rispetto a cui esso viene rappresentato. Questocambiamento di base e realizzato attraverso la moltiplicazione del vettore per una matrice quadrata Mopportuna ottenendo il vettore t. Lo scopo del cambiamento di base e ottenere una rappresentazionedel vettore in cui buona parte dell’ informazione sia contenuta nei primi elementi.

• La seconda meta degli elementi del vettore trasformato t viene posta a zero.

• Si applica la trasformazione inversa a t (contenente per meta zeri), ovvero lo si moltiplica per M−1

ottenendo vettore contenente il segnale compresso c

Si implementi una subroutine Fortran chiamata comprimi che riceve in ingresso un segnale s e calcola ilsegnale compresso c come descritto. Si assuma che la matrice di trasformazione M sia tale per cui la suainversa e la trasposta coincidono M−1 = MT (ovvero sia ortogonale).

1.2.11 30 giugno 2015 - Punti 8

Siano date due mappe di altitudine, rappresentate come due matrici di numeri reali, entrambe rappresentantiuna porzione di territorio da 1×1 km. La prima mappa contiene l’ altitudine il territorio con una precisionedi 1 × 1 m e contiene i valori ottenuti con rilievi in situ. La seconda mappa rappresenta l’ altitudine dellostesso territorio con una precisione di 10× 10 m e contiene tutti zeri.

Si implementi una funzione Fortran chiamata calcola mappa che riceve in ingresso le due mappe prece-dentemente descritte e calcola i valori della seconda mappa. Ogni elemento della seconda mappa rappresental’ altezza media del territorio calcolata come la media delle altezze a precisione piu alta fornite nella prima

17

Page 18: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

mappa. Ad esempio: la cella in posizione (1, 1) della seconda mappa contiene la media delle altezze deiquadretti delle celle con valori degli indici di riga e colonna tra 1 e 10 nella prima mappa.

1.2.12 20 luglio 2015 - Punti 8

Una Mappa del Costruito rappresenta una regione di 1000 × 1000 m mediante una matrice di 1000 × 1000valori binari.

L’elemento di matrice di indici (i, j) si riferisce al quadrato di lato un metro (un metro quadro) le cuicoordinate (x, y) sono pari a (i, j) misurate in metri, a partire da un’origine O (di coordinate (0, 0)).

L’elemento di matrice di indici (i, j) e un numero intero a due soli possibili valori 1 oppure 0. Se l’elementodi matrice vale 1, il quadrato corrispondente e costruito (fa parte di un edificio); se l’elemento di matricevale 0, il quadrato corrispondente non fa parte del costruito.

Sono date due Mappe del Costruito riferentisi a due regioni sovrapposte. In entrambe le regioni vi e unostesso edificio, che e contenuto per intero sia nella prima regione sia nella seconda regione. Nessuna delledue regioni contiene altri edifici.

La prima delle due mappe e riferita all’origine O di coordinate (0, 0). La seconda mappa e invece riferitaa una diversa origine O′ di coordinate incognite (X ′, Y ′) intere. Si supponga che X ′ e Y ′ siano entrambepositive e minori o uguali a 500. Si scriva una subroutine che riceve in ingresso le due mappe e calcolala posizione della seconda origine O′ rispetto alla prima O, ovvero calcoli le due coordinate intere (X ′, Y ′)dell’origine della seconda mappa.

1.2.13 8 settembre 2015 - Punti 8

Sia data una scacchiera da 8×8 celle, rappresentata come una matrice di interi. Una cella puo essere vuota, ocontenere una regina: una cella vuota e rappresentata da un valore 0, la presenza di una regina da un valore1 contenuto nella corrispondente cella della matrice di interi. Data una scacchiera con 8 regine posizionate,si dice che questa e una soluzione valida del problema delle 8 regine se e presente una sola regina per ogniriga, colonna e diagonale possibile (incluse le diagonali non principali). In altre parole, data una regina, nonpossono esserci altre regine posizionate sulla sua stessa riga, colonna, o raggiungibili in diagonale da essa.

Si implementi una funzione in Fortran, chiamata soluzionevalida che riceve una scacchiera in ingressoe restituisce un valore di tipo LOGICAL indicante se la scacchiera in ingresso rappresenta una soluzione delproblema delle 8 regine.

1.3 Analisi di codice C

1.3.1 24 gennaio 2014 - punti 3

Si supponga che, in un programma C, sia stato definito un array di interi int matricola[6] contenente le6 cifre del proprio numero di matricola, una per elemento.

Data la seguente implementazione della funzione Funz:

#define NUM 6

#include <stdio.h>

void Funz(int* Par){

int i;

for (i=NUM -1; i>=0; --i){

if (Par [i] > 5){

Par[i] = Par[i] - 5;

}

}

for (i=0; i < NUM; ++i){

printf("%d", Par[i]);

}

printf("\n");

printf("%d", Par [*( Par +1)]);

}

che cosa stampa a video la chiamata Funz(matricola); ?

18

Page 19: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

1.3.2 13 febbraio 2014 - punti 3

Dato il seguente programma C :

#include <stdio.h>

#include <string.h>

#define LUNG 10

int main()

{

char Str1[LUNG+1], Str2[LUNG /2];

int Cont;

strcpy(Str1 , "**********"); /* @@@ */

for (Cont =0; Cont <LUNG /2; ++Cont){

Str2[Cont] = Str1 [2* Cont];

}

for (Cont =0; Cont <LUNG /2; ++Cont){

printf("%c", Str2[Cont]);

}

return (0);

}

Si sostituiscano gli asterischi contenuti nella stringa passata come parametro alla funzione strcpy riem-piendola con la concatenazione del proprio nome e cognome. Nel caso serva, si tronchi opportunamente laconcatenazione o si aggiungano lettere dell’ alfabeto consecutive a partire da a nel caso essa risulti piu corta.Esempio: Luca Bini → lucabiniab.

NOTA: si ricorda che la funzione strcpy ha il seguente prototipo

char *strcpy(char *s1 , char *s2)

ed effettua la copia del contenuto della stringa s2 nella stringa s1, incluso il terminatore ’\0’.Che cosa stampa a video il programma quando viene eseguito?

1.3.3 6 marzo 2014 - punti 3

Dato il seguente programma C :

void funz(char Par [])

{

unsigned int len , i, sum = 0;

len = strlen(Par);

for (i = 0; i < len ; i++) {

sum = *(Par+i) - ’0’ + sum;

}

printf(" ->%d<-\n", sum % 3);

}

int main()

{

char string[LUNG];

int N;

printf("Inserisci il tuo numero di matricola.");

for (N=0; N<LUNG; N++)

{

scanf("%c", string+N)

}

string[LUNG]=’\0’;

funz(string);

19

Page 20: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

return 0;

}

Cosa stampa il programma precedente quando viene invocato e, durante la sua esecuzione viene fornitala propria matricola?

1.3.4 24 giugno 2014 - punti 3

Si descriva il comportamento della seguente funzione C e si indichi il valore ritornato quando viene passatacome parametro la propria matricola sotto forma di intero.

#define DODICI 5

int p[5] = {2,3,5,7,11};

int fun (int matricola){

unsigned int i,temp;

i = DODICI;

temp=matricola %100;

for (;i>=0;i--){

printf("test %d\n" ,*(i+p));

if( matricola % (*(p+i))==0 ){

return *(i+p);

}

}

return 0;

}

1.3.5 21 luglio 2014 - punti 3

Si descriva il comportamento della seguente funzione C e si indichi il valore ritornato quando viene inizial-izzato il vettore Matricola con le cifre della propria matricola.

#define NUM 6

#define LUNG 9

#include <stdio.h>

void Prepara(int Par []);

void Stampa(char DaStampare [][ LUNG]);

int main(int argc , char* argv []){

int Matricola[NUM] = {1, 2, 3, 4, 5, 6};

Prepara(Matricola);

return (0);

}

void Prepara(int Par []){

char Mat[NUM][LUNG];

int Cont1 , Cont2;

for (Cont1 = 0; Cont1 < NUM; Cont1 ++) {

for (Cont2 = 0; Cont2 < Par[Cont1]; Cont2 ++) {

Mat[Cont1][ Cont2] = ’*’;

}

for (Cont2 = Par[Cont1]; Cont2 < LUNG; Cont2 ++) {

Mat[Cont1][ Cont2] = ’-’;

}

20

Page 21: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

}

Stampa(Mat);

}

void Stampa(char DaStampare [][ LUNG]){

int Cont1 , Cont2;

for (Cont1 = 0; Cont1 < NUM; Cont1 ++){

for (Cont2 = 0; Cont2 < LUNG; Cont2 ++){

printf ("%c", DaStampare[Cont1][ Cont2]);

}

printf("\n");

}

}

1.3.6 9 settembre 2014 - punti 3

Si descriva cosa stampa il seguente programma C quando viene lanciato passando come primo parametro dalinea di comando la propria Matricola.

1 #include <stdio.h>

2 #include <string.h>

3 #define BASE "AAAAAA"

4

5 int main (int argc , char* argv []){

6 int f;

7 f=strlen(argv [1]);

8 f=f-1;

9 while(f >= 0){

10 printf("%c",BASE[f]+ (*( argv [1]+f))-’0’ );

11 f=f-1;

12 }

13 return 0;

14 }

1.3.7 21 settembre 2014 - punti 3

Si descriva cosa stampa il seguente programma C quando viene lanciato passando come primo parametro dalinea di comando le prime quattro lettere del proprio cognome. Nel caso il proprio cognome sia piu corto diquattro lettere si aggiungano lettere X a sufficienza per arrivare a 4.

#include <stdio.h>

int main(int argc , char* argv [])

{

int Cont;

char C1 , C2 , T;

char *PC1 , *PC2 , Cognome;

cognome = argv [1];

printf("%s\n", Cognome);

for (Cont = 0; Cont <= 2; ++Cont)

{

PC1 = Cognome+Cont;

PC2 = PC1 + 1;

C1 = *PC1;

C2 = *PC2;

21

Page 22: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

if (C1 > C2)

{

T = C2;

*PC2 = *PC1;

*PC1 = T;

}

printf("%s\n", Cognome);

}

return 0;

}

1.3.8 29 gennaio 2015 - punti 3

Si descriva cosa stampa il seguente programma C quando viene eseguito e viene fornita da terminale lapropria matricola (scrivendola da tastiera). Si descriva brevemente, anche con una sola frase, qual e lafunzione di questo programma.

#include <stdio.h>

#define LUN 7

void Stampa(int M) {

int Arr[LUN];

int i;

for(i=0; i < LUN; i++) {

Arr[i] = 0;

}

i=i-1;

while (i >= 0) {

Arr[i] = M % 2;

M = M / 2;

if (M == 0) {

break;

}

i = i -1;

}

while (i < LUN) {

printf("%d", Arr[i]);

i = i+1;

}

}

int main(int argc , char* argv []) {

int Matricola;

scanf("%d", &Matricola);

Stampa(Matricola % 100);

return 0;

}

La funzione effettua la conversione in binario del resto della divisione della matricola per 100.

1.3.9 12 febbraio 2015 - punti 3

Si sostituisca all’ interno la stringa “AAAAA” con una composta dalle prime 5 lettere del proprio cognome.Nel caso il cognome sia piu corto di 5 lettere, si aggiungano lettere dal nome. Si ricorda che il prototipo

22

Page 23: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

della funzione strcpy e char *strcpy(char *dest, char *src), essa dunque copia la seconda stringanella prima. Si descriva cosa stampa a video il programma.

#include <stdio.h>

#include <string.h>

#define NUM_CAR 100

#define LUN 5

int main(int argc , char* argv []) {

char sorgente[NUM_CAR], dest[NUM_CAR ];

int pos , Finito;

strcpy(dest , "");

strcpy(sorgente , "AAAAA");

Finito = 0;

pos = LUN - 1;

while (0 == Finito) {

printf("%d: %s\n", pos , sorgente);

strcpy(dest , sorgente);

sorgente[strlen(sorgente) - 1] = ’\0’;

if (pos <= LUN /2) {

Finito = 1;

} else {

pos --;

}

}

printf("Dest: %s\n", dest);

return 0;

}

1.3.10 5 marzo 2015 - punti 3

Si sostituisca ai sei zeri all’ interno della stringa matricola la propria matricola e si indichi cosa stampa ilseguente programma.

#include <string.h>

#include <stdio.h>

int elabora(char* p, int* q){

int test =0;

char* end;

for( end = p-*q ; p!=end; p--){

test= test + (*p - ’0’);

}

return test;

}

int main(int argc , char* argv []){

char* p;

int ris;

char matricola [6]= "000000"

ris = strlen(matricola);

p = matricola + strlen(matricola) -1;

printf("%d",elabora(p,&ris));

return 0;

}

23

Page 24: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

1.3.11 30 giugno 2015 - punti 3

Si sostituisca ai sei zeri all’ interno della stringa S la propria matricola e si indichi cosa stampa il seguenteprogramma.

#include <string.h>

#include <stdio.h>

#define NUM_CIFRE 6

void F1(char *R){

int C;

for (C = NUM_CIFRE -1; C>NUM_CIFRE /2; C--){

R[C-1] = R[C];

}

}

void F2(char S1[]){

printf("%s\n", S1);

}

char* F3(char *M){

M[NUM_CIFRE /2] = ’\0’;

return M;

}

int main(int argc , char* argv []){

char S[NUM_CIFRE +1]= "000000";

/* sostituire le cifre con il proprio numero di matricola */

F2(S);

F1(S);

F2(S);

F2(F3(S));

return 0;

}

1.3.12 20 luglio 2015 - punti 3

Si localizzino nel seguente programma C i 3 errori di sintassi che esso contiene. Di ciascun errore andrasegnalato con una freccia il punto del programma in cui esso si trova, e con un breve commento la naturadell’errore e/o come correggerlo.

1. Gli errori sono tali da bloccare la compilazione del programma;

2. L’istruzione indicata con @@@ non contiene errori.

#include <stdio.h>;

#define CIFRE 6

#define SOMMA 9

int Complemento(int Totale , int Num);

void StampaArray(int* Arr);

int main() {

int Matricola[CIFRE] = {5, 4, 3, 2, 1, 0}; /* @@@ */

int Cont;

StampaArray(Matricola);

for (Cont = 0; Cont < CIFRE; Cont ++) {

Matricola[Cont] = Complemento(SOMMA , Matricola[Cont]);

24

Page 25: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

}

StampaArray(Matricola);

return (0);

}

int Complemento(int Totale , int Num) {

return(Totale -Num);

}

void StampaArray(Arr) {

int i;

for (i = 0; i < CIFRE; i++) {

printf("%d", Arr(Cont));

}

printf("\n");

}

1.3.13 8 settembre 2015 - punti 3

Con riferimento al programma C sotto riportato: i) si indichi (cancellando con un tratto di penna la formaerrata) la forma corretta di ciascuna delle tre chiamate a funzione evidenziate con [1], [2] e [3]; ii) si indichicosa stampa a schermo il programma se, quando il programma chiede all’utente di inserire dei caratteri,l’utente inserisce il cognome dello studente.

#include <stdio.h>

#include <string.h>

#define LUNGHEZZA 100

typedef struct {

char Caratteri[LUNGHEZZA ];

int CaratteriUtili;

} StringaLung;

void StampaRapporto(StringaLung C);

/* stampa l’intero contenuto di un dato di tipo StringaLung */

void LeggiCaratteri(char *B);

/* legge uno o piu’ caratteri e li inserisce in un

array di LUNGHEZZA caratteri , aggiungendo il terminatore */

void CalcolaLunghezza(StringaLung *A);

/* calcola il numero di caratteri utili contenuti nel campo Caratteri di A

e lo scrive nel campo CaratteriUtili */

int main(int argc , char* argv []) {

StringaLung Str;

StringaLung *PStr;

PStr = &Str;

LeggiCaratteri (&( Str.Caratteri [0])); /* [1] */

LeggiCaratteri(Str.Caratteri [0]); /* [1] */

CalcolaLunghezza(PStr); /* [2] */

CalcolaLunghezza(Str); /* [2] */

StampaRapporto(Str); /* [3] */

StampaRapporto(PStr); /* [3] */

return 0;

25

Page 26: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

}

void StampaRapporto(StringaLung C){

printf("\nLunghezza: %d", C.CaratteriUtili);

printf("\nContenuto: %s\n", C.Caratteri);

}

26

Page 27: Eserciziario - Informatica · Eserciziario - Informatica Revisione 0.1 Alessandro Barenghi, Andrea Romanoni February 25, 2016 Il presente documento e realizzato, e rilasciato sotto

Contents

1 Esercizi tratti da temi d’esame 11.1 Sintesi di codice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1 24 gennaio 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.1.2 13 febbraio 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.1.3 6 marzo 2014 - punti 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.1.4 24 giugno 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.5 21 luglio 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.1.6 9 settembre 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.1.7 21 settembre 2014 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.1.8 29 gennaio 2015 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.1.9 12 febbraio 2015 - punti titoli 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.1.10 5 marzo 2015 - punti 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.1.11 30 giugno 2015 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.1.12 20 luglio 2015 - punti titoli 17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.1.13 8 settembre 2015 - punti totali 16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

1.2 Sintesi di codice FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.1 24 gennaio 2014 - Punti 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.2.2 13 febbraio 2014 - Punti 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2.3 6 marzo 2014 - Punti 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2.4 24 giugno 2014 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.5 21 luglio 2014 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.6 9 settembre 2014 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2.7 21 settembre 2014 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2.8 29 gennaio 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.2.9 12 febbraio 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.2.10 5 marzo 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.2.11 30 giugno 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.2.12 20 luglio 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.2.13 8 settembre 2015 - Punti 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.3 Analisi di codice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3.1 24 gennaio 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181.3.2 13 febbraio 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.3 6 marzo 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.4 24 giugno 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.3.5 21 luglio 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201.3.6 9 settembre 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.3.7 21 settembre 2014 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.3.8 29 gennaio 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.9 12 febbraio 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221.3.10 5 marzo 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231.3.11 30 giugno 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3.12 20 luglio 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241.3.13 8 settembre 2015 - punti 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

27