Anda di halaman 1dari 33

BONUS MATERI

PEMROGRAMAN
INFORMATICS OLYMPIAD
(I/O) 2020
Pengantar
Dalam kehidupan sehari hari permasalahan selalu muncul kapan saja. Mulai dari
yang sederhana hingga yang kompleks. Permasalahan bukan hanya sesuatu yang negatif
namun bisa menjadi sesuatu yang positif. Misal saat kita melihat sebuah tumpukan kartu
kemudian ingin mengurutkannya, hal tersebut memberikan permasalah kepada kita yaitu
cara mengurutkan kartu tersebut.
Sebenarnya banyak hal yang tanpa kita sadari telah memberikan permasalahan
kepada kita namun tanpa sadar pula kita juga bisa menyelesaikannya. Misalkan lagi saat
kita ingin membuat kopi, maka masalah akan muncul kepada kita. Bagaimana membuat
kopi yang enak?
Dengan masalah masalah tersebut maka munculah sebuah cabang ilmu baru yang
berfungsi sebagai alat pemecah permasalahan yaitu Algoritma.

Algoritma

Algoritma adalah langkah-langkah yang logis, sistematis dan efisien untuk menyelesaikan
masalah. Langkah langkah disini dapat didefinisikan dengan berbagai hal. Misal saat ingin
membuat kopi maka kita dapat membuat algoritma pembuatan kopi sebagai berikut:

1. Masak air panas


2. Ambil cangkir
3. Masukan kopi ke cangkir 2,5 sendok makan
4. Jika ingin manis maka tambahkan gula sesuai selera
5. Jika tidak maka biarkan saja
6. Tuang air yang telah mendidih ke cangkir hingga penuh
7. Aduk hingga merata
8. Kopi siap disajikan

Apabila kita lihat terdapat 8 langkah untuk membuat kopi terasa enak. 8 langkah
tersebut merupakan algoritma yang dibuat untuk membuat kopi.

Lalu apa hubungannya langkah langkah atau algoritma dengan komputer?

Perlu diketahui bahwa cara berpikir komputer dengan kita manusia berbeda.
Manusia dapat berpikir dan melakukan langkah langkah untuk menyelesaikan permasalahan
tanpa disadari. Namun komputer tidak, komputer butuh langkah langkah yang jelas untuk
menyelesaikan permasalahan yang ada. Kita akan masuk kedalam contoh lagi untuk lebih
jelasnya.
Misalkan Andi memiliki 2 ember terisi penuh. Ember A terisi penuh dengan minyak
dan satunya Ember B terisi penuh dengan air. Namun Andi baru sadar bahwa iya tertukar
dalam menaruh kedua cairan tersebut. Andi ingin menukar supaya ember A terisi penuh
dengan air dan ember B terisi penuh dengan minyak. Bagaimanakah cara supaya Andi
dapat menukar kedua cairan tersebut?

Jawaban:

Sebenarnya caranya cukup sederhana, namun terdapat langkah-langkah yang harus


dilakukan Andi yaitu:

1. Ambil satu lagi ember kosong dengan label C


2. Masukan isi ember A ke dalam Ember kosong C
3. Kemudian Masukan isi ember B kedalam ember A
4. Terakhir masukan isi ember C ke dalam ember B
5. Selesai, cairan telah tertukar

Permasalahan yang dihadapi andi sebenarnya merupakan sebuah analogi saat kita ingin
menukar isi 2 variabel. Misal
A=2
B=4
Bagaimana menukar variabel A dan B? Jika manusia maka tinggal tulis aja langsung A = 4
dan B = 2. Tapi komputer tidak bisa melakukan itu. Komputer harus melakukan langkah
langkah yang lebih jelas untuk menukar variabel itu.

1. Buat satu variabel baru yaitu C


2. Masukan nilai A ke C
3. Masukan nilai B ke A
4. Masukan nilai C ke B
5. Selesai, Variabel telah ditukar

Cukup rumit ya, tapi memang begitulah cari berpikir komputer. Harus langkah demi langkah,
step by step. Maka dari itulah ilmu Algoritma sangat diperlukan dalam memprogram
komputer.
Bahasa Pemrograman

Dalam membuat sebuah program komputer yang kita lakukan sebenarnya adalah
memerintah komputer untuk melakukan keinginan kita. Misal kita menyuruh komputer untuk
menghitung luas persegi. Maka kita membuat algoritma atau langkah langkah untuk
menghitung persegi dan komputer akan mengeksekusi langkah-langkah yang telah kita
buat.
Namun sayangnya komputer tidak memahami bahasa kita. Bahasa yang kita
gunakan terlalu rumit untuk ukuran alat yang terdiri dari sirkuit digital. Komputer hanya
mengerti 2 buah angka yaitu 0 dan 1. Bagi kita sangat tidak mungkin menggunakan 2 angka
itu untuk mengkomunikasikan apa yang kita inginkan terhadap komputer. Maka dari itu
munculah Bahasa Pemrograman.
Bahasa Pemrograman adalah sebuah instruksi standar untuk memerintah komputer
agar menjalankan fungsi tertentu. Bahasa pemrograman sudah sangat dapat dipahami oleh
manusia sehingga lebih memudahkan dalam memerintah atau memprogram komputer.
Terdapat 2 jenis bahasa pemrograman menurut kemiripannya dengan bahasa manusia
yaitu:
1. Bahasa Tingkat Rendah

Bahasa pemrograman tingkat rendah merupakan bahasa pemrograman yang lebih mirip
dengan bahasa mesin. Dengan kemiripan terhadap bahasa mesin tersebut paka jenis
bahasa ini masih cukup sulit dibaca oleh manusia sehingga sudah jarang digunakan. Contoh
bahasa pemrograman tingkat tinggi adalah Assembly.

