Esercizi di programmazione
Questa pagina contiene esercizi utili per esercitarsi a programmare, utilizzando un qualsiasi linguaggio di programmazione.
Classificazione degli esercizi
| Tipo di esercizio | Esercizi |
|---|---|
| Base | 01, 02, 08, 20, 21, 22, 106, 128, 142 |
| Selezione | 03, 04, 05, 06, 07, 09, 23, 29, 30, 39, 40, 93, 94, 141 |
| Iterazione | 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 41, 42, 43, 44, 45, 46, 47, 53, 54, 55 |
| Vettori | 31, 65, 66, 67, 68, 69, 70, 71, 143A, 143B, 144, 145 |
| Funzioni | 24, 25, 26, 27, 28, 32, 63, 64, 88, 91, 92, 112A, 112B, 113 |
| Vettori e funzioni | 33, 34, 35, 36, 37, 38, 152 |
| Funzioni ricorsive | 271, 341, 351, 361, 48, 49, 50, 51, 52, 59, 61, 62 |
| Matrici | 56, 57 |
| Matrici e funzioni | 58, 60 |
| Stringhe | 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87 |
| Stringhe e funzoni | 89, 90, 126, 127 |
| Valori casuali e funzioni | 95, 96, 97, 98, 99, 100, 101, 102, 103, 107 |
| Valori casuali | 146, 147, 148, 149, 150, 151 |
| Struct, enum, typedef | 104, 105 |
| Set | 112C, 117, 118, 124 |
| Dizionari | 112D, 119, 120, 121, 122, 123, 125, 130, 131, 132, 133, 138, 140 |
| Tuple | 129, 137, 140 |
| Gestione dei file | 134, 135, 136, 139 |
Esercizio 01
Scrivi un algoritmo che, letti in input tre numeri interi, restituisce come output la loro media aritmetica.
Esercizio 02
Scrivi un algoritmo che, letti in input due numeri reali, restituisce come output la loro somma.
Esercizio 03
Scrivi un algoritmo che, letto in input un numero intero, restituisce come output il doppio di quel numero se esso è positivo, altrimenti restituisce come output la sua metà.
Esercizio 04
Un’equazione di primo grado nell’incognita x può essere scritta così:
Dove a, b sono dei numeri, detti coefficienti.
Scrivi un algoritmo che, letti in input i valori dei coefficienti a, b, restituisce come output il risultato dell’equazione. I coefficienti possono essere numeri reali qualsiasi.
Esercizio 05
Scrivi un algoritmo che, letto in input un numero reale, il quale rappresenta il prezzo di un prodotto, applica uno sconto del 20% se tale prezzo supera 100€.
L’algoritmo restituisce come output il prezzo finale, eventualmente scontato.
Esercizio 06
Scrivi un algoritmo che, letto in input un anno, restituisce in output “anno bisestile” se esso è, appunto, un anno bisestile, altrimenti non restituisce nulla.
Un anno è bisestile se è divisibile per 400, oppure se è divisibile per 4 ma non per 100.
Ad esempio:
- sono bisestili gli anni 1996, 1600, 2000, 2024
- non sono bisestili gli anni 1800, 1900, 2021, 2022
Esercizio 07
Un’equazione di secondo grado nell’incognita x può essere scritta così:
Dove a, b, c sono dei numeri, detti coefficienti.
Scrivi un algoritmo che, letti in input i valori dei coefficienti a, b, c, restituisce come output il risultato dell’equazione. I coefficienti possono essere numeri reali qualsiasi.
Esercizio 08
Scrivi un algoritmo che, date le coordinate cartesiane di due punti, calcola la loro distanza. Ad esempio, acquisite le coordinate dei punti A = (1,2) e B = (4,6), l’algoritmo restituisce la distanza d = 5.
Esercizio 09
Scrivi un algoritmo che restituisce il risultato di una sfida a Carta Forbice Sasso.
L’algoritmo legge in input la scelta del primo giocatore, poi legge in input la scelta del secondo giocatore. Infine, restituisce in output “Vittoria giocatore 1” oppure “Vittoria giocatore 2” oppure “Pareggio”.
Esercizio 10
Scrivi un algoritmo che stampa i primi 25 numeri pari, partendo dal numero 2.
Esercizio 11
Scrivi un algoritmo che stampa i primi 15 numeri dispari, partendo dal numero 1.
Esercizio 12
Scrivi un algoritmo che, letto in input un numero naturale, restituisce i suoi primi dieci multipli, partendo da se stesso.
Ad esempio, letto in input il numero naturale 8, l’algoritmo dovrà restituire i numeri 8, 16, 24, 32, 40, 48, 56, 64, 72, 80.
Esercizio 13
Scrivi un algoritmo che stampa il quadrato di tutti i numeri naturali da 1 a N, dove N è un numero inserito in input dall’utente.
Esercizio 14
Scrivi un algoritmo che restituisce la somma di tutti i numeri da 1 a N, dove N è un numero intero chiesto in input all’utente.
Nota bene: per questo esercizio bisogna utilizzare:
- un ciclo for
- una variabile, che puoi ad esempio chiamare “somma”, la quale inizialmente è pari a 0. Ad essa bisogna sommare tutti i valori, partendo da 1 e arrivando a sommarle N.
Esercizio 15
Scrivi un algoritmo che, letto in input un numero naturale, restituisce i suoi divisori interi. Ad esempio, letto in input il numero naturale 10, l’algoritmo dovrà restituire i numeri 1, 2, 5, 10.
Nota bene: un numero N è divisibile per un numero d se e solo se il resto della divisione N / d è uguale a zero. Per ottenere il resto di una divisione, in programmazione si usa il simbolo %.
Ad esempio:
- 14 % 3 = 2
- 10 % 2 = 0
- 9 % 2 = 1
Esercizio 16
Scrivi un algoritmo che, letto in input un numero naturale, restituisce il fattoriale di quel numero.
Il fattoriale di un numero naturale N è il prodotto dei numeri interi positivi minori o uguali a tale numero. Ad esempio:
- 1! = 1
- 2! = 2 * 1 = 2
- 3! = 3 * 2 * 1 = 6
- 4! = 4 * 3 * 2 * 1 = 24
Per definizione, 0! = 1.
Nota bene: per questo esercizio bisogna utilizzare:
- un ciclo for
- una variabile, che puoi ad esempio chiamare “fattoriale”, la quale inizialmente è pari a 1. Per essa bisogna moltiplicare tutti i valori, partendo da 1 e arrivando a moltiplicarla per N.
Esercizio 17
Scrivi un algoritmo che, letto in input un numero intero positivo, restituisce “Vero” se tale numero è primo, altrimenti “Falso”.
Un numero intero positivo è primo quando è divisibile soltanto per 1 e per se stesso.
Esercizio 18
La successione di Fibonacci è una successione di numeri interi in cui ciascun numero è la somma dei due precedenti, eccetto i primi due che sono, per definizione, 0 e 1. I primi numeri della successione sono: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55…
Scrivi un algoritmo che restituisce i primi N numeri della successione di Fibonacci. N è una variabile da chiedere in input all’utente.
Esercizio 19
Scrivi un algoritmo che, letti in input un numero intero b e un numero intero positivo e, restituisce la potenza e-esima di b.
Ad esempio, se b = -2 ed e = 3, l’algoritmo restituirà -8, ovvero il risultato di (-2)3.
Esercizio 20
Scrivi un algoritmo che chieda all’utente di immettere un numero a due cifre e, successivamente, stampi il numero con le cifre invertite. Una sessione del programma deve presentarsi come segue:
Inserisci un numero di due cifre: 28
Il contrario è: 82
Esercizio 21
Scrivi un algoritmo che accetti la data dall’utente nella forma mm/gg/aaaa per poi stamparla nella forma aaaammgg, ad esempio:
Inserisci una data (mm/gg/aaaa): 2/17/2023
Hai inserito la data 20230217
Esercizio 22
Scrivi un algoritmo che, letta in input una temperatura espressa in gradi Fahrenheit, restituisca come output la stessa temperatura, ma espressa in gradi Celsius.
Se F è la temperatura in Fahrenheit, la temperatura C espressa in Celsius si calcola così:
Esercizio 23
Scrivi un algoritmo che, letti in input due numeri interi, restituisce come output il massimo tra i due. Se essi sono uguali, mostra il messaggio: “Uguale valore!”
Esercizio 24
Scrivi una funzione in grado di risolvere un’equazione di primo grado.
La segnatura della funzione deve essere:
- in C:
float solve(float a, float b);
- in Python:
def solve(a: float, b: float) -> float | str
Dove a e b rappresentano i coefficienti dell’equazione di primo grado. Per maggiori dettagli, vedi l’Esercizio 04.
La funzione Python restituisce il risultato dell’equazione, oppure le stringhe
Equazione impossibileoEquazione indeterminata.
Esercizio 25
Scrivi una funzione la quale restituisce true se un dato anno è bisestile, altrimenti false.
La segnatura della funzione deve essere:
- in C:
bool is_leap_year(int year);
- in Python:
def is_leap_year(year: int) -> bool
Dove year è l’anno di cui devi valutare la bisestilità. Per maggiori dettagli, vedi l’Esercizio 06.
Esercizio 26
Scrivi una funzione la quale restituisce una lista contenente i primi dieci multipli di un numero N.
La segnatura della funzione deve essere:
def multiples(n: int) -> list[int]
Dove n è il numero di cui bisogna ottenere i primi dieci multipli. Per maggiori dettagli, vedi l’Esercizio 12.
Esercizio 27
Scrivi una funzione la quale restituisce il fattoriale di un numero N.
La segnatura della funzione deve essere:
long int factorial(int N);
Dove N è il numero di cui bisogna ottenere il fattoriale. Per maggiori dettagli, vedi l’Esercizio 16.
Esercizio 28
Scrivi una funzione la quale restituisce la temperatura espressa in gradi Celsius, data la temperatura espressa in Fahrenheit.
La segnatura della funzione deve essere:
- in C:
float to_celsius(float F);
- in Python:
def to_celsius(fahrenheit: float) -> float
Dove F è la temperatura espressa in gradi Fahrenheit. Per maggiori dettagli, vedi l’Esercizio 22.
Esercizio 29
Scrivi un algoritmo che, letto in input il valore di uno scambio di azioni, restituisce come output le commissioni da pagare al broker per quello scambio.
Quando delle azioni sono vendute o comprate attraverso un broker finanziario, la commissione del broker viene calcolata utilizzando una scala mobile che dipende dal valore delle azioni scambiate. Diciamo che le commissioni di un broker corrispondano a quelle illustrate nella seguente tabella:
| Dimensione della transazione (in $) | Commissione |
|---|---|
| [0, 2.500) | 30$ + 1,7% |
| [2.500, 6.250) | 56$ + 0,66% |
| [6.250, 20.000) | 76$ + 0,34% |
| [20.000, 50.000) | 100$ + 0,22% |
| [50.000, 500.000) | 155$ + 0,11% |
| [500.000, +∞) | 255$ + 0,09% |
La commissione minima è di 39$.
Ecco un esempio:
Inserisci il valore dello scambio: 30000
Commissioni: $166.00
Esercizio 30
Scrivi un algoritmo che legge in input una data, scritta nel formato mm/gg/aaaa, e restituisce come output la stessa data nel formato “legale” inglese. Ad esempio:
Enter a date (mm/dd/yyyy): 7/19/2014
Legal format: 19th day of July, 2014.
Oppure:
Enter a date (mm/dd/yyy): 10/2/2023
Legal format: 2nd day of October, 2023.
Presta attenzione alle desinenze inglesi ‘st’, ‘nd’, ‘rd’, ‘th’ davanti al numero del giorno.
Esercizio 31
Scrivi un algoritmo che chiede all’utente di inserire dieci numeri interi, su una stessa riga, separati da uno spazio.
Dopodiché, l’algoritmo mostra come output quegli stessi numeri, ma riscritti in ordine inverso. Ad esempio:
Inserisci 10 numeri: 34 82 49 102 -7 94 23 -11 50 31
In ordine inverso: 31 50 -11 23 94 -7 102 49 82 34
Esercizio 32
Scrivi una funzione la quale, ricevuto come parametro un numero intero, mostra in output le singole cifre di quel numero, al contrario, una per riga, e non restituisce nulla.
La segnatura della funzione deve essere:
void digits(int n);
Ad esempio:
digits(4321) –>
1
2
3
4
Consiglio: usa un ciclo while nel quale, all’inizio ogni iterazione, ottieni la cifra più a destra con
n % 10. Alla fine di ogni iterazione, dividi n per 10:n = n / 10.
Esercizio 33
Scrivi una funzione la quale, ricevuto come parametro un numero intero, restituisce true se il numero presenta delle cifre ripetute, altrimenti false.
La segnatura della funzione deve essere:
bool repeated_digit(int n);
Consiglio: per risolvere l’esercizio, puoi costruire un vettore di 10 elementi, chiamato ad esempio
seen, con tutti gli elementi inizialmente uguali afalse. Con un ciclo for, percorri le cifre del numeron(come fare?). Se una cifracè incontrata per la prima volta (ovvero seseen[c] == false), nel vettoreseenponiseen[c] = true. Se la cifracè già stata incontata (ovvero seseen[c] == true), allora hai incontrato una cifra ripetuta: fai in modo che la tua funzione termini subito, restituendo il valoretrue.
Ricorda che per usare
trueefalsedevi includere nel tuo file la libreriastdbool.h.
Ad esempio:
repeated_digit(2812)–>truerepeated_digit(9357)–>false
Esercizio 34
Scrivi una funzione la quale, ricevuto come parametro un vettore di interi, restituisce la somma di tutti gli elementi del vettore.
La segnatura della funzione deve essere:
int sum(int nums[], int LEN);
Dove LEN è la lunghezza del vettore.
Ad esempio:
sum({33, 19, -4, 101, 21}, 5) –> 170
Esercizio 35
Scrivi una funzione la quale, ricevuto come parametro un vettore di interi, restituisce il massimo tra tutti gli elementi del vettore.
La segnatura della funzione deve essere:
int max(int nums[], int LEN);
Dove LEN è la lunghezza del vettore.
Ad esempio:
max({33, 19, -4, 101, 21}, 5) –> 101
Esercizio 36
Scrivi una funzione la quale, ricevuto come parametro un vettore di interi, restituisce il minimo tra tutti gli elementi del vettore.
La segnatura della funzione deve essere:
int min(int nums[], int LEN);
Dove LEN è la lunghezza del vettore.
Ad esempio:
min({33, 19, -4, 101, 21}, 5) –> -4
Esercizio 37
Scrivi una funzione la quale, ricevuti come parametri due vettori di interi, restituisce true se i due vettori sono uguali, altrimenti false.
Due vettori sono uguali se e solo se:
- hanno la stessa lunghezza;
- hanno lo stesso elemento, nella stessa posizione.
La segnatura della funzione deve essere:
bool equal(int v1[], int l1, int v2[], int l2);
Dove l1, l2 sono le lunghezze dei vettori.
Ad esempio:
equal({1, 2}, 2, {1, 2}, 2) –> true
equal({1, 2}, 2, {1, 2, 3}, 3) –> false
equal({1, 2}, 2, {2, 1}, 2) –> false
Esercizio 38
Scrivi una funzione la quale, ricevuto come parametro un vettore di interi e un numero intero value, restituisce quante volte il value è ripetuto nel vettore.
La segnatura della funzione deve essere:
int count(int v[], int len, int value);
Dove len è la lunghezza del vettore.
Ad esempio:
count({1, 1, 4}, 3, 1) –> 2
count({-1, -6, -9, 0}, 4, 10) –> 0
Esercizio 39
Scrivi un algoritmo che, letti in input tre numeri interi, mostra in output il massimo e il minimo tra di essi.
Esercizio 40
Scrivi un algoritmo che, lette in input le lunghezze dei tre lati di uno stesso triangolo, controlla che sia rispettata la disuguaglianza triangolare.
In matematica, la disuguaglianza triangolare afferma che, in un triangolo non degenere, la somma delle lunghezze di due lati è maggiore della lunghezza del terzo.
Se la disuguaglianza triangolare è rispettata, l’algoritmo mostra in output la scritta: “Triangolo valido!”. Altrimenti, non mostra nulla.
Esercizio 41
Scrivi un algoritmo che, letto in input un numero intero positivo N, restituisce come output la prima potenza del 2 maggiore o uguale a quel numero.
Ecco degli esempi di output attesi, dati dei valori per il parametro N:
| N | Output atteso |
|---|---|
| 0 | 1 |
| 9 | 16 |
| 121 | 128 |
| 64 | 64 |
Esercizio 42
Scrivi un algoritmo che, letto in input un numero intero positivo N, restituisce come output tutti i numeri interi, da N a 0 (estremi esclusi).
Esercizio 43
Scrivi un algoritmo che, letto in input un numero intero positivo N, restituisce come output la tavola dei quadrati dei numeri da 1 a N. Ad esempio, se N valesse 10:
N = 10
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
Nota bene: fai in modo che i numeri siano perfettamente allineati, come nell’esempio qui sopra.
Esercizio 44
Scrivi un algoritmo che legge in input dei numeri interi inseriti dall’utente. Quando l’utente inserisce il numero 0, l’algoritmo smette di leggere l’input.
L’algoritmo deve restituire la somma dei numeri immessi in input dall’utente.
Un esempio:
Numeri (0 per terminare):
8
23
71
5
0
Somma = 107
Esercizio 45
Scrivi un algoritmo che, letto in input un numero intero non negativo N, restituisce come output il numero di cifre di quel numero.
Esercizio 46
Qual è l’output del seguente frammento di programma?
int i = 1;
while (i <= 128)
{
printf("%d", i);
i *= 2;
}
Controlla la tua ipotesi eseguendo il codice C.
Esercizio 47
Qual è l’output del seguente frammento di programma?
int i = 9384;
do
{
printf("%d ", i);
i /= 10;
} while(i > 0);
Controlla la tua ipotesi eseguendo il codice C.
Esercizio 48
Scrivi una funzione la quale, ricevuti come parametri due vettori di interi di uguale lunghezza, restituisce true se i due vettori sono uguali, altrimenti false.
Due vettori di uguale lunghezza sono uguali se e solo se in ogni posizione conservano lo stesso valore.
La segnatura della funzione deve essere:
bool equal(int v1[], int v2[], int l);
Dove l è la lunghezza dei due vettori.
Ad esempio:
equal({1, 2}, {1, 2}, 2) –> true
equal({3, 1, 2}, {1, 2, 3}, 3) –> false
equal({1, 2}, {2, 1}, 2) –> false
Esercizio 49
Scrivi una funzione la quale, ricevuto come parametro un numero intero positivo N, restituisce l’N-esimo numero della sequenza di Fibonacci.
La segnatura della funzione deve essere:
int fibonacci(int n);
Al suo interno, la funzione fibonacci deve sfuttare una funzione ricorsiva, fibonacci_rec, con la seguente segnatura:
int fibonacci_rec(int n, int a, int b);
Ecco alcuni esempi di input e di output atteso:
| n | fibonacci(n) |
|---|---|
| 0 | 1 |
| 1 | 1 |
| 5 | 8 |
| 7 | 21 |
| 10 | 89 |
Esercizio 50
Scrivi una funzione che riceve come parametri due numeri naturali, m ed n, la quale mostra i primi m multipli di n, partendo dal più grande (n * m) e arrivando al più piccolo n.
La segnatura della funzione deve essere:
void multipli(int n, int m);
Ecco alcuni esempi di input e output attesi:
| n | m | multipli(n, m) |
|---|---|---|
| 5 | 4 | 20 15 10 5 |
| 11 | 8 | 88 77 66 55 44 33 22 11 |
Esercizio 51
Scrivi una funzione che riceve come parametri due numeri naturali, m ed n, la quale mostra i primi m multipli di n, partendo dal più piccolo (n) e arrivando al più grande (n * m).
La segnatura della funzione deve essere:
void multipli(int n, int m);
Ecco alcuni esempi di input e output attesi:
| n | m | multipli(n, m) |
|---|---|---|
| 5 | 4 | 5 10 15 20 |
| 11 | 8 | 11 22 33 44 55 66 77 88 |
Esercizio 52
Scrivi una funzione ricorsiva che mostri in output le istruzioni utili a risolvere il gioco della torre di Hanoi.
La segnatura della funzione deve essere:
void hanoi(int n, char from, char helper, char to);
Dove:
nè il numero di dischi per il quale risolvere il giocofromè un carattere usato come nome della prima colonna (ovvero la colonna in cui è inizialmente posizionata la torre)helperè un carattere usato come nome della seconda colonnatoè un carattere usato come nome della terza colonna (ovvero la colonna in cui sarà infine posizionata la torre)
Ad esempio, la chiamata hanoi(3, 'A', 'B', 'C'); deve far apparire le seguenti istruzioni:
Move disc from A to C
Move disc from A to B
Move disc from C to B
Move disc from A to C
Move disc from B to A
Move disc from B to C
Move disc from A to C
Esercizio 53
Scrivi un algoritmo che, letto in input un numero intero positivo, mostra in output le singole cifre di quel numero, separate da uno spazio, in ordine inverso. Ad esempio, se il numero in input fosse 2812, l’algoritmo mostrerebbe come output: 2 1 8 2.
Consiglio: usa un ciclo while nel quale, all’inizio ogni iterazione, ottieni la cifra più a destra con
n % 10. Alla fine di ogni iterazione, dividi n per 10:n = n / 10.
Esercizio 54
Scrivi un algoritmo che continua a chiedere dei numeri interi in input all’utente, finché egli non inserisce il numero 0. A quel punto, mostra in output il massimo valore inserito.
Esercizio 55
Scrivi un algoritmo che continua a chiedere dei numeri interi in input all’utente, finché egli non inserisce il numero 0. A quel punto, mostra in output la media dei valori inseriti (escluso lo zero).
Nota bene: Se l’utente immette subito il numero 0, allora non deve apparire nessun output.
Nota bene: la media di numeri interi, in generale, è un numero reale. Mostra la media con due cifre decimali.
Esercizio 56
Scrivi un algoritmo che crea una matrice 10x10, nella quale salva le tabelline dei numeri da 1 a 10. Poi, mostra in output il contenuto della matrice. L’output apparirà così:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Esercizio 57
Scrivi un algoritmo che, data la seguente matrice 10x10:
int m[10][10] = {
{47, -94, 4, 35, 44, 1, 26, 9, -7, 70},
{-17, 46, -16, -7, 7, 68, -2, -94, -27, -42},
{-96, -31, -96, 6, -51, -64, -28, 37, -59, -52},
{-7, 26, -59, 63, -20, -26, 30, 34, 5, 44},
{-22, -53, -64, 88, -97, -72, 43, -19, -83, -42},
{-85, -46, 37, 32, -38, -81, -50, -78, 83, 6},
{44, -19, -42, -16, 84, 97, 5, -68, 10, -61},
{80, 94, 20, -49, -59, 67, 84, -36, 64, 18},
{-35, -75, -99, 95, -46, -36, -75, 72, -93, -2},
{88, -75, -24, -81, -57, -28, -30, -91, 20, 88},
};
Mostra in output, sulla stessa riga, separati da uno spazio, gli elementi della diagonale principale, ovvero quella in cui gli indici di riga e colonna sono uguali. Quali sono tali elementi?
Esercizio 58
Scrivi una funzione che, ricevuta come parametro una matrice 10x10, restituisce come output la somma degli elementi della diagonale secondaria, ovvero quella che parte da in alto a destra e finisce in basso a sinistra.
La segnatura della funzione deve essere:
int sum_sec_diag(int matrix[10][10]);
Quanto vale la somma degli elementi della diagonale secondaria della matrice dell’esercizio precedente?
Esercizio 59
Scrivi una funzione ricorsiva che, dati due numeri naturali, ne calcoli il massimo comune divisore tramite sottrazioni ripetute.
La segnatura della funzione deve essere:
int mcd(int a, int b);
Ad esempio:
mcd(10, 5) –> 5
mcd(273, 105) –> 21
Esercizio 60
Scrivi una funzione che, ricevuta come parametro una matrice 5x5, mostra in output la sua matrice trasposta.
La segnatura della funzione deve essere:
void transpose(int matrix[5][5]);
Ad esempio, data la matrice:
int m[5][5] = {
{-35, -62, -26, -37, -31},
{82, 20, 37, 90, -20},
{51, -7, -80, -29, 41},
{4, 23, 6, 14, 11},
{22, 46, -70, 96, -46},
};
Chiamando transpose(m), apparirà come output:
-35 82 51 4 22
-62 20 -7 23 46
-26 37 -80 6 -70
-37 90 -29 14 96
-31 -20 41 11 -46
Esercizio 61
Scrivi una funzione ricorsiva che, ricevuto come parametro un numero intero positivo n, mostra in output la successione di Collatz di n.
La segnatura della funzione deve essere:
void collatz(int n);
La congettura di Collatz riguarda il seguente algoritmo:
-
si prenda un numero intero positivo n.
-
se n = 1, l’algoritmo termina.
-
Se n è pari, si divida per due; altrimenti si moltiplichi n per 3 e si aggiunga 1.
È possibile formare una successione applicando la funzione ripetutamente prendendo come primo elemento un qualunque intero positivo e, ad ogni passaggio, applicare la funzione al risultato precedente.
Per esempio, iniziando con n = 6, otteniamo la successione 6, 3, 10, 5, 16, 8, 4, 2, 1.
La congettura di Collatz asserisce che questo algoritmo giunge sempre a termine, indipendentemente dal valore di partenza.
Rimane una congettura (e non un teorema), poiché nessuno è mai riuscito a dimostrare formalmente la ragione di questo comportamento.
Esercizio 62
Scrivi una funzione ricorsiva chemostra il risultato della funzione 91 di McCarthy, dato un numero intero qualsiasi.
La segnatura della funzione deve essere:
void mccarthy(int n);
La funzione 91 di McCarthy è una funzione ricorsiva che restituisce 91 per tutti gli argomenti n ≤ 101 e restituisce n − 10 per n > 101.
La Funzione 91 di McCarthy è definita come segue:
Esercizio 63
Scrivi una funzione che, ricevuto come parametro un numero naturale, restituisce true se tale numero è abbondante, altrimenti false.
La segnatura della funzione deve essere:
- in C:
bool abbondante(int n);
- in Python:
def abbondante(n: int) -> bool
Un numero naturale N è detto abbondante se la somma dei suoi divisori (N escluso) è maggiore di N stesso.
Ad esempio, 12 è un numero abbondante, poiché 1 + 2 + 3 + 4 + 6 = 16 > 12.
Qual è il primo numero abbondante e dispari? Nel
main(), scrivi del codice che sfrutti la funzioneabbondante()per rispondere a questa domanda.
Esercizio 64
Scrivi una funzione che, ricevuto come parametro un numero naturale, restituisce true se tale numero è perfetto, altrimenti false.
- in C:
bool perfetto(int n);
- in Python:
def perfetto(n: int) -> bool
Un numero naturale N è detto perfetto se è uguale alla somma dei suoi divisori, N escluso.
Ad esempio, 6 è un numero perfetto, poiché 1 + 2 + 3 == 6.
Quali sono i primi quattro numeri perfetti? Nel
main(), scrivi del codice che sfrutti la funzioneperfetto()per rispondere a questa domanda.
Esercizio 65
Scrivi un algoritmo che:
- chiede all’utente di inserire cinque numeri interi in input, e li salva in un vettore
- mostra in output i valori contenuti nel vettore
- mostra in output i valori contenuti nel vettore, sommando +8 a ciascun valore
Ecco un esempio esatto dell’input/output di questo algoritmo:
N = 1
N = 8
N = -13
N = 10
N = 11
I valori del vettore:
v[0] = 1
v[1] = 8
v[2] = -13
v[3] = 10
v[4] = 11
I valori del vettore, con un incremento di +8:
v[0] + 8 = 9
v[1] + 8 = 16
v[2] + 8 = -5
v[3] + 8 = 18
v[4] + 8 = 19
Esercizio 66
Scrivi un algoritmo che:
- chiede all’utente di inserire dei numeri interi in input e li salva in un vettore, finché l’utente non inserisce un numero negativo, oppure fino ad aver letto 20 valori. Il numero negativo non deve fare parte del vettore.
- mostra in output i valori contenuti nel vettore
- mostra in output la somma dei valori contenuti nel vettore.
Ecco un esempio esatto dell’input/output di questo algoritmo:
Inserisci dei numeri interi positivi:
3
10
12
18
-4
I valori del vettore:
v[0] = 3
v[1] = 10
v[2] = 12
v[3] = 18
Somma = 43
Esercizio 67
Scrivi un algoritmo che:
- chiede all’utente di inserire dei numeri interi in input e li salva in un vettore, finché l’utente non inserisce un numero multiplo di 17. Tale numero multiplo di 17 non deve fare parte del vettore.
- mostra in output i valori
- mostra in output la somma dei valori in posizione pari
- mostra in output la somma dei valori in posizione dispari
- mostra in output la differenza tra le due somme sopra citate
Ecco un esempio esatto dell’input/output di questo algoritmo:
Inserisci dei numeri interi positivi:
3
10
-9
8
23
17
I valori:
v[0] = 3
v[1] = 10
v[2] = -9
v[3] = 8
v[4] = 23
Somma dei valori in posizione pari: 17
Somma dei valori in posizione dispari: 18
Differenza: -1
Esercizio 68
Scrivi un algoritmo che chiede all’utente di inserire dei numeri nell’intervallo [0, 20) (0 è incluso, mentre 20 è escluso). Appena l’utente inserisce un valore esterno a questo intervallo, l’algoritmo smette di chiedere valori in input. L’algoritmo deve mostrare quante volte un certo valore è stato inserito in input dall’utente. Ecco un esempio dell’input/output di questo programma:
Inserisci dei valori nell'intervallo [0, 20):
12
12
0
3
9
8
4
12
3
21
La frequenza di 0 è stata: 1
La frequenza di 1 è stata: 0
La frequenza di 2 è stata: 0
La frequenza di 3 è stata: 2
La frequenza di 4 è stata: 1
La frequenza di 5 è stata: 0
La frequenza di 6 è stata: 0
La frequenza di 7 è stata: 0
La frequenza di 8 è stata: 1
La frequenza di 9 è stata: 1
La frequenza di 10 è stata: 0
La frequenza di 11 è stata: 0
La frequenza di 12 è stata: 3
La frequenza di 13 è stata: 0
La frequenza di 14 è stata: 0
La frequenza di 15 è stata: 0
La frequenza di 16 è stata: 0
La frequenza di 17 è stata: 0
La frequenza di 18 è stata: 0
La frequenza di 19 è stata: 0
Suggerimento: crea un vettore di 20 elementi interi. All’inizio, poni tutti i valori del vettore pari a 0. Poi, se l’utente, ad esempio, inserisce il numero 8, allora incrementi di 1 il valore in posizione 8 del vettore.
Esercizio 69
La serie di Fibonacci è 0, 1, 1, 2, 3, 5, 8, 13, … dove ogni numero è pari alla somma dei due precedenti. Scrivi un algoritmo che dichiari il vettore fib_numbers e lo riempia con i primi 20 numeri di Fibonacci.
Suggerimento: riempi i primi due numeri individualmente e poi usa un ciclo per calcolare i rimanenti.
Ecco l’output di questo programma:
0 0
1 1
2 1
3 2
4 3
5 5
6 8
7 13
8 21
9 34
10 55
11 89
12 144
13 233
14 377
15 610
16 987
17 1597
18 2584
19 4181
Esercizio 70
Scrivi un algoritmo che:
- crea un vettore
a, il quale contiene cinque numeri interi nell’intervallo [-100, 100], inseriti in input dall’utente - crea un vettore
b, il quale contiene cinque numeri interi nell’intervallo [-100, 100], generati in maniera pseudo-casuale - mostra in output i valori contenuti nei due vettori
- mostra in output la scritta:
Maggiore!se ciascun elemento diaè maggiore dell’elemento dibnella stessa posizione. Altrimenti, mostra in output la scritta:Non maggiore :(
Ad esempio:
n = 88
n = 102
Valore non valido, riprova.
n = -3
n = -23
n = 3
n = -222
Valore non valido, riprova.
n = 2
a = [88, -3, -23, 3, 2]
b = [-6, 81, 85, 25, 17]
Non maggiore :(
Esercizio 71
Scrivi un algoritmo che riempie un vettore di 10 numeri pseudo-casuali nell’intervallo [-20, 5].
L’algoritmo mostra in output la scritta: OK 😎 se tutti (!) i valori contenuti nel vettore sono negativi e dispari. Altrimenti, mostra in output la scritta: KO ☹️
Esercizio 72
Scrivi un algoritmo che chiede all’utente di inserire 10 valori interi e li salva in una lista.
L’algoritmo mostra in output la scritta: Ordinato 😎 se i valori nella lista sono ordinati in ordine crescente. Altrimenti, mostra in output la scritta: Disordinato ☹️
Esercizio 73
Scrivi un algoritmo che, chiesto in input il nome dell’utente, lo saluta. L’input/output del programma sarà di questo tipo:
Come ti chiami? Angelo
Ciao, Angelo!
Attenzione:
- l’algoritmo deve accettare nomi lunghi al massimo 20 caratteri
- il nome dell’utente può contenere spazi
- se il nome dell’utente supera i 20 caratteri, deve apparire il seguente avviso:
AVVISO: il tuo nome è più lungo di 20 caratteri: solo i primi 20 saranno salvati.Ecco un esempio dell’input/output, quando l’utente supera i 20 caratteri per il nome:
Come ti chiami? Marco Tullio Cicerone
AVVISO: il tuo nome è più lungo di 20 caratteri: solo i primi 20 saranno salvati.
Ciao, Marco Tullio Ciceron!
Esercizio 74
Parti dalla soluzione all’esercizio precedente e aggiungi questa funzionalità: fai in modo che, se l’utente clicca invio, senza inserire alcun nome, si mostri un messaggio di errore, e gli si chieda di nuovo di inserire un nome.
Ecco un esempio dell’input/output:
Come ti chiami?
ERRORE: non hai inserito alcun nome. Riprova.
Come ti chiami? Marco Tullio Cicerone
AVVISO: il tuo nome è più lungo di 20 caratteri: solo i primi 20 saranno salvati.
Ciao, Marco Tullio Ciceron!
Esercizio 75
Parti dalla soluzione all’esercizio precedente e aggiungi questa funzionalità: fai in modo che, anche quando il nome inserito dall’utente è più lungo del consentito, si mostri un messaggio di errore, e gli si chieda di nuovo di inserire un nome.
Ecco un esempio dell’input/output:
Come ti chiami?
ERRORE: non hai inserito alcun nome. Riprova.
Come ti chiami? Marco Tullio Cicerone
ERRORE: hai inserito un nome troppo lungo. Riprova.
Come ti chiami? Angelo
Ciao, Angelo!
Esercizio 76
Parti dalla soluzione all’esercizio precedente e aggiungi questa funzionalità: fai in modo che, se il nome inserito contiene degli spazi all’inizio o alla fine, si mostri un messaggio di errore, e gli si chieda di nuovo di inserire un nome.
Ecco un esempio dell’input/output:
Come ti chiami?
ERRORE: non hai inserito alcun nome. Riprova.
Come ti chiami? Angelo
ERRORE: Il nome contiene degli spazi iniziali. Riprova.
Come ti chiami? Angelo // Non si vede, ma qui l'utente ha messo degli spazi alla fine del nome
ERRORE: Il nome contiene degli spazi finali. Riprova.
Come ti chiami? Marco Tullio Cicerone
ERRORE: hai inserito un nome troppo lungo. Riprova.
Come ti chiami? Angelo
Ciao, Angelo!
Esercizio 77 (esercizio riassuntivo)
Parti dalla soluzione all’esercizio precedente e aggiungi questa funzionalità: dopo aver chiesto all’utente il suo nome, chiedigli di inserire il nome della città in cui vive. Per il nome della città, devono essere applicati gli stessi controlli applicati per il nome dell’utente. Ecco un esempio dell’input/output, quando l’utente inserisce al primo colpo dei valori accettabili:
Come ti chiami? Angelo
Dove abiti? Osnago
Ciao, Angelo!
Abiti a Osnago
Esercizio 78
Scrivi un algoritmo che, ricevuto in input un testo qualsiasi, restituisce il numero di parole presenti in quel testo. Con “parole” si intendono le parti del testo divise da spazi. Il testo termina con un \n.
Now is better than never. Although never is often better than _right_ now.
Numero di parole nel testo: 13
Hint: sei sicuro che sia necessario usare una variabile stringa per questo esercizio?
Esercizio 79A
Il palindromo è una sequenza di caratteri che, letta al contrario, rimane invariata. Sono esempi di palindromi: “” (la stringa vuota), “A”, “101”, “osso”…
Non sono esempi di palindromi: “Natan” (la prima N è maiuscola, l’ultima minuscola), “asso”, “permesso”, “Aa”…
Scrivi un algoritmo che chiede una parola come input e mostra in output: PALINDROMO! se la parola è palindroma, altrimenti Non palindromo.
Esercizio 79B
Parti dalla soluzione dell’esercizio precedente e migliorala, aggiungendo questa funzionalità: il programma deve mostrare un messaggio di errore e chiedere nuovamente di inserire una parola se l’utente inserisce una parola più lunga del massimo consentito. Ad esempio, se la lunghezza massima consentita per le stringa fosse 5, questo sarebbe l’input/utput del programma:
Inserisci una parola: OssessO
ERRORE: lunghezza massima 5. Parola inserita troppo lunga. Riprovare.
Inserisci una parola: Coccodrillo
ERRORE: lunghezza massima 5. Parola inserita troppo lunga. Riprovare.
Inserisci una parola: natan
PALINDROMO!
Esercizio 79C
Parti dalla soluzione dell’esercizio precedente e generalizzala, aggiungendo questa funzionalità: se anche la capitalizzazione delle lettere è diversa, il tuo programma può riconoscere una stringa palindroma. Ad esempio, le parole “Natan”, “OsSesso”, “ONno”, che finora non sarebbero state riconosciute come palindrome, essendo alcune lettere maiuscole e altre minuscole, ora, invece, dovranno dare come output: PALINDROMO!
Esercizio 80A
Scrivi un algoritmo che, ricevuta in input una password, mostra in output la scritta: Password robusta 😎 se la password:
- è lunga almeno 10 caratteri
- contiene almeno una lettera maiuscola
- contiene almeno una cifra numerica
Altrimenti, mostra come output: Very, very bad password 🧐. Due esempi:
$ ./es80
Password: ciao
Lunghezza: 4
Very, very bad password 🧐
$ ./es80
Password: IncrediblyStrongPa22w0rd
Lunghezza: 24
Password robusta 😎
Esercizio 80B
Parti dalla soluzione all’esercizio precedente e rendi l’output più esplicito, così da aiutare l’utente a capire cosa va bene e cosa non va bene della sua password. Esempi:
$ ./es80
Password: ciao
Lunghezza: 4
Very, very bad password 🧐
⛔️ Lunghezza non adatta
⛔️ Cifra numerica assente
⛔️ Lettera maiuscola assente
$ ./es80
Password: IncrediblyStrongPa22w0rd
Lunghezza: 24
Password robusta 😎
✅ Lunghezza adatta
✅ Cifra numerica presente
✅ Lettera maiuscola presente
$ ./es80
Password: LungaMaSenzaNumeri
Lunghezza: 18
Very, very bad password 🧐
✅ Lunghezza adatta
⛔️ Cifra numerica assente
✅ Lettera maiuscola presente
Esercizio 81
Scrivi un algoritmo che chiede all’utente di inserire in input un testo. Poi, chiede all’utente di indicare una lettera. L’algoritmo mostra in output quante volte quella lettera è ripetuta nel testo. La capitalizzazione della lettera non conta: essa può essere presente sia in minuscolo sia in maiuscolo: deve essere considerata. Ecco un esempio dell’input/output di questo programma:
Testo:
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, ché la diritta via era smarrita. Ahi quanto a dir qual era è cosa dura esta selva selvaggia e aspra e forte che nel pensier rinova la paura!
Carattere: a
Il carattere 'a' appare 29 volte.
Testo:
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, ché la diritta via era smarrita. Ahi quanto a dir qual era è cosa dura esta selva selvaggia e aspra e forte che nel pensier rinova la paura!
Carattere: A
Il carattere 'A' appare 1 volte.
Esercizio 82
Scrivi un algoritmo che chiede all’utente di inserire in input un testo. L’algoritmo restituisce in output quel testo, ma al contrario. Esempio:
Testo:
Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, ché la diritta via era smarrita. Ahi quanto a dir qual era è cosa dura esta selva selvaggia e aspra e forte che nel pensier rinova la paura!
Testo al contrario:
!aruap al avonir reisnep len ehc etrof e arpsa e aiggavles avles atse arud asoc �� are lauq rid a otnauq ihA .atirrams are aiv attirid al ��hc ,arucso avles anu rep iavortir im ativ artson id nimmac led ozzem leN
Noterai che le lettere accentate non sono correttamente ‘rovesciate’. Questo è normale. Se chiedi al prof., può spiegarti la ragione 🤓
Esercizio 83
Scrivi un algoritmo che chiede all’utente in input un testo. L’algoritmo restituisce in output quel testo, ma con la capitalizzazione invertita. Ad esempio:
Testo:
NeL MeZzO DeL CaMmIn dI NoStRa vItA Mi rItRoVaI PeR UnA SeLvA OsCuRa, ChÉ La dIrItTa vIa eRa sMaRrItA. aHi qUaNtO A DiR QuAl eRa è cOsA DuRa eStA SeLvA SeLvAgGiA E AsPrA E FoRtE ChE NeL PeNsIeR RiNoVa lA PaUrA!
nEl mEzZo dEl cAmMiN Di nOsTrA ViTa mI RiTrOvAi pEr uNa sElVa oScUrA, cHÉ lA DiRiTtA ViA ErA SmArRiTa. AhI QuAnTo a dIr qUaL ErA è CoSa dUrA EsTa sElVa sElVaGgIa e aSpRa e fOrTe cHe nEl pEnSiEr rInOvA La pAuRa!
Hint: sei sicuro che sia necessario usare una variabile stringa per questo esercizio?
Esercizio 84
Scrivi un algoritmo che chiede in input all’utente un testo. L’algoritmo restituisce in output quel testo, ma con gli spazi ` ` sostituiti dal carattere ` `. Ad esempio:
Testo:
Ricchi X sempre
Ricchi_X_sempre
Esercizio 85
Questo è un tabellone 3x3 (come nel gioco “crucis”). Ovviamente, sono disponibili in molte altre dimensioni (8x8 per gli scacchi, 19x19 per Go e molti altri).
--- --- ---
| | | |
--- --- ---
| | | |
--- --- ---
| | | |
--- --- ---
Scrivi un algoritmo che chiede all’utente la dimensione del tabellone da realizzare e poi stampa quel tabellone. Devi chiedere all’utente un numero intero, finché egli ne inserirà uno nell’intervallo [1, 10].
Non servono stringhe. Bisogna solo saper stampare ‘bene’ caratteri!
Esercizio 86
Scrivi un algoritmo che chiede all’utente di scrivere una sequenza di caratteri e la salva in una stringa. Se l’utente inserisce una stringa vuota, oppure una più lunga del massimo consentito (300), mostra un messaggio di errore e termina l’esecuzione.
Con la sequenza di caratteri corretta, l’algoritmo conta quante sono le vocali presenti in essa, e mostra tale numero in output. Ad esempio:
Inserisci una sequenza di caratteri: aiuola
La stringa contiene 5 vocali.
Esercizio 87
Scrivi un algoritmo che chiede all’utente di scrivere una sequenza di caratteri e la salva in una stringa. Se l’utente inserisce una stringa vuota, oppure una più lunga del massimo consentito (300), mostra un messaggio di errore e termina l’esecuzione.
Con la sequenza di caratteri corretta, l’algoritmo controlla se essa sia vocal-palindroma. Una stringa è vocal-palindroma se è palindroma considerando esclusivamente le vocali. Ad esempio, ‘asta’ è vocal-palindroma (pur non essendo palindroma in senso stretto), poiché, se ci si concentra solo sulle vocali, esse sono effettivamente in posizione speculare.
‘vocal-palindromo’ è un termine che non esiste, appena inventato dal prof.
Esempi di input/output:
Inserisci una sequenza di caratteri: asta
VOCAL-PALINDROMO!
Inserisci una sequenza di caratteri: anna
VOCAL-PALINDROMO!
Inserisci una sequenza di caratteri: nicolo
Non vocal-palindromo.
Inserisci una sequenza di caratteri: luca
Non vocal-palindromo.
Inserisci una sequenza di caratteri: aria
Non vocal-palindromo.
Esercizio 88
Tutte le richieste dell’esercizio 88 devono essere svolte in uno stesso file.
Esercizio 88A
Scrivi una funzione che, ricevuto come parametro un numero intero positivo, restituisce true se tale numero è primo, altrimenti false.
La segnatura della funzione deve essere:
- in C:
bool primo(int n);
- in Python:
def primo(n: int) -> bool
Un numero naturale è primo se:
- è maggiore di 1
- ha solo uno e se stesso come divisori.
Per 0 e 1, la funzione deve restituire
false.
Esercizio 88B
Nel main() (in Python, nel __main__), scrivi del codice che sfrutta la funzione primo() per ottenere i primi dieci numeri primi maggiori di 150. Essi sono:
151
157
163
167
173
179
181
191
193
197
Esercizio 88C
Scrivi una funzione che, ricevuto come parametro un numero intero positivo, restituisce true se tale numero è composto, altrimenti false.
La segnatura della funzione deve essere:
- in C:
bool composto(int n);
- in Python:
def composto(n: int) -> bool
Per implementare la funzione
composto(), sfrutta la funzioneprimo(), precedentemente definita.
Per 0 e 1, la funzione deve restituire
false.
Esercizio 88D
Nel main(), scrivi del codice che sfrutta la funzione composto() per ottenere i tutti i numeri dispari e composti compresi tra 150 e 200. Essi sono:
153
155
159
161
165
169
171
175
177
183
185
187
189
195
Esercizio 89
Scrivi una funzione che, ricevuta una stringa come parametro, restitusce come risultato il numero di vocali presenti nella stringa.
La segnatura della funzione deve essere:
def conta_vocali(s: str) -> int
Non importa che la vocale sia in maiuscolo o in minuscolo: essa deve essere considerata.
Ad esempio, la stringa gicIWBlC0D2GwuoREsCPvRddjXJQboS5 contiene 6 vocali. La stringa AiUolA contiene 5 vocali.
Esercizio 90
Scrivi una funzione che, ricevuti come parametri una stringa, restitusce come risultato la vocale che appare più spesso in quella stringa. Se più vocali appaiono con la stessa, massima, frequenza, restituisce l’ultima vocale con la frequenza massima. L’ordine considerato per le vocali è: a, e, i, o, u.
La segnatura della funzione deve essere:
- in C:
char vocale_maxima(char s[]);
- in Python:
def vocale_maxima(s: str) -> str
Non importa che la vocale sia in maiuscolo o in minuscolo: essa deve essere considerata.
Ad esempio, nella stringa gicIWBlC0D2GwuoREsCPvRddjXJQboS5 la vocale maxima è o. Nella stringa AiUolA la vocale maxima è a. Nella stringa aAeEiIoOuU, la vocale maxima è u.
Esercizio 91
Scrivi una funzione che, ricevuti come parametri un numero tra 1 e 12, rappresentante un mese dell’anno, e un numero tra 1 e 31, rappresentante un giorno del mese, restituisca quanti giorni mancano all’8 giugno.
La segnatura deve essere:
- in C:
int byebyescuola(int mese, int giorno);
- in Python:
def byebyescuola(mese: int, giorno: int) -> int:
Questo frammento di codice può esserti utile nella risoluzione:
switch (mese)
{
case 7: count += 31;
case 8: count += 31;
case 9: count += 30;
case 10: count += 31;
case 11: count += 30;
case 12: count += 31;
case 1: count += 31;
case 2: count += 28;
case 3: count += 31;
case 4: count += 30;
case 5: count += 31;
case 6: count += 7;
}
Esercizio 91B
Nel main(), usa la funzione byebyescuola() per sapere quanti giorni mancano alla fine della scuola. Se, ad esempio, invocassi la funzione con la data dell’1 maggio, otterrei questo output:
Mancano 37 giorni al 7 giugno!
Esercizio 91C (opzionale)
La funzione byebyescuola() è stata implementata senza considerare il problema degli anni bisestili.
Per esercizio, potresti modificarla come:
- in C:
int byebyescuola(int anno, int mese, int giorno);
- in Python:
def byebyescuola(anno: int, mese: int, giorno: int) -> int:
e, sfruttando la funzione is_leap_year() implementata in altri esercizi, dare un risultato ancora più preciso!
Esercizio 92 (opzionale)
In matematica, la congettura di Goldbach è uno dei più vecchi problemi irrisolti nella teoria dei numeri. Essa afferma questo:
Ogni numero naturale pari maggiore di 2 può essere scritto come somma di due numeri primi (che possono essere anche uguali).
Scrivi una funzione che, ricevuto come parametro un numero naturale n, restituisce il numero di coppie di numeri primi che, sommati, danno come risultato n.
La segnatura della funzione deve essere:
int goldbach(int n);
Ad esempio, se n valesse 90, la funzione restituirebbe come risultato 9, poiché esistono nove coppie di numeri primi che, sommati, danno 90 come risultato. Le coppie sono queste:
7 83
11 79
17 73
19 71
23 67
29 61
31 59
37 53
43 47
Nota bene: attento a non considerare due volte la stessa coppia. Se hai contato la coppia (3, 47), non contare la coppia (47, 3). Ovvero, itera fino a n / 2 anziché fino a n.
Per risolvere l’esercizio, è utile utilizzare la funzione primo() implementata nell’esercizio 88. A parole, dentro alla funzione goldbach() dovrà accadere questo: crea una variabile contatore, count, inizialmente uguale a 0. Per ogni coppia di numeri a e b i quali, sommati, danno n, controlla che entrambi siano numeri primi. Se sì, aumenta di uno count. Fnite le coppie (a, b), restituisci il valore di count.
Esercizio 92B
Nel main(), utilizza la funzione goldbach() per ottenere l’output seguente:
Coppie di primi che, sommati, danno 90: 9
Coppie di primi che, sommati, danno 92: 4
Coppie di primi che, sommati, danno 94: 5
Coppie di primi che, sommati, danno 96: 7
Coppie di primi che, sommati, danno 98: 3
Esercizio 93
Scrivi un algoritmo che, chiesto in input un numero intero n, restituisce come risultato la somma degli angoli interni di un poligono di n lati. Una formula per calcolare la somma degli angoli interni di un poligono di n lati è:
Se l’utente inserisce un numero minore o uguale a 2, l’algoritmo mostra il messaggio di errore Valore non valido e termina l’esecuzione.
Esercizio 94
Scrivi un algoritmo che chiede all’utente di indicare un’operazione da svolgere tra -, +, *, :, ^ (elevamento a potenza). Poi, chiede all’utente di inserire due numeri interi a e b. L’algoritmo restituisce come risultato quello ottenuto applicando l’operazione scelta ai due numeri interi inseriti.
Se il divisore è 0, l’algoritmo mostra un messaggio di errore.
Se l’utente sceglie un’operazione non consentita, l’algoritmo mostra un messaggio di errore.
Un esempio dell’input/output di questo algoritmo:
Operazione = +
a = 12
b = -4
Risultato = 8
Esercizio 95
Implementa la funzione randbool(), la quale restituisce un valore di verità casuale. Con la seguente segnatura:
- in C:
bool randbool();
- in Python:
def randbool()-> bool:
Nel main(), usa la funzione randbool(), precedentemente implementata, per riempire una lista con 5 valori di verità casuali. Infine, mostra in ouput i valori contenuti nella lista.
Esercizio 96
Implementa la funzione randnat(), con la seguente segnatura:
int randnat(int limit);
Essa restituisce un numero naturale casuale, nell’intervallo [0, limit].
Anche
limitè un possibile valore restituito dalla funzione.
Nel main(), usa la funzione randnat(), precedentemente implementata, per riempire un vettore con 5 numeri naturali casuali. Usa come limite, ad esempio, 10. Infine, mostra in ouput i valori contenuti nel vettore.
Esercizio 97
Implementa la funzione randint(), con la seguente segnatura:
int randint(int a, int b);
Essa restituisce un numero intero casuale, nell’intervallo [a, b].
Anche
aebsono possibili valori restituiti dalla funzione.
Nel main(), usa la funzione randint(), precedentemente implementata, per riempire un vettore con 5 numeri interi casuali. Genera i valori casuali, ad esempio, nell’intervallo [-10, 10]. Infine, mostra in ouput i valori contenuti nel vettore.
Esercizio 98
Implementa la funzione randchar(), con la seguente segnatura:
- in C:
char randchar();
Il linguaggio C tratta i caratteri come fossero dei numeri interi, secondo il codice ASCII. Ad esempio, il numero intero 97 è interpretato come il carattere
a. Ecco una tabella con tutte le equivalenze.
- in Python:
def randchar() -> str:
Essa restituisce un carattere minuscolo casuale.
Nel main(), usa la funzione randchar(), precedentemente implementata, per riempire un vettore con 5 caratteri minuscoli casuali. Infine, mostra in ouput i valori contenuti nel vettore.
Puoi sfruttare la funzione
randint()per risolvere più facilmente questo esercizio?
Esercizio 99
Implementa la funzione randchar(), con la seguente segnatura:
- in C:
char randchar(bool upper);
- in Python:
def randchar(upper: bool) -> str:
Se il parametro upper è true, essa restituisce un carattere maiuscolo casuale. Altrimenti, restituisce un carattere minuscolo casuale.
Nel main(), usa la funzione randchar(), precedentemente implementata, per riempire una lista con 10 caratteri casuali.
Il valore del parametro
upperdev’essere anch’esso casuale.
Infine, mostra in ouput i valori contenuti nella lista.
Esercizio 100
Implementa la funzione randfloat_01(), con la seguente segnatura:
float randfloat_01();
Essa restituisce un valore reale casuale, nell’intervallo [0, 1].
Nota bene: Nella libreria
stdlib.hsi trova la costanteRAND_MAX, la quale contiene il massimo valore casuale generabile dal dispositivo che sta eseguendo il programma. Può tornarvi molto utile 😉
Nel main(), usa la funzione randfloat_01(), precedentemente implementata, per riempire un vettore con 5 valori reali casuali in [0, 1].
Infine, mostra in ouput i valori contenuti nel vettore.
Esercizio 101
Implementa la funzione randfloat_positive(), con la seguente segnatura:
float randfloat_positive(int limit);
Essa restituisce un valore reale casuale, nell’intervallo [0, limit].
Nel main(), usa la nuova funzione randfloat_positive(), precedentemente implementata, per riempire un vettore con 5 valori reali positivi casuali.
Infine, mostra in ouput i valori contenuti nel vettore.
Esercizio 102
Implementa la funzione randfloat(), con la seguente segnatura:
- in C:
float randfloat(int a, int b);
- in Python:
def randfloat(a: int, b: int) -> float:
Essa restituisce un valore reale casuale, nell’intervallo [a, b].
Nel main(), usa la nuova funzione randfloat(), precedentemente implementata, per riempire una lista con 5 valori reali casuali.
Infine, mostra in ouput i valori contenuti nella lista.
Esercizio 103
Crea una libreria di funzioni, contenente le funzioni precedentemente implementate per la generazione di valori casuali, qui elencate per comodità:
- in C:
bool randbool();
int randnat(int limit);
int randint(int a, int b);
char randchar();
float randfloat_01();
float randfloat_positive(int limit);
float randfloat(int, int);
- Inserisci il codice sopra scritto in un file chiamato
myrandom.h - Implementa le funzioni sopra elencat in un file chiamato
myrandom.c
I file
myrandom.hemyrandom.cserviranno in esercizi futuri. Tienili da parte!
- in Python:
def randbool() -> bool:
def randchar() -> str:
def randfloat(a: int, b: int) -> float:
Nota bene: molte delle funzioni sopra elencate possono essere implementate in maniera più semplice sfruttando alcune delle funzioni che le precedono nell’elenco. Se non lo hai già fatto, re-implementa le funzioni più complesse sfruttando, dove serve, quelle più semplici.
Esercizio 104a
- Crea l’enumerazione
Materia, i cui valori possono essere solo quelli delle materie da te studiate. - Crea l’enumerazione
Mese, i cui valori possono essere solo i mesi dell’anno. Fai in modo che gli indici dei mesi partano da 1, anziché da 0. - Crea il tipo
Giorno, che è un numero intero senza segno - Crea il tipo
Anno: anch’esso un numero intero senza segno - Crea la struttura dati
Data, formata da una variabile di tipoGiorno, da una variabile di tipoMesee da una di tipoAnno - Crea il tipo
Voto: un numero reale - Crea la struttura dati
Valutazione, costituita da unaData, unVoto, unaMateria.
Esercizio 104b
Crea una copia del file creato nell’esercizio 104a. Quindi, nella copia, implementa le seguenti funzioni:
void print_mese(Mese);
void print_data(Data);
void print_materia(Materia);
void print_voto(Voto);
void print_valutazione(Valutazione);
Esse servono a mostrare in output, rispettivamente, un variabile Mese, una variabile Data…
Ad esempio, data la seguente data:
Data d = {8, Novembre, 2024};
La funzione print_data() la mostrerà in output così:
Data = 8 Novembre 2024
Oppure, data la seguente valutazione:
Valutazione v = {{7, Novembre, 2024}, 8.5, Informatica};
La funzione print_valutazione() la mostrerà in output così:
Valutazione =
Materia = Informatica
Voto = 8.50
Data = 7 Novembre 2024
Esercizio 104c
Crea una copia del file creato nell’esercizio 104b.
Procurati i file myrandom.c e myrandom.h creati nell’esercizio 103.
Quindi, nella copia di 104b, implementa le seguenti funzioni:
Mese random_mese();
Giorno random_giorno(Mese, Anno);
Anno random_anno();
Data random_data();
Materia random_materia();
Voto random_voto();
Valutazione random_valutazione();
Il significato di ciascuna di esse dovrebbe essere chiaro.
Nota bene: la funzione
random_giorno()riceve come parametri unMesee unAnnopoiché essa deve sia restituire un giorno valido per il mese dato, sia retituire un giorno valido, considerando che l’anno dato sia bisestile oppure no!
Nota bene: la funione
random_voto()restituisce un voto casuale tra 0 e 10, che sia o un voto intero (es.: 9), oppure un mezzo voto (es.: 7.5), oppure un quarto di voto (es.: 7.25 o 8.75). Nient’altro!
Esercizio 104d
Crea una copia del file creato nell’esercizio 104c. Quindi, nella copia, all’interno del main():
- crea un vettore di variabli di tipo
Valutazione, di lunghezza 5 - popola il vettore con cinque valutazioni casuali, sfruttando la funzione
random_valutazione() - mostra in output le cinque valutazione casuali contenute nel vettore, sfruttando la funzione
print_valutazione()
Se hai svolto per intero l’esercizio 104, dovresti avere un file contenente circa duecento righe di codice. Complimenti! 😊
Esercizio 105a
Lo scopo di questo esercizio 105 è creare un piccolo piccolo registro elettronico per la gestione delle assenze di uno studente.
Crea le seguenti strutture dati:
Data(puoi fare copia/incolla dall’esercizio precedente), formata da:- un
Giorno(numero intero positivo) - un
Mese(enumerazione con i possibili valori di un mese, partendo dall’indice 1) - un
Anno(numero intero positivo)
- un
Assenza, formata da:- una
Data - una variabile booleana
giustificata, la quale valetruese l’assenza è stata giustificata, altrimentifalse
- una
Studente, formata da:- un
Nome(stringa di massimo 30 caratteri) - un
Cognome(stringa di massimo 30 caratteri) - un vettore di oggetti di tipo
Assenza, lungo al massimo 10 elementi. - una variabile intera
n_assenzecontenente il numero di assenze, ovvero la lungheza del vettore suddetto.
- un
Esercizio 105b
Crea una copia del file creato nell’esercizio 105a. Quindi, nella copia, implementa le seguenti funzioni:
void print_data(Data);
void print_assenza(Assenza);
void print_studente(Studente);
Il significato di ciascuna funzione è piuttosto auto-esplicativo.
Poi, nel main(), crea uno Studente, con dei dati a tua scelta, e prova a usare la funzione print_studente() per osservare tali dati.
L’output della funzione dovrebbe apparire simile a questo:
Studente =
Nome = Matteo
Cognome = Derflingher
Assenza =
Data = 18 Novembre 2024
Giustificata = 1
Assenza =
Data = 19 Novembre 2024
Giustificata = 0
Quello qui sopra è l’output per uno studente chiamato Matteo Derfligher, con due assenze in date diverse, di cui una giustificata e l’altra no.
Esercizio 105c
Crea una copia del file creato nell’esercizio 105b. Quindi, nella copia, implementa la seguente funzione:
Studente aggiungi_assenza(Studente s, Assenza a);
Tale funzione riceve come parametri uno studente e un’assenza da aggiungere a esso. Quindi, restituisce come risultato quello stesso studente,
ma con l’assenza a aggiunta all’elenco.
Assicurati di aggiornare opportunamente il valore della variabile
n_assenzee di rispettare il limite di 10 assenze.
Nel main(), prova a:
- stampare lo studente PRIMA di aggiungergli una nuova assenza
- aggiungere un’assenza allo studente con la funzione
aggiungi_assenza() - stampare lo studente DOPO avergli aggiunto una nuova assenza
Esercizio 106
Scrivi un algoritmo che, assegnati valori distinti a due variabili a e b:
- mostra in output il contenuto delle variabili
- scambia il contenuto delle due variabili
- mostra in output il contenuto delle variabili
Mi raccomando: devi riuscire a scambiare il valore contenuto nelle variabili
aeb. Niente scorciatoie!
Esempio:
a = 3, b = 8
a = 8, b = 3
Esercizio 107
Scrivi un algoritmo che, riempita una lista con 30 numeri interi casuali tra -10 e 10:
- mostra i valori contenuti nella lista
- mostra i valori contenuti nella lista, in ordine crescente
- mostra la media dei valori
- mostra la media dei valori pari
- mostra la mediana dei valori
- mostra il valore massimo
- mostra la frequenza del valore massimo
- cerca di ottenere un aspetto dell’input/output identico a questo:
lista = [6, -6, 0, -1, -1, -1, 7, 1, 0, -7, 2, 3, -4, -2, -5, 2, -3, 9, -6, 0, 10, 2, -7, -3, 1, -7, 6, 0, -8, 0]
lista ordinata = [-8, -7, -7, -7, -6, -6, -5, -4, -3, -3, -2, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 6, 6, 7, 9, 10]
media = -0.40
media pari = 0.12
media pari = 0.125
mediana = 0.0
massimo = 10
freq. massimo = 1
In Python, nella libreria di funzioni
statistics, potresti trovare delle funzioni utili ad esempio per il calcolo della mediana…
Esercizio 108
Scrivi un algoritmo che, riempita una lista con 10 numeri interi casuali tra -10 e 10:
- mostra la lista
- fa apparire la scritta: “Pari tutti pari!” se tutti i numeri in posizione pari sono pari
- mostra la media dei valori in posizione dispari
- mostra la media dei valori negativi
- mostra la mediana della lista ottenuta considerando solo i numeri pari presenti nella lista
Esercizio 109
Scrivi un algoritmo che generi una sequenza di 20 caratteri pseudo-casuali. Poi:
- mostra la stringa in output
- mostra solo i caratteri in posizione pari
- mostra la stringa al contrario
- chiede all’utente un carattere da rimuovere dalla stringa. Ottenuto tale carattere, se esso è presente nella stringa, anziché rimuoverlo, lo ripete tre volte!
Ad esempio, se la stringa fosse
abacoe l’utente chiedesse di rimuovere lab, l’algoritmo mostrerebbe in output:abbbaco
Esercizio 110
Gaio Giulio Cesare era solito cifrare i propri messaggi destinati ai varii suoi comandanti di legione. Prima di consegnare un messaggio a un ambasciatore, faceva questo: prendeva il testo in chiaro e sostituiva ogni lettera con quella situata tre posizioni oltre nell’alfabeto. Ad esempio, il messaggio “avepompeus” diventava: “dyhsrpshxv”.
In Python, importa l’alfabeto delle lettere minuscole così: from string import ascii_lowercase.
Poi, scrivi un algoritmo che, chiesta in input una stringa all’utente:
- rimuove tutti gli spazi e mostra il risultato in output
- considerando il testo ottenuto al punto precedente, rende tutte le lettere minuscole. Mostra il risultato in output
- considerando il testo ottenuto al punto precedente, sostituisce tutte le lettere non presenti in
ascii_lowercasecon la letteraze mostra il risultato in output - cifra il messaggio ottenuto al punto precedente usando il cifrario di Cesare. Infine, mostra il messaggio cifrato in output.
Un esempio:
Testo in chiaro = Nicolò Sala
NicolòSala
nicolòsala
nicolzsala
Testo cifrato = qlfrocvdod
Esercizio 111
Il seguente testo è stato ottenuto utilizzando un cifrario simile a quello di Cesare. L’unica differenza è che, anziché usare come chiave di cifratura tre, ne è stata usata un’altra, sconosciuta. Prova a trovare il testo in chiaro. Come fare?
bpqaqabpmtiabbqumqttnismnwzbpmaismwnjmqvoeqbpgwc
Esercizio 112A
Scrivi una funzione che, ricevuto come parametro un numero intero, restituisce una lista contenente i suoi fattori primi.
La segnatura della funzione deve essere:
def fattori_primi(n: int) -> list[int]
Ecco alcuni esempi di risultato da questa funzione:
fattori_primi(18) = [2, 3, 3]
fattori_primi(17) = [17]
fattori_primi(3496751681) = [27127, 128903]
fattori_primi(128) = [2, 2, 2, 2, 2, 2, 2]
fattori_primi(-88) = [2, 2, 2, 11]
fattori_primi(8616460799) = [89681, 96079]
Esercizio 112B
Nel 1874, il signor William Stanley Jevons scriveva in un suo libro:
Può il lettore dire quali sono i due numeri moltiplicati tra loro che produrranno il numero 8616460799? Penso che sia improbabile che qualcuno ci riesca, a parte me stesso.
La tua funzione fattori, precedentemente implementata, riesce a trovare i fattori primi di 8616460799?
Se la risposta è no, prova a migliorarla, in modo tale che riesca a trovare tali fattori.
Esercizio 112C
Scrivi una funzione che, ricevuto come parametro un numero intero, restituisce i suoi fattori primi, senza che essi siano ripetuti.
La segnatura della funzione deve essere:
def fattori_primi_unici(n: int) -> list[int]
Sfrutta la funzione
fattori_primi, implementata in precedenza.
Ecco alcuni esempi di risultato da questa funzione:
fattori_primi_unici(8616460799) = [89681, 96079]
fattori_primi_unici(18) = [2, 3]
fattori_primi_unici(17) = [17]
fattori_primi_unici(3496751681) = [128903, 27127]
fattori_primi_unici(128) = [2]
fattori_primi_unici(-88) = [2, 11]
Esercizio 112D
Scrivi una funzione che, ricevuto come parametro un numero intero, restituisce i suoi fattori primi, ciascuno con la propria frequenza.
La segnatura della funzione deve essere:
def fattori_primi_freq(n: int) -> dict[int, int]
Sfrutta la funzione
fattori_primi, implementata in precedenza.
Ecco alcuni esempi di risultato da questa funzione:
fattori_primi_freq(18) = {2: 1, 3: 2}
fattori_primi_freq(17) = {17: 1}
fattori_primi_freq(3496751681) = {128903: 1, 27127: 1}
fattori_primi_freq(128) = {2: 7}
fattori_primi_freq(-88) = {2: 3, 11: 1}
Esercizio 113
Scrivi un funzione che restitusce i numeri perfetti minori di un numero limite, ricevuto come parametro.
Se la funzione riceve come parametro un numero minore di 0, deve interrompersi, sollevando l’eccezione
ValueError.
La segnatura della funzione deve essere:
def perfetti_minori_di(limite: int) -> list[int]
Se l’hai già implementata, sfrutta la funzione
perfettodell’Esercizio 64.
Ecco alcuni esempi:
perfetti_minori_di(10) = [0, 6]
perfetti_minori_di(100) = [0, 6, 28]
perfetti_minori_di(1_000) = [0, 6, 28, 496]
perfetti_minori_di(10_000) = [0, 6, 28, 496, 8128]
Esercizio 114
Scrivi una funzione che, ricevuta come parametro una lista di numeri interi, restituisca il prodotto dei numeri, considerati ciascuno una volta sola. Lo zero deve essere escluso dal prodotto.
La segnatura della funzione deve essere:
def prodotto(numeri: list[int]) -> int:
Alcuni esempi:
prodotto([-6, -6, 7, 2, 3, 1, 9, -2, 5, 9]) = 22680
prodotto([10, 7, -3, -5, -6, 6, -7, -7, 8, -6]) = 2116800
prodotto([-8, 8, -5, -3, 0, -10, 10, 4, 9, -3, -9, 3, 9, -4, -5, 2, -10, -1, 9, -3]) = -746496000
Esercizio 115
Scrivi una funzione che, ricevuta come parametro una lista di numeri interi, restituisca il prodotto dei numeri, escludendo i numeri ripetuti. Lo zero deve essere escluso dal prodotto.
La segnatura della funzione deve essere:
def prodotto_non_ripetuti(numeri: list[int]) -> int:
Ecco un esempio:
prodotto_non_ripetuti([10, 0, 6, 10, -10, -9, -7, 4, 6, 5]) = -12600
In questo esempio, -12600 è dato dal prodotto di -10, -9, -7, 4, 5 . Il valore zero è escluso. I valori 10, 6 sono esclusi dal prodotto poiché sono ripetuti.
Esercizio 116
Scrivi una funzione che, ricevuta una lista di nomi, restituisce una lista con tutti i caratteri di tutti i nomi messi in minuscolo.
La segnatura della funzione deve essere:
def minuscolo(nomi: list[str]) -> list[str]:
Esercizio 117
Crea una funzione che, ricevuta come parametro una lista contenente nomi di persona, e una lettera, restituisce un set contenente i nomi che iniziano con quella lettera.
La capitalizzazione della lettera (maiuscolo o minuscolo), così come la capitalizzazione dei nomi, non è rilevante. Puoi rendere tutto minuscolo.
Ogni nome deve essere considerato una volta sola nel conteggio. Nella lista, un nome potrebbe però apparire più volte.
La segnatura della funzione deve essere:
def nomi_con_iniziale(nomi: list[str], iniziale: str) -> set[str]:
Ecco degli esempi:
nomi_con_iniziale(["Leonardo", "Leonardo", "lucia", "gioele", "Luca", "leandro"], "L") = {'leonardo', 'luca', 'leandro', 'lucia'}
Esercizio 118
Crea una funzione che, ricevuta come parametro una lista contenente nomi di persona, e un prefisso, restituisce un set contenente i nomi che iniziano con quel prefisso.
La capitalizzazione del prefisso (maiuscolo o minuscolo), così come la capitalizzazione dei nomi, non è rilevante. Puoi rendere tutto minuscolo.
Ogni nome deve essere considerato una volta sola nel conteggio. Nella lista, un nome potrebbe però apparire più volte.
La segnatura della funzione deve essere:
def nomi_con_prefisso(nomi: list[str], prefisso: str) -> set[str]:
Ecco degli esempi:
nomi_con_prefisso(["Leonardo", "Leonardo", "lucia", "gioele", "Luca", "leandro"], "l") = {'leonardo', 'luca', 'leandro', 'lucia'}
nomi_con_prefisso(["Leonardo", "Leonardo", "lucia", "gioele", "Luca", "leandro"], "LU") = {'luca', 'lucia'}
Esercizio 119
Crea una funzione che, ricevuta come parametro una lista di stringhe, restituisce un dizionario in cui:
- le chiavi sono numeri interi, che rappresentano una lunghezza;
- i valori sono dei numeri interi, che indicano quante parole hanno quella lunghezza, nella lista.
Ad esempio, se la lista l fosse ['ciao', 'mamma', 'mela', 'ciao'], la funzione restituirebbe il dizionario: {4: 3, 5: 1}.
La segnatura della funzione deve essere:
def conta(l: list[str]) -> dict[int, int]:
Esercizio 120
Crea una funzione che, ricevuta come parametro una lista di stringhe, restituisce un dizionario in cui:
- le chiavi sono numeri interi, che rappresentano una lunghezza;
- i valori sono dei set, che contengono le parole della lista con la lunghezza data.
Ad esempio, se la lista l fosse ['ciao', 'mamma', 'mela', 'ciao'], la funzione restituirebbe il dizionario: {4: {'ciao', 'mela'}, 5: {'mamma'}}.
La segnatura della funzione deve essere:
def raggruppa(l: list[str]) -> dict[int, set[str]]:
Esercizio 121
Crea una funzione che, ricevuto come parametro un dizionario, restituisce un altro dizionario, in cui le chiavi e i valori sono stati invertiti. Se uno stesso valore è associato a più chiavi, a quel valore dovrà essere associato None.
La segnatura della funzione deve essere:
def inverti(d: dict[str, str]) -> dict[str, str | None]:
Ad esempio, dato come parametro questo dizionario:
{'albero': 'tree', 'ciao': 'hi', 'salve': 'hi', 'mamma': 'mum'}
La funzione restituirà quest’altro dizionario:
{'tree': 'albero', 'hi': None, 'mum': 'mamma'}
Esercizio 122
Crea una funzione che, ricevuto come parametro un dizionario e un numero intero L, restituisce True se tutte le chiavi del dizionario sono stringhe di lunghezza L. Altrimenti, restituisce False.
La segnatura della funzione deve essere:
from typing import Any
def goodlength(d: dict[str, Any], L: int) -> bool:
Anyè un tipo speciale, per indicare ‘un tipo qualsiasi’. Si usa nei contesti in cui il tipo di un dato non è importante. In questo esercizio, ad esempio, il tipo dei valori del dizionario è completamente ininfluente.
Ecco degli esempi:
goodlength({'a': 1, 'b': 'ciao'}, 1) = True
goodlength({'a': 1, 'b': 'ciao'}, 3) = False
goodlength({'aaa': 1, 'bob': 'ciao'}, 3) = True
Esercizio 123
Crea una funzione che, ricevuto come parametro una stringa, restituisce un dizionario in cui:
- le chiavi sono i caratteri presenti nella stringa
- il valore associato a una chiave rappresenta la frequenza di quel carattere nella stringa
Le lettere maiuscole e minuscole, in questo esercizio, sono considerate caratteri distinti.
La segnatura della funzione deve essere:
def frequenza(s: str) -> dict[str, int]:
Ecco degli esempi:
frequenza("Abracadabra") = {'A': 1, 'b': 2, 'r': 2, 'a': 4, 'c': 1, 'd': 1}
frequenza("forzamilan") = {'f': 1, 'o': 1, 'r': 1, 'z': 1, 'a': 2, 'm': 1, 'i': 1, 'l': 1, 'n': 1}
frequenza("N112118119N") = {'N': 2, '1': 6, '2': 1, '8': 1, '9': 1}
Esercizio 124
Scrivi una funzione che, ricevuto come parametro un set, restituisce una lista ordinata di quegli oggetti.
def listify[T](s: set[T]) -> list[T]:
Importante: la sintassi usata qui sopra, con il generico tipo
T, è disponibile solo dalla versione 3.13 di Python. Perciò, se appare un errore, controlla di avere installato la versione di Python più recente. Puoi controllare la versione di Python attualmente installata sul tuo computer aprendo una finestra di terminale ed eseguendo il comandopython --version. Puoi scaricare la versione più recente di Python dal sito www.python.org.
Approfondimento:
Tindica un generico tipo di dato. Qualcuno potrebbe pensare di usare quest’altra segnatura di funzione:def listify(s: set[Any]) -> list[Any]:MA c’è una grande differenza: la segnatura con
Tindica che il tipo di dato in ingresso deve essere mantenuto in uscita.Any, al contrario, permetterebbe di cambiare il tipo di dato in uscita, rispetto a quello in ingresso.
Ecco degli esempi:
listify({3, -3, 8}) = [-3, 3, 8]
listify({"m", "i", "l", "an"}) = ['an', 'i', 'l', 'm']
Esercizio 125
Scrivi una funzione che, ricevuto come parametro un dizionario, non restituisce nessun valore, ma mostra in output le chiavi e i valori del dizionario su due colonne affiancate. Ad esempio, dato il dizionario {1: "coca", 10: "cola", "a": True}, l’output sarà questo:
Chiave Valore
1 coca
10 cola
a True
La segnatura della funzione deve essere:
from typing import Any
def dictprint(d: dict[Any, Any]) -> None:
Importante: sei sicuro di aver compreso la differenza tra “restituire un valore” e “mostrare un valore in output”? Prova a indicare quali sono le sostanziali differenze tra questi due tipi di funzione.
Esercizio 126A
Scrivi una funzione che, ricevuto come parametro un numero intero lunghezza, restituisce una stringa lunga lunghezza, fatta di caratteri casuali. I caratteri possibili sono:
- le lettere minuscole
- le lettere maiuscole
- le cifre decimali
- i seguenti simboli: “?=)(/&%$!#@”
La segnatura della funzione deve essere:
def randstr(lunghezza: int) -> str:
Ecco degli esempi:
randstr(10) = 'l7MF74aAdz'
randstr(20) = 'Cei(8jM&#Nl8MpfYEkFM'
randstr(1) = 'I'
Esercizio 126B
Prosegui dall’esercizio precedente. Nel __main__, scrivi del codice che, per cinque volte, genera una stringa usando randstr(). La lunghezza di ogni stringa deve essere un numero casuale nell’intervallo [5, 20]. Ecco un esempio:
Lunghezza casuale = 15 s = 3Xv7X=u0&LsP&0S
Lunghezza casuale = 9 s = xXieuOXjo
Lunghezza casuale = 15 s = LemPB$fUq&f6qr0
Lunghezza casuale = 13 s = UAYAzmG=vqySD
Lunghezza casuale = 19 s = 3)(Bm9EDBzNN2WjZl&d
Esercizio 127A
Scrivi una funzione che, ricevuto come parametro una stringa, elimina da essa le cifre decimali.
La segnatura della funzione deve essere:
def nodigits(s: str) -> str:
Ecco degli esempi:
s = w788oj54&bjj$7%OHeP4 nodigits(s) = woj&bjj$%OHeP
s = kq6snF6VsS)BABWaLE nodigits(s) = kqsnFVsS)BABWaLE
s = )#n?Z1 nodigits(s) = )#n?Z
s = Ji3HHHI nodigits(s) = JiHHHI
s = cZ?C$Z nodigits(s) = cZ?C$Z
Esercizio 127B
Per ottenere l’output mostrato nell’esercizio 127A, importa la funzione randstr, implementata nell’esercizio 126A.
Esercizio 128
Scrivi un algoritmo con questa struttura:
a = input()
b = input()
c = input()
print(f"{a = }, {b = }, {c = }")
### Aggiungi le istruzioni qui ####
print(f"{a = }, {b = }, {c = }")
Nello spazio tra i due print, inserisci delle istruzioni che scambiano il valore delle variabili, in modo tale che si ottenga ad esempio questo output:
a = 'marco', b = 'simone', c = 'ziad'
a = 'ziad', b = 'marco', c = 'simone'
Esercizio 129
Implementa una funzione con questa segnatura:
def pairswap(valori: tuple[Any, ...]) -> tuple[Any, ...]:
La funzione, ricevuta come parametro una tupla contenente oggetti di ogni tipo, restituisce un’altra tupla, ottenuta scambiando i valori a due a due. Se la tupla ha lunghezza dispari, l’ultimo valore non cambia di posizione.
Esempi:
v = ('ciao', 'mamma', 29, True, 'nicolò')
pairswap(v) = ('mamma', 'ciao', True, 29, 'nicolò')
v = (1, 2, 3, 'Stella!')
pairswap(v) = (2, 1, 'Stella!', 3)
Esercizio 130
Crea una funzione che, ricevuti come parametri due dizionari con chiavi di tipo str e valori di tipo int, restituisca un nuovo dizionario contenente tutte le chiavi di entrambi. Se una chiave è presente in entrambi i dizionari, i valori devono essere sommati.
La segnatura della funzione deve essere:
def unisci_dizionari(d1: dict[str, int], d2: dict[str, int]) -> dict[str, int]:
Ad esempio, dati come parametri i dizionari:
{'mele': 2, 'pere': 3}
{'pere': 4, 'banane': 1}
La funzione restituirà:
{'mele': 2, 'pere': 7, 'banane': 1}
Esercizio 131
Crea una funzione che, ricevuto come parametro un dizionario e una soglia numerica, restituisca un nuovo dizionario contenente soltanto le coppie chiave:valore in cui il valore è strettamente maggiore della soglia.
La segnatura della funzione deve essere:
def filtra_dizionario(d: dict[str, int], soglia: int) -> dict[str, int]:
Ad esempio, dati come parametri il dizionario e la soglia:
{'a': 5, 'b': 2, 'c': 8}, 4
La funzione restituirà:
{'a': 5, 'c': 8}
Esercizio 132
Crea una funzione che, ricevuta come parametro una lista di parole, restituisca un dizionario che raggruppa le parole in base alla loro iniziale. Ogni chiave sarà quindi una lettera, e il valore corrispondente sarà la lista di tutte le parole che iniziano con quella lettera.
La segnatura della funzione deve essere:
def raggruppa_per_iniziale(parole: list[str]) -> dict[str, list[str]]:
Ad esempio, data come parametro la lista:
['cane', 'casa', 'sole']
La funzione restituirà:
{'c': ['cane', 'casa'], 's': ['sole']}
Esercizio 133
Crea una funzione che, ricevuto come parametro un dizionario con valori interi, restituisca la chiave che ha associato il valore massimo.
La segnatura della funzione deve essere:
def chiave_valore_massimo(d: dict[str, int]) -> str:
Ad esempio, dato come parametro il dizionario:
{'a': 5, 'b': 7, 'c': 3}
La funzione restituirà:
'b'
Esercizio 134
Crea una funzione che, ricevuto come parametro il nome di un file di testo, legga tutte le righe del file e restituisca un insieme (set) di parole uniche trovate nel file.
Le parole sono separate da spazi e puoi considerarle già ben formattate (senza punteggiatura).
La segnatura della funzione deve essere:
def parole_uniche(nomefile: str) -> set[str]:
Ad esempio, se il file testo.txt contiene:
ciao mondo ciao sole
la funzione restituirà:
{'ciao', 'mondo', 'sole'}
Esercizio 135
Crea una funzione che, ricevuto come parametro il nome di un file di testo, legga tutte le righe del file e restituisca un dizionario che conta quante volte compare ciascuna parola. Le parole sono separate da spazi.
La segnatura della funzione deve essere:
def conta_parole(nomefile: str) -> dict[str, int]:
Ad esempio, se il file parole.txt contiene:
mare sole mare vento sole sole
la funzione restituirà:
{'mare': 2, 'sole': 3, 'vento': 1}
Esercizio 136
Crea una funzione che, ricevuto come parametro il nome di un file di testo, legga tutte le righe e le trasformi in una lista di tuple.
Ogni tupla deve contenere due elementi: il numero della riga (partendo da 1) e il contenuto della riga senza carattere di newline \n.
La segnatura della funzione deve essere:
def righe_con_numero(nomefile: str) -> list[tuple[int, str]]:
Ad esempio, se il file righe.txt contiene:
prima riga
seconda riga
terza riga
la funzione restituirà:
[(1, 'prima riga'), (2, 'seconda riga'), (3, 'terza riga')]
Esercizio 137
Crea una funzione che, ricevuta una lista di numeri, restituisca una tupla contenente il numero più piccolo, il numero più grande e la somma di tutti i numeri.
La segnatura della funzione deve essere:
def min_max_somma(numeri: list[int]) -> tuple[int, int, int]:
Ad esempio, data la lista:
[3, 7, 1, 9, 4]
la funzione restituirà:
(1, 9, 24)
Esercizio 138
Crea una funzione che, ricevuta come parametro una lista di stringhe, restituisca un dizionario in cui le chiavi siano le stringhe e i valori siano il numero di vocali presenti in ciascuna stringa.
La segnatura della funzione deve essere:
def conta_vocali(parole: list[str]) -> dict[str, int]:
Ad esempio, data la lista:
["ciao", "scuola", "mare"]
la funzione restituirà:
{'ciao': 2, 'scuola': 3, 'mare': 2}
Esercizio 139
Crea una funzione che, ricevuto come parametro il nome di un file di testo, legga tutte le righe del file e restituisca una lista di parole presenti nel file, senza duplicati, in ordine alfabetico.
La segnatura della funzione deve essere:
def parole_alfabetico(nomefile: str) -> list[str]:
Ad esempio, se il file testo.txt contiene:
sole mare sole vento
la funzione restituirà:
['mare', 'sole', 'vento']
Esercizio 140
Crea una funzione che, ricevuto come parametro un dizionario in cui le chiavi sono nomi di persone e i valori sono età, restituisca una tupla contenente due elementi:
- Il nome della persona più giovane
- Il nome della persona più anziana
La segnatura della funzione deve essere:
def estremo_eta(persone: dict[str, int]) -> tuple[str, str]:
Ad esempio, dato il dizionario:
{'Luca': 25, 'Anna': 30, 'Mario': 20}
la funzione restituirà:
('Mario', 'Anna')
Esercizio 141
Un computer di bordo deve decidere se l’astronave può partire. L’astronave ha tre sistemi principali:
- Carburante (in percentuale)
- Temperatura del motore (in °C)
- Stato scudi (1 = attivi, 0 = inattivi)
Le regole per il decollo sono:
- Se il carburante è almeno 70%, la temperatura è inferiore a 100°C e gli scudi sono attivi, la nave può decollare:
→
"Decollo autorizzato!" - Se il carburante è tra 50% e 69% (estremi inclusi) e gli scudi sono attivi, ma la temperatura è almeno 100°C, mostra:
→
"Attendere raffreddamento motori" - Se il carburante è inferiore a 50% ma gli scudi sono attivi:
→
"Carburante insufficiente" - Se gli scudi non sono attivi in nessuno dei casi precedenti:
→
"Decollo negato: scudi disattivati" - Se uno dei valori inseriti non è valido (carburante < 0 o > 100, temperatura < -50 o > 300, scudi ≠ 0 o 1):
→ mostra solo
"Valori non validi"
Esempi di input/output:
Carburante (%): 80
Temperatura (°C): 90
Scudi attivi (1=si, 0=no): 1
Decollo autorizzato!
Carburante (%): 60
Temperatura (°C): 120
Scudi attivi (1=si, 0=no): 1
Attendere raffreddamento motori
Carburante (%): -5
Temperatura (°C): 90
Scudi attivi (1=si, 0=no): 1
Valori non validi
Esercizio 142
Scrivi un algoritmo che, letto in input un tempo espresso in secondi, lo converte e visualizza in minuti e secondi. Esempio: 125 secondi → 2 minuti e 5 secondi.
Esercizio 143A
Scrivi un algoritmo che chiede all’utente di inserire dei numeri nell’intervallo [0, 10] (estremi inclusi). Appena l’utente inserisce un valore esterno a questo intervallo, l’algoritmo smette di chiedere valori in input. L’algoritmo deve mostrare, per ogni numero in [0, 10], se esso è stato inserito dall’utente, oppure no. Ecco un esempio dell’input/output di questo programma:
Inserisci dei valori nell'intervallo [0, 10]:
2
4
8
23
0? No
1? No
2? Sì
3? No
4? Sì
5? No
6? No
7? No
8? Sì
9? No
10? No
Esercizio 143B
Considera l’esercizio precedente. Ora, per ogni numero in [0, 10] mostra quante volte è stato inserito.
Inserisci dei valori nell'intervallo [0, 10]:
2
4
8
8
23
0? 0
1? 0
2? 1
3? 0
4? 1
5? 0
6? 0
7? 0
8? 2
9? 0
10? 0
Esercizio 144
Scrivi un algoritmo che chiede all’utente di inserire dei numeri interi. L’utente può inserire dei numeri interi qualunque, ma l’algoritmo salva solo i primi 5 numeri pari inseriti. Letti questi 5 numeri pari, la lettura dell’output termina. Di questi numeri, calcola e mostra: il minimo, il massimo, la media, la varianza, la deviazione standard. Un esempio dell’input/output:
Inserisci un numero intero: 3
Inserisci un numero intero: 8
Inserisci un numero intero: 13
Inserisci un numero intero: -22
Inserisci un numero intero: 2
Inserisci un numero intero: 23
Inserisci un numero intero: 23
Inserisci un numero intero: 24
Inserisci un numero intero: 1000
Risultati:
Minimo: -22
Massimo: 1000
Media: 202.40
Varianza: 159259.84
Deviazione standard: 399.07
Esercizio 145
Scrivi un algoritmo che legge in input un solo unico numero positivo n. In output, mostra la frequenza al suo interno delle cifre da 0 a 9.
Tip: per il numero
n, usa il tipolong long int.
Tip: anzitutto, costruisci un ciclo che produca le singole cifre del numero.
Esempio:
Inserisci un numero positivo: 29031997
Frequenza delle cifre:
Cifra 0: 1 volte
Cifra 1: 1 volte
Cifra 2: 1 volte
Cifra 3: 1 volte
Cifra 4: 0 volte
Cifra 5: 0 volte
Cifra 6: 0 volte
Cifra 7: 1 volte
Cifra 8: 0 volte
Cifra 9: 3 volte
Esercizio 146
Scrivi un programma che simuli il lancio di un dado a 6 facce.
- Inizializza il generatore con
srand(time(NULL)); - Genera un numero casuale tra 1 e 6.
- Ripeti il lancio 10 volte usando un ciclo.
- Stampa ogni risultato.
Output di esempio:
Lancio 1: 4
Lancio 2: 1
Lancio 3: 6
...
Esercizio 147
Scrivi un programma che riempia un vettore con numeri casuali.
- Crea un vettore di 20 interi.
- Inserisci numeri casuali tra 0 e 100.
- Stampa tutti i valori.
- Calcola e stampa:
- valore massimo
- valore minimo
- media dei valori
Esercizio 148
Simula la generazione di molti numeri casuali e osservane la distribuzione.
- Genera 1000 numeri casuali tra 0 e 9.
- Conta quante volte compare ciascun numero.
- Stampa un istogramma testuale, producendo un asterisco ogni 10 comparse. Output di esempio:
0: ********** (107)
1: ********** (104)
2: *********** (116)
3: *********** (110)
4: ******** (83)
5: ******** (89)
6: ********** (106)
7: ********* (96)
8: ******** (81)
9: ********** (108)
Esercizio 149
Scrivi un programma che:
- Generi 15 numeri reali casuali compresi tra 0.0 e 1.0.
- Li memorizzi in un vettore di
float. - Stampi:
- Tutti i valori, con tre cifre decimali
- Quanti valori sono maggiori di 0.5
- La media dei valori
Esercizio 150
Scrivi un programma che:
- Generi casualmente 30 caratteri alfabetici maiuscoli (tra
'A'e'Z'). - Li salvi in un vettore di
char. - Stampi:
- Tutti i caratteri generati
- Quante vocali sono presenti
- Quante consonanti sono presenti
Esercizio 151
Scrivi un programma che:
- Chieda all’utente una lunghezza
Lper una password (massimo 20). - Generi una password casuale, di lunghezza
L, composta da:- Lettere maiuscole
- Lettere minuscole
- Numeri
Salva la password in un vettore di
char. - Stampa la password.
👉 Suggerimento: Puoi decidere casualmente che tipo di carattere generare (numero, maiuscola o minuscola) usando
rand() % 3.
Esercizio 152
Implementa la seguente funzione:
long int niceo();
La funzione deve ripetere i seguenti passi:
- genera una sequenza di cinque caratteri minuscoli casuali e li salva in un vettore di tipo
char - se la sequenza generata è
{'n', 'i', 'c', 'e', 'o'}, termina restituendo il numero di tentativi effettuati (cioè quante sequenze di 5 caratteri sono state generate) - altrimenti, continua generando una nuova sequenza
Nel main(), usa la funzione niceo() per ottenere un output del tipo:
La sequenza {'n', 'i', 'c', 'e', 'o'} è stata ottenuta dopo 2253722 tentativi!
Suggerimento:
- può essere utile riutilizzare la funzione
equal()dell’Esercizio 37- può essere utile riutilizzare la funzione
randchar()dell’Esercizio 98