Sommario
< Home
Stampa

Esercizi C/C++

Ambiente di sviluppo

Per svolgere gli esercizi C/C++ sono possibili diverse soluzioni. Qua ne indichiamo due.

In locale: Visual Studio Code

Visual Studio Code è una applicazione IDE (ambiente integrato di sviluppo) compatibile con la maggior parte dei linguaggi di programmazione. E’ disponibile per Linux, MacOS e Windows. Per programmare col linguaggio C/C++ è necessario installare un compilatore C/C++ specifico per il proprio sistema operativo. A questo link una guida in italiano, qui la guida ufficiale in inglese.

Una volta installato e configurato l’ambiente si ha a disposizione l’ambiente IDE di sviluppo, che comprende l’editor, il compilatore ed il debugger. E’ ora possibile svolgere gli esercizi soto indicati.

Online con OnlineGDB

In alternativa si può utilizzare l’ambiente OnlineGDB. In questo caso non è necessario installare nulla. OnlineGDB offre il grande vantaggio, autenticandosi ad esempio con Google, di poter salvare sul sito tutti i propri esercizi, e condividerli. E’ l’ambiente che si consiglia di utilizzare sia per gli esercizi C/C++ qui presenti che per gli esercizi col multithreading.

Programmazione sequenziale

  1. Partiamo dal programma di esempio già visto nella lezione introduttiva. Modificarlo in modo che richieda non due, ma tre variabili, che chiameremo a, b e c. Si ricorda che ogni variabile va inizializzata. Dopo aver richiesto le variabili all’utente, ilprogramma calcola la somma e la stampa, come nell’esempio di cui sopra.
  2. Modifichiamo il programma dell’esempio e facciamo in modo che richieda una sola variabile (nome a piacere). Si ricorda che la variabile va inizializzata. Dopo aver richiesto il valore all’utente, il programma crea due nuove variabili “quadrato” e “cubo” e memorizza nella prima il quadrato del valore inserito e nella seconda il cubo. Infine stampa il valore delle due variabili.
  3. Modifichiamo il programma dell’esempio: vanno mantenuti i valori a e b, ma dobbiamo creare due variabili “area” e “perimetro”. Queste ci servono per calcolare l’area ed il perimetro del rettangolo che ha per lato a e b.
  4. Dato un numero di caramelle da dividere per un certo numero di amici, che ne devono ricevere tutti lo stesso numero, dire quante caramelle verranno date a testa e quante ne rimangono non distribuite. Determinare quali sono le variabili di input e quelle di output e scrivere un programma C++ che esegue il calcolo.
  5. Richiedere all’utente di inserire tre numeri interi e li memorizzi in tre variabili chiamate a b c, scrivere un programma che ne scambi il contenuto in modo che alla fine dell’esecuzione a contiene b, b contiene c, e c contiene a.

if ed espressioni logiche

  1. Scrivere un programma che legge due numeri e controlla se il primo è multiplo del secondo.
  2. Scrivere un programma dove l’utente inserisce un anno ed il calcolatore verifica se l’anno inserito è bisestile. Un anno è bisestile se è divisibile per 4 ma non per 100, oppure se è divisibile per 400.
  3. Scrivere un programma che chiede riceve in input una data che comprende m mesi (devono essere tra 1 e 12), e g giorni (tra 1 e 31) e stampa in che giorno siamo a partire dal primo dell’anno.
    Ad esempio: m=3, g=18-> numero giorni 80.
  4. Scrivere un programma che chiede riceve in input due date::
    – m1, g1, a1
    – m2, g2, a2
    In output da la differenza assoluta, in giorni, tra le due date.
  5. Modificare il programma precedente tenendo conto degli anni bisestili.
  6. Scrivere un programma che chiede la lunghezza dei lati di un triangolo e dice se il triangolo è scaleno, isoscele o equilatero.
    Si ricorda che un triangolo è:
    – scaleno se i lati sono tutti diversi;
    – isoscele se due lati sono uguali;
    – equilatero se i tre lati sono tutti uguali.
    Usare i connettivi logici e l’istruzione if.
  7. Scrivere un programma che chiede la lunghezza dei lati di un quadrilatero e dice se è un rombo (lati uguali) o un parallelogramma (lati uguali a due a due) oppure un trapezio scaleno (lati tutti diversi). Usare le espressioni logiche.
  8. Scrivere un programma che legge tre numeri e li mette in ordine crescente. Usare le espressioni logiche.
  9. Scrivere un programma che legge giorno e mese (numero di mese da 1 a 12), e verifica se la data è corretta. Usare le espressioni logiche.
  10. Scrivere un programma che calcola la differenza in secondi tra due orari del giorno
  11. Un rivenditore di auto deve determinare il prezzo da esporre su ciascuna auto quando viene portata nella sala mostra. Il prezzo dell’auto viene determinato rispettando le seguenti specifiche:
    – il rivenditore inserisce il prezzo base
    – al prezzo base viene sottratto il costo usura determinato dai km: si sottrae 0,075€ per ogni chilometro riportato sul contachilometri dell’auto (Il rivenditore inserisce il numero di chilometri riportato sul contachilometri dell’auto)
    – al prezzo ottenuto si aggiunge il costo degli accessori di cui è, eventualmente, dotata l’auto. Tale costo è pari a 155€ per ogni accessorio (Il rivenditore inserisce il numero di accessori di cui è dotata l’auto)
    – infine al prezzo ottenuto tramite i punti precedenti si applica uno sconto del 15%. Calcolare il costo finale dell’auto.
  12. Scrivere un programma che stima il valore di una casa.Per calcolarlo bisogna tenere conto dei seguenti fattori:
    1) un monolocale ha un prezzo base di 100.000 euro. Ogni locale in più incrementa il prezzo del 50%.
    2) Se lo stabile é di ex case popolari, il prezzo non cambia, se é edilizia civile non di pregio aumenta del 30%, se signorile del 60%
    3) Se lo stabile dispone di giardino il prezzo aumenta del 10%
    4) se la casa é da ristrutturare il prezzo diminuisce del 15%, se abitabile non aumenta di prezzo, se infine dispone di interni di pregio aumenta del 10%
    5) se la casa dispone di ingresso indipendente il prezzo aumenta del 10%
    6) se la casa é in centro il prezzo raddoppia, se semicentrale aumenta del 50%, se in periferia rimane lo stesso.

