Minggu, 02 Juni 2013

Struktur Algoritma


Tiga Tipe Struktur Algoritma
Pada dasarnya ada tiga struktur dasar algoritma yang akan kita gunakan nanti. Semua algoritma yang kita buat nanti pada dasarnya merupakan salah satu atau kombinasi dari tiga struktur algoritma ini. Tiga struktur tersebut adalah :

1. Algoritma runtunan (sekuensial)
2. Algoritma seleksi kondisi atau percabangan
3. Algoritma perulangan 
Berikut ini kita akan membahasnya satu persatu. Insya Allah.
Algoritma Runtunan (Sequential)
Diantara ketiga struktur dasar algoritma di atas, algoritma runtunan merupakan algoritma yang paling sederhana. Algoritma runtunan adalah algoritma yang instruksinya dikerjakan berdasarkan urutan perintahnya. Perintah dikerjakan dari baris paling atas, kemudian baris kedua, baris ketiga, dan seterusnya. Jadi, jika terdapat algoritma dengan urutan perintahnya ditulis seperti berikut :
Perintah 1
Perintah 2
Perintah 3 
maka perintah yang dieksekusi atau dikerjakan mula-mula adalah Perintah1, diikuti kemudian Perintah2 dan terakhir Perintah3. 

Studi Kasus 
Berikut ini adalah algoritma menghitung luas lingkaran. Secara umum algoritma tersebut dapat kita nyatakan sebagai berikut.
1. Mulai
2. Masukkan nilai jari 
3. Hitung Luas  3.14 * jari*jari
4. Tampilkan Luas 
5. Selesai
Seperti yang telah dijelaskan, format penulisan algoritma standar terdiri dari tiga bagian, yaitu bagian Nama, Deklarasi dan Deskripsi. Untuk sementara bagian deklarasi kita abaikan dulu. Jika menggunakan algoritma teks standar, maka solusi permasalahan di atas dapat kita tuliskan
Algoritma 2 1
Algoritma LuasLingkaran
Deskripsi
read(jari)
luas  3.14*jari*jari
write(luas)
Dari Algoritma 2 1 kita berkenalan dengan dua buah perintah standar (reserved word), yaitu
read (di dalam Pascal sering ditulis readln), yaitu perintah untuk menginput nilai. 
write (terkadang juga ditulis writeln), yaitu perintah untuk menampilkan suatu variabel atau string

Flowchart Algoritma LuasLingkaran
Dari contoh di atas dapat dilihat bahwa perintah kedua dikerjakan setelah perintah pertama, dan perintah ketiga setelah perintah kedua. Urutan ini memegang peranan penting karena urutan berbeda dapat menghasilkan keluaran yang berbeda (walaupun, ada kalanya tidak demikian). Apa yang terjadi jika urutan perintah pertama dan kedua ditukar? Penukaran posisi menghasilkan kesalahan logika, karena tidaklah mungkin menghitung perkalian 3.14 dengan jari sedangkan nilai jari sendiri belum diketahui. 
Menggunakan Tabel Media Penyimpanan
Di dalam algoritma, perbedaan urutan langkah bisa jadi melahirkan hasil akhir yang berbeda. Untuk mengamati perubahan-perubahan itu kita gunakan tabel penyimpanan data. Tabel ini akan menunjukkan perubahan-perubahan nilai yang disimpan pada memori. Dalam hal ini yang dimaksud dengan memori komputer adalah variabel-variabel.
Berikut ini adalah contoh perbandingan dua algoritma dengan perintah yang sama tetapi berbeda urutan. Memori komputer dalam hal ini diwakili oleh variabel A dan B.
Algoritma Runtunan1

Deskripsi 
A10
    A2*A
    BA
    Write (B) Algoritma Runtunan2

Deskripsi 
    A10
    BA
    A2*A
    Write (B)
Perhatikan algoritma Runtunan1. Mula-mula A kita beri nilai 10. Pada pernyataan berikutnya nilai A menjadi dua kali A sebelumnya sehingga menjadi 20. Kemudian pada B kita simpan nilai yang sama dengan nilai A yang terakhir, yaitu 20. Pada perintah akhir kita tampilkan isi dari B, sehingga muncul angka 20. Perhatikan tabel media penyimpanan berikut ini.
Tabel 2 1
Perintah A B Output
A10 10
A2*A 20
BA 20
Write (B) 20
Sekarang beralih ke Runtunan2. Mula-mula A diberi nilai 10. Kemudian pada B disimpan nilai yang sama dengan A, yaitu 10. Lalu A diberi nilai dua kali nilai A sebelumnya sehingga menjadi 20. Akhir algoritma memerintahkan menampilkan B, yaitu nilainya 10. Jadi keluaran Runtunan1 akan menampilkan output 20, sedangkan Runtunan2 menghasilkan output 10.  Perhatikan media penyimpanan data berikut ini.
Tabel 2 2
Perintah A B Output
A10 10
BA 10
A2*A 20
Write (B) 10
Dari kedua contoh tersebut terlihat bahwa meskipun perintah yang ada pada Runtunan1 dan Runtunan2 adalah sama, tetapi urutan yang berbeda menyebabkan ouputnya juga berbeda. 
Studi Kasus 
Seorang pedagang mangga menjual dagangannya yang setiap kg mangga dihargai dengan harga tertentu. Setiap pembeli membayar harga mangga yang dibelinya berdasarkan berat. Tentukan langkah-langkah pedagang untuk menentukan harga yang harus dibayar pembeli..
Identifikasi masalah 
Input : harga per kg mangga (hrg), berat pembelian (brt)
Output : harga yang dibayar pembeli (hrg)
Jawab :
1. Mulai
2. Masukkan harga mangga per kg (hrg)
3. Masukkan berat pembelian (brt)
4. Kalikan hrg dengan brt, simpan sebagai harga yang harus dibayar pembeli (byr)
5. Tampilkan nilai byr 
6. Selesai
Dalam bentuk algoritma teks standar langkah-langkah tersebut di atas dapat ditulis
Algoritma 2 2
Algoritma BeliMangga

