Friday, March 16, 2018

4. Statemen Kendali Bagian 3



Sejumlah Variasi Loop for
Loop for mendukung sejumlah variasi yang menambah kekuatan dan ketangguhan loop. Alasannya adalah karena fleksibilitas ketiga bagian loop for: inisialisasi, ekspresi kondisional, dan iterasi. 

Salah satu variasi yang sering dijumpai melibatkan ekspresi kondisional. Ekspresi ini tidak harus menguji variabel kendali loop terhadap nilai target tertentu. Variabel pengendali for dapat berupa sembarang ekspresi Boolean. Sebagai contoh, perhatikan fragmen kode berikut:

boolean selesai = false;

for(int i=1; !selesai; i++) {
   // ...
   if(diinterupsi()) selesai = true;
}

Pada contoh ini, loop for berlanjut beriterasi sampai variabel boolean, selesai, bernilai true. Berikut diberikan variasi lain dari loop for. Bagian inisialisasi maupun bagian ekspresi iterasi tidak diperlukan, seperti pada program ini:

//Bagian-bagian dari loop for bisa saja kosong
public class VariasiFor {
   public static void main(String args[]) {
      int i;
      boolean selesai = false;
      i = 0;
  
      for( ; !selesai; ) {
         System.out.println("i = " + i);
         
         if(i == 10) selesai = true;
            i++;
      }
   }
}

Ketika dijalankan, program ini akan menghasilkan keluaran berikut:

i = 0
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
i = 10

Di sini, bagian inisialisasi dan bagian ekspresi iterasi telah dipindahkan keluar dari for. Jadi, bagian-bagian dari for bisa saja kosong. Pendekatan ini dipandang sebagai mekanisme yang tidak baik dalam pemrograman.

Berikut adalah variasi lain dari loop for. Anda dapat menciptakan sebuah loop tak-hingga (sebuah loop yang tak pernah berhenti beriteasi) jika Anda mengosongkan ketiga bagian dari loop for:

for( ; ; ) {
   // ...
}

Loop ini akan berjalan selamanya karena tidak ada kondisi yang akan menghentikannya. Meskipun ada sejumlah program, seperti prosesor pada sistem operasi, yang memerlukan loop tak-hingga, kebanyakan “loop tak-hingga” sebenarnya adalah loop dengan persyaratan penghentian spesial.


Versi For-Each dari Loop for
Mulai dari JDK 5, bentuk kedua dari loop for telah didefinisikan untuk mengimplementasikan loop dengan gaya “for-each”.  Seperti yang Anda ketahui, teori bahasa kontemporer telah mengadopsi konsep for-each, dan telah menjadi fitur standar yang diperlukan para programer. Loop dengan gaya for-each dirancang untuk beriterasi melalui objek-objek, seperti array, dari awal sampai akhir. Tidak seperi beberapa bahasa pemrograman, seperti C#, yang mengimplementasikan loop for-each menggunakan katakunci foreach, Java menambahkan kapabilitas for-each dengan meningkatkan kapabilitas loop for. Kelebihan dari pendekatan ini adalah tidak diperlukannya katakunci baru. Gaya for-each untuk loop for seringkali dikenal dengan loop for terperbaiki atau loop for tertingkatkan.

Bentuk umum dari versi for-each dari for adalah:

for(tipe var_itr:koleksi) blok_statemen;

Di sini, tipe menyatakan tipe data dan var_itr menyatakan nama dari variabel iterasi yang akan menerima elemen-elemen dari sebuah koleksi, satu pada satu waktu, dari awal sampai akhir. Koleksi yang dijelajah ditetapkan oleh koleksi. Ada sejumlah jenis koleksi yang dapat dipakai pada for, tetapi tipe yang digunakan pada bab ini hanyalah array. Pada tiap iterasi loop, elemen berikutnya pada koleksi dibaca dan disimpan ke var_itr. Loop berulang sampai semua elemen pada koleksi diperoleh.

Karena variabel iterasi menerima nilai-nilai dari koleksi, tipe harus tipe data sama (atau kompatibel) dengan elemen-elemen yang disimpan pada koleksi. Jadi, ketika beriterasi pada array, tipe harus kompatibel dengan tipe data dari elemen array.

Untuk memahami motivasi di balik loop dengan gaya for-each, perhatikan loop for berikut ini. Fragmen kode berikut menggunakan loop for tradisional untuk menghitung penjumlahan atas nilai-nilai elemen pada sebuah array:

int angka[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int jum = 0;
for(int i=0; i < 10; i++) jum += angka[i];

Untuk menghitung penjumlahan, tiap elemen dari angka dibaca, secara berurutan, dari awal sampai akhir. Jadi, keseluruhan array dibaca dengan urutan sekuensial. Ini dilakukan secara manual dengan mengindeks array angka menggunakan indeks variabel kendali loop, i.

Loop for dengan gaya for-each secara otomatis melakukan hal ini, tanpa perlu memiliki pencacah loop, yang menetapkan nilai awal dan akhir dan secara manual mengindeks array. Loop for gaya for-each secara otomatis menjelajah keseluruhan array, membaca satu per satu elemen array secara berurutan, dari awal sampai akhir. Sebagai contoh, berikut adalah potongan kode sebelumnya yang telah ditulis ulang menggunakan versi for-each dari loop for:

int angka[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int jum = 0;
for(int x: angka) jum += x;

Dengan setiap siklus pada loop, x secara otomatis diberikan sebuah nilai yang sama dengan elemen berikutnya pada array angka. Jadi, pada iterasi pertama, x memuat nilai 1; pada iterasi kedua, x memuat 2; dan seterusnya. Tidak hanya sintaksis yang menjadi lebih sederhana, tetapi loop for gaya for-each ini tidak berpotensi menyebabkan error akibat pengaksesan di luar batas array.

Berikut adalah sebuah program yang mendemonstrasikan versi for-each dari loop for yang telah dijelaskan sebelumnya:

//Mendemonstrasikan loop for versi for-each
public class ForEach {
   public static void main(String args[]) {
      int angka[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      int jum = 0;
  
      // use for-each style for to display and sum the values
      for(int x : angka) {
         System.out.println("Nilai x: " + x);
         jum += x;
      }
  
      System.out.println("Penjumlahan semua elemen array: " + jum);
   }
}

Keluaran dari program ini adalah:

Nilai x: 1
Nilai x: 2
Nilai x: 3
Nilai x: 4
Nilai x: 5
Nilai x: 6
Nilai x: 7
Nilai x: 8
Nilai x: 9
Nilai x: 10
Penjumlahan semua elemen array: 55

Seperti ditunjukkan pada keluaran program, loop for versi for-each secara otomatis bersiklus melalui array secara sekuensial dari indeks terendah sampai tertinggi.

Meskipun loop for versi for-each beriterasi sampai semua elemen array selesai dibaca, Anda dimungkinkan untuk menghentikan loop secara mendadak menggunakan statemen break. Misalnya, program ini menjumlahkan hanya lima elemen pertama dari array angka:

//Menggunakan break untuk loop for versi for-each
public class ForEachBreak {
   public static void main(String args[]) {
      int jum = 0;
      int angka[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  
      // digunakan untuk menampilkan dan menjumlahkan nilai-nilai
      for(int x : angka) {
         System.out.println("Nilai x: " + x);
         jum += x;
  
         if(x == 5) break; // menghentikan loop ketika 5 didapatkan
      }
  
      System.out.println("Penjumlahan atas 5 elemen pertama: " + jum);
   }
}

Ketika dijalankan, program ini menghasilkan keluaran berikut:

Nilai x: 1
Nilai x: 2
Nilai x: 3
Nilai x: 4
Nilai x: 5
Penjumlahan atas 5 elemen pertama: 15

Dapat dilihat dari keluaran program bahwa loop for berhenti ketika elemen kelima telah didapatkan. Statemen break dapat pula dipakai pada loop lain dalam Java, dan hal ini akan dijelaskan nanti pada bab ini.

Ada satu hal penting lain yang perlu dipahami tentang loop for versi for-each ini. Variabel iterasinya berwatak “read-only”. Penugasan kepada variabel iterasi tidak berdampak apapun. Dengan kata lain, Anda tidak bisa mengubah isi array dengan menugaskan nilai baru pada variabel iterasi. Sebagai contoh, perhatikan program berikut:

//Loop for versi for-each pada dasarnya read-only
public class TidakBerubah {
   public static void main(String args[]) {
      int angka[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  
      for(int x: angka) {
         System.out.print(x + " ");
         x = x * 10; // tidak berdampak pada array angka
      }
  
      System.out.println();
  
      for(int x : angka)
         System.out.print(x + " ");
  
      System.out.println();
   }
}

Loop for pertama mengalikan nilai dari variabel iterasi dengan faktor 10. Namun, penugasan ini tidak berdampak apapun pada array angka, seperti ditunjukkan pada loop for kedua. Keluaran program di sini membuktikan hal ini:

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 8 9 10


Iterasi Pada Array Multidimensi
Versi terperbaiki dari loop for juga dapat diterapkan pada array multidimensi. Ingat, bahwa dalam Java, array multidimesi adalah array yang memuat array-array. Ini penting ketika melakukan iterasi pada array multidimensi, karena setiap iterasi membaca array berikutnya, bukan elemen individual.

Selain itu, variabel iterasi pada loop for harus kompatibel dengan tipe data array yang sedang dibaca. Misalnya, pada kasus array dua-dimensi, variabel iterasi harus berupa sebuah referensi ke array satu-dimensi. Secara umum, ketika menggunakan loop for versi for-each untuk mengiterasi sebuah array dengan N dimensi, objek-objek yang dibaca akan berupa array dengan dimensi N-1. Untuk memahami implikasi ini, perhatikan program berikut. Program ini menggunakan loop-loop for bersarang untuk membaca elemen-elemen dari sebuah array dua-dimensi baris demi baris, dari awal sampai akhir.

//Menggunakan loop for versi for-each pada array 2D
public class LoopForArray2D {
   public static void main(String args[]) {
      int jum = 0;
      int angka[][] = new int[3][5];
  
      // memberikan nilai-nilai pada array angka
      for(int i = 0; i < 3; i++)
         for(int j = 0; j < 5; j++)
            angka[i][j] = (i+1)*(j+1);
  
      // menggunakan for-each untuk menampilkan dan menjumlahkan
      for(int x[] : angka) {
         for(int y : x) {
            System.out.println("Nilai yang dibaca: " + y);
            jum += y;
         }
      }
  
      System.out.println("Penjumlahan: " + jum);
   }
}

Ketika dijalankan, program di atas akan menghasilkan keluaran berikut:

Nilai yang dibaca: 1
Nilai yang dibaca: 2
Nilai yang dibaca: 3
Nilai yang dibaca: 4
Nilai yang dibaca: 5
Nilai yang dibaca: 2
Nilai yang dibaca: 4
Nilai yang dibaca: 6
Nilai yang dibaca: 8
Nilai yang dibaca: 10
Nilai yang dibaca: 3
Nilai yang dibaca: 6
Nilai yang dibaca: 9
Nilai yang dibaca: 12
Nilai yang dibaca: 15
Penjumlahan: 90

Pada program, perhatikan khusus pada baris ini:

for(int x[] : angka) {

Perhatikan bagaimana x dideklarasikan. Variabel itu merupakan sebuah referensi ke sebuah array satu-dimensi yang memuat integer-integer. Ini diperlukan karena tiap iterasi dari loop for membaca array selanjutnya pada angka, dimulai dari array angka[0]. Loop for sebelah dalam kemudian beriterasi melalui array-array ini, yang menampilkan nilai dari tiap elemen array.


Menerapkan Loop for Terperbaiki
Karena versi for-each dari loop for hanya dapat beriterasi melalui sebuah array secara sekuensial, dari awal sampai akhir, Anda mungkin berpikir kegunaannya hanya terbatas, tetapi hal ini tidaklah benar. Banyak sekali algoritma yang memerlukan mekanisme semacam ini. Salah satunya adalah algoritma pencarian. Sebagai contoh, program berikut menggunakan sebuah loop for untuk melakukan pencarian terhadap sebuah nilai pada sebuah array tak-terurut. Loop kemudian akan berhenti ketika nilai yang dicari ditemukan.

//Melakukan pencarian pada array menggunakan loop for versi for-each
public class Pencarian {
   public static void main(String args[]) {
      int angka[] = { 6, 8, 3, 7, 5, 6, 1, 4 };
      int nil = 5;
      boolean ditemukan = false;
  
      // menggunakan for-each untuk melakukan pencarian
      for(int x : angka) {
         if(x == nil) {
            ditemukan = true;
            break;
         }
      }
  
      if(ditemukan)
         System.out.println("Nilai ditemukan!");
   }
}


Loop Bersarang
Sama seperti bahasa pemrograman lainnya, Java mengijinkan adanya loop untuk disarangkan ke dalam loop lain. Sebagai contoh, berikut adalah sebuah program yang mengimplementasikan penyarangan loop for:

//Mengimplementasikan penyarangan loop for
public class LoopBersarang {
   public static void main(String args[]) {
      int i, j;
  
      for(i=0; i<10; i++) {
         for(j=i; j<10; j++)
            System.out.print(".");

         System.out.println();
      }
   }
}

Ketika dijalankan, program ini akan menghasilkan keluaran:

..........
.........
........
.......
......
.....
....
...
..
.


Statemen Pelompatan
Java mendukung tiga statemen pelompatan: break, continue, dan return. Ketiga statemen ini mengalikan kendali eksekusi ke bagian lain dari program Anda.


Menggunakan break
Dalam Java, statemen break memiliki tiga kegunaan. Pertama, seperti yang telah Anda lihat, statemen break menghentikan runtun statemen pada switch. Kedua, statemen ini dapat dipakai untuk keluar dari sebuah loop. Ketiga, statemen break dapat dipakai sebagai cara “beradab” menggantikan goto. Dua kegunaan terakhir akan dibahas di ini.


Menggunakan break untuk Keluar dari Loop
Dengan menggunakan break, Anda bisa memaksa melakukan penghentian mendadak atas sebuah loop, dengan melompati ekspresi kondisional dan kode yang tersisi pada tubuh loop. Ketika statemen break dijumpai pada sebuah loop, loop tersebut akan berhenti beriterasi dan kendali program akan melompat ke statemen berikutnya yang ada setelah loop. Berikut salah satu contohnya:

//Menggunakan break untuk keluar loop
public class BreakLoop {
   public static void main(String args[]) {
      for(int i=0; i<100; i++) {
         if(i == 10) break; // menghentikan loop jika i= 10
            System.out.println("i: " + i);
      }

      System.out.println("Loop selesai.");
   }
}

Keluaran program di atas ditunjukkan berikut:

i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9
Loop selesai.

Seperti yang dapat Anda lihat, meskipun loop for dirancang untuk dijalankan dari 0 sampai 99, statemen break menyebabkannya berhenti secara mendadak, ketika i bernilai 10.


Selanjutnya  >>>

No comments: