Anda di halaman 1dari 111

MATERI PEMBINAAN

PRA OLIMPIADE SAINS NASIONAL VII


BIDANG INFORMATIKA
8-14 AGUSTUS 2008 MAKASSAR, SULAWESI SELATAN

Selamat Belajar dan Berlatih, Jadilah Yang Terbaik!

DAFTARISI
DAFTARISI ............................................................................................................................................ 1 PSEUDOPASCAL................................................................................................................................... 5 A. Pengantar................................................................................................................................. 5 B. TerminologidanPenjelasanUmum ............................................................................. 5 C. ElemenelemenAlgoritmadenganPseudopascal .................................................. 6 C.1. Variabel ........................................................................................................................... 7 C.2. Perintah........................................................................................................................... 9 C.3. Assignment&Ekspresi ......................................................................................... 10 C.4. EkspresiAritmatis................................................................................................... 10 C.5. EkspresiLojik ............................................................................................................ 11 C.6. Strukturkendalialiran .......................................................................................... 12 C.7. AlgoritmaUtama/Fungsi/prosedur ................................................................ 13 D. AturanaturanPenulisanStrukturKendaliAliran .............................................. 14 D.1. Strukturbeginend.................................................................................................. 15 D.2. Strkturifthen............................................................................................................ 15 D.3. ifthenelse.................................................................................................................. 15 D.4. fordo............................................................................................................................. 15 D.5. whiledo ....................................................................................................................... 16 D.6. repeatuntil................................................................................................................. 16 D.7. caseofend ................................................................................................................. 16 E. AturanaturanPenulisanProsedurdanFungsi.................................................... 17 E.1. Prosedur ...................................................................................................................... 17 E.2. Fungsi............................................................................................................................ 17 MATERIUJIOLIMPIADESAINSBIDANGINFORMATIKA............................................... 18 A. Pengantar.............................................................................................................................. 18 1. OlimpiadeSainsNasional.......................................................................................... 18 2. InternationalOlympiadinInformatics ............................................................... 18 3. MetodadanProsesSeleksidiOSN ........................................................................ 19 4. MetodadanProsesSeleksipraOSN ..................................................................... 19 5. KlasifikasiSoalsoalNonprogramming............................................................... 19 B. MateriUjiAritmatika ....................................................................................................... 20 1. Mampu Membentuk Model Aritmatika/Matematika serta melakukan deduksi/induksiModel........................................................................................................ 20 2. MemahamiSifatsifatBilangan............................................................................... 20 3. MengkaitkandenganKonteksMasalah .............................................................. 21 4. MemahamiFormulaRekursif.................................................................................. 21 5. EksplorasidalamMasalahKombinatorik .......................................................... 21 6. BerpikirsecaraCerdas ........................................................................................... 22 C. MateriUjiAnalitikadanLogika................................................................................... 23 D. MateriUjiAlgoritmika..................................................................................................... 25 E. MateriUjiProgramming................................................................................................. 31 F. Penutup.................................................................................................................................. 33 DESKRIPSIRINGKASSITUSTOKILEARNINGCENTER................................................... 34 TujuanBahanIni ......................................................................................................................... 34 BatasanAplikasi........................................................................................................................... 34

1/110

HalamanUtama............................................................................................................................ 34 FasilitasYangTersedia ............................................................................................................. 35 TanyaJawab .................................................................................................................................. 36 MemilihSoalPilihanBerganda ............................................................................................. 37 MenjawabSoalPilihanGanda................................................................................................ 37 LembarJawabPilihanGanda ................................................................................................. 38 PilihanGanda ................................................................................................................................ 38 MenuDeskripsiSoal(Untukmengaksessoal) ............................................................... 39 SoalProblemSolving(denganmembuatprogram)..................................................... 39 RekapitulasiSubmisi ................................................................................................................. 40 MemintaUntukDinilai.............................................................................................................. 40 ForumDiskusi............................................................................................................................... 40 UbahPassword............................................................................................................................. 41 Logout .............................................................................................................................................. 41 CONTOHSOALDANPEMBAHASAN ........................................................................................ 42 SoalAritmatika,AnalitikadanLogika ................................................................................ 42 SoalAlgoritmika........................................................................................................................... 60 SoalPemrograman ..................................................................................................................... 67 Faktorial ..................................................................................................................................... 67 UlangTahun.............................................................................................................................. 70 MATERIPJJPRAOSN2008.......................................................................................................... 73 ReadlndanWriteln..................................................................................................................... 73 ContohMasukan ..................................................................................................................... 74 ContohKeluaran ..................................................................................................................... 74 WhileLoop ..................................................................................................................................... 75 ContohMasukan ..................................................................................................................... 75 ContohKeluaran ..................................................................................................................... 75 WhileLoop+Counter................................................................................................................ 76 ContohMasukan ..................................................................................................................... 77 ContohKeluaran ..................................................................................................................... 77 MenjumlahperKolom............................................................................................................... 78 ContohMasukan ..................................................................................................................... 79 ContohKeluaran ..................................................................................................................... 79 MenjumlahdalamSatuBaris ................................................................................................. 80 ContohMasukan ..................................................................................................................... 81 ContohKeluaran ..................................................................................................................... 81 IfThen .............................................................................................................................................. 82 ContohMasukan1.................................................................................................................. 82 ContohKeluaran1 ................................................................................................................. 82 ContohMasukan2.................................................................................................................. 82 ContohKeluaran2 ................................................................................................................. 82 ContohMasukan3.................................................................................................................. 83 ContohKeluaran3 ................................................................................................................. 83 IfThen,MultiCondition............................................................................................................ 84 ContohMasukan1.................................................................................................................. 84 ContohKeluaran1 ................................................................................................................. 85 ContohMasukan2.................................................................................................................. 85 ContohKeluaran2 ................................................................................................................. 85 IfThenElse..................................................................................................................................... 86

2/110

ContohMasukan1.................................................................................................................. 87 ContohKeluaran1 ................................................................................................................. 87 ContohMasukan2.................................................................................................................. 87 ContohKeluaran2 ................................................................................................................. 87 ContohMasukan3.................................................................................................................. 87 ContohKeluaran3 ................................................................................................................. 87 Case ................................................................................................................................................... 88 ContohMasukan1.................................................................................................................. 89 ContohKeluaran1 ................................................................................................................. 89 ContohMasukan2.................................................................................................................. 89 ContohKeluaran2 ................................................................................................................. 89 Procedure ....................................................................................................................................... 90 ContohMasukan ..................................................................................................................... 91 ContohKeluaran ..................................................................................................................... 91 Function........................................................................................................................................... 92 ContohMasukan1.................................................................................................................. 94 ContohKeluaran1 ................................................................................................................. 94 ContohMasukan2.................................................................................................................. 94 ContohKeluaran2 ................................................................................................................. 94 VarParameter............................................................................................................................... 95 ContohMasukan ..................................................................................................................... 97 ContohKeluaran ..................................................................................................................... 97 Break,Continue,Exit.................................................................................................................. 98 ContohMasukan1.................................................................................................................. 99 ContohKeluaran1 ................................................................................................................. 99 ContohMasukan2................................................................................................................100 ContohKeluaran2 ...............................................................................................................100 OperasiString .............................................................................................................................101 ContohMasukan ...................................................................................................................102 ContohKeluaran ...................................................................................................................102 ManhattanDistance .................................................................................................................105 FormatMasukan...................................................................................................................105 FormatKeluaran...................................................................................................................105 ContohMasukan ...................................................................................................................105 ContohKeluaran ...................................................................................................................105 FloorandCeiling........................................................................................................................106 FormatMasukan...................................................................................................................106 FormatKeluaran...................................................................................................................106 ContohMasukan ...................................................................................................................106 ContohKeluaran ...................................................................................................................106 DuaPangkat.................................................................................................................................107 FormatMasukan...................................................................................................................107 FormatKeluaran...................................................................................................................107 ContohMasukan1................................................................................................................107 ContohKeluaran1 ...............................................................................................................107 ContohMasukan2................................................................................................................107 ContohKeluaran2 ...............................................................................................................107 POLA1............................................................................................................................................108 FormatMasukan...................................................................................................................108

3/110

FormatKeluaran...................................................................................................................108 ContohMasukan ...................................................................................................................108 ContohKeluaran ...................................................................................................................108 POLA2............................................................................................................................................109 FormatMasukan...................................................................................................................109 FormatKeluaran...................................................................................................................109 ContohMasukan1................................................................................................................109 ContohKeluaran1 ...............................................................................................................109 ContohMasukan2................................................................................................................109 ContohKeluaran2 ...............................................................................................................109 POLA3............................................................................................................................................110 FormatMasukan...................................................................................................................110 FormatKeluaran...................................................................................................................110 ContohMasukan1................................................................................................................110 ContohKeluaran1 ...............................................................................................................110 ContohMasukan2................................................................................................................110 ContohKeluaran2 ...............................................................................................................110 ContohMasukan3................................................................................................................110 ContohKeluaran3 ...............................................................................................................110

4/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

PSEUDOPASCAL
VersiOlimpiadeSainsBidangInformatika/Komputer

A. Pengantar
Mengingat dalam seleksi tertulis Olimpiade Informatika/Komputer algoritma algoritma yang terkait dalam soalsoal 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 dalammempersiapkandiridalamseleksitersebutmaupunparapembinadalam mengarahkanpelatihansiswasiswanya. Bagi pembimbing atau peserta seleksi yang cukup menguasai bahasa pemrogramanPascal,sebagianbesaraturanpenulisanPseudopascalmerupakan subset dari aturan Bahasa Pascal itu sendiri. Kecuali, ada beberapa hal yang di dalamBahasaPascalbolehdilakukan,dalampseudopascaltidakadaatautidak disarankan untuk dilakukan. Hal ini untuk memungkinkan kompatibilitas algoritma dengan bahasa lain seperti bahasa C sehingga peserta yang lebih menguasaibahasa selainPascal dapat cukup mudah untuk memahaminya juga. Jadi berkenaan dengan ini anda tinggal menemukan halhal yang menjadi pantangantersebut. Mengingat dokumen ini dituliskan lebih untuk acuan maka anda hanya akan menemukan penulisan substansi yang seringkasringkasnya tanpa disertai contohcontoh yang memadai. Dalam kesempatan lain, semoga kami dapat menyediakan materi yang lebih sesuai untuk digunakan langsung dalam pembinaanpembinaanpesertadalampemrograman.

B. TerminologidanPenjelasanUmum
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 utamadaridokumenini. Berikutinimengenaialgoritma Algoritma adalah urutan langkahlangkah sistematis yang terkait pada pemecahansuatumasalah;didalamnyabisaterdapatsejumlah variabel, perintah, ekspresi & assignment, struktur kendali aliran (control flow)darialgoritma,sertadefinisifungsi/prosedur. Pseudocode adalah suatu cara penulisan algoritma agar ide dan logika darialgoritmadapatdisampaikan/diekspresikan. Pseudopascal (alias Pseudocode Pascal) adalah pseudocode yang menggunakan (mengadopsi) beberapa notasi Bahasa Pascal berikut strukturpenulisanprogramnya.
5/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Berikutinimengenaiprogramkomputer Program komputer atau kita singkat dengan kata program (istilah lainnya code) adalah susunan perintahperintah dan operasioperasi yang mengimplementasikan algoritma tertentu disertai yang ditulis dalambahasapemrogramantertentu. Bahasa pemrogramanadalahbahasayangdidalamnyaterdapataturan penulisanprogram. Bahasa Pascal adalah salah satu bahasa pemrograman, dan saat ini terdapat sejumlah versi dari bahasa Pascal diantaranya: Ansi Pascal, TurboPascal,FreePascal,dlsb. Algoritma yang ditulis dalam suatu pseudocode dibedakan dari programnya yangditulisdalamsuatubahasapemrogramanakibatadanyaperbedaantujuan dari kedua hal itu. Algoritma dengan pseudocode bertujuan untuk menyampaikanidedarialgoritmabagipembaca(dalamhalinipesertaseleksi), sementara program dalam suatu bahasa pemrograman untuk dapat dijalankan nantinya oleh komputer. Mengingat komputer bodoh maka dalam penulisannya suatu program harus 100% taat pada aturanaturan penulisan programnya(istilahnyatidakadakesalahansintaks)sementarakarenapembaca algoritma adalah manusia maka demi menyederhanakan dan memudahkan pemahaman maka aturanaturan penulisannya digunakan secara fleksibel. Terkadangpesudocodedituliskannyarissamadenganversiprogramnyasendiri tetapi kadangkadang diringkaskan menggunakan kalimatkalimat bahasa manusia (dalam hal seleksi ini adalah bahasa Indonesia) bahkan beberapa bagian sengaja yang bukan fokusnya dihilangkan. Prinsip dalam penulisan pseudocode adalah tuliskan seringkasringkasnya sejauh tidak mengurangi pengertiandarialgoritmayangmenjadifokuspembahasantersebut. Dalam kaitannya dengan materi seleksi, pseudocode yang digunakan adalah pseudopascal berdasarkan kenyataan bahwa notasinotasi Bahasa Pascal jauh lebih mudah dipahami daripada notasi bahasa pemrograman populer lainnya saatiniterutamabagipemula(misalnyabahasaC).Selainitusetiapnotasiyang digunakandijagauntukselaluberpadanandengannotasiyangadadalambahasa lain tersebut sehingga peserta yang lebih menguasai bahasa selain Pascaltetap dapatmemahamiidedarialgoritmaterkait. Terakhir, untuk menghindari polemik akan caracara penulisannya, sekali lagi Pseuodopascal yang dimaksud dalam dokumen ini adalah Pseudopascal versi OlimpiadeSainsBidangInformatika/Komputer&TOKI.

C. ElemenelemenAlgoritmadenganPseudopascal
Seperti pada terminologi di atas terdapat sejumlah elemen dasar dalam pseudopascal. Variabel Perintah Assignment&Ekspresi Strukturkendalialiran

6/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Sebelumpenjelasanmasingmasingkomponenitu(dibagianC.1s.d.C.7)berikut inisuatucontohalgoritmadalampseudopascal.Algoritmainitidakberartiapa apakarenahanyaditulisuntukmembantudibagianpenjelasanmasingmasing elemenalgoritmatsbkemudian.


function kubik(a: integer): integer; begin kubik := a*a*a; end;

Fungsi/prosedur Komentar

procedure sw(var a: real; var b: real); begin menukarkanisiadanb 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 sum.x := 0; sum.y := 0;

ProsesmengisikandatakedalammatriksTbldanarraystatus

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;

end.

Prosespencetakanhargahargasum.xdansum.y .... ....

C.1. Variabel
Variabel adalah elemen dari algoritma untuk menyimpan suatu harga tertentu padasuatusaatdanpadasaatlainhargadalamvariableitubisadiubahkeharga lainsesuaikebutuhan. Berikutiniaturanaturanuntukvariabel.

7/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Suatu variabel dituliskan dengan suatu nama secara unik dan nama variabeldapatterbentukdengankarakteralfanumeris 1(hanyahurufdan angka)kecualikarakterpertamaadalahalfabet.Misalnya: o Variabelvariabeldalamcontohdiatasbernama sum, Tbl, status, Idant0. Huruf besar dan huruf kecil sama saja (case insensitive 2) namun penulisanvariabeldiharapkanselalukonsistendalampenggunaanhuruf 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 katakata 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 majemukyangditandaielemenelemennyadenganindeks. Variabelberbentukmajemukatauyangdikenaldengannamaarray,harga indeksindeksarrayberkisardari0hinggabilanganpositiftertentu 3dan penulisan indeksnya setelah nama variabel tersebut di dalam sepasang kurungsiku.Nomorindeksdariarraydapatdigantikanolehhargasuatu variabellaindenganmenuliskannamavariabeltersebut.Misalnya: o status[I] menunjukan elemen array status ke I dan harga I sendiridalamalgoritmadapatberubahubahsehingga status[I] mengacupadaberbagaielemen. 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 koma 4 dengan alternatif sepasangkurungsikututup&buka 5(][).Misalnya: o statusadalaharraydenganindeksberkisardari0s.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
2DalambahasaCnamavariabelcasesensitivesementarabahasaPascalcaseinsensitive

kitabatasisajahanyaalfanumeris.

denganbahasaCwalaupundalambahasaPascalindeksinibisamenggunakanbanyakcara. 4MengikutiaturandalambahasaPascal 5MengikutiatuarandalambahasaC

3 Indeks dibatasi demikian untuk menjaga portabilitas (kemudahan untuk diimplementasikan)

8/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Jikacukupjelasjenisdanpenggunaanyamakasuatuvariabeltidakperlu dideklarasikan 6. Jika dideklarasikan maka penulisan mengikuti aturan deklarasivariabeldalambahasaPascalyaitudituliskandiawalprogram ataudiawalfungsi/prosedur.Misalnya: o Tbl,statusdansumdideklarasikantetapiIdant0tidak. Struktur komposit (variabel yang di dalamnya terdiri atas subvariabel 7) sedapat mungkin akan dihindari. Seandainya diperlukan maka akan mengikutiaturanpenulisanRecorddalambahasaPascaldanpenggunaan komponennya menggunakan aturan dalam bahasa Pascal yaitu nama variabeldannamasubvariabeldituliskandengandipisahkantandatitik. o Misalnya variabel sum memiliki dua subvariabel yaitu x dan y. Masing0masing bisa dianggap sebagai variabel tersendiri dengan namasum.x,dansum.y.

C.2. Perintah
Perintahadalahsatuanoperasionaldarisuatualgoritmamaupunalgoritma. Perbedaannya,perintahperintahdalamalgoritmabisadinyatakandalam kalimatkalimat bahasa seharihari sementara untuk program perintah perintah harus bisa dipahami dan dijalankan oleh komputer sehingga karenaketerbatasankomputerharusmengikutiaturanaturanpenulisan yangrinci.Misalnya: o Algoritma contoh di atas berisikan perintahperintah yang menggunakan kalimat bahasa Indonesia biasa dan perintah perintahmengikutiaturanpenulisanprogrambahasaPascal. Perintah dalam bahasa seharihari dibedakan dalam font penulisannya dariperintahyangmiripperintahprogram.Misaalnya: o dalamalgoritmacontohdituliskandenganhurufmiringsementara perintahdenganaturanbahasapemrogramandenganhurufbiasa dan diakhiri tanda ; (sebagai kebiasaan saja, keduanya menggunakan huruf courier untuk dibedakan dari bagian teks yanglain). Kadangkadang perintah dalam bahasa seharihari digunakan untuk mewakili sejumlah baris perintah dalam bahasa pemrograman sehingga diharapkan penulisan algoritma tidak terlalu berteletele namun tetap ataubahkandapatlebihmudahuntukdipahami. o Misalnya: Proses mengisikan data ke dalam .. (dst) menggantikan sederetan operasi mengenai pengisian Tbl dan Proses pencetakan . yang menggantikan perintahperintah untukmencetakhargavariabeltsb.
6 Deklarasi variabel dilakukan dalam sebagian besar bahasa pemrograman untuk menyatakan

jenis kemungkinan harga yang dapat diisikan padanya, ukuran/dimensi (khusus untuk array), danscope(bagianbagianmana)dariprogramiabisadigunakan. 7RecorddalamPascalataustructdalambahasaC.

9/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Sederetan perintah yang tidak menjadi fokus untuk ditampilkan dalam algoritmakadangkadangdigantidengansejumlahbarisyangberisititik titik(.).Misalnyapadacontohdiataspadabaristerakhir. Notasinotasipenulisanperintahmengikutinotasiyangdigunakandalam bahasaPascalyaituadayangbersifat assignmentyangdiikutiolehsuatu ekspresiatauhanyasatupemanggilanprosedurtertentu.

C.3. Assignment&Ekspresi
Assignmentadalahpemberiannilaipadasuatuvariableyangbisaberupaharga literal 8,hargadarivariablelain,atauhargayangdihasilkandarisuatuekspresi. Sementara ekspresi adalah operasi yang akan menghasilkan harga untuk diberikan pada variabel tersebut yang bisa merupakan ekspresi aritmatis maupunatauekspresilojik(LihatDalambahasaC,harusdiikutinotasibreak; karenatanpaitumakaalirannyajadisangatberbeda. C.4 Ekspresi Aritmatis& C.5 Ekspresi Lojik di bagian berikutnya). Aturan dalam penulisan assignment adalahsebagaiberikut. Aturan penulisannya adalah: nama variabel penerima diikuti tanda assignment:= 9selanjutnyanilaiatauekspresiyangmenghasilkannilai. Misalnya: o sum.x:=0artinyavariabelsum.xdiberinilailiteral0 o t0:=(Tbl[I,0]+Tbl[I,1])/2I*2;artinyavariabel t0diberi harga hasil ekspresi yang aritmatis di ruas kanan setelah tanda assignment.