Deskripsi
read(hrg)
read(brt)
byrhrg*brt
write(byr)
Perhatikan : untuk operasi perkalian gunakan tanda (*) sebagai operator pengali.

Studi Kasus 
Soni mempunyai kelereng sebanyak 15 buah. Jumlah itu 10 buah lebih banyak dari kelereng Adi. Sedangkan Anis memiliki kelereng sebanyak 2 x jumlah kelereng Soni dan Adi. Luki memiliki kelereng sebanyak 5 buah lebih sedikit dari jumlah kelereng Soni, Adi dan Anis. Carilah banyak kelereng Adi, Anis dan Luki, jika diketahui jumlah kelereng Soni. 
Identifikasi masalah
Input : banyak kelereng Soni
Output : banyak kelereng Adi, Anis, Luki
Algoritma 2 3
Algoritma HitungKelereng
{Algoritma menghitung kelereng Adi, Anis, dan Luki} 

Deskripsi
Read (Ksoni)
Kadi  Ksoni-10
Kanis  2*(Ksoni+Kadi)
KlukiKsoni+Kadi+Kanis-5
Write(Kadi, Kanis, Kluki)
Tabel Penyimpanan Data Algoritma 2 3
Perintah KSoni KAdi KAnis KLuki Output
Readln(Ksoni) 15
KAdi  KSoni-10 5
KAnis  2*(Ksoni+KAdi) 40
KLukiKSoni+KAdi+KAnis-5 55
Write(KAdi, KAnis, Kluki) 5   40   55
Dari tabel tersebut di atas dapat kita lihat ketika perintah “Readln(KSoni)” dikerjakan (dengan menginput nilai 15) maka nilai variabel KSoni kemudian menjadi 15. Ketika perintah KAdi KSoni-10, maka variabel KAdi langsung terisi dengan nilai 5 (15-10). Demikian seterusnya. Dengan demikian, jika masukan algoritma Ksoni=15, maka keluaran dari algoritma di atas adalah :
 5    40    55
Studi Kasus 
Berikut ini adalah algoritma menukar nilai yang disimpan dalam dua buah variabel A dan B
Identifikasi masalah
Input : Nilai A dan B (lama) 
Output : Nilai A dan B (baru) setelah saling ditukarkan
Algoritma 2 4
Algoritma TukarIsi

Deskripsi
read(A,B)
temp  A
A  B
B  temp
write(A,B)
Tabel Penyimpanan Data Algoritma 2 4
Perintah A B Temp Output
read(A,B) 500 200
temp  A 500
A  B 200
B  temp 500
write(A,B) 200  500
Dengan demikian, jika masukan algoritma A=500 dan B=200, maka keluaran dari algoritma di atas adalah : 
200   500.
Algoritma Percabangan
Pada algoritma runtunan telah kita lihat bahwa setiap aksi atau perintah selalu dilakukan bila telah sampai gilirannya. Namun demikian ada kalanya suatu aksi hanya bisa dilakukan bila memenuhi suatu kondisi atau persyaratan tertentu. Algoritma ini kita sebut dengan algoritma seleksi kondisi atau juga percabangan.
Contoh. Misalnya kita ingin menentukan apakah suatu bilangan merupakan bilangan genap atau ganjil. Algoritmanya dapat kita jabarkan seperti berikut ini
1. Mulai 
2. Masukkan satu bilangan (X)
3. jika X habis dibagi dua maka lanjut ke 4. Jika tidak lanjut ke 5
4. tulis ‘X bilangan genap’. Lanjut ke 6.
5. tulis ‘X bilangan ganjil’
6. Selesai
Perhatikan bahwa ada dua kemungkinan perintah yang akan dikerjakan setelah perintah ke-3 dikerjakan. Jika X habis dibagi dua maka selanjutnya perintah ke-4 yang dikerjakan, kemudian melompat ke 6 (perintah 5 tidak dikerjakan). Sebaliknya jika X tidak habis dibagi dua perintah selanjutnya melompat ke-5 (perintah 4 tidak dikerjakan) dan kemudian berakhir pada perintah ke-6.
Ada dua tipe algoritma percabangan yang akan kita bahas berikut ini yaitu
- Satu kondisi (if-then) : artinya hanya ada satu kondisi yang menjadi syarat untuk melakukan satu atau satu blok (sekelompok) aksi. Bentuk umum algoritma teks standar percabangan dengan satu kondisi :
if <kondisi> then
    aksi