Cicli ad iterazione indefinita (While)

  1. Creare un programma che continua a far inserire all’utente dei numeri interi che il programma somma. Quando viene inserito 0 il programma stampa la somma e termina.
  2.  Creare un programma che continua a far inserire all’utente dei numeri interi di cui il programma calcola la somma. Quando la somma super il valore di 100 il programma stampa la somma e termina.
  3. Creare un programma che richiede un numero n, e successivamente richiede all’utente numeri interi fino a quando la loro somma non supera n.
  4. Creare un programma che continua a far inserire all’utente dei numeri interi che il programma somma. Quando viene inserito 0 il programma stampa la somma somma, media, massimo, minimo.
  5. Scrivere un programma che richiede un input di un valore intero tra 1 e 100. Se l’input inserito dall’utente non è tra 1 e 100, il programma chiede di reinserire il valore. Se il valore è corretto il programma stampa il doppio del valore inserito.
  6. Dati due numeri inseriti dall’utente, scrivere un programma che stampa il MCD di entrambi i numeri.
  7. Dati due numeri inseriti dall’utente, scrivere un programma che stampa il mcm di entrambi i numeri.
  8. Scrivere un programma che dopo aver richiesto due valori n e k, visualizza tutte le potenze di un intero n, minori di k.
  9. Dopo aver fatto inserire un numero naturale il programma ne calcola i divisori.
  10. Dopo aver fatto inserire un numero naturale il programma ne calcola i fattori primi (divisori primi).
  11. Scrivere un programma dove l’utente inserisce un numero n. Indicare se è primo.
  12. Scrivere un programma dove l’utente inserisce un numero n. Indicare il primo numero primo superiore a N.
  13. Dopo aver fatto inserire un numero naturale il programma restituisce in output da quante cifre è composto.
  14. Dopo aver fatto inserire un numero naturale il programma restituisce in output da quante cifre pari e quante dispari è composto.
  15. Dopo aver fatto inserire un numero naturale il programma mostra il suo inverso.
  16. Dopo aver fatto inserire un numero naturale il programma indica se è palindromo.
  17. Sommare tutte le cifre di un numero n inserito dall’utente.
  18. Sommare tutte le cifre di un numero n inserito dall’utente. Se il risultato ha ancora più di una cifra sommarle ancora eventualmente più volte fino ad ottenere un numero da una sola cifra.

