Pembahasan Soal Olimpiade Komputer Provinsi 2005 #1

Sharing is caring!

Pengalaman ketika membimbing siswa-siswa SMA di Karanganyar untuk mengikuti seleksi olimpiade komputer tingkat provinsi Jawa Tengah pada tahun 2007 merupakan sesuatu yang mengesankan. Setelah melihat bentuk-bentuk soal yang diberikan pada tahun-tahun sebelumnya, agak kaget juga karena hampir semua materinya masuk ke dalam kurikulum perkuliahan. Padahal peserta olimpiade ini hanya diperuntukkan bagi siswa kelas 1 dan 2 SMA. Wah.. gimana nih menyampaikan materi bimbingannya? Sempat tidak nyaman juga ketika memberikan bimbingan, tapi… akhirnya dinikmati 🙂

Disamping itu, para pembimbing dan para peserta olimipade harus benar-benar jeli mencermati soal. Terkadang ada soal yang tampaknya sulit karena ada proses looping yang banyak, namun ternyata jawaban yang benar justru adalah ‘Runtime Error’ alias ada kode yang salah atau syntax error. Nah.. jebakan-jebakan seperti inilah yang mesti dicermati.

Selain model soal jebakan, ada juga soal yang memperhatikan pattern. Seolah-olah soalnya amat rumit karena loopingnya sangat banyak, namun setiap looping akan menghasilkan pattern output yang bisa ditebak ketika proses looping selesai sehingga tidak perlu merunut setiap proses iterasi dalam loopingnya.

Dalam postingan ini, saya sedikit share mengenai beberapa soal dan pembahasan yang sempat saya diskusikan dengan para peserta olimpiade tingkat provinsi kemarin. Mudah-mudahan hal ini bisa saya sampaikan secara berseri pada blog ini. Harapan saya, semoga postingan ini bisa bermanfaat bagi para Bapak/Ibu Guru atau pembimbing olimpiade yang membutuhkan referensi mengenai hal ini.

Soal ke-1

Diketahui program Pascal sbb:

const kar = 65;
var i : integer;
begin
   for i := 1 to 5 do
   begin
       kar := kar + 1;
   end;
writeln(ord(chr(kar-3*5)));
end.

Apa output dari program di atas?
a. runtime error
b. 65
c. 0
d. tidak ada output
e. 310

Pembahasan:

Sekilas program di atas agak rumit (sedikit) karena di dalamnya ada looping dan juga main kode ASCII karena adanya function chr() yang digunakan untuk menampilkan kode ASCII dari suatu bilangan bulat. Namun… jawaban yang benar adalah ‘run time error’ (A). Lho kok bisa? Ya… perhatikan identifier bernama ‘kar’. identifier ini berupa konstanta karena dia dideklarasikan dalam ‘const’. Apa akibatnya kalo suatu identifier dideklarasikan sebagai konstanta? Yup… tepat sekali, dia tidak bisa diubah nilainya dalam proses komputasinya (dalam body program). Namun.. coba perhatikan perintah kar := kar + 1; Pada perintah ini jelas tampak bahwa ada perubahan nilai ‘kar’, yaitu nilai ‘kar’ yang baru adalah nilai ‘kar’ yang lama ditambah 1. Nah… hal inilah yang menyebabkan error.

Tips:

Hati-hati dalam mengerjakan soal yang di dalam pilihan jawabannya terdapat ‘runtime error’. Coba cek dulu ada tidaknya rule dalam pemrograman yang dilanggar atau ada tidaknya sintaks yang salah. Jika ada, jangan ragu untuk memilih ‘Runtime Error’. So… tidak usah dikerjakan programnya karena itu menghabiskan waktu pengerjaan.

Soal ke-2

Diketahui potongan program Pascal sbb:

begin
   readln(a);
   for i := 1 to a do bil := bil * i;
   writeln(bil);
end.

Jika diberikan input 5 pada program di atas, maka apa outputnya?
a. tidak ada output
b. 120
c. 5
d. runtime error
e. 0

Pembahasan:

Nah… pada soal di atas ada pilihan jawaban ‘runtime error’. Hati-hati nih… jangan-jangan memang runtime error. Tapi ketika lihat kode Pascalnya tampaknya tidak ada kesalahan rule atau sintaks. Jangan beralasan bahwa variabelnya tidak dideklarasikan, trus menyebabkan error. Pada soal di atas sudah dijelaskan bahwa kode yang ditulis pada soal adalah ‘potongan program’, sehingga anggap saja semua kelengkapan deklarasi termasuk deklarasi variabelnya sudah dituliskan.

Wah berarti kita harus analisis manual nih… Eit tunggu dulu. Coba kita lihat apa yang dioutputkan. Dari perintah writeln(bil); kita tahu bahwa yang dioutputkan adalah nilai dari variabel ‘bil’. Nah.. nilai ‘bil’ ini akan dihasilkan dari proses bil := bil * i dalam looping. Mungkin bayangan Anda nilai ‘bil’ ini akan berubah-ubah untuk setiap kali iterasi dalam looping. Tapi… tunggu dulu, coba Anda perhatikan, ‘adakah nilai awal dari bil sebelum masuk ke looping?’. Hmm… tampaknya tidak ada. Kalau tidak ada, maka dianggap nilai ‘bil’ pertama kali adalah 0. Trus apa akibat hal ini pada perintah bil := bil * i? ya… pasti hasilnya ‘bil’ adalah selalu 0. karena bil = 0 * i, berapapun jumlah iterasinya. So… jawaban yang benar adalah 0 (E).

OK.. untuk sementara itu 2 soal dulu deh pembahasannya. Mudah-mudahan nanti dilanjutin (kalau sempat) 🙂

He..he.. 3x cukup menarik bukan soalnya 🙂

Tinggalkan Komentar