5 PEMILIHAN Menganalisis kasus dari suatu masalah artinya menentukan kondisi Boolean (bernilai true atau false) dan menentukan aksi yang dilakukan jika kondisi tersebut berlaku. Kondisi Boolean adalah suatu ekspresi relasional yang bernilai true atau false bergantung pada nilai masing-masing operand yang terlihat di dalamnya. Atau Analisis kasus, yang melahirkan instruksi kondisional, adalah elemen primitive pembangun algoritma, yaitu memungkinkan kita untuk membuat teks yang sama namun menghasilkan eksekusi yang berbeda-beda. Mendefinisikan analisis kasus adalah mendefinisikan : 1. Kondisi, yang berupa suatu ekspresi yang menghasilkan true atau false 2. Aksi yang akan dilaksanakan jika kondisi yang dipasangkan dengan aksi ybs. dipenuhi Konstruksi dari suatu analisis kasus dapat dimulai dari menentukan semua kondisi yang mungkin (dengan melakukan partisi domain), atau dimulai dari menentukan variasi aksi. Tidak ada rumus yang baku tentang bagaimana memulai menuliskan analisis kasus. Pada contoh-contoh yang diberikan, ada yang berangkat dari kondisi, dan ada yang dimulai dari menentukan aksi. Ada 2 struktur dalam analisis kasus/pemilihan, yakni satu kasus yang mengakibatkan aksi, atau dua kasus komplementer dan analisis kasus yang umum (banyak kasus). 5.1. Satu Kasus Dalam bahasa Indonesia, if berarti jika dan then berarti maka. Kondisi adalah persyaratan yang dapat bernilai benar atau salah. Aksi hanya akan dilaksanakan jika kondisi bernilai benar. Sebaliknya, jika kondisi bernilai salah, maka aksi tidak akan dilaksankan. Pernyataan ini dapat ditulis dalam struktur umum : If (Kondisi) Then Aksi Endif Jika kondisi benar, maka aksi dilakukan. Jika kondisi tidak benar, maka tidak terjadi apa-apa (efek neto “kosong”). Kasus 1. Dibaca sebuah bilangan bulat dari keyboard. Tuliskan algoritma untuk mencetak pesan “bilangan genap” jika bilangan tersebut adalah genap. Bilangan genap adalah bilangan yang habis dibagi 2 (sisa = 0). Algoritma BilanganGenap {Mencetak pesan “bilangan genap” jika sebuah bilangan yang dibaca dari keyboard adalah bilangan genap} Deklarasi : Bilangan : Integer 39 Deskripsi : Read (Bilangan) If Bilangan mod 2=0 then Write (‘Bilangan Genap’) EndIf Translasi ke Bahasa Java Berikut ini adalah translasi dari algoritma pada kasus diatas kedalam bahasa pemrograman Java. public class genapganjil{ public static void main (String[] args) { double bilangan; bilangan = 4; if ((bilangan % 2) == 0) { // modulo dalam java adalah % System.out.println("Bilangan Genap"); } } } 5.2. Dua Kasus Komplementer Kondisi if-then hanya memberikan satu pilihan aksi bila kondisi dipenuhi atau bernilai benar, dan tidak memberi pilihan aksi lain jika kondisi bernilai salah. Berikut adalah kondisi if then else, yang memberi pilihan aksi lain jika kondisi bernilai salah. If Kondisi then Aksi 1 Else {not Kondisi} Aksi 2 EndIf Else artinya kalau tidak. Jika kondisi bernilai benar, maka aksi 1 akan dikerjakan, tetapi kalau tidak, aksi 2 yang akan dilaksanakan. Hati-hati dalam memakai “else” yang berarti kondisi implisit yang merupakan negasi dari kondisi. Penulisan kondisi “else” secara eksplisit sangat disarankan Kasus 2. Dibaca dua buah bilangan bulat dari peranti masukan. Tentukan dari kedua bilangan itu bilangan yang terbesar. Mislkan kedua bilangan tersebut adalah A dan B Jika A > B, bilangan terbesar adalah A Jika B ≥ A, bilangan terbesar adalah B Algoritma Maks1 {Menentukan bilangan terbesar dari dua buah bilangan bulat} Deklarasi : A, B : Integer Deskripsi : Read (A,B) If A > B then Write (‘Bilangan terbesar : ‘,A) Else 40 Write (‘Bilangan terbesar : ‘,B) EndIf Translasi ke Bahasa Java Berikut ini adalah translasi dari algoritma pada kasus diatas kedalam bahasa pemrograman Java. import java.util.Scanner; public class Maks1{ public static void main (String[] args) { System.out.print ("masukkan Nilai A : "); //Input Nilai A double a = new Scanner(System.in).nextDouble(); System.out.print ("masukkan Nilai B : "); //Input Nilai B double b = new Scanner(System.in).nextDouble(); if (a > b) { System.out.println( "Bilangan terbesar = " + a); } else { System.out.println( "Bilangan terbesar = " + b); } } } Kasus 3. Karyawan honorer di PT “ABC” digaji berdasarkan jumlah jam kerjanya selama satu minggu. Upah per jam adalah Rp. 7.000,- . Jika jam kerja lebih besar dari 48 jam, maka sisanya dianggap sebagai jam lembur. Upah lembur adalah Rp. 10.000,-. Dibaca jumlah jam kerja seorang karyawan, tentukan upah mingguannya. Penyelesaian : Misalkan jumlah jam kerja (JJK) Jika JJK ≤ 48 jam, Upah = JJK * 7.000 Jika JJK > 48 jam, Upah = (48 * 7.000) + (JJK-48) * 10.000 Berikut algoritma yang bisa dibuat dari kasus diatas : Algoritma UpahKaryawan {Menentukan upah mingguan seorang karyawan. Masukkan yang dibacah dari keyboard adalah nama karyawan dan jumlah jam kerja. Sedangkan keluarannya adalah nama karyawan dan upah} Deklarasi : NamaKaryawan : String JJK : Integer Upah : Real Deskripsi : Read (NamaKaryawan, JJK) If JJK ≤ 48 then Upah ← JJK * 48 Else Upah ← (48 * 7.000) + (JJK-48) * 10.000 EndIf Write (NamaKaryawan, Upah) 41 5.3. Banyak Kasus Apabila pilihan aksi yang dilakukan lebih dari dua buah, maka struktur pemilihan menjadi lebih rumit, dinamakan pemilihan bersarang. Misalkan dibutuhkan pemilihan kondisi percabangan untuk banyak syarat, dan hanya ingin agar kasus hanya memilih salah satu maka dapat ditulis seperti contoh berikut : If Kondisi_percabangan_1 then { proses jika kondisi percabangan 1 terpenuhi } {end if} Else if kondisi_percabangan_2 then {proses jika kondisi percabangan 1 tidak terpenuhi dan kondisi Percabangan 2 terpenuhi } {end if} Else if kondisi_percabangan_3 then {proses jika kondisi percabangan 1 dan 2 tidak terpenuhi dan Kondisi percabangan 3 terpenuhi } {end if} Else { proses jika kondisi percabangan 1, 2, 3 Tidak terpenuhi } {end else} Jika kita ingin melakukan pemeriksaan secara terurut untuk banyak syarat dimana semua syarat harus dilalui oleh semua yang memenuhi syarat atau tidak maka kita dapat membuat percabangan sebagai berikut: If Kondisi_percabangan_1 then {proses jika kondisi percabangan 1 terpenuhi } {end if} Else if kondisi_percabangan_2 then {proses jika kondisi percabangan 1 terpenuhi atau tidak terpenuhi dan kondisi percabangan 2 terpenuhi } {end if} Else if kondisi_percabangan_3 then {proses jika kondisi percabangan 1 dan 2 terpenuhi atau tidak Terpenuhi dan kondisi percabangan 3 terpenuhi {end if} Kasus 4. Misalkan karyawan PT. “ABC” dikelompokkan berdasarkan golongannya. Upah per jam tiap karyawan bergantung pada golongannya. Ketentuaannya adalah sebagai berikut : Golongan A B C D Upah per Jam Rp. 4000 Rp. 5000 Rp. 6000 Rp. 7000 42 Jumlah jam kerja yang normal selama seminggu adalah 48 jam. Kelebihan jam kerja dianggap lembuar dengan upah lembur adalah Rp. 3000/jam untuk semua gologan karyawan. Buat algoritma untuk masalah diatas !! Algoritma UpahKaryawan {Menghitung upah mingguan karyawan. Masukan yang dibaca dari keyboard adalah nama karyawan, golongan, dan jumlah jam kerja. Nama karyawan dan upahnya dicetak ke peranti keluaran} Deklarasi : Const UL = 3000 {Upah Lembur per jam} Nama : String gol : Char {‘A’,’B’,’c’,’D’,’E’} UJ, Upah : Real {UJ adalah Upah per jam} Deskripsi : Read (Nama, gol, JJK) If gol ← “A” then UJ ← 4000 Else If gol ← “B” then UJ ← 5000 Else If gol ← “C” then UJ ← 6000 Else If gol ← “D” then UJ ← 7000 Else Write (“Golongan salah !”) EndIf EndIf EndIF EndIf If JJK ≤ 48 then Upah ← JJK * UJ Else Upah ← (48 * UJ) + (JJK-48) * UL EndIf Write (Nama, Upah) Translasi ke Bahasa Java Berikut ini adalah translasi dari algoritma pada kasus diatas kedalam bahasa pemrograman Java. import java.util.Scanner; import java.io.*; public class upah{ public static void main (String[] args) throws IOException{ double Upah1; double UJ = 0; double UL = 3000; InputStreamReader reader = new InputStreamReader(System.in); 43 BufferedReader input = new BufferedReader(reader); System.out.print("Masukan Nama Karyawan = "); //Input Nama Karyawan String NamaKaryawan = input.readLine(); System.out.print("Masukan Golongan = "); //Input golongan String Gol = input.readLine(); System.out.print ("Masukkan Jam Kerja : "); //Input Gaji double JJK = new Scanner(System.in).nextDouble(); if (Gol.equals("A")){//Perbandingan String pada java menggunakan "equals" UJ = 4000; } else { if (Gol.equals("B")) { UJ = 5000; } else { if (Gol.equals("C")){ UJ = 6000; } else { if (Gol.equals("D")){ UJ = 7000; } else { System.out.println("Golongan Salah");} } } } if (JJK <= 48) { Upah1 = JJK * UJ; } else { Upah1 = (48*UJ) + (JJK - 48)*UL; } System.out.println("Nama karyawan : " + NamaKaryawan); System.out.println("Upah Rp : " + Upah1); } } 5.4. Depend On (Dua Kondisi atau Lebih) Percabangan depend on biasa digunakan untuk dua kondisi atau lebih bergantung pada nilai sebuah variabel, syarat kondisi pada percabangan depend on biasanya hanya sebuah nilai. Deklarasi percabangan depend on adalah sebagai berikut: depend on (nama-nama) <kondisi-1> : <aksi-1> <kondisi-2 > :<aksi-2> <kondisi-3> : <aksi-3> kondisi-N : aksi-N {end depend on} 44 Tiap kondisi akan diperiksa nilai kebenarannya mulai dari kondisi yang pertama sampai ditemukan kondisi yang bernilai benar. Jika kondisi k benar, maka aksi k dilaksanakan sedangkan aksi yang lainnya akan diabaikan, dengan syarat : 1. Kondisi-1,kondisi-2,kondisi-3 ... .,kondisi-N domain harganya [true,false] 2. Kondisi-1,kondisi-2,kondisi-3 ... .,kondisi-N adalah ekspresi lojik/boolean yang mengandung nama-nama sebagai operan. Struktur depend on berfungsi untuk menyederhanakan bentuk if then else yang bertingkat-tingkat. Stuktur depend on diatas ekivalen dengan struktur if then else berikut ini : If <Kondisi1> then Aksi1 Else If <kondisi2> then Aksi2 Else If <kondisi3> then Aksi3 Else If <kondisiN> then AksiN Else AksiX EndIf EndIf EndIf EndIf Kasus 5. pada kasus 4 diatas dapat diubah dalam struktur case berikut : Algoritma UpahKaryawan {Menghitung upah mingguan karyawan. Masukan yang dibaca dari keyboard adalah nama karyawan, golongan, dan jumlah jam kerja. Nama karyawan dan upahnya dicetak ke peranti keluaran} Deklarasi : Const UL = 3000 {Upah Lembur per jam} Nama : String gol : Char {‘A’,’B’,’c’,’D’,’E’} UJ, Upah : Real {UJ adalah Upah per jam} Deskripsi : Read (Nama, gol, JJK) Depend on (gol) gol = “A” UJ ← 4000 gol = “B” UJ ← 5000 gol = “C” UJ ← 6000 gol = “D” UJ ← 7000 Else Write (“Golongan salah !”) {End Depend on} If JJK ≤ 48 then Upah ← JJK * UJ 45 Else Upah ← (48 * UJ) + (JJK-48) * UL EndIf Write (Nama, Upah) Kasus 6. Misalkan kita akan menghitung luas, keliling dan diagonal dari empat persegi panjang. Pada setiap pilihan menu, dibaca panjang dan lebar empat persegi panjang, dengan menu pilihan sebagai berikut : 1. 2. 3. 4. Menu Hitung luas Hitung keliling Hitung diagonal Keluar dari program Masukkan pilihan anda : Algoritma PersegiPanjang {Menampilkan menu perhitungan empat persegi panjang, memilih menu dan melakukan proses perhitungan} Deklarasi : panjang, lebar : real luas, keliling, diagonal : real NomorMenu : integer Deskripsi : Write (‘ Menu’) Write (‘1. Hitung luas’) Write (‘2. Hitung keliling’) Write (‘3. Hitung diagonal’) Write (‘4. Keluar dari program’) Write (‘Masukkan pilihan anda :’ ) Read (NomorMenu) Depend on (NomorMenu) NomorMenu = 1 : Read(panjang, lebar) luas ← panjang * lebar Write (luas) NomorMenu = 2 : Read(panjang, lebar) keliling ← 2 * (panjang+lebar) Write (keliling) NomorMenu = 3 : Read(panjang, lebar) diagonal ← (2*panjang) + (2*lebar) Write (diagonal) NomorMenu = 4 : Exit Write (‘Keluar dari program’) {End Depend on} 46 Translasi ke Bahasa Java Berikut ini adalah translasi dari algoritma pada kasus diatas kedalam bahasa pemrograman Java import java.util.Scanner; public class hitungmenu{ public static void main (String[] args) { int luas, keliling, diagonal; System.out.println (" Menu "); System.out.println (" 1. Hitung Luas "); System.out.println (" 2. Hitung Keliling "); System.out.println (" 3. Hitung Diagonal "); System.out.println (" 4. Keluar program "); System.out.print (" Masukan Pilihan Anda : "); int nomor = new Scanner(System.in).nextInt(); switch(nomor){ case 1 : System.out.print("Panjang : "); int panjang = new Scanner(System.in).nextInt(); System.out.print("Lebar : "); int lebar = new Scanner(System.in).nextInt(); luas = panjang * lebar; System.out.println("Luas : " + luas); break; case 2 : System.out.print("Panjang : "); int panjang1 = new Scanner(System.in).nextInt(); System.out.print("Lebar : "); int lebar1 = new Scanner(System.in).nextInt(); keliling = 2*(panjang1 * lebar1); System.out.println("Keliling : " + keliling); break; case 3 : System.out.print("Panjang : "); int panjang2 = new Scanner(System.in).nextInt(); System.out.print("Lebar : "); int lebar2 = new Scanner(System.in).nextInt(); diagonal = (2*panjang2)+ (2*lebar2); System.out.println("Diagonal : " + diagonal); break; case 4 : System.out.println("Keluar program"); break; default : System.out.print("Pilihan Salah"); break; } } } Kasus 7. Pegawai pada suatu universitas swasta terdiri dari karyawan administrasi dan dosen. Dosen terdiri dari dosen tetap dan dosen tidak tetap. Masing-masing memiliki aturan penggajian yang berbeda. 1. Komponen dan aturan penggajian karyawan administrasi 47 a. Gaji Pokok Golongan IIA IIB IIC IID IIIA IIIB IIIC IIID GajiPokok 600.000 650.000 700.000 750.000 800.000 850.000 900.000 1.000.000 b. Tunjangan Jabatan Jabatan Ka.Biro Ka. Keuangan Kabag. Personalia Kabag. KRS Kabag. KHS Staff Tunj_Jabatan 800.000 600.000 500.000 400.000 300.000 200.000 2. Komponen dan aturan penggajian dosen tetap a. Gaji Pokok Golongan IIIA IIIB IIIC IIID IVA IVB IVC IVD GajiPokok 800.000 850.000 900.000 1.000.000 1.100.000 1.200.000 1.300.000 1.400.000 b. Tunjangan Jabatan Jabatan Dekan Kapogdi Koordinator Lab. Kepala Lab. Tunj_Jabatan 1.000.000 800.000 700.000 500.000 c. Tunjangan Fungsional Jenjang Profesor Lektor Kepala Lektor Asisten Ahli Tnj_fungsional 2.000.000 1.300.000 500.000 270.000 d. Honor Mengajar Pendidikan S3 S2 Honorperjam 35.000 20.000 48 S1 10.000 Untuk dosen tetap jumlah jam mengajar dikurang 16 sks. Sedangkan dosen tidak tetap hanya mendapat gaji honor mengajar sesuai dengan pendidikan dan jumlah jam mengajar. Pajak diperoleh dari rumus : pajak = 5% * gaji Algoritma Gaji {Menentukan gaji karyawan administrasi, dosen tetap dan dosen tidak tetap} DEKLARASI : NmPengawai, status : string Gol, jabatan, jenjang, pendidikan : string GajiPokok, Tunj_Jabatan, Tunj_fungsi, Honorperjam : real Honor, Pajak, GajiBersih, GajiKotor : real DESKRIPSI : Read (NmPegawai) Read (status) If status = ‘karyawan’ then Read(gol,jabatan) if gol =’IIA’ then GajiPokok ← 600.000 Endif if gol =’IIB’ then GajiPokok ← 650.000 Endif if gol =’IIC’ then GajiPokok ← 700.000 Endif if gol =’IIDA’ then GajiPokok ← 750.000 Endif if gol =’IIIA’ then GajiPokok ← 800.000 Endif if gol =’IIIB’ then GajiPokok ← 850.000 Endif if gol =’IIIC’ then GajiPokok ← 900.000 Endif if gol =’IIID’ then GajiPokok ← 1.000.000 Endif if jabatan =’Ka.Biro’ then Tunj_Jabatan←800.000 Endif if jabatan =’Ka.Keuangan’ then Tunj_Jabatan←600.000 Endif if jabatan =’Ka.Personalia’ then Tunj_Jabatan←500.000 Endif 49 if jabatan =’Kabag.KRS’then Tunj_Jabatan←400.000 Endif if jabatan =’Ka.KHS’ then Tunj_Jabatan←300.000 Endif if jabatan =’Staff’ then Tunj_Jabatan←200.000 Endif GajiKotor← GajiPokok + Tunj_Jabatan Else If status = ‘DosenTetap’ then Read(gol) if gol =’IIIA’ then GajiPokok ← 800.000 Endif if gol =’IIIB’ then GajiPokok ← 850.000 Endif if gol =’IIIC’ then GajiPokok ← 900.000 Endif if gol =’IIID’ then GajiPokok ← 1.000.000 Endif if gol =’IVA’ then GajiPokok ← 1.100.000 Endif if gol =’IVB’ then GajiPokok ← 1.200.000 Endif if gol =’IVC’ then GajiPokok ← 1.300.000 Endif if gol =’IVD’ then GajiPokok ←1.400.000 Endif Read(Jabatan) if jabatan =’Dekan’ then Tunj_Jabatan←1.000.000 Endif if jabatan =’Kaporgdi’ then Tunj_Jabatan←800.000 Endif if jabatan =’Koordinator Lab’ then Tunj_Jabatan←800.000 Endif if jabatan =’Kepala Lab’ then Tunj_Jabatan←500.000 Endif Read(jenjang) if jenjang←’profesor’ then Tunj_fungsi←2.000.000 Endif 50 if jenjang←’Lektor Kepala’ then Tunj_fungsi←1.300.000 Endif if jenjang←’Lektor’ then Tunj_fungsi←500.000 Endif if jenjang←’profesor’ then Tunj_fungsi←270.000 Endif Read(Pendidikan) if Pendidikan←’S3’ then Honorperjam←35.000 Endif if Pendidikan←’S2’ then Honorperjam←20.000 Endif if Pendidikan←’S1’ then Honorperjam←10.000 Endif Read(JamMengajar) Honor←(JamMengajar-16)*Honorperjam GajiKotor← GajiPokok + Tunj_Jabatan + Tunj_fungsi + Honor Else If status = ‘DosenTdkTetap’ then Read(Pendidikan,JamMengajar) if Pendidikan←’S3’ then Honorperjam←35.000 Endif if Pendidikan←’S2’ then Honorperjam←20.000 Endif if Pendidikan←’S1’ then Honorperjam←10.000 Endif Honor←JamMengajar*Honorperjam GajiKotor←Honor EndIf EndIf EndIf Pajak ← 0.05 * GajiKotor GajiBersih ← GajiKotor - Pajak Write(NmPegawai,GajiBersih) Latihan 51 1. Buat algoritma yang menerima tiga buah angka masukan dan menampilkan nilai yang paling besar dari ketiga masukan! 2. Buatlah algoritma yang menerima masukan berupa tiga buah sisi segitiga, periksa apakah segitiga masukan merupakan segitiga siku-siku atau bukan! 3. Buat algoritma yang menerima masukan empat buah sisi, dimana jika semua sisi sama maka tampilkan “Termasuk Kubus”, jika ada sisi yang tidak sama maka tampilkan “Bukan Kubus”! 4. Buatlah algoritma yang menerima menu yang dapat berisi 1, 2, dan 3 dan dua buah masukan bilangan, jika menu sama dengan 1 maka akan menampilkan hasil dari bilangan 1 ditambah dengan bilangan 2, jika menu sama dengan 2 maka akan menampilkan hasil dari bilangan 1 dikali dengan bilangan 2, jika menu sama dengan 3 maka akan menampilkan hasil dari bilangan 1 dikurangi dengan bilangan 2! 5. Buatlah algoritma yang menerima sebuah masukan berupa jam lembur, jika jam lembur kurang dari 12 jam maka akan menampilkan gaji lembur sebesar Rp. 100.000, dari jam kerja normal, jika jam lembur sama dengan 12 jam maka akan menampilkan gaji lembur sebesar Rp. 200.000 dari jam kerja normal, jika jam lembur lebih dari 12 jam maka akan menampilkan gaji lebur sebesar Rp. 300.000 dari jam kerja normal. Jumlah jam kerja normal = 8 jam /hari sebesar Rp. 80.000,6. Tuliskanlah algoritma untuk menentukan bonus pegawai, berdasarkan ketentuan yang diberikan oleh bagian personalia dan keuangan sebagai berikut : Pegawai perusahaan digolongkan menjadi dua golongan, yaitu staf dan bukan staf. Staf akan mendapatkan bonus sebesar 1 juta rupiah dengan syarat bahwa ia telah bekerja paling tidak 5 tahun dan umurnya sudah mencapai 50 tahun; staf yang bekerja kurang dari 5 tahun berapapun umurnya, hanya mendapat bonus sebesar Rp. 500.000,-. Pegawai non-staf yang telah bekerja lebih dari 5 tahun akan mendapat bonus sebesar Rp. 400.000,- jika berumur lebih dari 50 tahun sedangkan pegawai non staf yang berumur kurang dari 50 tahun hanya akan mendapat bonus Rp. 250.000,-. Pegawai staf yang umurnya kurang dari 50 tahun akan mendapat bonus Rp. 300.000,7. Total nilai mahasiswa ditentukan berdasarkan nilai tugas, quis, mid dan uas. Rumusnya adalah TotalNilai = (15% * Tugas) + (15% * Quis) + (15% * MID) + (40% * UAS) Sedangkan indeks nilai mahasiswa ditentukan berdasarkan ketentuan berikut : TotalNilai Indeks ≥ 80 A 70 – 79.99 B 55 – 69.99 C 40 – 54.99 D < 40 E Buat algoritma yang keluarannya adalah NmMhs dan Indeks ! 8. Pada toko buku ‘abc’ diskon penjualan buku mengikuti tabel berikut : 52 TotalPenjualan Diskon < 100.000 2% 100.000-500.000 5% > 500.000 7% Buat algoritma untuk masalah diatas ! 53