Gli esercizi

Gli esercizi di programmazione qui raccolti sono stati scritti nell'arco di molti anni sia come temi d'esame che, più recentemente, come esercizi di laboratorio. Da un lato, quindi, sono pensati per verificare il raggiungimento delle competenze che ci si attende siano acquisite al termine dell'insegnamento di "Programmazione" (e del relativo laboratorio), dall'altro sono costruiti per esercitare e stimolare l'acquisizione di quelle stesse competenze.

Il testo degli esercizi non fa mai riferimento ad uno specifico linguaggio (o, salvo rare eccezioni, paradigma) di programmazione o sistema opperativo, e gli stessi testo sono stati adoperati in anni differenti sia in riferimento al lignuaggio C che al linguaggio Java, sia in ambito GNU/Linux che di altri sistemi operativi. Si possono pertanto prestare ad esercitare e verificare l'apperndimento delle competenze di base di qualunque linguaggio (sebbene con maggior attenzione al paradigma imperativo, rispetto a quello orientato agli oggetti, o funzionale).

Onde minimizzare la dipendenza da API per l'I/O peculiari di uno specifico linguaggio o sitema operativo, ogni testo prevede che l'input sia dato dal contenuto testuale del flusso di ingresso standard (stdin) e/o dagli argomenti sulla linea di comando e che l'output sia prodotto nel flusso di uscita standard (stdout).

Grazie a questa vincolo, è stato possibile corredare ciascun esecizio di una serie di testcase dati da alcuni file di testo che specificano l'input ed altri che rappresentano l'output atteso, ossia frutto di una corretta esecuzione. Questa dotazione consente di effettuare in modo elementare una semplice verifica funzionale delle soluzioni anche in modo autonomo da parte degli studenti stessi che hanno così immediatamente modo di sapere se la propria soluzione è errata (o avere un certo grado di confidenza che sia corretta).

A questo socpo, negli anni è stata sviluppata una suite di strumenti open source che posso essere utlilzzati sia dagli studenti che dal docente del corso per svolgere in modo automatico (e su larga scala) la verifica funzionale rispetto ai testcase forniti. La sezione Strumenti di questo sito contiene le indicazioni per gli studenti che intendano avvalersi di tali strumenti per verificare le proprie soluzioni.

Descrizione

Gli esercizi sono etichettati con alcune tag che descrivono gli esercizi nel senso seguente:

  • rispetto all'I/O:

    • stdin: l'input proviene dal flusso di ingresso standard,

    • args: l'input proviene dagli argomenti sulla linea di comando

    • eof: la lettura dell'input termina per EOF (non viene cioè segnalata da un valore speciale nel flusso di ingresso),

  • rispetto ai costrutti del linguaggio:

    • sel: la soluzione richiede l'uso di costrutti di selezione (come if, if-else o switch),

    • loop: la soluzione richiede l'uso di costrutti di iterazione (come for, while o do-while),

    • nlopp: la soluzione richiede l'uso di costrutti di iterazioni annidati,

  • rispetto ai tipi di dati:

    • array: la soluzione richiede l'uso di vettori monodimenzionali,

    • narray: la soluzione richiede l'uso di vettori multidimensionali (matrici),

    • class: la soluzione richiede l'uso di classi,

  • inoltre:

    • driver: l'esercizio comprende un driver, ossia un programma che eserciterà la soluzione sul testcase,

    • shell: la soluzione è uno script di shell.

Sebbene non costituisca una indicazione sulla sequenza in cui svolgere gli esercizi, questa classificazione permette di porre in riferimento i vari esercizi allo stadio della propria preparazione individuale (rispetto ai costrutti del linguaggio e ai tipi di dati).

Di seguito è riportata la distribuzione dei tag sul numero totale di esercizi (che è circa 250).

png

Ogni esercizio è accompagnato da un numero variabile di testcase, di seguito è riportata la distribuzione del loro numero; come si nota, tale valore ha per moda cinque.

png

Elenco

Di seguito, in ordine alfabetico, l'elenco di tutti gli esercizi presenti nel repository. Il titolo di ogni esercizio è un collegamento al testo dell'esercizio.

