Si consideri la seguente funzione
int ES1(int a, int b) { int j; int k=1; int p=0; while(k <= a) { k++; j=0; while(j < b) { j++; p=p+j; } } return 2*p/b; }Dire cosa calcola la funzione nell'ipotesi che a e b siano sempre positivi e che il programma non generi mai un overflow durante le operazioni aritmetiche.
Risposte:
- a*b
- a*(b+1)
- (a+1)*(b-1)
- nessuna delle precedenti.
Soluzione: b (a*(b+1))
Considera la chiamata ES1(1,1) e osserva i valori assunti dalla variabili
- a=1, b=1
- k=1, p=0
- (1 <= 1) ?
- k=2, j=0
- (0 < 1) ?
- j=1, p=1
- (1 < 1) ? NO
- (2 <= 1) ? NO
- ES1=2*1/1=2
Il valore ottenuto soddisfa la risposta b.
Considera la chiamata ES1(2,1) e osserva i valori assunti dalla variabili
- a=2, b=1
- k=1, p=0
- (1 <= 2) ?
- k=2, j=0
- (0 < 1) ?
- j=1, p=1
- (1 < 1) ? NO
- (2 <= 2) ?
- k=3, j=0
- (0 < 1) ?
- j=1, p=2
- (1 < 1) ? NO
- (3 <= 2) ?
- ES1=2*2/1=4.
Il valore ottenuto soddisfa la risposta b.