2. Bahasa Tingkat Tinggi


Bahasa Pemrograman Tingkat Tinggi adalah bahasa pemrograman yang sudah sangat
mirip dengan bahasa manusia. Dengan kemiripan terhadap bahasa manusia ini maka
bahasa pemrograman tingkat tinggi sangat mudah digunakan. Contoh bahasa pemrograman
tingkat tinggi adalah C, C++, Pascal, Java, Python, dan lain lain.

Untuk olimpiade yang sering digunakan pada tingkat SMA adalah Pascal dan C++.
Struktur Bahasa Pascal
Struktur dari suatu program Pascal terdiri dari sebuah judul program dan suatu blok program
atau badan program. Secara ringkas, struktur suatu program Pascal dapat tediri dari:

1. Judul Program
2. Blok Program
a. Bagian deklarasi
● deklarasi label
● definisi konstanta
● definisi tipe
● deklarasi variabel
● deklarasi prosedur
● deklarasi fungsi
b. Bagian pernyataan

Suatu program Pascal yang paling sederhana adalah program yang hanya terdiri dari
sebuah bagian pernyataan saja. Bagian pernyataan merupakan bagian yang terakhir dari
suatu blok. Bagian ini diawali dengan kata Begin dan diakhiri dengan kata End. Jadi suatu
program Pascal yang paling sederhana dapat berbentuk:

Begin
Pernyataan;
End.

Bagian pernyataan ini menunjukkan suatu tindakan yang akan dikerjakan oleh
program. Tindakan yang dilakukan oleh program tergantung dari instruksi-instruksi yang
diberikan. Pernyataan merupakan instruksi program. Pernyatan-pernyataan yang diberikan
untuk dikerjakan ditulis diantara kata Begin dan End. Akhir penulisan End yang harus
diakhiri tanda titik.

Begin
Pernyataan;
Pernyataan;
Pernyataan;
End.

Misal:

Begin
writeln(‘Hello, World’);
End.
Program Pascal tidak mengenal aturan penulisan di kolom tertentu, jadi boleh ditulis
di kolom mana saja. Penulisan pernyataan-pernyataan pada umumnya menjorok masuk
beberapa kolom tidak berpengaruh pada proses, hanya dimaksudkan supaya
mempermudah pembacaan program, sehingga akan lebih terlihat bagian-bagiannya. Setiap
akhir pernyataan harus diakhiri dengan tanda titik koma.
Di Turbo Pascal, judul program sifatnya adalah opsional dan tidak terlalu berarti
dalam program. Jika ditulis dapat digunakan untuk memberi nama program dan daftar dari
parameter tentang komunikasi program dengan lingkungannya yang sifatnya sebagai
dokumentasi saja. Judul program bila ditulis, harus terletak pada awal dari program dan
diakhiri dengan titik koma. Judul program ditulis dalam satu kata, jika lebih dari dua kata
harus disambung dengan tanda hubung bawah (tidak boleh ada spasi kosong). Judul
program sifatnya sebagai dokumentasi saja, tidak berkaitan dengan proses program.

Program belajar_pascal;
begin
writeln(‘Saya Pascal’);
writeln(‘Saya baru kenal’);
end.

Variabel dan Tipe Data


Variabel adalah ‘penanda’ identitas yang digunakan untuk menampung suatu nilai.
Nilai tersebut dapat diubah sepanjang kode program. Secara teknis, variabel merujuk
kepada suatu alamat di memory komputer. Setiap variabel memiliki nama yang sebagai
identitas variabel tersebut.
Selain variabel juga terdapat konstanta yang dapat menampung data namun data
yang ditampung konstanta tidak dapat diubah saat program dijalankan. Dalam bahasa
pascal untuk menggunakan variabel dan konstanta harus dideklarasikan terlebih dahulu.
Bagian deklarasi sering juga kamus program. Bagian deklarasi digunakan bila di
dalam program menggunakan pengenal (identifier). Pengenal dapat berupa label, tipe,
variabel, prosedur, atau fungsi. Kalau suatu program menggunakan pengenal, Pascal
menuntut supaya pengenal tersebut dikenalkan dahulu sebelum digunakan, yaitu
dideklarasikan atau dibuat kamusnya dulu pada bagian deklarasi.
a. Deklarasi konstanta
Bila ingin menggunakan pengenal yang berisi nilai-nilai konstanta (tetap), maka
harus didefinisikan terlebih dahulu pada bagian ini. Definisi konstanta diawali dengan kata
cadangan Const diikuti oleh kumpulan pengenal yang diberi suatu nilai konstanta.
Program belajar_pascal;
Const
Potongan=0.2;
Gaji=1000000;
Nama_PT=’PT Maju’;
Begin
Writeln(‘Gaji =’,Gaji);
Writeln(‘Potongan=’,Potongan);
Writeln(‘Nama =’,Nama_PT);
End.

Bila program dijalankan akan menghasilkan:


Gaji = 1000000
Potongan = 2.00000000E-01
Nama = PT Maju

b. Deklarasi Variabel
Jika konstanta merupakan pengenal berisi data yang pasti, tetap, tidak berubah,
maka variabel adalah pengenal yang berisi data yang dapat berubah-ubah nilai dalam
program. Jadi dengan menggunakan konstanta, kita tidak dapat mengubah nilainya dalam
program, tetapi dengan menggunakan variabel, nilai dapat berubah/diubah dalam program.
Setiap variabel dalam program Pascal harus dideklarasikan sebelum digunakan. Kata
cadangan Var digunakan sebagai judul di dalam bagian deklarasi variabel dan diikuti oleh
satu atau lebih pengenal yang dipisahkan oleh koma, diikuti dengan titik dua dan tipe
datanya serta diakhiri dengan titik koma.

