Saturday, December 17, 2016

Bab 4. Java Teori dan Implementasi



Bab. 4 Perulangan




4.1 Introduksi

Seandainya Anda ingin menampilkan suatu string “JAVA itu Tangguh!” seratus kali, maka hal itu menjadi pekerjaan yang melelahkan bila harus menuliskan statemen berikut ini seratus kali:

System.out.println("JAVA itu Tangguh!");
System.out.println("JAVA itu Tangguh!");
...
System.out.println("JAVA itu Tangguh!");

Jadi, bagaimana Anda mengatasi hal ini? JAVA menyediakan suatu konstruksi yang disebut dengan loop yang bisa mengendalikan berapa kali suatu operasi atau suatu runtun operasi dieksekusi secara berurutan. Menggunakan suatu statemen loop, Anda hanya perlu memberitahu komputer untuk menampilkan suatu string seratus kali, tanpa harus menuliskan kode di atas seratus kali:

int hitung = 0;
while (hitung < 100) {
   System.out.println("JAVA itu Tangguh!");
   hitung++;
}

Variabel hitung diinisialisasi 0. Loop memeriksa apakah (hitung < 100) bernilai true. Jika ya, program kemudian mengeksekusi tubuh loop untuk menampilkan pesan “JAVA itu Tangguh!” dan menginkremen hitung sebanyak 1. Program secara berulang mengeksekusi tubuh loop sampai (hitung < 100) bernilai false. Ketika (hitung < 100) bernilai false (ketika hitung bernilai 100), maka loop berhenti dan statemen setelah loop yang akan dieksekusi.

Loop merupakan suatu konstruksi yang bisa mengendalikan eksekusi berulang atas suatu blok statemen. Konsep loop sangat penting bagi pemrograman. JAVA menyediakan tiga tipe statemen loop: loop while, loop do-while, dan loop for.


4.2 Loop while

Sintaks untuk loop while adalah sebagai berikut:

while (kondisi-loop) {
  // tubuh loop
  Statemen-statemen;
}

Gambar 4.1a menunjukkan diagram alir loop while. Bagian loop yang memuat statemen-statemen yang akan dieksekusi secara berulang disebut dengan tubuh loop. Eksekusi satu-kali atas tubuh loop disebut dengan iterasi loop. Setiap loop memiliki kondisi-loop atau kondisi-kontinuasi-loop, suatu ekspresi Boolean yang mengendalikan eksekusi tubuh loop. Kondisi tersebut dievaluasi setiap iterasi untuk menentukan apakah tubuh loop dieksekusi atau tidak. Jika hasil evaluasi terhadap kondisi-loop bernilai true, maka tubuh loop dieksekusi; jika bernilai false, maka keseluruhan loop berhenti dan kendali program beralih kepada statemen yang mengikuti tubuh loop while.

Loop untuk menampilkan JAVA itu Tangguh! seratus kali yang telah dikenalkan sebelumnya merupakan salah satu contoh suatu loop while. Diagram alir program tersebut disajikan pada Gambar 4.1b. kondisi-loop (hitung < 100) dan tubuh loop yang memuat dua statemen ditampilkan sebagai berikut:





Gambar 4.1 Loop while secara berulang mengeksekusi statemen-statemen di dalam tubuh loop ketika hasil evaluasi terhadap kondisi-kontinuasi-loop bernilai true.


Berikut adalah suatu contoh lain untuk membantu Anda memahami bagaimana suatu loop while bekerja:

int jumlah = 0, i = 1;
while (i < 10) {
  jumlah = jumlah + i;
  i++;
}
System.out.println("Jumlah adalah " + jumlah); // jumlah adalah 45


Jika (i < 10) bernilai true, maka program menambahkan i kepada jumlah. Variabel i diinisialisasi 1, kemudian diinkremen menjadi 2, 3, sampai 10. Ketika i menjadi 10, i < 10 bernilai false, dan loop berhenti. Jadi, jumlah menjadi 1 + 2 + 3 + ... + 9 = 45.


Apa yang bakal terjadi bila loop secara salah ditulis sebagai berikut:

int jumlah = 0, i = 1;
while (i < 10) {
  jumlah = jumlah + i;
}

Loop ini tidak akan pernah berhenti, karena i selalu bernilai 1 dan i < 10 selalu bernilai true.

Pastikan bahwa kondisi-kontinuasi-loop pada akhirnya bernilai false sehingga program akan berhenti. Kesalahan pemrograman yang umum terjadi adalah karena loop tidak pernah berhenti. Yaitu, program tidak bisa menghentikan loop karena kondisi-kontinuasi-loop selalu bernilai true.

Programmer juga seringkali mengeksekusi tubuh loop satu kali lebih atau satu kali kurang dari yang diharapkan. Hal ini dinamai dengan error off-by-one. Sebagai contoh, loop berikut ini menampilkan JAVA itu Tangguh! sebanyak 101 kali, bukan 100 kali. Keselahan terletak pada kondisi-kontinuasi-loop, yang seharusnya adalah hitung < 100, bukan hitung <= 100.

int hitung = 0;
while (hitung <= 100) {
  System.out.println("JAVA itu Tangguh!");
  count++;
}


4.2.1 Masalah: Menebak Angka
Tantangan di sini adalah menebak angka yang dibangkitkan suatu komputer. Anda akan menulis suatu program untuk secara acak membangkitkan suatu integer antara 0 sampai 100. Program kemudian meminta pengguna untuk memasukkan suatu angka secara kontinyu sampai angka tersebut cocok dengan angka yang dibangkitkan secara acak oleh komputer. Untuk setiap masukan pengguna, program akan memberitahukan apakah masukan terlalu rendah atau terlalu tinggi, sehingga pengguna bisa membuat tebakan berikutnya secara cerdas.

Bagaimana Anda menulis program ini? Apakah Anda dengan segera mengkode program? Tentu tidak. Anda perlu waktu untuk berpikir. Berpikir bagaimana Anda akan menyelesaikan masalah tanpa menulis suatu program. Anda pertama-tama perlu untuk membangkitkan secara acak suatu angka antara 0 sampai 100, kemudian meminta pengguna untuk memasukkan sebuah tebakan, dan kemudian membandingkan tebakan tersebut dengan angka acak yang telah dibangkitkan sebelumnya. Anda mungkin memiliki draft dasar program pada kode4.1 sebagai berikut:

Kode4.1 TebakAngkaSatuKali.java

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

public class TebakAngkaSatuKali {
   public static void main(String[] args) {
     // Membangkitkan suatu angka acak untuk ditebak
     int angka = (int)(Math.random() * 101);

     Scanner masukan = new Scanner(System.in);
     System.out.println("Tebak suatu angka dari 0 sampai 100");

     // Meminta pengguna memasukkan tebakan
     System.out.print("\nBerikan tebakan Anda: ");
     int tebak = masukan.nextInt();

     if (tebak == angka)
       System.out.println("Ya, Anda benar, Angka Magic adalah " + angka);
     else if (tebak > angka)
       System.out.println("Tebakan Anda terlalu tinggi");
     else
       System.out.println("Tebakan Anda terlalu rendah");
   }
}