C.4. EkspresiAritmatis
Suatuekspresiaritmatisberisikansederetanoperasiaritmatisdanjikayangjika dijalankanakan menghasilkansuatu bilangan (integeratau real).Suatu operasi aritmatisterjadiantaraduahargayangakandioperasikan(disebutoperand)dan sebuah operator kecuali untuk operasi unary yang hanya memerlukan satu operand. Notasinotasi operator arimatis: perkalian (*), pembagian (/), penambahan (+), pengurangan (), sisa pembagian (mod), pembagian denganpembulatankebawah(div). Jikaekspresiberisibeberapaoperasimakaoperasidenganordetertinggi yangakandilakukanterlebihdahulu. Urutan orde untuk operasi aritmatis mulai dari yang tertinggi hingga terendah adalah: perkalian/pembagian/modulo/divisi, kemudian penambahan/pengurangan(tanda/menyatakanberordesama). Untukyangberordesama,urutanoperasinyadilakukandarikirikekanan dalam penulisan ekspresi namun jika berpotensi membingungkan kadangkadangurutanbisadipertegasdenganbantuantandakurungdan
8

Harga literal adalah hargaharga yang pasti misalnya integer 0, 100,33; bilangan real 29.13,21.41;stringIndonesiaRaya,Olimpiadesains. 9 Dalam bahasa C assignment hanya dengan tanda = tetapi dalam pascal tanda = digunakan padapembandingankesamaanharga;dalampseudopascalinidibahasdibagianC.4.Ekspresi.

10/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

penggunaan tanda kurung memungkinkan bagian operasi yang ada di dalamtandakurungdilakukanterlebihdahulu.Misalnya: o (Tbl[I,0]+Tbl[I,1])/2I*2 akan dilakukan penjumlahan Tbl[I,0] + Tbl[I,1] terlebih dahulu kemudian hasilnya akan dibagi2dandikurangiolehhasilperkalianantaraIand2. Operandoperandbisavariabel,literal,atauhasildaripemanggilanfungsi. 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 bagianfungsi). Operasiunaryadalahoperasiyanghanyaberlakusebagaioperasiterkiri 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 dengan1. Jika operand berharga positif akan menjadi negatif dan sebaliknya jika berharganegatifmenjadipositif. Operasi tidak mengubah isi variabelvariabel yang menjadi operand tersebutkecualijikaiaadalahvariabelyangakanmenerimahasiloperasi tersebutdidalamoperasiassignmenthasildariekspresi(lihatbagian C.3 Assignment&Ekspresisebelumnya).

C.5. EkspresiLojik
Suatu ekspresi lojik bisa merupakan salah satu dari berikut ini: (1) satu harga literallojik,(2)suatuvariabellojik,(3)suatuekspresipembandinganharga,(4) operasilojikdariduaekspresilojikatau(5)negasisuatuekspresilojik.Keempat dankelimamemungkinkanekspresikombinasiyangkompleks. Ekspresipembandinganterdiriatasduaantitasyangakandibandingkan dan kriteria pembandingannya; penulisan berurutan entitas kiri kriteria pembandingandanentitaskanan. Kriteria pembandingyang dikenali adalah =(sama 10), < (lebih kecil), > (lebih besar), <= (lebih kecil atau sama dengan), >= (lebih besar atausamadengan),<>(tidaksama 11). Entitasyangakandibandingkanbisaberupavariabelbiasaatau ekspresi aritmatis (ekspresi aritmatis harus dituliskan di dalam tanda kurung!) atausuatuhargaliteralasalkankeduaentitasyangdibandingkanberjenis hargasama. Operasi lojik terjadi antara dua variabel lojik dan atau harga lojik (bisa dari hasil ekspresi pembandingan atau ekspresi lojik lain) dengan suatu operatorkecualijikaoperasinegasidianggapsebagaioperasilojikmaka iahanyamenggunakansatuoperand. Operatoroperator lojik yang memerlukan dua operand adalah: and, or, danxorsementaraoperatornegasiadalahnot.

10

Dalam bahasa C tanda pembandingan kesamaan ini dituliskan ganda (==) untuk membedakannyadenganassignment. 11DalambahasaCtandapembandinganketidaksamaaninidituliskandengan!=.

11/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Operatoroperatortsbdijalankandenganurutansesuaidenganordenya: dariyaangtertinggikeyangterendah,jikasamadarikirikekanandalam ekspresi. Urutanordedarioperatoroperatortersebut(daritertinggiketerendah): not,and,or/xor(tanda/menyatakanberordesama). Seperti halnya dalam ekspresi aritmatis, tanda kurung dapat digunakan untuk mengatur urutan operasinya. Untuk menambah kejelasan algoritmakadangkadangtandakurungdisertakan. Hasil ekspresi bisa diassign ke suatu variabel boolean atau bisa juga digunakan dalam perintah kendali aliran (Dibahas di C.6 Struktur kendalialiran). o Misalnya:dalamstatus[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 variabelstatus[I](padaposisiberindeksIdariarraystatus).

C.6. Strukturkendalialiran
Struktur kendali aliran adalah suatu bentuk/struktur yang memiliki peranan khususuntukmengaturaliranurutanpengerjaanoperasiataubeberapaoperasi tertentu. Terdapat sejumlah bentuk kendali aliran (atau dikenal juga dengan istilah struktur) sebagai berikut (penjelasannya masingmasing tedapat pada bagianD.1s.d.D.7): beginend o struktur untuk menjadikan sejumlah perintah atau elemen lain sebagaisatukesatuan ifthen o strukturuntukmenjalankanperintah(atauperintahperintahjika disatukan dalam struktur beginend) setelah notasi then jika ekspresi yang diperiksa (antara notasi if dan notasi then) berhargabooleantrue. ifthenelse o strukturuntukmenjalankanperintah(atauperintahperintahjika 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)setelahnotasifalse. fordo o pengulangan perintah (atau perintahperintah jika disatukan dalam struktur beginend) setelah notasi do dengan jumlah pengulangan sejalan dengan perubahan harga iterator yang dinyatakandiantaranotasifordannotasido. whiledo o pengulangan (iterasi) perintah (atau perintahperintah jika disatukan dalam struktur beginend) setelah notasi do selama

12/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

ekspresi yang diperiksa (antara notasi while dan notasi do) berharga boolean true. Jika pertama kali diperiksa langsung berhargafalsemakaiterasisamasekalitidakdilakukan repeatuntil o pengulangan (interasi) perintah atau perintahperintah antara notasi repeat dan notasi until hingga ekspresi yang diperiksa (setelahnotasiuntil)berhargabooleantrue.Jadiminimalsatu kalidijalankan. caseofend o jika ifthenelse adalah pencabangan aliran dengan dua cabang makastrukturinibisamemilikipencabanganyangsangatbanyak. Bentukbentuk kendali tersebut bisa bersarang yaitu suatu bentuk di dalambentukyanglain. o Misalnya: di dalam for I := 0 to 99 do ada beginend; di dalam beginend tsb ada ifthen dan kemudian di dalamnya ada lagi beginenddst. Untuk ifthen, ifthenelse, whiledo, repeatuntil, kriteria pengendalian aliranadalahsuatuekspresi. o Misalnya dalam if (status[I] or status[99I]) then ... sebagai ekspresi yang diperiksa adalah hasil operasi lojik antara status[I] denganstatus[99I]denganoperatorlojikor. 12

C.7. AlgoritmaUtama/Fungsi/prosedur
Algoritma utama adalah badan utama dari algoritma sebagai analogi program utama dalam program. Namun berbeda dengan program, algoritmabisajadihanyamerupakanbagiantertentudarisuatuprogram bahkanbagiandarisuatufungsi/prosedurdariprogramtsb. Fungsi/prosedur adalah sederetan perintah/operasi seperti halnya algoritma itu sendiri yang dipisahkan dari algoritma utamanya guna menjadikannyasebagaisubfokusdalamalgoritma.Dalamsuatualgoritma jikaapayangdikerjakandalamfungsi/proseduritudapatdianggapjelas maka fungsi/prosedur tersebut tidak dituliskan atau digantikan dengan kalimatbahasaseharihari. Pascal menyediakan sejumlah fungsi/prosedur yang siap pakai (tanpa pemrogrammenuliskanlagifungsi/proseduritu),dalamPseudopascalini beberapa fungsi/prosedur Pascal tertentu yang sangat umum juga digunakan. o Misalnya read (untuk membaca masukan), readln (membaca masukantermasukkarakterendofline),write(untukmencetak keluaran),writeln(mencetakkeluarandansuatuendofline),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 memperjelaspenulisanalgoritma. 13/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Mengikuti definisi Pascal, fungsi dibedakan dari prosedur dari adanya harga yang dihasilkan oleh fungsi sebagai akibat dari pemanggilan/penggunaanfungsitersebut. 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 setelahnamafungsi/proseduritu. 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 referenceyangdikirimkanadalahvariabelitusendiri.Perbedaankedua argumen ini dinyatakan di daftar argumen di bagian definisi fungsi denganmengawalinamavariabelybsdengannotasivar. o Misalnya:fungsi kubikdiatasmemerlukansatuargumencallby value dan prosedur sw memerlukan dua argumen call by reference. Untukcallbyvalueselainsuatuhargaliteral,hargasuatuvariabel,bisa jugahasildarisuatuoperasiaritmatisatauekspresilojik. 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 menggantikannyadidalamoperasi/ekspresiyangbersangkutan. o Misalnya:dalamsum.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 hasilnyadiassignkembalikesum.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 namavariabelyanglain),saatkembalikepemanggilperubahanitutetap berlaku. o Misalnya:dalampemanggilansw(sum.x, sum.y)variabelsw.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 sudahtertukar.

D. AturanaturanPenulisanStrukturKendaliAliran
Secara umum aturanaturan penulisan struktur kendali aliran ini mengikuti aturan bahasa Pascal. Seperti hanya Pascal (dan bahasabahasa lain, penulisan notasnotasi, perintahperintah atau ekspresiekspresi tidak harus dibaris tersendiri/tertentu;bisasajabeberapaelemenimidituliskanbergabungdengan barisyangsama.Namun,demikejelasandalampembacaanalgoritmabeberapa kebiasaandilakukan(tapitidakharus).

14/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

Perintahyangditulisdalambahasasehariharidituliskantidakdicampur dalamsatubarisdenganelemenalgoritmayanglain. Indentasiyangsamauntukblokstrukturyangsamasangatdisarankan..

D.1. Strukturbeginend
Perintahperintah dalam satu deret yang menjadi satu kesatuan struktural (satu blok) dituliskan di antara notasi begin dan notasi end. PerintahyangditulisdalamnotasibahasaPascaldituliskandengantanda separator ; di akhir setiap perintah sementara perintah dalam bahasa sehariharidituliskantanpatandaseparatortsb. Jika terdapat struktur lain di antara satu beginend, maka struktur itu diperlakukan sebagaimana perintah yang ditulis dalam bahasa pascal (diakhiriseparator;).

D.2. Strkturifthen
Kondisiyangakandiperiksadalamstrukturiniadalahekspresilojikyang diletakan di antara notasi if dan notasi then. Perintah (atau perintah perintah) yang akan dilakukan jika ekspresi lojik itu berharga boolean truediletakkansetelahnotasithen. Jika lebih dari satu perintah maka perintahperintah itu dijadikan satu kesatuanstrukturdengantambahannotasibeginendyangmengapitnya.

D.3. ifthenelse
Seperti pada ifthen, kondisi yang akan diperiksa dalam struktur ini adalah ekspresi lojik yang diletakan di antara notasi if dan notasi then. Perintah(atauperintahperintah)yangakandilakukanjikaekspresilojik itu berharga boolean true diletakkan setelah notasi then dan perintah (atau perintahperintah) yang akan dijalankan jika berharga false diletakkansetelahnotasielse. Baik untuk then maupun untuk else, jika lebih dari satu perintah maka masingmasing perintahperintah itu dijadikan kesatuankesatuan strukturdengantambahannotasi beginendyangmengapitnya(masing masing).

D.4. fordo
Di antara notasi for dan notasi do ekspresi iteratif (ekspresi yang menyatakanbagaimanaiterasiituharusterjadi)dituliskan. o Penulisanekspresiiteratifberisi o nama variabel iterator (variabel integer yang harganya akan berubahubahsejalandenganiterasiyangterjadi), o setelahtandaassignmentdituliskanhargaawaliterator(yangbisa merupakansuatuhargaliteralatauekspresiaritmatis), o notasi to atau downto yang menyatakan arah harga iterator menaik atau menurun, harga terakhir interasi itu masih akan
15/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

dilakukan (yang bisa merupakan suatu harga literal atau suatu ekspresiaritmatis),dan o jikakenaikan/penurunanbukanbilangan1,hargaperubahanyang terjadi pada iterator setiap satu iterasi dilalui dinyatakan dengan notasistepdandiikutihargaperubahannya(misalnyastep2). Setelahnotasi doperintah(atauperintahperintah)yangakandilakukan pada setiap kali iterasi dituliskan. Jika lebih dari satu perintah maka perintahperintahitudijadikansatukesatuanstrukturdengantambahan notasibeginendyangmengapitnya.

D.5. whiledo
Kondisiyangakandiperiksaadalahekspresilojikyangdiltakandiantara notasi whiledannotasi do.Perintah(atauperintahperintah)yangakan dilakukan secara berulangulang selama ekspresi lojik itu berharga booleantruediletakkansetelahnotasido. Jika lebih dari satu perintah maka perintahperintah itu dijadikan satu kesatuanstrukturdengantambahannotasibeginendyangmengapitnya.

D.6. repeatuntil
Kondisi yang akan diperiksa adalah ekspresi lojik yang diltakan setelah notasi until. Perintah (atau perintahperintah) yang akan dilakukan dan kemudiandiulangulangselamaekspresilojikituberhargaboolean false diletakkanantaranotasirepeatdannotasiuntil.

D.7. caseofend

13DalamBahasaC,sebelumhargaliteraltsb,adanotasicasemendahuluinya. 14

Hal yang akan diperiksa adalah variabel atau ekspresi arinmatis yang memiliki hargaharga tertentu. Variabel atau ekspresi aritmatis itu diletakkandiantaranotasicasedannotasiof. Di antara notasi of dan notasi end terdaftar sejumlah kemungkinan harga/kasusdanperintah(atauperintahperintah)yangakandijalankan untukkemungkinanhargatersebut. Satu harga literal 13 yang mungkin 14 diletakkan di sebelah kiri, diikuti notasi : (titik dua) lalu diikuti oleh perintah yang akan dijalankan selanjutnyasebuah;(titikkoma) 15. Jikaadabeberapaperintahyangakandijalankanmakaperintahperintah itudijadikansatukesatuanstrukturdengantambahannotasi beginend yangmengapitnya.

Dalam Pascal harga yang mungkin ini bisa dinyatakan sebagai range harga yang mungkin misalnyabilanganbilanganantara1sampaidengan10denganmenulisnyasebagai1..10atau beberapa kemungkinan harga dengan dipisahkan koma misalnya 2, 5, 9. Hal ini tidak ada di bahasaCsehinggadalamPseudopascalinihalitudihindari. 15 Dalam bahasa C, harus diikuti notasi break; karena tanpa itu maka alirannya jadi sangat berbeda.

16/110

Pseudopascal
v.060518

Penulis:SuryanaSetiawan,M.Sc.

E. AturanaturanPenulisanProsedurdanFungsi
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 seharihari, perintahperintah rinci yang bukan fokusdiperlihatkansebagaibaris..Sepertihalnyanamavariabelnamanama prosedur maupun function bersifat case insentitive namun demi untuk memberikankejelasandalampembacaan,penamaanprosedur/functionmaupun variabeldirekomendasikanuntukkonsistendisetiapbagianalgoritma. Dalam bahasa Pascal, suatu prosedur/function dapat memiliki prosedur/function lokalnya sendiri. Dalam pseudocode ini demi kompatibilitas denganbahasalain,halituditiadakan.

E.1. Prosedur
Mengawali suatu prosedur notasi procedure dituliskan dan diikuti nama prosedur. Jika ada argumen, mana argumenargumen 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 demimempersingkat,jenisvariabelbisadihilangkan.Untukmenunjukkansuatu argumenbersifatpassbyreferencemakadidepannamaargumenitudituliskan notasivar(sepertipadabahasaPascal). Berikutnya jika ada variabel lokal yang perlu ditonjolkan didaftarkan (beserta jenisvariabeltersebut)setelahnotasi var.Badanalgoritmaprosedurdituliskan diantarabegindanenddandiikutitanda;(titikkoma).

E.2. Fungsi
Mirip seperti pada prosedur kecuali tiga hal berikut ini. Pertama, yang mengawalifungsiadalahnotasi function.Kedua,setelahnama(sertaargumen argumennyayangdituliskandidalamtandakurung),suatunotasi:(titikdua) dan jenis harga yang akan dihasilkan fungsi dituliskan. Ketiga dalam badan algoritma nama fungsi digunakan seolah suatu variabel penerima assignment yangapabilaalgoritmadalamfungsiselesaidijalankanmakahargaterakhiryang diberikanpadanyaadalahhargayangakandikembalikankealgoritmapemanggil fungsiini.Jikanamafungsiberadasebagaioperanddarisuatuoperasimakayang terjadiadalahpemanggilanfungsiterhadapdisinyasendiriyangdikenaldengan istilahrekursif.

17/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

MATERIUJIOLIMPIADESAINSBIDANGINFORMATIKA
ContohcontohdanPembahasan

A. Pengantar
1. OlimpiadeSainsNasional
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 melaluiseleksibejenjangdanserentakdiseluruhIndonesia,yaitu: tingkatkabupaten/kota,kemudian tingkatprovinsi. Tahun2006,untukbidanginformatikaditingkatprovinsitercatat diikuti 1480 siswapesertaseleksisementaraditingkatkabupaten/kotatentunyasekiankali lebihbanyaklagi(estimasikasaradadiatas8ribuansiswa 1).Hasildariseleksi tingkatpropinsimenentukansiapayangakanmenjadisalahseorangdarike90 siswapesertaOSN. 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 tingkatduniayaituInternationalOlympiadinInformatics(IOI).

2. InternationalOlympiadinInformatics
IOI sendiri adalah lomba yang menguji kemampuan peserta dalam problem solvingdenganpemrogramankomputer 2.Setiappesertadalamwaktuyangamat 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 menghasilkankeluaranyangsesuaidenganyangdiharapkan. 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 efisiensidariprogramyangdibuatsaatdijalankan.
Ini hanya dugaan saja karena di tingkat kabupaten/kota, penyelenggaraan beserta proses seleksidiserahkankemasingmasingkabupaten/kotayangbersangkutansehinggadatapeserta tidaktercatatdenganlengkap.Sementara,ditingkatpropinsi,prosesseleksidilakukandipusat sehinggabisadiketahuijumlahkeseluruhanpeserta. 2 Harap bagian yang digarisbawahi tersebut dipahami secara lengkap; bukan HANYA menguji kemampuan membuat program komputer, bukan pula HANYA menguji kemampuan memecahkanmasalah,tetapiKEDUANYA!!!

18/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

3. MetodadanProsesSeleksidiOSN
Proses seleksinya idealnya adalah mengacu ke IOI. Namun berbeda dengan bidang OSN lain seperti Fisika, Matematika, Kimia dan Biologi, bidang informatikakhususnyapemrogramanbelummenjadipelajaranresmi.Kalaupun ada,hanyadisekolahsekolahtertentusajadanitupunbelumtentumengajarkan pemrograman. Oleh sebab itu, materi uji disesuaikan agar peserta potensial secara akademis/skolastik tinggi masih dapat terjaring untuk diberikan pembinaanyangintensif.Penyesuaiannyaadalahmengurangiaspekyangsangat bergantung pada ketrampilan peserta dalam pemrograman dan sebagai gantinya,digunakanmateriyangbiasanyadisebutsebagaimateriujianalisadan logika. Pada dasarnya materi ini menguji potensi akademis/skolastik peserta yangmenjadibagianterpentingdalamkemampuanproblemsolvingpeserta.

4. MetodadanProsesSeleksipraOSN
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,metodapengujiannyapuntidakbisadihindaribersifattestobyektif(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 jawabanyangdirancangdenganmatang.

5. KlasifikasiSoalsoalNonprogramming
Secara umum materi uji tertulis terbagi atas tiga komponen utama: materi uji analitikadanlogika,materiujiaritmatika,danmateriujialgoritmika. 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 pemecahanmasalahnya. Materi arimatika sebenarnya sejalan dengan analitika dan logika di atas karena soal aritmatika disini bukan sekedar menguji ketrampilan dalam hitungmenghitung,tetapilebihpadacaraberpikiryanglogisdananalitis namundengansoalbertemakanaritmatika Materi algoritmika bertujuan untuk menguji kemampuan peserta dalam memahami dan menyusun suatu algoritma. Aspekaspek yang terkait dengan pengetahuan dan bahasa pemrograman direduksi seminimal mungkinketingkatpseudocode.

3Ujipemrogramanditingkatprovinsi,apalagiditingkatkabupaten/kota,masihperlubeberapa

tahunlagihinggainfrastrukturdisetiapdaerahsudahmerata. 19/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

B. MateriUjiAritmatika
Sekali lagi, walaupun mengambil topik mengenai aritmatika, aspek terpenting dari materi ini bukan pada hitung menghitungnya tetapi pada uji kemampuan analitisnya. Aspekaspek analitis dalam persoalan aritmatika dijelaskan pada bagianberikutini.

1. Mampu Membentuk Model Aritmatika/Matematika melakukandeduksi/induksiModel

serta

Dalamproblemsolving,seringkalidiperlukantahapanpemodelanmasalahyang sebagian menggunakan model matematika/aritmatika dan menyederhana kannyasehinggamenjadimodelyanglebihsederhanadansiapdikomputasikan dalambentukalgoritma.Modelyangtidaktepatberakibatpadakegagalandalam pemecahanmasalah. Contoh: Uang Amir lebih banyak dari uang Ali. Jika dijumlahkan uang keduanya lebih dari 50 ribu rupiah, sementara selisih uang Amir dengan uang Ali lebihdari30riburupiah.BerapakahkemungkinanuangAmiryangpaling tepat? Model permasalahan: Uang Amir = x, Uang Ali = y, dan dari deskripsi di atas PersI:x>y PersII:x+y>50000 PersIII:|xy|>30000 DariPersIdanPersIII:menghasilkanPersIV:xy>30000 DariPersIIdanPersIV:jikadijumlahkanmenghasilkan2x>80000. Maka,x>40000

2. MemahamiSifatsifatBilangan
Untuksejumlahmasalah,sifatsifatdaribilanganharusdipahamisecaralogis Contoh: Jikandanpadalahduabilanganbulat,dann+pberhargaganjil,manakah dariberikutinibilganjil? (A)np+1 (B)np (C)n2+p21 (D)3p+5n (E)(pn)(np) 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 ditambah1menjadigenap. B bulan karena perkalian antara suatu bilangan genap dengan bilangan apapunakanmenjadigenap. C bukan karena pangkat bulat positif berapapun dari bilangan genap, tetapgenap,danganjiltetapganjil,kemudianganjilditambahgenapdan dikurangganjilmenjadigenap.
20/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Dbukankarenapangkatbulatpositifberapapundaribilanganganjiltetap bilanganganjil,danjumlahduabilanganganjilmenjadigenap. E benar, karena perkalian antara dua bilangan ganjil menghasilkan bilanganganjil.

3. MengkaitkandenganKonteksMasalah
Konteksdarisoalperludiperhatikandankontekstersebutkadangkadanghanya tersiratsaja.Yangdimaksuddengankonteksdisiniadalahpemahamanumum akansesuatuyangsewajarnyadiketahuipula. Contoh: jikaloncengberdentangsetiap1detik,dalamjumlahdentangyangsesuai waktuyangditunjukkan,makatepatpadapukulberapadentangterakhir yangmenunjukkanjam6?Apakahpukul6:00:06? Salah,seharusnyapukul6:00:05karenadentangdentangtsbpadapukul 6:00:00,pukul6:00:01,pukul6:00:02,pukul6:00:03,pukul6:00:04dan pukul6:00:05!!Konteksdisiniadalahdentangpertamaterjadipadatepat pukul6,danpenomorandetik/menitdimulaidari0,1,...dst.

4. MemahamiFormulaRekursif
Banyak masalah pemodelan dengan tingkat kesulitan yang tinggi atau pemrogramannya sendiri memerlukan pemecahan dengan algoritma rekursif. Pemahaman fungsi rekursif membantu dalam pemahaman memahami bagaimanabekerjanyaalgoritmarekursif. Contoh: Jika didefinisikan f(n) = n f(n1) untuk setiap n > 0 dan f(0) = 1, maka berapakahf(10)/(f(7)xf(6))? Pahamiperilakufungsirekursiftsb,sbb, f(n) = n.f(n1) = n.(n1).f(n2) = n.(n1).(n2).f(n3) = ... = n(n1)(n 2)(n3)....2.1=n! Sehingga,f(10)=10!danf(7)=7!sertaf(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. EksplorasidalamMasalahKombinatorik
Dalamproblemsolvingseringkalimasalahyangdiberikanbersifatkombinatorik (mendapatkan setiap kemungkinan kombinasi/permutasi jawaban). Untuk memecahkannya terkadang seluruh kemungkinan tersebut harus diperiksa untukmendapatkanpemecahanyangumum. 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 biayayangbergantungpadaurutannya: Urutan(A.B).C(yaituAdikaliBdahulukemudiandikaliC),dan urutanA.(B.C)(yaituBdikaliCdahulukemudiandikaliA).

21/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Urutan (A.B).C memerlukan harga mnp + mpq sementara urutan A.(B.C) memerlukan harga npq + mnq. Kedua harga bisa berbeda sesuai dengan hargaharga m, n, p, qtsb.Pertanyaannya,untukperkalianempatmatriks A.B.C.DdenganA(10x4),B(4x15),C(15x2),danD(2x20)manakahurutan denganbiayaminimum? Kemungkinankemungkinan urutan adalah (diperoleh dengan permutasi ketigatandaperkalian.): - urutan(((A.B).C).D),biaya10x4x15+10x15x2+10x2x20=1300 - urutan((A.B).(C.D)),biaya10x4x15+15x2x20+10x15x20=4200 - urutan((A.(B.C)).D),biaya4x15x2+10x5x2+10x2x20=600 - urutan(A.((B.C).D)),biaya4x15x2+4x2x20+10x4x20=1080 - urutan((A.B).(C.D)),biaya15x2x20+10x4x15+10x15x20=4200 - urutan(A.(B.(C.D))),biaya15x2x20+4x15x20+10x4x20=4200

6. BerpikirsecaraCerdas
Jika menghadapi suatu masalah komputasi yang kelihatannya tidak mungkin, pasti ada sesuatu di balik itu!! Dapatkanlah dengan bantuan pemahaman akan sifatsifat operasi aritmatika untuk mendapatkan model matematis yang lebih sederhana. Contoh1: Berapa digit terakhir dari 22003? Apakah anda ingin menghitungnya sendiri (secara manual)? Tentu tidak, pasti ada penyederhanaannya. Denganmengubahn=1,2,3,,dst,perhitungan2nmenghasilkanderet1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, dst. Amati angka terakhirdarisetiapbilangan,kitamendapatkanperulangandari624 8padanmod4=0,1,2,3.Jadijikan=2003,diperoleh2003mod4=3, yaitumemilikidigitterakhir8. Contoh2: 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.Ada2002pasangfaktorfaktortsbsehingga22002x52005=53x 102002=125102002.Penjumlahantigadigitawal1+2+5=8 Contoh3: Hitunglah(80!x38!)/(77!x40!). Menggunakansifatsbbuntukadanbbulatpositif,a>b,makaa!/b!=a.(a 1).(a2)(b+1).Maka (80!x38!)/(77!x40!)=(80!/77!)/(40!/38!) =(80x79x78)/(40x39) =(80/40)x(78/39)x79 =2x2x79=316 yangdapatdihitungtanpakalkulator.
22/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

C. MateriUjiAnalitikadanLogika
Dalam pemodelan masalah pemrograman selain dengan model aritmatika, juga keterhubungan antara entitas/aspek dalam masalah perlu dipahami secara relationaluntukmendapatkanmodelalgoritmisyanglebihakurat.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 pemecahanmasalahnya,yaitu penggunaan model diagram sangat membantu untuk menggambarkan keterhubungannyasecaramenyeluruhberdasarkanketerhubunganyang fragmental (dari pernyataanpernyataan terpisah atau asumsiasumsi yangdibuat), keterhubungan itu sendiri seringkali bersifat implisit sehingga perlu pemahaman yang hatihati dan perlu pemahaman akan gaya bahasa penceritaannya, khususnya untuk asumsi yang dibuat segera dieliminasi jika kontradiksi denganmodeldiagram,dan model diagram yang telah dibentuk perlu diverifikasi (dikaji ulang) dengan pernyatanpernyataan yang diberikan agar terjaga konsistensi, dan Selalu berpikiradanya kemungkinan yangtertinggal atau tersamar yang belumdikajikedalammodel Contoh1: 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 pernyataanpernyataanberikut: (1)Dberharga3kurangnyadariA (2)Badalahangkaditengahjikasemuadiurutkan (3)KurangnyaFdariB=kurangnyaDdariC (4)GlebihbesardariF Jikadiurutkan,urutannyaadalah? Untukmemudahkanurutantsbmisalnya[x1x2x3x4x5x6x7] Dariperny.(2)diketahuix4=B,makamenjadi[x1x2x3Bx5x6x7] Dariperny.(3)FberadadiruassebelahkiriB(bisax1,x2ataux2). JikaF=x1maka Dadalahx2danCadalahx5([FDx3BCx6x7]),atau Dadalahx3danCadalahx6([Fx2DBx5Cx7]). Akan tetapi dari perny. (1) membatalkan kedua kemungk. asumsi ini karenaAharusberada3posisidikananDyangsudahditempatiC. JikaF=x2maka Dadalahx1danCadalahx3([DFCBx5x6x7]),atau Dadalahx3danCadalahx5([x1FDBCx6x7]),atau Dadalahx5danCadalahx7([x1Fx3BDx6C]).

23/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Akantetapidariperny.(1)hanyayangkeduayangmungkinkarenayang pertama posisi A = posisi B atau yang ketiga posisi A berada di luar (setelah x7). Untuk sementara [x1FDBCAx7] dicatat sebagaisalah satusolusi. JikaF=x3maka Dadalahx1danCadalahx2([DCFBx5x6x7]),atau Dadalahx5danCadalahx6([x1x2FBDCx7]),atau Dadalahx6danCadalahx7([x1x2FBx5DC]). tetapi dari (1) semua tidak mungkin (yang pertama posisi A = posisi B, keduayanglainposisiAadadiluar). Jaditernyatahanyatinggalsatukemungkinanyaitu[x1FDBCAx7]. Dari perny. (4) diperoleh G=x7, sehingga diperoleh juga E=x1. Hasilnya diketahuiurutannyaadalahE,F,D,B,C,A,G Contoh2: Delegasidelegasi darinegara W dan negara R duduk berhadaphadapan pada meja perundingan. Masingmasing 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 beranggotakanF,G,H,I,danJ.Masingmasingdelegasiberada padasisi sisi memanjang berlainan (satu negara pada sisi yang sama dan ketua duduk di tengah delegasinya). Batasan dalam mengatur urutan duduk mereka: (1)DelegasiWmenempatkanAdanBdikeduaujungbarisannya. (2)KupingkananGtulishgiaharuspalingkanandaridelegasiR. (3)BaikDmaupunFbukanketua. (4)ParaatasemiliterW,salahseorangnyaB,didudukkanberdampingan, dantidakadasatupunyangberseberangandenganatasemiliterR (5)Gbukanatasemiliter. (6)Cwakildarikamardagang,dudukberseberangandenganH. ManakahyangpalingmungkinmengenaiFberikut? (A)WakilkamardagangyangdudukdisebelahI (B)WakilkamardagangyangdudukdisebelahH (C)WakilkamardagangyangdudukberseberangandenganB (D)AtasemiliteryangdudukdisebelahI (E)AtasemiliteryangdudukdisebelahJ Sepertipadacontohsebelumnya,dibuatdiagramsbb x1x2x3x4x5negaraW y1y2y3y4y5negaraR Dari(1)kemungkinan{x1,x5}adalah{A,B}atau{B,A} Dari(2)makay5=Gyangkarenapernyataan(4)dan(5)(Gbukana.mdan Badalaha.m)menyebabkanx5=B,sehingga(atasemiliterdenganbold) Ax2x3x4B y1y2y3y4G Daripernyataan(6)dan(4)diperolehC=x2dany2=H,sehingga

24/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

ACx3x4B y1Hy3y4G Daripernyataan(3)dandiagramdiatasD=x4danF=y1atauy4 ACEDB y1Hy3y4G Jaditinggal2kemungkinanF=y1(atasemiliter),atauF=y4(wakilkamar 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)salahkarenaBadadidepanG.Jaditinggalpilihan(A)yang paling mungkin. (Note: ini bukan satusatunya kemungkinan. Kemungkinanlainnyamasihadatapitidakadadikelimapilihanitu).

D. MateriUjiAlgoritmika
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 kemudianditingkatOSN. 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 soalsoal. Penulisan algoritma mungkin menggunakan suatu cerita (bahasa seharihari) atau mengikuti notasi/tatacara yang didefinisikan sebagai pseudopascal 4. Proses dari algoritma umumnya bersifatprosedural/imperatifsaja 5. Aspekaspekyangbiasanyadiujikanadalah: 1. penggunaan variabel (berarti sifatsifatnya juga) dalam kaitannya dengan proses algoritma tetapi tidak berkaitan dengan sifat variabel yangspesifikpadabahasapemrogramantertentu 6.

http://www.toki.or.id/toki2006/pseudopascal.pdf Hingga IOI 2006 soalsoal yang diujikan masih mementingkan efisiensi dalam problem solvingnyasehinggarancanganyangobjectorientedataupundeklaratifbelumperlu(ataumalah tidakdisarankandemiefisiensisolusi)untukdigunakan.Bahasapemrogramanyangpopulerdi IOI adalah FreePascal, C dan C++. Khususnya C++ digunakan terutama untuk memudahkan sejumlahcodingnyasaja,bukankarenaaspekobjectorientednya. 6 Dalam bahasa C terdapat kerumitan definisi mengenai array yang tidak terjadi dalam bahasaPascal.DalambahasaJavacharacteryangdigunakandalamStringadalahunicode(16 bit) sementara dalam bahasa C atau Pascal adalah byte (8 bit). Dalam bahasa Pascal terdapat variabel tipe string standard pascal yang byte ke0 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 negatif,jugadapatmenggunakanindeksnonnumerik.

4Lebihtepatnya,TOKIPseudopascaldengandokumenyangdipostingdiwebitedenganURLdi

25/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Contohcontoh 1. Diberikanfungsiberikut

2. aliran kendali proses 7: blok beginend, pecabangan ifthen, pencabangan ifthenelse, pencabangan caseoption, loop whiledo, looprepeatuntil,danloopfor. 3. ekspresilojikdenganoperatorlojikand,or,xor,not, 4. pemanggilanprosedurdanfungsidan 5. aliranprosesdarialgoritma(prosedurataufungsi)rekursif 6. strukturarray(satudimensiataulebih)

function apaini(a: integer; b: integer): integer; var x,y,r: integer; begin x := a; y := b; while (y <> 0) do begin r := x mod y; x := y; y := r; end; apaini := x; end;

Pertanyaan:Jikafungsitsbdipanggildenganwriteln(apaini(414, 662)); berapakahyangdicetaknya? Pembahasan: Pemanggilan tsb akan dijalankan dengan variabel a mulamula berharga 414 dan b berharga 662. Kedua variabel dalam algoritma tidak mengalamiperubahanapapun,jadifungsinyahanyamenyampaikanharganyake variabel x dan y masingmasing. Dalam fungsi tersebut terdapat struktur loop whiledo dengan variabel yang aktif (berubahubah) dalam loop tersebut bernamaxdany.Terdapatvariabellainyaituryangberfungsi sebagaivariabel pembanduoperasi.Dalamstrukturbeginenddidalamloopwhiledotsbterjadi perubahanhargaxdigantidenganydanydigantidenganhargaryangsebelum x dan y berubah r diisi x mod y. Jadi algoritma ini saling memodulokan dua bilangan.Dalammemahamiloopwhiledo,pentingdiperhatikaninisialisasidan kondisi iterasi berakhir. Inisialisasinya adalah mengisi variabel x dengan 414 dan y dengan 662. Iterasi akan berakhir apabila y sebagai variabel yang akan memodulokanxberharga0.Jadiurutannya: 414mod662=414 662mod414=248 414mod248=166 248mod166=82 166mod82=2 82mod2=0 Iterasi berhenti karena y berikutnya berharga 0. Terminasi algoritma mengembalikanhargaxyaitu2kepemanggilfungsi.Terakhir,pemanggilfungsi melakukanpencetakanhargayangdiperolehdaripemanggilantersebutyaitu2. Jadijawabnyaadalah2.

2. Diberikanfungsiberikut
7Dalamedisipseudopascalyadsedangdipertimbangkanstruktur exception handling trycatch. Untukedisisekarangbelumtermasuk.

26/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

function apaitu(a: integer; b: integer): integer; begin count := count + 1; if (a > b) then apaitu := apaitu(b, a) else if (a = 0) then apaitu := b else apaitu := apaitu (b mod a, a) end;

Ituditandaiadanyapemanggilanfungsibernamasamadengandirinya.Di dalam fungsi ada struktur bersarang (nested structure) ifthenelse membentuk3pencabangan. - Cabang pertama, jika harga dalam variabel a lebih besar dari b, algoritma akan melakukan pemanggilan rekursif dengan penukaran posisivariabelamenjadibdanbmenjadia. - Cabangkedua,jikaaberharga0makaakandikembalikanhargab. - Cabangketiga,tentuuntukalebihkecildarib,akanmemanggilsecara rekursifdenganposisihargaadiberiharga(bmoda)danposisiharga bdiberihargaa. Untuk semua cabang, tidak ada operasi lain sehingga hasilnya langsung dikembalikan ke pemanggil sebelumnya. Operasi pada variabel count tidakberartiapaapaberkenaandenganpertanyaanini. Pemanggilan apaitu(1001, 1331)akanmembawakecabangketigalalu memanggi apaitu(330, 1001). Kemudian akan membawa ke cabang ketiga lagi lalu memanggil apaitu(11, 330). Kembali lagi ke cabang ketiga dan memanggil apaitu(0, 11). Pemanggilan terakhir ini akan memberikan harga variabel b menjadi harga yang dikembalikan dari fungsitersebut,kemudianditeruskankepemanggilansebelumnya,hingga kepemanggilanpertama.Jadijawabannya11. Catatan: Jika anda dapat memahami algoritmaalgoritma pada kedua contoh di atas dengan baik, maka contoh ini dan contoh di atas menghasilkanhargafungsiyangtepatsama. 3. Diberikanfungsiberikut
if (a and b) or ((not c) and d) then if ((a or not b) and c) or (b and (not a)) then writeln(1) else if (a or (d and b)) and (not b) then writeln(2) else writeln(4) else if not (d and c) and (not a) then writeln(5) else writeln(6);

Pertanyaan: Jika fungsi tsb dipanggil dengan writeln(apaitu(1001, 1331));berapakahyangdicetaknya? Pembahasan:Fungsitersebutadalahfungsirekursifdengannama apaitu.

Pertanyaan: Jika dijalankan dan ternyata mencetakkan harga 4 maka urutan hargahargaa,b,c,dyangmungkinadalah? (A) TRUE,FALSE,TRUE,FALSE

27/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

(B) (C) (D) (E)

TRUE,TRUE,TRUE,FALSE FALSE,FALSE,TRUE,TRUE TRUE,TRUE,FALSE,FALSE TRUE,FALSE,FALSE,TRUE

Pembahasan: Untuk soal ini pilihan harus diujikan pada setiap ekspresi boolean/lojikdalamalgoritmadiatas.UntukmemudahkankitasebutE1, E2,E3danE4untukkeempatekspresilojikdiatasdimulaidariekspresi palingatas.Pilihan(A):E1berhargaFALSE,lalumemeriksaE4yangjuga FALSEsehinggamenjalankanwriteln(6). Pilihan (B): E1 berharga TRUE, lalu memeriksa E2 dan juga TRUE, kemudianmenjalankanwriteln(1). Pilihan(C):E1berhargaFALSE,lalumemeriksaE4yangberhargaTRUE, kemudianmenjalankanwriteln(5). Pilihan(D):E1berhargaTRUE,lalumemeriksaE2yangberhargaFALSE, kemudian E3 berharga FALSE kemudian menjalankan writeln(4). Jadi untukmencetak4,makapilihanDyangbenar. Untukcrosscheckdanmasihadawaktudalammelakukannya,pilihan(E) bisa diperiksa: E1 berharga TRUE lalu memeriksa E2 yang berharga FALSEdankemudianE3TRUEsehinggamenjalankanwriteln(2). Catatan: untuk pemeriksaan ekspresi lojik, jika cukup berlatih maka pemeriksaantersebutbisadipercepatdenganhanyamemeriksasebagian dari ekspresi. Misalnya operator or hanya mensyaratkan salah satu dari kedua operand yang TRUE menyebabkan ekspresi tersebut TRUE, sebaliknya jika salah satu operand dari operator and berharga FALSE makaekspresitersebutmenjadiFALSE. 4. Suatu robot berdasarkan harga a bilangan positif yang diberikan, akan menjalankan sederetan perintah berikut (algoritma dengan penulisan bahasaseharihari): begin melangkahdenganjarakakedepan, memutararahkekanantegaklurus, melangkahsepanjang2a, memutarkearahkiritegaklurus, melangkahsepanjanga, memutarkearahkiritegaklurus, melangkahsepanjang3a, memutarkearahkiritegaklurus, melangkahsepanjanga. memutarkearahkanantegaklurus. end; Pertanyaan:ikaposisiawaladadi(0,0)danrobotsedangmenghadapke arahsumbuypositif,dengana=2makaposisiakhirrobotadalah?

28/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Pembahasan:Perhatikandiagramlintasantsb.Ternyata,robotpadasaat awaldi(0,0)menghadapkesumbuy,setelahmenjalanilintasannyaakan beradadi(1.5a,0.5a)danmenghadapkekiri(270o)darisemula.Dengan a=2makaakanberadadi(3,1). Deretan langkah di atas digambarkan pada Gambar 1 ternyata efeknya sama saja dengan hanya melakukan langkahlangkah seperti pada Gambar 2. Jadi selanjutnya, cukup memperhatikan kondisi awal dan kondisiakhirtersebut,kemudianputarkankekanan90o.
(-1.5a,1.5a) (2a,1.5a)

(0,a)

(2a,a) (-1.5a, 0.5a)

(0,0)

Gambar 1

(-1.5a, 0.5a)

(0,0)

Gambar 2 Pertanyaan:Sekarangdenganpertanyaanbaru:jikaposisiawaladadi(0, 0) dan robot sedang menghadap ke arah sumbux positif, dengan a = 4 makadimanakahposisiakhirnya? Pembahasan:DenganmemutarkanGambar2makadiperolehposisiakhir di (0.5a, 1.5a) seperti terlihat pada Gambar 3. Dengan a = 4, posisi menjadimenjadi(2,3)danmenghadapkesumbuypositif.

29/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

(b+0.5a, c+1.5a) (0.5a, 1.5a)

(b,c) (0,0)

Pertanyaan: Kalau posisi awal bukan di (0,0) melainkan di (b, c) maka dimanakahposisiakhirtsb? Pembahasan:SederhanasajasepertiterlihatpadaGambar4,tinggalgeser posisiawaldari(0,0)ke(b,c),menjadi(b+0.5a,c+1.5a). Pertanyaan:Jikaposisiawaladadi(0,0)danrobotsedangmenghadapke arah sumbux positif, deretan perintah tersebut dilakukan secara berulang sebanyak 2 kali (3 kali, 4 kali, dst) maka posisi akhir robot adalah? Pembahasan: Jadi ingat untuk selalu memperhatikan posisi awal dan akhirsajasepertipadaGambar2: Pertama:arahsumbuxpositif,posisi(0,0)berhentidi(0.5a,1.5a), denganarahsumbuypositif Kedua:arahsumbuypositif,posisi(0.5,1.5a)berhentidi, denganarah Ketiga: arah ...., posisi berhenti di , dengan arah Pertanyaan:Jikaposisiawaladadi(0,0)danrobotsedangmenghadapke arah sumbux positif, deretan perintah tersebut dilakukan berulang sebanyak3kalidenganhargaapertama=2,hargaakedua=4danharga aketiga=1.Dimanakanposisiakhirrobot? Pertanyaan: Jika posisi akhir ada di (0,0) dengan robot sedang menghadap ke arah sumbuy positif setelah deretan perintah tersebut dilakukanberulangsebanyak5kalidengan a=4,beradadimanakahrobot itusebelumnya? Pembahasan:Silakanmencobamenjawabkeduapertanyaantersebut.

Gambar3

Gambar4

30/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

E. MateriUjiProgramming
Pada tingkat OSN peserta akan diuji dalam materi pemrograman yang sebenarnya.Selainpesertaharusmenguasaipemrogramandenganbahasayang digunakan yaitu FreePascal atau C atau C++, tetapi juga peserta harus mampu melakukan problem solving itu sendiri. Soalsoal yang diberikan bukan berupa soal spesifikasi pemrograman yang eksplisit, namun permasalahan yang mana pemrograman hanya sebagai alat dalam pemecahan masalah itu sendiri. Kemampuan analitikal peserta diperlukan karena program yang nantinya dituliskan akan dijalankan dengan masukan yang sangat ekstrim sehingga dengan cara yang naif (tanpa analisis mendalam) program peserta tidak akan dapat berjalan dalam batas waktu yang diberikan. Aspek pertandingan lainnya adalah bahwa peserta harus mengerjakan soal ini dalam waktu yang terbatas pula! Permasalahan: buatlah program yang dapat menghitung berapa banyak 0 di belakangbilanganN!denganhargaNyangsangatbesarsekali(misalnya1030)? Pembahasan: Jika anda menjawabnya dengan memperkalikan semua bilangan N.(N1).(N2)....2.1 dst maka andahanya berhasil menjawab untuk N yang kecil (sebatasukuranhargaterbesardaribilanganbulatyangdisediakansertabatas waktukomputasiyangdiberikan). Jadiandaperlumelakukananalisissbb.Karenabanyaknyaangkanoldibelakang suatuangkabergantungpadaberapabanyakkemunculanfaktor2danfaktor5 (mengapa?karena2kali5adalah10).Dankhususnya,untuksuatubilangan N! dapat dibuktikan banyaknya kemunculan faktor 5 tidak akan lebih banyakdari banyaknyakemunculanfaktor2.Maka,pertanyaandiatasdapatdijawabdengan hanyamenghitungtotalbanyaknyakemunculanfaktor5daribilanganbilangan pembentukN!Bilanganyangberisifaktor5adalahbilanganbilangankelipatan5 sajajadicukupkitamemperhatikanbilanganbilangankelipatan5ini. Misalnyadalam10!hanyaadaduabilanganyangmemilikifaktor 5yaitu5dan 10 sendiri sehingga. Contoh lain, dalam 29! ada 5, 10, 15, 20, 25 yang berisi faktor 5,dan karena pada 25faktor 5 muncul dua kalimenyebabkan29!berisi kemunculan faktor 5 sebanyak 6 kali (jadi ada 6 nol di belakang 29!). Dengan mengiterasi idari5ke Ndengankelipatan5,danmendapatkanberapabanyak faktor5daribilangani,lalumenjumlahkannya,makaandadapatmenjawabnya denganbaikuntuklevelOSN!
i := 5; count := 0; while i <= N do

begin // menghitung berapa banyak kemunculan faktor 5 dalam i j := i; while (j mod 5) = 0 do begin j := j div 5; count := count + 1; end; i := i + 5; end;


31/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

Untuk tingkat OSN ini dengan cara demikian anda dapat memperoleh nilai penuh.NAMUN,untuktingkatlebihlanjutmungkinharga Nbisadiberikanjauh lebihbesarmisalnya N=1012,algoritmaharusberiterasiluar(while)sebanyak 2.1011kalidanuntuksetiapharga iakandiperlukansekiankalilagiberiterasi untukmenghitungbanyaknyafaktor5dalam iyangakhirnyaakanmemerlukan waktu komputasi yang besar!. Apalagi jika waktu eksekusi lebih dibatasi jelas solusitsbtidakakanmemberikannilaipenuh.Untukituandaharusmenggaliide lebihlanjutlagisbb. Perhatikanbahwa:

bilanganbilangan berfaktor 5 adalah semua bilangan kelipatan 5. Jika J1 adalahjumlahbilangankelipatan5yangNtersebutmakaJ1=Ndiv5. di antara bilanganbilangan itu terdapat bilanganbilangan kelipatan 25, yaitu yang menyumbang faktor 5 sebanyak dua kali. Jika J2 adalah banyaknyakemunculanbilangankelipatan25yang N,maka J2= N div 25. diantarabilanganbilanganituterdapatbilanganbilangankelipatan125, yaitu yang menyumbang faktor 5 tiga kali. Jika J3 adalah banyaknya kemunculanbilangankelipatan125yangNmakaJ3=Ndiv125. ...dst.

Maka,jumlahfaktor5pada N!= J1+ J2+ J3+...=(N div5)+(N div25)+(N div 125)+...berdasarkananalisisiniandacukupmembuatiterasiuntukmenghitung dan mentotalkan (N div i) dengan i deret 5, 25, 125, ... selama i N. Algoritma yangdiperolehhanyaberisi8barissajasebagaiberikut.Untuk N=1012,iterasi hanyadilakukankurangdari18kali(log5(1012)<18).Jadiprogramyangefisien untuk menjawab masalah di atas adalah program yang sangat pendek sebagai berikut.
readln(N); i := 5; count := 0; while i <= N do begin count := count + (N div i); i := i * 5; end; writeln(count);

Dengan contoh ini, hendak ditunjukkan bahwa masalah yang diberikan dalam materi pemrograman bukanlah semata masalah pemrograman itu saja melainkanmasalahanalitikayangmendalamkemudianpemrogramanhanyalah sebagai realisasinya yang seringkali hanya dengan pembuatan program yang singkat/pendeksemata. PadatingkatkesulitanyanglebihtinggihinggatingkatOlimpiadeInternasional, berlaku cara berpikir demikian. (Lihat pembahasan sejumlah soal contoh di websitehttp://www.toki.or.id).

32/110

MateriUjiOlimpiadeSainsBidangInformatika
v.070619alpha

Penulis:SuryanaSetiawan,M.Sc.

F. Penutup
Melalui dokumen ini penulis berharap peserta ataupun pembina peserta dapat menemukan intisari dan tujuan mengenai soalsoal seleksi mulai dari tingkat Kabupaten/Kotamadya,tingkatProvinsidantingkatNasional.Pesertayanglolos ke Tingkat Pelatihan Nasional (Pelatnas) diharapkan merupakan peserta yang memilikikemampuananalitikaldanmerancangalgoritmayangtinggi.Referensi mengenai hal tersebut jauh lebih sulit ditemukan daripada referensi untuk pemrogramanitusendiri. Tulisan awal ini merupakan versi yang perlu diolah lebih lanjut agar bisa menjadi referensi yang membantu para peserta namun diharapkan bisa memenuhi kebutuhan, sekurangnya sebagai petunjuk, bagaimana soalsoal seleksi olimpiade sains bidang informatika dan komputer ini dibuat. Masukan untuk menyempurnakan tulisan ini sangat diharapkan untuk meningkatkan manfaat terutama para calon peserta dan pembina peserta dalam mempersiapkandirimenghadapiprosesseleksi.

33/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

DESKRIPSIRINGKASSITUSTOKILEARNINGCENTER
TujuanBahanIni
1. Siswa mengenali layarlayar dan fasilitas yang disediakan pada aplikasi berbasiswebyangdipakaipadasaatOSN(TOKILearningCenter). 2. Siswa memahami best practices dalam bekerja secara online pada saat kompetisi. 3. SiswadapatmulaiberlatihselamaPJJ.

BatasanAplikasi
Interaksi yang dilakukan dengan aplikasi ini sederhana, seperti aplikasi web pada umumnya. Untuk menggunakan aplikasi ini, siswa harus sudah mampu mengakses sebuah URL, memahami fungsi link, button, radio button, dan mengetikteks.

HalamanUtama

Banner, pesan bergerak, untuk hal-hal penting

HalamanutamaTOKILearningCenterterdiriatastigabagianutama,yaitu: 1. Boxinformasisesi,yangmenunjukkaninformasipenggunasistemdanwaktu server. 2. Informasipenting,berisipesanpesanpentingyangdianggapperludiketahui pengguna. Ralat soal dan pengumumanpengumuman penting biasa dituliskandisini.

34/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

3. Menu utama sistem, yang berisi linklink untuk mengakses fasilitas TOKI LearningCenter

FasilitasYangTersedia
Question and Answer: hanya dibuka saat OSN, merupakan menu yang memungkinkan peserta mengajukan pertanyaanpertanyaan tentang soal. Jawabanatassemuapertanyaanpesertajugaditampilkanpadahalamanini. Menjawab Soalsoal Pilihan Berganda: menu untuk membaca dan mengisi jawabansoalsoalpilihanberganda Materi dan Tugastugas: berisi materi (untuk PJJ) dan/atau deskripsi tugas tugaspemrograman. Submit Tugas: merupakan menu untuk mengirimkan jawaban tugas pemrograman Status Pengumpulan Tugas pemrograman Saya: untuk melihat status pengumpulantugaspemrograman Meminta Untuk Dinilai (Tgs Pemrograman): untuk meminta agar tugas pemrogramandinilai,ditutupsaatOSN. LihatTabelNilai:untukmelihattabelnilai,ditutupsaatOSN. Forum Diskusi: untuk melakukan diskusi antarpeserta serta supervisor, ditutupsaatOSN. WhoIsWho?:menampilkanidentitaspenggunasistem. Ubah Data dan Password: untukmengubah identitas dan password, ditutup saatOSN. Logout:keluardarisistem.

35/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

TanyaJawab

Pertanyaan yang diajukan Jawaban

Hanya dibuka saat perlombaan (OSN), dan waktu yang diberikan terbatas (misalnya,1jampertama). Diberikankesempatanbertanya,pertanyaandanjawabandapatdilihatoleh semuakontestan. Pertanyaan: o HarusjelassupayabisadijawabdenganYa/Tidak. Padapilihangandatidakmengacukenomorsoal,melainkanke kalimatpernyataan. Padasoalpemrograman,mengacukejudulsoal. o YangtidakbisadijawabdenganYa/Tidakakandijawab:NoComment. o Mungkindijawab:Bacasoallebihteliti. Ramburambu: o Pertanyaan diajukan dalam bahasa Indonesia/Inggris yang baik dan benar. o Dilarangmendiskusikanjawaban. o Tidakmengajukanpertanyaanyangsama.

36/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

MemilihSoalPilihanBerganda

MenjawabSoalPilihanGanda

Klik Button untuk menjawab per soal Klik untuk submit Klik Button untuk menghapus

37/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

LembarJawabPilihanGanda

Klik radio button untuk menjawab

Klik untuk simpan

PilihanGanda
Jikaadaralat,makateksdituliskandalamwarnalaindandiumumkan. Harapperhatikanpengumuman. Andadapatmenjawabsatupersatu,atauviaLembarjawaban. Jika Anda memilih untuk mengisi via Lembar Jawab (sekaligus), jangan tunggusaatterakhiruntuksubmit.

38/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

MenuDeskripsiSoal(Untukmengaksessoal)

Daftar soal programming

SoalProblemSolving(denganmembuatprogram)
Baca dengan cermat deskripsi (persoalan, input, output), format input/output,batasanmemoridanwaktueksekusi. Jikaadaralatmakateksdituliskandalamwarnalaindandiumumkan.

39/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

RekapitulasiSubmisi

Rekapitulasi hasil submisi

Hanyahasilsubmisiyangterakhiryangdinilai. o Andadiberikesempatanuntukbeberapakalisubmisi. o Kesempatanyangmasihtersisadapatdilihatpadahalamanrekap. Submisiditutupsaatwaktudiumumkan. Jangan menunggu sampai saat terakhir. Anda dapat mengumpulkan nilai denganmensubmitketikaadajawabanyangsudahlolostestcase.

MemintaUntukDinilai
Dengan Fasilitas ini, grader akan menilai program. Sistem akan mengeksekusidanmenyampaikanhasilnya. Selamalomba: o Fasilitasinidimatikan.[FasilitasinidihidupkansaatPJJ] o Untuk mengetahui apakah jawaban benar/salah, harus mengkompilasidanmengeksekusisendirisecaralokal.Hanyasource codeyangdisubmisi.

ForumDiskusi
Dimatikanpadasaatlomba. Pada saat PJJ, dapat dipakai sebagai sarana untuk mendiskusikan jawaban danbertukarpendapatdenganpesertalainataupengasuh.

40/110

DeskripsiRingkasSitusTOKILearningCenter
v.080703

Penulis:Dr.InggrianiLiem RobertoEliantono BrianMarshal

UbahPassword
Fasilitas ini dimatikan saat lomba. Jagalah kerahasiaan password yang diberikankepadaAnda. SaatPJJdipakaiuntukmengubahpasswordyangdiberikan.

Logout
Janganlupamelakukanlogout,terutamapadasaatPJJ. Keluar/meninggalkan aplikasi tanpa logout mungkin akan mengakibatkan halhalyangtidakdiinginkan.

41/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

CONTOHSOALDANPEMBAHASAN
SoalAritmatika,AnalitikadanLogika
1. Seorang wanita menerima warisan sebesar 1 3 dari harta suaminya seorang pengusaha yang meninggal dunia karena kecelakaan pesawat. Dan tiga orang putranya juga menerima masingmasing 1 dari sisanya. Jika wanita tersebut dan 3 salah seorang anaknya menerima total sebesar Rp. 6 milyar, berapakah total harta yangditinggalkanolehpengusahatersebut? (A) Rp.9milyar (B) Rp.9,6milyar (C) Rp.10.8milyar (D) Rp.13.5milyar (E) Rp.18milyar Misal: hartapengusaha= x warisanyangditerimaistripengusaha= w warisanyangditerimaputrapengusaha= p Deskripsimatematispersoalan:

w= 1 3 x p=1 3 ( x w)
1 =1 3 ( x 3 x) 2 =1 3 3 x 2 x =9

w+ p = 6 x=?
Penyelesaian:

42/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

w+ p = 6
1 3 3 9 2 x+ 9 x=6 2 x+ 9 x=6 5 9

x=6 x=9 5 6 =
54 5

= 10.8
2. Jika x = 0.888, y = palingbenar? (A) x<y<z (B) x<z<y (C) y<x<z (D) y<z<x (E) z<x<y (OSP2006)

0.888 , dan z = (0.888)2, manakah pernyataan berikut yang

Bilanganrealdiantara0dan1(eksklusif),jikadikuadratkanakansemakinkecil,jika diakarpangkatduakanakansemakinbesar. Sebagaireferensi,

0.888 0.942 (0.888) 2 0.789


(OSP2006) 3. Jika nadalahnilairataratadaritigabuahangkayaitu6,9,dan kberapakahnilai k sesungguhnya? (A) 3n15 (B) n5 (C) n15

n 15 3 n + 15 (E) 3
(D)

43/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

6+9+k =n 3 15 + k = 3n k = 3n 15

(OSP2006) 4. Seorang Pedagang membeli buku dari penyalur di kawasan Pasar Cikapundung, Bandung seharga Rp. 36.000, dia harus menyisakan biaya ongkos sebesar 10%. Selain itu dia juga harus menyisakan keuntungan sebesar Rp. 9.000 per bukunya. Hargajualbukutersebutakannaikberapapersenjikadibandingkanhargabelinya? (A) 27.5% (B) 35% (C) 45% (D) 25% (E) 15% Misal: Hargajualbuku= s Hargabelibuku= b Selisihhargajualdanhargabeli= d Deskripsimatematispersoalan:

b = 36 000 s = b + 10% b + 9 000 d = s b d b =?

Penyelesaian:

44/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

s = b + 10% b + 9 000 = 1.1b + 9 000 = 1.1 36 000 + 9 000 = 39 600 + 9 000 = 48600 d = sb = 48600 36 000 = 12 600 d b = = 12 600 36 000
7 20

100%

= 35%
(OSP2006) 5. Ibu Dina sedang mencoba untuk membuka usaha bakery disebuah ruko di perumahan elit di kawasan Cibubur. Dari resep yang ia pelajari, untuk suatu campuranadonanbrownieskukusdiperlukan1cangkirterigudan4cangkirair. Bila ternyata sisa tepung terigu yang tersisa di lemari tinggal cangkir, berapa cangkirkahairyangdiperlukan? (A) 2cangkir (B) 2cangkir (C) 3cangkir (D) 3cangkir (E) Sesuaidenganresep
9 Perbandinganterigudanairdalamadonan= 1 1 2 : 4 1 2 = 3 2 : 2 = 1: 3

Karena perbandingan terigu dan air dalam suatu adonan haruslah tetap, jumlah air yang diperlukan apabila tepung terigu yang tersisa tinggal 3 4 cangkir adalah 3 3 4 = 9 4 = 2 1 4 cangkir. (OSP2006) 6. Hitunglah(80!38!)/(77!40!) (A) 316 (B) 2023 (C) 871 (D) 412 (E) 391

45/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

38! 80! 38! 80! = 4039 77! 40! 77! 40! 80 79 78 = 40 39 = 4 79 = 316
(OSP2006) 7. Jumlahduadigitpertamadaribilanganhasilperkalian530003810004adalah (A) 16 (B) 6 (C) 14 (D) 10 (E) 8
2 2

807978

530003 810004 = 530003 (23 )

10 004

= 530003 2310004 = 530003 230012 = 1030003 29 = 512 1030003


Jumlahduadigitpertamahasilperkaliantersebutadalah5+1=6 (OSP2006) Untuknomorsoal89perhatikanpenjelasanini IngatbahwaperkaliantigamatriksA.B.Cdapatdilakukandengancara(A.B).C,yaituA.B terlebihdahulukemudianhasilnyadenganCatauA.(B.C),yaituB.Cdiperkalikanterlebih dahulu kemudian A dikalikan dengan hasilnya. Jika suatu fungsi perkalian matriks dihargai sbb. Dua matriks A berukuran baris x kolom = m x n dikalikan matriks B berukuran=nxpmakahargaperkalianmatrikstersebutadalahmxnxp. 8. DiberikanmatriksmatriksA,B,C,danDmasingmasingberukuran20x200,200x20, 20x100,100x10.Berapakahhargauntukurutanperkalian(A.B).(C.D)? (A) 820.000 (B) 680.000 (C) 420.000

46/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

(D) 104.000 (E) 800.000 Perkalian A dengan B menghasilkan matriks baru (misalkan bernama E) berukuran 2020. PerkalianCdenganDmenghasilkanmatriksbaru(F)berukuran2010. Harga(A.B) Harga(C.D) Harga(E.F) Totalharga (OSP2006) 9. Diberikan perkalian dari empat matriks A.B.C.D yang masingmasing berukuran 20x200, 200x20, 20x100, 100x10. Manakah urutan perkalian matriks yang membutuhkanbiayapalingmurah? (A) ((A.B).C).D (B) (A.B).(C.D) (C) (A.(B.C)).D (D) A.((B.C).D) (E) A.(B.(C.D)) HargapilihanjawabanA: A.B =2020020 =80000 =2020100 =40000 =2010010 =20000 =140000 =2020020=80000 =2010010=20000 =202010=4000 =harga(A.B)+harga(C.D)+harga(E.F)=80000+20000+4000 =104000

(A.B).C

((A.B).C).D

Total

47/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

HargapilihanjawabanB: A.B C.D =2020020 =80000 =2010010 =20000 =202010 =2000 =102000

(A.B).(C.D)

Total

HargapilihanjawabanC: B.C =20020100 =400000 =20200100 =400000 =2010010 =20000 =820000

A.(B.C)

(A.(B.C)).D

Total

HargapilihanjawabanD: B.C =20020100 =400000 =20010010 =200000 =2020010 =40000 =640000

(B.C).D

A.((B.C).D)

Total

HargapilihanjawabanE:

48/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

C.D

=2010010 =20000 =2002010 =40000 =2020010 =40000 =100000

B.(C.D)

A.(B.(C.D))

Total

Dari perhitungan di atas, didapatkan bahwa urutan perkalian matriks yang membutuhkanbiayapalingmurah(100000)adalahA.(B.(C.D)). (OSP2006) 10. Pepenberdirisejauh18meterdisebelahutaraTuguPemuda,Fannyberdiri24 meterdisebelahbaratTuguyangsama.BerapakahjarakterdekatantaraFanny danPepenyangdapatditempuh? (A) (B) (C) (D) (E) Posisi Pepen, Fanny dan Tugu Bermuda membentuk segitiga sikusiku pada Tugu BermudadimanajarakantaraPependanFannyadalahsisimiringsegitiga. 18=3x6,dan24=4x6. DenganTriplePythagoras{3,4,5},makasisimiringsegitigatersebutadalah: 30=5x6 (OSP2008) 11. Apabila dua buah bilangan 2n dan 5n (di mana n adalah bilangan bulat positif) dimulaidengandigityangsama,makadigittersebutadalah...(Catatan:bilangan dituliskandengannotasidesimal,tanpadiawalinol.) (A) 9 30meter 900meter 6meter 42meter 90meter

49/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

(B) (C) (D) (E)

5 6 7 3

Padan=5,25=32dan35=3125 (OSP2008) 12. Jikaa,b,c,ddaneadalahbilanganbilanganbulatyangtidaknoldantidaknegatif sertatidak adayangsama,dandiketahuipulaa+b+c+d=10,berapakahharga terbesaryangmungkindariab+cd? (A) (B) (C) (D) (E) Setempatbilangan positifunikyangmemenuhipersamaan a+ b+ c+ d=10hanya adasatu:{1,2,3,4}.Darisetbilangantersebut,hanyaadatigakombinasiyangunik: a.b+c.d 1.2+3.4=14 1.3+2.4=11 1.4+2.3=10 (OSP2008) 13. Didalamsuatukotakterdapat2NbuahboladandiantaranyaterdapatNbola berwarnaputihdanNbolaberanekawarnasecaraunik(satubolasatuwarna, tidakadayangsama)dantidakputih.BerapabanyakkombinasiuntukmemilihN bola dari 2N bola itu? (Catatan: Dalam perhitungan kombinasi, AAB dan ABA dianggapsama.) (A) 2N (B) (2N/2) 10 32 25 14 >50

50/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

(C) 2N (D) N! (E) (2N)!/N! BanyakkombinasimemilihNboladari2Nbolatersebutbisadipecahmenjadi beberapabagian: Banyakkombinasimemilih Nboladimanatidakadabolaberwarnaterambil NC0,hanyaada1cara. BanyakkombinasimemilihNboladimanatepatsatubolaberwarnaterambil NC1. MisalkanN=4,bolaputih=A,bolaberwarna=B,C,DdanE. Bolatersedia:AAAABCDE Banyakcaramemilihsatubolaberwarnadariempatyangtersediaadalah4C1(= 4). AAAB,AAAC,AAAD,AAAE. BanyakkombinasimemilihNboladimanatepatduabolaberwarnaterambil NC2 MisalkanN=4,bolaputih=A,bolaberwarna=B,C,DdanE. Bolatersedia:AAAABCDE Banyakcaramemilihduabolaberwarnadariempatyangtersediaadalah4C2(= 6). AABC,AABD,AABE,AACD,AACE,AADE. BanyakkombinasimemilihNboladimanatepatNbolaberwarnaterambil NCN

Catatan:NCkadalahbanyakkombinasimemilihkbendadariNpilihan. Dengandemikianjumlahseluruhkombinasinyaadalah 2N (OSP2008) 14. Pak Dengklek memiliki buku yang bernomor halaman mulai 1 s.d. N. Jika semua nomor halaman buku tersebut ditulis secara berderet dibutuhkan 552 digit.BerapakahN? atausamadengan

51/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

(A) (B) (C) (D) (E)

205 210 211 212 220

Jumlahdigitpadaderetangka1s/d999adalah: 19 1099 :9x1digit :90x2digit =9digit =180digit

100999 :900x3digit =2700digit JumlahdigityangditulispadabukuPakDengklekadalah552,sehinggabukutersebut berakhir pada halaman dengan tiga digit (100 999). Banyak halaman yang terdiri dari tiga digit adalah: (552 9 180) / 3 = 121 halaman. Dengan demikian jumlah halamantotaldibukutersebutadalah9+90+121=220halaman. 15. Berapabanyaksegiempatyangterbentukdaritabelberukuran3x3? (A) 36 (B) 27 (C) 30 (D) 40 (E) 35 (OSP2008)

52/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Adasembilanjenissegiempatyangbisadibentuk: 1x3(3buah) . 2x3(2buah)

1x1(9buah) 2x1(6buah) . 3x1(3buah) Total:36buah

1x2(6buah)

2x2(4buah) . 3x2(2buah)

3x3(1buah)

Jika soal ini digeneralisasi dari tabel 3 x 3 menjadi tabel n x n, maka kita akan menemukansuatupolabilangan: n 1 2 3 4 n Jumlahsegiempat 1 =12 9 =(1+2)2 36 =(1+2+3)2 100 =(1+2+3+4)2 Sn2 =(1+2++n)2

DimanaSnadalahjumlahbilanganbulatpositifdari1sampain. (OSP2008) 16. PakGaneshmenulisangka1s.d.10000.Berapabanyakangka1yangmunculpada hasiltulisanPakGanesh? (A) (B) (C) (D) (E) 5000 1000 4001 2092 3505

53/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Cariadaberapabanyakkemunculanangka1padapenulisanangka0000s/d9999 (bilangan4digit).Permasalahaninibisadipecahmenjadibeberapabagian: Kemunculanangka1padadigitpertama Kemunculanangka1padadigitkedua Kemunculanangka1padadigitketiga Kemunculanangka1padadigitkeempat :1*** :*1** :**1* :***1

Catatan:simbol*merepresentasikanangkasembarangdari0s/d9. Padamasingmasingkemunculandiatas,simbol***bisadigantikanolehsembarang angka dari 000 s/d 999, sehingga total masingmasing terdapat 1000 kombinasi. Dengandemikian,totalkemunculanangka1padabilangan4digit(0s/d9999)ada 4000buah.Sehingga,kemunculanangka1pada1s/d10000adalah4001. (OSP2008) 17. Disuatuprovinsi,diadakanlombavolitiap3tahunsekali,lombabulutangkis tiap 4 tahun sekali, lomba sepak bola tiap 7 tahun sekali, dan lomba tenis tiap 6 tahun sekali. Pada tahun 2000 semua lomba tersebut diadakan. Berapa kali terdapatlebihdarisatulombadalamsetahundalamperiodeantaratahun2005 dantahun2017? (A) (B) (C) (D) (E) Kurangdari8kali 8kali 9kali 10kali Lebihdari10kali

54/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Tabelpenyelenggaraanlombapertahun: 2000 ABCD 2005 ABCD 2010 ABCD 2015 ABCD 2001 ABCD 2006 ABCD 2011 ABCD 2016 ABCD 2002 ABCD 2007 ABCD 2012 ABCD 2017 ABCD 2003 ABCD 2008 ABCD 2013 ABCD 2004 ABCD 2009 ABCD 2014 ABCD

A :Voli(setiap3tahun) B :Bulutangkis(setiap4tahun) C :SepakBola(setiap7tahun) D :Tenis(setiap6tahun) (OSP2008) 18. Tahun"semikabisat"adalahtahunyangbukanmerupakantahunkabisat,tetapi jika tiap bilangan penyusun angka tahunnya dijumlahkan, hasilnya habis dibagi dengan4.Adaberapatahun"semikabisat"semenjaktahun1901hingga1960? (A) (B) (C) (D) (E) Hanya dua digit terakhir pada angka tahun yang berubah dari 1901 hingga 1960. Karenasisapembagiandengan4darijumlahduadigitpertamaadalah2(dari(1+9) mod4),makajumlahduadigitterakhirjugaharusmemiliki2sebagaisisapembagian dengan4(agarkeseluruhanbilanganhabisdibagi4). Banyaknya bilangan dari 1 s/d 60 yang jumlah digitnya memiliki 2 sebagai sisa pembagiandengan4adalah: 190* :1902,1906 10 12 15 16 18

55/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

191* 192* 193* 194* 195* 1960

:1911,1915,1919 :1920,1924,1928 :1933,1937 :1942,1946 :1951,1955,1959 :1960

Dari 16 tahun di atas, yang merupakan tahun kabisat ada sebanyak 4 buah, yaitu: 1920, 1924, 1928, 1960. Dengan demikian jumlah tahun semikabisat dari 1901 hingga1960adalah164=12buah. (OSP2008) 19. Jikanadalahsebuahbilanganbulatganjil,maka: (i)n3n2pastiganjil (ii)n2npastigenap (iii)n3npastiganjil (iv)n4n2pastigenap Pernyataanyangbenaradalah: (A) (B) (C) (D) (E) Sebuahbilanganganjiljikadipangkatkandenganbilanganbulat positifapapunakan menghasilkanbilanganganjiljuga. Pernyataan(i) Pernyataan(ii) Pernyataan(iii) :n3n2pastiganjil ganjilganjil=genap,pernyataan(i)salah! :n2npastigenap ganjilganjil=genap,pernyatan(ii)benar! :n3npastiganjil ganjilganjil=genap,pernyataan(iii)salah! (i),(iii) (i),(ii),(iii) (ii),(iv) (ii),(iii),(iv) (iv)

56/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Pernyataan(iv)

:n4n2pastigenap ganjilganjil=genap,pernyataan(iv)benar!

(OSP2008) 20. SiUpikpandaimenjumlahkan,namuniahanyadapatmenulisangka1dan2.Oleh karena itu, saat Upik ingin menuliskan sebuah angka yang lebih dari 2, ia menuliskan beberapa angka 1 dan beberapa angka 2 sedemikian sehingga jika dijumlahkan jumlahnya adalah bilangan tersebut. Contohnya, untuk menuliskan angka3,Upikmemilikitepat3carayaitu12,21,atau111(1+2=3;2+1=3; 1+1+1=3).Untukmenuliskanangka2,sebenarnyaUpikmemiliki2carayaitu2dan 11 (2=2; 1+1=2), tapi hanya ada 1 cara untuk menuliskan angka 1. Berapa banyak caraUpikuntukmenuliskanangka8? (A) (B) (C) (D) (E) Untukmenuliskanangka8,adaduaoperasiyangbisadilakukan: Menuliskanangka1dipalingdepan,sehinggaangkayangtersisaadalah7. Menuliskanangka2dipalingdepan,sehinggaangkayangtersisaadalah6. 21 25 30 34 55

Banyaknyacaramenuliskanangka8adalahjumlahdaribanyaknyacaramelakukan duaoperasidiatas(banyakcaramenuliskanangka7danbanyakcaramenuliskan angka6). Misalkanbanyaknyacaramenuliskanangka nadalahf(n),makarelasirekurenspada permasalahaniniadalah: f(1)=1 f(2)=2 f(n)=f(n1)+f(n2) n f(n) (OSP2008) 1 1 2 2 3 3 4 5 5 8 6 13 7 21 8 34

57/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

21. Pak Dengklek ingin membagikan buku tulis kepada 100 anak panti asuhan. Masingmasinganakmendapatsetidaknyasatubukutulis,dantidakadaanak yangmendapatlebihdarilimabukutulis.Tidakadaseoranganakpunyang mendapatbukutulislebihbanyakdarijumlahbukutulisyangdimilikiduaorang anaklainnya.JikaAseng,Adi,danUjangadalahanakpantiasuhandanAseng mendapattigabukutulis,makapernyataanmanakahyangbenardibawahini: (i)Ujangmungkinhanyamendapatsatubukutulis. (ii)JikadiketahuiUjangmendapatempatbukutulis,makaAditidakmungkin mendapatsatubukutulis. (iii)Tidakmungkinadaanakyangmendapattepatlimabukutulis. (A) (B) (C) (D) (E) Fakta/Aturan: a. Masingmasinganakmendapatkanantarasatusampaidenganlimabukutulis. b. Tidakadaseoranganakpunyangmendapatbukutulislebihbanyakdari jumlahbukutulisyangdimilikiduaoranganaklainnya. c. Asengmendapattigabukutulis. Pernyataan(i) :Ujangmungkinhanyamendapatsatubukutulis. Ada satu cara pembagian buku yang membenarkan pernyataan ini: Aseng 3 buku tulis, Ujang 1 buku tulis dan Adi 2 buku tulis. Pernyataan(i)benar! Pernyataan(ii):JikadiketahuiUjangmendapatempatbukutulis,makaAditidak mungkinmendapatsatubukutulis. Ada satu cara pembagian buku yang menggagalkan pernyataan ini: Aseng 3 buku tulis, Ujang 4 buku tulis dan Adi 1 buku tulis. Pembagian dengan cara ini tidak melanggar aturan/fakta yang ada.Pernyataan(ii)salah! Pernyataan(iii):Tidakmungkinadaanakyangmendapattepatlimabukutulis. Ada beberapa cara pembagian buku yang menggagalkan pernyataan ini, salah satunya adalah: Aseng 5 buku tulis, Ujang 5 buku tulis dan Adi 5 buku tulis. Pembagian dengan cara ini tidak melanggar aturan/fakta yang ada. Pernyataan (iii) salah! (i)dan(ii)benar (i)dan(iii)benar (ii)dan(iii)benar (i),(ii),dan(iii)benar Pilihanasampaidsalahsemua

58/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

(OSP2008) 22. Suatu hari Pak Dengklek mengajak Pak Ganesh bermain. Mulamula Pak Dengklek memberikansebuahkertasyangsudahbergambarsegiempatberukuran8cmx9 cm lalu meminta Pak Ganesh menggambar N buah titik di atas kertas itu sedemikian sehingga tidak ada dua buah titik yang berjarak kurang dari 5 cm (semua titik yang digambar tidak boleh berada di luar segi empat yang sudah tergambarsebelumnya,tetapibolehdidalamatautepatpadagarissegiempat tersebut). Pak Dengklek menang jika Pak Ganesh tidak mampu menggambar N buah titik dengan syarat tersebut. Berapa N minimal agar Pak Dengklek pasti menang? (A) (B) (C) (D) (E) Jumlahtitikmaksimumyangdapatdiletakanpadakertastersebutadalah6buah. 5 6 7 8 9

DengandemikianagarPakDengklekmenang,nilaiNyangdiberikanharusdiatas6. (OSP2008)

59/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

SoalAlgoritmika
23. Perhatikanpotonganalgoritmaberikut:
Procedure kocok(d: integer; kata: string); var i: integer; c : char; begin i:=1; repeat c := kata[i]; kata[i] := kata[i+d]; kata[i+d] := c; i:= i+1; until (i=length(kata)-1); writeln(kata); end;

Apayangdicetaknyapadapemanggilankocok(1,'GOGETGOLD')? (A)GOGETGOLD (B)OGETGOLGD (C)DGOGETGOL (D)GETGOLDOG (E)gogetgold Keadaanawal :d=1dankata=GOGETGOLD Keterangan tersebut :length(kata)=11,imerupakanindeksperulangan dalamprosedur

Penukaran karakter dilakukan pada karakter ke i dengan kei+1, yang pada tabel di bawahiniditandaidenganwarnakuning
i 1 2 3 4 5 6 7 8 9 10 1 G O O O O O O O O O 2 O G 3 G G G G G G G G 4 G G G G E E E E E E 5 E E E E G T T T T T Karakterke 6 7 T T T T T G G G G G Selesai 8 G G G G G G G G O O 9 O O O O O O O O G L 10 L L L L L L L L L G 11 D D D D D D D D D D

Jadi,yangdicetaksetelahpemanggilankocok(1,GOGETGOLD)adalahOGETGOLGD (OSP2007)

60/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

24. Perhatikanpotonganalgoritmaberikut:
c := 0; d := 0; while (a>b) do begin a:= a-b; c:= c+1; d:= d+b; end; writeln(c, , ,d);

Jikanilaia=23,b=4,makakeluarandarialgoritmadiatasadalah:

(A) 3,33 (B) 1,4 (C) 0,0 (D) 6,23 (E) 5,20
Pemrosesanalgoritmatersebutdapatditunjukkanpadatabeldibawahini. a 23 19 15 11 7 3 b 4 4 4 4 4 4 C 0 1 2 3 4 5 d 0 4 8 12 16 20 Keterangan Kondisiawal,a>b a>b a>b a>b a>b Loopberhentikarenaa<=b

Jadi,keluarandarialgoritmatersebutadalah5,20 (OSP2007) 25. Perhatikanpotonganalgoritmaberikut:


procedure panjang (p: integer); var z : array[0..9] of integer; a, b, c, d : integer; x : integer; begin for a:= 0 to 9 do case (a mod 5) of 0 : z[a] := 3; 1 : z[a] := 1; 2 : z[a] := 4; 3 : z[a] := 2; 4 : z[a] := 0; end;

61/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Apakahkeluaranyangdihasilkanalgoritmadiatasdalampemanggilanpanjang(9)? (A) 8 (B) 6 (C) 4 (D) 2 (E) 0 Pada perulangan baris ke7, nilai elemen array z diisi oleh nilainilai dalam case of berdasarkannilaiamod5.Nilaiapadaakhirperulanganadalah9. a z[a] 0 3 1 1 2 4 3 2 4 0 5 3 6 1 7 4 8 2 9 0

end;

for b:= 9 downto 0 do begin x:= 3*z[b]; z[b]:= a - b; end; for c:= 0 to 9 do if (c mod 2 = 0) then z[c]:= z[c] + 5; for d:= 9 downto 0 do if (z[d] < 0) then z[d] := z[d] * -1; writeln(z[p]);

Pada perulangan baris ke15, nilai x diisi oleh hasil 3*nilai elemen array z pada masingmasingindeksb.Nilaielemenarrayz masingmasingtersebutjugaberubah dandiisinilaiab,yaitu9indeksb. a z[a] 0 9 1 8 2 7 3 6 4 5 5 4 6 3 7 2 8 1 9 0

Pada perulangan baris ke19, nilai elemen array z berubah menjadi 5 lebihnya dari nilaielemenarrayzsebelumnyajikaindekscdapathabisdibagi2. a z[a] 0 14 1 8 2 12 3 6 4 10 5 4 6 8 7 2 8 6 9 0

Pada perulangan baris ke22, nilai elemen array z tidak berubah karena masing masingnilainya>=0. Berdasarkanpenjelasandiatas,keluaranpemanggilanpanjang(9)adalah0 (OSP2007)

62/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

26. Perhatikanprosedurcoba(n)berikut.
procedure coba(var n: integer); begin if n > 0 then begin n := n div 3; write(n mod 3); coba(n); end; end;

Apa yang akan dicetak saat pemanggilan coba(z) dengan z sebelumnya sudah memilikiharga49? (A) 0001 (B) 1211 (C) 0121 (D) 1120 (E) 1210 Pemrosesanpotonganalgoritmatersebutdengann=49dapatdirealisasikan dalamtabelberikutini. Pemanggilan coba(49) coba(16) coba(5) coba(1) coba(0) n=ndiv3 16 5 1 0 write(nmod3) 1 2 1 0 Selesai coba(n) coba(16) coba(5) coba(1) coba(0)

Jadi,yangakantercetakadalah1210 (OSP2007) 27. Perhatikanpotonganalgoritmaberikut:


procedure jalan(n: integer); begin if n > 0 then begin jalan(n div 5); write(n mod 5 + 1); end; end;

63/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Padapemanggilanjalan(49)padaproceduredi atasiniapayangakandicetaknyakemudian? (A) 222 (B) 52 (C) 49 (D) 255 (E) 5 jalan(49): jalan(9) jalan(1) jalan(0) write(2)

write(5) write(5)

Jadi,yangakantercetakadalah255 (OSP2007) 28. Perhatikanpotonganalgoritmaberikut:


procedure call(x:integer); begin if x<>0 then begin write(*); x := x 1; call(x); x := x + 1; end; end;

Apakahoutputdaripemanggilancall(3)? (A) *** (B) * (C) ** (D) ********...(banyaktakterhingga) (E) ******

64/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

call(3): write(*) x=2 call(2) write(*) x=1 call(1) x=2 x=3 write(*) x=0 call(0) x=1

Jadi,outputyangdihasilkanadalah*** (OSP2007) 29. Perhatikanalgoritmaberikut:


Procedure geser(i: integer); begin i := (((i shl 4) shr 6) shl 2); writeln(i); end;

Apakahoutputdaripemanggilangeser(9)diatas? (A) 1 (B) 0 (C) 2 (D) 4 (E) 8

65/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

i ishl4 =910=10012 =100100002 =102 =10002=810 (OSP2007) 30. Perhatikanalgoritmaberikut:


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;

(ishl4)shr6

((ishl4)shr6)shl2

BerapakahhasilABC(12,4)? (A) 1 (B) 0 (C) 1 (D) 2 (E) 4

FungsiABCmengembalikannilaibjikaamerupakankelipatanb(amodb=0). Jikabbukanfaktordaria,makafungsiiniakanmemanggildirinyakembali denganparameterABC(a,b1).TampakbahwafungsiABCakan mengembaikannilaifaktorterbesardariayangkurangdariatausamadengan b.MakahasilABC(12,4)adalah4.


(OSP2008)
Catatan: Jawaban dan pembahasan soal nonpemrograman ini disusun oleh para kontributorTOKI 1danbukanmerupakanjawaban/pembahasanresmi.

Kontributor: Bernardino Dito; Brian Marshal; Prima Chairunnanda, B. Eng.; Riza Oktavian NugrahaSuminto;RobertoEliantonoAdiseputra;SuhendryEffendy,S.Kom. 66/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

SoalPemrograman
Faktorial
Kode Soal: Batas Run-time: Batas Memori: Masukan: Keluaran: OSN601 1 detik / test-case 32 MB Standard input Standard output

DiberikansebuahbilanganN,N!disebutNfaktorialdannilainyadihitungdengan rumus: Nx(N1)x(N2)...x1. Tugas Anda adalah menghitung berapa jumlah angka nol berturutan yang mengakhiriN!. Sebagaicontoh:

N=10:10!=3628800,makajumlahangkanoladalah2. N=8:8!=40320,jumlahangkanoladalah1(nolditengahtidakdihitung).

FORMATMASUKAN
MasukanhanyaterdiridarisatubarisberisibilanganbulatN(1N10000).

FORMATKELUARAN
Tuliskan satu bilangan bulat yang menyatakan jumlah angka nol yang mengakhiriN!.

CONTOHMASUKAN1
10

CONTOHKELUARAN1
2

CONTOHMASUKAN2
8

CONTOHKELUARAN2
1

67/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

CATATAN
Hatihati dengan integer overflow: tipe data longint atau long hanya dapat menampungbilanganhinggasekitar2milyar. PETUNJUK Jika anda dapat memanfaatkan sifat rumus faktorial, maka anda akan mendapatkanhasilyanglebihefisien

PEMBAHASAN 2
Pertanyaan:BerapabanyakderetanangkanoldibelakangbilanganfaktorialN!? Jika Anda menjawabnya dengan memperkalikan semua bilangan N.(N1).(N 2)....2.1 dst maka anda hanya berhasil menjawab untuk N yang kecil (sebatas ukuran harga terbesar dari bilangan bulat yang disediakan serta batas waktu komputasiyangdiberikan). JadiAndaperlumelakukananalisissebagaiberikut: Karena banyaknya angka nol di belakang suatu angka bergantung pada berapa banyakkemunculanfaktor2danfaktor5(mengapa?karena2kali5adalah10). Dan khususnya, untuk suatu bilangan N! dapat dibuktikan banyaknya kemunculanfaktor5tidakakanlebihbanyakdaribanyaknyakemunculanfaktor 2. Maka, pertanyaan di atas dapat dijawab dengan hanya menghitung total banyaknyakemunculanfaktor5daribilanganbilanganpembentuk N!Bilangan yang berisi faktor 5 adalah bilanganbilangan kelipatan 5 saja jadi cukup kita memperhatikanbilanganbilangankelipatan5ini.Misalnyadalam10!hanyaada duabilanganyangmemilikifaktor5yaitu5dan10sendirisehingga.Contohlain, dalam29!ada5,10,15,20,25yangberisifaktor5,dankarenapada25faktor5 muncul dua kali menyebabkan 29! berisi kemunculan faktor 5 sebanyak 6 kali (jadi ada 6 nol di belakang 29!). Dengan mengiterasi i dari 5 ke N dengan kelipatan 5, dan mendapatkan berapa banyak faktor 5 dari bilangan i, lalu menjumlahkannya, maka anda dapat menjawabnya dengan baik... untuk level OSN2006ini!
i := 5; count := 0; while i <= N do begin // menghitung berapa banyak kemunculan faktor 5 dalam i j := i; while (j mod 5) = 0 do begin j := j div 5; count := count + 1; end; i := i + 5; end;

2Dikutipdarihttp://www.toki.or.id/archive/faktorialsolusi.html

68/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Untuk tingkat OSN ini dengan cara demikian Anda dapat memperoleh nilai penuh.NAMUN,untuktingkatlebihlanjutmungkinharga Nbisadiberikanjauh lebihbesarmisalnya N=1012,algoritmaharusberiterasiluar(while)sebanyak 2.1011kalidanuntuksetiapharga iakandiperlukansekiankalilagiberiterasi untukmenghitungbanyaknyafaktor5dalam iyangakhirnyaakanmemerlukan waktu komputasi yang besar!. Apalagi jika waktu eksekusi lebih dibatasi jelas solusi tersebut tidak akan memberikan nilai penuh. Untuk itu Anda harus menggaliidelebihlanjutlagi Perhatikanbahwa:

bilanganbilanganberfaktor5adalahsemuabilangankelipatan5.JikaJ1 adalahjumlahbilangankelipatan5yangNtersebutmakaJ1=Ndiv5. diantarabilanganbilanganituterdapatbilanganbilangankelipatan25, yaituyangmenyumbangfaktor5sebanyakduakali.JikaJ2adalah banyaknyakemunculanbilangankelipatan25yangN,makaJ2=Ndiv 25. diantarabilanganbilanganituterdapatbilanganbilangankelipatan125, yaituyangmenyumbangfaktor5tigakali.JikaJ3adalahbanyaknya kemunculanbilangankelipatan125yangNmakaJ3=Ndiv125. ...dst.

Maka,jumlahfaktor5pada N!= J1+ J2+ J3+...=(N div5)+(N div25)+(N div 125)+...berdasarkananalisisiniandacukupmembuatiterasiuntukmenghitung dan mentotalkan (N div i) dengan i deret 5, 25, 125, ... selama i N. Algoritma yangdiperolehhanyaberisi8barissajasebagaiberikut.Untuk N=1012,iterasi hanyadilakukankurangdari18kali(log5(1012)<18).
readln(N); i := 5; count := 0; while i <= N do begin count := count + (N div i); i := i * 5; end; writeln(count);

(OSN2006)

69/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

UlangTahun
Kode Soal: Batas Run-time: Batas Memori: Masukan: Keluaran: OSN603 1 detik / test-case 32 MB Standard input Standard output

Beberapa hari lagi, Pak Dengklek akan merayakan ulang tahunnya yang ke61. Beliau bermaksud akan mengundang temantemannya untuk menghadiri pesta ulang tahunnya tersebut. Sayangnya, beliau baru saja kehilangan satusatunya buku telepon yang dipunyainya. Karena itu, ia harus mengunjungi wartel terdekat dan membuka buku kuning (yellow pages) untuk mengetahui nomor telepon temantemannya. Tidak lupa ia mengajak Anda untuk membantunya mencarikannomortelepontemantemannyatersebut. Diberikan buku kuning yang berisi pasangan nama dan nomor telepon seluruh penduduk desa tempat Pak Dengklek tinggal, serta namanama teman Pak Dengklekyangtinggaldidesatsb.,tolonglahPakDengklekuntukmencarinomor telepontemantemanPakDengklektersebut.

FORMATMASUKAN
Barispertamaberisiduabuahbilanganbulat:

N (1 N 10.000), menunjukkan jumlah penduduk desa yang terdaftar di bukukuning. Q(1Q10.000),menunjukkanjumlahtemanPakDengklek.

Nbarisselanjutnyaberisinamadannomorteleponsetiaporangdidesatersebut, dipisahkandenganspasi. Q baris selanjutnya berisi namanama teman Pak Dengklek. Nama setiap orang hanya akan tersusun dari huruf kapital, dengan panjang maksimal 15 huruf. Daftar nama pada buku kuning akan terurut sesuai abjad, tetapi daftar teman Pak Dengklek yang akan dicari nomor telponnya belum tentu terurut dan satu temanPakDengklekbisasajaditanyakanlebihdarisekali.Setiapnomortelepon terdiriatastepat7angka,satunomortelepondapatdimilikiolehlebihdarisatu orang. Semua teman pak Dengklek yang akan dicari nomor telponnya pasti tercantumdalambukukuning.

FORMATKELUARAN
KeluarkanQbaris,dimanasetiapbarisnyaberisinomortelepondaritemanyang ditanyakanolehPakDengklek.

70/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

CONTOHMASUKAN
10 5 ACONG 8468431 BALAJI 1573547 GREGOR 1765743 JAPRA 3746843 JOKO 1357891 MALARANGENG 1375638 MANMOHAN 1357562 SITORUS 1378651 TERRY 8756345 YUDHOYONO 1781945 GREGOR YUDHOYONO ACONG MANMOHAN JAPRA

CONTOHKELUARAN
1765743 1781945 8468431 1357562 3746843

PEMBAHASAN 3
Pertanyaan: Jika diberikan N data terurut tersimpan dalam tabel, lalu Anda dimintamendapatkansuatudatadiantaraNdatatersebut,makaapayangakan Andalakukan? PalingnaiftentuAndamencaridaribarispertamadalamNdatatersebuthingga ditemukan data yang dicari itu. Pemeriksaannya adalah dengan operasi membandingkan stringstring yang bersangkutan (data yang dicari dan data tersimpan). Jika data sangat banyak sekali maka Anda akan menghadapi batas waktukomputasi. SatutrikyangTERNYATAbisalolosuntukmendapatkannilaipenuhdiOSNini (karena banyaknya datanya masih terlalu kecil!) adalah tetap dengan pemeriksaan dari baris pertama tetapi dengan memeriksa karakter pertama stringstring itu: Jika sama maka periksa karakter berikutnya sementara jika berbeda,makaskipdatatersebutuntukmemeriksadatapadabarisberikutnya. Untuk tingkat lebih lanjut tentu solusi tersebut dibuat untuk tidak akan mendapatkannilaipenuh!Untukmendapatkannilaipenuhmakaadaduateknik yang perlu dikuasai yaitu algoritma binary search dan yang lebih lanjut lagi adalahdenganhashtable.

3Dikutipdarihttp://www.toki.or.id/archive/ultahsolusi.html

71/110

ContohSoaldanPembahasan
v.080704

Penulis:TimPembinadanAlumniTOKI

Algoritma binary search hanya dapat bekerja jika data sudah terurut. Idenya adalahsebagaiberikut: MisalkandatayangdicariadalahX.Datayangdiperiksapertamakaliadalahdata yang terdapat ditengah tabel. Jika tabel berindeks dari 1 s.d. N maka indeks tersebut adalah (N+1) div 2. Karena sudah terurut, jika data di tengah tadi bukanlah data yang dicari, maka X pasti berada di ruas kiri atau kanan tabel (sebelah kiri/kanan dari data tengah tadi). Sehingga, jika di ruas kiri, pemeriksaandengancarayangsamadapatdiulangipadaruaskiritersebutyang kinisebagaikeseluruhan.UntukjelasnyaAndadapatmelihatalgoritmaberikut.
// data nama dan no telepon ada di dalam array tabel[1..n] dengan // field nama dan field telepon bataskiri := 1; bataskanan := n; selesai := false; while not selesai and (bataskiri <= bataskanan) do begin tengah := (bataskiri + bataskanan) div 2; if (tabel[tengah].nama = X) then selesai := true else if (tabel[tengah].nama > X) then bataskanan := tengah - 1 else bataskiri := tengah + 1; end; if (selesai) then writeln(tabel[tengah].telepon);

Algoritmainidapatbekerjapadadatayangsangatbanyakdenganiterasiuntuk kasus terburuknya dilakukan sebanyak log2(n). jadi untuk data 10000 paling banyakakandilakukansebanyak13iterasi. Karena pemeriksaan kesamaan di atas merupakan operasi string yang dapat memerlukan waktu lebih lama daripada pemeriksaan bilangan, maka pemeriksaan dapat dilakukan karakter demi karakter saja (seperti pada trik yang dibahas di atas). Selain itu, kedua pemeriksaan itupun dapat dilakukan hanya satu kali saja. Bagaimana? Bagi C programmer maka bagian tersebut sudahadadalamlibraryCsebagaifungsistrcmp()..... (OSN2006)

72/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

MATERIPJJPRAOSN2008
BagianPertama 1

ReadlndanWriteln
NamaProgram: BatasRuntime: BatasMemori: pjj0101.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Sebagai perkenalan pertama dengan program Pascal, ketikanlah perintah perintahprogramberikutinilalusimpansebagai'pjj0101.pas'.
Program Pjj0101; var brs: string; begin readln(brs); writeln(brs); end.

Program ini akan membaca satu baris teks masukan (dari standard input) dan mencetak keluaran (ke standard output) yang persis sama dengan masukan. Pada bagian awal program terdapat pernyataan (deklarasi) yang menyebutkan digunakannya suatu variabel dengan nama brs. Deklarasi ditunjukkan dengan adanya notasi var. Barisbaris berikutnya setelah notasi var adalah tempat menuliskandeklarasivariabelvariabel. Variabel adalah tempat menyimpan suatu harga dalam program, dan selama berjalannya program, harga itu dapat berubahubah. Setiap variabel dideklarasikan dengan menyebutkan jenis dari harga yang dapat disimpannya. brsdideklarasikansebagaivariabelberjenisstring,berartibrsdapatmenyimpan stringyangpanjangnyamaksimum255karakter. Badanprogramdinyatakandenganperintahbegindandiakhiridenganperintah end. (yaitu end dengan tanda titik). readln(brs) berguna untuk membaca satu baris string masukan dan hasil pembacaannya disimpan dalam variabel brs. Perintah writeln(brs) berguna untuk menuliskan isi variabel brs ke output. Dalamprogramsetiapperintahdipisahkandengantanda; (titik koma).Sebagai kebiasaanbaik,akhirisetiapbarisperintahdengantandatitikkomasepertipada contohdiatas.

1MateriinidikembangkanolehBrianMarshaldanDeriantoKusumaberdasarkanMateriPJJOSN

2007yangdisusunolehSuryanaSetiawan,M.Sc.

73/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

UntukmengujiprogramAnda,bukalaheditor('edit.exe'atau'notepad.exe')lalu ketikansuatutekssesukaandadalamsatubarisdenganpanjangkurangdari255 karakter. Simpanlah teks tersebut dalam file teks, misalnya dengan nama 'uji1.txt'. Kompilasi program tersebut dengan compiler yang anda gunakan, menjadi'pjj0101.exe',lalujalankanperintahpadacommandprompt.
pjj0101 < uji.txt

Jika program mengeluarkan keluaran yang sama dengan isi teks pada input, makaprogramAndasudahberjalandenganbenar. Sebagai latihan menggunakan penguji otomatis, tentunya jika anda memiliki akses internet, akses alamat server penguji, login sesuai dengan UserId dan PasswordyangtelahAndamiliki,lalusubmitprogram'pjj0101.pas'tersebut.Jika Anda tidak memiliki akses internet dan hendak mengirimkannya melalui pos, maka simpanlah ke dalam disket atau cd (beserta latihanlatihan lainnya, demi menghematbiayaposAnda!)lalukirimkankepadapembinaTOKI.

ContohMasukan
abc

ContohKeluaran
abc

Jawaban Anda atas soalsoal yang terdapat dalam materi PJJ ini dapat disubmit langsung melalui TOKI Learning Center (http://www.toki.or.id/) dengan User ID dan password yang akan diberikan kepadaAndaviaEmail,telepon,ataumedialainnya,ataumelaluiposke: TimPembinaTOKI Jln.KyaiGedeUtamano.12 Bandung40132 JanganlupamenyertakanidentitaslengkapAnda(minimal:nama,alamatsurat,danasalsekolah).

74/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

WhileLoop
NamaProgram: BatasRuntime: BatasMemori: pjj0102.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Melanjutkan latihan pertama gantilah kedua baris readln(brs) dan writeln(brs) dengan deretan perintah berikut ini, yang berfungsi untuk membaca beberapa barismasukandanmenulisbarisyangbarudibaca,satudemisatubaris.Jangan mengganti bagian lain dari program, kecuali nama program 'pjj0102'. Simpan sebagai'pjj0102.PAS'.
while not eof(input) do begin readln(brs); writeln(brs); end;

Dalamderetanperintahdiatasterdapatstrukturloopwhile
while <kondisi> do begin <perintah-perintah> end;

Untuk menguji program anda, buatlah file teks input 'uji2.txt' (seperti 'uji1.txt' namun dituliskan dalam beberapa baris). Setelah dikompilasi, jalankan dengan perintah
pjj0102 < uji2.txt

Jika keluaran sama dengan yang dituliskan dalam file 'uji2.txt' maka program Anda sudah berjalan dengan benar. Ujilah dengan penguji otomatis seperti dijelaskanpada'pjj0101.PAS'.

ContohMasukan
abc 123

ContohKeluaran
abc 123

75/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

WhileLoop+Counter
NamaProgram: BatasRuntime: BatasMemori: pjj0103.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Jika pada latihan sebelumnya program membaca string demi string masukan, kiniprogramAndaharusmembacabilanganbilangan(satubilangandalamsatu baris), menjumlahkan bilanganbilangan tersebut, dan menuliskan jumlah total bilanganbilangan tersebut setelah bilangan terakhir dibaca. Pembacaan dilakukan dengan cara yang sama, tetapi variabel yang digunakan haruslah variabel bertipe integer (bilangan bulat). Gantilah nama variabel brs dengan nama baru, misalnya bil. Tentu saja setiap perintah readln(brs) juga diganti dengan perintah readln(bil). Untuk menyimpan total jumlah bilangan yang dibaca, diperlukan sebuah variabel berjenis integer seperti halnya variabel bil. Mariberinamavariabelinijml.Jadideklarasidituliskan
var bil: integer; jml: integer;

Karena selama pembacaan jml digunakan untuk mencatat jumlah hingga bilanganterakhirdibaca,makadiawalprogramvariabeljmlharusdiberiharga awal(diinisialisasi)0.Didalamloopnilaijmlharusditambahkandenganharga yangdibacakedalamvariabelbil.Setelahloopselesai,dibagianbawahprogram isijmldituliskankeoutput.Untukitubadanprogramdapatdituliskansebagai
jml := 0; while not eof(input) do begin readln(bil); jml := jml + bil; end; writeln(jml);

Notasi := menyatakan bahwa hasil ekspresi di sebelah kanan tanda ':=' akan disimpanpadavariabelyangtertulisdisebelahkiri :=.Berinamaprogramini 'pjj0103' dan simpanlah dengan nama 'pjj0103.PAS'. Untuk menguji program Andabuatlahfileteksinput'uji3.txt'yangsetiapbarisnyaberisikansatubilangan bulat(bolehnegatif)yangpanjangnyatidaklebihdari4digit.
pjj0103 < uji3.txt

Ujilah dengan penguji otomatis seperti dijelaskan pada latihanlatihan sebelumnya.


76/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ContohMasukan
1 2 3

ContohKeluaran
6

77/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

MenjumlahperKolom
NamaProgram: BatasRuntime: BatasMemori: pjj0104.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Jika pada latihan ketiga masukan terdiri dari barisbaris yang setiap barisnya hanyasatubilanganbulat,padalatihaniniAndamencobauntukmembacabaris baris yang per barisnya berisi 3 bilangan bulat dan masingmasing dipisahkan satu spasi. Lalu Anda diminta menjumlahkan bilanganbilangan pada setiap kolom dengan variabelvariabel penjumlah yang berbeda. Kolom pertama dengan penjumlah pertama, kolom kedua dengan penjumlah kedua, dan kolom ketiga dengan penjumlah ketiga. Ketiga hasil penjumlahan tersebut dicetak dalamsatubarisyangsamayangdipisahkandengansatuspasi. Untuk itu Anda perlu menggunakan 3 variabel pembaca dan 3 variabel penjumlah.Kitanamaiketigavariabelpembacaitubil1,bil2,danbil3sementara ketiga variabel penjumlah diberi nama jml1, jml2 dan jml3. Dalam Pascal, deklarasibeberapavariabelsejenisdapatdituliskandalamsatubarisseperti
var bil1, bil2, bil3, jml1, jml2, jml3: integer;

Namun, demi memudahkan pembacaan program kembali, sebaiknya variabel variabelyangmemilikifungsiyangberbedadideklarasisecaraterpisah:


var bil1, bil2, bil3: integer; jml1, jml2, jml3: integer;

Ketiga bilangan dalam satu baris dapat sekaligus dibaca sesuai dengan urutannyasertaspasinya.Perintah
readln(bil1, bil2, bil3);

akanmembacaketigabilangansekaligusdarisatubarismasukan.Penandabatas antarbilangansaatpembacaandalamPascaladalahtandaspasi. Penjumlahaan masingmasing bilangan tersebut tentu saja harus dilakukan terhadappejumlahmasingmasing
jml1 := jml1 + bil1; jml2 := jml2 + bil2; jml3 := jml3 + bil3;

78/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Pencetakan jml1, jml2, dan jml3 dalam satu baris yang sama (dengan pemisah spasi yang harus dituliskan juga karena kalau tidak maka bilanganbilangan dituliskanbersambungan!)dapatdilakukandenganperintah
writeln(jml1,' ', jml2,' ', jml3);

Lakukanjugapengujiansepertipadalatihanlatihansebelumnya.

ContohMasukan
1 2 3 2 3 4

ContohKeluaran
3 5 7

79/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

MenjumlahdalamSatuBaris
NamaProgram: BatasRuntime: BatasMemori: pjj0105.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Jikapadalatihanketigabilanganbilangandituliskanpadamasingmasingbaris, maka kali ini bilanganbilangan dituliskan pada satu baris yang sama. Untuk membantu program Anda, bilangan pada baris pertama menunjukkan berapa banyakbilanganyangakanAndajumlahkan.Jadi,programAndaharusmembaca bilangan ini di awal, kemudian membaca bilanganbilangan sebanyak nilai bilangantadi. Untukperulangan(loop)denganjumlahyangpasti/tertentudalamPascal,Anda dapatmenggunakanstrukturloopforberikut
for <iterator> := <harga-awal> to <harga-akhir> do begin <perintah-perintah> end;

<iterator> adalah variabel yang akan berubah harganya setiap loop dilakukan, dimulai dari harga <hargaawal>. Setiap perulangan, harga variabel tersebut bertambah satu. Perulangan demi perulangan dilakukan hingga variabel berharga <hargaakhir>. Tentu saja <hargaawal> harus lebih kecil atau sama dengan <hargaakhir>, karena kalau tidak maka program akan terusmenerus melakukan loop. Kita perlu dua variabel baru, untuk mencatat jumlah bilangan yangakandibaca,misalnyajbildanuntuk<iterator>misalnyai. Jadipadabagiandeklarasiditambahdenganpernyataan
jbil, i: integer;

Danbagianbadanprogramdigantidengan
jml := 0; read(jbil); for i := 1 to jbil do begin read(bil); jml := jml + bil; end; writeln(jml);

80/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Catatan: perintah readln diganti dengan perintah read agar pembacaan berikutnyatetapmembacapadabarisyangsama. Lakukan juga pengujian seperti pada latihanlatihan sebelumnya. Namai program tersebut dengan nama pjj0105 dan simpanlah dengan nama 'pjj0105.PAS'.

ContohMasukan
5 1 2 3 4 5

ContohKeluaran
15

81/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

IfThen
NamaProgram: pjj0106.PAS/C/CPP BatasRuntime: 1detik/testcase BatasMemori: 16MB NamaBerkasMasukan:Standardinput(keyboard) NamaBerkasKeluaran:Standardoutput(layar) Program Anda harus dapat membaca setiap bilangan bulat pada masukan dan memeriksa apakah bilangan tersebut positif. Jika positif maka bilangan itu dituliskan ke output, sementara jika bilangan negatif atau nol tidak melakukan apaapa. Program mirip dengan pada latihan ketiga, tetapi keluaran dicetak di dalam loop sementara pencetakan di akhir ditiadakan. Karena bilangan positif sajayangdicetakmakadiperlukansuatustrukturifthenberikut
if <kondisi> then begin <perintah-perintah> end;

<kondisi> yang diperiksa setelah notasi 'if' adalah 'apakah bil berharga positif'. <perintahperintah>adalahyangakandilakukanjikakondisibernilaibenar.Jadi Andamenambahkan
if bil > 0 then begin writeln(bil); end;

didalamstrukturloopwhilediatas(tentunyasebelumpembacaanberikutnya). Namai program tsb dengan nama pjj0106 dan simpanlah dengan nama pjj0106.PAS.

ContohMasukan1
4

ContohKeluaran1
4

ContohMasukan2
0

ContohKeluaran2

82/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ContohMasukan3
-1

ContohKeluaran3

83/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

IfThen,MultiCondition
NamaProgram: BatasRuntime: BatasMemori: pjj0107.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Program Anda harus membaca setiap bilangan bulat masukan dan memeriksa apakahbilangantersebutpositifdangenap.Jikapositifdangenapmakabilangan itudituliskankeoutput,danjikatidakmakatidakmelakukanapaapa.JadiAnda dapat langsung mengubah program untuk latihan ke enam dengan menambahkan kondisi kedua (apakah bilangan tersebut genap) yang perlu diperiksa. Jika <kondisi> berisi dua kondisi yang keduanya harus benar maka Anda menuliskan kedua kondisi tersebut berurutan diperantarai oleh notasi 'and'sebagaiberikut
if (<kondisi pertama>) and (<kondisi kedua>) then begin <perintah-perintah> end;

Tentu,<kondisipertama>adalah'apakahbilpositif'dan<kondisikedua>adalah 'apakah bil bilangan genap', yang dapat diperiksa dengan memeriksa harga modulus (sisa pembagian) dari bil jika bil dibagi dengan 2. Dalam Pascal, dituliskan bil mod 2. Jika modulus itu berharga 0, bil habis dibagi (tanpa sisa), sementarajikabukan0,makabiltidakhabisterbagi(adasisa).Bilangangenap selalu habis dibagi 2 sehingga modulusnya harus 0. Jadi <kondisi kedua> memeriksa apakah 'bil mod 2 = 0' dan pemeriksaan kedua kondisi tersebut dalamstrukturifthenmenjadi
if (bil > 0) and (bil mod 2 = 0) then begin writeln(bil); end;

Apakah posisi kedua kondisi bisa ditukar? Tentu bisa karena 'and' sebagai operatorlogikatidakmementingkanurutan(kecualipadakasuskasustertentu, yangakandijelaskankemudian). Berinamaprogrampjj0107dansimpanlahdengannamapjj0107.PAS.

ContohMasukan1
12

84/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ContohKeluaran1
12

ContohMasukan2
11

ContohKeluaran2

85/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

IfThenElse
NamaProgram: BatasRuntime: BatasMemori: pjj0108.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Program Anda harus dapat membaca setiap bilangan bulat masukan dan memeriksa apakah bilangan tersebut bilangan positif, negatif atau nol. Jika merupakanbilanganpositifmakaprogramakanmenuliskanstring 'positif',jika bilangannegatif makaprogram akan menuliskan 'negatif' dan jika bilangan nol makaproramakanmenuliskan'nol'.UntukituAndaperlumempelajaristruktur ifthenelse yang sedikit berbeda dari struktur ifthen sebelumnya. Perhatikan strukturifthenberikut
if <kondisi> then begin <perintah-perintah> end; <perintah-perintah selanjutnya>

Jika pada struktur ifthen saat kondisi yang diperiksa tidak benar maka komputer hanya melompati <perintahperintah> untuk langsung menjalankan <perintahperintah selanjutnya>. Sementara pada struktur ifthenelse sebagai berikut.
if <kondisi> then begin <perintah-perintah 1> end else begin <perintah-perintah 2> end; <perintah-perintah selanjutnya>

Jika <kondisi> benar maka komputer akan menjalankan <perintahperintah 1> lalu lompat ke <perintahperintah selanjutnya> dan jika <kondisi> tidak benar maka komputer akan menjalankan <perintahperintah 2> lalu ke <perintah perintahselanjutnya>. Jadidalamlatihaninijikakondisiyangdiperiksaadalahbil>0maka<perintah perintah1>adalahmencetakstring'positif'.Sementaraitukarenakondisitidak benar masih harus dibedakan antara negatif atau nol untuk mencetak 'negatif' atau'nol',makadidalamelsebeginenddibuatkembalipemeriksaanifthenelse yangmanakondisiyangdiperiksaadalahapakahbil=0sebagaiberikut.

86/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

if bil > 0 then begin writeln('positif'); end else begin if bil = 0 then begin writeln('nol'); end else begin writeln('negatif'); end; end;

Adanyasatustrukturdidalamstrukturyangsamadikenaldenganistilah'nested structure' (struktur bersarang), dalam hal ini adalah nested ifthenelse. Dalam Pascalseberapadalamstrukturnestedtidakdibatasi,namunakanmenyulitkan kita sendiri dalam membaca program itu. Untuk mempermudah pembacaan maka biasanya struktur yang berada lebih dalam dituliskan dengan indentasi sepertidiatas.NamuncompilerPascalakanmengabaikanidentasitersebut,jadi indentasi sepenuhnya untuk kerapihan penulisan program demi kemudahan membacanyakembali. Berinamaprogramtersebutpjj0108dansimpanlahdengannama'pjj0108.PAS'.

ContohMasukan1
2

ContohKeluaran1
positif

ContohMasukan2
0

ContohKeluaran2
nol

ContohMasukan3
-2

ContohKeluaran3
negatif

87/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Case
NamaProgram: BatasRuntime: BatasMemori: pjj0109.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Program untuk latihan ini harus membaca setiap bilangan bulat masukan yang dipastikan berharga dari antara 1 sampai dengan 30000. Program akan mengenaliapakahbilanganitumerupakansatuan(1s.d.9)ataupuluhan(10s.d. 99)atauratusan(100s.d.999)atauribuan(1000s.d.9999)ataupuluhribuan (10000s.d.30000).Jikasatuanmakaprogramakanmemberikankeluaranstring 'satuan', jika puluhan maka akan memberikan keluaran 'puluhan', dan seterusnya. Andadapatmenggunakanstrukturnestedifthenelsesepertisebelumnyasbb.
if bil < 10 then begin writeln('satuan'); end else begin if bil < 100 then begin writeln('puluhan'); end else begin if bil < 1000 then begin writeln('ratusan'); end else begin if bil < 10000 then begin writeln('ribuan'); end else begin writeln('puluhribuan'); end; end; end; end;

Namun, karena penulisan nested structure dalam program yang terlalu banyak nestnya tampak kurang rapi maka kita dapat menggunakan struktur alternatif yangdisebutstrukturcasesbb.

88/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

case <variabel> of <harga atau harga-harga 1> : begin <perintah-perintah 1> end; <harga atau harga-harga 2> : begin <perintah-perintah 2> end; dan seterusnya... end;

Dengan struktur ini maka <harga atau hargaharga> dapat berupa satu harga tunggal atau suatu jangkauan harga atau beberapa harga. Jangkauan harga, misalnya 'dari 10 s.d. 99' dituliskan '10..99' (kedua batas bilangan dengan dua titikdiantaranya).Beberapahargadituliskandengantandakomamisalnya'10, 100, 1000'. Jika ada beberapa <harga atau hargaharga> yang jangkauan bilangannya saling tumpang tindih, program akan menjalankan <perintah perintah>yangberadapadaurutan<hargaatauhargaharga>yanglebihawal. Jikajikamenggunakanstrukturcaseinipemeriksaanmenjadilebihkompakdan sederhanasbb.
case bil of 1..9: begin writeln('satuan'); end; 10..99: begin writeln('puluhan'); end; 100..999: begin writeln('ratusan'); end; 1000..9999: begin writeln('ribuan'); end; 10000..30000: begin writeln('puluhribuan'); end; end;

Namai program tersebut dengan nama pjj0109 dan simpanlah dengan nama 'pjj0109.PAS'.

ContohMasukan1
4

ContohKeluaran1
satuan

ContohMasukan2
12345

ContohKeluaran2
puluhribuan

89/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Procedure
NamaProgram: BatasRuntime: BatasMemori: pjj0110.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Program ini harus membaca beberapa bilangan bulat, satu bilangan per baris, danmenuliskankeluaran'satuan'atau'puluhan'atau'ratusan'atau'ribuan'atau 'puluhribuan'untuksetiapbilanganyangdibaca. Berbeda dengan latihan sebelumnya, pada latihan ini Anda membaca banyak bilanganbulat,tidakhanyasatu. Pada latihan ini akan diperkenalkan konsep procedure. Sebuah procedure (prosedur)adalahderetanperintahperintahyangdapatdieksekusidengancara memanggilnamanya.Bentukumumdeklarasiproseduradalah:
procedure <nama>(<daftar parameter>); <daftar deklarasi> begin <perintah-perintah> end;

Contohnya,kitadapatmembuatsebuahprocedurebernama'TulisJawaban':
procedure TulisJawaban(x: integer); begin case x of 1..9: begin writeln('satuan'); end; 10..99: begin writeln('puluhan'); end; 100..999: begin writeln('ratusan'); end; 1000..9999: begin writeln('ribuan'); end; 10000..30000: begin writeln('puluhribuan'); end; end; end;

Setelah itu procedure TulisJawaban ini dapat kita gunakan untuk memecahkan masalahawal:
while not eof(input) do begin readln(bil); TulisJawaban(bil); end;

Untuk setiap bil yang dibaca, nilai variabel bil akan "dimasukkan" ke dalam variabel x di dalam procedure TulisJawaban. Lalu prosedur tersebut akan mengeluarkan 'satuan', 'puluhan', 'ratusan', 'ribuan', atau 'puluhribuan'

90/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

tergantung pada nilai x. Secara keseluruhan, program ini akan mengeluarkan jenisbilanganuntuksetiapbilanganyangdibaca. Perhatikan kesamaan penulisan readln(bil); dan TulisJawaban(bil);. Sesungguhnya, readln dan writeln juga adalah prosedur, tetapi prosedur prosedur tersebut sudah dibuatkan untuk kita, sehingga kita tinggal menggunakannyasaja. Namai program tersebut dengan nama pjj0110 dan simpanlah dengan nama pjj0110.PAS'.

ContohMasukan
1 12 123

ContohKeluaran
satuan puluhan ratusan

91/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Function
NamaProgram: BatasRuntime: BatasMemori: pjj0111.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) ProgramuntuklatihaniniharusmembacasebuahbilanganNdanmengeluarkan nilaiN!(Nfaktorial).JikaNberadadalamjangkauan0hingga10,keluarkannilai N!.JikaNnegatifataulebihbesardari10,keluarkan'ditolak'.Catatan:0!=1. Kali ini akan diperkenalkan konsep function atau fungsi. Struktur fungsi mirip dengan prosedur, tetapi fungsi dapat mengembalikan suatu nilai untuk si pemanggil fungsi tersebut. Struktur fungsi secara umum adalah seperti berikut ini:
function <nama>(<daftar parameter>): <return type>; <daftar deklarasi> begin <perintah-perintah> end;

Contohnya,untukmenyelesaikanlatihanini,kitadapatmembuat fungsiseperti berikutini:


function Faktorial(n: integer): longint; var i: integer; bil: longint; begin bil := 1; for i := 1 to n do bil := bil * i; Faktorial := bil; end;

Dankodeprogramyangmemanggilnyasebagaiberikut:
var bil: integer; begin readln(bil); if (n >= 0) and (n <= 10) then writeln(Faktorial(bil)) else writeln('ditolak'); end.

92/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Program ini akan membaca sebuah integer dari input dan menyimpannya di dalam variabel bil. Setelah itu, jika bil ada di dalam jangkauan 1 hingga 10, Faktorialdaribilakandituliskankelayar.Sudahdikatakanbahwasebuahfungsi akan mengembalikan suatu nilai. Karena <return type> adalah integer, maka nilaiyangdikembalikanolehfungsiFaktorialbertipeinteger. Ketika fungsi Faktorial dipanggil oleh kode di atas, nilai variabel bil "dimasukkan" ke dalam variabel n di dalam fungsi Faktorial. Setelah itu, fungsi Faktorial akan menghitung nilai faktorial dari n dengan menggunakan sebuah variabelpembantubernamabillagi. Namun,sekarangadaduavariabelbil,satudidalamfungsiFaktorialdansatudi dalamprogramutama.Tetapikitatidakperlukuatir,karenameskipunmemiliki namayangsama,keduavariabelinidianggapsebagaiduavariabelyangberbeda. Variabel yang dideklarasikan di program utama disebut "global variable", dan yang dideklarasikan di dalam fungsi / prosedur disebut "local variable". Lebih dariitu,beberapafungsidanproseduryangberbedabisamemilikilocalvariable nyasendirisendiridanbisamemilikinamayangsama,tetapiduavariabelakan dianggapberbedajikadideklarasikanpadascope(tempat)yangberbeda. Perhatikan juga perintah Faktorial := bil; yang berada di akhir fungsi Faktorial. Perintah ini menyatakan bahwa nilai variabel bil menjadi nilai yang akan dikembalikanolehfungsiFaktorialsetelahfungsitersebutselesai. Jadi, misalnya perintah writeln(Faktorial(4)); akan mengeluarkan hasil yang sama dengan perintah writeln(24);. Secara umum, fungsi biasanya digunakan untukmembuatprogramlebihterstruktur,atauuntukmenghindarimenuliskan kodeberulangkali. KitajugadapatmembuatsebuahfungsilainyangbernamaValidsebagaiberikut:
function Valid(n: integer): boolean; begin Valid := (n >= 0) and (n <= 10); end;

dandigunakandiprogramutamasebagaiberikut:
var bil: integer; begin readln(bil); if (Valid(bil)) then writeln(Faktorial(bil)) else writeln('ditolak'); end.

93/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Jadi fungsi Valid akan mengembalikan nilai true atau false, tergantung nilai n (yang diperoleh dari nilai bil). Program ini akan mengeluarkan keluaran yang samadenganprogramsebelumnya. Ada satu konsep lagi yang akan dikenalkan, yaitu konsep fungsi rekursif (ada juga prosedur rekursif). Sebuah fungsi rekursif adalah fungsi yang memanggil dirinya sendiri, dan struktur ini sering dipakai dan memiliki banyak kegunaan. Contohfungsirekursifadalahsebagaiberikut:
function Faktorial(n: integer): longint; begin if (n = 0) Faktorial := 1 else Faktorial := n * Faktorial (n - 1); end;

Tentu Faktorial(0) akan mengembalikan hasil 1, seperti yang diharapkan. Bagaimana jika Faktorial(1) dipanggil? Fungsi Faktorial akan melakukan perintah Faktorial := 1 * Faktorial(0);, sehingga pada akhirnya fungsi ini akan mengembalikan hasil 1. Jika Faktorial(n) dipanggil, fungsi ini akan melakukan perintahFaktorial:=n*Faktorial(n1)dansetelahitu,fungsiiniakandipanggil lagidenganparameternyanglebihkecildaripadasebelumnya.FungsiFaktorial dipanggilterusmenerusolehdirinyasendirisampainilainmenjadi0danfungsi ini berhenti memanggil dirinya sendiri. Pada akhirnya, nilai yang dikeluarkan olehFaktorial(n)adalahn*(n1)*(n2)*...*1,yang merupakanhasilyang benar. Namai program tersebut dengan nama pjj0111 dan simpanlah dengan nama 'pjj0111.PAS'.

ContohMasukan1
4

ContohKeluaran1
24

ContohMasukan2
11

ContohKeluaran2
ditolak

94/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

VarParameter
NamaProgram: BatasRuntime: BatasMemori: pjj0112.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Program untuk latihan ini harus membaca dua buah bilangan bulat dalam satu baris, A dan B, lalu mengeluarkan kedua bilangan itu tetapi dengan posisi ditukar,menjadiBdanA,dalamsatubaris. Soal ini sebetulnya dapat dipecahkan dengan program yang sangat pendek sepertiini:
var a, b: integer; begin readln(a, b); writeln(b, ' ', a); end.

Namun, kali ini cobalah membuat sebuah prosedur Swap yang memiliki dua buahparameterinteger,yangakanmenukarkannilaiadanb,sepertiberikutini:
var a, b: integer; // menukar nilai a dengan b procedure Swap(a, b: integer); var temp: integer; begin temp := a; a := b; b := temp; end; // program utama begin readln(a, b); Swap(a, b); writeln(a, ' ', b); end.

Cobaujilahprogramitudengansebuahfileinputyangberisiduabuahbilangan bulat.Apakahprograminimengeluarkanhasilyangbenar?Ternyataprogramini tidakberjalandenganbenar.Mengapademikian?DalamprosedurSwapdiatas, parameter a dan b sebetulnya adalah "local variable" yang dideklarasikan di dalamprosedurSwap,sehinggaadanbinisamasekalibukanvariabeladanb
95/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

yangdideklarasikandiawalprogram.Dengandemikian,menukarkannilaiadan byangberadadidalamprosedurSwaptidakakanberpengaruhapaapa. Olehkarenaitu,kitaharusmengubahsedikitprosedurSwapkitamenjadi:


procedure Swap(var a: integer; var b: integer); var temp: integer; begin temp := a; a := b; b := temp; end;

atau
procedure Swap(var a, b: integer); var temp: integer; begin temp := a; a := b; b := temp; end;

"Modifier"varmenunjukkanbahwaparameteradanbbukanlah"localvariable" di dalam prosedur tersebut, tetapi adalah referensi ke sebuah variabel yang nyata di luar prosedur tersebut. Karena Swap dipanggil dari program utama dengan parameter a dan b pada program utama, maka variabelvariabel global inilahyangdireferensiolehparameterprosedurSwap.Sehingga,jikanilaiadan b ditukarkan di dalam prosedur, sebetulnya nilai yang ditukarkan adalah nilai variabelglobaladanvariabelglobalb. Untuklebihjelasnya,meskipunkodeprosedurSwapkitagantimenjadi:
procedure Swap(var c, d: integer); var temp: integer; begin temp := c; c := d; c := temp; end;

programtetapberjalandenganbenarkarenasekarangcmengacupadavariabel a global, dan d mengacu pada variabel b global. Sebuah prosedur atau fungsi dapatmemilikibeberapavariabel"denganmodifiervar"danbeberapavariabel "tanpamodifiervar"sekaligus. Namai program tersebut dengan nama pjj0112 dan simpanlah dengan nama 'pjj0112.PAS'.

96/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ContohMasukan
4 5

ContohKeluaran
5 4

97/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Break,Continue,Exit
NamaProgram: BatasRuntime: BatasMemori: pjj0113.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Padalatihanini,programAndaharusmembacasebuahbilanganbulatN(1N 100),danharusmengeluarkanbilanganbilangandari1sampaidenganNsecara berurutan,satuperbaris,denganaturansebagaiberikut:


Lompatibilangankelipatan10 Jikaprogramakanmengeluarkanbilangan93,jangankeluarkan93,tetapi keluarkan'ERROR'danjangankeluarkanapaapalagi.

Aturantersebutkesannyadibuatbuat,karenamasalahinihanyasebagaicontoh untukmengilustrasikankegunaanbreak,continue,danexit. Untukmenyelesaikanmasalahdiatas,Andadapatmembuatprogramsepertiini:


var

n: integer; i: integer; error: boolean; begin readln(n); error := false; for i := 1 to n do begin if (i = 93) then error := true; if (not error) and (i mod 10 <> 0) then writeln(i); end; if (error) then writeln('ERROR'); end.

Pada program di atas, variabel boolean error hanya berfungsi sebagai variabel pembantu.Padamulanya,errordiinisialisasidenganfalse.Setelahitu,didalam loopfor,jikaibukankelipatan10,idituliskankelayar.Namunjikaibernilai93, makavariabelerrordiberinilaitrue,sehinggasejaksaatitu tidakadalagiyang dituliskelayarkecuali'ERROR'diakhirprogram. Adacaralainmenuliskanprogramtersebut,yaitusepertiberikut:

98/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

var n: integer; i: integer; begin readln(n); for i := 1 to n do begin if (i = 93) then begin writeln('ERROR'); break; end; if (i mod 10 = 0) then continue; writeln(i); end; end.

Padaprogramini,breakberfungsiuntukkeluarsecarapaksadariloopfor.Jikai = 93, 'ERROR' dituliskan ke layar dan loop for dihentikan secara paksa, dan program berlanjut ke perintah berikutnya setelah loop for. Karena tidak ada perintah lagi, program selesai. Perintah break sebetulnya juga dapat dipakai untukmenghentikanloopwhilesecarapaksa. Perintahcontinueberfungsiuntukmenghentikanaliranprogramdankembalike barisfori:=1tondodengannilaiiselanjutnya.Jadijika iadalahkelipatan10, perintah writeln(i) tidak dijalankan dan loop for dilanjutkan dengan nilai i berikutnya. Perintahbreakdiatasjugadapatdigantidenganperintahexit.Perintahiniakan menghentikansebuahprosedur,fungsi,atauprogramsecarapaksa.Karenapada kasus di atas aliran program berada di program utama, perintah exit akan menghentikanprogramseketika. Namai program tersebut dengan nama pjj0113 dan simpanlah dengan nama 'pjj0113.PAS'.

ContohMasukan1
12

ContohKeluaran1
1 2 3 4 5 6 7 8 9 11 12

99/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ContohMasukan2
94

ContohKeluaran2
1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 21 22 23 24 25 26 27 28 29 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 47 48 49 51 52 53 54 55 56 57 58 59 61 62 63 64 65 66 67 68 69 71 72 73 74 75 76 77 78 79 81 82 83 84 85 86 87 88 89 91 92 ERROR

100/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

OperasiString
NamaProgram: BatasRuntime: BatasMemori: pjj0114.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Padalatihanini,programAndaharusmembacasebuahempatbuah stringyang kitaberinamaS1,S2,S3,danS4.MisalnyaprogramAndamendapatinputseperti ini:


abcdehalofghi bcd halo semua

Dijamin bahwa string S1 mengandung sebuah string S2 di dalamnya. Buang stringS2yangditemukandistringS1(dijaminada,danhanyasatu).Kemudian sisipkan string S4 pada posisi setelah string S3 yang ditemukan di string S1 (dijamin ada, dan hanya satu). Jadi pada contoh di atas, abcdehalofghi diubah menjadi aehalofghi, lalu menjadi aehalosemuafghi. Keluarkan string hasil akhir, yangpadacontohiniadalahaehalosemuafghi. Untuk menyelesaikan masalah tersebut, kita perlu mengenal berbagai fungsi fungsi dan prosedurprosedur penanganan string yang disediakan oleh library Pascalyangbisakitagunakan. (Dapatdilihatdi http://community.freepascal.org:10000/docs html/rtl/system/stringfunctions.html) Fungsifungsidanprosedurproseduryangakankitagunakanadalah:
function length(s: string): integer; function pos(substr: string; s: string): integer; procedure delete(var s: string; index: integer; count: integer); procedure insert(var source: string; s: string; index: integer);

Fungsilengthakanmengembalikanpanjangdaris. Jika string s mengandung string substr, fungsi pos akan mengembalikan index pertama dari kemunculan pertama substr di dalam s (karakter pertama diberi index1).Jikatidakada,fungsiiniakanmengembalikan0.

101/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Prosedurdeleteakanmembuangsebanyakcountkarakterpadastrings,dimulai denganindexkeindex.Misalnya,jikaspadamulanyaadalah'Halo',delete(s,1, 2)akanmengubahisismenjadi'lo'. Prosedurinsertakanmemasukkanstringskedalamstringsource,dimulaipada posisiindexkeindex. Untuk menyelesaikan masalah awal, kita dapat membuat program sebagai berikut:
var S1, S2, S3, S4: string; begin readln(S1); readln(S2); readln(S3); readln(S4); delete(S1, pos(S2, S1), length(S2)); insert(S4, S1, pos(S3, S1) + length(S3)); writeln(S1); end.

Padaprogramdiatas,S2didalamS1akandibuangdariS1,dan selanjutnyaS4 akandimasukkankedalamS1tepatpadaposisipos(S3,S1)+length(S3),yaitu posisi karakter pertama yang tidak termasuk S3, setelah kemunculan seluruh karakterS3didalamS1. Namai program tersebut dengan nama pjj0114 dan simpanlah dengan nama 'pjj0114.PAS'.

ContohMasukan
abcdehalofghi bcd halo semua

ContohKeluaran
aehalosemuafghi

Masihbanyakfungsifungsidanprosedurprosedurlainyangmungkinberguna, yangbisadipelajaridi http://community.freepascal.org:10000/docshtml/rtl/system/index.html Berikutiniadalahringkasandaribeberapafungsiyangmungkinberguna:


102/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

procedure str(x: integer; var s: string);

Prosedurini akan mengubah nilai integerxmenjadi string, lalu dimasukkanke dalamvariabels.Misalnya,jikaxbernilai10,sakanmenjadibernilai'10'.


function lowerCase(s: string): string;

Fungsiiniakanmenghasilkansebuahstringsepertistetapisemuakarakternya diubahkehurufkecil.
function upCase(s: string): string;

Fungsiiniakanmenghasilkansebuahstringsepertistetapisemuakarakternya diubahkehurufbesar.
function chr(b: byte): char;

Fungsi ini akan mengembalikan sebuah karakter yang memiliki kode ASCII b. Misalnyachr(65)akanmengembalikan"A".
function ord(c: char): longint;

Fungsi ini akan mengembalikan nilai bilangan bulat dari sebuah tipe ordinal. Biasanya fungsi ini digunakan untuk menentukan kode ASCII dari karakter c. Misalnya,ord("A")akanmengembalikan65. Kombinasichrdanorddapatdigunakanuntukmengubahsebuahkarakterdari huruf kecil menjadi huruf besar, atau sebaliknya. Misalnya, chr(ord("x") + (ord("A")ord("a")))akanmenghasilkan"X".
function abs(l: longint): longint;

Fungsi ini akan mengembalikan nilai absolut dari l. Misalnya, abs(3) akan mengembalikan3,danabs(3)jugamengembalikan3.
procedure dec(var x: integer); procedure dec(var x: integer; decrement: integer);

Proseduriniakanmenguranginilaixdengan1,ataudengannilaidecrementjika diberikan.
procedure inc(var x: integer); procedure inc(var x: integer; increment: integer);

103/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

Proseduriniakanmenambahnilaixdengan1,ataudengannilai incrementjika diberikan.


function sqr(x: longint): longint; function sqr(x: real): real;

Fungsiiniakanmengembalikankuadratdarix.
function sqrt(x: real): real;

Fungsiiniakanmengembalikanakarkuadratdarix.
function trunc(x: real): integer;

Fungsiiniakanmengembalikanbagianbilanganbulatdarisebuahbilanganreal x.Misalnya,trunc(3.456)akanmenghasilkan3.
function round(x: real): integer;

Fungsi ini akan menghasilkan pembulatan dari sebuah bilangan real x. Pada Pascal, aturan pembulatan untuk 0.5 adalah ke arah bilangan genap. Jadi, round(1.5)akanmenghasilkan2,tetapiround(2.5)jugaakanmenghasilkan2.
function pi: real;

Fungsiinimengembalikannilaipi(3.14159...).

104/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

ManhattanDistance
NamaProgram: BatasRuntime: BatasMemori: pjj0115.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Manhattan distance adalah jarak dari suatu titik menuju titik lainnya di bidang kartesian dengan menyusuri bagian vertikal dan horizontal, tanpa pernah kembali. Secara sederhana sama dengan jumlah dari selisih absis dan selisih ordinat (distance = |x1x2| + |y1y2|). Pada soal ini, Anda akan membaca masukanyangberisiempatbuahbilanganbulatyangmerupakankoordinatdari dua buah titik, x1 y1 x2 y2 (semuanya berada dalam jangkauan 1000000000..1000000000) secara berturutan dalam 1 baris. Hitung berapa manhattandistanceuntukkeduabuahtitiktersebut.

FormatMasukan
Sebuahbarisberisiempatbuahbilanganbulatx1y1x2y2.

FormatKeluaran
Sebuah bilangan bulat yang merupakan manhattan distance untuk kedua buah titikyangdiberikan.

ContohMasukan
-1 -1 1 1

ContohKeluaran
4

105/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

FloorandCeiling
NamaProgram: BatasRuntime: BatasMemori: pjj0116.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput (keyboard) NamaBerkasKeluaran: Standardoutput(layar) Nilaifloordarisebuahbilanganadalahbilanganbulatterbesaryangmasihlebih kecil atau sama dengan bilangan tersebut, sebaliknya nilai ceiling dari sebuah bilanganadalahbilanganbulatterkecilyangmasihlebihbesaratausamadengan bilangantersebut.

FormatMasukan
Sebuahbilanganreal(dalamjangkauan1000000..1000000).

FormatKeluaran
Dua buah bilangan bulat berturutan dalam satu baris dipisahkan oleh spasi, yakninilaifloornyadannilaiceilingnya.

ContohMasukan
-256.652

ContohKeluaran
-257 -256

106/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

DuaPangkat
NamaProgram: BatasRuntime: BatasMemori: pjj0117.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Bilangan "dua pangkat" dalam soal ini adalah bilangan bulat yang dapat dituliskandalambentuk2^KdimanaKadalahsebuahbilanganbulat.

FormatMasukan
Sebuahbilanganbulatdalamjangkauan1sampai2^20.

FormatKeluaran
"TRUE"jikabilanganyangdiberikanadalahbilangan"duapangkat",dan"FALSE" jikasebaliknya.

ContohMasukan1
8

ContohKeluaran1
TRUE

ContohMasukan2
6

ContohKeluaran2
FALSE

107/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

POLA1
NamaProgram: BatasRuntime: BatasMemori: pjj0118.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Perhatikancontohmasukandankeluaranyangdiberikan,temukanpolanya,lalu buatlahprogramnya.

FormatMasukan
SebuahbilanganbulatN(0<N<10)

FormatKeluaran
PolaberukuranN,sepertipadacontohkeluaran.

ContohMasukan
5

ContohKeluaran
* ** *** **** *****

108/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

POLA2
NamaProgram: BatasRuntime: BatasMemori: pjj0119.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Perhatikancontohmasukandankeluaranyangdiberikan,temukanpolanya,lalu buatlahprogramnya.

FormatMasukan
SebuahbilanganbulatN(0<N<10)

FormatKeluaran
PolaberukuranN,sepertipadacontohkeluaran.

ContohMasukan1
5

ContohKeluaran1
0 12 345 6789 01234

ContohMasukan2
7

ContohKeluaran2
0 12 345 6789 01234 567890 1234567

109/110

MateriPJJPraOSN2008
v.08final

Penulis:TimPembinadanAlumniTOKI

POLA3
NamaProgram: BatasRuntime: BatasMemori: pjj0120.PAS/C/CPP 1detik/testcase 16MB

NamaBerkasMasukan: Standardinput(keyboard) NamaBerkasKeluaran: Standardoutput(layar) Perhatikancontohmasukandankeluaranyangdiberikan,temukanpolanya,lalu buatlahprogramnya.

FormatMasukan
DuabuahbilanganbulatNdanK(0<N<100,1<K<10).

FormatKeluaran
PolaberukuranN,sepertipadacontohkeluaran.

ContohMasukan1
11 3

ContohKeluaran1
1 2 * 4 5 * 7 8 * 10 11

ContohMasukan2
11 2

ContohKeluaran2
1 * 3 * 5 * 7 * 9 * 11

ContohMasukan3
11 5

ContohKeluaran3
1 2 3 4 * 6 7 8 9 * 11

110/110

Anda mungkin juga menyukai