Program luas_segi_empat;
Const
P=5;
L=4;
Var
Luas:integer;
Begin
Luas:=P*l;
Writeln(‘Panjang=’;p);
Writeln(‘Lebar =’;l);
Writeln(‘Luas =’;Luas);
End.

Bila program dijalankan akan menghasilkan:


Panjang=5
Lebar =4
Luas =20
Jika dilihat pada program diatas maka terdapat kata unik yaitu integer. Integer merupakan
salah satu tipe data bawaan dari pascal. Apa itu tipe data? Tipe data data ini menunjukkan
suatu nilai yang dapat digunakan oleh variabel bersangkutan. Terdapat beberapa tipe data
yaitu:
1. Tipe data bilangan bulat
Data numerik integer merupakan nilai bilangan bulat baik dalam bentuk desimal
maupun hexadesimal. Nilai integer hexadesimal diawali dengan tanda dollar ($).
Turbo Pascal menyediakan 5 macam tipe data integer yang masing-masing
mempunyai jangkauan nilai yang berbeda seperti di bawah ini.

Tipe Ukuran Memori Jangkauan Nilai


Byte 1 byte 0..255
ShortInt 1 byte -128..127
Integer 2 byte -32768..32767
Word 2 byte 0..65535
LongInt 4 byte -2147483648..2147483647

2. Tipe data bilangan pecahan atau desimal


Nilai konstanta numerik real berkisar dari 1E-38 sampai dengan 1E+38 dengan
mantissa yang signifikan sampai dengan 11 digit. E menunjukkan nilai 10 pangkat.
Nilai konstanta numerik real menempati memori sebesar 6

3. Tipe data boolean


Tipe data boolean mempunyai dua buah nilai, yaitu True dan False. Kita dapat
mendeklarasikan suatu variabel dengan tipe boolean dan mengisi variabel tersebut
dengan nilai data boolean True atau False. Tipe data ini tidak dapat dioperasikan ke
dalam bentuk aritmatika.

4. Tipe data karakter


Nilai data karakter berupa karakter yang ditulis diantara tanda petik tunggal,
seperti ‘A’, ‘a’, ‘!’, ‘5’ dan sebagainya. Penggunaan variabel untuk menyimpan data
tipe karakter ini harus dideklarasikan dengan tipe Char.

5. Tipe data String


Nilai data string merupakan urut-urutan dari karakter yang terletak di antara
tanda petik tunggal. Bila karakter petik merupakan bagian konstanta string, maka
dapat ditulis dengan menggunakan dua buah petik tunggal berurutan. Nilai data
string akan menempati memori sebesar banyaknya karakter stringnya ditambah
dengan 1 byte. Bila panjang dari Mengenal Turbo Pascal—Awan Sundiawan 9 suatu
string di dalam deklarasi variabel tidak disebutkan, maka dianggap panjangnya
adalah 255 karakter.

Percabangan
Hampir setiap program yang kompleks mengandung suatu penyeleksian kondisi.
Dengan menyeleksi suatu kondisi, program dapat menentukan tindakan apa yang harus
dikerjakan, tergantung dari hasil kondisi yang diseleksi tersebut. Untuk menyeleksi suatu
kondisi, di dalam bahasa Pascal dapat dipergunakan pernyataan IF dan CASE.
a. Percabangan IF
Struktur pernyataan IF dapat berupa If—Then atau If—Then—Else dengan bentuk
umum:

If ungkapan Then pernyataan

Ungkapan adalah kondisi yang akan diseleksi oleh pernyataan If. Bila kondisi
yang diseleksi terpenuhi, maka pernyataan yang mengikuti Then akan diproses.
Sebaliknya, bila kondisi tidak terpenuhi, maka yang akan diproses adalah pernyataan
berikutnya.

Var
Nilai:ral;
Ket : string[11];
Begin
Ket:’Tidak Lulus’;
Write(‘Nilai Ujian = ‘);
Readln(Nilai); {Penyeleksian kondisi}
If Nilai>60 Then
Ket:=’Lulus’;
Writeln(Ket);
End.

Pada kondisi diatas jika variabel nilai memiliki nilai lebih dari 60 maka variabel
ket akan diisi nilai ‘Lulus’ sehingga selanjutnya saat dicetak dengan writeln akan
menghasilkan output ‘Lulus’.
If kondisi Then
pernyataan1;
Else
pernyataan2;

Pernyataan1 akan diproses apabila kondisi benar(terpenuhi) sedang


pernyataan2 akan diproses apabila kondisi tidak terpenuhi.

Var
Nilai:Real;
Begin
Writeln(‘Nilai Ujian = ‘);
Readln(Nilai);
If Nilai>60 Then
Writeln(‘Lulus’);
Else
Writeln(‘Tidak Lulus’);
End.