Cicli ad iterazione definita (For e While)

  1. Creare un programma che chiede un numero (es. N) e stampa i multipli di quel numero fino a 10 volte (es. l’utente se inserisce 5 il programma stamperà 5,10,15, …).
  2. Scrivere un programma che chiede un numero n, e poi stampa i primi n numeri pari.
  3. Scrivere un programma che chiede un numero N, e stampa i numeri interi da N a 1.
  4. Mario è uno studente che riceve una paghetta  la settimana per comprarsi da mangiare al bar della scuola. Le settimane pari Mario spende tutta la paghetta, le settimane dispari riesce a risparmiare il 20% della paghetta. Scrivere un programma che chiede di inserire un numero N di settimane e la somma ricevuta ogni settimana e calcola quanti soldi ha alla fine del periodo.
    Esempio: Mario riceve 12 euro la settimana e le settimane sono 5. Alla fine del periodo a Mario rimarranno 9 euro. Ricordarsi che i valori NON sono interi.
  5. Dato un numero n, stamparne il fattoriale (si ricorda che il fattoriale n! = 1*2*3*…*(n-1)*n
  6. Un virus si diffonde in una popolazione con questo andamento. Nelle settimane pari il virus cresce del 10%, nelle settimane dispari diminuisce del 9%. Scrivere un programma che riceve in ingresso la popolazione iniziale e il numero di settimane e stampa la popolazione al termine del periodo.
  7. Scrivere un programma che legge la misura n del lato di un quadrato e stampa a schermo un quadrato di * con lato n.
    ****
    ****
    ****
    ****
  8. Stampare un triangolo rettangolo isoscele di cateto c inseriti dall’utente.
    *
    **
    ***
    ****
    *****
    ******
  9. Stampare un rombo di diametro n. (n richiesto dall’utente e dispari)
    *
    ***
    *****
    ***
    *
  10. Calcolare π con la formula di Wallis fino a prodondità n con le seguente produttoria:
    π=2*2/1*2/3*4/3*4/5*6/5*6/7*8/7*8/9… *
  11. Calcolare π con la formula di Leibniz fino a profondità n con la seguente sommatoria. π= 4 – 4/3 + 4/5 – 4/7 + 4/9 – … 4/n
  12. Calcolare il numero di Eulero:
    e= 1 + 1/1! + 1/2! + 1/3! + … dato un numero n stampare una approssimazione di e con n iterazioni.
  13. Una terna pitagorica è una terna a,b,c dove a^2+b^2=c^2.Dato n inserito dall’utente calcolare tutte le terne pitagoriche per a,b,c compresi tra 1 e n.
  14. Una banca presta denaro al tasso di interesse composto di un certo tasso di interesse annuale. Questo vuol dire che ogni anno la somma da restituire aumenta di una percentiuale rispetto all’anno precedente. Ad esempio se la banca presta 1000 euro, al tasso del 5%, si ha questa progressione:
AnnoSomma da restituireInteressiTotale
11000501050
2105050.51060.5
31060.553.0251113.25
41113.2555.6251168.9125

Switch

  1. Sapendo che il 1/1/2000 era un sabato, scrivere un programma che inserita una qualsiasi data, sia in grado di dire che giorno sia.
  2. Scrivere un programma che chiede un carattere in ingresso e stampa in che posizione si trova il carattere nell’alfabeto (‘a’ e ‘A’ sono in posizione 0, ‘z’ e ‘Z’ in posizione 25), poi chiede un altro carattere e stampa la distanza ASCII tra i due.
  3. Scrivere un programma che richiede un numero a, un numero b (entrambi float) e poi un caratterer per indicare l’operazione da eseguire (‘+’, ‘-‘, ‘*’, ‘/’, ‘%’). In base al tipo di operazione il programma esegue il calcolo e restituisce il risultato. Verificare che non si possa dividere per 0.

Numeri casuali

  1. Scrivere un programma che estrae 5 numeri tra 1 e 90, diversi tra loro.
  2. Mario è uno studente che riceve una paghetta  la settimana per comprarsi da mangiare al bar della scuola. Ogni settimana spende tra il 10% ed il 90% della paghetta (estrarre un numero a caso). Scrivere un programma che chiede di inserire un numero N di settimane e la somma ricevuta ogni settimana e calcola quanti soldi ha alla fine del periodo.
  3. Scrivere un programma che estrae per 10 volte i valori di 3 dadi da 6 e ne mostra la somma.
  4. Scrivere un programma che estrae 10 volte da 1 dado da 20 e mostra il valore più alto mai raggiunto.
  5. Scrivere un programma che estrae 5 volte da 2 dado da 12 e mostra il valore più piccolo.
  6. Un virus ha un incremento casuale tra 10% e 30% negli anni pari, ed una diminuzione casuale dal 5% al 40% negli anni dispari. Scrivere un programma che data una popolazione iniziale pari a 100 ed un numero n intero inserito dall’utente, stampa la popolazione degli anni da 0 a n.
  7. Scrivere un programma che genera casualmente un numero tra 1 e 100 e chiede all’utente di inserire un numero. Se il numero inserito è più basso del numero generato, scriverà all’utente che il numero inserito è più basso. Se è più alto scriverà che il numero è più alto. Se invece è uguale, allora dirà che ha indovinato. Il programma deve tenere conto anche dei tentativi massimo 5. Se si supera il numero di tentativi si darà errore.

Array e matrici

  1. Chiedere all’utente un numero n. Creare un array di dimensione n. Far inserire tutti i valori (interi). Stampare poi minimo, massimo e media.
  2. Scrivere un programma che richiede un numero n. Creare un array di numeri casuali da 1 a n di dimensione n.
  3. Scrivere un programma che chiede un numero m ed un numero n e genera una matrice m x n e la riempie di valori casuali tra 1 e m*n. Infine la stampa.
  4. Scrivere un programma che legge la misura n del lato di un quadrato e stampa a schermo un quadrato di * con lato n, usando una matrice.
    ****
    ****
    ****
    ****
  5. Stampare un triangolo rettangolo isoscele di cateto c inseriti dall’utente, usando una matrice.
    *
    **
    ***
    ****
    *****
    ******
  6. Stampare un rombo di diametro n. (n richiesto dall’utente e dispari) usando una matrice.
    *
    ***
    *****
    ***
    *
  7. Scrivere un programma che riempie un array coi primi n numeri primi.
  8. Risolvere un sistema di 2 equazioni e 2 incognite usando il metodo di Cramer.
    Si ricorda che le equazioni sono nella forma:
    a1x + b1y = c1
    a2x + b2y = c2
  9. Simulare l’estrazione dei numeri del lotto di una ruota (i numeri sono 5, vanno da 1 a 90, non sono ripetuti) e memorizzarli in un array.
  10. Calcolare i divisori di un numero e memorizzarli in un array
  11. Fare inserire un numero n. Creare una serie di Fibonacci di n numeri e memorizzarla in un array.
  12. Scrivere un programma che richiede un numero n < 30. Poi fa inserire n voti in virgola mobile da 1 a 10. Infine stampa un grafico ad istogramma che mostra per ogni range di voto (intero) il numero di studenti che lo hanno preso (un asterisco per ogni persona con quel voto), con una grafica come la seguente:
    3 ***
    4 ****
    5 *****
    6 ******
    7 ****
    8 ***
    9 *
    10 *

    Nota: il voto (in virgola mobile) viene arrotondato all’intero inferiore (es. 5,5 diventa 5)
  13. Scrivere un programma che esegue la fusione (merge) di due array di N elementi generati casualmente. Esempio se abbiamo a = [1,5,3,2] e b = [4,2,6,8] allora il merge sarà [1,5,3,2,4,2,6,8].
  14. Validare un array di probabilità di dimensione N inserito dall’utente. L’array è valido se ogni elemento ha valore tra 0 e 1 (esclusi) e la somma è pari a 1.
  15. Scrivere un programma che genera un vettore di dimensione 5 elementi interi casuali (tra 1 e 10). Successivamente richiede all’utente un numero i. Gli elementi esistenti scorrono a destra e l’elemento viene inserito in prima posizione (l’ultimo viene eliminato). Ad esempio se generiamo [2,4,8,1,5] e successivamente l’utente inserisce il valore i=7 allora si otterrà [7,2,4,8,1].
  16. Implementare il classico attacco del Risiko. Nell’attacco del Risiko sono lanciati dall’attaccante 3 dadi da 6, la stessa cosa dal difensore. Sono quindi 2 array di interi con valore da 1 a 6. A questo punto, ordinate le due serie (attacco e difesa) si confrontano il primo valore di attacco col primo di difesa. Se il valore di attacco è maggiore della difesa, il difensore perde un carro armato, altrimenti lo perde l’attaccante. Lo stesso confronto si fa sul secondo valore, e infine sul terzo. Al termine dell’attacco quindi vengono persi in tutto 3 carri, che possono essere del difensore, dell’attaccante o una qualsiasi combinazione.
  17. Generare un array di N numeri casuale (N inserito dall’utente, numero casuale tra 1 e 100) e stamparlo una riga alla volta, indicando per ogni elemento se è primo oppure no. Esempio se l’array generato è [4, 12, 5, 21, 7] verranno stampati tutti i valori e per per 5 e 7 verrà indicato se che sono primi.
  18. Generare due array di dimensione N (N inserito dall’utente, numeri casuali tra 1 e 100). Creare poi un terzo array vuoto di dimensione 2*N. Inserire Nel terzo array i valori dei primi due array, dal più piccolo al più grande (ordine crescente). Ad esempio se si generano a1=[6, 3, 21, 12] e a2=[13, 8, 9, 4] l’array a3 sarà [3,4,6,8,9,12,13,21]. Suggerimento: ogni volta che estrae un valore da un array a1 o a2, sostituire quel valore con un altro valore non usabile (ad esempio 101).

Funzioni

Passaggio per valore

  1. Creare una funzione che dato un numero in virgola mobile ne arrotonda il valore all’intero inferiore o successivo (si ricorda che si arrotonda all’intero inferiore se il valore dopo la virgola è inferiore 0.5 altrimenti all’intero superiore). Scrivere un programma che
    – richiede un numero n,
    – richiede n valori float,
    – memorizza in un array di interi il loro arrotondamento usando la funzione
    – stampa infine tutti i valori uno per riga
  2. Creare una funzione che ricevuti due valori sottrae al maggiore metà del valore del minore. Scrivere un programma che gestisce l’inserimento dei due valori ed il risultato.
  3. Stampare un triangolo rettangolo isoscele di cateto c inseriti dall’utente. Nel programma usare una funzione void che riceve in ingresso un numero n e un carattere c e stampa n volte c.
    *
    **
    ***
    ****
    *****
    ******
  4. Scrivere un programma che riempie un array coi primi n numeri primi. Usare una funzione che riceve in ingresso un numero e restituisce un booleano che indica se il numero è primo.
  5. Creare poi un programma che legga due frazioni le riduca ai minimi termini e verifichi se hanno lo stesso denominatore. Per ridurre ai minimi termini dobbiamo scrivere un ciclo che verifica se numeratore e denominatore hanno un fattore comune. Per aiutarci creiamo una funzione che dato un numero restituisce il suo fattore più piccolo. Da li poi si scrive l’algoritmo principale.
  6. Scrivi una funzione che prenda in input un carattere e restituisca true se è una vocale, altrimenti restituisca false.
  7. Scrivi una funzione che prenda in input un numero intero e stampi tutti i numeri pari fino a quel valore.
  8. Implementare una funzione che ricevuto in ingresso due cateti restituisce l’ipotenusa. Considerato che una terna pitagorica è una terna a,b,c dove a^2+b^2=c^2.Dato n inserito dall’utente calcolare tutte le terne pitagoriche per a,b,c compresi tra 1 e n, usando la funzione.
  9. Scrivi una funzione che prenda in input un array di numeri generati casualmente e una dimensione e restituisce quanti sono i numeri pari. Scrivere poi un programma che chiede un numero n e genera un array di interi generati casualmente tra 1 e 100 di dimensione n e richiama la funzione. Infine stampa il numero di numeri pari ed il numero di numeri dispari generati.
  10. Scrivere una funzione che ricevuto un orario (jn ore, minuti e secondi) calcola quanti secondi sono passati dalla mezzanotte. Scrivere poi una funzione che, utilizzando la funzione precedente, riceve due orari (entrambi in ore, minuti e secondi) calcola la differenza in secondi tra i due orari. Infine scrivere un programma che richiede due orari e restituisce la differenza in secondi.
  11. Scrivere una funzione che riceve un carattere e restituisce true se è una vocale, false se non lo è. Scrivere un programma che richiede un carattere e dice se è una vocale.

Passaggio per riferimento e array

  1. Creare una funzione che scambia il contenuto di due variabili che le sono passate; poi creare un programma che fatti inserire tre numeri da parte dell’utente li inverte usando la funzione precedentemente creata.
  2. Scrivere un programma che chiede base ed altezza del rettangolo e calcola (tramite una funzione) area e perimetro del rettangolo dati base ed altezza del rettangolo. Usare il passaggio per riferimento per gestire area e perimetro.
  3. Scrivere un programma che contiene una funzione che, dati i coefficienti a,b,c di una equazione di secondo grado (ax2 + bx + c = 0) ne calcoli le soluzioni x1 e x2. Usare il passaggio per riferimento per x1 e x2.
  4. Creare poi un programma che legga due frazioni le riduca ai minimi termini. Per ridurre ai minimi termini dobbiamo scrivere un ciclo che verifica se numeratore e denominatore hanno un fattore comune e poi divide per entrambi, fino a quando non sono primi tra loro. Usare una funzione per eseguire interamente questa riduzione (numeratore e denominatore vanno passati per riferimento).
  5. Implementare una funzione che ricevuto in ingresso un array di interi e la sua dimensione inserisca al suo interno tutti zero. Realizzare un programma che utilizzi tale funzione.
  6. Implementare una funzione che ricevuto in ingresso un array di valori 0 e 1 (es. [1,1,1,0,1,0,1]) e la dimensione, ne calcoli il decimale corrispondente.
  7. Implementare una funzione che ricevuto in ingresso un numero decimale intero, un array vuoto ed una lunghezza, lo riempia col valore binario del decimale. Esempio di chiamata:
    converti(valore, int[], n).
    Per capire la dimensione dell’array (cioè quante cifre binarie ci vogliono) basta calcolare il logaritmo di 2 del numero arrotondato per eccesso (es. log2(10) è 4).
  8. Implementare una funzione che ricevuto in ingresso due cateti a e b, l’ipotenusa c e il riferimento a un booleano, usa il booleano per indicare se la terna a,b,c è pitagorica (una terna pitagorica è una terna a,b,c dove a^2+b^2=c^2). Dato n inserito dall’utente calcolare e stampare tutte le terne pitagoriche per a,b,c compresi tra 1 e n, usando la funzione. La stampa va svolta fuori dalla funzione.
  9. Scrivere una funzione che ricevuto un orario (jn ore, minuti e secondi) calcola quanti secondi sono passati dalla mezzanotte. Scrivere poi una funzione che, utilizzando la funzione precedente, riceve due orari (entrambi in ore, minuti e secondi) calcola la differenza in secondi tra i due orari. Infine scrivere una terza funzione che ricevuto un numero di secondi ed il riferimento a ore, minuti e secondi trasforma i secondi in ore, minuti e secondi. scrivere un programma che richiede due orari e restituisce la differenza in ore miinuti e secondi.
  10. Scrivere una funzione che riceve un intero len, un array di char e un array di interi entrambi di dimensione pari a len: la funzione converte i char nei corrispondenti valori ASCII (si usi la funzione int(c) che restiscuire il codice ASCII di c). Scrivere poi un programma che richiede all’utente un certo numero n, e poi fa inserire n caratteri ed infine stampa l’array coi codici ascii. Esempio [‘A’, ‘B’, ‘C’] > [65, 66, 67].
  11. Un vettore è detto simmetrico se letto al contrario contiene gli stessi valori. Es [1, 2, 4, 2, 1] è simmetrico. Scrivere un programma che ha una funzione che verifica se un vettore è simmetrico.
    Il vettore e la sua lunghezza sono inseriti dall’utente.
  12. Scrivere una funzione che riceve come argomento un intero e un array di caratteri di lunghezza 20. La funzione converte l’intero in stringa e salva il valore nell’array di caratteri. Scrivere un programma che richiede un numero all’utente e stampa (usando la funzione) la corrispondente stringa.

Uso di variabili statiche

  1. Creare un programma che crea una funzione mult. Questa funzione ogni volta che viene eseguita esegue il prodotto del numero ricevuto come parametro con il valore corrente (che parte da 1) e lo restituisce:
    Es:
    cout << mult(3) << endl; // stampa 3
    cout << mult(2) << endl; // stampa 6
    cout << mult(-3) << endl; // stampa 2
  2. Creare un programma che genera un vettore di 8 elementi di tipo intero avente valore 0 e 1. I valori devono essere generati casualmente. Qui un esempio di vettore generabile: [1,1,1,0,0,1,0,1]. Ricordarsi che non si può creare un vettore in una funzione perchè viene memorizzato nello stack e una volta terminata la funzione il riferimento al vettore viene perso. Il vettore va quindi creato nel main e passato alla funzione che lo andrà a popolare.

Stack

  1. Dato il seguente codice:
    int power(int current) {
            if (current == 1) {
                return 2;
            } 
            return 2 * power(current-1);
        }
    power(4);

    Indicare i valori presenti nello stack per tutte le chiamate.
  2. Dato il seguente codice:
    int sum(int current) {
            if (current == 1) {
                return 2;
            } 
            return 2 + sum(current-1);
        }
    sum(4);

    Indicare i valori presenti nello stack per tutte le chiamate.

Stringhe

  1. Fare inserire all’utente una stringa di lunghezza max 50. Contare:
    – occorrenze di ciascuna vocale
    – lunghezza inserita senza spazi
    – il numero di parole
  2. Invertire una stringa inserita dall’utente.
  3. Concatenare due stringhe senza usare funzioni di libreria.
  4. Verificare se una stringa inserita dall’utente è palindroma.
  5. Verificare se due stringhe sono anagrammi
  6. Date due stringhe verificare se sono palindrome
  7. Convertire una stringa in numero intero (o dare errore), senza usare sprintf.
  8. Convertire una stringa in virgola mobile (o dare errore) senza usare sprintf.
  9. Prendere un testo e codificarlo in farfallino. In alfabeto farfallino si sostituiscono le vocali nel seguente modo: a → afa e → efe i → ifi o → ofo u → ufu
  10. Prendere un testo e codificarlo col cifrario di Cesare. Il cifrario di Cesare consiste nel prendere il valore (ASCII) di ogni lettera, sommare a questo il valore k (es. 3) e inserire il nuovo valore nella stringa risultante. Il programma da scrivere chiederà quindi:
    – un testo da inserire (max 500 caratteri);
    – un valore k di codifica
    e poi mostrerà il testo codificato.
    Si ricordi che la translitterazione va fatta in modo circolare quindi se k=3 e vogliamo codificare la ‘z’ avremo una ‘c’. Suggerimento: calcolate il valore ASCII e sottraete 65 (se maiuscola) o 96 (se minuscola). Per ottenere circolarità è sufficiente la seguente formula:
    (valore_lettera + k) % 26
  11. Caricare un testo da file (almeno 200 caratteri). Poi richiedere una stringa di una sola parola. Il programma deve ricercare quella parola nel testo e indicare il numero di volte che appare.
  12. L’utente inserisce un numero n decimale. Convertirlo in binario (stringa) e esadecimale (stringa).
  13. Come precedente ma da binario a decimale/esadecimale.
  14. Come precedente ma da esadecimale a decimale/binario.
  15. Scrivere un programma che richiede all’utente una stringa nella forma “a X b” dove a e b sono numeri e X è un’operatore tra +,-,*,/. Il programma deve verificare che l’input contenga effettivamente due numeri e che l’operatore sia valido. Se sono corretti svolge l’operazione richiesta altrimenti restituisce errore.
  16. Il mac address è un indirizzo che si utilizza per identificare i dispositivi che aderiscono al protocolo 802.X (ethernet, wifi, ecc.). ES A0:1B:CC:08:2D:36. Ciascuna cifra ha un valore che fa da 0..9A..F 00:.....:00 FF:.....:FF. Scrivere un programma che genera un mac address casuale.
  17. Scrivere un programma che genera una password casuale di almeno 8 caratteri. E’ necessario che sia presente almeno un carattere tra questi:
    – maiuscole
    – minuscole
    – caratteri speciali (_!$%&/()=?^[].,<>§°ç*+-)
    – cifre
  18. Scrivere un programma che richiede un numero n > 0 e poi genera una parola casuale di n lettere composta da caratteri dell’alfabeto minuscolo (tutte le lettere hanno pari probabilità di uscire).
  19. Scrivere un programma C++ che predispone un elenco significativo (almeno 300 parole) di parole predefinite di 5 lettere (es “prato”, “marea”, “tonno”, “pista”, “gatto”, ecc.). All’avvio del programma il programma sceglie una parola a caso, che dovrà essere indovinata dall’utente. Le regole del gioco sono queste:
    a) L’utente ha a disposizione 5 tentativi.
    b) Per ogni tentativo il programma chiede una parola di 5 lettere.
    c) Il programma verifica che le lettere siano valide (solo minuscole) e poi ristampa la parola inserita lettera per lettera con le seguenti regole:
    – se la lettera corrente è giusta ed in posizione giusta la stampa in VERDE
    – se la lettera corrente è giusta ma in posizione sbagliata la stampa in GIALLO
    – altrimenti la stampa in colore bianco.
    (Qui le istruzioni per stampare colorato: https://www.geeksforgeeks.org/how-to-print-colored-text-in-c/)
  20. Creare una funzione “join” che crea una stringa a partire da un array di interi e un carattere separatore. Esempio di utilizzo di questa funzione:
    int list[] = {1,2,3,4,5};
    cout << join(list, '-') << endl; // stampa “1-2-3-4-5”)
  21. Creare un programma che legge una stringa di numeri separati da virgola. Estrarre i numeri (con strttok) e memorizzarli in un array. Stampare la somma dei valori. Esempio:
    "1,2,3,4,5,6,7,8,9,10" -> 55
    "1,2,3,4,5" -> 15
    "37,22,1,18" -> 88
    "1,2,3,....,99,100" (ci sono tutti i valori da 1 a 100)
    -> 5050
  22. Creare un programma che legge una stringa di numeri separati da virgola, inserita dall’utente. L’applicazione legge i numeri, e calcola il massimo, il minimo, la media e li stampa.
  23. Creare un programma che legge una stringa contenente testo in linguaggio naturale. L’applicazione legge tutte le parole, le memorizza in un array (di dimensione massima 100) e stampa le 3 parole più comuni nel testo.
  24. Trasformare un testo da uppercase a lowercase. Il programma chiede un testo all’utente e sostituisce tutte le maiuscole con minuscole.
  25. Trasformare un testo da lowercase a uppercase. Il programma chiede un testo all’utente e sostituisce tutte le minuscole con maiuscole.

Variabili statiche

  1. Creare un programma che genera un vettore di 8 elementi di tipo intero avente valore 0 e 1. I valori devono essere generati casualmente. Qui un esempio di vettore generabile: [1,1,1,0,0,1,0,1]. In questa situazione ricordarsi di usare la creazione statica.

Ricorsione

  1. Scrivere una funzione fattoriale ricorsiva.
  2. Scrivere una funzione ricorsiva che calcola i divisori di un numero. Scriverne una variante che li memorizza in un array (la dimensione dell’array deve essere sufficientemente grande da contenere tutti i divisori) e restituisce il loro numero.
  3. Scrivere una funzione ricorsiva che calcola i fattori primi di un numero. Scriverne una variante che li memorizza in un array (la dimensione dell’array deve essere sufficientemente grande da contenere tutti i divisori) e restituisce il loro numero.
  4. Scrivere una funzione ricorsiva che somma gli elementi di un array di interi.
  5. Scrivere una funzione ricorsiva che individua un carattere in una stringa.
  6. Scrivere una funzione ricorsiva che conta le cifre di un numero.
  7. Calcolare π con la formula di Leibniz fino a profondità n con la seguente sommatoria. π= 4 – 4/3 + 4/5 – 4/7 + 4/9 – … 4/n La funzione di calcolo deve essere ricorsiva.
  8. Scrivere una funzione che calcola i numeri di Fibonacci (dato n) e li memorizza in un array.
  9. Una banca presta denaro al tasso di interesse composto di un certo tasso di interesse annuale. Questo vuol dire che ogni anno la somma da restituire aumenta di una percentiuale rispetto all’anno precedente. Un esempio di progressione si può vedere nell’esercizio analogo della sezione for. Scrivere lo stesso esercizio ma usando una funzione ricorsiva.
  10. Scrivere una funzione ricorsiva che riceve un array di interi e ne calcola la somma in modo ricorsivo.
  11. Scrivere una funzione ricorsiva che inverte un array di interi. Scegliere opportunamente la firma della funzione.

Gestione files

  1. Sia dato un csv come questo che indica un iinsieme di immobili (gli attributi sono stanze,mq,prezzo )
    3,120,250000
    4,180,350000
    2,80,150000
    5,220,450000
    3,110,200000
    4,160,300000
    2,75,140000
    6,250,550000
    4,170,320000

    Scrivere una applicazione che:
    – legge il csv da file
    – lo trasforma in una matrice (si ricorda che la dimensione della matrice va calcolata)
    – stampa l’immobile con prezzo più alto
    – stampa l’immobile con prezzo al mq più alto
  2. Data la matrice dell’esercizio precedente, stampa un nuovo csv in cui per ogni immobile sono stampati mq, prezzo, prezzo_mq dove l’ultimo valore è il prezzo al metro quadro.
  3. Caricare un testo da file, convertirlo da uppercase a lowercase e salvarlo su un nuovo file.
  4. Caricare un testo da file, convertirlo da lowercae a uppercase e salvarlo su un nuovo file.

Gestione files e struct

  1. Sia dato un csv come questo che indica un iinsieme di immobili (gli attributi sono stanze,mq,prezzo )
    3,120,250000
    4,180,350000
    2,80,150000
    5,220,450000
    3,110,200000
    4,160,300000
    2,75,140000
    6,250,550000
    4,170,320000

    Scrivere una applicazione che:
    – legge il csv da file
    – lo trasforma in un array di struct (si ricorda che la dimensione dell’array va calcolatao)
    – stampa l’immobile con prezzo più alto
    – stampa l’immobile con prezzo al mq più alto
  2. Creare un programma che legge una stringa da file contenente testo in linguaggio naturale (5000 caratteri). L’applicazione legge tutte le parole, le memorizza in un array (ogni parola ha dimensione 20, l’array delle parole ha dimensione massima 200) e stampa la parola più comune del testo (la prima che trova).
    Guida allo svolgimento dell’esercizio:
    •  Prima di tutto bisogna estrarre tutte le parole del testo in un array bidimensionale (un array come quello di wordle), ad esempio parole[200][20]. Dall’estrazione sapremo anche quante parole ha il testo, cioè un interno N.
    • A questo punto contiamo per ogni parola quante volte compare. Per farlo ci serve un secondo array, che chiamiamo occorrenze[N] (ha dimensione pari al numero di parole trovate). Per ogni parola, la confrontiamo con tutte le altre parole e ogni volta che ne troviamo una incrementeremo di uno occorrenze[i] dove i è ovviamente l’indice della parola che stiamo controllando. Sono quindi due for annidati.
      Alla fine l’array occorrenze avrà il conto delle occorrenze di tutte le parole: alla posizione 0 ci sarà il conto del numero di volte che compare la parola alla posizione 0 nell’array parole, alla posizione 1 il conto del numero di volte che compare la parola alla posizione 1, e così via.
      Ad esempio se abbiamo:
      parole[] = ["ciao", "io", "sono", "io"]
      Allora sarà:
      occorrenze[] = [1,2,1,2]
    • Infine mostriamo la parola più usata nel testo (la prima che trovate), cioè bisogna trovare l’indice di valore max di occorrenze (la prima individuata). Nel nostro esempio l’indice è 1, e la parola è quindi parole[1] cioè “io”.
  3. Sia dato un file .csv contenente un elenco di punti del piano cartesiano. Il file ha la seguente forma:
    Nome,x,y 
    p1,3.24,5.78 
    p2,6.12,8.96 
    p3,1.45,2.33 
    p4,9.87,4.56
    p5,7.21,6.75 
    p6,4.32,3.12 
    p7,8.01,1.98 
    p8,5.67,7.89 
    p9,2.34,9.01

    Scrivere una applicazione che:
    • legge dal file i punti e li memorizza in una struct adeguata, facendo attenzione al tipo di dato. 
    • calcola il punto più distante dall’origine (0,0). Si ricorda che la distanza tra due punti è data dal teorema di Pitagora:  (si ricordi di usare le funzioni sqrt(value) e pow(base, exp)) )
    • salva in un nuovo file csv i dati originali, più una quarta colonna indicante il valore calcolato al punto precedente. Ad esempio la prima riga del file di output sarà:
      p1,3.24,5.78,662.62 
    • Quanto spazio occupa in byte la struttura, sapendo che 1 carattere occupa 8 bit, e 1 numero (int o float) occupa 64 bit?
  4. Sia dato un file .csv contenente un elenco di immobili. Il file ha la seguente forma:
    Id,stanze,mq,prezzo
    a1,3,120,250000
    a2,4,180,350000
    a3,2,80,150000
    a4,5,220,450000
    a5,3,110,200000
    a6,4,160,300000
    a7,2,75,140000
    a8,6,250,550000
    a9,4,170,320000

    Scrivere una applicazione che:
    • legge dal file gli immobili e li memorizza in una struct adeguata, facendo attenzione al tipo di dato.
    • calcola il prezzo al metro quadro per ogni appartamento. 
    • Salva in un nuovo file csv i dati originali, più una quarta colonna indicante il valore calcolato al punto precedente. Ad esempio la prima riga del file di output sarà:
      a1,3,120,250000,2083.33 
    • Quanto spazio occupa in byte la struttura, sapendo che 1 carattere occupa 8 bit, e 1 numero (int o float) occupa 64 bit?
  5. Definire una struttura Casa per memorizzare i dati di un immobile: identificativo, metri quadri, categoria (da 1 a 3), classe energetica (da ‘A’ a ‘F’). Utilizzare le strutture dati ottimali. Scrivere un programma che:
    • Richiede un numero n e fa inserire all’utente n case;
    • Stima il valore delle case utilizzando le tabelle sottostanti (valore base per categoria e classe energetica)
    • Stampa sul file “immobili.csv” un CSV contenente tutti i dati compreso il valore stimato. Ad esempio un immobile di 50mq, di categoria 2, e classe energetica A sarà stimato per 300.000€.
