Sabtu, 06 Januari 2018

Bab4 (Pemilihan IF,CASE Bahasa C)

   Program dapat merepresentasikan situasi pemilihan yang sering dihadapi
dalam dunia nyata. Berdasarkan satu atau beberapa kondisi, dapat ditentukan
satu atau sejumlah aksi yang akan dilakukan. Dengan adanya struktur pemilihan,
program dapat berjalan dengan jalur yang berbeda, berdasarkan hasil
pengecekan kondisi yang dipenuhi.

                      1. Memahami struktur pemilihan dalam program
                      2. Mengenal struktur IF dan CASE yang dapat digunakan dalam pemilihan
                      3. Memahami konsep kondisi dan aksi dalam struktur pemilihan
                      4. Menerapkan pemilihan dalam menyelesaikan berbagai kasus

   Dalam kehidupan nyata, seringkali dihadapkan pada beberapa pilihan.
Pada saat menghadapi pilihan, satu atau beberapa kondisi menjadi bahan
pertimbangan dalam memutuskan untuk melakukan aksi tertentu. Contoh:
   Jika cuaca mendung, maka saya membawa payung.
   Pada contoh tersebut, ‘cuaca mendung’ merupakan kondisi yang menjadi
   bahan pertimbangan untuk melakukan aksi ‘saya membawa payung’. Jika
   kondisi ‘cuaca mendung’ terpenuhi (bernilai benar), maka aksi ‘saya
   membawa payung’ dilakukan
   Sebuah program komputer juga dapat mengenali situasi pemilihan.
   Pernyataan dalam contoh di atas dapat dituliskan dalam struktur pemilihan
   sebagai berikut:
               IF cuaca mendung THEN
                  saya membawa payung
               END IF
Untuk selengkapnya penggunaan bentuk pemilihan akan dijelaskan berikut ini.


   Bentuk Umum IF dan Variasinya

Bentuk IF yang juga dikenal dengan istilah IF Statement, memiliki bentuk

umum sebagai berikut :


If kondisi then
Aksi-1
[else
Aksi-2]
End if

Kondisi adalah ekspresi boolean yang bernilai benar atau salah, bisa berupa:
   Sebuah nilai boolean: true atau false
   Sebuah variabel boolean
   Sebuah pembandingan data
   Dua pembandingan data atau lebih yang digabung
Aksi berupa satu statement beberapa statement, dimana tiap statement
  dapat berupa:
    Statement pengisian nilai seperti a ⬅ 5
    Statement input data
    Statement output data
    Statement pemilihan (If Statement atau Case Statement)
    Statement pengulangan (For, Repeat atau While Statement)

[else Aksi-2], tanda [ ] menyatakan opsional (boleh ada/tidak ada),
  dimana kalau tidak ada, berarti setelah Aksi-1 langsung selesai.
Dari bentuk umum yang telah dijelaskan, maka variasi bentuk IF ini banyak
dan tidak berhingga. Di antaranya yang penting dapat disebutkan berikut:
   - if tanpa else (satu pilihan, mengerjakan atau tidak)
   - if dengan else (dua pilihan)
   - if bersarang dimana dalam if ada if lagi, karena Statement dapat berupa
     satu perintah pemilihan. Salah satu bentuk if bersarang adalah if untuk
     memilih salah satu dari banyak pilihan.



Contoh-contoh variasi:
1. Satu pilihan (tanpa ELSE)

|If kondisi then
|Statement
|End if


2. Dua pilihan (dengan ELSE)
|If kondisi then
| Statement-1
|else
| Statement-2
|End if
   Tiga pilihan atau lebih, dengan mengembangkan Statement setelah ELSE

|If kondisi-1 then
| Statement-1
|else
| |if kondisi-2 then
| | Statement-2
| |Else
| | |If kondisi-3 then
| | | Statement-3
| | |Else
| | | Statement-4
| | |End if
| |End if
|End if
    Terapan bentuk-bentuk IF
Sebuah masalah terkadang dapat diselesaikan dengan berbagai cara, seperti
penggunaan “if tanpa else” dan “if dengan else”. Sebagai contoh dapat dilihat
pada kasus berikut:

Solusi-1
|Input(bil)
|If (bil>=0) then
| Output(‘positip’)
|Else
| Output(‘negatip’)
|End if
Solusi-2
|Input(bil)
|If (bil<0) then
| Output(‘negatip’)
|Else
| Output(‘positip’)
|End if
Solusi-3
|Input(bil)
|Ket  ‘positip’
|If (bil<0) then
| Ket  ‘negatip’
|End if
|Output(Ket)
Solusi-4
|Input(bil)
|Ket ⟵ ‘negatip’
|If (bil>=0) then
| Ket  ‘positip
|End if
|Output(Ket)


Solusi-5
|Input(bil)
|If (bil>=0) then
| Output(‘positip’)
|End if
|If (bil<0) then
| Output(‘negatip’)
|End if
Solusi-6
|Input(bil)
|If (bil<0) then
| Output(‘negatip’)
|End if
|If (bil>=0) then
| Output(‘positip’)
|End if
Solusi-7
|Input(bil)
|positip  bil>=0
|If (positip=true) then
| Output(‘positip’)
|else
| Output(‘negatip’)
|End if
Solusi-8
|Input(bil)
|positip  bil>=0
|If (positip) then
| Output(‘positip’)
|else
| Output(‘negatip’)
|End if

   Ulasan dari beberapa solusi:
Solusi-1 dan Solusi-2 adalah solusi yang sama, digunakan kondisi berkebalikan
sehingga posisi perintah tampilan ditukar.
Solusi-3 dan Solusi-4 juga sama, keduanya menggunakan “if tanpa else”,
dengan cara variabel Ket diinisialisasi (diberi nilai awal) dengan salah satu
kemungkinan hasilnya, kemudian diubah bila memenuhi kondisi.
Solusi-5 dan Solusi-6 juga sama, pada solusi ini dibuat 2 buah “if tanpa else”
secara terpisah. Dengan cara ini, berarti akan dilakukan pemeriksaan kondisi
2 kali (padahal sebenarnya cukup satu kali).
Solusi-7 dan Solusi-8 keduanya menggunakan variabel bertipe boolean bernama
positip untuk mencatat hasil pembandingan bil>=0. Penulisan “if
(positip=true)” sama saja dengan menuliskan “if (positip)” cara yang
terakhir lebih cepat waktu eksekusinya.
Berikut beberapa kasus yang lain:
Kasus 4.2 : Terbesar dari 3 bilangan


                                                          Solusi 1                                             Solusi 2
|Input(A,B,C)
|If (A>B) then
| |If (A>C) then
| | Output(‘terbesar =’,A)
| |Else
|Input(A,B,C)
|If (A<B) then
| |If (B<C) then
| | Output(‘terbesar =’,C)
| |Else


| | Output(‘terbesar =’,C)
| |End if
|else
| |if (B>C) then
| | Output(‘terbesar =’,B)
| |Else
| | Output(‘terbesar =’,C)
| |End if
|End if
| | Output(‘terbesar =’,B)
| |End if
|else
| |if (A<C) then
| | Output(‘terbesar =’,C)
| |Else
| | Output(‘terbesar =’,A)
| |End if
|End if
Solusi-3
|Input(A,B,C)
|If (A>B and A>C) then
| |Output(‘terbesar =’,A)
|Else
| |if (B>A and B>C) then
| | Output(‘terbesar =’,B)
| |Else
| | if (C>A and C>B) then
| | Output(‘terbesar =’,C)
| | |End if
| |End if
|End if
Solusi-4
|Input(A,B,C)
|If (A>B and A>C) then
| |Output(‘terbesar =’,A)
|Else if (B>A and B>C) then
| |Output(‘terbesar =’,B)
|Else if (C>A and C>B) then
| |Output(‘terbesar =’,C)
|End if
Solusi-5
|Input(A,B,C)
|Max ⟵ A
|If (B>Max) then
| |Max ⟵ B
|End if
|If (C>Max) then
| |Max ⟵ C
|End if
|Output(‘terbesar = ‘,Max)
Solusi-6
|Input(A,B,C)
|If (A>B) then
| |Max ⟵ A
|else
| |Max ⟵ B
|End if
|If (C>Max) then
| |Max ⟵ C
|End if
|Output(‘terbesar = ‘,Max)

Ulasan dari beberapa solusi:
Solusi-1,Solusi-2 dan Solusi-3 mengguanakan 3 buah kondisi dan setiap hasil
yang didapat akan melalui pemeriksaan 2 buah kodisi.
Solusi-4 menggunakan kondisi yang terdiri dari 2 pembandingan, dengan rata-
rata melakukan pemeriksaan 2 kondisi (4 pembandingan)