Cara membaca percabangan tersebut adalah Jika nilai lebih dari 60 maka
outputkan ‘Lulus’, Jika tidak maka outputnya ‘Tidak Lulus’.
b. Percabangan CASE
Pernyataan Case dapat berbentuk struktur Case—Of atau Case—Of…. Else.
Struktur Case—Of mempunyai suatu ungkapan logika yang disebut dengan selector
dan sejumlah pernyataan yang diawali dengan suatu label permasalahan yang
mempunyai tipe sama dengan selector. Pernyataan yang mempunyai label
permasalahan yang bernilai sama dengan nilai selector akan diproses sedang
pernyataan yang lainnya tidak. Perbedaan dengan struktur If adalah bila pernyataan
If menyeleksi suatu kondisi yang terpenuhi, setelah memproses pernyataan dalam
lingkungan yang terpenuhi tersebut, proses penyeleksian masih dilakukan terhadap
pernyataan If berikutnya yang lain. Sedang pada struktur Case—Of bila salah satu
kondisi terpenuhi dan pernyataan tersebut telah diproses, selanjutnya pernyataan
yang lainnya dalam lingkungan Case tidak akan diseleksi lagi.

Var
Nilai:Char;
Begin
Writeln(‘Nilai huruf yang didapat = ‘);
Readln(Nilai);
Case Nilai of
‘A’:Writeln(‘Sangat Baik’);
‘B’:writeln(‘Baik’);
‘C’:Writeln(‘Cukup’);
‘D’:Writeln(‘Kurang’);
‘E’:Writeln(‘Gaga’);
End;
End.

Nilai ujian yang diberikan dalam bentuk huruf A, B, C, D, E mempunyai arti


sebagai berikut.
Nilai ‘A’ berarti sangat baik.
Nilai ‘B’ berarti baik.
Nilai ‘C’ berarti cukup.
Nilai ‘D’ berarti kurang.
Nilai ‘E’ berarti kurang sekali.
Nilai ‘F’ berarti gagal.

Perulangan
Dalam membuat sebuah algoritma kadang kita memerlukan langkah langkah yang
harus diulang. Misal saat membuat teh manis kita akan menambahkan gula, setelah
menambah gula kamu akan mencicipinya, jika belum manis maka kamu akan melakukan
langkah yang sama seperti sebelumnya kemudian akan terulang kembali.
Pengulangan (loop) merupakan bentuk yang sering ditemui di dalam suatu program
aplikasi. Di dalam bahasa Pascal, dikenal tiga macam perulangan, yaitu dengan
menggunakan pernyataan For, While-Do, dan Repeat…Until.

a. Struktur Perulangan For


Perulangan dengan pernyataan For digunakan untuk mengulang pernyataan atau
satu blok pernyataan berulang kali sejumlah yang ditentukan. Perulangan dengan
pernyataan For dapat berbentuk perulangan positif, perulangan negatif dan perulangan
bersarang.

Var
I:Integer;
Begin
For I:= 1 to 5 Do
Writeln(‘Pascal’);
End.

Output yang dihasilkan dari program tersebut adalah


Pascal
Pascal
Pascal
Pascal
Pascal
Program akan mengulangi pernyataan yang ada didalam for sesuai dengan jumlah
yg ditulis disana.
b. Struktur Perulangan While-Do
Perulangan ini menggunakan pernyataan While—Do. Pernyataan While—Do
digunakan untuk melakukan proses perulangan suatu pernyataan atau blok pernyataan
terus-menerus selama kondisi ungkapan logika pada While masih bernilai logika benar.
Bentuk Umum

While kondisi ungkapan Do Pernyataan

Contoh :

Var
I:Integer;
Begin
I:=0;
While I<5 Do
Begin
Writeln(I);
I:=I+1;
End;
End.

Cara membaca program tersebut adalah selama I memiliki nilai kurang dari lima
maka pernyataan dalam perulangan tersebut akan di eksekusi sehingga menghasilkan:
1
2
3
4
5
c. Struktur Repeat...Until
Struktur Repeat…Until digunakan untuk mengulang pernyataan-pernyataan atau
blok pernyataan sampai kondisi yang diseleksi di Until terpenuhi. Bentuk umumnya adalah:

Repeat pernyataan Until kondisi

Contoh:

Var
I:Integer
Begin
I:=0;
Repeat
I:=I+1;
Writeln(I);
Until I=5;
End.

Cara membaca program tersebut adalah Ulangi perintah yang ada didalam
perulangan hingga nilai I sama dengan 5 sehingga hasilnya adalah sebagai berikut:
1
2
3
4
5

Larik atau Array

Sebuah variabel hanya dapat menyimpan sebuah nilai. Ia tidak dapat menyimpan
beberapa data. Sedangkan dalam membuat program terkadang kita butuh penampungan
data yang cukup banyak. Misalnya menampung data 100 nilai mahasiswa.

Sangat melelahkan jika harus membuat seperti ini :

nilai_mahasiswa_1 = 100

nilai_mahasiswa_2 = 90

nilai_mahasiswa_3 = 80

nilai_mahasiswa_4 = 40
nilai_mahasiswa_5 = 80

nilai_mahasiswa_100 = 70

Maka dari itu manusia menciptakan list atau array.


Larik atau array atau list adalah suatu struktur data yang menyimpan sekumpulan
data yang biasanya bertipe sama. Jika di ibaratkan, variabel merupakan sebuah mangkok
yang menyimpan 1 porsi bakso, maka array adalah sekumpulan mangkuk yang dijejer dan
masing-masing mangkuk diisi 1 porsi bakso.

Saat kita ingin mengakses data dari suatu variabel maka kita hanya perlu memanggil
nama variabelnya. Namun saat kita ingin mengakses data pada array tidak cukup dengan
memanggil namanya. Mengapa demikian?
Seperti yang telah disebutkan di awal, array dapat menampung banyak data. Saat kita
hanya memanggil nama arraynya saja, maka komputer akan bingung harus mengeluarkan data
yang mana. Oleh sebab itu didalam array terdapat penanda atau alamat dari sebuah data yaitu
index.
Suatu larik/matrik yang akan dipergunakan di dalam Pascal harus dideklarasikan terlebih
dahulu. Deklarasi dari larik didahului dengan kata cadangan Array diikuti oleh tipe indeks yang
diletakkan di antara tanda ‘[ ]’, diikuti lagi oleh kata cadangan of dan tipe lariknya.