Keluaran:

Tebak suatu angka dari 0 sampai 100

Berikan tebakan Anda: 50
Tebakan Anda terlalu tinggi

Jika Anda menjalankah program ini, maka pengguna hanya ditawarkan memberi tebakan sekali saja. Untuk membuat pengguna bisa memasukkan tebakan berkali-kali, Anda perlu menempatkan kode ini pada baris 11-20 dalam suatu loop sebagai berikut:

while (true) {
// Meminta pengguna memasukkan tebakan
     System.out.print("\nBerikan tebakan Anda: ");
     int tebak = masukan.nextInt();
     if (tebak == angka)
       System.out.println("Ya, Anda benar, Angka Magic adalah " + angka);
     else if (tebak > angka)
       System.out.println("Tebakan Anda terlalu tinggi");
     else
       System.out.println("Tebakan Anda terlalu rendah");
} // Akhir loop

Loop di atas akan secara berulang meminta pengguna untuk memberikan tebakan. Akan tetapi, loop ini tidak benar, karena tidak pernah berhenti. Ketika tebak cocok dengan angka, maka loop harus berhenti. Jadi, loop di atas direvisi menjadi:

while (tebak != angka) {
// Meminta pengguna memasukkan tebakan
     System.out.print("\nBerikan tebakan Anda: ");
     int tebak = masukan.nextInt();
     if (tebak == angka)
       System.out.println("Ya, Anda benar, Angka Magic adalah " + angka);
     else if (tebak > angka)
       System.out.println("Tebakan Anda terlalu tinggi");
     else
       System.out.println("Tebakan Anda terlalu rendah");
} // Akhir loop

Kode program utuh ditampilkan pada kode4.2 sebagai berikut:

Kode4.2 TebakAngka.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
import java.util.Scanner;

public class TebakAngka {
  public static void main(String[] args) {
     // Membangkitkan suatu angka acak untuk ditebak
     int angka = (int)(Math.random() * 101);

     Scanner masukan = new Scanner(System.in);
     System.out.println("Tebak suatu angka dari 0 sampai 100");

     int tebak = -1;
     while (tebak != angka) {
       // Meminta pengguna memasukkan tebakan
       System.out.print("\nBerikan tebakan Anda: ");
       int tebak = masukan.nextInt();

       if (tebak == angka)
         System.out.println("Ya, Anda benar, Angka Magic adalah " + angka);
       else if (tebak > angka)
         System.out.println("Tebakan Anda terlalu tinggi");
       else
         System.out.println("Tebakan Anda terlalu rendah");
     } //Akhir loop
  }
}

Keluaran:

Tebak suatu angka dari 0 sampai 100

Berikan tebakan Anda: 50
Tebakan Anda terlalu tinggi

Berikan tebakan Anda: 25
Tebakan Anda terlalu tinggi

Berikan tebakan Anda: 12
Tebakan Anda terlalu rendah

Berikan tebakan Anda: 20
Tebakan Anda terlalu tinggi

Berikan tebakan Anda: 15
Tebakan Anda terlalu tinggi

Berikan tebakan Anda: 13
Ya, Anda benar, Angka Magic adalah 13
Perhatikan bahwa tebak diinisialisasi dengan -1. Bila menginisialisasi tebak dengan suatu angka antara 0 sampai 100 akan menjadi masalah, karena bisa jadi itu angka yang akan ditebak.


4.2.2 Strategi Perancangan Loop
Menulis suatu loop yang benar bukanlah perkara mudah bagi programmer pemula. Perhatikan tiga langkah ketika menulis suatu loop:
Identifikasi statemen - statemen yang perlu dieksekusi berulangkali.
Gabungkan statemen-statemen tersebut menjadi seperti ini:

while (true) {
  Statemen - statemen;
}

Kodekan kondisi-kontinuasi-loop dan tambahkan statemen-statemen yang perlu untuk mengendalikan loop:

while (kondisi-kontinuasi-loop) {
  Statemen - statemen;
  Statemen – statemen tambahan untuk mengendalikan loop;
}


4.2.3 Masalah: Suatu Perangkat Pembelajaran Matematika Lanjut
Program perangkat pembelajaran Matematika pada kode3.4, KuisPengurangan.java, hanya menghasilkan satu pertanyaan pada saat program berjalan. Anda bisa menggunakan suatu loop untuk menghasilkan beberapa pertanyaan secara berulang. Bagaimana Anda menulis suatu kode yang bisa menghasilkan lima pertanyaan? Ikuti strategi perancangan loop. Pertama, identifikasi statemen - statemen yang perlu dieksekusi berulangkali. Yaitu, statemen-statemen untuk membangkitkan dua integer secara acak, meminta pengguna untuk memasukkan jawaban hasil pengurangan, dan menilai kebenaran jawaban. Kedua, gabungkan statemen-statemen tersebut dalam suatu loop. Ketiga, tambahkan suatu variabel kendali loop dan kondisi-kontinuasi-loop untuk mengeksekusi loop sebanyak lima kali.

Kode4.3 memberikan suatu program untuk membangkitkan lima pertanyaan dan, setelah seorang siswa menjawab kelima pertanyaan tersebut, program kemudian melaporkan jumlah jawaban yang benar. Program juga menayangkan waktu yang dihabiskan untuk menjawab kelima pertanyaan tersebut.

Kode4.3 LoopKuisPengurangan.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
import java.util.Scanner;

public class LoopKuisPengurangan {
   public static void main(String[] args) {
     final int JUMLAH_PERTANYAAN = 5; // Jumlah pertanyaan
     int hitungBenar = 0; // Menghitung jumlah jawaban yang benar
     int hitung = 0;      // Menghitung jumlah pertanyaan
     long waktuMulai = System.currentTimeMillis();
     String keluaran = ""; // String keluaran diinisialisasi kosong
     Scanner masukan = new Scanner(System.in);

     while (hitung < JUMLAH_PERTANYAAN) {
      // 1. Membangkitkan dua integer satu-dijit secara acak
      int angka1 = (int)(Math.random() * 10);
      int angka2 = (int)(Math.random() * 10);

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

      // 3. Meminta siswa untuk menjawab "Berapakah angka1 - angka2?"
      System.out.print(
        "Berapakah " + angka1 + " - " + angka2 + "? ");
      int jawab = masukan.nextInt();

      // 4. Grade the answer and display the result
      if (angka1 - angka2 == jawab) {
        System.out.println("Anda benar!");
        hitungBenar++;
      }
      else
        System.out.println("Jawaban Anda salah.\n" + angka1
        + " - " + angka2 + " seharusnya " + (angka1 - angka2));

      // Inkremen hitung
      hitung++;

      keluaran += "\n" + angka1 + "-" + angka2 + "=" + jawab +
       ((angka1 - angka2 == jawab) ? " benar" : " salah");
   }

   long waktuAkhir = System.currentTimeMillis();
   long waktuUji = waktuAkhir - waktuMulai;

   System.out.println("Jumlah yang benar adalah " + hitungBenar +
    "\nWaktu uji adalah " + waktuUji / 1000 + " detik\n" + keluaran);
   }
}

