Pembahasan OSK Komputer 2013 Part 2 [Programming]

Saya  lanjutkan untuk membahas soal OSK Komputer 2013. Namun saya akan membahas bagian programming terlebih dahulu. ( No 31- 46)

31. Perhatikan fungsi dari potongan program berikut!

function panggil1(x:longint):longint;
begin
   if (x<3) then panggil1:=0
   else panggil1:=panggil1(x-1)+2*panggil1(x-2)+3;
end;

Bila fungsi di atas dipanggil dengan panggil1(7), maka hasil keluarannya adalah:

Solusi : Fungsi panggil1 disingkat fungsi p.

p(7) = p(6) + 2*p(5) + 3 = 30 + 2*15 + 3 = 63
p(6) = p(5) + 2*p(4) + 3 = 15 + 2*6 + 3 = 30
p(5) = p(4) + 2*p(3) + 3 = 6 + 2*3 + 3 = 15
p(4) = p(3) + 2*p(2) + 3 = 3 + 2*0 + 3 = 6
p(3) = p(2) + 2*p(1) + 3 = 0 + 2*0 + 3 = 3
p(2) = 0
p(1) = 0

Maka panggil1(7) = 63.

32. Perhatikan fungsi dari potongan program berikut!

function sikat(x,y:longint):longint;
begin
   if (x>=y) then sikat:=x
   else sikat:=3*sikat(x+1,y)+2*sikat(x,y-1);
end;

Bila fungsi di atas dipanggil dengan sikat(1,3), maka hasi keluarannya adalah:

Solusi : Fungsi sikat disingkat fungsi s

s(1,3) = 3 * s(2,3) + 2 * s(1,2) = 3 * 13 + 2 * 8 = 55
s(2,3) = 3 * s(3,3) + 2 * s(2,2) = 3 * 3 + 2 * 2 = 13
s(3,3) = 3
s(2,2) = 2
s(1,2) = 3 * s(2,2) + 2 * s(1,1) = 3 * 2 + 2 * 1 = 8
s(1,1) = 1

Maka sikat(1,3) = 55.

33. Perhatikan potongan program di bawah ini!

function hitung(n:integer):integer;
begin
   if(n=0)then hitung:=0
   else hitung:=hitung(n div 5) + (n mod 5);
end;

Berapa nilai dari hitung(2903)?

Solusi : Fungsi hitung disingkat fungsi h

h(2903) = h(580) + 3 = 8 + 3 = 11
h(580) = h(116) + 0 = 8 + 0 = 8
h(116) = h(23) + 1 = 7 + 1 = 8
h(23) = h(4) + 3 = 4 + 3 = 7
h(4) = h(0) + 4 = 0 + 4 = 4
h(0) = 0

Maka hitung(2903) = 11

34. Perhatikan fungsi di bawah ini!

function wow(n:integer):integer;
var
res, i, cnt : integer;

begin
  res:=1;
  for i:=2 to n do
    if(n mod i = 0) then begin
      cnt:= 0;
      while (n mod i = 0) do
      begin
        n:=n div i;
        cnt:= cnt+1;
      end;
      res:=res*(cnt+1);
    end;
    wow:=res;
end;

Solusi : Jika diperhatikan dengan saksama, program ini merupakan program mencari banyaknya faktor sebuah bilangan. Maka kita bisa melihat langsung dari pilihan

A. 32 = 2^5, mempunyai 6 faktor
B. 512 = 2^9, mempunyai 10 faktor
C. 1000 = 2^3 * 5^3, mempunyai 4 * 4 faktor = 16 faktor
D. 48 = 2^4 * 3, mempunyai 5 * 2 faktor = 10 faktor
E. 38 = 2 * 19, mempunyai 2 * 2 faktor = 4 faktor

Maka, n minimum agar wow(n) bernilai 10 adalah D. 48

35.

var
  head, tail, x : integer;
  stek: array [1..100] of integer;