Jika <kondisi> terpenuhi atau bernilai benar maka aksi dikerjakan, sedangkan jika tidak, maka aksi tidak dikerjakan dan proses langsung keluar dari percabangan. Perhatikan contoh berikut ini.
if A>B then
    write (A)
Ekspresi di atas menunjukkan bahwa perintah menulis / menampilkan A dikerjakan hanya jika kondisi A>B terpenuhi (bernilai benar). Jika yang terjadi adalah sebaliknya, tidak ada aksi yang dilakukan atau proses langsung keluar dari percabangan. Secara flowchart ekspresi itu dapat ditulis seperti berikut. 






Ungkapan dalam belah ketupat “A>B?” dapat kita baca “apakah A lebih besar B?”. Perhatikan bahwa pada belah ketupat tersebut memiliki dua cabang arus data, yang satu untuk kondisi bernilai benar (y, artinya ya), sedang yang lain untuk kondisi bernilai salah (t, artinya tidak). Jika kondisi bernilai benar (y) maka perintah yang dikerjakan adalah write(A). Jika kondisi salah (t) maka arus data langsung menuju ke bawah tanpa mengerjakan aksi apapun.  
- Dua kondisi (if-then-else) : artinya ada dua kondisi yang menjadi syarat untuk dikerjakannya dua jenis aksi. Bentuk umum percabangan dengan dua kondisi :
if <kondisi> then
aksi1 
else
aksi2
Jika <kondisi> bernilai benar maka aksi1 dikerjakan. Sedangkan jika tidak (<kondisi> bernilai salah), maka aksi yang dikerjakan adalah aksi2. Berbeda dengan percabangan satu kondisi, pada percabangan dua kondisi ada dua aksi untuk dua keadaan kondisi, yaitu untuk <kondisi> yang bernilai benar dan <kondisi> yang bernilai salah. Contoh algoritma percabangan dua kondisi :

if A>B then
write (A) 
else
write (B)
Ekspresi di atas sedikit berbeda dengan sebelumnya. Perintah menulis/menampilkan A dikerjakan hanya jika kondisi A>B bernilai benar. Jika yang terjadi adalah sebaliknya maka aksi yang dilakukan adalah menulis B. Secara flowchart aksi di atas dapat ditulis sebagai berikut.
Berikut ini adalah beberapa contoh lainnya.
If x > 0 then
ket  ‘bilangan positif’

if m = n
i  m*n
write(i)

if bil>=0 then
ket  (‘bilangan positif’) 
else
ket  (‘bilangan negatif’)

if m = n then
i  m*n
j  m-n  
else
i  m/n   
j  m+n
write(i,j)


Latihan : Cobalah anda buat flowchart dari algoritma di atas!
Studi Kasus         
Berikut ini adalah algoritma untuk menentukan apakah suatu bilangan merupakan bilangan genap atau ganjil. Input algoritma adalah bilangan yang akan ditentukan jenisnya tersebut.
Identifikasi Masalah
Input : Bilangan
Output : Keterangan “Ganjil” atau “Genap"

Algoritma 2 5
algoritma bilangan_genap_ganjil

deskripsi
    read (bil)
    ket’ganjil’
if bil mod 2 = 0 then
  ket‘genap’
    write (ket)


Keterangan : mod (modulus) adalah operator sisa pembagian. 

Contoh 5 mod 2 = 1, atau 6 mod 3 = 0

Mula-mula inputkan variabel (bil), misalnya 3. Kemudian (ket) diberi nilai ‘ganjil’. Kemudian karena kondisi (bil mod 2 = 0) bernilai salah, maka (ket) tidak berubah dan tetap bernilai ‘ganjil’, sehingga ketika perintah write(ket), output yang muncul adalah ‘ganjil’. Untuk jelasnya perhatikan tabel penyimpanan data berikut.
Tabel Penyimpanan Data Algoritma 2 5
Perintah bil ket Output
read (bil) 3
ket’ganjil’ ‘ganjil’
if bil mod 2 = 0 then
ket‘genap’
write (ket) ‘ganjil’
Untuk menyelesaikan soal di atas anda juga dapat menggunakan algoritma if-then-else seperti berikut ini. 
Algoritma 2 6
algoritma bilangan_genap_ganjil

deskripsi
    read (bil)
    if bil mod 2 = 0 then
  ket‘genap’ 
else
ket ’ganjil’
      write (ket)
Studi Kasus 
Buatlah algoritma menentukan gaji total pegawai. Diketahui pegawai dengan masa kerja lebih dari 3 tahun mendapat tunjangan sebesar 20% gaji pokok sedang yang kurang dari itu mendapat tunjangan 10%. Input program adalah masa kerja dan gaji pokok.
Identifikasi masalah
Input : masa kerja, gaji pokok
Output : gaji total
Algoritma 2 7
algoritma gaji_pegawai


deskripsi
    read (mk, gapok)
    if mk>3 then
  tjg  0.2*gapok 
else
  tjg  0.1*gapok
gatot  gapok+tjg
write(‘Gaji total ’,gatot)
Mula-mula dimasukkan data (mk) dan (gapok). Misalnya, masing-masing diberi nilai 2 dan 1000. Karena (mk>3) bernilai salah, maka perintah yang dikerjakan adalah (tjg0.1*gapok). Kemudian gapok dan tjg dijumlahkan yang hasilnya disimpan sebagai gatot. Dengan demikian output yang keluar adalah 1100. 
Perhatikan tabel penyimpanan data berikut
Perintah mk gapok tjg gatot Output
read (mk, gapok) 2 1000
if mk>3 then
tjg  0.2*gapok 
else
tjg  0.1*gapok 100
gatot  gapok+tjg 2 1000 100 1100
write(gatot) 1100
Jadi keluaran algoritma : 
1100
Algoritma Pengulangan
Ada kalanya untuk menyelesaikan suatu masalah, satu atau beberapa instruksi harus dikerjakan beberapa kali. Misalnya anda hendak menampilkan tulisan ”algoritma” sebanyak tiga kali, maka algoritmanya dapat ditulis 
1. Mulai 
2. Tulis ‘Algoritma’
3. Tulis ‘Algoritma’
4. Tulis ‘Algoritma’
5. Selesai
Sehingga diperoleh keluaran :
Algoritma
Algoritma
Algoritma
Contoh lain. Anda hendak menghitung suatu bilangan dipangkatkan tiga. Maka algoritmanya dapat dituliskan


1. Mulai
2. Masukkan bilangan X
3. Set nilai Y=1
4. Kalikan X dengan Y, simpan sebagai Y
5. Kalikan X dengan Y, simpan sebagai Y
6. Kalikan X dengan Y, simpan sebagai Y
7. Tulis (Y)
8. Selesai
Atau dalam algoritma teks standar deskripsinya dapat ditulis seperti berikut :

Deskripsi
Read(X)
Y1
YX*Y
YX*Y
YX*Y
Write(Y)




Jika input algoritma (X) adalah 2, maka perubahan nilai dalam variabel dapat dilihat pada tabel penyimpanan data berikut.

Perintah X Y Ouput
Read(X)
Y1
YX*Y
YX*Y
YX*Y
Write(Y)
2


1
4
8
16






16

Output yang dihasilkan adalah : 16

Cara ini memang dapat menyelesaikan permasalahan tersebut di atas, tapi sangat tidak efisien dalam penulisannya. Bayangkan kalau pengulangan yang harus dilakukan sebanyak 1000 kali, maka kita harus menulisnya sebanyak seribu kali pula. Tentunya hal ini sangat sangat merepotkan. Untuk itu kita perlu mengenal satu lagi algoritma dasar yaitu algoritma pengulangan. Dengan algoritma ini kita cukup menuliskan perintahnya sekali untuk pengulangan berapapun banyaknya.
Bila mengacu pada bahasa pemrograman Pascal, terdapat tiga ekspresi algoritma untuk pengulangan :
1. for-do
2. while-do
3. repeat-until
Pengulangan For-Do
Pengulangan for adalah pengulangan yang cocok digunakan untuk kasus-kasus yang jumlah pengulangannya telah jelas. Ada 2 macam pengulangan for-do, yaitu for-do menaik dan for-do menurun. Berikut ini adalah bentuk umumnya.
For-do menaik
For var  nilai_awal to nilai_akhir do
  Aksi
Contoh

for i  1 to 3 do
Write(‘Halo’)


Kondisi pengulangan for secara tersirat dapat dilihat pada ni (nilai_awal) dan nf (nilai_akhir); Nilai yang terkandung pada var mula-mula sama dengan nilai_awal, kemudian bertambah (berkurang) sebanyak satu, kemudian berhenti setelah var lebih besar (lebih kecil) nilai_akhir. 
Contoh
for i  3 downto 1 do
Write(‘Halo’)
Penjelasan
Pada perintah di atas, mula-mula i diberi nilai 1. Kemudian perintah write(‘Halo’) dikerjakan. Setelah itu i bertambah satu sehingga menjadi 2, dilanjutkan dengan perintah write(‘Halo’). Proses yang sama diulang lagi hingga i bernilai tiga, perintah write(’Halo’)  dikerjakan. Setelah itu proses pengulangan berhenti di situ. 
Dengan demikian outputnya dapat kita nyatakan seperti berikut
Halo
Halo
Halo

For-do menurun
For variabel  nilai_awal downto nilai_akhir do
  Aksi

Kita dapat membuat output yang sama seperti di atas dengan for-do menurun.

for i  3 downto 1 do
Write(‘Halo’)





Perbedaannya, pada for-do menaik i berubah dari 1 sebanyak +1 dan berhenti setelah lebih dari 3, sedangkan pada for-do menurun, i berubah dari 3 sebanyak –1 hingga akhirnya berhenti saat i kurang dari 1.
Studi Kasus
1. Buat algoritma menampilkan deret 1, 2, 3, …, N. N adalah masukan.
Input : -
Output : 1 2 3
Algoritma 2 8
Algoritma deret

Deklarasi
   var
N,x : integer

Deskripsi
read(N)
for x  1 to N do
write(x)
Mula-mula masukkan nilai N, misalnya 3. Setelah itu masuk ke dalam loop dengan x mula-mula 1. Pengulangan dilakukan selama kondisi bernilai true, yaitu selama nilai x dalam rentang 1..N. Kemudian  write (x) menghasilkan keluaran 1. Proses diulang lagi dengan x (=2) Kemudian  write (x) menghasilkan keluaran 2. Demikian seterusnya. Aksi tidak lagi dikerjakan saat x>N.
Tabel Penyimpanan Data Algoritma 2 8
Perintah N x=1..N x Output
Read(N) 3
x=1 : write(x)
x=2 : write(x)
x=3 : write(x)
x=4 : write(x)    

true
true
true
false 1
2
3
1
2
3
Latihan : coba anda  tuliskan bentuk flowchart dari algoritma di atas.
Studi Kasus
Buat algoritma yang menampilkan jumlah dari deret pada Algoritma 2 8.
Input : -
Output : jumlah deret
Algoritma 2 9
Algoritma jumlah_deret

Deskripsi
read(N)
jum0
for x  1 to N do
jumjum+x
write(jum)
Tabel Penyimpanan Data Algoritma 2 9
Perintah N x > N x jum Output
read(N) 4
jum0 0
x=1 : jumjum+x
X=2 : jumjum+x
x=3 : jumjum+x
x=4 : jumjum+x
x=5 : jumjum+x

true
true
true
true
false 1
2
3
4 1
3
6
10
write(jum) 10

Penjelasan
Mula-mula masukkan nilai N, misalnya 4, kemudian inisialisasi jum=0. Setelah itu masuk ke dalam loop dengan x mula-mula 1. Kemudian jum = 0 ditambah dengan x = 1 sehingga diperoleh jum (baru) = 1. Proses diulang lagi dengan x = 2. Kemudian jum = 1 ditambah dengan x = 2 sehingga diperoleh jum = 3. Demikian seterusnya. Aksi tidak lagi dikerjakan saat x>N.
Dengan demikian keluaran dari algoritma di atas adalah : 10.

Latihan 
Coba masukkan input N yang lain, misalnya 7, kemudian isi tabel penyimpanan data dan tuliskan nilai keluarannya.

Pengulangan While-Do
Secara umum algoritma pengulangan while adalah

while <kondisi> do
aksi





Teks algoritma dan flowchart di atas menunjukkan bahwa ada pengecekan kondisi dulu sebelum aksi berikutnya dilakukan. Aksi di bawah kondisi dikerjakan jika kondisinya atau lebih tepatnya nilai boolean kondisi bernilai benar. Jika kondisi bernilai salah, maka proses akan ‘melompat’ atau mengerjakan aksi yang berada di luar loop.
Studi Kasus
Buat algoritma menampilkan deret 2, 4, 6, …, N. N adalah masukan berupa bilangan genap.
Deskripsi masalah
Input : -
Output : 2 4 6
Algoritma 2 10
Algoritma deret

Deskripsi
read(N)
x  2
while x <= N do
write(x)
x  x + 2  
Tabel Penyimpanan Data Algoritma 2 10
Perintah x<=N N x Output
Read(N) 8
x2 2
x=2  : Write(x)
          xx+2

x=4  : Write(x)
         xx+2

x=6  : Write(x)
          xx+2

x=8  : Write(x)
          xx+2

x=10 : Write(x)
           xx+2 true


true


true


true


false

4


6


8


10 2


4


6


8
Mula-mula inputkan nilai N dalam hal ini adalah 8. Kemudian x diberi nilai 2 (proses inisialisasi). Setelah itu x dibandingkan dengan N. Jika aksi (x<=N) bernilai benar maka x ditampilkan. Lalu x ditambah 2 dan menghasilkan x baru. 
Setelah itu arus data kembali ke atas untuk menguji apakah aksi x<=N bernilai benar. Jika iya, maka proses yang sama dengan sebelumnya dilakukan kembali. 
Demikian seterusnya hingga kondisi x<=N bernilai salah.
Jika N adalah 10 maka output algoritma deret : 2 4 6 8
Pertanyaan
Untuk N=10
- Bagaimana output algoritma jika x tidak diinisialisasi (perintah x  2 dihilangkan)?
Jawab : keluaran program menjadi 0  2  4  6  8
- Bagaimana output jika kondisi pengulangan diubah menjadi  while x > 10 ?
Jawab : Tidak ada output yang dihasilkan, karena kondisi sejak awal sudah tidak terpenuhi, sehingga aksi dalam loop while tidak ada yang dikerjakan
- Bagaimana output algoritma  jika aksi (xx+2) dihilangkan.?
Jawab : aksi (xx+2) memastikan bahwa kondisi pada suatu saat akan bernilai salah, sehingga pengulangan berhenti. Jika aksi ini dihilangkan, maka kondisi akan selalu bernilai benar, sehingga pengulangan tidak akan pernah berhenti.
- Bagaimana output algoritma jika aksi (xx+2) dan (write(x)) saling bertukar tempat (urutannya ditukar)?
Jawab : keluaran algoritma menjadi : 4   6   8   10
- Bagaimana output algoritma jika aksi (xx+2) diganti dengan (xx*2)?
Jawab : keluaran algoritma menjadi : 2   4   8