Keluaran:

Berapakah 8 - 2? 4
Jawaban Anda salah.
8 - 2 seharusnya 6

Berapakah 3 - 0? 5
Jawaban Anda salah.
3 - 0 seharusnya 3

Berapakah 7 - 7? 0
Anda benar!

Berapakah 6 - 4? 2
Anda benar!

Berapakah 7 - 5? 3
Jawaban Anda salah.
7 - 5 seharusnya 2
Jumlah yang benar adalah 2
Waktu uji adalah 14 detik

8-2=4 salah
3-0=5 salah
7-7=0 benar
6-4=2 benar
7-5=3 salah


Program menggunakan variabel kontrol hitung untuk mengendalikan eksekusi loop. hitung diinisialisasi 0 (baris 7) dan diinkremen sebesar 1 pada setiap iterasi (baris 39). Pertanyaan pengurangan ditampilkan dan diproses setiap iterasi. Program mendapatkan waktu sebelum test pada baris 8 dan waktu setelah test pada baris 45, dan menghitung jeda waktu pada baris 46. Waktu yang didapatkan dalam ukuran milidetik dan dikonversi menjadi detik pada baris 49.


4.2.4 Mengendalikan Suatu Loop dengan Nilai Sentinel
Cara umum lainnya dalam mengendalikan suatu loop adalah dengan menetapkan suatu nilai spesial pada saat membaca dan memproses sekelompok nilai. Nilai masukan spesial ini, yang dikenal dengan nilai sentinel,  menandai akhir suatu loop. Suatu loop yang menggunakan suatu nilai sentinel untuk mengendalikan eksekusi disebut juga dengan loop-terkendali-sentinel.

Kode4.4 memberikan suatu program yang membaca dan menghitung penjumlahan atas sejumlah integer. Masukan 0 menandakan akhir loop. Apakah Anda perlu mendeklarasikan suatu variabel baru untuk setiap nilai masukan? Tidak. Anda bisa hanya menggunakan satu variabel, data, pada baris 12, untuk menyimpan nilai masukan dan menggunakan suatu variabel, jumlah, pada baris 15, untuk menyimpan total penjumlahan. Kapan saja suatu nilai dibaca, akan ditugaskan kepada data dan, jika nilai masukan tidak bernilai 0, maka akan ditambahkan kepada jumlah (baris 17).

Kode4.4 NilaiSentinel.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
import java.util.Scanner;

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

    // Membaca data inisial
    System.out.print(
      "Masukkan suatu nilai int (program berhenti bila masukan adalah 0): ");
    int data = masukan.nextInt();

    // Tetap membaca sampai masukan adalah 0
    int jumlah = 0;
    while (data != 0) {
       jumlah += data;

      // Membaca data selanjutnya
      System.out.print(
       "Masukkan suatu nilai int (program berhenti bila masukan adalah 0): ");
      data = masukan.nextInt();
    }

  System.out.println("Jumlah adalah " + jumlah);
  }
}

Keluaran:

Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 3
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 4
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 5
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 0
Jumlah adalah 12

Jika data tidak 0, maka data ditambahkan ke jumlah (baris 17) dan masukan berikutnya dibaca (baris 20 – 22). Jika data bernilai 0, maka tubuh loop tidak akan dieksekusi dan loop while berhenti. Nilai masukan 0 merupakan nilai sentinel bagi loop while ini. Perhatikan bahwa bila nilai masukan pertama dibaca bernilai 0, maka tubuh loop tidak akan pernah dieksekusi.

Jangan gunakan nilai pecahan untuk pengendali loop. Karena nilai pecahan merupakan pendekatan dari nilai sebenarnya, maka menggunakannya dalam kendali loop akan menyebabkan hasil yang tidak tepat. Perhatikan kode berikut ini untuk menghitung 1 + 0.9 + 0.8 + ... + 0.1:

double item = 1; double sum = 0;
while (item != 0) { // Tidak ada jaminan item akan bernilai 0
  jumlah += item;
  item -= 0.1;
}
System.out.println(jumlah);
Nilai variabel item dimulai dari 1 dan direduksi sebesar 0.1 setiap kali tubuh loop dieksekusi. Loop akan berhenti bila item bernilai 0. Akan tetapi, tidak ada jaminan item akan 0 secara eksak, karena aritmatika pecahan bersifat pendekatan. Loop di atas kelihatan tidak masalah, tetapi sebenarnya merupakan loop tak-berhingga.


4.2.5 Redireksi Masukan dan Keluaran
Pada contoh sebelumnya, jika Anda memiliki data yang sangat banyak untuk dimasukkan, maka akan sangat melelahkan bila mengetikkannya lewat keyboard. Anda bisa menyimpan data tersebut dalam suatu file teks (masing-masing item data dipisahkan oleh spasi putih), misalnya masukan.txt, dan menjalankan program menggunakan perintah berikut ini:

java NilaiSentinel < masukan.txt

Perintah ini disebut pula dengan redireksi masukan. Program mengambil masukan dari file masukan.txt, bukan dari keyboard. Seandainya isi file masukan.txt adalah

2 3 4 5 6 7 8 9 12 23 32
23 45 67 89 92 12 34 35 3 1 2 4 0

maka program akan menghasilkan jumlah sebesar 518.

Dengan cara yang sama, ada juga redireksi keluaran, yang mengirimkan keluaran ke suatu file (bukan ditampilkan pada konsol). Perintah untuk redireksi keluaran adalah
java NilaiSentinel > keluaran.txt

Redireksi masukan dan keluaran dapat digunakan dalam perintah yang sama. Sebagai contoh, perintah berikut memperoleh masukan dari file masukan.txt dan mengirimkan keluarannya kepada file keluaran.txt:

java NilaiSentinel < masukan.txt > keluaran.txt

4.3 Loop do-while
Loop do-while merupakan variasi dari loop while. Sintaks loop ini adalah sebagai berikut:

do {
  // Tubuh loop;
  Statemen-statemen;
} while (kondisi-kontinuasi-loop);

Diagram alir eksekusi loop do-while diberikan pada Gambar 4.2.

Gambar 4.2 Loop do-while mengeksekusi tubuh loop terlebih dahulu, kemudian memeriksa kondisi-kontinuasi-loop untuk menentukan apakah loop berhenti atau lanjut.