Nome Tags Test
0 Abbastanza risparmi stdin loop sel 5
1 Aelle Emmezeta stdin eof loop sel 5
2 Al contrario stdin array eof loop 4
3 Alfabeto Inscatolato args nloop 5
4 Alfabeto Morse: Codifica stdin eof loop sel 5
5 Alfabeto Morse: Decodifica stdin array loop sel 5
6 Amitlu parola stdin eof loop sel 3
7 Automa cellulare args stdin array eof nloop sel 5
8 La barretta più lunga stdin eof loop sel 6
9 Barrette args array loop sel 5
10 Battaglia navale, Giocatore stdin class driver nloop 7
11 Battaglia navale, Giocatore stdin array class driver nloop 5
12 Battaglia navale, Griglia stdin array class driver nloop 4
13 Battaglia navale, Nave stdin array class driver loop 5
14 Battaglia navale, Posizione args class driver loop 3
15 Battaglia navale, Randomizzazione class driver loop 0
16 Bilancio stdin array eof loop sel 6
17 Calcola il "bounding box" stdin eof loop sel 6
18 Calcolatrice senza tasti stdin loop sel 6
19 Calcolatrice elementare stdin 6
20 Caratteri unici args array loop sel 18
21 Carrello args stdin array class eof loop sel 4
22 Censura la prima stdin loop 5
23 Censura la seconda stdin 4
24 Cerca e rimpiazza args stdin array eof loop sel 2
25 Cifra più frequente args array nloop sel 5
26 Cifratura a zigzag stdin loop sel 3
27 Colonne di lettere args nloop sel 8
28 Colonne di cifre args nloop sel 5
29 Condensa parole args loop sel 4
30 Conta le barrette stdin eof loop sel 6
31 Conta le cifre dispari stdin loop sel 6
32 Conta le cifre pari stdin loop sel 6
33 Conta i divisori stdin loop sel 6
34 Conta i quadrati stdin loop sel 4
35 Conta inversioni stdin eof loop sel 5
36 Conta i numeri irap stdin loop sel 5
37 Conta le navi stdin narray nloop sel 5
38 Conta linee stdin shell 3
39 Conta i numeri ganzi stdin eof loop sel 5
40 Conta le parole stdin loop sel 5
41 Conta parole pari stdin eof loop sel 2
42 Conta le parole rotonde stdin loop sel 5
43 Conta i pokemon "Kenny" stdin shell 2
44 Conta i pokemon diversi stdin shell 2
45 Conta le potenze di due stdin loop sel 5
46 Conta le sottostringhe args loop sel 5
47 Conta terne pitagoriche stdin eof loop sel 5
48 Contenimento tra sequenze stdin array loop sel 9
49 Coppie consecutive stdin loop sel 5
50 Il crivello di Eratostene args array nloop sel 4
51 Dentro al cerchio args stdin eof loop sel 5
52 Dentro al triangolo args stdin eof loop sel 5
53 Discesa rapida stdin narray nloop sel 5
54 Disegna una barretta args loop 2
55 Disegna due barrette args loop 2
56 Disegna denti di sega args loop 4
57 Disegna un diamante stdin nloop sel 6
58 Disegna una freccia args nloop 4
59 Disegna una freccia args nloop 4
60 Disegna una J stdin nloop 5
61 Disegna montagne args loop 4
62 Disegna onde quadre stdin loop 4
63 Disegna onde quadre variabili stdin nloop 5
64 Disegna due quadrati stdin nloop 5
65 Disegna un quadrato stdin nloop 5
66 Disegna un quadrato a "colonne" stdin nloop sel 5
67 Disegna un quadrato stdin nloop 5
68 Disegna un quadrato con "diagonale" stdin nloop sel 5
69 Disegna un rombo stdin nloop 5
70 Disegna una scacchiera stdin nloop 5
71 Disegna segmenti args stdin eof narray nloop sel 1
72 Disegna il serpente args nloop sel 4
73 Spirale numerica args narray nloop sel 5
74 Disegna una spunta stdin nloop 4
75 Disegna una spunta di dimensione fissata stdin 1
76 Disegna una spunta specchiata args nloop 8
77 Disegna triangoli e rettangoli args array nloop sel 5
78 Disegna una V stdin nloop 8
79 Disegna una V stdin 1
80 Disegna V rovesciate stdin nloop 5
81 Disegno misterioso stdin eof nloop 5
82 Display args array nloop sel 4
83 Distanza tra dispari stdin loop sel 4
84 Distanza tra pari stdin loop sel 10
85 Distesa di piramidi stdin nloop sel 5
86 Divisibile per quattro stdin 4
87 Dominazione aliena args array loop sel 3
88 Potenze di due args array loop sel 5
89 Editor stdin array loop sel 5
90 Elimina le ripetizioni args loop narray sel 5
91 Estate torrida stdin eof loop sel 8
92 Fasce d'età PEGI stdin 19
93 Fizz Buzz stdin loop sel 5
94 Forza quattro stdin array eof loop sel 3
95 Frazioni continue args array loop sel 5
96 Genera un quadrato magico args narray nloop sel 3
97 Giustifica a destra args loop sel 5
98 Una grande C stdin 4
99 Una grande C stdin nloop 4
100 Una grandissima C stdin nloop 4
101 Greppino args stdin eof loop sel 5
102 Hanoi stdin 4
103 Incolla e rovescia args array loop 5
104 Incornicia il nome stdin 4
105 Incornicia il nome stdin 4
106 Isogramma stdin eof nloop sel 4
107 Travasi stdin array eof loop 13
108 La costante di Kaprekar stdin loop sel 5
109 Lato maggiore stdin eof loop narray sel 2
110 Lettera più frequente stdin array eof loop sel 5
111 Colonne di lettere args nloop sel 5
112 Lunghezza media delle parole stdin eof loop sel 8
113 I numeri di Lychrel stdin loop sel 3
114 Massima distanza stdin loop sel 5
115 Massima somma stdin eof loop sel 5
116 Ultima stringa stdin eof loop sel 5
117 Massiminimo stdin array eof loop sel 4
118 Massimo prodotto stdin eof loop sel 5
119 Massimo tra due numeri stdin 4
120 Massimo tra tre stdin 6
121 Massimi e minimi args stdin loop narray sel 3
122 Matrice circolante stdin array eof loop 4
123 Matrice di Hadamard args nloop sel 5
124 Mescola pari e dispari args loop 5
125 Mescola parole stdin loop sel 5
126 Minimo intero positivo stdin loop sel 5
127 Minimo inventario stdin eof loop sel 9
128 Minimo tra quattro stdin 24
129 Scala maggiore args 5
130 La nave più lunga stdin narray nloop sel 15
131 Nave spaziale args loop sel 5
132 L'n-gramma più frequente args stdin loop sel 7
133 Numeri felici stdin loop sel 8
134 Numeri fortunati args nloop sel 4
135 Numeri narcisi stdin eof loop sel 5
136 Numeri scala args loop sel 31
137 Il numero più pesante args loop sel 3
138 Lavorare stanca args loop sel 5
139 Ordina due stringhe stdin 4
140 Ordinali di von Neuman args loop sel 5
141 Palindroma stdin loop sel 2
142 Palindroma stdin 5
143 La posizione della parola più pesante stdin eof loop sel 5
144 La parola più pesante stdin eof loop sel 5
145 Parole crescenti stdin eof loop sel 5
146 Parole graziose args loop sel 6
147 Parole graziose stdin eof loop sel 6
148 Parole in numeri stdin array eof loop sel 5
149 Parole incatenate stdin eof loop sel 5
150 Parole inverse args loop sel 6
151 Parole precedute stdin eof loop sel 4
152 Parole proibite args stdin array nloop sel 5
153 Parole uniche stdin array loop sel 3
154 Piccola calcolatrice stdin 6
155 Piccola calcolatrice args 6
156 Pila stdin array class eof loop sel 4
157 Pile di stringhe args stdin array class eof loop sel 5
158 Acquedotto args narray nloop sel 6
159 Piramide di numeri args nloop 5
160 Piramide di numeri stdin nloop 5
161 Potenze intere stdin 5
162 Prefisso args loop sel 5
163 Prima ed ultima parola per vocale stdin loop sel 10
164 Prodotto di matrici args stdin narray nloop 6
165 Prodotto dei dispari stdin loop sel 5
166 La prova del nove stdin nloop sel 5
167 Quadrato magico stdin loop narray sel 5
168 Quanti massimi stdin loop sel 5
169 Quanti minimi stdin loop sel 5
170 Quasi uguali stdin array eof loop sel 17
171 Regine all'attacco stdin loop sel 6
172 Riconosci l'operazione stdin array loop sel 8
173 Quadrato magico stdin array loop sel 5
174 Righello stdin loop sel 5
175 Righello orizzontale stdin loop sel 6
176 Rimpiazza args stdin eof loop sel 6
177 Rotazione di una parola stdin eof loop 5
178 Calcolatrice RPN, Evaluator stdin class driver eof loop sel 5
179 Calcolatrice RPN, IntStack stdin class driver eof loop 3
180 Calcolatrice RPN, Token stdin class driver loop sel 5
181 Calcolatrice RPN, Tokenizer stdin class driver loop 4
182 Saltapicchio args stdin array loop sel 6
183 Salve, mondo! stdin 1
184 Salve, tutti! args 4
185 Scala discendente stdin eof loop sel 5
186 Scale ascendenti e discendenti stdin eof loop sel 3
187 Suddivisione degli URL stdin eof loop sel 5
188 Stampa la colonna args stdin eof loop sel 5
189 Stampa la riga args stdin eof loop sel 5
190 Sequenze di Collatz stdin loop 5
191 Sequenze monotone stdin eof loop sel 5
192 Serpente di lettere args loop sel 4
193 Serpente di numeri args loop 4
194 Somma alternata stdin array eof loop 5
195 Somma interi da linea di comando args loop 1
196 Somma capo e coda args stdin array eof loop 5
197 Somma al centro args stdin array eof loop 5
198 Somma e salta args stdin eof loop sel 5
199 Somma e sottrai args loop 5
200 Somma interi in ingresso stdin loop 2
201 Somma i postivi stdin loop sel 5
202 Somma multipli stdin loop sel 5
203 Somma alcuni multipli stdin loop sel 5
204 Somma parole pari stdin eof loop sel 4
205 Somma positive stdin loop sel 5
206 Somma interi grandi args array loop sel 5
207 La strana somma args array loop sel 5
208 Somma telescopica stdin eof loop 5
209 Somma tre centesimi stdin 5
210 Somma tre importi stdin 5
211 Somma tre numeri reali stdin 4
212 L'ultima lettra args loop sel 2
213 Contenimento tra sequenze stdin array loop sel 9
214 Sottostringhe args loop sel 2
215 Spirale numerica args loop narray sel 5
216 Stampante configurabile args stdin array nloop sel 5
217 La strana sillabazione stdin loop sel 4
218 Stringa più lunga stdin eof loop sel 5
219 Studiare stanca args stdin loop sel 5
220 Suffisso args loop sel 5
221 Suffisso di una sequenza stdin eof loop sel 6
222 Tanto sole stdin loop sel 9
223 Tartaglia stdin loop sel 4
224 Tra parentesi stdin array loop sel 11
225 Trasmissione a pacchetti, Messaggio args stdin array class driver loop 5
226 Trasmissione a pacchetti, Pacchetto stdin array class driver loop 5
227 Trasmissione a pacchetti, Ricevitore stdin array class driver loop 5
228 Trasponi matrice args stdin narray nloop 4
229 Trenino stdin eof loop sel 6
230 Trova l'ultimo args stdin eof loop sel 5
231 U Inscatolate args loop 5
232 Ultima parola per vocale stdin loop sel 10
233 Ultima ripetizione args nloop sel 5
234 L'ultimo caporale stdin array eof loop sel 5
235 Ultimo giorno di pioggia stdin loop sel 6
236 Ultimo maggiorenne stdin loop sel 5
237 Ultima giornata positiva stdin loop sel 10
238 Ultimo uno stdin loop sel 5
239 La sequenza di Jan Ritsema Van Eck args array loop 4
240 Visualizza le mosse della torrre di Hanoi args stdin eof loop narray sel 4
241 Word wrap args stdin eof loop sel 6

Esami e laboratori

Come descritto in precedenza gli esercizi sono stati usati sia nel contesto degli esami che dei laboratori. La tabella seguente riporta le date dei vari appelli con l'elenco degli esercizi assegnati in tale appello. Come si può notare, tranne rare eccezioni, sono stati assegnati 6 esercizi per appello (che ha usualmente durata di tre ore).

Data Esercizi
0 130118 Salve, mondo!, Disegna una barretta, Somma interi in ingresso
1 130121 Salve, tutti!, Ultimo giorno di pioggia, Disegna un quadrato, Parole inverse, Conta le cifre dispari, Rotazione di una parola
2 130211 Conta le barrette, Disegna una V, Caratteri unici, Contenimento tra sequenze, Quasi uguali
3 130603 La strana sillabazione, La posizione della parola più pesante, Serpente di numeri
4 130624 Quanti massimi, Sequenze monotone, Editor, Massimo prodotto, Forza quattro
5 130909 Somma positive, Disegna un rombo, Matrice circolante, Ultima giornata positiva, Colonne di lettere
6 140110 Salve, mondo!, Disegna una barretta, Somma interi in ingresso
7 140124 Somma i postivi, Disegna due barrette, Conta le parole, Disegna una V, Elimina le ripetizioni, La barretta più lunga, La parola più pesante, Conta i numeri ganzi, Parole incatenate
8 140214 Prodotto dei dispari, Barrette, Incolla e rovescia, Quadrato magico, Conta le parole rotonde, Parole in numeri
9 140613 Somma multipli, Disegna montagne, Coppie consecutive, Giustifica a destra, Forza quattro
10 140707 Ultimo uno, L'ultima lettra, Conta parole pari, Lato maggiore, Parole uniche
11 140915 Fizz Buzz, Disegna una scacchiera, Distanza tra dispari, Il numero più pesante, Parole precedute, Quasi uguali
12 150109 Salve, mondo!, Disegna una barretta, Somma interi in ingresso
13 150126 Somma alcuni multipli, Disegna due quadrati, Ultima parola per vocale, Contenimento tra sequenze, Mescola parole, Colonne di lettere
14 150216 Massima distanza, Disegna onde quadre, Prima ed ultima parola per vocale, Cifra più frequente, Conta le navi, Rotazione di una parola
15 150608 Tanto sole, Disegna una freccia, Conta le barrette, Riconosci l'operazione, Quasi uguali, Automa cellulare
16 150706 Conta i quadrati, Disegna due barrette, Suffisso di una sequenza, Trenino, Trova l'ultimo, Scale ascendenti e discendenti
17 150914 Disegna una freccia, Caratteri unici, Conta le cifre pari, Massima somma
18 151208 Salve, mondo!, Disegna una barretta, Somma interi in ingresso
19 151218 Salve, mondo!, Disegna una barretta, Somma interi in ingresso
20 160111 Ultimo maggiorenne, Disegna V rovesciate, Quanti minimi, Serpente di lettere, Colonne di cifre, Numeri narcisi
21 160208 Conta i numeri irap, Disegna montagne, Rimpiazza, L'n-gramma più frequente, Lavorare stanca
22 160607 Somma e sottrai, Barrette, Amitlu parola, Elimina le ripetizioni, Parole incatenate, Editor
23 160712 Giustifica a destra, Coppie consecutive, Scale ascendenti e discendenti, Conta le navi, Numeri felici
24 160914 Somma parole pari, Parole crescenti, Disegna triangoli e rettangoli, Conta le potenze di due, Parole proibite, Righello
25 170126 Censura la prima, Studiare stanca, Piramide di numeri, Disegna il serpente, Stampante configurabile, Righello orizzontale
26 170216 Abbastanza risparmi, Parole incatenate, U Inscatolate, La nave più lunga, Tra parentesi, Distesa di piramidi
27 170613 Parole graziose, Acquedotto, Massimi e minimi, Travasi, Prodotto di matrici, Calcolatrice senza tasti
28 170711 Fizz Buzz, Spirale numerica, Saltapicchio, Condensa parole, Numeri scala, Nave spaziale
29 170914 Estate torrida, Cifra più frequente, Disegna denti di sega, Numeri fortunati, Automa cellulare, Discesa rapida
30 180119 La strana sillabazione, Disegna due quadrati, La barretta più lunga, Cifra più frequente, Abbastanza risparmi, Discesa rapida
31 180129 Distanza tra pari, Word wrap, Disegna onde quadre variabili, La sequenza di Jan Ritsema Van Eck, Pile di stringhe, Matrice di Hadamard
32 180213 Minimo inventario, Disegna una freccia, Bilancio, Colonne di lettere, Carrello, Sottostringhe

Negli ultimi due anni del corso, gli esercizi sono stati utilizzati anche durante i laboratori. La tabella seguente riporta le date delle varie lezioni di laboratorio con l'elenco degli esercizi assegnati in tale lezione. La sequenza di esercizi (all'interno di ogni anno accademico) può costituire una indicazione per lo studente sulla sequenza con cui affrontare gli esercizi.

Data Esercizi
0 161028 Conta linee, Conta i pokemon "Kenny", Conta i pokemon diversi, Salve, mondo!, Disegna una V, Censura la seconda, Incornicia il nome
1 161104 Una grande C, Somma tre numeri reali, Somma tre centesimi, Massimo tra due numeri, Ordina due stringhe, Massimo tra tre, Fasce d'età PEGI, Piccola calcolatrice, Minimo tra quattro
2 161111 Disegna una V, Una grande C, Ultima stringa, Minimo intero positivo, Disegna un quadrato, Stringa più lunga, Disegna un quadrato a "colonne", Conta le cifre pari, Disegna una scacchiera, Disegna un quadrato con "diagonale", Disegna un rombo
3 161118 Palindroma, Conta i numeri ganzi, Somma tre importi, Lunghezza media delle parole, La prova del nove, Numeri felici
4 161202 Conta inversioni, Mescola parole, Conta terne pitagoriche, Parole crescenti, Suddivisione degli URL, Palindroma, Tartaglia, Potenze intere, La costante di Kaprekar, Hanoi, Righello
5 161216 Piccola calcolatrice, Lettera più frequente, Giustifica a destra, Contenimento tra sequenze, Colonne di lettere, Il crivello di Eratostene, Display, L'ultimo caporale, Pila, Potenze di due, Frazioni continue, Visualizza le mosse della torrre di Hanoi
6 161225 Disegna una J, Scala discendente, Alfabeto Morse: Codifica, La strana sillabazione, Alfabeto Morse: Decodifica, I numeri di Lychrel
7 171020 Salve, mondo!, Disegna una V, Censura la seconda, Incornicia il nome, Calcolatrice elementare, Una grande C
8 171027 Piccola calcolatrice, Massimo tra due numeri, Incornicia il nome, Massimo tra tre, Divisibile per quattro, Fasce d'età PEGI, Minimo tra quattro, Stringa più lunga, Minimo intero positivo, Disegna un rombo, Disegna una V
9 171103 Parole graziose, Sequenze di Collatz, Somma tre numeri reali, Disegna una scacchiera, Calcola il "bounding box", Somma tre centesimi, Abbastanza risparmi, Disegno misterioso, Somma tre importi, La prova del nove
10 171110 Scala discendente, Isogramma, Alfabeto Morse: Codifica, Disegna un diamante, Regine all'attacco, Piramide di numeri, Lunghezza media delle parole, I numeri di Lychrel, Cifratura a zigzag, La costante di Kaprekar
11 171117 Al contrario, Piccola calcolatrice, Ultima ripetizione, Alfabeto Morse: Decodifica, Il crivello di Eratostene, Massiminimo, Lettera più frequente, Trasponi matrice, Saltapicchio, La strana somma
12 171124 Barrette, Amitlu parola, Greppino, Quadrato magico, Numeri narcisi, Palindroma, Genera un quadrato magico, Potenze intere, Ordinali di von Neuman, Hanoi
13 171201 Battaglia navale, Posizione, Battaglia navale, Nave, Battaglia navale, Griglia, Battaglia navale, Giocatore, Battaglia navale, Giocatore, Battaglia navale, Randomizzazione
14 171215 Trasmissione a pacchetti, Pacchetto, Trasmissione a pacchetti, Messaggio, Trasmissione a pacchetti, Ricevitore, Calcolatrice RPN, Token, Calcolatrice RPN, Tokenizer, Calcolatrice RPN, IntStack, Calcolatrice RPN, Evaluator
15 180112 Parole incatenate, Disegna un quadrato con "diagonale", Scala maggiore, Prodotto di matrici, Nave spaziale