categoriavalore
12000€/mq
23000€/mq
34000€/mq
Valore base
classemoltiplicatore
A2
B1,5
C1
D0,8
E0,5
Classe energetica.

6. Definire una struttura che memorizza i dati di una motocicletta: modello, cilindrata, potenza, classe euro (da 0 a 5). Utilizzare le strutture dati ottimali.
Scrivere un programma che:
a) Richiede un numero n e fa inserire all’utente n motociclette;
b) Stima il valore del bollo con la seguente regola:
– il costo è 1€ per kW;
– moltiplicare il valore per la classe euro secondo la tabella sottostante
c) Stampa sul file “moto.csv” un CSV contenente tutti i dati compreso il valore stimato. Ad esempio una moto di 50kw, di classe euro 3 pagherà un bollo di 62,5 euro.

    classemoltiplicatore
    02
    11,8
    21,5
    31,2
    41
    50,8
    Valore per classe euro

    7. Leggi un file CSV studenti.csv con il formato:

    Nome,Cognome,Voto1,Voto2,Voto3
    Mario,Rossi,8,9,7
    Luca,Bianchi,6,7,6
    Giulia,Neri,10,9,10
    Alessandro,Verdi,5,6,5
    Chiara,Gallo,9,9,8
    Martina,Romano,8,7,8
    Paolo,Conti,6,5,6
    Elena,Costa,10,10,10
    Simone,Greco,4,5,4
    Francesca,Marini,9,8,8
    

    Calcolare la media dei voti per ogni studente. Usare un array di struct.

    Esportare in studenti_media.csv (solo le colonne nome, cognome, media)

    8. Dato il segue CSV:

    ID,Nome,Prezzo,Disponibile
    101,Mouse,15.99,Si
    102,Tastiera,25.50,No
    103,Monitor,120.00,Si
    104,Webcam,40.00,No
    105,Stampante,99.99,Si
    106,Router,65.50,No
    107,Cuffie,45.00,Si
    108,Hard Disk,80.00,Si
    109,SSD,100.00,No
    110,Cavo HDMI,10.99,Si

    Creare un file csv disponibili.csv che contiene i soli prodotti disponibili. Usare le struct.

    9. Dato il seguente CSV:

    Categoria,Prodotto,Quantita,PrezzoUnitario
    Elettronica,Mouse,10,15.99
    Cartoleria,Penna,100,0.50
    Elettronica,Monitor,5,120.00
    Cartoleria,Quaderno,50,1.20
    Elettronica,Tastiera,8,25.50
    Ufficio,Sedia,3,85.00
    Ufficio,Scrivania,2,150.00
    Elettronica,Webcam,7,40.00
    Cartoleria,Evidenziatore,30,0.70
    Ufficio,Lampada,4,25.00

    Creare un file csv totale_vendite.csv che contiene il totale vendite per categoria. Usare le struct.

    Categoria,Totale
    Elettronica,1232.43
    Cartoleria,116.00
    Ufficio,665.00
    

    10. Dato il seguente CSV:

    Nome,Cognome,Stipendio,BonusPercentuale
    Anna,Colombo,1500,10
    Paolo,Marini,1800,5
    Luca,Bianchi,1700,7
    Chiara,Gallo,1600,6
    Elena,Conti,1650,8
    Marco,Rossi,1550,5
    Simone,Greco,1450,4
    Alessandro,Romano,1750,9
    Martina,Costa,1850,6
    Giulia,Verdi,1900,10

    Creare un file csv stipendi_totali.csv contenente gli stipendi con relativo bonus. Usare le struct. Esempio:

    Nome,Cognome,StipendioFinale
    Anna,Colombo,1650
    Paolo,Marini,1890
    ...
    

    Liste concatenate

    1. Scrivere un programma che genera una lista concatenata di punti nel piano cartesiano, a partire dalla seguente stringa. Creare la struttura del singolo punto e poi la lista concatenata.

    Nome,x,y 
    p1,3.24,5.78 
    p2,6.12,8.96 
    p3,1.45,2.33 
    p4,9.87,4.56
    p5,7.21,6.75 
    p6,4.32,3.12 
    p7,8.01,1.98 
    p8,5.67,7.89 
    p9,2.34,9.01

    2. A partire dalla struttura dell’esercizio precedente, calcolare la distanza (teorema di Pitagora) vari punti e stamparla a schermo. Es:

    p1->p2: 5.33
    p2->p3: 6.28

    2. Scrivere un programma che genera N valori casuali tra 1 e 100 (N inserito dall’utente) e li inserisce in una lista concatenata che stampa. Il programma poi chiede un valore soglia (es. 50) e stampa i soli valori che superano la soglia.

    3. Scrivere un programma che genera N valori casuali tra 1 e 100 (N inserito dall’utente) e li inserisce in una lista concatenata che stampa. Il programma poi chiede un valore da cercare e indica “si” oppure “no” se il valore viene trovato oppure no.

    4. Scrivere un programma che chiede N valori all’utente (N inserito dall’utente). I valori sono poi inseriti in modo ordinato. Per svolgere questo esercizio bisogna quindi inserire ogni valore nuovo prima del valore immediatamente più grande e prima del valore immediatamente più piccolo. Esempio, ipotizziamo che la lista contenga già [1, 5, 12, 18] e l’utente voglia inserire 8. La lista dovrà diventare [1, 5, 8, 12, 18]. Questo significa inserire il nodo col valore 8 DOPO il nodo con valore 5, e fargli puntare il nodo con valore 12.

    5. Scrivere un programma che genera N valori casuali tra 1 e 100 (N inserito dall’utente) e li inserisce in una lista concatenata che stampa. Il programma poi genera e stampa la lista inversa.