Tubuh loop dieksekusi terlebih dahulu. Kemudian kondisi-kontinuasi-loop dievaluasi. Jika hasil evaluasi tersebut bernilai true, maka tubuh loop dieksekusi kembali; jika bernilai false, maka loop do-while berhenti. Perbedaan antara loop while dan loop do-while adalah urutan evaluasi terhadap kondisi-kontinuasi-loop dan eksekusi tubuh loop. Anda bisa menulis-ulang kode4.4 menggunakan loop do-while, seperti yang ditampilkan pada kode4.5:

Kode4.5 UjiDoWhile.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
import java.util.Scanner;

public class UjiDoWhile {
  /** Metode utama */
  public static void main(String[] args) {
    int data;
    int jumlah = 0;

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

    // Tetap membaca sampai masukan adalah 0
   do {
      // Membaca data selanjutnya
      System.out.print(
       "Masukkan suatu nilai int (program berhenti bila masukan adalah 0): ");
      data = masukan.nextInt();
     
      jumlah += data;
   } while (data != 0);
   
   System.out.println("Jumlah adalah " + jumlah);
  }
}

Keluaran:

Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 3
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 5
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 6
Masukkan suatu nilai int (program berhenti bila masukan adalah 0): 0
Jumlah adalah 14


4.4 Loop for
Anda mungkin sering menuliskan loop dalam format umum seperti ini:

i = nilaiAwal; // Menginisialisasi variabel kontrol loop
while (i < nilaiAkhir) {
  // Tubuh loop
  ...
  i++; // Memperbarui variabel kontrol loop
}

Suatu loop for dapat digunakan untuk menyederhanakan loop di atas:

for (i = nilaiAwal; i < nilaiAkhir; i++) {
  // Tubuh loop
  ...
}

Pada umumnya, sintaks untuk suatu loop for ditunjukkan di bawah ini:

for (aksi-awal; kondisi-kontinuasi-loop; aksi-setelah-tiap-iterasi) {
  // Tubuh loop;
  Statemen - statemen;
}

Diagram alir loop for ditampilkan pada Gambar 4.3a. Statemen loop for diawali dengan katakunci for, diikuti dengan sepasang kurung yang mengapit struktur kontrol loop. Struktur ini memuat aksi-awal, kondisi-kontinuasi-loop, dan aksi-setelah-tiap-iterasi. Struktur kontrol diikuti oleh tubuh loop yang diapit oleh sepasang kurung kurawal (bila lebih dari satu baris statemen). aksi-awal, kondisi-kontinuasi-loop, dan aksi-setelah-tiap-iterasi dipisahkan oleh tanda koma.

Gambar 4.3  Suatu loop for melakukan suatu aksi awal sekali, kemudian secara berulang mengeksekusi statemen-statemen dalam tubuh loop, dan terakhir melakukan suatu aksi setelah suatu iterasi dimana di dalamnya evaluasi terhadap kondisi-kontinuasi-loop bernilai true.


Suatu loop for biasanya menggunakan suatu variabel untuk mengendalikan berapa kali tubuh loop akan dieksekusi dan menentukan kapan loop akan berhenti. Variabel ini disebut juga dengan variabel kontrol. aksi-awal menginisialisasi variabel kontrol, aksi-setelah-tiap-terasi menginkremen atau mendekremen variabel kontrol, dan kondisi-kontinuasi-loop menguji apakah variabel kontrol telah meraih suatu nilai terminasi. Sebagai contoh, loop for berikut ini menampilkan JAVA itu Tangguh! sebanyak seratus kali:

int i;
for (i = 0; i < 100; i++) {
  System.out.println("JAVA itu Tangguh!");
}

Diagram alir kode di atas ditampilkan pada Gambar 4.3b. Loop for menginisialisasi i dengan 0, kemudian secara berulang mengeksekusi statemen println dan mengevaluasi i++ pada saat i kurang dari 100.

aksi-setelah-tiap-iterasi, i++, adalah suatu statemen yang memperbarui variabel kontrol. Statemen ini dieksekusi setelah (akhir) tiap iterasi. Statemen ini menginkremen variabel kontrol. Pada gilirannya, nilai variabel kontrol memaksa kondisi-kontinuasi-loop menjadi bernilai false. Kalau tidak, maka loop akan menjadi tak-berhingga.

Variabel kontrol loop dapat dideklarasikan dan diinisialisasi di dalam loop. Berikut adalah contohnya:

for (int i = 0 ; i < 100; i++) {
  System.out.println("JAVA itu Tangguh!");
}

Jika hanya terdapat satu statemen dalam tubuh loop, maka kurung kurawal dapat diabaikan.

Variabel kontrol harus dideklarasikan di dalam struktur kontrol atau sebelum loop. Jika variabel kontrol loop hanya digunakan di dalam loop, tidak di tempat lain, maka mendeklarasikannya di dalam aksi-awal loop for merupakan suatu teknik pemrograman yang baik. Jika variabel kontrol dideklarasikan di dalam struktur kontrol, maka variabel tersebut tidak bisa direferensikan di luar loop.

aksi-awal di dalam suatu loop for dapat berupa beberapa ekspresi penugasan atau beberapa statemen deklarasi yang masing-masing dipisahkan oleh tanda koma. Sebagai contoh,

for (int i = 0, j = 0 ; (i + j < 10); i++, j++) {
  // Lakukan sesuatu
}

aksi-setelah-tiap-iterasi di dalam suatu loop for dapat berupa beberapa statemen deklarasi yang masing-masing dipisahkan oleh tanda koma. Sebagai contoh,

for (int i = 1; i < 100; System.out.println(i), i++);

Contoh di atas memang benar, namun merupakan contoh teknik pemrograman yang buruk, karena membuat kode susah untuk dibaca. Normalnya, Anda mendeklarasikan dan menginisialisasi suatu variabel kontrol sebagai aksi-awal dan menginkremen dan mendekremen variabel kontrol sebagai aksi-setelah-tiap-iterasi.

Jika kondisi-kontinuasi-loop di dalam loop for diabaikan, maka secara implisit hal itu benar. Jadi, statemen yang ada pada (a) di bawah ini, yang merupakan suatu loop tak-berhingga, ekivalen dengan (b). Untuk menghidari kebingungan, loop ekivalen diberikan pada (c):






4.5 Loop Mana yang Digunakan?
Loop for dan loop while disebut dengan loop pretest karena kondisi kontinuasi diperiksa sebelum tubuh loop dieksekusi. Loop do-while disebut dengan loop posttest karena kondisi kontinuasi diperiksa setelah tubuh loop dieksekusi. Tiga format loop: for, while dan do-while adalah ekivalen. Oleh karena itu, Anda bisa membuat salah satu dari ketiga format loop untuk melakukan tugas yang sama. Sebagai contoh, suatu loop while pada (a) dapat selalu dikonversi menjadi loop for pada (b):


