.quickedit{ display:none;

Kamis, 12 Agustus 2010

soal olimpiade komputer


Pertanyaan :
Jika M(x, y) adalah pernyataan “x lebih besar dari y”, dan terdapat deretan perintah dalam pseudo Pascal berikut:
while M(x, y) do
begin
x := x - 10;
y := y + 2;
end;
dengan harga mula-mula x = 70 dan y = 5, berapakah harga y setelah deretan keluar dari loop while?
A. 11
B. 15
C. 17
D. 21
E. 25
Jawab:
OK… akan kita bahasa pertanyaan di atas. Perhatikan bahwa loop while memiliki syarat “x lebih besar dari y”. Sehingga selama syarat tersebut terpenuhi (syarat bernilai TRUE) maka looping akan terus dijalankan. Dan proses looping akan berhenti apabila syarat sudah tidak terpenuhi (bernilai FALSE) Perhatikan jalannya proses berikut ini:
x = 70, y = 5
Cek (x > y) -> (70 > 5) -> TRUE
x = x - 10 = 70 - 10 = 60
y = y + 2 = 5 + 2 = 7
Cek (x > y) -> (60 > 7) -> TRUE
x = x - 10 = 60 - 10 = 50
y = y + 2 = 7 + 2 = 9
Cek (x > y) -> (50 > 9) -> TRUE
x = x - 10 = 50 - 10 = 40
y = y + 2 = 9 + 2 = 11
Cek (x > y) -> (40 > 11) -> TRUE
x = x - 10 = 40 - 10 = 30
y = y + 2 = 11 + 2 = 13
Cek (x > y) -> (30 > 13) -> TRUE
x = x - 10 = 30 - 10 = 20
y = y + 2 = 13 + 2 = 15
Cek (x > y) -> (20 > 15) -> TRUE
x = x - 10 = 20 - 10 = 10
y = y + 2 = 15 + 2 = 17
Cek (x > y) -> (10 > 17) -> FALSE
STOP
Setelah proses looping while selesai, nilai y terakhir adalah 17 (Jawaban yang benar C).
________________________________________
Pertanyaan :
Untuk menukar isi dua variabel integer (keduanya bernama a dan b) tanpa bantuan variabel lain adalah…
A. a := b – a; b := b – a; a := b + a;
B. b := b – a; a := b + a; a := b – a;
C. a := b + a; a := b – a; b := b – a;
D. a := b – a; b := b – a; a := b – a;
E. a := b + a; b := b + a; a := b + a;
Jawab :
Untuk menjawab pertanyaan di atas, kita akan cek terlebih dahulu semua alternatif jawaban. Kita coba untuk pemisalan awal nilai a = 5 dan b = 3. Kita akan mencari jawaban sedemikian hingga hasil akhir dari proses perhitungan menghasilkan a = 3 dan b = 5.
Option A.
a = b – a = 3 – 5 = -2
b = b – a = 3 – (-2) = 5
a = b + a = 5 + (-2) = 3
Jadi a = 3 dan b = 5 (BENAR)
Option B.
b = b – a = 3 – 5 = -2
a = b + a = -2 + 5 = 3
a = b – a = -2 – 3 = -5
Jadi a = -5 dan b = -2 (SALAH)
Option C.
a = b + a = 3 + 5 = 8
a = b – a = 3 – 8 = -5
b = b – a = 3 – (-5) = 8
Jadi a = -5 dan b = 8 (SALAH)
Demikian seterusnya kita cek untuk option D dan E. Untuk option D dan E juga diperoleh hasil yang salah, sehingga jawaban yang benar adalah A
untuk soal 1 -2
y := 10;
x := 0;
for i := 0 to y-1 do
begin
x:=x+ 2 * i;
end;
Writeln (x);
soal:
1. Berapakah output dari program diatas?
a. 112
b. 110
c. 90
d. 72
e. 45
Pembahasan
Program diatas akan mengulang pernyataan x:=x +2*i sebanyak 10 kali dari i = 0 sampai 9.
0 = 0 + 2*0
2 = 0 + 2*1
6 = 2 + 2*2
12 = 6 + 2*3
20 = 12 + 2*4
30 = 20 + 2*5
42 = 30 + 2*6
56 = 42 + 2*7
72 = 56 + 2*8
90 = 76 + 2*9
jadi nilai x yang akan dimunculkan adalah 90.
2. jika baris kelima (x:=x+2*i) diganti dengan x:= x + i
Berapakah output program tersebut?
a. 112
b. 110
c. 90
d. 72
e. 45




Pembahasan:
0 = 0 + 0
1 = 0 + 1
3 = 1 + 2
6 = 3 + 3
10 = 6 + 4
15 = 10 + 5
21 = 15 + 6
28 = 21 + 7
36 = 28 + 8
45 = 36 + 9
jadi output nya adalah 45.
untuk soal no 3
program x;
var
i,j,k,l : integer;
begin
for i:= 1 to 2 do
for j := 1 to 2 do
write (i*j);
end.
Soal:
3. output program diatas adalah?
a. 4
b. 6
c. 9
d. 123246369
e. 1
2
3
2
4
6
3
6
9



Pembahasan:
i * j
1) —> 1 * 1 = 1
2 * 1 = 2
3 * 1 = 3
2) —> 1 * 2 = 2
2 * 2 = 4
3 * 2 = 6
3) —> 1 * 3 = 3
2 * 3 = 6
3 * 3 = 9
karena write jadi hasil yang akan dimunculkan berjejeer ke samping 123246369.
Soal:
Perhatikan algoritma berikut:
Procedure geser(i: integer);
begin
i := (((i shl 4) shr 6) shl 2);
writeln(i);
end;
Apakah output dari pemanggilan geser(9) di atas?
Pembahasan:
i = 910 = 10012
i shl 4 = 100100002
(i shl 4)shr 6 = 102
((i shl 4)shr 6)shl 2 = 10002 = 810
Jadi output program diatas adalah 8
Soal:
Perhatikan algoritma berikut:
function ABC (a, b : integer) : integer;
var
hasil : integer;
begin
if (a mod b = 0) then ABC := b
else ABC := ABC(a, b-1);
end;
Berapakah hasil ABC(12, 4)?

Pembahasan:
Fungsi ABC mengembalikan nilai b jika a merupakan kelipatan b (a mod b = 0). Jika b bukan faktor dari a, maka fungsi ini akan memanggil dirinya kembali dengan parameter ABC(a,b‐1). Tampak bahwa fungsi ABC akan mengembaikan nilai faktor terbesar dari a yang kurang dari atau sama dengan b. Maka hasil ABC(12,4) adalah 4.
Soal:
Diberikan penggalan program berikut :
procedure jalan(n: integer);
begin
if n > 0 then begin
jalan(n div 5);
write(n mod 5 + 1);
end;
end;
Pada pemanggilan jalan(49) pada procedure di atas ini apa yang akan dicetaknya kemudian?
Pembahasan:
perhatian dengan baik program tersebut, jika nilai n tersebut lebih besar dari nol maka statmen dibawahnya akan di jalankan. karena terdapat begin … end di bawahnya jadi 2 statmen di antara begin .. end akan di jalankan.
begin
jalan(n div 5);
write(n mod 5 + 1);
end;
jalan(49) :
- jalan(9)
‐ jalan(1)
‐ jalan(0)
‐ write(2)
‐ write(5)
- write(5)
Jadi, yang akan tercetak adalah 255



Soal:
Jumlah dua digit pertama dari bilangan hasil perkalian
5 30003 x 8 10004 Adalah…
Pembahasan:
Untuk memecahkan soal seperti diatas mencari digit pertama, kita harus sederhanakan bentuk pangkat tersebut agar menjadi bilangan tertentu di kaliakan 10 pangkat banyak.
lebih jelasnya mari kita sederhanakan :
5 30003 x 8 10004 = 5 30003 x (23) 10004
= 5 30003 x 23×10004
= 5 30003 x 230012
= 5 30003 x 230003 +9
= 5 30003 x 230003 x 29
= (5 x 2)30003 x 29
= 1030003 x 29
= 29 x 1030003
= 512 x 1030003
perlu di ingat berapapun 10 dipangkatkan dari 1 sampai n hasilnya nol ke n dibelakangnya
induk soal:
c := 0
d := 0
while (a>b) do
begin
a := a – b;
c := c + 1;
d := d + b;
end;
write(c,’,',d);

Soal:
1. jika nilai a = 15, b = 4 maka keluaran dari program diatas adalah..
a. 3 , 12
b. 1 , 4
c. 0 , 0
d. 6 , 23
e. 2 , 8
Pembahasan:
nilai awal a = 15, b = 4, c = 0, d = 0
kondisi a > b
—–>> 15 > 4 (True), maka
a = 15 – 4
= 11
c = 0 + 1
= 1
d = 0 + 4
= 4
—–>> 11 > 4 (True), maka
a = 11 – 4
= 7
c = 1 + 1
= 2
d = 4 + 4
= 8
—–>> 7 > 4 (True), maka
a = 7 – 4
= 3
c = 2 + 1
= 3
d = 8 + 4
= 12
—–>> 3 > 4 (False), maka perulangan dihentikan.
Jadi nilai c = 3, d = 12
Soal:
2. jika nilai a = 34, b = 11 maka keluaran dari program diatas adalah..
a. 3 , 12
b. 1 , 4
c. 0 , 0
d. 6 , 23
e. 2 , 8
Pembahasan:
nilai awal a = 34, b = 11, c = 0, d = 0
kondisi a > b
—–>> 34 > 11 (True), maka
a = 34 – 11
= 23
c = 0 + 1
= 1
d = 0 + 11
= 11
—–>> 23 > 11 (True), maka
a = 23 – 11
= 12
c = 1 + 1
= 2
d = 11 + 11
= 22
—–>> 12 > 11 (True), maka
a = 12 – 11
= 1
c = 2 + 1
= 3
d = 22 + 11
= 33
—–>> 1 > 11 (False), maka perulangan dihentikan.
Jadi nilai c = 3, d = 33



Soal:
Perhatikan algoritma berikut:

function ABC (a, b : integer) : integer;
var
hasil : integer;
begin
if (a mod b = 0) then ABC := b
else ABC := ABC(a, b-1);
end;

Berapakah hasil ABC(12, 4)?
Pembahasan:
Fungsi ABC mengembalikan nilai b jika a merupakan kelipatan b (a mod b = 0). Jika b bukan faktor dari a, maka fungsi ini akan memanggil dirinya kembali dengan parameter ABC(a,b‐1). Tampak bahwa fungsi ABC akan mengembaikan nilai faktor terbesar dari a yang kurang dari atau sama dengan b. Maka hasil ABC(12,4) adalah 4.







Tidak ada komentar:

Posting Komentar