Flowchart Algoritma 2 10
Pengulangan Repeat-Until

Secara umum algoritma repeat-until adalah
repeat 
aksi
until <kondisi>

sedangkan bentuk flowchartnya      



Algoritma while-do dengan repeat-until sebenarnya hampir sama, perbedaannya hanya terletak pada penempatan kondisinya. Pada while-do pengecekan kondisi diletakkan di awal loop, sedangkan pada repeat-until pengecekan kondisi dilakukan di akhir loop. Itu sebabnya pada algoritma while-do aksi bisa jadi tidak dilakukan sama sekali jika sejak awal kondisinya sudah bernilai salah. Sedangkan pada pada repeat-until aksi sekurang-kurangnya dilakukan sebanyak satu kali. (Perhatikan flowchart). 
Studi Kasus
Pada Algoritma 2 10 kita telah mendemonstrasikan cara menampilkan deret 2, 4, 6, …, N. N adalah masukan berupa bilangan genap menggunakan pengulangan while-do. Berikut ini kita akan menggunakan algoritma repeat until untuk menyelesaikan persoalan tersebut.
Deskripsi masalah
Input : banyak deret (N)
Output : 2 4 6

Algoritma deret

Deskripsi
read(N)
x  2
repeat
write(x)
x  x + 2
until x>N



Perbandingan antara Algoritma For-Do, While-Do, dan Repeat-Until
Dari ketiga algoritma pengulangan yang sudah dibahas, for-do adalah jenis pengulangan yang sudah jelas banyaknya pengulangan. Itu sebabnya pengulangan for-do cocok digunakan untuk kasus dimana jumlah pengulangannya sudah jelas. Misalnya, kita ingin membuat algoritma menampilkan 10 suku pertama yang positif dari sebuah deret hitung dengan beda merupakan masukan. Jika deret hitung yang diinginkan memiliki beda sama dengan tiga, maka keluaran yang diharapkan adalah
3 6 9 12 15 18 21 24 27 30
Algoritma penyelesaian masalah ini adalah sebagai berikut.

Algoritma 2 11
Algoritma DeretHitung1

Deskripsi
Read(Beda)
Suku  0
For i  1 to 10 do
Suku  Suku + Beda
Write(Suku)
 
Berbeda dengan pengulangan for-do, tidak ada jaminan berhenti pada pengulangan while-do dan repeat-until kecuali dibuat suatu kondisi yang membuat algoritma tersebut berhenti pada suatu saat. Oleh karena itu di dalam pengulangan repeat dan while harus ada kondisi yang membatasi sampai kapan pengulangan tersebut berlangsung. Itu sebabnya pengulangan while dan repeat lebih cocok digunakan untuk kasus pengulangan yang belum jelas banyaknya pengulangan yang diinginkan, namun diketahui kondisi berhentinya.
Contoh.
x  0
while x < 20 do
xx+2
write(‘Halo’)
Perhatikan pengulangan while di atas. Banyaknya pengulangan tidak eksplisit dinyatakan oleh perintah while, tetapi kondisi berhentinya jelas, yaitu bila x>=20 (atau dengan kata lain terus melakukan pengulangan selama x<20). Keadaan yang sama juga bisa kita temukan pada pengulangan repeat until berikut :
x  0
repeat
xx+2
write(‘Halo’)
until x>=20
Pemrogram perlu berhati-hati menggunakan pengulangan while dan repeat karena ada kalanya kondisi berhentinya tidak akan pernah dicapai.
Lihat contoh program berikut
x  0
repeat
write(‘Halo’)
x = x + 3
until x = 10
Pengulangan ini tidak akan pernah berhenti karena nilai x tidak akan pernah memenuhi kondisi until x = 10. 
Demikian juga program berikut ini
x  0
while x < 20 do
write(‘Halo’)
tidak pernah berhenti karena kondisi while x < 20 selalu terpenuhi, sehingga pengulangan tidak akan berhenti.
Oleh karena itu, pemrogram harus lebih jeli dalam menggunakan pengulangan while-do atau repeat until untuk menghindari pengulangan tanpa batas.

Contoh lain. 
Misalkan kita ingin menampilkan suatu deret hitung dengan beda tertentu (input) yang deret tersebut berhenti sebelum jumlah deret tersebut mencapai suatu nilai batas. Suku pertama dari deret sama dengan beda. Beda dan batas merupakan masukan.  
Di sini kita tidak bisa memastikan berapa kali pengulangan (disebut juga iterasi) yang harus dilakukan. Karena input yang berbeda membutuhkan jumlah pengulangan yang berbeda pula. Misalnya, jika kita ingin menampilkan deret positif dengan beda 3 dan berhenti sebelum jumlah deret tersebut mencapai 50 maka deret dimaksud adalah
3 6 9 12 15
Jumlah deret di atas adalah 45, belum mencapai batas 50. Dalam hal ini pengulangan while-do merupakan pilihan yang lebih memudahkan.
Algoritma 2 12
Algoritma DeretHitung2

Deklarasi
Beda, Suku, Batas, Jum : integer

Deskripsi
Read(Beda, Batas)
Jum  0
Suku  0
While Jum < Batas
Suku  Suku + Beda
Jum  Jum+Suku
Write(Suku)
Lain halnya jika kondisi berhenti yang diinginkan adalah setelah jumlah deret tersebut melewati suatu nilai batas. Dengan input beda = 3 dan batas = 50 maka deret yang dimaksud adalah 
3 6 9 12 15 18
Dalam hal ini pengulangan repeat-until lebih memudahkan.
Algoritma 2 13
Algoritma DeretHitung3

Deklarasi
Beda, Suku, Jum, Batas : integer

Deskripsi
Read(Beda, Batas)
Jum  0
Suku  0
Repeat 
Suku  Suku + Beda
Jum  Jum+Suku
    Write(Suku)
Until Jum > Batas
Contoh lain. Dalam kasus tertentu bisa jadi semua cara ini bisa digunakan. Misalnya, algoritma menghitung perpangkatan XN, dengan X merupakan bilangan real dan N merupakan bilangan bulat positif. X dan N merupakan input. Kasus ini dapat diselesaikan dengan pengulangan for.
Algoritma 2 14
Algoritma XPangkatNFor

Deklarasi
N,i : integer 
X, Pangkat : real

Deskripsi
Read(X, N)
Pangkat  1
For i  1 to N do
Pangkat  Pangkat * X
Write (Pangkat)
Atau juga pengulangan while
Algoritma 2 15
Algoritma XPangkatNWhile

Deklarasi
N,i : integer 
X, Pangkat : real

Deskripsi
Read(X, N)
Pangkat  1
i  0
While i <= N
i  i + 1
Pangkat  Pangkat * X
Write (Pangkat)
Dan juga pengulangan repeat.
Algoritma 2 16
Algoritma XPangkatNRepeat

Deklarasi
N,i : integer 
X, Pangkat : real

Deskripsi
Read(X, N)
Pangkat  1
i  0
Repeat
i  i + 1
Pangkat  Pangkat * X
Until i > N
Jadi, sebenarnya agak sulit menentukan batasan yang tegas mengenai kasus mana yang cocok dikerjakan dengan for-do, atau while-do atau repeat-until. Pengalamanlah dan kebiasaan serta selera pemrogram yang lebih pandai  menjawab hal ini. 
Soal Latihan 
Soal Runtunan
1. Diketahui algoritma berikut ini
Algoritma UtakAtik1

Deskripsi
Read(A)
B  0.5 * A + 15
C  A * A -3
D  B + C
Write(B,C,D)
Tentukan keluaran algoritma jika 
a. A = 4 b.  A = 6 c. A = -3


2. Terjemahkan algoritma soal no 1 ke dalam bentuk flowchart
3. Diketahui algoritma berikut ini
Algoritma UtakAtik1

Deskripsi
Read(A,B)
C  0.5 * (A + B)
D  A * C - 3
E  C + D
Write(C,D,E)
Tentukan keluaran algoritma jika masukan A dan B masing-masing :
a. 5 dan 4 b. -2 dan 9 c. 3 dan 6
4. Terjemahkan algoritma no 3 ke dalam bentuk flowchart.
5. Buatlah algoritma teks dan flowchart yang menampilkan tulisan “Halo” sebanyak tiga kali
6. Setiap pegawai dalam perusahaan X mendapat penghasilan dari gaji pokok dan tunjangan. Besar tunjangan adalah 20% dari gaji pokok. Selain itu penghasilan tersebut terkena pajak yang besarnya 5% dari penghasilan. Buatlah algoritma menghitung penghasilan bersih pegawai dengan masukan gaji pokok.
7. Buatlah algoritma untuk menghitung luas segitiga sama sisi yang panjang sisi terpanjangnya sama dengan diameter sebuah lingkaran. Input : jari-jari lingkaran yang dimaksud.
8. Andi 8 tahun lebih tua dari Ali. Ali lebih muda 5 tahun dari Ahmad. Usia Amir adalah setengah dari jumlah usia Andi dan Ahmad. Buatlah algoritma menghitung usia Andi, Ali dan Amir, dengan masukan usia Ahmad.
9. Berkaitan dengan soal no, 8. Tuliskan keluaran algoritma tersebut jika masukannya : 
a. 45 b. 28 c. 36 
10. Buatlah algoritma teks untuk menghitung besar hambatan pengganti untuk tiga buah hambatan yang dipasang secara paralel. Input : ketiga hambatan R1, R2, R3.
11. Buatlah algoritma untuk mengkonversi waktu dari satuan jam, menit, dan detik ke dalam satuan detik.
12. Berkebalikan dengan soal no 11, buatlah algoritma yang mengkonversi waktu dari satuan detik ke dalam satuan jam, menit, dan detik.  
13. PT Telkom memberlakukan ketentuan tarif percakapan lokal sebesar Rp 50/menit sedangkan interlokal Rp 100/menit. Selain itu pelanggan juga dikenai biaya abonemen sebesar Rp 500 dan pajak sebesar 10% dari total tagihan. Buatlah algoritma menghitung biaya rekening telpon dengan masukan lama percakapan lokal dan interlokal (dalam menit).