Suatu loop for pada (a) pada gambar di bawah ini secara umum dapat dikonversi menjadi loop while pada (b) kecuali untuk beberapa kasus spesial:



Menambahkan titik koma pada akhir for, sebelum tubuh loop, merupakan suatu kesalahan yang umum terjadi, seperti yang ditampilkan pada (a) di bawah ini. Pada (a) titik koma menandakan akhir loop secara prematur. Tubuh loop pada kasus tersebut sebenarnya kosong, seperti yang ditunjukkan pada (b). Jadi, (a) dan (b) adalah ekivalen.


Hal yang sama, loop pada (c) juga salah dan ekivalen dengan loop pada (d):


Error-error di atas terjadi karena penggunaan gaya blok next-line. Penggunaan gaya blok end-of-line dapat menghindarkan error ini.

Pada kasus loop do-while, tanda titik koma dibutuhkan untuk mengakhiri loop.




4.6 Loop  Nested
Loop nested memuat suatu loop sebelah luar dan satu atau lebih loop sebelah dalam. Setiap kali loop sebelah luar diulangi, loop-loop sebelah dalam juga diulangi.

Kode4.6 TabelPerkalian.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
public class TabelPerkalian {
   /** Metode utama */
  public static void main(String[] args) {
   // Menampilkan kepala tabel
   System.out.println("               Tabel Perkalian");

   // Menampilkan judul angka
   System.out.print("    ");
   for (int j = 1; j <= 9; j++)
     System.out.print("   " + j);

   System.out.println("\n———————————————————————————————————————");

   // Mencetak tubuh tabel
   for (int i = 1; i <= 9; i++) {
     System.out.print(i + " | ");
     for (int j = 1; j <= 9; j++) {
       // Menampilkan perkalian dan ratakan secara layak
       System.out.printf("%4d", i * j);
     }
     System.out.println();
   }
  }
}

Keluaran:

          Tabel Perkalian
       1   2   3   4   5   6   7   8   9
———————————————————————————————————————
1 |    1   2   3   4   5   6   7   8   9
2 |    2   4   6   8  10  12  14  16  18
3 |    3   6   9  12  15  18  21  24  27
4 |    4   8  12  16  20  24  28  32  36
5 |    5  10  15  20  25  30  35  40  45
6 |    6  12  18  24  30  36  42  48  54
7 |    7  14  21  28  35  42  49  56  63
8 |    8  16  24  32  40  48  56  64  72
9 |    9  18  27  36  45  54  63  72  81


4.7 Meminimalkan Error Numerik
Error numerik yang melibatkan angka-angka pecahan merupakan sesuatu yang tidak bisa dihindari. Bagain ini ditujukan untuk mendiskusikan bagaimana meminimalkan error jenis ini lewat contoh.

Kode4.7 menyajikan suatu contoh yang menghitung jumlah suatu deret yang dimulai dari 0.01 dan berakhir dengan 1.0. Angka-angka dalam deret ini akan diinkremen sebesar 0.01, seperti 0.01 + 0.02 + 0.03 dan seterusnya.

Kode4.7 TestJumlah.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class TestJumlah {
  public static void main(String[] args) {
    // Menginisialisasi jumlah
    float jumlah = 0;

    // Tambahkan 0.01, 0.02, ..., 0.99, 1 kepada jumlah
    for (float i = 0.01f; i <= 1.0f; i = i + 0.01f)
      jumlah += i;

    // Tampilkan hasil
    System.out.println("Jumlah adalah " + jumlah);
  }
}

Keluaran:

Jumlah adalah 50.499985

Loop for (baris 7-8) secara berulang menjumlahkan variabel kontrol i kepada jumlah. Variabel ini, dimulai dengan 0.01, diinkremen sebesar 0.01 pada akhir setiap iterasi. Loop berhenti ketika i melebih 1.0.

aksi-awal pada loop for dapat berupa sembarang statemen, tetapi seringkali digunakan untuk menginisialisasi suatu variabel kontrol. Dari contoh ini, Anda dapat melihat bahwa suatu variabel kontrol dapat berupa suatu tipe float.

jumlah secara eksak sebenarnya adalah 50.50, tetapi keluaran yang diberikan adalah 50.499985. Hasil ini tidak tepat karena komputer menggunakan komputer menggunakan sejumlah bit yang tetap untuk merepresentasikan angka-angka pecahan, jadi kadangkala terdapat beberapa angka pecahan yang tidak direpresentasikan secara tepat. Jika Anda mengubah float menjadi double, sebagai berikut, Anda pasti melihat sedikit perbaikan dalam kepresisian, karena suatu variabel double menyediakan 64-bit, sedangkan float hanya menyediakan 32 bit, untuk merepresentasikan angka pecahan.

// Menginisialisasi jumlah
double jumlah = 0;

// Menambahkan 0.01, 0.02, ..., 0.99, 1 kepada jumlah
for (double i = 0.01; i <= 1.0; i = i + 0.01)
  jumlah += i;

Namun, Anda juga akan heran bila keluarannya menjadi 49.50000000000003. Apa yang salah? Jika Anda menampilkan i untuk setiap iterasi dalam loop, Anda akan melihat bahwa i yang terakhir lebih besar sedikit dari 1 (tidak persis 1). Hal ini menyebabkan i yang terakhir tidak dijumlahkan kepada jumlah. Masalah fundamental di sini adalah karena angka-angka pecahan direpresentasikan dengan pendekatan. Untuk mengatasi masalah ini, gunakan suatu integer hitung untuk memastikan bahwa semua angka dijumlahkan kepada jumlah. Inilah loop tersebut:

double nilaiSekarang = 0.01;
for (int hitung = 0; hitung < 100; hitung++)  {
  jumlah += nilaiSekarang;
  nilaiSekarang += 0.01;
}

Setelah loop tersebut dieksekusi, jumlah sebesar 50.50000000000003. Loop ini menjumlahkan angka-angka dari kecil ke besar. Apa yang terjadi bila Anda menjumlahkan angka-angka dari besar ke kecil (yaitu, 1.0, 0.99, 0.98, ..., 0.02, 0.01) sebagai berikut:

double nilaiSekarang = 1.0;
for (int hitung = 0; hitung < 100; hitung++)  {
  jumlah += nilaiSekarang;
  nilaiSekarang -= 0.01;
}

Setelah loop ini dieksekusi, jumlah menjadi sebesar 50.49999999999995. Menjumlahkan angka-angka dari besar ke kecil kurang akurat bila dibandingkan dengan menjumlahkan dari kecil ke besar. Jadi di sini disimpulkan bahwa penjumlahan angka-angka pecahan dari kecil ke besar dapat dipakai untuk meminimalkan error numerik.


