Kamis, 22 Februari 2018

Bimbingan Intensif OSK Komputer

Soal OSK 2013
Kunci Jawaban OSK 2013
Pembahasan Soal OSK 2013

Pembahasan Programming OSK 2013

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
num1num2tempdare
16810
8420
4240
2180
10160+8
00328+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 xNilai i
130
401
202
103
54
165
86
47
28
19
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.

Tidak ada komentar:

Posting Komentar