Esercizi. Le istruzioni e le strutture di controllo

Esercizi.
Le istruzioni e le strutture di controllo
18) Individuare gli errori di sintassi nelle seguenti istruzioni:
a) cin >> a+2:
b) cout >> “Prova”;
c) FOR(a=1, a>10, a++);
d) a=b=c
19) Siano dati i seguenti cicli:
a) for (i = 0; i<n; i=i+2) ;
b) for (i = 0; i<n; i++) {i++; i++;}
c) i=n/2; while (i < n) i *=2;
d) i=n; do i-=n/2; while ( i >=0);
Completare la seguente tabella indicando quante volte verrà eseguito il ciclo ed il valore della
variabile i alla fine dello stesso supponendo che la variabile n = 10
Ciclo
N° di volte
Valore di i
a)
b)
c)
d)
20) Completare la tabella indicando cosa conterrà la variabile C dopo l'esecuzione delle seguenti
istruzioni if annidate tenendo conto dei valori iniziali di A e B indicati nelle prime due colonne:
if (A + B >10)
if (A > 10 && B < 10) C=A - B; ELSE C=A - B - 100;
else
if (A < 0 || B < 0) C= A + B; ELSE C= A - B + 100;
A
B
10
20
-10
-20
5
4
60
-10
C
21) Cosa fa il seguente frammento di programma?
int i=0;
while(i<50)
{if (i%2) cout << i << “\t”; i++;}
22) Considerate il seguente frammento di programma:
t=-1;
for (i=1; i<=n; i++) if (f(i)) t=i;
if (t>=0) cout << t ;
Quale delle seguenti affermazioni è corretta?
a) Il programma cerca e stampa il più piccolo intero x fra 1 e n tale che f(x)!=0; se tale intero
non esiste, il programma entra in un ciclo infinito.
b) Il programma cerca e stampa il più grande intero x fra 1 e n tale che f(x)!=0; se tale intero
non esiste, il programma entra in un ciclo infinito.
c) Il programma cerca e stampa il più piccolo intero x fra 1 e n tale che f(x)!=0; se tale intero
non esiste, il programma non stampa nulla.
d) Il programma cerca e stampa il più grande x fra 1 e n tale che f(x)!=0; se tale intero non
esiste, il programma non stampa nulla.
23) Cosa scrivono in output i seguenti cicli?
a) for (int i=1; i<7;i++) cout << i %5<<’ ‘;
………………………………………….
b) for (int i=1; i<7;i++) cout << i*2-1 <<’ ‘;
………………………………………….
c) int i=10; do {cout << i<<’ ‘; i -=5;} while (i>0); ………………………………………
d) int j=5,i=5; while(i>0) {cout << j <<’ ‘; if (i%2) j +=i else j-=i; i--;} ….……………..
24) Considerate il seguente frammento di codice:
float i,f;
...
f=1/50.0;
for (i=0.0; i!=1.0; i+=f) printf("A");
Quale dei seguenti effetti ha il ciclo for indicato?
a)Stampa 50 volte il carattere A;
b)Stampa 51 volte il carattere A;
c)Stampa 49 volte il carattere A;
d) Il ciclo potrebbe non terminare, stampando infinite volte il carattere A; e)Il compilatore segnala un errore;
Solo selezione
25) Data la misura dei tre lati di un triangolo dire se è isoscele scaleno o equilatero.
26) Un lanificio acquista lana dai pastori della zona. La lana acquistata è di tre tipi diversi (che si
acquistano a prezzi diversi), il prezzo inoltre cambia in base all'umidità, se questa supera il
30% il prezzo di acquisto si riduce del 15%. Fare un programma che aiuti l'impiegato a
calcolare la somma da versare ai pastori che portano la lana.
27) Una cooperativa agricola vende ai propri soci il vino che produce al prezzo di € 1 al litro se
bianco, 1.5 se rosso e 2 se D.O.C. E' possibile prendere il vino sfuso o imbottigliato, in questo
secondo caso il prezzo aumenta ulteriormente di €. 0.20 a litro. Descrivere un programma per
calcolare il prezzo del vino ogni volta che viene un cliente.
28) Un commerciante, in un mese, ha acquistato merce per X lire e ne ha venduto per Y lire.
Sapendo che l'aliquota IVA sulla merce trattata è il 20% calcolare l'IVA da versare o l'IVA a
credito a fine mese.
29) Fare un programma per calcolare l'IRPEF su un reddito assegnato. L’IRPEF, in base alla
finanziaria 2007, si calcola così:
a.
b.
Se il reddito è inferiore o uguale a 15.000€ si calcola il 23% del reddito
se supera i 15.000 ma é inferiore a 28.001 si calcola il 23% sui primi 15.000 (=€.3450) + il 27%
sulla parte eccedente i 15.000€.
c. Se supera i 28.000 ma è inferiore ai 55001€ l’imposta dovuta è data da 6960€ (pari al massimo
dello scaglione precedente) + il 38% sulla parte di reddito eccedente 28.000€
d. d. da 55.000€ fino a 75.000€ l’imposta è pari a € 17.220 (15000*0,23+13000*0,27+27000*0,38) +
il 41% della parte di reddito eccedente 55.000€
e. e. oltre € 75.000 l’imposta è pari a 25420€ + il 43% della parte di reddito che supera 75000 euro.
graficamente gli scaglioni possono essere rappresentati così:
27%
23%
15000
"
38%
28000
43%
41%
55000
75000
43%
30) Far calcolare il prezzo di una quantità assegna di vino che costa € 2.1 al litro supponendo che se
si acquista una quantità >= 20 litri si ha diritto al 10% di sconto.
31) Data in input una cifra qualsiasi, dopo averla arrotondata alle decine (per eccesso o per difetto a
seconda che il resto superi 5 o no), indicare quanti biglietti da 10€, quanti da 50 € e quanti da
100€ sono necessari per pagare la somma inserita in input utilizzando il minor numero
possibile di biglietti.
Cicli
32) Dato in input un numero intero N calcolare N fattoriale.
33) Dato in input un numero qualsiasi x e un numero intero n positivo, calcolare il risultato di xn.
34) Assegnati n e d calcolare la somma dei primi n termini della progressione geometrica di ragione
d: 1 + d + d2 + d3 + …. + dn
35) Assegnati n e d calcolare la somma dei primi n termini della progressione aritmetica di ragione
d:
1+ 2d+ 3d+ 4d+ …+ nd
36) Calcolare il prodotto di due numeri A e B interi effettuando solo addizioni.
37) Calcolare il quoziente e il resto della divisione tra due numeri interi A e B effettuando solo
sottrazioni.
38) Dato in input un numero intero qualsiasi controllare se è primo oppure no e visualizzare la
risposta.
39) Dati due numeri interi A e B trovare il minimo comune multiplo.
40) Dati due numeri interi A e B trovare il massimo comun divisore con l’algoritmo di Euclide.
Euclide ha dimostrato che, detti A e B due numeri interi con A>=B, se A è divisibile per B
allora MCD(A,B) = B altrimenti MCD(A,B) = MCD(B, A%B). In pratica si può cercare il
MCD tra due numeri più piccoli. Ripetendo questa operazione fino a quando i due numeri
diventano divisibili si trova il Massimo Comun Divisore.
41) Dato in input un numero intero N visualizzare la somma dei suoi divisori.
42) Calcolare la somma dei numeri interi da 1 a n (n in input): 1+ 2 + 3 + 4 + ….. + n (verificare che
corrisponde a n*(n+1)/2)
43) Far calcolare la somma dei primi n termini (N in input) della seguente successione:
1+ ½+ 1/3+ ¼ + 1/5 + 1/6 + 1/7+ ……+ 1/n
44) Far calcolare la somma dei primi n numeri dispari e verificare che corrisponde sempre a n*n
45) Scrivere le istruzioni per far visualizzare i primi n termini (n in input) delle seguenti successioni
di numeri:
a) 2 4 6 8 10 12 14 ...
b) 1 -3 5 -7 9 -11 13 ...
c) 1 2 9 4 25 6 49 8…
d) 2 3 4 5 8 9 16 17 32 33…
46) Far visualizzare su video un menù con una serie di voci tipo quelle dell’esempio sottostante,
chiedere la scelta e controllare che venga inserito un valore valido, visualizzare l’ozione
corrispondente alla scelta, far terminare il programma quando viene scelta la funzione
corrispondente a Fine.
Possibili scelte
1) Funzione 1
2) Funzione 2
3) Funzione 3
4) Funzione 4
5) Fine
Quale scegli?
47) Far calcolare la somma dei quadrati dei primi n numeri interi e verificare che corrisponde a n*(n
+1)*(2*n+1)/6
48) Far calcolare la somma della seguente successione di numeri interi:
1*N + 2*(N-1)+ 3*(N-2)+ …… +(N-1)*2 + N*1
si tratta di sommare una serie di prodotti di due numeri dove il primo fattore varia da 1 a N
mentre il secondo diminuisce da N a 1. (Questa somma, qualunque sia N è sempre = N*(N+1)(N
+2)/6 )
49) Far Calcolare la somma della seguente successione di numeri interi:
1*2 + 2*3 + 3*4 + 4*5 + …….. + (n-1)*n
il primo fattore va da 1 a n-1 mentre il secondo da 2 a N. (Questa somma è sempre uguale a n*(n
+1)(2*n-2)/6)
50) Calcolare la somma della seguente successione e verificare che corrisponde a n*(n+1)*(2*n
+1)/3
n*(n+1) + (n-1)*(n+2)+ (n-2)*(n+3)+ ……….+ 2*(n+n-1) + 1*(n+n)
51) Far visualizzare la tabella dei codici ASCII.
52) Calcolare la somma della successione:
Nel ciclo fermarsi quando l’ultimo termine sommato è inferiore ad un numero E dato in input.
supponendo di avere in input x, con 0 <x < 2 e che y = x-1. Fermare il ciclo quando il valore
in( x) = y −
y2
2
y3
3
+
y4
4
−
y5
5
+
+ ....
assoluto dell’ultimo termine sommato è minore dell’errore E dato anch’esso in input. Il risultato
è il logaritmo naturale di x approssimato con un errore massimo = E.
53) Dato in input un numero intero n trasformarlo in binario.
54) Far visualizzare i primi n termini della successione di Fibonacci:
1; 1; 2; 3; 5; 8; 13; 21; ….. (ogni numero è la somma dei due precedenti e i primi due sono
entrambi = 1).
55) Dato in input un numero intero n e trasformarlo nel sistema di numerazione a base b (b in input)
56) Dato un numero x scritto in un sistema a base b (x e b in input) trasformarlo in decimale.
57) Scrivere il programma che, dato in input x, calcoli la somma della seguente successione:
sen( x) = x −
x3
3!
+
x5
5!
−
x7
7!
+
x9
9!
+ ....
come si vede alcuni i termini vengono sommati o sottratti alternativamente. Il risultato, se si
continua all’infinito, è la funzione trigonometrica sen(x). Considerato che non si può continuare
all’infinito, fermarsi quando il valore assoluto dell’ultimo termine sommato
è minore
dell’errore E dato in input (si può dimostrare che la somma di tutti i restanti termini è sempre
minore del valore assoluto dell’ultimo termine sommato).
58) Come nell’esercizio precedente scrivere il programma che, dato in input un numero reale x,
cos(x) = 1 −
x2
2!
+
x4
4!
−
x6
6!
+
x8
8!
+ ....
calcoli la somma della seguente successione:
Sommando gli infiniti termini di questa successione si calcola la funzione coseno(x). Nel ciclo
fermarsi quando il valore assoluto dell’ultimo termine è minore dell’errore E dato in input.
59) Come per gli esercizi precedenti far calcolare la somma della seguente successione (x in input):
x
e =1+ x +
x2
2!
+
x3
3!
+
x4
4!
+
x5
5!
+ ....
in questo caso viene calcolato ex, fermarsi quando si somma il termine n, tn = xn/n! con n>x e
abs(tn)*(n/(n-x))< E, dove E è l’errore massimo dato in input.
60) Scrivere un programma che dato in input un numero qualsiasi lo visualizzi invertendo l’ordine
delle cifre.
Doppio ciclo
61) Far visualizzare la tavola pitagorica fino ad un numero N assegnato.
62) Far visualizzare i primi n numeri primi (può essere utilizzato il programma per controllare se un
numero è primo oppure no).
63) Far calcolare X elevato a N utilizzando solo addizioni (si possono utilizzare i programmi per
fare la potenza e la moltiplicazione).
64) Far visualizzare tutti gli elementi della serie di Fibonacci (vedi esercizio 54) che siano anche
numeri primi (composto dai due programmi Fibonacci + controllo numeri primi).
65) Scomporre un numero qualsiasi in fattori primi.
66) Assegnata una frazione A/B qualsiasi ridurla ai minimi termini
67) Cercare e far visualizzare tutti i numeri perfetti minori o uguali ad un numero N dato in input. I
numeri perfetti sono quelli per i quali la somma dei divisori (escluso il numero considerato) è
uguale al numero stesso, per esempio 6 (6=1+2+3) oppure 28 (28=1+2+4+7+14).
68) Scrivere un programma che faccia funzionare un computer come un registratore di cassa. Deve
permettere di inserire i prezzi dei prodotti acquistati da ciascun cliente e stampare lo scontrino.
A fine giornata deve visualizzare il totale incassato, il numero degli scontrini emessi, l'importo
delle vendite diviso per quattro categorie merceologiche: Alimentari, Detersivi, Salumeria,
Altro.
69) Assegnato N far visualizzare tutti i numeri primi minori di N che fanno parte della serie di
Fibonacci.
70) Far leggere una serie di numeri in input e fare la media solo dei numeri primi.
71) Far generare tutte le possibili combinazioni di risultati di 4 partite di calcio. (es; 1111, 111X,
1112, 11X1, 11XX, 11X2, 1121 ecc. Si tratta delle permutazioni con ripetizione di 3 elementi a
4 a 4. Si può, per esempio, usare il sistema di num. ternario incrementando una variabile e
trasformandola in ternario).
Risposte esercizi
Esercizio 18):
Esercizio 19)
a) dopo >> ci deve essere una variabile e non un’espressione
b) dopo cout è permesso solo l’operatore <<
c) Il linguaggio C++ è case sensitive, FOR non è la stessa cosa di for, inoltre per
separare l’istruzione di inizializzazione dalla condizione e dall’istruzione di
incremento bisogna usare il punto e virgola (;) e non la virgola.
d) manca il punto e virgola finale
Ciclo
N° di volte
Valore di i
a)
5
10
b)
4
12
c)
1
10
d)
3
-5
Esercizio20)
A
B
C
10
20
-110
-10
-20
-30
5
4
101
60
-10
70
Esercizio 21): scrive su video tutti i numeri dispari minori di 50.
Esercizio 22) esatta d)
Esercizio 23)
a)
b)
c)
d)
for (int i=1; i<7;i++) cout << i %5<<’ ‘; …1 2 3 4 0 1 ……….…….
for (int i=1; i<7;i++) cout << i*2-1 <<’ ‘; ………………1 3 5 7 9 11 …………………………..
int i=10; do {cout << i<<’ ‘; i -=5;} while (i>0); …………10 5……………………………………
int j=5,i=5; while(i>0) {cout << j <<’ ‘; if (i%2) j +=i else j-=i; i--;} …5 10 6 9 7……………….. .
Esercizio 24) esatta d): il tipo double ha una rappresentazione interna in binario virgola mobile e un
numero con la virgola tipo 1/50 potrebbe diventare periodico quando viene trasformato in binario anzi 1/50 è periodico in binario perché non danno luogo a numeri binari periodici solo le frazioni
che si possono rappresentare con un denominatore che è una potenza del 2 - e quindi ha infinite
cifre per cui non può essere rappresentato esattamente, questo significa che sommando 50 volte
1/50 scritto in binario in maniera non esatta, probabilmente non otterremo 1 e quindi il ciclo
potrebbe non finire mai perché non si verifica mai la condizione i=1.0 che fa terminare il ciclo.
Esercizio 40) Il cuore del programma per trovare il MCD potrebbe essere il seguente:
if (A < B) {r=A; A=B; B=r;} // ordina i due numeri
r=A%B; while (r > 0) {A=B; B=r; r=A%B;}
MCD = B;
Esercizio 46) Il programma potrebbe essere il seguente:
int main(){
short int scelta=0;
/* ripete la visualizzazione del menù fino a quando non si sceglie la
funzione FINE */
do {
// visualizza il menù
system("CLS"); // cancella la finestra di output
cout << endl << "\t\tPossibili scelte" << endl;
cout << "\t\t1) Funzione 1"<< endl;
cout << "\t\t2) Funzione 2"<< endl;
cout << "\t\t3) Funzione 3"<< endl;
cout << "\t\t4) Funzione 4"<< endl;
cout << "\t\t5) Fine"<< endl;
cout << "\n\n\t\t\tQuale Scegli (1-5)?" ;
cin >> scelta; // chiede la scelta
// visualizza messaggio di errore se la scelta non è valida
if (scelta <1 || scelta > 5) {
cout << "\n\t\tErrore! Inserire un numero da 1 a 5!\n";
system("PAUSE");
} else {
// esecuzione della funzione corrispondente
switch (scelta) {
case 1: cout <<"E' stata scelta la funzione 1\n"; break;
case 2: cout <<"E' stata scelta la funzione 2\n"; break;
case 3: cout <<"E' stata scelta la funzione 3\n"; break;
case 4: cout <<"E' stata scelta la funzione 4\n"; break;
}
if (scelta < 5) system("PAUSE");
}
} while (scelta != 5);
return 0;}
Esercizio 51) Si può sfruttare la compatibilità tra il tipo di dati char e il tipo int più il fatto che
l’istruzione cout visualizza una variabile char come carattere e una int come numero. Il programma
potrebbe essere il seguente:
int i; char x;
for (i=1; i<=255; i++) {x = i; cout << i << '=' << x << '\t';}
cout << endl;