4.8 Studi Kasus
Loop merupakan hal yang vital dalam pemrograman. Kemampuan untuk menuliskan suatu loop dalam program JAVA merupakan hal penting. Jika Anda bisa menulis program menggunakan loop, berarti Anda tahu bagaimana memprogram!. Karena alasan ini, bab ini menyajikan tiga contoh tambahan tentang bagaimana menyelesaikan masalah menggunakan loop.

4.8.1 Masalah: Mencari GCD
GCD (greatest common divisor, pembagi bersama terbesar)  atas dua integer 4 dan 2 adalah 2. GCD antara 16 dan 24 adalah 8. Bagaimana Anda menemukan GCD? Dimisalkan dua masukan integer n1 dan n2. Anda tahu bahwa satu bisa jadi merupakan suatu pembagi bersama, tetapi 1 tidak mungkin menjadi pembagi bersama terbesar. Jadi, Anda perlu memeriksa apakah k ( untuk k = 2, 3, 4, dan seterusnya) adalah suatu pembagi bersama terbesar untuk n1 dan n2, sampai k lebih besar dari n1 atau n2.

Pembagi bersama yang ditemukan disimpan dalam suatu variabel, gcd. Pada saat awal, gcd diberi nilai 1. Kapan saja suatu pembagi bersama yang baru ditemukan, maka nilai tersebut menjadi nilai gcd yang baru. Ketika semua pembagi bersama mulai dari 2 sampai n1 atau n2 selesai diperiksa, maka nilai gcd yang terakhir menjadi nilai GCD. Ide ini diterjemahkan menjadi loop berikut ini:

int gcd = 1;         // Inisialisasi gcd dengan 1
int k = 2;           // gcd yang mungkin

while (k <= n1 && k <= n2) {
  if (n1 % k == 0 && n2 % k == 0)
    gcd = k;         // Memperbarui gcd
  k++;               // gcd berikutnya yang mungkin
}

Kode4.8 menyajikan program yang meminta pengguna untuk memasukkan dua integer positif dan yang mencari GCD atas dua integer tersebut.

Kode4.8 PembagiBersamaTerbesar.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
import java.util.Scanner;

public class PembagiBersamaTerbesar {
  /** Metode utama */
  public static void main(String[] args) {
  // Menciptakan Scanner
  Scanner masukan = new Scanner(System.in);

  // Meminta pengguna memasukkan dua integer
  System.out.print("Masukkan integer positif pertama: ");
  int n1 = masukan.nextInt();
  System.out.print("Masukkan integer positif kedua: ");
  int n2 = masukan.nextInt();
 
  int gcd = 1; // nilai awal gcd
  int k = 2;   // gcd yang mungkin
  while (k <= n1 && k <= n2) {
    if (n1 % k == 0 && n2 % k == 0)
      gcd = k; // Update gcd
    k++;
  }

 System.out.println("Pembagi Bersama Terbesar untuk " + n1 +
 " dan " + n2 + " adalah " + gcd);
 }
}

Keluaran:

Masukkan integer positif pertama: 125
Masukkan integer positif kedua: 5635
Pembagi Bersama Terbesar untuk 125 dan 5635 adalah 5

Masukkan integer positif pertama: 234
Masukkan integer positif kedua: 26728
Pembagi Bersama Terbesar untuk 234 dan 26728 adalah 26

Bagaimana Anda menulis program tersebut? Apakah Anda langsung menuliskannya? Tentu tidak. Sangat penting bagi Anda untuk berpikir sebelum menulis. Berpikir dapat memampukan Anda untuk menghasilkan solusi logis untuk masalah yang sedang dihadapi. Begitu Anda menemukan solusinya, Anda hanya perlu menerjemahkannya dalam program JAVA. Penerjemahan ide menjadi program JAVA bukanlah unik. Sebagai contoh, Anda bisa menggunakan suatu loop for untuk kode4.8 sebagai berikut:

for (int k = 2; k <= n1 && k <= n2; k++) {
  if (n1 % k == 0 && n2 % k == 0)
    gcd = k;
}

Suatu masalah seringkali memiliki banyak penyelesaian. Masalah GCD sendiri bisa diselesaikan dengan banyak cara. Salah satu solusi yang efisien adalah menggunakan algoritma Euclidean.


4.8.2 Masalah: Memprediksi Uang Kuliah
Dimisalkan uang kuliah tahun ini adalah sebesar Rp. 10.000 dan bertambah setiap tahun sebesar 7%. Dalam berapa tahunkah uang kuliah menjadi dua kali lipat?

Sebelum Anda menulis suatu program untuk menyelesaikan masalah ini, pertama-tama selesaikan secara analitik dengan tangan. Besar uang kuliah tahun kedua adalah 1.07 * uang kuliah tahun pertama. Besar uang kuliah tahun depan adalah 1.07 * uang kuliah tahun ini. Jadi, besar uang kuliah setiap tahun dapat dihitung sebagai berikut:

double uang_kul = 10000; int tahun = 1   // Tahun 1
uang_kul = uang_kul * 1.07; tahun++;     // Tahun 2
uang_kul = uang_kul * 1.07; tahun++;     // Tahun 3
uang_kul = uang_kul * 1.07; tahun++;     // Tahun 4
...

Jika terus dihitung, maka akan ditemukan tahun dimana nilai uang_kul paling sedikit 20000. Pada saat itu, Anda akan mengetahui berapa tahun yang dibutuhkan agar uang kuliah menjadi dua kali lipat. Sekarang Anda bisa menerjemahkan logika di atas menjadi loop sebagai berikut:

double uang_kul = 10000; // Tahun 1
int tahun = 1;
while (uang_kul < 20000) {
  uang_kul = uang_kul * 1.07;
  tahun++;
}

Program utuh ditampilkan pada kode4.9 berikut ini:

Kode4.9 PrediksiUangKuliah.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class PrediksiUangKuliah {
  public static void main(String[] args) {
    double uang_kul = 10000; // Tahun 1
    int tahun = 1;
    while (uang_kul < 20000) {
      uang_kul = uang_kul * 1.07;
      tahun++;
    }

    System.out.println("Uang Kuliah akan menjadi dua kali lipat dalam "
     + tahun + " tahun");
 }
}

Keluaran:

Uang Kuliah akan menjadi dua kali lipat dalam 12 tahun

Loop while (baris 5-8) digunakan untuk secara berulang menghitung uang kuliah setiap tahun. Loop berhenti bila uang_kul lebih besar atau sama dengan 20000.


4.8.3 Masalah: Simulasi Monte Carlo
Simulasi Monte Carlo menggunakan bilangan acak dan probabilitas dalam menyelesaikan masalah. Metode ini memiliki terapan-terapan yang luas mulai dari fisika, kimia, matematika, sampai keuangan. Pada saat ini, akan disajikan bagaimana Monte Carlo dimanfaatkan untuk mengestimasi .

