Saturday, December 17, 2016

Bab 3. Java: Teori dan Implementasi



Bab. 3 Percabangan




3.1 Introduksi

Jika Anda memasukkan suatu nilai negatif untuk radius pada Kode2.2, maka program akan menampilkan hasil yang tidak valid. Jika radius negatif, Anda tidak menginginkan program untuk menghitung luas. Bagaimana Anda menangani kasus seperti ini?

Sama seperti bahasa pemrograman tingkat-tinggi yang lain, JAVA menyediakan statemen-statemen seleksi yang mengijinkan Anda untuk memilih dua atau tiga cara atau jalan. Anda bisa menggunakan statemen berikut ini pada baris 12-17 pada kode2.2:

if (radius < 0)
   System.out.println("Masukan tidak tepat");
else {
   luas = radius * radius * 3.14159;
   System.out.println("Luas adalah " + luas);
}

Statemen seleksi menggunakan kondisi atau syarat, yang merupakan ekspresi Boolean. Bab ini terlebih dahulu akan mendiskusikan tentang tipe Boolean, operator dan ekspresi perbandingan.


3.2 Tipe Data boolean

Bagaimana Anda membandingkan dua nilai, seperti apakah suatu radius lebih besar dari 0, sama dengan 0, atau lebih kecil dari 0? JAVA menyediakan enam operator perbandingan (yang juga dikenal dengan operator relasional), seperti yang ditunjukkan pada Tabel 3.1, yang dapat digunakan untuk membandingkan dua nilai (diasumsikan radius adalah 5 pada Tabel).

Anda juga bisa membandingkan karakter. Membandingkan karakter sama artinya dengan membandingkan Unicodenya. Misalnya, ‘a’ lebih besar dari ‘A’ karena Unicode dari ‘a’ lebih besar dari Unicode ‘A’.
Perhatikan bahwa operator perbandingan menggunakan dua tanda sama dengan (==), bukan satu (=). Simbol tanda sama dengan (=) adalah operator penugasan.

Tabel 3.1 Operator-Operator Perbandingan
Operator
Nama
Contoh
Hasil
< 
<=
> 
>=
==
!=
lebih kecil dari
lebih kecil sama dengan
lebih besar dari
lebih besar sama dengan
sama dengan
tidak sama dengan
radius < 0
radius <= 0
radius > 0
radius >= 0
radius == 0
radius != 0
false
false
true
true
false
trus


Hasil dari operator perbandingan adalah suatu tipe Boolean: true atau false. Sebagai contoh, statemen berikut ini menampilkan true:

double radius = 1;
System.out.println(radius > 0);

Suatu variabel yang memuat suatu nilai Boolean disebut dengan variabel Boolean. Tipe data boolean digunakan untuk mendeklarasikan variabel Boolean. Suatu variabel boolean dapat menampung salah satu dari dua nilai: false dan true.  Misalnya, statemen berikut ini menugaskan true kepada variabel hidup:

boolean hidup = true;

true dan false adalah literal, sama seperti angka seperti 10. Keduanya merupakan katakunci JAVA dan tidak bisa dijadikan nama pengenal dalam program Anda.


3.3 Masalah: Perangkat Belajar Matematika Sederhana
Di sini, dimisalkan Anda membuat program yang bisa dipakai sebagai perangkat belajar Matematika siswa SD kelas I. Program secara acak membangkitkan dua integer yang masing-masing satu-dijit, angka1 dan angka2, dan kemudian menampilkan kepada siswa tersebut pertanyaan seperti “Berapakah 7 + 9?”. Setelah siswa mengetikkan jawabannya, program menampilkan pesan yang mengindikasikan apakah jawabannya benar atau salah.

Ada beberapa cara untuk membangkitkan bilangan acak. Untuk sekarang, Anda bisa membangkitkan integer pertama menggunakan System.currentTimeMillis() % 10 dan integer kedua menggunakan System.currentTimeMillis() * 7 % 10. Baris 5-6 membangkitkan dua bilangan acak, angka1 dan angka2. Baris 14 menerima jawaban dari pengguna. Jawaban kemudian diuji pada baris 18 menggunakan suatu ekspresi Boolean angka1 + angka2 == jawaban.

Kode3.1 KuisPenjumlahan.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;

public class KuisPenjumlahan {
   public static void main(String[] args) {
   int angka1 = (int)(System.currentTimeMillis() % 10);
   int angka2 = (int)(System.currentTimeMillis() * 7 % 10);

   // Ciptakan suatu Scanner
   Scanner masukan = new Scanner(System.in);

   System.out.print(
   "Berapakah " + angka1 + " + " + angka2 + "? ");

   int jawaban = masukan.nextInt();

   System.out.println(
   angka1 + " + " + angka2 + " = " + jawaban + " adalah " +
   ( angka1 + angka2 == jawaban));
   }
}

Keluaran:

Berapakah 4 + 8? 12
4 + 8 = 12 adalah true
Berapakah 3 + 1? 7
3 + 1 = 7 adalah false


3.4 Statemen if
Program sebelumnya memberikan suatu pesan seperti “3 + 1 = 7 adalah false”. Jika Anda menginginkan pesan menjadi “3 + 1 = 7 adalah tidak tepat”, maka Anda harus menggunakan suatu statemen seleksi untuk membuat perubahan kecil ini.

Bagian ini akan mengenalkan Anda tentang statemen seleksi. JAVA mempunyai beberapa tipe statemen seleksi: statemen if satu-arah, statemen if dua-arah, statemen if nested, statemen switch, ekspresi kondisional.


3.4.1 Statemen if Satu-Arah
Statemen if satu-arah mengeksekusi suatu aksi jika dan hanya jika kondisi adalah true. Sintaks statemen if satu-arah ditunjukkan berikut ini:

if (ekspresi-boolean) {
  statemen-statemen;
}



Gambar 3.1 Suatu statemen if mengeksekusi statemen-statemen jika hasil evaluasi ekspresi-boolean bernilai true

Diagram alir eksekusi statemen if satu-arah ditampilkan pada Gambar 3.1 di bawah ini.

Jika hasil evaluasi terhadap ekspresi-boolean adalah true, maka statemen-statemen di dalam blok dieksekusi. Sebagai contoh, perhatikan kode berikut ini:

if (radius >= 0) {
   luas = radius * radius * PI;
   System.out.println("Luas untuk lingkaran dengan radius" +
    radius + " adalah " + area);
}

Diagram alirnya ditampilkan pada Gambar 3.1b. Jika nilai radius lebih besar dari atau sama dengan 0, maka luas dihitung dan hasil ditampilkan; jika tidak, dua statemen di dalam blok tidak dieksekusi.

Ekspresi-boolan diapit oleh sepasang kurung kurawal. Sebagai contoh, kode dalam (a) adalah salah, yang harus dikoreksi pada (b).


  
Kurung kurawal bisa diabaikan bila yang diapit hanya satu statemen. Sebagai contoh, kedua statemen berikut ini adalah ekivalen.

Kode3.2 memberikan suatu program yang meminta pengguna untuk memasukkan suatu integer. Jika integer yang dimasukkan merupakan kelipatan 5, maka tampilkan KelipatanLima. Jika integer tersebut dapat dibagi dengan 2 (tanpa sisa), maka tampilkan AngkaGenap.

Kode3.2 DemoIfSederhana.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Scanner;

public class DemoIfSederhana {
public static void main(String[] args) {
   Scanner masukan = new Scanner(System.in);
   System.out.println("Masukkan suatu integer: ");
   int angka = masukan.nextInt();

   if (angka % 5 == 0)
     System.out.println("KelipatanLima");

   if (angka % 2 == 0)
     System.out.println("AngkaGenap");
   }
}

Keluaran:

Masukkan suatu integer:
6
AngkaGenap

Masukkan suatu integer:
60
KelipatanLima
AngkaGenap


Program meminta pengguna untuk memasukkan suatu integer (baris 7) dan menampilkan KelipatanLima bila dapat dibagi 5 tanpa sisa (baris 9-10) dan menampilkan AngkaGenap bila dapat dibagi 2 tanpa sisa (baris 12-13).

3.5 Masalah: Menebak Ultah
Anda bisa menebak tanggal kapan teman Anda dilahirkan, hanya dengan menanyakan lima pertanyaan.



Ultah merupakan penjumlahan atas angka-angka pertama dalam himpunan-himpunan di atas. Misalnya, jika ultah adalah 19, maka ultah tersebut muncul pada Set1, Set2, dan Set5. Angka-angka pertama pada ketiga himpunan tersebut adalah 1, 2, dan 16. Penjumlahan ketiganya adalah 19.

Kode3.3 memberikan suatu program yang meminta pengguna untuk menjawab apakah hari ultah berada dalam Set1 (baris 41-47), dalam Set2 (baris 50 -56), dalam Set3 (bari 59-65), dalam Set4 (baris 68-74), atau dalam Set5 (baris 77-83). Jika angka yang dimasukkan berada dalam himpunan-himpunan target, maka angka-angka pertama pada tiap himpunan dijumlahkan.

Kode3.3 TebakUltah.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.Scanner;

public class TebakUltah {
   public static void main(String[] args) {
     String set1 =
      " 1 3 5 7\n" +
      " 9 11 13 15\n" +
      "17 19 21 23\n" +
      "25 27 29 31";

     String set2 =
      " 2 3 6 7\n" +
      "10 11 14 15\n" +
      "18 19 22 23\n" +
      "26 27 30 31";

     String set3 =
      " 4 5 6 7\n" +
      "12 13 14 15\n" +
      "20 21 22 23\n" +
      "28 29 30 31";

     String set4 =
      " 8 9 10 11\n" +
      "12 13 14 15\n" +
      "24 25 26 27\n" +
      "28 29 30 31";

     String set5 =
      "16 17 18 19\n" +
      "20 21 22 23\n" +
      "24 25 26 27\n" +
      "28 29 30 31";

   int hari = 0;

   // Menciptakan Scanner
   Scanner masukan = new Scanner(System.in);

   // Meminta pengguna memberikan jawaban
   System.out.print("Apakah Ultah Anda dalam Set1?\n");
   System.out.print(set1);
   System.out.print("\nMasukkan 0 bila Tidak dan 1 bila Ya: ");
   int jawab = masukan.nextInt();

   if (jawab == 1)
     hari += 1;

   // Meminta pengguna memberikan jawaban
   System.out.print("Apakah Ultah Anda dalam Set2?\n");
   System.out.print(set2);
   System.out.print("\nMasukkan 0 bila Tidak dan 1 bila Ya: ");
   int jawab2 = masukan.nextInt();

   if (jawab2 == 1)
     hari += 2;
      
   // Meminta pengguna memberikan jawaban
   System.out.print("Apakah Ultah Anda dalam Set3?\n");
   System.out.print(set3);
   System.out.print("\nMasukkan 0 bila Tidak dan 1 bila Ya: ");
   int jawab3 = masukan.nextInt();

   if (jawab3 == 1)
     hari += 4;

   // Meminta pengguna memberikan jawaban
   System.out.print("Apakah Ultah Anda dalam Set4?\n");
   System.out.print(set4);
   System.out.print("\nMasukkan 0 bila Tidak dan 1 bila Ya: ");
   int jawab4 = masukan.nextInt();

   if (jawab4 == 1)
     hari += 8;
      
   // Meminta pengguna memberikan jawaban
   System.out.print("Apakah Ultah Anda dalam Set5?\n");
   System.out.print(set5);
   System.out.print("\nMasukkan 0 bila Tidak dan 1 bila Ya: ");
   int jawab5 = masukan.nextInt();

   if (jawab5 == 1)
     hari += 16;

   System.out.println("\nHari Ulang Tahun Anda adalah " + hari + "!");
   }
 }

Keluaran:

Apakah Ultah Anda dalam Set1?
 1 3 5 7
 9 11 13 15
17 19 21 23
25 27 29 31
Masukkan 0 bila Tidak dan 1 bila Ya: 1

Apakah Ultah Anda dalam Set2?
 2 3 6 7
10 11 14 15
18 19 22 23
26 27 30 31
Masukkan 0 bila Tidak dan 1 bila Ya: 1

Apakah Ultah Anda dalam Set3?
 4 5 6 7
12 13 14 15
20 21 22 23
28 29 30 31
Masukkan 0 bila Tidak dan 1 bila Ya: 0

Apakah Ultah Anda dalam Set4?
 8 9 10 11
12 13 14 15
24 25 26 27
28 29 30 31
Masukkan 0 bila Tidak dan 1 bila Ya: 0

Apakah Ultah Anda dalam Set5?
16 17 18 19
20 21 22 23
24 25 26 27
28 29 30 31
Masukkan 0 bila Tidak dan 1 bila Ya: 1

Hari Ulang Tahun Anda adalah 19!


Game ini mudah untuk diprogram. Anda mungkin heran bagaimana game ini diciptakan. Matematika di balik game ini sebenarnya cukup mudah. Angka-angka dalam suatu himpunan tidak dikelompokkan begitu saja, tetapi lewat perhitungan. Angka-angka pertama dalam kelima himpunan adalah 1, 2, 4, 8, dan 16, yang berkaitan dengan 1, 10, 100, 1000, dan 10000 dalam biner. Suatu angka biner untuk integer antara 1 sampai 31 memiliki maksimum lima digit, seperti yang tertampil pada Gambar 3.2a. Dimisalkan . Jadi, , seperti yang ditampilkan pada Gambar 3.2b. Jika angka biner suatu hari memiliki suatu dijit 1 dalam , maka angka tersebut pasti muncul pada Setk. Sebagai contoh, angka 19 dalam biner adalah 10011, jadi angka tersebut akan muncul dalam Set1, Set2, dan Set5. Dalam biner, 1 + 10 + 10000, atau dalam desimal, 1 + 2 + 16 = 19.


Gambar 3.2 (a) Suatu angka antara 1 sampai 31 dapat direpresentasikan menggunakan suatu angka biner 5-dijit. (b) Suatu angka 5-dijit dapat diperoleh dengan menambahkan angka-angka biner 1, 10, 100, 1000, dan 10000.


3.6 Statemen if Dua-Arah
Suatu statemen if satu-arah melakukan aksi bila kondisi yang dispesifikasi bernilai true. Jika kondisi tersebut bernilai false, tidak ada yang dilakukan. Tetapi bagaimana bila ada aksi alternatif bila kondisi bernilai false? Anda bisa menggunakan statemen if dua-arah. Aksi-aksi yang dispesifikasi oleh statemen if dua-arah berbeda berdasarkan pada nilai kondisi true atau false. Berikut adalah sintaks suatu statemen if dua-arah:


if (ekspresi-boolean) {
  statemen-statemen-untuk-kasus-true;
}
else {
  statemen-statemen-untuk-kasus-false;
}


Diagram alir statemen if dua-arah ditampilkan pada Gambar 3.3.
Jika hasil evaluasi terhadap ekspresi-boolean bernilai true, maka statemen-statemen-untuk-kasus-true dieksekusi, sebaliknya  statemen-statemen-untuk-kasus-false dieksekusi. Sebagai contoh, perhatikan kode berikut ini:

if (radius >= 0) {
   luas = radius * radius * PI;
   System.out.println("Luas lingkaran dengan radius " +
    radius + " adalah " + luas);
}
else {
   System.out.println("Masukan negatif");
}

Gambar 3.3 Suatu statemen if...else mengeksekusi statemen-statemen untuk kasus true jika hasil evaluasi ekspresi-boolean bernilai true; sebaliknya, statemen-statemen untuk kasus false dieksekusi.


Jika radius >= 0 adalah true, maka luas akan dihitung dan ditampilkan; tetapi jika false, maka pesan “Masukan negatif” ditampilkan.

Seperti biasa, sepasang kurung kurawal bisa diabaikan bila hanya terdapat satu statemen yang diapit. Jadi, sepasang kurung kurawal yang mengapit statemen System.out.println("Masukan negatif"); dapat diabaikan.

Berikut contoh lain yang menggunakan statemen if...else. Contoh ini memeriksa apakah suatu angka ganjil atau genap, sebagai berikut:

if (angka % 2 == 0)
System.out.println(angka + " adalah genap.");
else
System.out.println(angka + " adalah ganjil.");


3.7 Statemen if Nested
Suatu statemen if dapat memuat statemen if lainnya.  Atau dengan kata lain, statemen if sebelah dalam dikatakan nested di dalam statemen if sebelah luar. Sebagai contoh, berikut adalah suatu statemen if nested:

if (i > k) {
   if (j > k)
     System.out.println("i dan j lebih besar dari k");
}
else
   System.out.println("i lebih rendah dari atau sama dengan k");

Statemen if (j > k) nested di dalam statemen if (i > k). Statemen if nested dapat dimanfaatkan untuk mengimplementasikan berbagai alternatif. Statemen pada Gambar 3.4a, misalnya, menugaskan suatu nilai huruf kepada variabel nilai sesuai dengan skor, dengan berbagai alternatif.

Gambar 3.4 Format yang disukai untuk berbagai alternatif statemen if, ditampilkan pada (b)

Eksekusi atas statemen if adalah sebagai berikut. Kondisi pertama (skor >= 90) diuji. Jika bernilai true, maka nilai menjadi ‘A’. Jika kondisi tersebut bernilai false, maka kondisi kedua (skor >= 80) diuji. Jika kondisi tersebut true, maka nilai menjadi ‘B’. Jika kondisi tersebut bernilai false, maka kondisi ketiga dan kondisi-kondisi lainnya sampai suatu kondisi dipenuhi atau semua kondisi bernilai false. Jika semua kondisi bernilai false, maka nilai menjadi ‘F’. Ingat bahwa suatu kondisi diuji hanya jika semua kondisi sebelumnya bernilai false.

Statemen if pada Gambar 3.4a ekivalen dengan pada Gambar 3.4b. Format pada Gambar 3.4b lebih disukai karena gaya penulisan statemen if dengan berbagai pilihan yang lebih mudah dimengerti dan menghindari identasi yang terlalu dalam.

Seringkali, untuk menugaskan suatu kondisi kepada suatu variabel boolean, programmer baru (muda) menuliskan kode seperti pada (a):

Kode dapat disederhanakan dengan menugaskan secara langsung hasil pengujian kepada variabel, seperti tertampil pada (b).

3.8 Kesalahan Yang Sering Terjadi pada Statemen Seleksi

Berikut adalah kesalahan-kesalahan yang umum terjadi pada programmer baru:

Kesalahan 1:
Sepasang kurung kurawal dapat diabaikan bila blok hanya memuat satu statemen saja. Akan tetapi, mengabaikan kurung kurawal pada saat diperlukan untuk mengelompokkan beberapa statemen merupakan kesalahan pemrograman yang umum terjadi. Jika Anda memodifikasi kode dengan menambahkan beberapa statemen baru di dalam suatu statemen if tanpa kurung kurawal, maka Anda perlu menyisipkan sepasang kurawal. Sebagai contoh, kode pada (a) adalah salah. Seharusnya kode tersebut memiliki sepasang kurung kurawal untuk mengelompokkan beberapa statemen, seperti pada (b).



Kesalahan 2: Salah titik-koma pada baris if
Menambahkan titik-koma pada baris if, seperti ditunjukkan pada (a), merupakan kesalahan yang sering terjadi.




Kesalahan ini susah dicari, karena bukan merupakan error kompilasi maupun error runtime, tetapi adalah error logika. Kode pada (a) ekivalen dengan (b). Kesalahan ini terjadi ketika Anda menggunakan gaya blok next-line. Menggunakan gaya blok end-of-line bisa mencegah kesalahan ini.


Kesalahan 3: Pengujian nilai Boolean yang berlebihan
Untuk menguji suatu variabel boolean apakah bernilai true atau false di dalam suatu statemen kondisi, adalah berlebihan bila menggunakan persamaan operator perbandingan seperti pada kode (a):



Lebih baik menguji variabel boolean secara langsung, seperti pada kode (b). Alasan lain melakukan ini adalah untuk menghindari kesalahan yang susah dideteksi. Penggunaan operator =, bukan ==, untuk membandingkan dalam statemen kondisi merupakan kesalahan yang umum terjadi. Hal ini dapat menyebabkan statemen salah berikut ini:


if (genap = true)
System.out.println("Hasil genap");

Statemen ini tidak memiliki error sintaks. Statemen tersebut menugaskan true kepada genap, sehingga genap selalu bernilai true.

Kesalahan 4: Statemen else yang membingungkan
Kode pada (a) di bawah ini memiliki dua if dan satu else. if yang mana yang cocok dengan else? Identasi mengindikasikan bahwa else cocok dengan if yang pertama. Tetapi, faktanya adalah else cocok dengan if yang kedua. Statemen else selalu berpasangan dengan statemen if yang terakhir pada blok yang sama. Jadi, kode pada (a) ekivalen dengan kode pada (b).




Karena (i > j) bernilai false, maka tidak ada yang tertampil pada (a) dan (b). Untuk memaksa statemen else cocok dengan statemen if pertama, Anda harus menambahkan sepasang kurung kurawal, sebagai berikut:

int i = 1, j = 2, k = 3;
if (i > j) {
   if (i > k)
     System.out.println("A");
}
else
System.out.println("B");

Kode di atas akan menampilkan B.

3.9 Masalah: Perangkat Pembelajaran Matematika Diperbaiki
Dimisalkan Anda ingin mengembangkan suatu program pengurangan bagi siswa SD kelas 1. Program secara acak membangkitkan dua integer satu-dijit: angka1 dan angka2, dengan angka1 >= angka2. Program kemudian menampilkan kepada siswa suatu pertanyaan, seperti “Berapakah 9 – 2?”. Setelah siswa menjawab pertanyaan tersebut, program menampilkan suatu pesan yang mengindikasikan apakah jawaban yang diberikan benar atau salah.

Program sebelumnya membangkitkan angka-angka acak menggunakan metode System.currentTimeMillis(). Pendekatan yang lebih baik adalah menggunakan metode random() dalam kelas Math. Pemanggilan metode ini akan menghasilkan nilai balik suatu nilai acak double, d, sehingga . Jadi, (int)(Math.random() * 10) akan menghasilkan nilai balik berupa suatu integer satu-dijit (mulai 0 sampai 9).

Program ini bekerja dengan prosedur sebagai berikut:

  • Bangkitkan dua integer satu-dijit, angka1 dan angka2.
  • Jika angka1 < angka2, maka tukar angka1 dengan angka2.
  • Minta siswa untuk menjawab “Berapakah angka1 – angka2?”
  •  Periksa jawaban siswa dan tampilkan apakah jawaban benar atau salah.

Kode3.4 KuisPengurangan.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.Scanner;

public class KuisPengurangan {
   public static void main(String[] args) {
     // 1. Bangkitkan dua integer satu-dijit, angka1 dan angka2
     int angka1 = (int)(Math.random() * 10);
     int angka2 = (int)(Math.random() * 10);

     // 2. Jika angka1 < angka2, maka tukar angka1 dengan angka2
     if (angka1 < angka2) {
       int temp = angka1;
       angka1 = angka2;
       angka2 = temp;
     }

     // 3. Minta siswa untuk menjawab “Berapakah angka1 – angka2?”
     System.out.print
      ("Berapakah " + angka1 + " - " + angka2 + "? ");
     Scanner masukan = new Scanner(System.in);
     int jawab = masukan.nextInt();

     // 4. Periksa jawaban siswa dan tampilkan jawaban benar atau salah
     if (angka1 - angka2 == jawab)
       System.out.println("Anda benar!");
     else
       System.out.println("Jawaban Anda salah\n" + angka1 + " - "
         + angka2 + " seharusnya " + (angka1 - angka2));
   }
}

Keluaran:

Berapakah 4 - 4? 0
Anda benar!

Berapakah 4 - 3? 9
Jawaban Anda salah
4 - 3 seharusnya 1

Untuk menukar dua variabel angka1 dan angka2, suatu variabel temporer temp (baris 11) digunakan untuk menampung nilai angka1. Nilai angka2 ditugaskan kepada angka1 (baris 12) dan nilai temp ditugaskan kepada angka2.


3.10 Masalah: Menghitung Indeks Berat Badan
Indeks Berat Badan (BMI, body mass index) adalah ukuran kesehatan dengan acuan berat. Indeks ini dapat dihitung berdasarkan berat badan (dalam kilogram) yang dibagi dengan kuadrat tinggi badan dalam meter. Interpretasi BMI untuk usia 16 tahun atau lebih adalah sebagai berikut:
BMI
Interpretasi
Di bawah 16
16 – 18
18 – 24
24 – 29
29 – 35
Di atas 35
Sangat Kurus
Kurus
Normal
Gemuk
Sangat Gemuk
Terlalu Gemuk

Buatlah suatu program yang meminta pengguna untuk memasukkan tinggi badan dalam inci dan berat badan dalam pound. Perhatikan bahwa satu pound sama dengan 0.45359237 kilogram dan satu inci sama dengan 0.0254 meter.

Kode3.5 HitungBMI.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Scanner;

public class HitungBMI {
   public static void main(String[] args) {
     Scanner masukan = new Scanner(System.in);

     // Meminta pengguna memasukkan berat dalam pound
     System.out.print("Masukkan berat badan dalam pound: ");
     double berat = masukan.nextDouble();

     // Meminta pengguna memasukkan tinggi badan dalam inci
     System.out.print("Masukkan tinggi badan dalam inci: ");
     double tinggi = masukan.nextDouble();

     final double KILOGRAM_PER_POUND = 0.45359237; // Konstanta
     final double METER_PER_INCI = 0.0254; // Konstanta

     // Hitung BMI
     double beratDalamKilogram = berat * KILOGRAM_PER_POUND;
     double tinggiDalamMeter = tinggi * METER_PER_INCI;
     double bmi = beratDalamKilogram /
      (tinggiDalamMeter * tinggiDalamMeter);

     // Tampilkan hasil
     System.out.printf("BMI Anda adalah %5.2f\n", bmi);
     if (bmi < 16)
       System.out.println("Anda sangat kurus");
     else if (bmi < 18)
       System.out.println("Anda kurus");
     else if (bmi < 24)
       System.out.println("Anda normal");
     else if (bmi < 29)
       System.out.println("Anda gemuk");
     else if (bmi < 35)
       System.out.println("Anda sangat gemuk");
     else
       System.out.println("Anda terlalu gemuk");
   }
}
Keluaran:

Masukkan berat badan dalam pound: 146
Masukkan tinggi badan dalam inci: 70
BMI Anda adalah 20.95
Anda normal


3.11 Masalah: Menghitung Pajak
Pada kesempatan ini, dimisalkan Anda diminta untuk menghitung pajak perseorangan. Ada empat kategori: tidak kawin, menikah bersama, menikah terpisah, dan kepala keluarga. Besaran pajak bervariasi tiap tahun. Tabel 3.2 menunjukkan besaran pajak dalam empat kategori. Jika, misalnya Anda belum kawin dengan pendapatan Rp. 100.000.000/tahun, maka Rp. 83.500.000 dipajak sebesar 10% dan sisanya Rp. 16.500.000 dipajak sebesar 15%. Jadi, total pajak Anda selama setahun adalah sebesar Rp. 10.082.000.

Tabel 3.2 Pajak Perseorangan
Besaran Pajak (%)
Tidak Kawin
( x Rp. 10.000)
Menikah Bersama
( x Rp. 10.000)
Menikah Terpisah
( x Rp. 10.000)
Kepala Keluarga
( x Rp. 10.000)
10%
15%
25%
28%
33%
35%
0 – 8.350
8.351 – 33.950
33.951 – 82.250
82.251 – 171.550
171.551 – 372.950
Di atas 372.951
0 – 16.700
16.701 – 67.900
67.901 – 137.050
137.151 – 208.850
208.851 – 372.950
Di atas 372.951
0 – 8.350
8.351 - 33.950
33.951 – 68.525
68.526 – 104.425
104.426 – 186.475
Di atas 186.476
0 – 11.950
11.951 – 45.500
45.501 – 117.450
117.451 – 190.200
190.201 – 372.950
Di atas 372.951

Anda diharapkan menulis suatu program untuk menghitung pajak perseorangan. Program Anda harus meminta pengguna untuk mengentri status kategori dan pendapatan dan menghitung pajak tahunan. Masukkan 0 untuk kategori tidak kawin, 1 untuk kawin bersama, 2 untuk kawin terpisah, dan 3 untuk kepala keluarga.

Program Anda menghitung pajak berdasarkan empat kategori yang diberikan. Status kategori ditentukan menggunakan statemen if, yang diberikan sebagai berikut:

if (status == 0) {
// Hitung pajak untuk tidak kawin
}
else if (status == 1) {
// Hitung pajak untuk kawin bersama
}
else if (status == 2) {
// Hitung pajak untuk kawin terpisah
}
else if (status == 3) {
// Hitung pajak untuk kepala keluarga
}
else {
// Tampilkan status kategori salah
}

Untuk setiap status ketegori, terdapat enam besaran pajak. Setiap besaran diterapkan kepada porsi tertentu dari pendapatan. Sebagai contoh, bila pendapatan untuk kategori tidak kawin adalah sebesar Rp. 400.000.000, maka Rp. 83.500.000 dipajak sebesar 10%, (Rp. 33.950.000 - Rp. 83.500.000) dipajak sebesar 15%, (Rp. 82.250.000 - Rp. 33.950.000) dipajak sebesar 25%, (Rp. 171.550.000 – Rp. 82.250.000) dipajak sebesar 28%, (Rp. 372.950.000 - Rp. 171.550.000) dipajak sebesar 33%, dan (Rp. 400.000.000 – Rp. 372.950.000) dipajak sebesar 35%.

Kode3.6 memberikan solusi untuk menghitung pajak untuk status kategori tidak kawin. Sisa kategori yang lain diberikan dalam latihan pemrograman.

Kode3.6 HitungPajak.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.util.Scanner;

public class HitungPajak {
   public static void main(String[] args) {
     // Menciptakan suatu Scanner
     Scanner masukan = new Scanner(System.in);

     // Meminta pengguna untuk memasukkan status kategori
     System.out.print(
      "(0-tidak kawin, 1-kawin bersama,\n" +
      "2-kawin terpisah, 3-kepala keluarga)\n" +
      "Masukkan status kategori: ");
     int status = masukan.nextInt();

     // Meminta pengguna untuk memasukkan pendapatan tahunan
     System.out.print("Masukkan pendapatan tahunan ( x Rp. 10.000): ");
     double pendapatan = masukan.nextDouble();

     // Hitung pajak
     double pajak = 0;

     if (status == 0) { // Menghitung pajak untuk kategori tidak kawin
       if (pendapatan <= 8350)
         pajak = pendapatan * 0.10;
       else if (pendapatan <= 33950)
         pajak = 8350 * 0.10 + (pendapatan - 8350) * 0.15;
       else if (pendapatan <= 82250)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (pendapatan - 33950) * 0.25;
       else if (pendapatan <= 171550)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (pendapatan - 82250) * 0.28;
       else if (pendapatan <= 372950)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 +
         (pendapatan - 171550) * 0.35;
       else
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 +
         (372950 - 171550) * 0.33 + (pendapatan - 372950) * 0.35;
   }
   else if (status == 1) { // Menghitung pajak kategori kawin terpisah
     // Untuk latihan pemrograman
   }
   else if (status == 2) { // Menghitung pajak kategori kawin bersama
    // Untuk latihan pemrograman
   }
   else if (status == 3) { // Menghitung pajak kategori kepala keluarga
     // Untuk latihan pemrograman
   }
   else {
     System.out.println("Error: Status tidak valid");
     System.exit(0);
   }

   // Tampilkan hasil
   System.out.println("Pajak sebesar Rp. " + (int)(pajak * 100) / 100.0 + "(x Rp. 10.000)" );
   }
}

Keluaran:

(0-tidak kawin, 1-kawin bersama,
2-kawin terpisah, 3-kepala keluarga)
Masukkan status kategori: 0
Masukkan pendapatan tahunan ( x Rp. 10.000): 10000
Pajak sebesar Rp. 1082.5(x Rp. 10.000)

Program menerima status kategori dan pendapatan. Berbagai alternatif menggunakan statemen if (baris 22, 42, 45, 48, dan 51) memeriksa status kategori dan menghitung pajak berdasarkan status kategori yang dimasukkan.

System.exit(0) (baris 53) didefinisikan dalam kelas System. Memanggil metode ini berarti menghentikan program. Argumen 0 mengindikasikan bahwa program dihentikan secara normal.

Suatu nilai awal 0 ditugaskan kepada pajak (baris 20). Suatu error sintaks akan terjadi bila variabel tersebut tidak memiliki nilai awal, karena semua statemen yang menugaskan nilai-nilai kepada pajak berada dalam statemen if. Kompiler berpikir bahwa bisa jadi statemen-statemen tersebut bisa jadi tidak dieksekusi dan oleh karena itu melaporkan error sintaks.


3.12 Operator – Operator Logikal

Kadang kala, suatu statemen dieksekusi ditentukan oleh kombinasi beberapa kondisi. Anda bisa menggunakan operator logikal. Operator logikal, yang juga dikenal dengan operator Boolean, beroperasi pada nilai-nilai Boolean untuk menciptakan suatu nilai Boolean yang baru. Tabel 3.3 memberikan daftar operator-operator Boolean. Tabel 3.4 mendefinisikan operator not (!). Operator not (!) menegasikan true menjadi false dan false menjadi true. Tabel 3.5 mendefinisikan operator and (&&). Hasil operasi and (&&) atas dua operand Boolean bernilai true bila kedua operand bernilai true. Tabel 3.6 mendefinisikan operator (||).Hasil operasi or (||) atas dua operand Boolean bernilai true bila salah satu dari kedua operand bernilai true. Tabel 3.7 mendefinisikan operator exclusive or (^).Hasil operasi exclusive or (^) atas dua operand Boolean bernilai true jika dan hanya jika kedua operand memiliki nilai Boolean yang berbeda.

Tabel 3.3 Operator – Operator Boolean
Operator
Nama
Penjelasan
!
&&
||
^
Not
And
Or
Exclusive Or
Negasi logikal
Konjungsi logikal
Disjungsi logikal
Exklusi logikal

Tabel 3.4 Tabel Kebenaran Operator !
p
!p
Contoh (Asumsi usia = 24, gender  = ‘F’)
true
false
false
true
!(usia > 18) adalah false, karena (usia > 18) adalah true.
!(gender ==’M’) adalah true, karena (gender ==’M’) adalah false

Tabel 3.5 Tabel Kebenaran Operator &&
p1
p2
p3
Contoh (Asumsi usia = 24, gender  = ‘F’)
false

false
true
true
false

true
false
true
false

false
false
true
(usia > 18) && (gender ==’F’) adalah true, karena (usia > 18) dan (gender == ‘F’) keduanya adalah true.

(usia > 18) && (gender !=’F’) adalah false, karena (gender != ‘F’) adalah false.

Tabel 3.6 Tabel Kebenaran Operator ||
p1
p2
p3
Contoh (Asumsi usia = 24, gender  = ‘F’)
false

false
true
true
false

true
false
true
false

true
true
true
(usia > 34) || (gender ==’F’) adalah true, karena (gender == ‘F’) adalah true.

(usia > 34) || (gender ==’M’) adalah false, karena (gender == ‘M’) dan (usia > 34)  adalah keduanya false.

Tabel 3.7 Tabel Kebenaran Operator ^
p1
p2
p3
Contoh (Asumsi usia = 24, gender  = ‘F’)
false

false
true
true
false

true
false
true
false

true
true
false
(usia > 34) ^ (gender ==’F’) adalah true, karena (usia > 34) adalah false tetapi  (gender == ‘F’) adalah true.

(usia > 34) ^ (gender ==’M’) adalah false, karena (gender == ‘M’) dan (usia > 34)  adalah keduanya false.


Kode3.7 memberikan suatu program yang memeriksa apakah suatu angka dapat dibagi oleh 2 dan 3 (tanpa sisa), oleh 2 atau 3 (tanpa sisa), dan oleh 2 atau 3 (tanpa sisa) tetapi tidak oleh keduanya.

Kode3.7 UjiOperatorBoolean.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.Scanner;

public class UjiOperatorBoolean {
   public static void main(String[] args) {
   // Menciptakan suatu Scanner
   Scanner masukan = new Scanner(System.in);

   // Menerima masukan
   System.out.print("Masukkan suatu integer: ");
   int angka = masukan.nextInt();

   System.out.println("Apakah " + angka +
    "\n\tdapat dibagi oleh 2 dan 3? " +
    (angka % 2 == 0 && angka % 3 == 0)
    + "\n\tdapat dibagi oleh 2 atau 3? " +
    (angka % 2 == 0 || angka % 3 == 0) +
    "\n\tdapat dibagi oleh 2 atau 3, tetapi tidak keduanya? "
    + (angka % 2 == 0 ^ angka % 3 == 0));
   }
}

Keluaran:

Masukkan suatu integer: 18
Apakah 18
    dapat dibagi oleh 2 dan 3? true
    dapat dibagi oleh 2 atau 3? true
    dapat dibagi oleh 2 atau 3, tetapi tidak keduanya? false

String yang panjang dibentuk dengan menyambung beberapa substring pada bari 12-18. Tiga karakter \n menampilkan string dalam empat baris. (angka % 2 == 0 && angka % 3 == 0) pada baris 14 memeriksa apakah angka yang diberikan dapat dibagi 2 dan 3 (tanpa sisa). (angka % 2 == 0 || angka % 3 == 0) pada baris 16 memeriksa apakah angka yang diberikan dapat dibagi 2 atau 3 (tanpa sisa). (angka % 2 == 0 ^ angka % 3 == 0) pada baris 20 memeriksa apakah angka yang diberikan dapat dibagi 2 atau 3 (tanpa sisa) tetapi tidak dibagi keduanya.

Dalam Matematika, ekspresi berikut ini adalah sah
1 <= jumlahHariDalamSebulan <= 31

Namun, ekspresi di atas tidak valid dalam JAVA, karena 1 <= jumlahHariDalamSebulan dievaluasi menjadi suatu nilai Boolean, yang tidak bisa dibandingkan dengan nilai 31. Di sini, dua operand (satu nilai Boolean dan satu lagi nilai numerik) tidak kompatibel. Ekspresi yang benar dalam JAVA adalah

(1 <= jumlahHariDalamSebulan) && (jumlahHariDalamSebulan <= 31)
Perhatikan bahwa dalam bab sebelumnya, suatu nilai char paling baik dicast menjadi suatu nilai int, dan sebaliknya. Suatu nilai bertipe boolean, bagaimanapun, tidak dapat dicast menjadi tipe apapun, dan sebaliknya tipe apapun tidak bisa dicast menjadi tipe boolean.

Hukum DeMorgan dapat digunakan untuk menyederhanakan ekspresi-ekspresi Boolean. Hukum ini menyatakan bahwa
!(kondisi1 && kondisi2) sama dengan ! kondisi1 || ! kondisi2
!( kondisi1 || kondisi2) sama dengan ! kondisi1 && ! kondisi2

Sebagai contoh,
!(n == 2 || n == 3) sama dengan n != 2 && n != 3
!(n % 2 == 0 && n % 3 == 0) sama dengan n % 2 != 0 || n % 3 != 0

Jika salah satu operand dari suatu operator && adalah false, maka ekspresi bernilai false; jika salah satu operand dari suatu operator || adalah true, maka ekspresi bernilai true. JAVA menggunakan sifat ini untuk memperbaiki kinerja operator-operator ini. Ketika mengevaluasi p1 && p2, JAVA pertama-tama mengevaluasi p1, dan kemudian, bila p1 adalah true, mengevaluasi p2; Jika p1 bernilai false, maka tidak perlu lagi mengevaluasi p2. Ketika mengevaluasi p1 || p2, JAVA terlebih dahulu mengevaluasi p1, dan kemudian, jika p1 bernilai false, mengevaluasi p2; jika p1 bernilai true, maka tidak perlu lagi mengevaluasi p2.


3.13 Masalah: Menentukan Tahun Leap
Suatu tahun leap adalah bila bisa dibagi oleh 4 (tanpa sisa) tetapi tidak bisa dibagi oleh 100 (tanpa sisa). Atau bisa dikatakan tahun leap bila bisa dibagi 400 (tanpa sisa). Jadi, Anda bisa menggunakan ekspresi-ekspresi Boolean berikut ini untuk menentukan apakah suatu tahun merupakan tahun leap:

// Suatu tahun leap dapat dibagi oleh 4
boolean apaTahunLeap = (tahun % 4 == 0);

// Suatu tahun leap dapat dibagi oleh 4 tetapi bukan oleh 100
apaTahunLeap = apaTahunLeap && (tahun % 100 != 0);

// Suatu tahun leap dapat dibagi oleh 4 tetapi bukan oleh 100 atau bisa dibagi // oleh 400
apaTahunLeap = apaTahunLeap || (tahun % 400 == 0);

Atau Anda bisa menggabungkan
 apaTahunLeap = (tahun % 4 == 0 && tahun % 100 != 0) || (tahun % 400 == 0);

Kode3.8 memberikan suatu program yang membolehkan pengguna untuk mengentri suatu tahun dan memeriksa apakah tahun tersebut leap atau bukan.

Kode3.8 TahunLeap.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Scanner;

public class TahunLeap {
   public static void main(String[] args) {
     // Menciptakan suatu Scanner
     Scanner masukan = new Scanner(System.in);
     System.out.print("Masukkan suatu tahun: ");
     int tahun = masukan.nextInt();

     // Periksa apakah tahun leap atau bukan
     boolean apaTahunLeap =
      (tahun % 4 == 0 && tahun % 100 != 0) || (tahun % 400 == 0);

     // Tampilkan hasil
     System.out.println(tahun + " apakah tahun leap? " + apaTahunLeap);
 }
 }

Keluaran:

Masukkan suatu tahun: 2008
2008 apakah tahun leap? true

Masukkan suatu tahun: 2002
2002 apakah tahun leap? false



3.14 Masalah: Lottery
Dimisalkan Anda ingin membuat program untuk bermain lottery. Program secara acak membangkitkan suatu lottery yang memuat suatu angka dua-dijit, meminta pengguna untuk memasukkan suatu angka dua-dijit, dan menentukan apakah pengguna memenangkan lottery sesuai dengan aturan sebagai berikut:

  1. Jika masukan pengguna cocok dengan angka lottery dengan urutan yang tepat, hadiah diberikan sebesar Rp. 10.000.
  2. Jika semua dijit masukan pengguna cocok dengan angka lottery, diberikan hadiah sebesar Rp. 3.000.
  3. Jika satu dijit cocok dengan angka lottery, diberikan hadiar sebesar Rp. 1.000.

Program utuh diberikan pada kode3.9 berikut ini:

Kode3.9 Lottery.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.Scanner;

public class Lottery {
   public static void main(String[] args) {
   // Membangkitkan suatu lottery
   int lottery = (int)(Math.random() * 100);

   // Meminta pengguna memasukkan tebakan
   Scanner masukan = new Scanner(System.in);
   System.out.print("Masukkan tebakan Anda (dua dijit): ");
   int tebak = masukan.nextInt();

   // Mendapatkan dua-dijit untuk lottery
   int lotteryDijit1 = lottery / 10;
   int lotteryDijit2 = lottery % 10;

   // Mendapatkan dijit dari tebakan
   int tebakDijit1 = tebak / 10;
   int tebakDijit2 = tebak % 10;

   System.out.println("Angka lottery adalah " + lottery);

   // Periksa tebakan
   if (tebak == lottery)
     System.out.println("Cocok dan Tepat: Anda memenangkan Rp. 10.000");
   else if (tebakDijit1 == lotteryDijit1
        && tebakDijit1 == lotteryDijit2)
     System.out.println("Cocok dengan semua dijit: Anda memenangkan Rp. 3.000");
   else if (tebakDijit1 == lotteryDijit1
        || tebakDijit1 == lotteryDijit2
        || tebakDijit2 == lotteryDijit1
        || tebakDijit2 == lotteryDijit2)
     System.out.println("Cocok satu dijit: Anda memenangkan Rp. 1.000");
   else
     System.out.println("Maaf, tidak cocok sama sekali");
   }
}

Keluaran:

Masukkan tebakan Anda (dua dijit): 39
Angka lottery adalah 97
Cocok satu dijit: Anda memenangkan Rp. 1.000

Masukkan tebakan Anda (dua dijit): 96
Angka lottery adalah 52
Maaf, tidak cocok sama sekali

Program membangkitkan suatu lottery menggunakan metode random() (baris 6) dan meminta pengguna untuk memasukkan tebakan (baris 11). Perhatikan bahwa tebak % 10 mendapatkan dijit terakhir dari tebak dan tebak / 10 mendapatkan dijit pertama dari tebak, karena tebak merupakan suatu angka dua-dijit (baris 18-19).

Program memeriksa tebakan apakah sesuai dengan angka lottery berdasarkan urutan ini:
1.     Pertama-tama memeriksa apakah tebakan cocok dan tepat dengan lottery (baris 24).
2.     Jika tidak, apakah urutan terbalik dari tebakan cocok dengan lottery (baris 26-27).
3.     Jika tidak, diperiksa apakah salah satu dijit tebakan cocok dengan lottery (baris 29-32).
4.     Jika tidak, tebakan salah sama sekali.


3.15 Statemen switch
Statemen if dalam kode3.6, HitungPajak.java, membuat pilihan berdasarkan satu kondisi false atau true. Ada empat kasus untuk menghitung pajak, yang bergantung pada nilai status. Untuk melakukannya, kode3.6 menggunakan statemen if nested. Tetapi statemen if nested yang berlebihan dapat membuat suatu program rumit dibaca. JAVA menyediakan suatu statemen switch untuk menangani berbagai alternatif secara efisien. Anda dapat menulis statemen switch berikut ini untuk menggantikan statemen if nested pada kode3.6:

switch (status) {
case 0: hitung pajak untuk kategori tidak kawin;
break;
case 1: hitung pajak untuk kategori menikah bersama;
break;
case 2: hitung pajak untuk kategori menikah terpisah;
break;
case 3: hitung pajak untuk kategori kepala keluarga;
break;
default: System.out.println("Error: status tidak valid");
System.exit(0);
}


Kode3.10 HitungPajakSwitch.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.Scanner;

public class HitungPajakSwitch {
   public static void main(String[] args) {
     // Menciptakan suatu Scanner
     Scanner masukan = new Scanner(System.in);

     // Meminta pengguna untuk memasukkan status kategori
     System.out.print(
      "(0-tidak kawin, 1-kawin bersama,\n" +
      "2-kawin terpisah, 3-kepala keluarga)\n" +
      "Masukkan status kategori: ");
     int status = masukan.nextInt();

     // Meminta pengguna untuk memasukkan pendapatan tahunan
     System.out.print("Masukkan pendapatan tahunan ( x Rp. 10.000): ");
     double pendapatan = masukan.nextDouble();

     // Hitung pajak
     double pajak = 0;

     switch (status) {
       case 0: { //hitung pajak untuk kategori tidak kawin
       if (pendapatan <= 8350)
         pajak = pendapatan * 0.10;
       else if (pendapatan <= 33950)
         pajak = 8350 * 0.10 + (pendapatan - 8350) * 0.15;
       else if (pendapatan <= 82250)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (pendapatan - 33950) * 0.25;
       else if (pendapatan <= 171550)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (pendapatan - 82250) * 0.28;
       else if (pendapatan <= 372950)
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 +
         (pendapatan - 171550) * 0.35;
       else
         pajak = 8350 * 0.10 + (33950 - 8350) * 0.15 +
         (82250 - 33950) * 0.25 + (171550 - 82250) * 0.28 +
         (372950 - 171550) * 0.33 + (pendapatan - 372950) * 0.35;
       break;      
       }
       case 1: { //hitung pajak untuk kategori menikah bersama
         // Untuk latihan pemrograman
       break;      
       }
       case 2: { // hitung pajak untuk kategori menikah terpisah
         // Untuk latihan pemrograman
       break;
       }
       case 3: { //hitung pajak untuk kategori kepala keluarga
         // Untuk latihan pemrograman
       break;
       }
      
       default: System.out.println("Error: status tidak valid");
       System.exit(0);
       }
   // Tampilkan hasil
   System.out.println("Pajak sebesar Rp. " + (int)(pajak * 100) / 100.0  
   + "(x Rp. 10.000)" );
   }
}

Diagram alir statemen switch pada kode3.10 ditampilkan pada Gambar 3.5:

Gambar 3.5 Statemen switch memeriksa semua kasus dan mengeksekusi statemen-statemen pada kasus yang cocok.

Statemen switch memeriksa apakah status cocok dengan nilai 0, 1, 2, atau 3. Jika cocok, pajak terkait akan dihitung; jika tidak ada yang cocok, maka suatu pesan ditampilkan. Berikut merupakan sintaks utuh atas statemen switch:

switch (ekspresi-switch) {
  case nilai1: statemen1;
  break;
  case nilai2: statemen2;
  break;
  ...
  case nilaiN: statemenN;
  break;
  default: statemen-default;
}

Statemen switch mengikuti aturan-aturan sebagai berikut:

  • ekspresi-switch harus menghasilkan suatu nilai bertipe char, byte, short, atau int dan selalu diapit oleh sepasang kurung.
  • nilai1, nilai2,..., dan nilaiN harus memiliki tipe data yang sama dengan ekspresi-switch. Perhatikan bahwa nilai1, nilai2,..., dan nilaiN merupakan ekspresi konstanta, yang berarti bahwa tidak boleh memuat variabel, seperti 1 + x.
  • Ketika nilai dalam suatu statemen case cocok dengan nilai dalam ekspresi-switch, statemen-statemen mulai dari case ini dieksekusi sampai ditemukannya statemen break atau akhir statemen switch dijumpai.
  • Katakunci break bersifat opsional. Statemen break dengan segera mengakhiri statemen switch.
  • Kasus default, yang bersifat opsional, dapat digunakan untuk mengeksekusi aksi-aksi ketika tidak ada kasus yang cocok dengan ekspresi-switch.


·         Statemen-statemen case diperiksa secara berurutan.

Jangan lupa untuk menggunakan suatu statemen break ketika dibutuhkan. Begitu suatu case cocok, statemen-statemen mulai dari case ini dieksekusi sampai ditemukannya statemen break atau akhir statemen switch dijumpai. Sebagai contoh, kode berikut ini menampilkan karakter a tiga kali ketika ch adalah ‘a’:
switch (ch) {
case 'a': System.out.println(ch);
case 'b': System.out.println(ch);
case 'c': System.out.println(ch);
}




3.16 Ekspresi Kondisional
Anda bisa jadi ingin menugaskan suatu nilai kepada suatu variabel yang dibatasi oleh beberapa batasan. Sebagai contoh, statemen berikut ini menugaskan 1 kepada y jika x lebih besar dari 0, dan -1 kepada y jika x lebih kecil dari atau sama dengan 0:

if (x > 0)
  y = 1;
else
  y = -1;

Cara lain, Anda bisa menggunakan suatu ekspresi kondisional untuk mendapatkan hasil yang sama:

y = (x > 0)? 1: -1;

Ekspresi kondisional dapat pula dipakai tanpa menggunakan statemen if secara eksplisit. Sintaksnya adalah sebagai berikut:

ekspresi-boolean ? ekspresi1 : ekspresi2;

Hasil dari ekspresi kondisional ini adalah ekspresi1 bila ekspresi-boolean bernilai true; sebaliknya ekspresi2 bila ekspresi-boolean bernilai false.

Dimisalkan Anda ingin menugaskan suatu nilai yang lebih besar dengan rentang angka1 dan angka2 kepada maks. Anda hanya perlu menuliskan suatu statemen menggunakan ekspresi kondisional:
maks = (angka1 > angka2) ? angka1 : angka2;

Contoh lain, statemen berikut ini menampilkan pesan “angka genap” bila angka adalah genap, dan sebaliknya menampilkan pesan “angka ganjil”.

System.out.println((angka % 2 == 0) ? "angka genap" : "angka ganjil");


3.17 Keluaran Konsol Terformat
Jika Anda ingin menampilkan hanya dua dijit setelah titik desimal dari suatu nilai pecahan, Anda mungkin menuliskan kode seperti ini:

double x = 2.0 / 3;
System.out.println("x sama dengan " + (int)(x * 100) / 100.0);

Keluaran:
x sama dengan 0.66

Akan tetapi, cara yang lebih baik untuk melakukan ini adalah dengan memformat keluaran menggunakan metode printf. Sintaks untuk memanggil metode ini adalah

System.out.printf(format, item1, item2, ..., itemk)

dimana format adalah suatu string yang memuat substring dan penspesifikasi format. Suatu penspesifikasi format menentukan bagaimana suatu item ditampilkan. Suatu item bisa jadi suatu nilai numerik, suatu karakter, suatu nilai Boolean, atau suatu string. Suatu penspesifikasi sederhana mengandung suatu tanda persen (%) yang diikuti dengan suatu kode konversi. Tabel 3.8 menyajikan beberapa penspesifikasi sederhana yang sering dipakai.

Tabel 3.8 Penspesifikasi format yang sering digunakan
Penspesifikasi
Keluaran
Contoh
%b
%c
%d
%f
%e
%s
Suatu nilai Boolean
Suatu karakter
Suatu integer
Suatu pecahan
Suatu notasi saintifik standar
Suatu string
true atau false
‘a’
210
34.569000
3.4569e+01
“JAVA itu Tangguh!”

Berikut merupakan suatu contoh:



Daftar item harus sesuai dengan uratan penspesifikasi, dalam nama dan tipe. Sebagai contoh, penspesifikasi untuk hitung adalah %d dan untuk jumlah adalah %f. Secara default, suatu nilai pecahan akan ditampilkan enam dijit di belakang titik desimal. Anda bisa menspesifikasi lebar dan kepresisian seperti yang ditampilkan pada Tabel 3.9.

Tabel 3.9 Contoh-contoh menspesifikasi lebar dan kepresisian
Contoh
Keluaran
%5c


%6b


%5d



%10.2f





%10.2e




%12s


Keluaran karakter dan menambahkan empat spasi sebelum karakter item.

Keluaran nilai Boolean dan menambahkan satu spasi sebelum nilai false dan dua spasi sebelum nilai true.

Keluaran item integer dengan lebar minimum 5. Jika jumlah dijit dalam item < 5, akan ditambahkan beberapa spasi sebelum angka item. Jika jumlah dijit dalam item > 5, lebar akan ditambahkan secara otomatis.

Keluaran item pecahan dengan lebar minimum 10 termasuk satu titik desimal dan dua dijit setelah titik desimal. Jadi dialokasikan 7 dijit sebelum titik desimal. Jika jumlah dijit dalam item < 7, akan ditambahkan beberapa spasi sebelum angka item. Jika jumlah dijit dalam item > 7, lebar akan ditambahkan secara otomatis.

Keluaran item pecahan dengan lebar minimum 10 termasuk satu titik desimal, dua dijit setelah titik desimal, dan bagian eksponen. Jika lebar angka dalam notasi saintifik < 10, akan ditambahkan beberapa spasi sebelum angka item.

Keluaran string dengan lebar minimum 12 karakter. Jika jumlah item string < 12 karakter, akan ditambahkan beberapa spasi sebelum angka string. Jika jumlah item string > 12 karakter, lebar akan ditambahkan secara otomatis.

Kode yang disajikan pada awal bab ini untuk menampilkan hanya dua-dijit setelah titik desimal dari suatu nilai pecahan dapat direvisi menggunakan metode printf sebagai berikut:



Secara default, keluaran adalah rata kanan. Anda bisa menempatkan tanda minus (-) untuk menjadikan rata kiri. Sebagai contoh, kedua statemen berikut ini

System.out.printf("%8d%8s%8.1f\n", 1234, "Java", 5.6);
System.out.printf("%-8d%-8s%-8.1f \n", 1234, "Java", 5.6);

menampilkan



3.18 Derajat Keutamaan dan Asosiatifitas Operator
Derajat keutamaan dan asosiatifitas operator menentukan urutan operator yang akan dieksekusi. Dimisalkan Anda memiliki ekspresi ini:

3 + 4 * 4 > 5 * (4 + 3) – 1

Berapakah nilainya? Apakah urutan eksekusi dari operator-operator yang ada?. Secara aritmatik, ekspresi di dalam kurung lebih dahulu dieksekusi. (Kurung bisa dibuat nested, pada kasus itu, kurung terdalam lebih dahulu dieksekusi). Ketika mengevaluasi suatu ekspresi tanpa kurung, maka aturan-aturan derajat keutamaan dan asosiatifitas diterapkan pada operator-operator yang ada.

Derajat keutamaan mendefinisikan keutamaan operator-operator, seperti tertampil pada Tabel 3.10, yang memuat operator-operator yang telah Anda pelajari sejauh ini. Derajat keutamaan disajikan dengan urutan menurun dari atas ke bawah. Operator-operator dengan derajat keutamaan sama diberikan dalam satu grup.

Jika operator-operator dengan derajat keutamaan setingkat dekat satu sama lain, maka aturan asosiatifitas berlaku untuk menentukan urutan eksekusi. Semua operator biner kecuali operator penugasan merupakan asosiatifitas kiri. Sebagai contoh, karena + dan – memiliki derajat keutamaan setingkat, maka digunakan aturan asosiatifitas kiri:


Operator-operator penugasan memiliki aturan asosiatifitas kanan. Oleh karena itu, ekspresi


Tabel 3.10 Derajat Keutamaan Operator
Derajat Keutamaan
Operator


var++ dan var-- (postfiks)

+, - (unary minus dan plus), ++var dan --var (prefiks)

casting

! (not)

*, /, % (perkalian, pembagian, dan modulus)

+, - (penjumlahan dan pengurangan biner)

<, <=, >, >= (perbandingan)

==, != (persamaan)

^ (Exclusive OR)

&& (AND)

|| (OR)

=, +=, -=, *=, /=, %= (operator penugasan)
Dimisalkan a, b, dan c bernilai 1 sebelum penugasan; setelah ekspresi dieksekusi, a menjadi 6, b menjadi 6, dan c menjadi 5. Perhatikan bahwa asosiatifitas kiri untuk operator penugasan tidak masuk akal.


3.19 Dialog Konfirmasi (GUI)
Anda telah menggunakan showMessageDialog untuk menampilkan suatu kotak dialog pesan dan showInputDialog untuk menampilkan suatu kotak dialog masukan. Namun kadang kala sangat berguna untuk menjawab suatu pertanyaan dengan kotak dialog konfirmasi. Suatu konfirmasi dialog dapat diciptakan menggunakan statemen berikut ini:


Ketika suatu tombol diklik, metode memberikan suatu nilai pilihan. Nilai tersebut adalah JOptionPane.YES_OPTION(0) untuk tombol Yes, JOptionPane.NO_OPTION(1) untuk tombol No, dan JOptionPane.CANCEL_OPTION(2) untuk tombol Cancel.

Anda sekarang diminta untuk menulis-ulang kode3.3 menggunakan kotak-kotak dialog, seperti yang ditampilkan pada kode3.11. Gambar 3.6 menampilkan contoh program.

Gambar 3.6 Kotak-kotak dialog konfirmasi pada kode3.11


Kode3.11 TebakUltahDenganKotakDialog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import javax.swing.JOptionPane;

public class TebakUltahDenganKotakDialog {
   public static void main(String[] args) {
     String set1 =
      " 1 3 5 7\n" +
      " 9 11 13 15\n" +
      "17 19 21 23\n" +
      "25 27 29 31";

     String set2 =
      " 2 3 6 7\n" +
      "10 11 14 15\n" +
      "18 19 22 23\n" +
      "26 27 30 31";

     String set3 =
      " 4 5 6 7\n" +
      "12 13 14 15\n" +
      "20 21 22 23\n" +
      "28 29 30 31";

     String set4 =
      " 8 9 10 11\n" +
      "12 13 14 15\n" +
      "24 25 26 27\n" +
      "28 29 30 31";

     String set5 =
      "16 17 18 19\n" +
      "20 21 22 23\n" +
      "24 25 26 27\n" +
      "28 29 30 31";

     int hari = 0;

     // Meminta pengguna memberikan jawaban
     int jawab = JOptionPane.showConfirmDialog(null,
      "Apakah Ultah Anda pada angka-angka berikut?\n" + set1);

     if (jawab == JOptionPane.YES_OPTION)
       hari += 1;

     jawab = JOptionPane.showConfirmDialog(null,
      "Apakah Ultah Anda pada angka-angka berikut?\n" + set2);

     if (jawab == JOptionPane.YES_OPTION)
       hari += 2;

     jawab = JOptionPane.showConfirmDialog(null,
      "Apakah Ultah Anda pada angka-angka berikut?\n" + set3);

     if (jawab == JOptionPane.YES_OPTION)
       hari += 4;

     jawab = JOptionPane.showConfirmDialog(null,
      "Apakah Ultah Anda pada angka-angka berikut?\n" + set4);

     if (jawab == JOptionPane.YES_OPTION)
       hari += 8;

     jawab = JOptionPane.showConfirmDialog(null,
      "Apakah Ultah Anda pada angka-angka berikut?\n" + set5);

     if (jawab == JOptionPane.YES_OPTION)
       hari += 16;

     JOptionPane.showMessageDialog(null, "Ultah Anda adalah " +
      hari + "!");
   }
}

No comments:

Post a Comment