Solusi-5 dan Solusi-6 digunakan 2 buah if yang terpisah, dimana hasil
sementara nilai terbesar dicatat di tempat baru (Max), cara ini lebih praktis
terutama kalau dikembangkan untuk mencari terbesar dari banyak bilangan.
Kasus 4.3 : Pembayaran air minum PDAM
PDAM menerapkan pembayaran air minum perumahan dengan cara
perhitungan sebagai berikut :
   - Tarif per m3 untuk 10 m3 pertama (1-10) adalah 2.000
   - Tarif per m3 untuk 10 m3 kedua (11-20) adalah 3.000
   - Tarif per m3 untuk 10 m3 ketiga (21-30) adalah 4.000
   - Tarif per m3 untuk 10 m3 selanjutnya (31 ke atas) adalah 5.000
   - Pemakaian air dihitung minimal 10 m3 (kurang dari 10 m3 dianggap 10 m3)
   - Biaya administrasi bulanan sebesar 10.000
Bagaimana membuat algoritma untuk menghitung biaya tersebut?
Contoh kasus
Penggunaan air 5 m3 dengan biaya 10 x 2.000 + 10.000 = 30.000
Penggunaan air 15 m3 dengan biaya 10 x 2.000 + 5 x 3.000 + 10.000 = 45.000
Penggunaan air 75 m3 dengan biaya 10 x 2.000 + 10 x 3.000 +
10 x 4.000 + 45 x 5.000 +10.000 = 325.000

Solusi :
Pemakaian air dibagi menjadi 4 area pemakaian (misal area a,b,c,d), baru
dihitung total biaya

Solusi-1
|Input(pakai)
|If (pakai>30) then
| |a 10
| |b 10
| |c 10
| |d pakai - 30
|Else If (pakai>20) then
| |a 10
| |b 10
| |c pakai - 20
| |d 0
|Else If (pakai>10) then
| |a 10
| |b pakai - 10
| |c 0
Solusi-2
|Input(pakai)
|a10
|b 0
|c 0
|d 0
|If (pakai>30) then
| |b 10
| |c 10
| |d pakai - 30
|Else If (pakai>20) then
| |b 10
| |c pakai - 20
|Else If (pakai>10) then
| |b pakai - 10
|End if

|Else
| |a 10
| |b 0
| |c 0
| |d 0
|End if
|biaya a * 2000 + b * 3000 +
| c * 4000 + d * 5000 +
| 10000
|Output(‘biaya =’,biaya)
| c * 4000 + d * 5000 +
| 10000
|Output(‘biaya =’,biaya)


      Bentuk Umum CASE dan variasinya
  Sebenarnya semua bentuk pemilihan dapat ditulis dengan IF, namun penulisan
dengan IF untuk banyak pilihan terasa kurang praktis. Bentuk CASE adalah cara
lain penulisan bentuk pemilihan yang lebih sederhana, namun bentuk ini hanya
dapat menggantikan IF apabila memenuhi syarat:
   - kondisi berupa pembandingan kesamaan (dengan tanda “=” )
   - nilai yang dibandingkan bertipe ordinal (integer,char dan boolean)

Bentuk CASE yang juga dikenal dengan istilah CASE Statement, memiliki
bentuk umum sebagai berikut :

                     Case ekspresi 
                     Nilai-1: Aksi-1
                     Nilai-2: Aksi-2
                     ...
                     Nilai-N: Aksi-N
                     [Otherwise : Aksi-X]
                     End Case

Ekspresi bertipe ordinal, berupa:
Sebuah nilai ordinal: boolean, integer, char (bukan string atau real)
Sebuah variabel bertipe ordinal
Operasi data (nilai atau variabel) yang menghasilkan sebuah nilai ordinal
Nilai harus berupa nilai ordinal (tidak boleh variabel)
Aksi berupa satu statement beberapa statement, dimana tiap statement
dapat berupa:
   Statement pengisian nilai seperti a  5
   Statement input data
   Statement output data
   Statement pemilihan (If Statement atau Case Statement)
   Statement pengulangan (For, Repeat atau While Statement)
