Cosa stampa il seguente programma?
Program Test(Input, Output); Type vett = Array[0..9] Of Integer; Var i, f, a, b: Integer; arr : vett; Function funzione1(arr: vett): Integer; Var i: Integer; Begin i:=1; While(arr[i] <> -1) Do i:=i*2; funzione1:=i; End; Function funzione2(arr: vett; f: Integer; k: Integer): Integer; Var i, m, temp: Integer; Begin i:=0; m:=0; temp:=-1; While(i <= f) Do Begin m:=(i+f) Div 2; If(arr[m] = k) Then temp:=m; If((arr[m] = -1) Or (arr[m] > k)) Then f:=m-1 Else i:=m+1; End; funzione2:= temp; End; Begin For i:=0 To 9 Do arr[i] := -1; arr[0]:=1; arr[1]:=2; arr[2]:=4; arr[3]:=8; f:=funzione1(arr); a:=funzione2(arr, f, 4); b:=funzione2(arr, f, 7); Writeln("a=", a, ",b=", b); End.
Risposte:
- a=2, b=4
- a=2, b=-1
- a=-1, b=4
- a=-1, b=-1.
Soluzione: b.
Soluzione
Il programma principale chiama la funzione1 passando come unico parametro l’array arr.
All’ingresso della funzione avremo che la variabile i ad ogni ciclo while viene moltiplicata per 2, assumendo quindi i valori 2, 4, 8,…
Dal while si esce quando arr[i] vale -1, quindi quando i vale 4, che è il valore restituito.
Quindi ora f = 4.
Viene ora effettuata la chiamata: a:=funzione2 (arr, f, 4).
funzione2 riceve i parametri in arr, f, k, quindi avremo, al suo ingressoarr = {1,2,4,8,-1,-1,-1,-1,-1,-1}
i = 0
f = 4
k = 4la condizione di ingresso nel while (i<=f) è vera, quindi viene calcolato
m = (i+f)/2 = (0+4)/2 = 2ora arr[m] = k è vera, quindi la funzione termina restituendo m, cioè 2.
Ora nel programma principale avremo:a = 2
f = 4Viene effettuata la chiamata: b:=funzione2 (arr, f, 7)
In funzione2:i = 0
f = 4
k = 7la condizione di ingresso nel while (i<=f) è vera, quindi viene calcolato:
m = (i+f)/2 = (0+4)/2 = 2ora (arr[m] = k) e ((arr[m] = -1) or (arr[m] > k)) sono false, e viene calcolata i = m+1 = 3 quindi ora
i = 3
f = 4
k = 7
m = 2(i<=f) è ancora vera, quindi viene calcolato:
m = (i+f)/2 = (3+4)/2 = 3 (essendo m un integer)
i = 3
f = 4
k = 7
m = 3ora ((arr[m] = -1) or (arr[m] > k)) è vera, essendo vera arr[m] > k, quindi f = m-1 = 3-1 = 2
i = 3
f = 2
k = 7
m = 3(i<=f) è diventata falsa, il ciclo while non viene più eseguito e si esce dalla funzione restituendo -1.
a = 2
b = -1sono i valori delle variabili del programma principale che vengono visualizzati nell’ordine.