Var
x:array[1..100] of integer;

Larik x telah dideklarasikan sebagai larik tipe integer dengan jumlah elemen
maksimum sebanyak 100 elemen. Nilai-nilai elemen larik ini harus berisi nilai-nilai integer.
Misalnya elemen-elemen (anggota) dari larik x adalah:
X[1]:=25;
X[2]:=55;
X[3]:=65;
X[4]:=75;
X[5]:=95;
.
.
.
X[100]:=95;

Apabila ingin menampilkan data ke-3 dari dari larik di atas maka dapat pergunakan
pernyataan:

writeln(x[3]);

hasil nya adalah


65

Subprogram
Subprogram merupakan blok kode yang akan dijalankan ketika dipanggil, dan dapat
menerima input sesuai dengan parameter yang ditentukan ketika subprogram itu dibuat.
Pada dasarnya, subprogram yang baik merupakan subprogram yang hanya fokus pada satu
tujuan.
Subprogram banyak digunakan pada program yang terstruktur, karena:
1. Merupakan penerapan konsep program modular, yaitu memecah-mecah
program yang rumit menjadi program-program bagian yang lebih sederhana
dalam bentuk prosedur-prosedur.
2. Untuk hal-hal yang sering dilakukan berulang-ulang, cukup dituliskan sekali
saja dalam prosedur dan dapat dipanggil atau dipergunakan sewaktu-waktu
bila diperlukan.

Terdapat 2 jenis sub program yaitu procedure dan function

1. Procedure
Prosecure adalah suatu program terpisah dalam blok sendiri yang berfungsi
sebagai subprogram (program bagian). Prosedur diawali dengan kata cadangan
Procedure di dalam bagian deklarasi prosedur. Prosedur dipanggil dan digunakan di
dalam blok program yang lainnya dengan menyebutkan judul prosedurnya.
Procedure Hitung;
Var
x,y:real;
Begin
Writeln(‘Nilai x: ‘);
Readln(x);
Y:=x*x;
Writeln(‘Nilai Y= ‘, y:6;2);
End;

Begin
Hitung;
End.

Hasilnya
Nilai X : 4
Nilai Y = 16

2. Function
Fungsi hampir sama dengan prosedur, hanya fungsi harus dideklarasikan
dengan tipenya. Tipe deklarasi ini menunjukkan tipe hasil dari fungsi. Tipe tersebut
ditulis pada akhir deklarasi fungsi yang didahului dengn titik koma, sebagai berikut.
Function namafungsi(daftar_parameter):type;

Function hitung(var x:integer):Integer;;


Var
y:real;
Begin
Y:=x*x;
hitung:=Y;
End;

Begin
Writeln(‘Nilai Y= ‘,hitung(4));
End.

Hasilnya
Nilai Y = 16
BONUS SOAL PENYISIHAN
INFORMATICS OLYMPIAD (I/O)
TAHUN 2019
1. Robi sekarang 15 tahun lebih tua dari pada adiknya Soni. Pada y tahun yang lalu umur Robi adalah dua kali
dari umur Soni. Jika Soni sekarang berumur b tahun dan b > y, berapakah nilai b – y ?

A. 13
B. 14
C. 15
D. 16
E. 17
2. Diketahui empat bilangan bulat positif W, X, Y dan Z yang juga memenuhi W < X < Y < Z. Jika hasil kali
W dan Y adalah 32, dan hasil kali X dan Z adalah 50. Berpakah nilai X dikali Y ?

A. 20
B. 25
C. 36
D. 40
E. 44
3. Berapa langkah minimal yang dibutuhkan untuk mengurutkan deret {3, 2, 1, 5, 7, 4, 8, 6, 10,
9} secara menaik apabila langkah yang hanya dapat anda lakukan adalah menukar posisi dari 2
buah bilangan manapun?
A. 4
B. 5
C. 6
D. 7
E. 8
4. 11100 mod 41 =
A. 1
B. 19
C. 20
D. 29
E. 40
5. Berapa banyak angka antara 100 hingga 1000 yang habis dibagi 3 dan 5 tetapi tidak habis
dibagi 30?
A. 48
B. 40
C. 30
D. 20
E. 18
6. 1/2 + 1/6 + 1/12 + 1/20 +… + 1/9900 =
A. 99/100
B. 96/100
C. 98/100
D. 97/100
E. 100/100
7. Bilangan 6075 habis dibagi bilangan-bilangan positif: n1, n2,.. n3 dst. Jika bilangan-bilangan
tersebut dijumlahkan adalah …
A. 11281
B. 11282
C. 11283
D. 11284
E. 11285

8. Didefinisikan N! = N x (N-1) x.. x 2 x 1 dan N# = N + (N-1) + ... + 2 +1


