Deskripsi untuk soal nomor 41 - 47
Perhatikan array (larik) berikut. Array tsb adalah array integer bernama X yang berdimensi satu dan berisikan 15 elemen array dengan indeks dari 0, 1, ... 9. Isi dari masing-masing elemen array itu berturut-turut adalah:
I | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
X[I] | 9 | 5 | 2 | 10 | 1 | 8 | 4 | 3 | 7 | 6 |
Serta, diberikan prosedur-prosedur berikut
const ctr: integer = 0;
procedure tx(a,b: integer);
var tmp: integer;
begin
ctr := ctr + 1; tmp := X[a]; X[a] := X[b]; X[b] := tmp;
end;
procedure adukaduk;
var j: integer;
begin
for j := 0 to 8 do if (X[j] > X[j+1]) then tx(j,j+1);
end;
procedure cetak(i: integer);
var j: integer;
begin
for j := 0 to i do write(X[j],' ');
writeln;
end;
Jika setelah prosedur adukaduk dipangil sebanyak dua kali kemudian prosedur cetak(9) dipanggil, maka keluaran yang dicetak adalah:
A. 5 9 10 2 8 1 3 4 6 7
B. 2 5 1 8 4 3 7 6 9 10
C. 5 2 9 1 8 4 3 7 6 10
D. 9 10 5 7 4 3 7 6 2 1
E. 9 5 10 2 8 4 3 7 6 1
Jika pemanggilan adukaduk dilakukan n kali, maka tepat pada harga n berapakah X[0] diisi harga 1 untuk yang pertama kali?
A. 7
B. 5
C. 9
D. 4
E. 8
Setelah pemanggilan adukaduk sebanyak 20 kali berapakah harga variable ctr?
A. 200
B. 100
C. 34
D. 25
E. 10
Jika prosedur adukaduk diganti isinya sebagai berikut
procedure adukaduk;
var i, j, tmp: integer;
begin
for i := 0 to 8 do begin
tmp := i;
for j := i+1 to 9 do
if (X[tmp] > X[j]) then tmp := j;
if (X[i] > X[tmp]) then tx(i,tmp);
end;
end;
Berapakah harga ctr setelah pemanggilan adukaduk 1 kali?
A. 4
B. 7
C. 9
D. 5
E. 8
Jika fungsi cetak(i: integer)
ditulis ulang sebagai berikut.
procedure cetak(i: integer);
begin
if (i>=0) then
begin write(X[i],? „);cetak(i-1) end;
end;
keluaran hasil dari pemanggilan cetak(9)
adalah:
A. 1 6 7 3 4 8 3 10 5
B. 2 5 1 8 4 3 7 6 9 10
C. 6 7 3 4 8 1 10 2 5
D. 5 9 10 2 8 1 3 4 6 7
E. 10 9 8 7 6 5 4 3 2 1
Jika prosedur adukaduk diganti isinya dengan yang berikut ini serta dilengkapi satu procedure tambahan:
procedure pingpong(var left, right: integer);
var tmp: integer;
begin
tmp := X[(left+right) div 2];
while left < right do begin
while X[left] < tmp do left := left + 1;
while tmp < X[right] do right := right – 1;
tx(left, right);
end;
end;
procedure adukaduk(l,r: integer);
var l1, r1: integer;
begin
if (l < r) then begin
l1 := l; r1 := r;
pingpong(l1, r1);
adukaduk(l, r1);
adukaduk(l1, r);
end;
end;
Pemanggilan fungsi adukaduk(0,9)
akan mengakibatkan isi array X:
A. Terurut menurun
B. Teracak (tidak berpola)
C. Tetap seperti semula
D. Semua isinya berharga sama
E. Tidak berbeda hasilnya jika versi adukaduk yang semula dipanggil 6 kali
Mengacu pada pertanyaan no 46 sebelumnya, pada pemanggilan pingpong(left, right)
akan terjadi peristiwa:
A. Membagi array menjadi dua segmen kiri dan kanan dan setiap segmen data menjadi terurut menaik..
B. Seluruh elemen array antara left dan right menjadi terurut
C. Membagi array menjadi dua segmen kiri dan kanan dan setiap elemen array di segmen kiri lebih kecil dari segmen yang dikanan
D. Membagi array menjadi dua segmen kiri dan kanan dan data di kiri dipindah kekanan, dan dari kanan ke kiri.
E. Data dalam array hanya teracak tanpa pola.