MATERI PEMBINAAN
PRA OLIMPIADE SAINS NASIONAL VII
BIDANG INFORMATIKA
8-14 AGUSTUS 2008
MAKASSAR, SULAWESI SELATAN
DAFTAR ISI ...1 PSEUDOPASCAL...5 A. Pengantar...5 B. Terminologi dan Penjelasan Umum ...5 C. Elemen‐elemen Algoritma dengan Pseudopascal ...6 C.1. Variabel...7 C.2. Perintah...9 C.3. Assignment & Ekspresi ... 10 C.4. Ekspresi Aritmatis... 10 C.5. Ekspresi Lojik... 11 C.6. Struktur kendali aliran... 12 C.7. Algoritma Utama/Fungsi/prosedur ... 13 D. Aturan‐aturan Penulisan Struktur Kendali Aliran... 14 D.1. Struktur begin‐end... 15 D.2. Strktur if‐then... 15 D.3. if‐then‐else... 15 D.4. for‐do... 15 D.5. while‐do ... 16 D.6. repeat‐until... 16 D.7. case‐of‐end ... 16 E. Aturan‐aturan Penulisan Prosedur dan Fungsi... 17 E.1. Prosedur ... 17 E.2. Fungsi... 17 MATERI UJI OLIMPIADE SAINS BIDANG INFORMATIKA... 18 A. Pengantar... 18 1. Olimpiade Sains Nasional... 18 2. International Olympiad in Informatics ... 18 3. Metoda dan Proses Seleksi di OSN... 19 4. Metoda dan Proses Seleksi pra OSN... 19 5. Klasifikasi Soal‐soal Nonprogramming... 19 B. Materi Uji Aritmatika ... 20
1. Mampu Membentuk Model Aritmatika/Matematika serta melakukan deduksi/induksi Model... 20 2. Memahami Sifat‐sifat Bilangan... 20 3. Mengkaitkan dengan Konteks Masalah ... 21 4. Memahami Formula Rekursif... 21 5. Eksplorasi dalam Masalah Kombinatorik ... 21 6. Berpikir secara “Cerdas” ... 22 C. Materi Uji Analitika dan Logika... 23 D. Materi Uji Algoritmika... 25 E. Materi Uji Programming... 31 F. Penutup... 33 DESKRIPSI RINGKAS SITUS TOKI LEARNING CENTER... 34 Tujuan Bahan Ini ... 34 Batasan Aplikasi... 34
Tanya Jawab ... 36 Memilih Soal Pilihan Berganda ... 37 Menjawab Soal Pilihan Ganda... 37 Lembar Jawab Pilihan Ganda ... 38 Pilihan Ganda ... 38 Menu Deskripsi Soal (Untuk mengakses soal) ... 39 Soal Problem Solving (dengan membuat program)... 39 Rekapitulasi Submisi ... 40 Meminta Untuk Dinilai... 40 Forum Diskusi... 40 Ubah Password... 41 Logout ... 41 CONTOH SOAL DAN PEMBAHASAN ... 42 Soal Aritmatika, Analitika dan Logika... 42 Soal Algoritmika... 60 Soal Pemrograman ... 67 Faktorial ... 67 Ulang Tahun... 70 MATERI PJJ PRA OSN 2008... 73 Readln dan Writeln... 73 Contoh Masukan ... 74 Contoh Keluaran ... 74 While Loop ... 75 Contoh Masukan ... 75 Contoh Keluaran ... 75 While Loop + Counter... 76 Contoh Masukan ... 77 Contoh Keluaran ... 77 Menjumlah per Kolom... 78 Contoh Masukan ... 79 Contoh Keluaran ... 79 Menjumlah dalam Satu Baris ... 80 Contoh Masukan ... 81 Contoh Keluaran ... 81 If Then ... 82 Contoh Masukan 1... 82 Contoh Keluaran 1 ... 82 Contoh Masukan 2... 82 Contoh Keluaran 2 ... 82 Contoh Masukan 3... 83 Contoh Keluaran 3 ... 83 If Then, Multi Condition... 84 Contoh Masukan 1... 84 Contoh Keluaran 1 ... 85 Contoh Masukan 2... 85 Contoh Keluaran 2 ... 85 If Then Else... 86
Contoh Masukan 2... 87 Contoh Keluaran 2 ... 87 Contoh Masukan 3... 87 Contoh Keluaran 3 ... 87 Case ... 88 Contoh Masukan 1... 89 Contoh Keluaran 1 ... 89 Contoh Masukan 2... 89 Contoh Keluaran 2 ... 89 Procedure ... 90 Contoh Masukan ... 91 Contoh Keluaran ... 91 Function... 92 Contoh Masukan 1... 94 Contoh Keluaran 1 ... 94 Contoh Masukan 2... 94 Contoh Keluaran 2 ... 94 Var Parameter... 95 Contoh Masukan ... 97 Contoh Keluaran ... 97 Break, Continue, Exit... 98 Contoh Masukan 1... 99 Contoh Keluaran 1 ... 99 Contoh Masukan 2...100 Contoh Keluaran 2 ...100 Operasi String ...101 Contoh Masukan ...102 Contoh Keluaran ...102 Manhattan Distance ...105 Format Masukan...105 Format Keluaran...105 Contoh Masukan ...105 Contoh Keluaran ...105 Floor and Ceiling...106 Format Masukan...106 Format Keluaran...106 Contoh Masukan ...106 Contoh Keluaran ...106 Dua Pangkat...107 Format Masukan...107 Format Keluaran...107 Contoh Masukan 1...107 Contoh Keluaran 1 ...107 Contoh Masukan 2...107 Contoh Keluaran 2 ...107 POLA 1...108 Format Masukan...108
Contoh Keluaran ...108 POLA 2...109 Format Masukan...109 Format Keluaran...109 Contoh Masukan 1...109 Contoh Keluaran 1 ...109 Contoh Masukan 2...109 Contoh Keluaran 2 ...109 POLA 3...110 Format Masukan...110 Format Keluaran...110 Contoh Masukan 1...110 Contoh Keluaran 1 ...110 Contoh Masukan 2...110 Contoh Keluaran 2 ...110 Contoh Masukan 3...110 Contoh Keluaran 3 ...110
PSEUDOPASCAL
Versi Olimpiade Sains Bidang Informatika/Komputer
A.
Pengantar
Mengingat dalam seleksi tertulis Olimpiade Informatika/Komputer algoritma‐ algoritma yang terkait dalam soal‐soal tersebut dituliskan dengan Pseudocode Pascal, atau selanjutnya kita singkat dengan Pseudopascal saja, maka kami merasa perlu untuk mengeluarkan dokumen untuk dijadikan acuan peserta untuk memahaminya. Dokumen ini diharapkan juga menjadi acuan peserta dalam mempersiapkan diri dalam seleksi tersebut maupun para pembina dalam mengarahkan pelatihan siswa‐siswanya.
Bagi pembimbing atau peserta seleksi yang cukup menguasai bahasa pemrograman Pascal, sebagian besar aturan penulisan Pseudopascal merupakan subset dari aturan Bahasa Pascal itu sendiri. Kecuali, ada beberapa hal yang di dalam Bahasa Pascal boleh dilakukan, dalam pseudopascal tidak ada atau tidak disarankan untuk dilakukan. Hal ini untuk memungkinkan kompatibilitas algoritma dengan bahasa lain seperti bahasa C sehingga peserta yang lebih menguasai bahasa selain Pascal dapat cukup mudah untuk memahaminya juga. Jadi berkenaan dengan ini anda tinggal menemukan hal‐hal yang menjadi “pantangan” tersebut.
Mengingat dokumen ini dituliskan lebih untuk acuan maka anda hanya akan menemukan penulisan substansi yang seringkas‐ringkasnya tanpa disertai contoh‐contoh yang memadai. Dalam kesempatan lain, semoga kami dapat menyediakan materi yang lebih sesuai untuk digunakan langsung dalam pembinaan‐pembinaan peserta dalam pemrograman.
B.
Terminologi
dan
Penjelasan
Umum
Untuk memudahkan anda dalam pemaham dokumen ini beberapa terminologi terkait akan dijelaskan. Jika agak berbeda dari yang anda sudah ketahui kami harapkan itu tidak terlalu dipermasalahkan karena hal tersebut bukan tujuan utama dari dokumen ini.
Berikut ini mengenai algoritma
• Algoritma adalah urutan langkah‐langkah sistematis yang terkait pada pemecahan suatu masalah; didalamnya bisa terdapat sejumlah variabel, perintah, ekspresi & assignment, struktur kendali aliran (control flow) dari algoritma, serta definisi fungsi/prosedur.
• Pseudocode adalah suatu cara penulisan algoritma agar ide dan logika dari algoritma dapat disampaikan/diekspresikan.
• Pseudopascal (alias Pseudocode Pascal) adalah pseudocode yang menggunakan (mengadopsi) beberapa notasi Bahasa Pascal berikut struktur penulisan programnya.
Berikut ini mengenai program komputer
• Program komputer atau kita singkat dengan kata program (istilah lainnya code) adalah susunan perintah‐perintah dan operasi‐operasi yang mengimplementasikan algoritma tertentu disertai yang ditulis dalam bahasa pemrograman tertentu.
• Bahasa pemrograman adalah bahasa yang di dalamnya terdapat aturan penulisan program.
• Bahasa Pascal adalah salah satu bahasa pemrograman, dan saat ini terdapat sejumlah versi dari bahasa Pascal diantaranya: Ansi Pascal, Turbo Pascal, Free Pascal, dlsb.
Algoritma yang ditulis dalam suatu pseudocode dibedakan dari programnya yang ditulis dalam suatu bahasa pemrograman akibat adanya perbedaan tujuan dari kedua hal itu. Algoritma dengan pseudocode bertujuan untuk menyampaikan ide dari algoritma bagi pembaca (dalam hal ini peserta seleksi), sementara program dalam suatu bahasa pemrograman untuk dapat dijalankan nantinya oleh komputer. Mengingat komputer “bodoh” maka dalam penulisannya suatu program harus 100% taat pada aturan‐aturan penulisan programnya (istilahnya tidak ada kesalahan sintaks) sementara karena pembaca algoritma adalah manusia maka demi menyederhanakan dan memudahkan pemahaman maka aturan‐aturan penulisannya digunakan secara fleksibel. Terkadang pesudocode dituliskan nyaris sama dengan versi programnya sendiri tetapi kadang‐kadang diringkaskan menggunakan kalimat‐kalimat bahasa manusia (dalam hal seleksi ini adalah bahasa Indonesia) bahkan beberapa bagian sengaja yang bukan fokusnya dihilangkan. Prinsip dalam penulisan pseudocode adalah “tuliskan seringkas‐ringkasnya sejauh tidak mengurangi pengertian dari algoritma yang menjadi fokus pembahasan tersebut.”
Dalam kaitannya dengan materi seleksi, pseudocode yang digunakan adalah pseudopascal berdasarkan kenyataan bahwa notasi‐notasi Bahasa Pascal jauh lebih mudah dipahami daripada notasi bahasa pemrograman populer lainnya saat ini terutama bagi pemula (misalnya bahasa C). Selain itu setiap notasi yang digunakan dijaga untuk selalu berpadanan dengan notasi yang ada dalam bahasa lain tersebut sehingga peserta yang lebih menguasai bahasa selain Pascal tetap dapat memahami ide dari algoritma terkait.
Terakhir, untuk menghindari polemik akan cara‐cara penulisannya, sekali lagi Pseuodopascal yang dimaksud dalam dokumen ini adalah Pseudopascal versi Olimpiade Sains Bidang Informatika/Komputer & TOKI.
C.
Elemen
‐
elemen
Algoritma
dengan
Pseudopascal
Seperti pada terminologi di atas terdapat sejumlah elemen dasar dalam pseudopascal.
• Variabel
• Perintah
• Assignment & Ekspresi
• Fungsi/prosedur • Komentar Sebelum penjelasan masing‐masing komponen itu (di bagian C.1 s.d. C.7) berikut ini suatu contoh algoritma dalam pseudopascal. Algoritma ini tidak berarti apa‐ apa karena hanya ditulis untuk membantu di bagian penjelasan masing‐masing elemen algoritma tsb kemudian.
function kubik(a: integer): integer; begin
kubik := a*a*a; end;
procedure sw(var a: real; var b: real); begin
menukarkan isi a dan b end;
var
status: array[0..99] of boolean; { array 1 dimensi } Tbl: array[0..99,0..1] of integer; { array 2 dimensi } sum: record x,y: real end; { struktur komposit } begin
Proses mengisikan data ke dalam matriks Tbl dan array status sum.x := 0;
sum.y := 0;
for I := 0 to 99 do begin
t0 := (Tbl[I,0] + Tbl[I,1])/2 - I*2;
status[I] := (Tbl[I,0] = Tb l[I,1]) or (sum.x <> sum.y); if (status[I] or status[99-I]) then begin
sum.x := sum.x + kubik(Tbl[I,1] - t0); sum.y := sum.y + kubik(Tbl[I,0] - t0); sw(sum.x, sum.y);
end; end;
Proses pencetakan hargaharga sum.x dan sum.y .... .... end.
C.1.
Variabel
Variabel adalah elemen dari algoritma untuk menyimpan suatu harga tertentu pada suatu saat dan pada saat lain harga dalam variable itu bisa diubah ke harga lain sesuai kebutuhan.
• Suatu variabel dituliskan dengan suatu nama secara unik dan nama variabel dapat terbentuk dengan karakter alfanumeris1 (hanya huruf dan angka) kecuali karakter pertama adalah alfabet. Misalnya:
o Variabel‐variabel dalam contoh di atas bernama sum, Tbl, status, I dan t0.
• Huruf besar dan huruf kecil sama saja (case insensitive2) namun penulisan variabel diharapkan selalu konsisten dalam penggunaan huruf besar/kecilnya.
• Suatu variabel tidak diberikan nama dengan kata yang akan digunakan secara khusus dalam notasi penulisan algoritma (lihat daftar kata reserved word) dengan tujuan untuk menghindari kerancuan arti. Misalnya:
o kata‐kata function, begin, end, for, do, integer, real, var, array, dan boolean di contoh di atas memiliki arti khusus (reserved
word),
• Variabel bisa berbentuk tunggal, komposit, atau bisa juga berbentuk majemuk yang ditandai elemen‐elemennya dengan indeks.
• Variabel berbentuk majemuk atau yang dikenal dengan nama array, harga indeks‐indeks array berkisar dari 0 hingga bilangan positif tertentu3 dan penulisan indeksnya setelah nama variabel tersebut di dalam sepasang kurung siku. Nomor indeks dari array dapat digantikan oleh harga suatu variabel lain dengan menuliskan nama variabel tersebut. Misalnya:
o status[I] menunjukan elemen array status ke I dan harga I sendiri dalam algoritma dapat berubah‐ubah sehingga status[I] mengacu pada berbagai elemen.
• Array bisa berindeks lebih dari satu (disebut berdimensi lebih dari 1) misalnya array dua dimensi dan di dalam tanda kurung siku ada dua harga indeks yang dipisahkan oleh tanda koma4 dengan alternatif sepasang kurung siku tutup & buka5 (“][“). Misalnya:
o status adalah array dengan indeks berkisar dari 0 s.d. 99.
o Tbl adalah array dua dimensi (dengan 2 indeks) yang masing‐ masing indeks memiliki kisaran dari 0 s.d. 99 dan 0 s.d. 1. Penulisan elemen Tbl[i,0] dapat juga diganti dengan Tbl[i][0].
1 Dalam bahasa Pascal selain alfanumeris, sejumlah karakter lain dapat pula digunakan. Disini kita batasi saja hanya alfanumeris.
2 Dalam bahasa C nama variabel case sensitive sementara bahasa Pascal case insensitive
3 Indeks dibatasi demikian untuk menjaga portabilitas (kemudahan untuk diimplementasikan)
dengan bahasa C walaupun dalam bahasa Pascal indeks ini bisa menggunakan banyak cara.
4 Mengikuti aturan dalam bahasa Pascal 5 Mengikuti atuaran dalam bahasa C
• Jika cukup jelas jenis dan penggunaanya maka suatu variabel tidak perlu dideklarasikan6. Jika dideklarasikan maka penulisan mengikuti aturan deklarasi variabel dalam bahasa Pascal yaitu dituliskan di awal program atau di awal fungsi/prosedur. Misalnya:
o Tbl, status dan sum dideklarasikan tetapi I dan t0 tidak.
• Struktur komposit (variabel yang di dalamnya terdiri atas subvariabel7) sedapat mungkin akan dihindari. Seandainya diperlukan maka akan mengikuti aturan penulisan Record dalam bahasa Pascal dan penggunaan komponennya menggunakan aturan dalam bahasa Pascal yaitu nama variabel dan nama subvariabel dituliskan dengan dipisahkan tanda titik.
o Misalnya variabel sum memiliki dua subvariabel yaitu x dan y. Masing0masing bisa dianggap sebagai variabel tersendiri dengan nama sum.x, dan sum.y.
C.2.
Perintah
Perintah adalah satuan operasional dari suatu algoritma maupun algoritma.
• Perbedaannya, perintah‐perintah dalam algoritma bisa dinyatakan dalam kalimat‐kalimat bahasa sehari‐hari sementara untuk program perintah‐ perintah harus bisa “dipahami” dan dijalankan oleh komputer sehingga karena keterbatasan komputer harus mengikuti aturan‐aturan penulisan yang rinci. Misalnya:
o Algoritma contoh di atas berisikan perintah‐perintah yang menggunakan kalimat bahasa Indonesia biasa dan perintah‐ perintah mengikuti aturan penulisan program bahasa Pascal.
• Perintah dalam bahasa sehari‐hari dibedakan dalam font penulisannya dari perintah yang mirip perintah program. Misaalnya:
o dalam algoritma contoh dituliskan dengan huruf miring sementara perintah dengan aturan bahasa pemrograman dengan huruf biasa dan diakhiri tanda “;” (sebagai kebiasaan saja, keduanya menggunakan huruf courier untuk dibedakan dari bagian teks yang lain).
• Kadang‐kadang perintah dalam bahasa sehari‐hari digunakan untuk mewakili sejumlah baris perintah dalam bahasa pemrograman sehingga diharapkan penulisan algoritma tidak terlalu bertele‐tele namun tetap atau bahkan dapat lebih mudah untuk dipahami.
o Misalnya: “Proses mengisikan data ke dalam ….. (dst)” menggantikan sederetan operasi mengenai pengisian Tbl dan ”Proses pencetakan ….” yang menggantikan perintah‐perintah untuk mencetak harga variabel tsb.
6 Deklarasi variabel dilakukan dalam sebagian besar bahasa pemrograman untuk menyatakan
jenis kemungkinan harga yang dapat diisikan padanya, ukuran/dimensi (khusus untuk array), dan scope (bagian‐bagian mana) dari program ia bisa digunakan.
• Sederetan perintah yang tidak menjadi fokus untuk ditampilkan dalam algoritma kadang‐kadang diganti dengan sejumlah baris yang berisi titik‐ titik (“.…”). Misalnya pada contoh di atas pada baris terakhir.
• Notasi‐notasi penulisan perintah mengikuti notasi yang digunakan dalam bahasa Pascal yaitu ada yang bersifat assignment yang diikuti oleh suatu ekspresi atau hanya satu pemanggilan prosedur tertentu.
C.3.
Assignment
&
Ekspresi
Assignment adalah pemberian nilai pada suatu variable yang bisa berupa harga literal8, harga dari variable lain, atau harga yang dihasilkan dari suatu ekspresi. Sementara ekspresi adalah operasi yang akan menghasilkan harga untuk diberikan pada variabel tersebut yang bisa merupakan ekspresi aritmatis maupun atau ekspresi lojik (Lihat Dalam bahasa C, harus diikuti notasi “break;” karena tanpa itu maka alirannya jadi sangat berbeda. C.4 Ekspresi Aritmatis & C.5 Ekspresi Lojik di bagian berikutnya). Aturan dalam penulisan assignment adalah sebagai berikut.
• Aturan penulisannya adalah: nama variabel penerima diikuti tanda assignment “:=”9 selanjutnya nilai atau ekspresi yang menghasilkan nilai. Misalnya:
o “sum.x:=0” artinya variabel sum.x diberi nilai literal 0
o “t0:=(Tbl[I,0]+Tbl[I,1])/2–I*2;” artinya variabel t0 diberi harga hasil ekspresi yang aritmatis di ruas kanan setelah tanda assignment.
C.4.
Ekspresi
Aritmatis
Suatu ekspresi aritmatis berisikan sederetan operasi aritmatis dan jika yang jika dijalankan akan menghasilkan suatu bilangan (integer atau real). Suatu operasi aritmatis terjadi antara dua harga yang akan dioperasikan (disebut operand) dan sebuah operator kecuali untuk operasi unary yang hanya memerlukan satu operand.
• Notasi‐notasi operator arimatis: perkalian (*), pembagian (/), penambahan (+), pengurangan (‐), sisa pembagian (mod), pembagian dengan pembulatan ke bawah (div).
• Jika ekspresi berisi beberapa operasi maka operasi dengan orde tertinggi yang akan dilakukan terlebih dahulu.
• Urutan orde untuk operasi aritmatis mulai dari yang tertinggi hingga terendah adalah: perkalian/pembagian/modulo/divisi, kemudian penambahan/pengurangan (tanda / menyatakan berorde sama).
• Untuk yang berorde sama, urutan operasinya dilakukan dari kiri ke kanan dalam penulisan ekspresi namun jika berpotensi membingungkan kadangkadang urutan bisa dipertegas dengan bantuan tanda kurung dan
8 Harga literal adalah harga‐harga yang pasti misalnya integer 0, 100, ‐33; bilangan real
29.13, 21.41; string “Indonesia Raya”, “Olimpiade sains”.
9 Dalam bahasa C assignment hanya dengan tanda “=” tetapi dalam pascal tanda “=” digunakan
penggunaan tanda kurung memungkinkan bagian operasi yang ada di dalam tanda kurung dilakukan terlebih dahulu. Misalnya:
o ”(Tbl[I,0]+Tbl[I,1])/2–I*2“ akan dilakukan penjumlahan Tbl[I,0] + Tbl[I,1] terlebih dahulu kemudian hasilnya akan dibagi 2 dan dikurangi oleh hasil perkalian antara I and 2.
• Operand‐operand bisa variabel, literal, atau hasil dari pemanggilan fungsi. Misalnya:
o dalam “sum.x+kubik(Tbl[I,1]–t0)” yang terlibat dalam operasi adalah sum.x, dan hasil dari pemanggilan fungsi kubik(Tbl[I,1]–t0) (Penjelasan pemanggilan fungsi ada di bagian fungsi).
• Operasi unary adalah operasi yang hanya berlaku sebagai operasi terkiri dalam ekspresi dengan operator minus (sama dengan pengurangan) dengan cara penulisan: operator mendahului operand. Efek dari operasi ini adalah memperhalikan harga operand di sampingnya itu dengan ‐1. Jika operand berharga positif akan menjadi negatif dan sebaliknya jika berharga negatif menjadi positif.
• Operasi tidak mengubah isi variabel‐variabel yang menjadi operand tersebut kecuali jika ia adalah variabel yang akan menerima hasil operasi tersebut di dalam operasi assignment hasil dari ekspresi (lihat bagian C.3 Assignment & Ekspresi sebelumnya).
C.5.
Ekspresi
Lojik
Suatu ekspresi lojik bisa merupakan salah satu dari berikut ini: (1) satu harga literal lojik, (2) suatu variabel lojik, (3) suatu ekspresi pembandingan harga, (4) operasi lojik dari dua ekspresi lojik atau (5) negasi suatu ekspresi lojik. Keempat dan kelima memungkinkan ekspresi kombinasi yang kompleks.
• Ekspresi pembandingan terdiri atas dua antitas yang akan dibandingkan dan kriteria pembandingannya; penulisan berurutan entitas kiri kriteria pembandingan dan entitas kanan.
• Kriteria pembanding yang dikenali adalah “=” (sama10), “<” (lebih kecil), “>” (lebih besar), “<=” (lebih kecil atau sama dengan), “>=” (lebih besar atau sama dengan), “<>” (tidak sama11).
• Entitas yang akan dibandingkan bisa berupa variabel biasa atau ekspresi aritmatis (ekspresi aritmatis harus dituliskan di dalam tanda kurung!) atau suatu harga literal asalkan kedua entitas yang dibandingkan berjenis harga sama.
• Operasi lojik terjadi antara dua variabel lojik dan atau harga lojik (bisa dari hasil ekspresi pembandingan atau ekspresi lojik lain) dengan suatu operator kecuali jika operasi negasi dianggap sebagai operasi lojik maka ia hanya menggunakan satu operand.
• Operator‐operator lojik yang memerlukan dua operand adalah: and, or, dan xor sementara operator negasi adalah not.
10 Dalam bahasa C tanda pembandingan kesamaan ini dituliskan ganda (“==”) untuk
membedakannya dengan assignment.
• Operator‐operator tsb dijalankan dengan urutan sesuai dengan ordenya: dari yaang tertinggi ke yang terendah, jika sama dari kiri ke kanan dalam ekspresi.
• Urutan orde dari operator‐operator tersebut (dari tertinggi ke terendah): not, and, or/xor (tanda / menyatakan berorde sama).
• Seperti halnya dalam ekspresi aritmatis, tanda kurung dapat digunakan untuk mengatur urutan operasinya. Untuk menambah kejelasan algoritma kadang‐kadang tanda kurung disertakan.
• Hasil ekspresi bisa diassign ke suatu variabel boolean atau bisa juga digunakan dalam perintah kendali aliran (Dibahas di C.6 Struktur kendali aliran).
o Misalnya: dalam “status[I] := (Tbl[I,0] = Tb l[I,1]) or (sum.x <> sum.y)” di ruas kanan terdapat operasi lojik “or” antara dua hasil pembandingan. Pembadingan pertama adalah memeriksa kesamaan dan pembandingan kedua adalah memeriksa ketidaksamaan. Hasil ekspresi ini diberikan ke dalam variabel status[I] (pada posisi berindeks I dari array status).
C.6.
Struktur
kendali
aliran
Struktur kendali aliran adalah suatu bentuk/struktur yang memiliki peranan khusus untuk mengatur aliran urutan pengerjaan operasi atau beberapa operasi tertentu. Terdapat sejumlah bentuk kendali aliran (atau dikenal juga dengan istilah struktur) sebagai berikut (penjelasannya masing‐masing tedapat pada bagian D.1 s.d. D.7):
• beginend
o struktur untuk menjadikan sejumlah perintah atau elemen lain sebagai satu kesatuan
• ifthen
o struktur untuk menjalankan perintah (atau perintah‐perintah jika disatukan dalam struktur beginend) setelah notasi “then” jika ekspresi yang diperiksa (antara notasi “if” dan notasi “then”) berharga boolean “true”.
• ifthenelse
o struktur untuk menjalankan perintah (atau perintah‐perintah jika disatukan dalam struktur beginend) setelah notasi “then” jika ekspresi yang diperiksa (antara notasi “if” dan notasi “then”) berharga boolean “true” dan sebaliknya jika “false” menjalankan perintah (atau perintahperintah jika disatukan dalam struktur beginend) setelah notasi “false”.
• fordo
o pengulangan perintah (atau perintah‐perintah jika disatukan dalam struktur beginend) setelah notasi “do” dengan jumlah pengulangan sejalan dengan perubahan harga iterator yang dinyatakan di antara notasi “for” dan notasi “do”.
• whiledo
o pengulangan (iterasi) perintah (atau perintah‐perintah jika disatukan dalam struktur beginend) setelah notasi “do” selama
ekspresi yang diperiksa (antara notasi “while” dan notasi “do”) berharga boolean “true”. Jika pertama kali diperiksa langsung berharga “false” maka iterasi sama sekali tidak dilakukan
• repeatuntil
o pengulangan (interasi) perintah atau perintah‐perintah antara
notasi “repeat” dan notasi ”until” hingga ekspresi yang diperiksa (setelah notasi “until”) berharga boolean “true”. Jadi minimal satu kali dijalankan.
• caseofend
o jika if‐then‐else adalah pencabangan aliran dengan dua cabang maka struktur ini bisa memiliki pencabangan yang sangat banyak.
• Bentuk‐bentuk kendali tersebut bisa bersarang yaitu suatu bentuk di dalam bentuk yang lain.
o Misalnya: di dalam for I := 0 to 99 do ada beginend; di dalam
begin‐end tsb ada ifthen dan kemudian di dalamnya ada lagi beginend dst.
• Untuk if‐then, if‐then‐else, while‐do, repeat‐until, kriteria pengendalian aliran adalah suatu ekspresi.
o Misalnya dalam “if (status[I] or status[99‐I]) then ...” sebagai ekspresi yang diperiksa adalah hasil operasi lojik antara status[I] dengan status[99‐I] dengan operator lojik “or”.12
C.7.
Algoritma
Utama/Fungsi/prosedur
• Algoritma utama adalah badan utama dari algoritma sebagai analogi program utama dalam program. Namun berbeda dengan program, algoritma bisa jadi hanya merupakan bagian tertentu dari suatu program bahkan bagian dari suatu fungsi/prosedur dari program tsb.
• Fungsi/prosedur adalah sederetan perintah/operasi seperti halnya algoritma itu sendiri yang dipisahkan dari algoritma utamanya guna menjadikannya sebagai subfokus dalam algoritma. Dalam suatu algoritma jika apa yang dikerjakan dalam fungsi/prosedur itu dapat dianggap jelas maka fungsi/prosedur tersebut tidak dituliskan atau digantikan dengan kalimat bahasa sehari‐hari.
• Pascal menyediakan sejumlah fungsi/prosedur yang siap pakai (tanpa pemrogram menuliskan lagi fungsi/prosedur itu), dalam Pseudopascal ini beberapa fungsi/prosedur Pascal tertentu yang sangat umum juga digunakan.
o Misalnya read (untuk membaca masukan), readln (membaca masukan termasuk karakter “end of line”), write (untuk mencetak keluaran), writeln (mencetak keluaran dan suatu “end of line”), eof (untuk memeriksan apakah masukan sudah mencapai “end of file”).
12 Dalam Pascal ekspresi tidak harus dibatasi tanda kurung sementara dalam C harus. Dalam
contoh ini ekspresi tsb dibatasi dengan tanda kurung. Walaupun dalam Pseudopascal tidak diharuskan, untuk situasi tertentu disarankan adanya tanda kurun tsb untuk membantu memperjelas penulisan algoritma.
• Mengikuti definisi Pascal, fungsi dibedakan dari prosedur dari adanya harga yang dihasilkan oleh fungsi sebagai akibat dari pemanggilan/penggunaan fungsi tersebut.
• Suatu fungsi/prosedur bisa didefinisikan dengan sejumlah argumen (istilah lain: parameter). Pada saat pemanggilan fungsi/prosedur yang bersangkutan, argumen ini jika ada dituliskan di dalam tanda kurung setelah nama fungsi/prosedur itu.
• Ada dua jenis argumen: argumen bersifat “call by value” dan argumen “call by reference”. Untuk “call by value” dalam pemanggilannya yang dikirimkan ke fungsi/prosedur adalah harganya sementara “call by reference” yang dikirimkan adalah variabel itu sendiri. Perbedaan kedua argumen ini dinyatakan di daftar argumen di bagian definisi fungsi dengan mengawali nama variabel ybs dengan notasi “var”.
o Misalnya: fungsi kubik di atas memerlukan satu argumen ‘call by value” dan prosedur sw memerlukan dua argumen “call by reference”.
• Untuk “call by value” selain suatu harga literal, harga suatu variabel, bisa juga hasil dari suatu operasi aritmatis atau ekspresi lojik.
o Misalnya “kubik(Tbl[I,1] – t0)” memanggil fungsi kubik dengan argumen adalah harga yang dihasilkan dari operasi “Tbl[I,1] – t0”.
• Khususnya pada pemanggilan fungsi yang akan menghasilkan harga setelah pemanggilan itu dilaksanakan, harga hasilnya itu kemudian menggantikannya di dalam operasi/ekspresi yang bersangkutan.
o Misalnya: dalam “sum.x := sum.x + kubik(Tbl[I,1] – t0)” setelah pemanggilan “kubik(Tbl[I,1] – t0)”, harga yang dihasilkannya beserta harga dalam sum.x dijumlahkan dan hasilnya diassign kembali ke sum.x
• Untuk “call by reference” argumen di bagian yang melakukan pemanggilan hanya dapat berupa variabel saja dan ke variabel itu di bagian fungsi/prosedur jika mengalami perubahan isi (walau dengan nama variabel yang lain), saat kembali ke pemanggil perubahan itu tetap berlaku.
o Misalnya: dalam pemanggilan “sw(sum.x, sum.y)” variabel sw.x dan sw.y saat berada di prosedur sw dengan nama baru a dan b akan dipertukarkan, sehingga saat kembali isi sw.x dan sw.y sudah tertukar.
D.
Aturan
‐
aturan
Penulisan
Struktur
Kendali
Aliran
Secara umum aturan‐aturan penulisan struktur kendali aliran ini mengikuti aturan bahasa Pascal. Seperti hanya Pascal (dan bahasa‐bahasa lain, penulisan notas‐notasi, perintah‐perintah atau ekspresi‐ekspresi tidak harus dibaris tersendiri/tertentu; bisa saja beberapa elemen imi dituliskan bergabung dengan baris yang sama. Namun, demi kejelasan dalam pembacaan algoritma beberapa kebiasaan dilakukan (tapi tidak harus).
• Perintah yang ditulis dalam bahasa sehari‐hari dituliskan tidak dicampur dalam satu baris dengan elemen algoritma yang lain.
• Indentasi yang sama untuk blok struktur yang sama sangat disarankan..
D.1.
Struktur
begin
‐
end
• Perintah‐perintah dalam satu deret yang menjadi satu kesatuan struktural (satu blok) dituliskan di antara notasi begin dan notasi end. Perintah yang ditulis dalam notasi bahasa Pascal dituliskan dengan tanda separator “;” di akhir setiap perintah sementara perintah dalam bahasa sehari‐hari dituliskan tanpa tanda separator tsb.
• Jika terdapat struktur lain di antara satu beginend, maka struktur itu diperlakukan sebagaimana perintah yang ditulis dalam bahasa pascal (diakhiri separator “;”).
D.2.
Strktur
if
‐
then
• Kondisi yang akan diperiksa dalam struktur ini adalah ekspresi lojik yang diletakan di antara notasi if dan notasi then. Perintah (atau perintah‐ perintah) yang akan dilakukan jika ekspresi lojik itu berharga boolean true diletakkan setelah notasi then.
• Jika lebih dari satu perintah maka perintah‐perintah itu dijadikan satu kesatuan struktur dengan tambahan notasi beginend yang mengapitnya.
D.3.
if
‐
then
‐
else
• Seperti pada ifthen, kondisi yang akan diperiksa dalam struktur ini adalah ekspresi lojik yang diletakan di antara notasi if dan notasi then. Perintah (atau perintah‐perintah) yang akan dilakukan jika ekspresi lojik itu berharga boolean true diletakkan setelah notasi then dan perintah (atau perintah‐perintah) yang akan dijalankan jika berharga false diletakkan setelah notasi else.
• Baik untuk then maupun untuk else, jika lebih dari satu perintah maka masingmasing perintah‐perintah itu dijadikan kesatuan‐kesatuan struktur dengan tambahan notasi beginend yang mengapitnya (masing‐ masing).
D.4.
for
‐
do
• Di antara notasi for dan notasi do ekspresi iteratif (ekspresi yang menyatakan bagaimana iterasi itu harus terjadi) dituliskan.
o Penulisan ekspresi iteratif berisi
o nama variabel iterator (variabel integer yang harganya akan berubah‐ubah sejalan dengan iterasi yang terjadi),
o setelah tanda assignment dituliskan harga awal iterator (yang bisa merupakan suatu harga literal atau ekspresi aritmatis),
o notasi to atau downto yang menyatakan arah harga iterator
dilakukan (yang bisa merupakan suatu harga literal atau suatu ekspresi aritmatis), dan
o jika kenaikan/penurunan bukan bilangan 1, harga perubahan yang terjadi pada iterator setiap satu iterasi dilalui dinyatakan dengan notasi step dan diikuti harga perubahannya (misalnya “step 2”).
• Setelah notasi do perintah (atau perintah‐perintah) yang akan dilakukan pada setiap kali iterasi dituliskan. Jika lebih dari satu perintah maka perintah‐perintah itu dijadikan satu kesatuan struktur dengan tambahan notasi beginend yang mengapitnya.
D.5.
while
‐
do
• Kondisi yang akan diperiksa adalah ekspresi lojik yang diltakan di antara notasi while dan notasi do. Perintah (atau perintah‐perintah) yang akan dilakukan secara berulang‐ulang selama ekspresi lojik itu berharga boolean true diletakkan setelah notasi do.
• Jika lebih dari satu perintah maka perintah‐perintah itu dijadikan satu kesatuan struktur dengan tambahan notasi begin‐end yang mengapitnya.
D.6.
repeat
‐
until
• Kondisi yang akan diperiksa adalah ekspresi lojik yang diltakan setelah notasi until. Perintah (atau perintah‐perintah) yang akan dilakukan dan kemudian diulang‐ulang selama ekspresi lojik itu berharga boolean false diletakkan antara notasi repeat dan notasi until.
D.7.
case
‐
of
‐
end
• Hal yang akan diperiksa adalah variabel atau ekspresi arinmatis yang memiliki harga‐harga tertentu. Variabel atau ekspresi aritmatis itu diletakkan di antara notasi case dan notasi of.
• Di antara notasi of dan notasi end terdaftar sejumlah kemungkinan harga/kasus dan perintah (atau perintah‐perintah) yang akan dijalankan untuk kemungkinan harga tersebut.
• Satu harga literal13 yang mungkin14 diletakkan di sebelah kiri, diikuti notasi “:” (titik dua) lalu diikuti oleh perintah yang akan dijalankan selanjutnya sebuah “;” (titik koma)15. • Jika ada beberapa perintah yang akan dijalankan maka perintah‐perintah itu dijadikan satu kesatuan struktur dengan tambahan notasi beginend yang mengapitnya. 13 Dalam Bahasa C, sebelum harga literal tsb, ada notasi “case” mendahuluinya.
14 Dalam Pascal harga yang mungkin ini bisa dinyatakan sebagai range harga yang mungkin
misalnya bilangan‐bilangan antara 1 sampai dengan 10 dengan menulisnya sebagai “1..10” atau beberapa kemungkinan harga dengan dipisahkan koma misalnya “2, 5, 9”. Hal ini tidak ada di bahasa C sehingga dalam Pseudopascal ini hal itu dihindari.
15 Dalam bahasa C, harus diikuti notasi “break;” karena tanpa itu maka alirannya jadi sangat
E.
Aturan
‐
aturan
Penulisan
Prosedur
dan
Fungsi
Secara umum aturan kerangka penulisannya mengikuti aturan dalam bahasa Pascal kecuali beberapa hal termasuk bahwa badan algoritma di dalam fungsi atau prosedur sesuai dengan pembahasan algoritma di atas (memungkinkan baris perintah dalam bahasa sehari‐hari, perintah‐perintah rinci yang bukan fokus diperlihatkan sebagai baris “….”. Seperti halnya nama variabel nama‐nama prosedur maupun function bersifat case insentitive namun demi untuk memberikan kejelasan dalam pembacaan, penamaan prosedur/function maupun variabel direkomendasikan untuk konsisten di setiap bagian algoritma.
Dalam bahasa Pascal, suatu prosedur/function dapat memiliki prosedur/function lokalnya sendiri. Dalam pseudocode ini demi kompatibilitas dengan bahasa lain, hal itu ditiadakan.
E.1.
Prosedur
Mengawali suatu prosedur notasi procedure dituliskan dan diikuti nama prosedur. Jika ada argumen, mana argumen‐argumen didaftarkan di dalam tanda kurung dan setiap argumen tersebut dituliskan dengan dipisahkan dengan tanda koma (“,”). Dalam bahasa Pascal jenis variabel harus dispesifikasikan, namun dalam Pseudopascal ini seandainya cukup jelas maka demi mempersingkat, jenis variabel bisa dihilangkan. Untuk menunjukkan suatu argumen bersifat pass‐by‐reference maka di depan nama argumen itu dituliskan notasi var (seperti pada bahasa Pascal).
Berikutnya jika ada variabel lokal yang perlu ditonjolkan didaftarkan (beserta jenis variabel tersebut) setelah notasi var. Badan algoritma prosedur dituliskan di antara begin dan end dan diikuti tanda “;” (titik koma).
E.2.
Fungsi
Mirip seperti pada prosedur kecuali tiga hal berikut ini. Pertama, yang mengawali fungsi adalah notasi function. Kedua, setelah nama (serta argumen‐ argumennya yang dituliskan di dalam tanda kurung), suatu notasi “:” (titik dua) dan jenis harga yang akan dihasilkan fungsi dituliskan. Ketiga dalam badan algoritma nama fungsi digunakan seolah suatu variabel penerima assignment yang apabila algoritma dalam fungsi selesai dijalankan maka harga terakhir yang diberikan padanya adalah harga yang akan dikembalikan ke algoritma pemanggil fungsi ini. Jika nama fungsi berada sebagai operand dari suatu operasi maka yang terjadi adalah pemanggilan fungsi terhadap disinya sendiri yang dikenal dengan istilah rekursif.
MATERI
UJI
OLIMPIADE
SAINS
BIDANG
INFORMATIKA
Contoh‐contoh dan Pembahasan
A.
Pengantar
1.
Olimpiade
Sains
Nasional
Dalam beberapa tahun terakhir Departemen Pendidikan Nasional telah meyelenggarakan Olimpiade Sains Nasional (OSN) yang di antaranya terdapat bidang Informatika. Pemilihan peserta yang akan bertanding di OSN dilakukan melalui seleksi bejenjang dan serentak di seluruh Indonesia, yaitu: ¾ tingkat kabupaten/kota, kemudian ¾ tingkat provinsi. Tahun 2006, untuk bidang informatika di tingkat provinsi tercatat diikuti 1480 siswa peserta seleksi sementara di tingkat kabupaten/kota tentunya sekian kali lebih banyak lagi (estimasi kasar ada di atas 8 ribuan siswa1). Hasil dari seleksi tingkat propinsi menentukan siapa yang akan menjadi salah seorang dari ke 90 siswa peserta OSN.
Selain sebagai ajang prestasi tingkat nasional, OSN bertujuan juga untuk mendapatkan calon peserta pembinaan dan seleksi lebih lanjut hingga dipilih empat siswa terbaik alias anggota TOKI (Tim Olimpiade Komputer Indonesia). Mereka itulah yang akan mewakili negara dan bangsa untuk bertanding di tingkat dunia yaitu International Olympiad in Informatics (IOI).
2.
International
Olympiad
in
Informatics
IOI sendiri adalah lomba yang menguji kemampuan peserta dalam problem solving dengan pemrograman komputer2. Setiap peserta dalam waktu yang amat terbatas harus mengerjakan sejumlah masalah yang diberikan, mulai dari memahami masalahnya, merancang solusinya, dan memindahkan solusinya dengan menuliskannya sebagai suatu program komputer. Pemecahan masalahnya harus komprehensif (meliputi berbagai kasus) yang harus diidentifikasi sendiri oleh setiap peserta, programnya harus efisien saat dijalankan (dalam waktu yang singkat untuk setiap kasus), dan tentunya menghasilkan keluaran yang sesuai dengan yang diharapkan.
Kemampuan dalam coding (menulis program) hanyalah salah satu aspek saja, yang sulit adalah dalam melakukan problem solving itu sendiri termasuk memilih metodologi yang tepat. Pemilihan metodologi akan menentukan efisiensi dari program yang dibuat saat dijalankan.
1 Ini hanya dugaan saja karena di tingkat kabupaten/kota, penyelenggaraan beserta proses
seleksi diserahkan ke masing‐masing kabupaten/kota yang bersangkutan sehingga data peserta tidak tercatat dengan lengkap. Sementara, di tingkat propinsi, proses seleksi di lakukan di pusat sehingga bisa diketahui jumlah keseluruhan peserta.
2 Harap bagian yang digarisbawahi tersebut dipahami secara lengkap; bukan HANYA menguji
kemampuan membuat program komputer, bukan pula HANYA menguji kemampuan memecahkan masalah, tetapi KEDUANYA!!!
3.
Metoda
dan
Proses
Seleksi
di
OSN
Proses seleksinya idealnya adalah mengacu ke IOI. Namun berbeda dengan bidang OSN lain seperti Fisika, Matematika, Kimia dan Biologi, bidang informatika khususnya pemrograman belum menjadi pelajaran resmi. Kalaupun ada, hanya di sekolah‐sekolah tertentu saja dan itupun belum tentu mengajarkan pemrograman. Oleh sebab itu, materi uji disesuaikan agar peserta potensial secara akademis/skolastik tinggi masih dapat terjaring untuk diberikan pembinaan yang intensif. Penyesuaiannya adalah mengurangi aspek yang sangat bergantung pada ketrampilan peserta dalam pemrograman dan sebagai gantinya, digunakan materi yang biasanya disebut sebagai materi uji “analisa dan logika”. Pada dasarnya materi ini menguji potensi akademis/skolastik peserta yang menjadi bagian terpenting dalam kemampuan problem solving peserta.
4.
Metoda
dan
Proses
Seleksi
pra
OSN
Di tingkat kabupaten/kota serta propinsi komponen uji pemrograman tidak mungkin untuk diadakan mengingat sejumlah alasan tertentu sehingga uji pemrograman disubstitusi dengan materi uji kemampuan algoritmika.3 Selain itu, metoda pengujiannya pun tidak bisa dihindari bersifat test obyektif (pilihan ganda). Metoda ini memang banyak sekali kelemahannya yaitu memungkinkan jawaban asal tapi benar, namun, memungkinkan pemeriksaan yang segera. Dampak negatif tersebut bisa dikurangi dengan pembuatan soal dan pilihan jawaban yang dirancang dengan matang.
5.
Klasifikasi
Soal
‐
soal
Nonprogramming
Secara umum materi uji tertulis terbagi atas tiga komponen utama: materi uji analitika dan logika, materi uji aritmatika, dan materi uji algoritmika.
¾ Materi analitika dan logika bertujuan untuk menguji potensi akademis (skolastik) peserta namun sedapat mungkin memiliki relevansi yang tinggi dengan problem solving dan elemen penting dalam menguasai pemrograman komputer. Kemampuan ini merupakan faktor penting dalam memahami persoalan yang diberikan dan merancang algoritma pemecahan masalahnya.
¾ Materi arimatika sebenarnya sejalan dengan analitika dan logika di atas karena soal aritmatika disini bukan sekedar menguji ketrampilan dalam hitung‐menghitung, tetapi lebih pada cara berpikir yang logis dan analitis namun dengan soal bertemakan aritmatika
¾ Materi algoritmika bertujuan untuk menguji kemampuan peserta dalam memahami dan menyusun suatu algoritma. Aspek‐aspek yang terkait dengan pengetahuan dan bahasa pemrograman direduksi seminimal mungkin ke tingkat pseudocode.
3 Uji pemrograman di tingkat provinsi, apalagi di tingkat kabupaten/kota, masih perlu beberapa
B.
Materi
Uji
Aritmatika
Sekali lagi, walaupun mengambil topik mengenai aritmatika, aspek terpenting dari materi ini bukan pada hitung menghitungnya tetapi pada uji kemampuan analitisnya. Aspek‐aspek analitis dalam persoalan aritmatika dijelaskan pada bagian berikut ini.
1.
Mampu
Membentuk
Model
Aritmatika/Matematika
serta
melakukan
deduksi/induksi
Model
Dalam problem solving, seringkali diperlukan tahapan pemodelan masalah yang sebagian menggunakan model matematika/aritmatika dan menyederhana‐ kannya sehingga menjadi model yang lebih sederhana dan siap dikomputasikan dalam bentuk algoritma. Model yang tidak tepat berakibat pada kegagalan dalam pemecahan masalah.
Contoh:
Uang Amir lebih banyak dari uang Ali. Jika dijumlahkan uang keduanya lebih dari 50 ribu rupiah, sementara selisih uang Amir dengan uang Ali lebih dari 30 ribu rupiah. Berapakah kemungkinan uang Amir yang paling tepat? Model permasalahan: Uang Amir = x, Uang Ali = y, dan dari deskripsi di atas ¾ Pers‐I: x > y ¾ Pers‐II: x+y > 50000 ¾ Pers‐III: |x‐y| > 30000 Dari Pers‐I dan Pers‐III: menghasilkan Pers‐IV: x‐y > 30000 Dari Pers‐II dan Pers‐IV: jika dijumlahkan menghasilkan 2x>80000. Maka, x > 40000
2.
Memahami
Sifat
‐
sifat
Bilangan
Untuk sejumlah masalah, sifat‐sifat dari bilangan harus dipahami secara logis
Contoh:
Jika n dan p adalah dua bilangan bulat, dan n + p berharga ganjil, manakah dari berikut ini bil ganjil? (A) n – p + 1 (B) np (C) n2 + p2 – 1 (D) 3p + 5n (E) (p – n)(n – p)
A bukan, karena (n+p) adalah ganjil maka dari n dan p salah satu ganjil dan yang lain genap. Selisih antara n dan p pasti ganjil sehingga jika ditambah 1 menjadi genap.
B bulan karena perkalian antara suatu bilangan genap dengan bilangan apapun akan menjadi genap.
C bukan karena pangkat bulat positif berapapun dari bilangan genap, tetap genap, dan ganjil tetap ganjil, kemudian ganjil ditambah genap dan dikurang ganjil menjadi genap.
D bukan karena pangkat bulat positif berapapun dari bilangan ganjil tetap bilangan ganjil, dan jumlah dua bilangan ganjil menjadi genap.
E benar, karena perkalian antara dua bilangan ganjil menghasilkan bilangan ganjil.
3.
Mengkaitkan
dengan
Konteks
Masalah
Konteks dari soal perlu diperhatikan dan konteks tersebut kadang‐kadang hanya tersirat saja. Yang dimaksud dengan konteks di sini adalah pemahaman umum akan sesuatu yang sewajarnya diketahui pula. Contoh: jika lonceng berdentang setiap 1 detik, dalam jumlah dentang yang sesuai waktu yang ditunjukkan, maka tepat pada pukul berapa dentang terakhir yang menunjukkan jam 6? Apakah pukul 6:00:06? Salah, seharusnya pukul 6:00:05 karena dentang‐dentang tsb pada pukul 6:00:00, pukul 6:00:01, pukul 6:00:02, pukul 6:00:03, pukul 6:00:04 dan pukul 6:00:05!! Konteks disini adalah dentang pertama terjadi pada tepat pukul 6, dan penomoran detik/menit dimulai dari 0, 1, ... dst.
4.
Memahami
Formula
Rekursif
Banyak masalah pemodelan dengan tingkat kesulitan yang tinggi atau pemrogramannya sendiri memerlukan pemecahan dengan algoritma rekursif. Pemahaman fungsi rekursif membantu dalam pemahaman memahami bagaimana bekerjanya algoritma rekursif.
Contoh:
Jika didefinisikan f(n) = n f(n–1) untuk setiap n > 0 dan f(0) = 1, maka berapakah f(10)/(f (7) x f(6))?
Pahami perilaku fungsi rekursif tsb, sbb,
f(n) = n.f(n–1) = n.(n–1).f(n–2) = n.(n–1).(n–2).f(n–3) = ... = n(n–1)(n– 2)(n–3)....2.1 = n!
Sehingga, f(10) = 10! dan f(7) = 7! serta f(6) = 6!. 10!/7! = (10.9.8.7.6.5.4.3.2.1)/(7.6.5.4.3.2.1) = 10.9.8 Dan (10.9.8) /(6.5.4.3.2.1) = 1
5.
Eksplorasi
dalam
Masalah
Kombinatorik
Dalam problem solving seringkali masalah yang diberikan bersifat kombinatorik (mendapatkan setiap kemungkinan kombinasi/permutasi jawaban). Untuk memecahkannya terkadang seluruh kemungkinan tersebut harus diperiksa untuk mendapatkan pemecahan yang umum.
Contoh:
Jika diketahui dalam perkalian matriks A (mxn) dengan B (nxp) diperlukan biaya mnp. Sementara untuk perkalian tiga matriks A.B.C dengan A(mxn), B(nxp) dan C(pxq) ternyata terdapat dua kemungkinan biaya yang bergantung pada urutannya:
‐ Urutan (A.B).C (yaitu A dikali B dahulu kemudian dikali C), dan ‐ urutan A.(B.C) (yaitu B dikali C dahulu kemudian dikali A).
Urutan (A.B).C memerlukan harga mnp + mpq sementara urutan A.(B.C) memerlukan harga npq + mnq. Kedua harga bisa berbeda sesuai dengan harga‐harga m, n, p, q tsb. Pertanyaannya, untuk perkalian empat matriks A.B.C.D dengan A(10x4), B(4x15), C(15x2), dan D(2x20) manakah urutan dengan biaya minimum?
Kemungkinan‐kemungkinan urutan adalah (diperoleh dengan permutasi ketiga tanda perkalian “.”): - urutan (((A.B).C).D), biaya 10x4x15+10x15x2+10x2x20 = 1300 - urutan ((A.B).(C.D)), biaya10x4x15+15x2x20+10x15x20 = 4200 - urutan ((A.(B.C)).D), biaya 4x15x2+10x5x2+10x2x20 = 600 - urutan (A.((B.C).D)), biaya 4x15x2+4x2x20+10x4x20 = 1080 - urutan ((A.B).(C.D)), biaya 15x2x20+10x4x15+10x15x20 = 4200 - urutan (A.(B.(C.D))), biaya 15x2x20 + 4x15x20+10x4x20 = 4200
6.
Berpikir
secara
“Cerdas”
Jika menghadapi suatu masalah komputasi yang kelihatannya tidak mungkin, pasti ada sesuatu di balik itu!! Dapatkanlah dengan bantuan pemahaman akan sifat‐sifat operasi aritmatika untuk mendapatkan model matematis yang lebih sederhana.
Contoh 1:
Berapa digit terakhir dari 22003? Apakah anda ingin menghitungnya sendiri (secara manual)? Tentu tidak, pasti ada penyederhanaannya. Dengan mengubah n=1, 2, 3, …, dst, perhitungan 2n menghasilkan deret 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, dst. Amati angka terakhir dari setiap bilangan, kita mendapatkan perulangan dari 6 – 2 – 4 – 8 pada n mod 4 = 0, 1, 2, 3. Jadi jika n=2003, diperoleh 2003 mod 4 = 3, yaitu memiliki digit terakhir 8. Contoh 2:
Ketiga digit awal dari hasil perkalian 22002 x 52005 jika dijumlahkan adalah? Ini juga tidak mungkin dihitung manual. Perhatikan bilangan dasarnya 2 dan 5 yang jika dikalikan menjadi 10. Karena setiap pasang faktor 2 dan 5 menghasilkan 10 berarti hanya menambah 0 di digit terkanan. Ada 2002 pasang faktor‐faktor tsb sehingga 22002 x 52005 = 53 x 102002= 125 102002. Penjumlahan tiga digit awal 1+2+5=8 Contoh 3: Hitunglah (80! x 38!) /(77! x 40!). Menggunakan sifat sbb untuk a dan b bulat positif, a > b, maka a!/b! = a.(a – 1).(a – 2)…(b + 1). Maka (80! x 38!) /(77! x 40!) = (80!/77!) / (40!/38!) = (80x79x78) / (40x39) = (80/40) x (78/39) x 79 = 2 x 2 x 79 = 316 yang dapat dihitung tanpa kalkulator.
C.
Materi
Uji
Analitika
dan
Logika
Dalam pemodelan masalah pemrograman selain dengan model aritmatika, juga keterhubungan antara entitas/aspek dalam masalah perlu dipahami secara relational untuk mendapatkan model algoritmis yang lebih akurat. Kemampuan analitis tsb diperlukan dalam menghasilkan model keterhubungan/relasional tsb.
Sayangnya tidak ada metodologi yang sistematik karena pada dasarnya sangat bergantung pada kreatifitas peserta uji. Namun, ada kesamaan umum dalam pemecahan masalahnya, yaitu
¾ penggunaan model diagram sangat membantu untuk menggambarkan keterhubungannya secara menyeluruh berdasarkan keterhubungan yang fragmental (dari pernyataan‐pernyataan terpisah atau asumsi‐asumsi yang dibuat),
¾ keterhubungan itu sendiri seringkali bersifat implisit sehingga perlu pemahaman yang hati‐hati dan perlu pemahaman akan gaya bahasa “penceritaannya”,
¾ khususnya untuk asumsi yang dibuat segera dieliminasi jika kontradiksi dengan model diagram, dan
¾ model diagram yang telah dibentuk perlu diverifikasi (dikaji ulang) dengan pernyatan‐pernyataan yang diberikan agar terjaga konsistensi, dan
¾ Selalu berpikir adanya kemungkinan yang tertinggal atau tersamar yang belum dikaji ke dalam model
Contoh 1:
Terdapat 7 bilangan bulat A, B, C, D, E, F, dan G yang jika diurutkan membentuk deret bilangan cacah berurutan (misalnya 4,5,6,…) dengan pernyataan‐pernyataan berikut: (1) D berharga 3 kurangnya dari A (2) B adalah angka di tengah jika semua diurutkan (3) Kurangnya F dari B = kurangnya D dari C (4) G lebih besar dari F Jika diurutkan, urutannya adalah? Untuk memudahkan urutan tsb misalnya [x1–x2–x3–x4–x5–x6–x7] Dari perny. (2) diketahui x4=B, maka menjadi [x1–x2–x3–B–x5–x6–x7] Dari perny. (3) F berada di ruas sebelah kiri B (bisa x1, x2 atau x2). Jika F=x1 maka D adalah x2 dan C adalah x5 ([F–D–x3–B–C–x6–x7]), atau D adalah x3 dan C adalah x6 ([F–x2–D–B–x5–C–x7]).
Akan tetapi dari perny. (1) membatalkan kedua kemungk. asumsi ini karena A harus berada 3 posisi di kanan D yang sudah ditempati C. Jika F=x2 maka D adalah x1 dan C adalah x3 ([D–F–C–B–x5–x6–x7]), atau D adalah x3 dan C adalah x5 ([x1–F–D–B–C–x6–x7]), atau D adalah x5 dan C adalah x7 ([x1–F–x3–B–D–x6–C]).
Akan tetapi dari perny. (1) hanya yang kedua yang mungkin karena yang pertama posisi A = posisi B atau yang ketiga posisi A berada di luar (setelah x7). Untuk sementara [x1–F–D–B–C–A–x7] dicatat sebagai salah satu solusi. Jika F=x3 maka D adalah x1 dan C adalah x2 ([D–C–F–B–x5–x6–x7]), atau D adalah x5 dan C adalah x6 ([x1–x2–F–B–D–C–x7]), atau D adalah x6 dan C adalah x7 ([x1–x2–F–B–x5–D–C]).
tetapi dari (1) semua tidak mungkin (yang pertama posisi A = posisi B, kedua yang lain posisi A ada di luar).
Jadi ternyata hanya tinggal satu kemungkinan yaitu [x1–F–D–B–C–A–x7]. Dari perny. (4) diperoleh G=x7, sehingga diperoleh juga E=x1. Hasilnya diketahui urutannya adalah E, F, D, B, C, A, G
Contoh 2:
Delegasi‐delegasi dari negara W dan negara R duduk berhadap‐hadapan pada meja perundingan. Masing‐masing delegasi terdiri atas seorang ketua, dua atase militer dan dua wakil kamar dagang negara masing‐ masing. Delegasi W beranggotakan A, B, C, D, dan E. Delegasi R beranggotakan F, G, H, I, dan J. Masing‐masing delegasi berada pada sisi‐ sisi memanjang berlainan (satu negara pada sisi yang sama dan ketua duduk di tengah delegasinya). Batasan dalam mengatur urutan duduk mereka: (1) Delegasi W menempatkan A dan B di kedua ujung barisannya. (2) Kuping kanan G tuli shg ia harus paling kanan dari delegasi R. (3) Baik D maupun F bukan ketua. (4) Para atase militer W, salah seorangnya B, didudukkan berdampingan, dan tidak ada satupun yang berseberangan dengan atase militer R (5) G bukan atase militer. (6) C wakil dari kamar dagang, duduk berseberangan dengan H. Manakah yang paling mungkin mengenai F berikut? (A) Wakil kamar dagang yang duduk di sebelah I (B) Wakil kamar dagang yang duduk di sebelah H (C) Wakil kamar dagang yang duduk berseberangan dengan B (D) Atase militer yang duduk di sebelah I (E) Atase militer yang duduk di sebelah J Seperti pada contoh sebelumnya, dibuat diagram sbb x1–x2–x3–x4–x5 negara W y1–y2–y3–y4–y5 negara R Dari (1) kemungkinan {x1,x5} adalah {A,B} atau {B,A} Dari (2) maka y5=G yang karena pernyataan (4) dan (5) (G bukan a.m dan B adalah a.m) menyebabkan x5=B, sehingga (atase militer dengan bold) A –x2–x3–x4– B y1–y2–y3–y4–G Dari pernyataan (6) dan (4) diperoleh C = x2 dan y2 = H, sehingga
A –C –x3–x4– B y1–H –y3–y4–G Dari pernyataan (3) dan diagram di atas D = x4 dan F = y1 atau y4 A –C –E –D –B y1–H –y3–y4– G Jadi tinggal 2 kemungkinan F=y1 (atase militer), atau F=y4 (wakil kamar dagang). Jika atase militer maka (D) dan (E) salah karena sebelah y1 adalah H. Jika wakil kamar dagang maka (B) salah karena H atase militerdan (C) salah karena B ada di depan G. Jadi tinggal pilihan (A) yang paling mungkin. (Note: ini bukan satu‐satunya kemungkinan. Kemungkinan lainnya masih ada tapi tidak ada di kelima pilihan itu).
D.
Materi
Uji
Algoritmika
Sebagaimana dalam penjelasan awal, materi uji algoritmika adalah selain menguji kemampuan dalam memahami suatu algoritma yang diberikan, juga menguji kemampuan merancang suatu algoritma pemecahan masalah yang diberikan. Namun, untuk tingkat OSK/OSP pada saat ini belum memungkinkan untuk dilakukan terutama terkendala masalah teknis pemeriksaan kebenaran jawabannya. Kemampuan dalam perancangan tersebut baru akan diujikan kemudian di tingkat OSN.
Karena pada tingkat OSK/OSN ini peserta harus dapat memahami algoritma yang diberikan maka hal yang penting untuk dikuasai adalah penulisan notasi algoritma yang digunakan oleh soal‐soal. Penulisan algoritma mungkin menggunakan suatu cerita (bahasa sehari‐hari) atau mengikuti notasi/tatacara yang didefinisikan sebagai pseudopascal4. Proses dari algoritma umumnya bersifat prosedural/imperatif saja5.
Aspek‐aspek yang biasanya diujikan adalah:
1. penggunaan variabel (berarti sifat‐sifatnya juga) dalam kaitannya dengan proses algoritma tetapi tidak berkaitan dengan sifat variabel yang spesifik pada bahasa pemrograman tertentu6.
4 Lebih tepatnya, “TOKI Pseudopascal” dengan dokumen yang diposting di webite dengan URL di
http://www.toki.or.id/toki2006/pseudopascal.pdf
5 Hingga IOI 2006 soal‐soal yang diujikan masih mementingkan efisiensi dalam problem
solvingnya sehingga rancangan yang object‐oriented ataupun deklaratif belum perlu (atau malah tidak disarankan demi efisiensi solusi) untuk digunakan. Bahasa pemrograman yang populer di IOI adalah FreePascal, C dan C++. Khususnya C++ digunakan terutama untuk memudahkan sejumlah codingnya saja, bukan karena aspek object‐orientednya.
6 Dalam bahasa C terdapat kerumitan definisi mengenai array yang tidak terjadi dalam
bahasa Pascal. Dalam bahasa Java character yang digunakan dalam String adalah unicode (16
bit) sementara dalam bahasa C atau Pascal adalah byte (8 bit). Dalam bahasa Pascal terdapat
variabel tipe string standard pascal yang byte ke‐0 berisi panjang logical string di dalamnya
sementara dalam C variabel String adalah array character dengan indeks dari 0. Dalam
bahasa Pascal array bisa berindeks suatu range bilangan bulat apa saja termasuk bulat