[otherwise: Aksi-X], tanda [ ] menyatakan opsional (boleh ada/tidak ada),
dimana kalau tidak ada, berarti setelah Aksi-1 langsung selesai. Fungsi
Otherwise sama dengan ELSE pada IF Statement
Dari bentuk umum yang telah dijelaskan, maka variasi bentuk CASE ini
banyak dan tidak berhingga. Di antaranya yang penting dapat disebutkan
berikut:
   - Case tanpa otherwise
   - Case dengan otherwise
   - Case dengan Aksi yang sama untuk beberapa Nilai
   - Case bersarang dimana dalam case ada case lagi, atau Statement lain
Contoh-contoh variasi:
  1. Case tanpa otherwise
      Case ekspresi
      Nilai-1: Statement-1
      Nilai-2: Statement -2
      ...
      Nilai-N: Statement -N
      End Case
  2. Case dengan otherwise
      Case ekspresi
      Nilai-1: Statement -1
      Nilai-2: Statement -2
      ...
      Nilai-N: Statement -N
      [Otherwise : Aksi-X]
      End Case
  3. Case dengan Aksi yang sama untuk beberapa Nilai
      Case ekspresi
      Nilai-1,Nilai-2,Nilai-3: Statement -1
      Nilai-4,Nilai-5,Nilai-6: Statement -2
      Nilai-7..Nilai-10: Statement -3
      ...
      Nilai-N: Statement -N
      [Otherwise : Statement -X]
      End Case
  4. Case bersarang, contohnya :
      Case ekspresi-1
      Nilai-1: Case ekspresi-2
      Nilai-a: Statement -1
      Nilai-b: Statement -2
      End Case
Nilai-2: if kondisi then
  Statement-3
Else
  Statement-4
End if
  Nilai-3:
...
Nilai-N: Statement -N
End Case

   Terapan bentuk-bentuk CASE
Kasus 4.4 : Menentukan nama hari dari nomor hari yang diinput
Dinput nomor hari, ditampilkan nama harinya, bagaimana algoritmanya?
Solusi dengan IF dan CASE

        Solisi IF
|Input(NoHari)
|If (NoHari=1) then
| |NmHari  ‘Senin’
|Else If (NoHari=2) then
| |NmHari  ‘Selasa’
|Else If (NoHari=3) then
       Solusi CASE
|Input(NoHari)
|Case NoHari
| |1: NmHari  ‘Senin’
| |2: NmHari  ‘Selasa’
| |3: NmHari  ‘Rabu’
| |4: NmHari  ‘Kamis’
| |NmHari  ‘Rabu’
|Else If (NoHari=4) then
| |NmHari  ‘Kamis’
|Else If (NoHari=5) then
| |NmHari  ‘Jumat’
|Else If (NoHari=6) then
| |NmHari  ‘Sabtu’
|Else If (NoHari=7) then
| |NmHari  ‘Minggu’
|End if
|Output(NmHari)
| |5: NmHari  ‘Jumat’
| |6: NmHari  ‘Sabtu’
| |7: NmHari  ‘Minggu’
|End Case
|Output(NmHari)

Pada solusi-2 terlihat lebih sederhana dan mudah dibaca dibanding dengan
solusi-1.

   Merubah angka menjadi kalimat
Dinput bilangan/angka (angka dibatasi 1-99), ditampilkan kata-kata/kalimat dari
bilangan tersebut, bagaimana algoritmanya?

Solusi-Case
|Input(bil)
|pul  bil div 10
|sat  bil mod 10
|Kalimat  ‘’
|Case sat
| |1: Kalimat  ‘Satu’
| |2: Kalimat  ‘Dua’
| |3: Kalimat  ‘Tiga’
| |4: Kalimat  ‘Empat’
| |5: Kalimat  ‘Lima’
| |6: Kalimat  ‘Enam’
| |7: Kalimat  ‘Tujuh’
| |8: Kalimat  ‘Delapan’
| |9: Kalimat  ‘Sembilan’
|End Case
|Case pul
| |1: |Case sat
| | | 0: Kalimat ‘Sepuluh’
| | | 1: Kalimat ‘Sebelas’

| | | Otherwise: Kalimat  Kalimat + ‘ belas’
| | |End Case
| |2: |Kalimat ‘Dua Puluh’ + Kalimat
| |3: Kalimat  ‘Tiga Puluh’ + Kalimat
| |4: Kalimat  ‘Empat Puluh’ + Kalimat
| |5: Kalimat  ‘Lima Puluh’ + Kalimat
| |6: Kalimat  ‘Enam Puluh’ + Kalimat
| |7: Kalimat  ‘Tujuh Puluh’ + Kalimat
| |8: Kalimat  ‘Delapan Puluh’ + Kalimat
| |9: Kalimat  ‘Sembilan Puluh’ + Kalimat
|End Case
|Output(Kalimat)

   Pada solusi di atas, satuan diproses dengan case pertama, selanjutnya puluhan
diproses CASE kedua. Pada puluhan=1 (angka belasan) dibagi lagi manjadi 3
kemungkinan, karena bunyi kalimatnya ada 3 macam,

   Konversi Struktur IF dan CASE ke Bahasa C
Berikut ini diberikan pedoman konversi dari algoritma ke dalam bahasa C
untuk struktur IF dan CASE:

Algoritma
Bahasa C
If kondisi then
Aksi
End if
if (kondisi) {
Aksi;
}
If kondisi then
Aksi1
Else
Aksi2
If (kondisi) {
Aksi1;
}
else {
Aksi2;
}
If kondisi1 then
Aksi1
Else if kondisi2
Aksi2
Else
Aksi3
End if
if (kondisi1) {
Aksi1;
}
else if (kondisi2){
Aksi2;
}
else {
Aksi3;
}



Case ekspresi
Nilai1: Aksi1
Nilai2: Aksi2
Nilai3: Aksi3
End case
switch (ekspresi) {
case Nilai1: Aksi1;
Break;
case Nilai2: Aksi2;
Break;
case Nilai3: Aksi3;
}
Case ekspresi
Nilai1: Aksi1
Nilai2: Aksi2
Nilai3: Aksi3
Otherwise: Aksi4
End case
switch (ekspresi) {
case Nilai1: Aksi1;
Break;
case Nilai2: Aksi2;
Break;
case Nilai3: Aksi3;
Break;
default: Aksi4;
}
Case ekspresi
Nilai-1,Nilai-2,Nilai-3: Aksi1
Nilai-4,Nilai-5: Aksi2
Nilai-6..Nilai-8: Aksi3
Otherwise: Aksi4
End Case
switch (ekspresi) {
case Nilai1:
case Nilai2:
case Nilai3: Aksi1;
Break;
case Nilai4:
case Nilai5: Aksi2;
Break;
case Nilai6:
case Nilai7:
case Nilai8: Aksi3;
Break;
default: Aksi4;
}

Catatan:
  - penulisan kondisi pada IF dan ekspresi pada CASE dalam bahasa C harus
    digunakan tanda kurung ( ).
  - aksi berupa satu perintah atau lebih, masing-masing diakhiri titik koma.
  - apabila aksi hanya berupa satu perintah, penggunaan { } dapat dihilangkan.
  - kata “if”, “else”, “switch”, “case” dan “default” dalam bahasa C, harus
    ditulis dengan huruf kecil semua.
  - dalam bahasa C tidak ada kata “then”, “end if” dan “end case” tetapi
    digantikan pasangan kurung kurawal { dan }
  - hati-hati dengan penggunaan kesamaan, yaitu dengan “==” bukan “=”.
  - string digunakan kutip dua ( seperti “test” ) bukan kutip satu (‘test’).

Algoritma
Bahasa C
Algoritma PDAM
/* menghitung biaya pemakaian air*/
Kamus Data
pakai,a,b,c,d : integer
biaya : integer
Begin
|Input(pakai)
|a 10
|b  0
|c  0
|d  0
|If (pakai>30) then
| |b 10
| |c  10
| |d  pakai - 30
|Else If (pakai>20) then
| |b  10
| |c  pakai - 20
|Else If (pakai>10) then
| |b  pakai - 10
|End if
|biaya a * 2000 + b * 3000 +
| c * 4000 + d * 5000 +
| 5000
|Output(‘biaya =’,biaya)
End
#include <stdio.h>
#include <conio.h>

/* menghitung biaya pemakaian air*/
int main() {
//Kamus Data
int pakai,a,b,c,d;
int biaya;
//Begin
printf(“Masukkan pemakaian air: ”);
scanf(“%d”,&pakai);
a=10;
b=0;
c=0;
d=0;
if (pakai>30) {
b=10;
c=10;
d=pakai – 30;
}
else if (pakai>20) {
b=10;
c=pakai – 20;
}
else if (pakai>10) {
b=pakai – 10;
}
biaya = a * 2000 + b * 3000 +
c * 4000 + d * 5000 +
10000;
printf(“biaya = %d”,biaya);
getche();
return 0;
//End
}