Olimpiade Sains Kota (OSK) 2009 - Komputer , Nomor 41 - 47

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;
41

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

42

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

43

Setelah pemanggilan adukaduk sebanyak 20 kali berapakah harga variable ctr?

A. 200

B. 100

C. 34

D. 25

E. 10

44

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

45

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

46

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

47

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.