function pop():integer;
begin
  if (head = tail) then
    pop := -1
  else
  begin
    pop := stek[head];
    head := head + 1;
  end;
end;

begin
  stek[3] := 5;
  stek[2] := 3;
  stek[4] := 7;
  stek[1] := 1;
  stek[5] := 9;
  head := 1;
  tail := 6;
  pop();
  for x := 1 to 3 do writeln( pop() );
  pop();
end.

Jika program tersebut dijalankan, maka pada layar akan tampil:

Solusi : Bisa dilihat bahwa array[1..5] isinya adalah [1,3,5,7,9]. Pada fungsi pemanggilan pertama pop dijalankan, maka nilai head telah menjadi 2, sehingga pada variabel for angka yang dicetak adalah angka pada array ke 2 sampai array ke 4 yaitu : 3,5,7.

36. Diberikan potongan program berikut:

pop();
for x := 1 to 3 do writeln( pop() );
pop();

jika potongan program tersebut diganti dengan

for x := 1 to 3 do
if (pop() <> -1) then writeln( pop() );

berapakah outputnya sekarang?

Solusi : Dapat dilihat di sini bahwa pada setiap perulangan, fungsi pop dijalankan dua kali, jadi yang akan dicetak adalah array ke 2, array ke 4, dan array ke 6. Yaitu : 3,7,-1. Array ke 6 berisi 1 karena head = tail.

Program berikut ditujukan untuk soal no. 37 dan 38

function Bunga(x: longint):longint;
var
  i, Bungai : longint;
begin
  if (x = 0) then Bunga := 1
  else
  begin
    Bungai := 0;
    for i := 0 to x-1 do
      Bungai := Bungai + Bunga(i);
    Bunga := Bungai;
  end;
end;

37. Berapakah hasil dari Bunga(3)?

Solusi :
Dari sini bisa dilihat bahwa : Bunga(0) = 1, Bunga(1) = 1, Bunga(2) = Bunga(1) + Bunga(0) = 2. Maka sudah jelas bahwa Bunga(3) = Bunga(2) + Bunga(1) + Bunga(0) = 2 + 1 + 1 = 4.

38. Berapakah hasil dari Bunga(21)?

Solusi :
Jika diteruskan dari pola di atas maka didapat Bunga(4) = 4+2+1+1 = 8. Kita bisa melihat bahwa hasil dari Bunga(n) = 2 ^ (n-1). Maka hasil dari Bunga(21) = 2 ^ 20 = 1048576.

Program berikut untuk no. 39 s.d. 41

var
  x,y,temp,dare,num1,num2 : integer;
begin
  readln(x,y);
  num1:=x;
  num2:=y;
  dare:=0;
  temp:=1;
  while(num1 or num2 >0) do
  begin
    if(num1 mod 2 + num2 mod 2 = 1) then
      dare := dare + temp
    else
      dare := dare + ( (num1 mod 2 + num2 mod 2) * temp );
    num1 := num1 div 2;
    num2 := num2 div 2;
    temp := temp * 2;
  end;
  writeln(dare);
end.

39. Apabila program di atas diberi masukan 16 8, berapakah output yang dihasilkan oleh
program di atas?

Solusi : Kita buat tabel untuk membantu pencarian kita

num1 num2 temp dare
16 8 1 0
8 4 2 0
4 2 4 0
2 1 8 0
1 0 16 0+8
0 0 32 8+16

Didapat hasil akhir dare = 24.
Dari sini juga didapat bahwa program ini bertujuan untuk menjumlahkan dua buah bilangan.

40. Apabila nilai x = 120 dan nilai y = 30 berapakah output yang dihasilkan oleh program di atas?

Solusi : Program ini menjumlahkan x dan y. 150 + 30 = 180

41. Apabila kita perhatikan potongan program di atas adalah potongan program?