Untuk mengestimasi  menggunakan metode Monte Carlo, suatu lingkaran digambarkan dengan batas persegi, seperti ditampilkan pada gambar di bawah ini:


Diasumsikan bahwa radius lingkaran adalah 1. Jadi, luas lingkaran adalah  dan luas persegi adalah 4. Jika suatu titik dibangkitkan secara acak di dalam persegi, maka probabilitas titik tersebut jatuh di dalam lingkaran adalah luasLingkaran / luasPersegi = .

Tulislah suatu program yang secara acak membangkitkan 1000000 titik di dalam persegi dan biarkan jumlahJatuh menandakan jumlah titik yang jatuh di dalam lingkaran. Jadi, jumlahJatuh secara pendekatan didefinisikan sebagai 1000000 *  dan  dapat didekati dengan persamaan 4 * jumlahJatuh / 1000000. Program utuh ditampilkan pada kode4.10 sebagai berikut:

Kode4.10 SimulasiMonteCarlo.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class SimulasiMonteCarlo {
  public static void main(String[] args) {
    final int JUMLAH_PERCOBAAN = 10000000;
    int jumlahJatuh = 0;

    for (int i = 0; i < JUMLAH_PERCOBAAN; i++) {
      double x = Math.random() * 2.0 - 1;
      double y = Math.random() * 2.0 - 1;
      if (x * x + y * y <= 1)
        jumlahJatuh++;
    }

    double pi = 4.0 * jumlahJatuh / JUMLAH_PERCOBAAN;
    System.out.println("PI adalah " + pi);
  }
}

Keluaran:

PI adalah 3.1417252

Program secara berulang membangkitkan suatu titik acak (x, y) di dalam persegi pada baris 7-8:

double x = Math.random() * 2.0 - 1;
double y = Math.random() * 2.0 - 1;

Jika , maka titik berada di dalam lingkaran dan jumlahJatuh diinkremen sebesar 1.  dapat didekati dengan 4 * jumlahJatuh / JUMLAH_PERCOBAAN (baris 13).


4.9 Katakunci continue dan break
Anda telah menggunakan katakunci break di dalam suatu statemen switch. Anda juga bisa menggunakan break di dalam suatu loop untuk memberhentikan loop secara mendadak. Kode4.11 menyajikan suatu program untuk mendemonstrasikan pengaruh penggunaan suatu break di dalam loop.

Kode4.11 TestBreak.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class TestBreak {
  public static void main(String[] args) {
    int jumlah = 0;
    int angka = 0;

    while (angka < 20) {
      angka++;
      jumlah += angka;
      if (jumlah >= 100)
        break;
    }

    System.out.println("Angka adalah " + angka);
    System.out.println("Jumlah adalah " + jumlah);
  }
}

Keluaran:

Angka adalah 14
Jumlah adalah 105

Program pada kode4.11 menambahkan integer-integer 1 sampai 20 secara berurutan kepada variabel jumlah sampai jumlah lebih besar atau sama dengan 100. Tanpa statemen if (baris 9), program akan menjumlahkan integer-integer 1 sampai 20 tanpa adanya interupsi. Tetapi dengan statemen if, loop berhenti ketika jumlah lebih besar atau sama dengan 100. Tanpa statemen if, maka keluaran akan menjadi:

Angka adalah 20
Jumlah adalah 210

Anda juga bisa menggunakan katakunci continue dalam suatu loop. Ketika ini terjadi, maka kendali program mengarah ke akhir tubuh loop. Dengan kata lain, continue membuat program keluar dari satu iterasi sedangkan break membuat program keluar dari loop. Kode4.12 menyajikan suatu program untuk mendemonstrasikan pengaruh penggunaan continue di dalam suatu loop.

Kode4.12 TestContinue.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TestBreak {
  public static void main(String[] args) {
    int jumlah = 0;
    int angka = 0;

    while (angka < 20) {
      angka++;
      if (angka == 10 || angka == 11)
        continue;
      jumlah += angka;
    }

    System.out.println("Jumlah adalah " + jumlah);
  }
}

Keluaran:

Jumlah adalah 189

Program dalam kode4.12 menjumlahkan integer-integer dari 1 sampai 20, kecuali 10 dan 11, kepada jumlah. Dengan statemen if (baris 8), statemen continue dieksekusi ketika angka 10 atau 11. Statemen continue mengakhiri iterasi sehingga sisa statemen di dalam tubuh loop tidak akan dieksekusi; oleh karena itu, angka tidak dijumlahkan kepada jumlah ketika angka bernilai 10 atau 11. Tanpa statemen if, keluaran program menjadi:

Jumlah adalah 210

Pada kasus ini, semua angka dijumlahkan kepada jumlah, meski bila angka bernilai 10 atau 11. Oleh karena itu, hasilnya adalah 210, lebih 21 dari hasil ketika statemen if digunakan.

Program dalam kode4.2 memberikan permainan menebak angka. Anda bisa menulis-ulangnya menggunakan suatu statemen break, seperti yang ditunjukkan pada kode4.13:

Kode4.13 TebakAngkaMenggunakanBreak.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
import java.util.Scanner;

public class TebakAngkaMenggunakanBreak {
  public static void main(String[] args) {
  // Membangkitkan suatu angka acak untuk ditebak
  int angka = (int)(Math.random() * 101);

  Scanner masukan = new Scanner(System.in);
  System.out.println("Tebak suatu angka dari 0 sampai 100");

  while (true) {
    // Meminta pengguna memasukkan tebakan
    System.out.print("\nBerikan tebakan Anda: ");
    int tebak = masukan.nextInt();

    if (tebak == angka) {
      System.out.println("Ya, Anda benar, Angka Magic adalah " + angka);
      break;
  }
  else if (tebak > angka)
    System.out.println("Tebakan Anda terlalu tinggi");
  else
    System.out.println("Tebakan Anda terlalu rendah");
  }
 }
}

Keluaran:

Tebak suatu angka dari 0 sampai 100

Berikan tebakan Anda: 50
Tebakan Anda terlalu rendah

Berikan tebakan Anda: 95
Tebakan Anda terlalu tinggi

Berikan tebakan Anda: 91
Ya, Anda benar, Angka Magic adalah 91


4.9.1 Masalah: Menampilkan Bilangan Prima
Suatu integer lebih besar dari 1 dikatakan prima bila pembagi positifnya adalah 1 atau dirinya sendiri. Sebagai contoh, 2, 3, 5, dan 7 merupakan angka prima, tetapi 4, 6, 8, dan 9 bukan angka prima.

Masalah di sini adalah bagaimana mencari 50 angka prima pertama dan menampilkannya dalam lima baris, yang masing-masing baris terdiri-dari 10 angka prima. Masalah ini dapat dipecah menjadi beberapa tugas sebagai berikut:

  • Menentukan apakah suatu angka prima atau tidak.
  • Untuk angka = 2, 3, 4, 5, 6, ..., diuji keprimaannya.
  • Menghitung jumlah angka prima yang didapatkan.
  • Menampilkan setiap angka prima, sepuluh angka prima tiap baris.

