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

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