Soal Percabangan
1. Tentukan keluaran dari algoritma teks berikut ini
Algoritma UtakAtik3

Deskripsi
Read(A,B)
      If A>B then 
    C  A*B
else
  C  A+B
D  C*C
Write(C,D)
Diketahui masukan A dan B masing-masing adalah :
a. 4 dan 6 b. 3 dan 5 c. 9 dan 6

2. Tentukan keluaran dari algoritma teks berikut ini
Algoritma UtakAtik3

Deskripsi
Read(A,B)
if A+B < 10 then 
    C  A-B
else
  C  A+B
D  2*C+B
Write(C,D)
Diketahui masukan A dan B masing-masing adalah :
b. 4 dan 6 b. 3 dan 5 c. 9 dan 6

3. Buatlah algoritma teks dan flowchart untuk menyelesaikan masalah berikut ini
a. Menginput sebuah bilangan kemudian menentukan apakah sebuah data masukan merupakan bilangan kelipatan tiga atau bukan.
b. Menginput dua bilangan kemudian menentukan manakah yang merupakan bilangan terbesar.
c. Menginput dua buah bilangan kemudian menentukan apakah bilangan yang satu merupakan kelipatan dari bilangan yang lainnya atau tidak. 
d. Menginput sebuah bilangan dan menentukan apakah ia bilangan positif atau bukan

4. Buatlah algoritma teks dan flowchart yang menentukan apakah sebuah persamaan kuadrat memiliki akar-akar yang real atau tidak.

5. Sebuah warnet memberlakukan ketentuan tarif sebagai berikut. Untuk penyewaan selama 3 jam pertama dikenai tarif Rp 5000 per jam. Sedangkan untuk jam berikutnya dikenai biaya Rp 4000 per jam. Buatlah algoritma yang menghitung biaya penyewaan warnet dengan masukan lama pemakaian.


6. PLN memberikan ketentuan tarif per kwh berdasarkan golongan konsumen sebagai berikut
Gol A : tarif per kwh = Rp 20, abonemen = 5000
Gol B : tarif per kwh = Rp 30, abonemen = 7500

Buatlah algoritma teks standar untuk menentukan total tagihan yang dibayar oleh pelanggan PLN. Input algoritma : jumlah pemakaian (kwh) dan golongan. Output : total tagihan.
7. Sebuah provider internet memberikan penawaran tarif langganan sebagai berikut. Untuk pemakaian hingga 50 jam pertama dikenai biaya Rp 5000. Untuk pemakaian lebih dari itu, setiap jam kelebihannya dikenai biaya tambahan Rp 5. Tuliskan algoritma menghitung biaya internet itu dengan masukan lama pemakaian.

8. Seorang salesman sebuah produk mendapat gaji dari perusahaannya terdiri dari gaji pokok dan bonus. Besar gaji pokok adalah 5000. Jika produk yang terjual lebih dari 100, salesman tersebut mendapat bonus sebesar 20% omset penjualan, sedangkan jika kurang mendapat 10% dari omset. Buatlah program menghitung gaji salesmen dengan masukan banyaknya produk yang terjual dan harga satuan produk.


Soal Pengulangan
1. Perhatikan algoritma berikut ini
Algoritma UtakAtik5

Deskripsi
Read(N)
      y0
z0 
For x  1 to N do 
    y  y +
z  z + y
  write(x,y,z)
a. Tuliskan keluaran algoritma untuk N=5
b. Tuliskan algoritma di atas menggunakan pengulangan while dan repeat

2. Perhatikan algoritma berikut ini

Algoritma UtakAtik6

Deskripsi
Read(N,k)
      i0
j0 
while i <= N do 
    i  i + 1
j  j + k
  write(j)
a. Tentukan keluaran algoritma untuk (N,k) =(5,2)
b. Nyatakan algoritma tersebut dalam pengulangan repeat dan while

3. Perhatikan algoritma berikut ini

Algoritma UtakAtik6

Deskripsi
Read(M,N)
      repeat 
  if i<5 then
  jj+M
    else
  jj+N
  i  i + 1
  write(j)
until i>8
a. Tentukan keluaran algoritma jika M,N = 2,1
b. Nyatakan algoritma tersebut dalam pengulangan for dan while

4. Buatlah algoritma dan flowchart persoalan berikut. Gunakan pengulangan for, while, dan repeat.
a. Menampilkan deret bilangan kelipatan tiga positif hingga lima suku pertama
b. Menghitung jumlah deret pada soal (a)

5. Buatlah algoritma dan flowchart yang menampilkan deret kelipatan X hingga N suku. X dan N masukan.

6. Buatlah algoritma yang menampilkan deret fibonaci (1  1  2  3  5  8  …) hingga N suku. Input N.



Untuk Mendownload Materi Dalam Format .doc Klik Disini

0 comment:

Posting Komentar