Sekarang jelas terlihat bahwa Anda membutuhkan suatu loop untuk secara berulang memeriksa apakah suatu angka prima atau tidak. Jika angka adalah prima, maka hitung diinkremen sebesar 1. Variabel hitung diinisialisasi dengan 0. Ketika hitung berjumlah 50, maka loop akan berhenti.

Berikut merupakan algoritma untuk masalah keprimaan ini:

Tetapkan jumla angka prima yang akan ditampilkan sebagai suatu konstanta bernama JUMLAH_PRIMA;
Gunakan hitung untuk menjejak jumlah angka prima dan inisialisasi dengan 0;
Inisialisasi angka dengan 2;

while (hitung < JUMLAH_PRIMA) {
  Uji apakah suatu angka prima atau bukan;

  if angka adalah prima {
    Tampilkan angka prima dan inkremen hitung sebesar 1;
  }

  Inkremen angka dengan 1;
}

Untuk menguji apakah suatu angka itu prima atau bukan, periksa apakah angka tersebut dapat dibagi (tanpa sisa) oleh 2, 3, 4, sampai angka/2. Jika suatu pembagi ditemukan, maka angka itu bukanlah angka prima. Algoritma ini dapat dideskripsikan sebagai berikut:

Gunakan suatu variabel Boolean apaPrima untuk menandakan apakah
suatu angka prima atau tidak; Inisialisasi apaPrima dengan true;

for (int pembagi = 2; pembagi <= angka / 2; pembagi++) {
  if (angka % pembagi == 0) {
    Tetapkan apaPrima sebagai false;
    Keluar loop;
  }
}

Program utuh ditampilkan pada kode4.14 sebagai berikut:

Kode4.14 AngkaPrima.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
public class AngkaPrima {
  public static void main(String[] args) {
    final int JUMLAH_PRIMA = 50; // Jumlah prima yang akan ditampilkan
    final int JUMLAH_PRIMA_PER_BARIS = 10; // Menampilkan 10 per baris
    int hitung = 0; // Menghitung jumlah angka prima
    int angka = 2;         // Angka yang akan diuji keprimaannya

    System.out.println("50 angka prima pertama adalah \n");

    // Secara berulang mencari angka-angka prima
    while (hitung < JUMLAH_PRIMA) {
      // Asumsikan angka prima
      boolean apaPrima = true;

      // Menguji apakah suatu angka prima atau tidak
      for (int pembagi = 2; pembagi <= angka / 2; pembagi++) {
        if (angka % pembagi == 0) { // jia true, angka tidak prima
        apaPrima = false; // Tetapkan apaPrima menjadi false
        break; // Keluar loop
        }
      }

      // Menampilkan angka prima dan menambah hitung
      if (apaPrima) {
        hitung++; // Menginkremen hitung
       
        if (hitung % JUMLAH_PRIMA_PER_BARIS == 0) {
          // Menampilkan angka prima dan ganti baris
          System.out.println(angka);
        }
      else
        System.out.print(angka + " ");
      }

      // Periksa apakah angka berikutnya adalah prima
      angka++;
    }
  }
}

Keluaran:

50 angka prima pertama adalah

2 3 5 7 11 13 17 19 23 29
31 37 41 43 47 53 59 61 67 71
73 79 83 89 97 101 103 107 109 113
127 131 137 139 149 151 157 163 167 173
179 181 191 193 197 199 211 223 227 229

Untuk menentukan apakah suatu angka prima atau tidak, periksa angka tersebut apakah dapat dibagi (tanpa sisa) oleh suatu angka antara 2 sampai angka/2 (baris 16). Jika ya, maka angka tersebut bukan prima (baris 18); sebaliknya angka itu prima. Jika hitung dapat dibagi (tanpa sisa) oleh 10 (baris 27-30), maka dipaksa untuk ganti baris. Program berakhir bila hitung meraih nilai 50.

Program menggunakan statemen break pada baris 19 agar keluar dari loop begitu angka yang diuji tidak bilangan prima. Anda bisa menulis-ulang (baris 16-21) tanpa menggunakan statemen break, sebagai berikut:

for (int pembagi = 2; pembagi <= angka / 2 && apaPrima; pembagi++) {
  // Jika true, angka bukan prima
  if (angka % pembagi == 0) {
    // Tetapkan Apaprima menjadi false, bila angka bukan prima
   apaPrima = false;
  }
}

Anda dapat memperhatikan bahwa penggunaan statemen break dapat membuat progam menjadi lebih mudah dibaca dan dimengerti.


4.10 Mengendalikan Loop dengan Kotak Konfirmasi
Suatu loop yang terkendali oleh nilai sentinel dapat diimplementasikan dengan dialog konfirmasi. Jawaban Yes untuk lanjut atau No untuk memberhentikan loop. Template loop akan seperti ini:

int opsi = JOptionPane.YES_OPTION;
while (opsi == JOptionPane.YES_OPTION) {
  System.out.println("loop berlanjut");
  opsi = JOptionPane.showConfirmDialog(null, "Lanjut?");
}

Kode4.15 menulis-ulang kode4.4, NilaiSentinel.java, menggunakan suatu kotak dialog konfirmasi. Screenshot hasil keluaran program diberikan pada Gambar 4.4.


Gambar 4.4 Pengguna mengentri 3 pada (a), klik Yes pada (b), memasukkan 5 pada (c), klik No pada (d), dan hasil ditampilkan pada (c)

Kode4.15 NilaiSentinelMenggunakanKotakDialog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import javax.swing.JOptionPane;

public class NilaiSentinelMenggunakanKotakDialog {
  public static void main(String[] args) {
    int jumlah = 0;

    // Tetap membaca data sampai pengguna menjawab No
    int opsi = JOptionPane.YES_OPTION;
    while (opsi == JOptionPane.YES_OPTION) {
      // Membaca data berikutnya
      String dataString = JOptionPane.showInputDialog(
      "Masukkan suatu nilai int: ");
      int data = Integer.parseInt(dataString);

      jumlah += data;

      opsi = JOptionPane.showConfirmDialog(null, "Lanjut?");
    }

    JOptionPane.showMessageDialog(null, "Jumlah adalah " + jumlah);
  }
}

Program menampilkan suatu kotak masukan untuk meminta pengguna memasukkan suatu integer (baris 11) dan menambahkannya kepada jumlah (baris 15). Baris 17 menampilkan suatu konfirmasi dialog untuk membiarkan pengguna apakah melanjutkan atau tidak. Jika pengguna mengklik Yes, loop akan berlanjut; sebaliknya loop akan keluar.  Akhirnya program menampilkan hasil di dalam kotak dialog pesan (baris 20).

No comments:

Post a Comment