Solusi : Menjumlahkan 2 buah bilangan bulat positif

42. Diberikan potongan program berikut ini!

const
  M=100;
var
  x,i,n,h:longint;
  A:array[1..M] of boolean;
  B:array[1..M] of longint;
begin
  for i:=1 to M do
    A[i]:=true;
  n:=0;
  for i:=2 to M do
  begin
    if A[i] then
    begin
      n:=n+1;
      B[n]:=i;
      h:=i;
      while h<M do
      begin
        h:=h+i;
        if h<=M then A[h]:=false;
      end;
    end;
  end;
  readln(x);
  writeln(B[x]);
end.

Berapakah hasil program di atas apabila x = 10?

Solusi : Program ini, bertujuan untuk mencari bilangan prima ke x, menggunakan cara Sieve Of Eratosthenes. Maka yang dicetak adalah bilangan prima ke 10, yaitu 29.

43. Diberikan potongan program berikut ini:

var
  A: array[1..5] of longint = (1, 2, 3, 4, 5);
  i, j, t: longint;
begin
  for i := 1 to 5 do
    for j := 1 to i do begin
      t := A[i] xor A[j];
      A[i] := t xor A[i];
      A[j] := t xor A[i]
   end;
  for i := 1 to 5 do begin
    if (i <> 1) then write(' ');
    write(A[i])
  end;
  writeln;
end.

Apa hasil dari program tersebut?

Solusi : Inti dari program ini adalah swap, jadi program ini bertujuan untuk menukar dua buah bilangan. Maka hasil yang akan dicetak adalah hasil yang terbalik dari semula yaitu 5 4 3 2 1.

Program berikut ditujukan untuk soal no. 44 dan 45

var
  data : array[1..10] of integer = (3,9,2,6,1,4,7,8,5,10);
procedure kambing(m : integer);
begin
  if (m<=10) then
  begin
    kambing(m*2);
    write(data[m],’ ’);
    kambing(m*2+1);
  end;
end;

44. Output yang dihasilkan jika dilakukan pemanggilan kambing(1) adalah ….

Solusi :
Program kambing(1) memanggil kambing(2).
Kambing(2) memanggil Kambing(4)
Kambing(4) memanggil Kambing(8)
Kambing(8) memanggil Kambing(16)
Kambing(16) tidak diproses.
Cetak array ke-8 Yaitu 8.
Kambing(8) memanggil kambing(17)
Kambing(17) tidak diproses.
Kembali ke kambing(4)
Cetak array ke-4 yaitu 6.

Dari sini saja sudah terlihat bahwa satu-satunya jawaban yang sesuai dengan pilihan adalah option D. D. 8 6 5 9 10 1 3 4 2 7. Maka jawabannya adalah D.

45. Agar output yang dihasilkan terurut menaik setelah pemanggilan kambing(1), maka array
data harus berisi ….

Solusi : Kita perlu mengecek urutan dari array tersebut. Agar terurut, array ke delapan haruslah angka 1. Dan hanya ada satu pilihan jawaban yaitu A. Jadi jawabannya adalah A. (7,4,9,2,6,8,10,1,3,5).

46. Diberikan potongan program berikut ini:

i := 0;
while (x>1) do
  begin
  if (x mod 2 = 1) then
    x := 3*x+1
  else
    x := x div 2;
  inc(i);
end;
writeln(i);

Jika x = 13, maka output dari program di atas adalah ….

Solusi : Untuk mempermudah buat tabel

Nilai x Nilai i
13 0
40 1
20 2
10 3
5 4
16 5
8 6
4 7
2 8
1 9

Potongan kode program berikut ini digunakan untuk soal no 47-49

function abc(a:integer) : integer;
begin
  abc :=a*3-(a mod 7);
  {a}
end;
function ghi(x:integer;b:integer):integer;
begin
  if (b=1) then
    ghi := x
  else
    ghi := (x* ghi(x,b-1)) mod 100;
