Deskripsi Untuk Soal Nomor 41 dan 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.
Lazy Person
"...berisikan 15 elemen array dengan indeks dari 0, 1, ... 9.". Bagian ini sepertinya typo yang seharusnya 10 elemen array.
Langsung saja, pertama-tama, modelkan dahulu kodenya agar mudah dibaca.
Kondisi Awal
ctr = 0
Prosedur tx(a, b)
ctr := ctr + 1, atau ctr + 1
Atau sederhananya, prosedur tx(a, b) akan menukar elemen a dan b dari himpunan .
Selain itu, ctr ditambahkan dengan 1.
Prosedur adukaduk
Prosedur cetak(i)
Nomor 41
Kita diminta untuk menjalankan prosedur adukaduk sebanyak dua kali. Berdasarkan pemodelan kode di atas, kita tahu bahwa adukaduk akan memindahkan bilangan terbesar ke sebelah kanan hingga tidak ada lagi yang lebih besar darinya.
Kondisi awal,
Lakukan adukaduk pertama, sehingga .
Lihat, 9 berpindah hingga ke posisi sebelum 10 (sebelumnya 10 ada di index ke-3).
Kemudian, 10 pindah hingga ke ujung himpunan karena tidak ada lagi bilangan yang lebih besar darinya.
Lakukan adukaduk kedua, sehingga .
Jadi, jawabannya adalah B.
Nomor 42
Kita sudah melakukan dua kali adukaduk di nomor 41. Untuk adukaduk yang ke-3, pindahkan saja angka 1 di index ke-1 karena angka 5 berpindah ke kanan.
Untuk adukaduk yang ke-4, kita pindahkan angka 2 ke kanan. Dan, ya! Angka satu sudah ada di .
Untuk penukaran nilainya dapat dilihat di nomor 43.
Jadi, jawabannya adalah 4.
Nomor 43
Variabel ctr akan bertambah 1 apabila terjadi penukaran nilai.
Kondisi awal .
Untuk adukaduk pertama, . Ada 8 kali penukaran nilai.
Untuk adukaduk kedua, . Ada 7 kali penukaran nilai.
Untuk adukaduk ketiga, . Ada 6 kali penukaran nilai.
Untuk adukaduk keempat, . Ada 3 kali penukaran nilai.
Untuk adukaduk kelima, . Ada 1 kali penukaran nilai.
Tidak akan ada lagi penukaran nilai karena himpunan sudah terurut.
Sehingga, jawabannya adalah 8 + 7 + 6 + 3 + 1 = 25.
Nomor 44
Not sure. Mungkin di lain kesempatan.
Nomor 45
Saya kurang mengerti kenapa ada "? ,," di dalam write(). Tapi, berdasarkan kodisi if (i >= 0) dan ada rekursi write(i - 1), maka sudah dipastikan fungsi ini mencetak dari belakang.
Jadi, jawabannya seharusnya C. Saya lihat angka 9 tidak ada di C. Mungkin karena lupa ditulis.
Nomor lainnya mungkin di lain waktu.
Masuk untuk menulis jawaban