Contoh : 4! = 4 x 3 x 2 x 1 = 24
4# = 4+3+2+1 = 10
Berapa digit terakhir dari ((5#)#) + ((3#)#) - ((5!)! + (3!)!) ?
A. 4
B. 3
C. 2
D. 1
E. 0

Untuk soal 9-10


Seorang salesman (petugas pemasaran) suatu perusahaan minuman harus mengunjungi 5
warung untuk memperkenalkan produk minuman terbaru. Kelima warung tersebut adalah: P,
Q, R, S, dan T. Dia hanya akan mengunjungi masing-masing satu kali saja, satu warung per
hari, Senin s/d Jumat, dengan aturan berikut:
 Tidak boleh mengunjungi warung R pada hari Senin
 Harus mengunjungi warung P sebelum mengunjungi S.
 Harus mengunjungi warung Q sebelum mengunjungi T.
9. Mana jadwal yang memenuhi syarat?
A. Q, S, P, T, R
B. R, Q, T, P, S
C. R, S, P, Q, T
D. T, R, Q, P, S
E. P, S, R, Q, T
10. Jika ia mengunjungi R lebih dahulu daripada P, mana yang pasti benar?
A. Q dikunjungi pertama kali
B. R dikunjungi pada hari Selasa
C. P dikunjungi pada hari Rabu
D. T dikunjungi pada hari Kamis
E. S dikunjungi terakhir kali
11. Di suatu pulau misterius terdapat 2 macam orang, prajurit dan pencuri. Sang prajurit selalu
berkata jujur dan sang pencuri selalu berkata bohong. Suatu hari Anda bertemu tiga orang
yang berkata seperti berikut:
A: Hanya satu diantara kami yang merupakan prajurit
B: Setidaknya satu dari antara kita adalah prajurit
C: A bukanlah prajurit
Siapakah diantara mereka yang merupakan prajurit?
A. Hanya A
B. Hanya B
C. Hanya C
D. B dan C saja
E. A dan B saja

Untuk Soal no. 12 – 14


Berikut ini suatu permainan yang akan anda mainkan berdua dengan lawan anda. Dengan saling
berhadapan, ditengah-tengah terdapat mangkuk berisi 50 kelereng. Anda dan lawan anda secara
bergantian akan mengambil satu sampai dengan lima butir kelereng sekali raih dari mangkuk
(tidak boleh lebih dari 5 butir, dan minimal satu butir). Pemain yang melakukan pengambilan
terakhir (yang menyebabkan mangkuk kosong) adalah pemenang permainan ini. Lawan anda
adalah seorang yang ahli dalam permainan ini sehingga tidak akan membuat kesalahan yang
dapat menyebabkan ia menjadi kalah kecuali kondisi yang anda berikan sehingga ia tidak
memiliki pilihan untuk menang.

12. Kini giliran anda untuk mengambil pertama kali. Berapakan yang anda ambil pertama kali
agar anda akhirnya menang?
A. 1
B. 2
C. 3
D. 4
E. 5

13. Anda mendapat giliran pertama untuk mengambil dan anda selama ini menjaga situasi agar
anda akhirnya menang. Jika permainan berlangsung hingga lawan telah anda mengambil
berturut-turut 3, 1, 5, 5, dan 4, dan berikutnya giliran anda. Berapakah jumlah kelereng
yang sudah anda ambil sebelum pengambilan anda yang berikutnya (tidak termasuk yang
akan anda ambil)?
A. 7
B. 10
C. 12
D. 15
E. 20

14. Anda mendapat giliran pertama untuk mengambil dan anda selama ini menjaga situasi agar
anda akhirnya menang. Jika selama permainan lawan selalu mengambil sebanyak-
banyaknya. Berapakah jumlah kelereng yang akhirnya anda kumpulkan hingga selesai
(dan anda menang tentunya)?
A. 7
B. 10
C. 12
D. 15
E. 20

Untuk soal no 15 - 19
Ekspresi logika berikut menggunakan operator and, or, dan not. Operator and mensyaratkan kedua operand harus
bernilai benar untuk menjadikan ekspresi bernilai benar dan selain itu ekspresi bernilai salah. Operator or hanya
mensyaratkan salah satu berharga benar (termasuk boleh keduanya benar) untuk menjadikan ekspresi bernilai benar, jika
kedua operand salah maka ekspresi menjadi salah. Operator not adalah untuk menegasikan (yang benar menjadi salah
dan yang salah menjadi benar) operand yang tertulis setelahnya.

15. Dari nilai- nilai berikut, pernyataan mana yang bernilai salah jika C, D, E, F bernilai benar. A, B bernilai salah?
A. (A and B) or ((C and D) or E) and F
B. (A or B) and ((C or D) and E) or F
C. (A and B) and ((C or D) or E) or F
D. (A and B) and ((C and D) and E) and F
E. ((A or B) or (C or D) or E) and F
16. Dari nilai- nilai berikut, pernyataan mana yang bernilai benar jika C, D, E, F bernilai salah. A, B bernilai benar?
A. (A and B) or ((C and D) or E) and F
B. (A or B) and ((C or D) and E) or F
C. (A and B) and ((C or D) or E) or F
D. (A and B) and ((C and D) and E) and F
E. ((A or B) or (C or D) or E) and F
17. Dari nilai- nilai berikut, pernyataan mana yang bernilai salah jika A, C, D, E bernilai benar. B, F bernilai salah,
kecuali?
A. (A and B) or ((C and D) or E) and F
B. (A or B) and ((C or D) and E) or F
C. (A and B) and ((C or D) or E) or F
D. (A and B) and ((C and D) and E) and F
E. ((A or B) or (C or D) or E) and F
18. Dari nilai- nilai berikut, pernyataan mana yang bernilai benar jika B, C, D, E bernilai benar. A, F bernilai salah?
A. (F or B) and ((C or D) and E) or A
B. (F and B) or ((C and D) or E) and A
C. (A and B) and ((C or D) or E) or F
D. (F and B) and ((C and D) and E) and A
E. ((A or B) or (C or D) or E) and F
19. Ekspresi not((not(a))or(b)) sama dengan
A. (a)and(not(b))
B. (a)or(not(b))
C. (not(a))and(not(b))
D. TRUE
E. FALSE
20. Sebuah lingkaran akan dibagi-bagi menjadi sejumlah bidang yang dibentuk dengan
menggambar garis lurus yang memotong dua tepi lingkaran.
Dengan menggambar 3 garis sebagai berikut, terbentuk 4 atau 5 bidang

Berapa bidang maksimal yang dihasilkan dengan 3 garis?


A. 9
B. 5
C. 7
D. 6
E. 8
21. Berapa banyak untaian bit dengan panjang 10 yang diawali 000 atau diakhiri 1111?
A. 192
B. 184
C. 176
D. 128
E. Pilihan A, B, C, dan D salah.
22. Ada pipa air horizontal berbentuk lingkaran yang terisi sebagian. Jika dilihat secara
melintang, ketinggian air adalah 24 cm, sedangkan lebar air pada permukaannya juga 24 cm.
Berapakah diameter pipa tersebut?
A. 28 cm
B. 30 cm
C. 32 cm
D. 36 cm
E. Jawaban A, B, C, D salah

Untuk Soal no. 23 - 24


Sebuah rombongan tour sedang melakukan perjalanan dengan mobil. Satu mobil terdiri dari 7 orang
peserta tur dan 1 orang supir. Posisi duduk dalam mobil tersebut dapat digambarkan sbb
1 Supir
2 3 4
5 6 7
Nama-nama peserta rombongan tersebut adalah A, B, C, D, E, F, G. Susunan duduk peserta tour ini
ditentukan oleh aturan-aturan sebagai berikut
(ii) G harus duduk di samping jendela
(iii) A-B merupakan sebuah pasangan di mana mereka harus duduk bersebelahan
(iv) C paling suka duduk persis di belakang supir
(v) D-A sedang bermusuhan, sehingga mereka tidak boleh duduk berdekatan dan harus ada orang
di antara mereka berdua (baik secara horizontal, vertikal, maupun diagonal)
(vi) F mabuk darat,sehingga tidak boleh duduk di barisan paling belakang

23. Dari deskripsi soal di atas, jika E sedang ingin tidur, sehingga dia duduk di sebelah jendala
pada barisan paling belakang,maka ada berapa kemungkinan posisi duduk yang dapat
dibentuk?
A. 4
B. 5
C. 6
D. 7
E. 8
24. Dari deskripsi soal di atas, jika E sedang ingin tidur, sehingga dia duduk di sebelah jendela
pada barisan paling belakang, dan G tidak duduk di barisan paling depan,maka dapat kita
pastikan, bahwa orang yang duduk di posisi 1 adalah..
A. A
B. B
C. C
D. D
E. E
25. Perhatikan gambar persegi ajaib berukuran 4x4 di bawah ini:

4 ? 5 X
14 Z 11 ?
? 6 Y 3
1 ? 8 13
Jika persegi ajaib tersebut diisi bilangan bulat dari 1 sampai dengan 16 sedemikian rupa
sehingga total bilangan- bilangan dalam setiap kolom/baris/diagonal adalah sama, maka X
+ Y + Z = ...
A. 34
B. 33
C. 32
D. 31
E. 30

Code berikut untuk soal 26-27


uses crt;
var kambing : array[1..10] of integer = (6,3,8,2,9,1,5,6,5,6);
result : array[1..10] of integer ;
i,jangkrik,jumkam,awal,akhir : integer;
begin
jumkam := length(kambing);
awal := 1;
akhir := jumkam;
for jangkrik:= 1 to jumkam do
begin
if jangkrik mod 2 = 0 then
begin
result[jumkam-(jangkrik-1)] := kambing[akhir];
dec(akhir);
end
else
begin
result[jumkam-(jangkrik-1)] := kambing[awal];
inc(awal);
end;
end;
end.
26. Setelah program berjalan, isi dari array result adalah(urut dari index pertama)…
A. 1 9 5 2 6 8 5 3 6 6
B. 3 6 2 8 1 9 6 5 6 5
C. 6 5 6 5 1 9 2 8 3 6
D. 9 1 2 5 8 6 3 5 6 6
E. 6 3 8 2 9 1 5 6 5 6
27. Jika baris 2 dan 3 diganti seperti berikut, maka isi dari array result adalah(urut dari index
pertama)…

var kambing : array[1..15] of integer = (1,2,3,4,5,6,7,8,9,10,11,


12,13,14,15);
result : array[1..15] of integer;
i,jangkrik,jumkam,awal,akhir : integer;
A. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
B. 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
C. 2 1 4 3 6 5 8 7 10 9 12 11 14 13 15
D. 8 9 7 10 6 11 5 12 4 13 3 14 2 15 1
E. 8 9 10 7 11 6 12 5 13 4 14 3 15 2 1

Code untuk soal nomer 28-30


function orakarik(n:integer):longint;
begin
if (n = 0) or (n = 1) then
begin
orakarik:=1
end
else begin
orakarik := orakarik(n mod 2) + orakarik(n-1) * n;
end;
end;

28. Apabila nilai n=5, maka function orakarik akan mengembalikan nilai…
A. 210
B. 325
C. 206
D. 206
E. 300
29. Apabila nilai n=8, maka function orakarik akan mengembalikan nilai…
A. 69281
B. 92681
C. 69821
D. 96821
E. 98261
30. Apabila function orakarik mengembalikan nilai 6235301, maka nilai awal dari n adalah…
A. 9
B. 10
C. 11
D. 12
E. 13
Code untuk Soal 31

procedure cetak(a : byte);


begin
while a > 0 do
begin
write(a mod 2);
a := a shr 1;
end;
end;

31. Apabila dipanggil cetak(255), output yang dihasilkan adalah…


A. 10000111
B. 11000111
C. 10001111
D. 01110001
E. 01111000

Untuk Soal No 32 dan 33


function movpush(a, b :integer):integer;
var x: integer;
begin
while(b <> 0) do
begin
x := a and b;
x := x shl 1;
a := a xor b;
b := x;
end;
movpush := a;
end;
32. Jika dipanggi movpush(movpush(300, 510), movpush(0, 110)), Maka nilai kembalian dari
function diatas adalah..
A. 897
B. 920
C. 678
D. 820
E. 1200

33. Jika dipanggi movpush(movpush(500, 11), movpush(685, 110)), Maka nilai kembalian
dari function diatas adalah..
A. 1500
B. 1789
C. 2019
D. 1306
E. 1460
Soal Untuk No 34 dan 35

function k(a:integer):integer;
begin
if(a=1) then
k:=1
else
k:=k(k(a-1));
end;

34. Kembalian function diatas apabila dipanggi dengan parameter 20 adalah…


A. 40
B. 37
C. 23
D. 4
E. 1
35. Kembalian function diatas apabila dipanggi dengan parameter 200 adalah…
A. 400
B. 370
C. 230
D. 40
E. 1
Untuk Soal No 36 sampai 38
Var a,b,c,d : Boolean;
begin

if((a and b) xor (c or d)) then


writeln('OLIMPIADE TI')
else if(not((not a) xor b) and (c xor (not d))) then
writeln('FASILKOM')
else if((c or d) and d xor (a and b) or (not c)) then
writeln('UNIVERSITAS JEMBER')
else
writeln('NOTHING');
end.

36. Programa akn mencetak NOTHING jika nilai a,b,c dan d adalah…
A. a=True, b=False, c=False, d=True
B. a=False, b=True, c=False, d=True
C. a=True, b=True c=False, d=True
D. a=True, b=False, c=True, d=True
E. a=True, b=True, c=True, d=True
37. Programa akn mencetak OLIMPIADE TI dengan komposisi Boolean berikut, kecuali…
A. a=True, b=False, c=False, d=True
B. a=False, b=True, c=False, d=True
C. a=True, b=False c=False, d=False
D. a=True, b=False, c=True, d=True
E. a=False, b=False, c=True, d=True
38. Perhatikan baris ke-3, ekspresi logika apa yang tepat agar program selalu mencetak
OLIMPIADE TI untuk semua kemungkinan nilai a, b, c, dan d…
A. not((not a) xor b) and (c xor (not d)
B. not a or (a or b) and (c xor (not c))
C. (c or d) and d xor (a and b) or (not c)
D. (a and b) xor (notd)
E. (c or d) and (not b)

Untuk Soal No 39 dan 40

while a>b do
begin
a :=a-b;
b :=b+1;
c :=c+b;
d :=d+a;
end;
writeln(c,’ ‘,d)
39. Jika diberi nilai awal a = 50, b = 10, c = 0, d = 0, maka program akan mencetak…
A. 90 50
B. 50 90
C. 40 80
D. 80 40
E. 30 90
40. Jika diberi nilai awal a = 100, b =10, c = 0, d = 0, maka program akan mencetak…
A. 98 340
B. 340 98
C. 430 89
D. 89 430
E. 67 345

Soal Untuk No 41-43

function ben(a,b: integer):integer;


begin
if(b=0) then
ben:=a
else
ben:=ben(b,a mod b);
end;

function ten(c,d : integer):integer;


begin
ten:= (c*d) div ben(c,d);
end;

41. Hasil dari ben(30,5)..


A. 5
B. 10
C. 15
D. 20
E. 25
42. Hasil dari ten(36,48)…
A. 121
B. 144
C. 169
D. 196
E. 225
43. Hasil dari ten(ben(30,25),ben(80,180))…
A. 360
B. 420
C. 540
D. 720
E. 810

Untuk Soal No 44 - 46

for i := 0 to ((1 shl n) - 1) do


begin
for j := 0 to n - 1 do
begin
if((i and (1 shl j)) <> 0)then
write('1')
else
write('0');
end;
writeln;
end;

44. Banyak angka 1 yang dihasilkan program diatas jika n bernilai 4 adalah...
A. 30
B. 31
C. 32
D. 33
E. 34
45. Jika n=3, maka yang tercetak pada baris ke-6 adalah…
A. 111
B. 110
C. 101
D. 001
E. 010
46. Yang tercetak apabila n = 4 pada baris ke-7 adalah…
A. 0110
B. 1010
C. 0011
D. 1111
E. 0000
Untuk Soal No 47-49
procedure graf(x: integer);
var i: integer;
begin
if x >= 0 then
begin
graf(x - 1);
graf(x - 1);
for i := 0 to x - 1 do
writeln('*');
graf(x - 2);
end;
end;

47. Banyak bintang yang tercetak apabila dipanggil graf(5) adalah…


A. 78
B. 79
C. 80
D. 81
E. 82
48. Berapa banyak procedur graf akan dipanggil pada soal no 22 termasuk pada main
program…
A. 356
B. 357
C. 358
D. 359
E. 360

49. Berapa nilai n jika bintang yang tercetak sebanyak 200?


A. 5
B. 6
C. 7
D. 8
E. 9
Untuk Soal No 50

a := b xor c and not d;


b := a and c or d;
c := b or a xor not d;

50. Bila nilai a, b,c dan d berturut-turut adalah 0, 10, 9, dan 35. Nilai c setelah melewati
potongan program tersebut adalah…
A. -2
B. -1
C. 0
D. 1
E. 2

Anda mungkin juga menyukai