end;
function def(a:integer; b:integer) : integer;
begin
  if (b mod 2 = 1) and (b>500) then
    def := ghi(a,b) mod 100
    {b}
  else
    def:=def(a, abc(b)) ;
end;

47. Berapakah hasil dari pemanggilan fungsi def(7,100) ?

Solusi : Di sini, kita bisa lihat fungsi ghi merupakan sebuah fungsi perpangkatan ( x ^ b ).
Def(7,100) = def(7,298) = def(7,890) = def(7,2669).
def(7,2669) = ghi(7,2669)
Maka hasil def(7,100) = ghi(7,2669) = 7 ^ 2669 mod 100 = 7.

Kita bisa melihat bahwa pada perpangkatan 7 terdapat pola unik
7^0 = 1
7^1 = 7
7^2 = 49
7^3 = 343
7^4 = 2401
7^5 = 16807 (berulang)

Perulangan terjadi setelah 4 kali. Maka 2669 mod 4 = 1. Maka 7 ^ 2669 mod 100 = 7 ^ 1 mod 100 = 7.

48. Apabila bagian (a) diubah menjadi abc := a*2 (a mod 5), maka berapakah hasil pemanggilan fungsi def(7,151)?

Solusi : def(7,151) = def(7,301) = def(7,601) = ghi(7,601) = 7^601 mod 100 = 7.

49. Apabila bagian (b) diubah menjadi def := ghi(a,b) mod 10, maka berapakah hasil pemanggilan
fungsi def(3,30)?

Solusi : def(3,30) = def(3,88) = def(3,260) = def(3,779) = ghi(3,779) = 7

Sebenarnya nomor 47-49 lucu, jawabannya 7 semua :v wkwkwk

50. Diberikan potongan kode program berikut ini

function tebak_angka(x,y: integer): integer;
begin
  if x  y then begin
    tebak_angka := tebak_angka(y,x);
  end else begin
    tebak_angka := tebak_angka(x, y-(x mod 5)-1);
  end;
end;

Apakah outputnya jika perintah writeln(tebak_angka(18,30)) dipanggil?

Solusi : Fungsi tebakangka disingkat fungsi t
t(18,30) = t(18,26) = t(18,22) = t(18,18) = t(18,14) = t(14,18) = t(14,13) = t(13,14) = t(13,10) = t(10,13) = t(10,12) = t(10,11) = t(10,10) = t(10,9) = t(9,10) = t(9,5) = t(5,9) = t(5,8) = t(5,7) = t(5,6) = t(5,5) = t(5,4) = t(4,5) maka tebakangka = 5.

Maka tebakangka(18,30) hasilnya adalah 5.

Semoga pembahasan ini bisa membantu kita semua. Semoga sukses untuk OSK nanti ^^

Advertisements

About Josua Aditya Mustiko

KnightSaber77 ~

Posted on March 22, 2014, in Uncategorized and tagged , , . Bookmark the permalink. 6 Comments.

  1. soal lanjutan dari 21-30 nya kapan kira kira di posting ya?? tertarik ngebaca cara cara nya…. 🙂

  2. gan mau nanya nih.
    soal no 49. kenapa ghi(3,779) hasilnya 7 bukan 3?
    bukannya ghi:= x
    bs tlg di jabarkan? mksh sblmnya

    • If b=1 then ghi:=x
      Jadi itu artinya gak semua ghi itu x, tapi kalau parameter ghi nya = 1. Nah inti dri function ghi itu sendiri jika diperhatikan adalah fungsi pemangkatan. Jadi yang dicari adalah 3^779 mod 10 = 7

      Kurang lebih penjelasannya gitu :3

  3. kak mw tanya soal no 31, yang hasilx p(7) = p(6) + 2*p(5) + 3 = 30 + 2*15 + 3 = 63,
    angka 30 itu dari mana kak? mhon bantuanx trims

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: