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.
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:
- Jika masukan pengguna cocok dengan angka lottery dengan urutan yang tepat, hadiah diberikan sebesar Rp. 10.000.
- Jika semua dijit masukan pengguna cocok dengan angka lottery, diberikan hadiah sebesar Rp. 3.000.
- 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);
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:
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:
Anda
sekarang diminta untuk menulis-ulang kode3.3 menggunakan kotak-kotak dialog,
seperti yang ditampilkan pada kode3.11. Gambar 3.6 menampilkan contoh program.
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