Saturday, December 24, 2016

Bab 4. Pemrograman C# Belajar Dari Contoh



4. Statemen Kendali





Bab ini mendiskusikan beberapa statemen kendali C#. Ada tiga kategori statemen kendali program: statemen seleksi, yang terdiri-dari if dan switch; statemen iterasi, yang terdiri-dari for, do-while, dan foreach; dan  statemen lompat, yang terdiri-dari break, continue, goto, dan throw.


Statemen if

Bab 1 telah mengintroduksi statemen if. Namun, sekarang akan didiskusikan kembali secara lebih detil. Format utuh atas statemen if adalah

if (kondisi) statemen;
else statemen;

dimana targe dari if dan else adalah statemen tunggal. Klausa else bersifat opsional.  Target dari kedua if dan else dapat berupa blok statemen. Format umum atas if menggunakan blok statemen adalah

if (kondisi)
{
  runtun statemen
}
else
{
  runtun statemen
}

Jika ekspresi kondisional bernilai true, maka target dari if akan dieksekusi; sebaliknya, jika ada, target dari else akan dieksekusi. Kedua target dari if dan else tidak akan pernah dieksekusi secara bersamaan. Ekspresi kondisional pengendali if harus menghasilkan sebuah hasil bool.

Berikut adalah contoh sederhana yang menggunakan if dan else dalam melaporkan apakah sebuah angka positif atau negatif:

// Menentukan apakah sebuah nilai positif atau negatif.
using System;

class PosNeg {
    static void Main() {
        int i;
        for (i = -5; i <= 5; i++)
        {
            Console.Write("Menguji " + i + ": ");
            if (i < 0) Console.WriteLine("negatif");
            else Console.WriteLine("positif");
        }
    }
}

Keluaran program ditampilkan di sini:

Menguji -5: negatif
Menguji -4: negatif
Menguji -3: negatif
Menguji -2: negatif
Menguji -1: negatif
Menguji 0: positif
Menguji 1: positif
Menguji 2: positif
Menguji 3: positif
Menguji 4: positif
Menguji 5: positif

Pada contoh ini, jika i kurang dari nol, maka target dari if akan dieksekusi. Sebaliknya, target dari else akan dieksekusi. Kedua target tidak akan pernah dieksekusi secara bersamaan.


Statemen if Bersarang 
Statemen if bersarang adalah sebuah statemen if yang menjadi target dari if atau else lain. Statemen if bersarang umum dijumpai dalam pemrograman. Hal utama yang perlu diingat tentang if bersarang adalah bahwa statemen else merujuk ke statemen if  terdekat yang berada di dalam blok yang sama. Berikut adalah contohnya:

if(i == 10) {
  if(j < 20) a = b;
  if(k > 100) c = d;
  else a = c; // merujuk ke if(k > 100)
}
else a = d; // merujuk ke if(i == 10)

Seperti yang diindikasikan dalam komentar, else terakhir tidak berkaitan dengan if(j<20) karena tidak berada di dalam blok yang sama, tetapi ia berkaitan dengan if(i==10). Statemen else sebelah dalam merujuk ke if(k>00) karena ia merupakan if paling dekat yang berada di dalam blok yang sama.

Program berikut mendemonstrasikan sebuah if bersarang. Dalam program positif/negatif yang telah ditunjukkan sebelumnya, nol dilaporkan sebagai positif. Namun, dalam aturan umum, nol dipandang tidak sebagai positif juga tidak sebagai negatif. Program berikut akan menunjukkannya.

// Menentukan apakah sebuah nilai positif, negatif, atau nol.
using System;

class PosNegNol {
    static void Main() {
        int i;
        for (i = -5; i <= 5; i++)
        {
            Console.Write("Menguji " + i + ": ");
            if (i < 0) Console.WriteLine("negatif");
            else if (i == 0) Console.WriteLine("tidak positif/negatif");
            else Console.WriteLine("positif");
        }
    }
}

Berikut adalah keluaran program:

Menguji -5: negatif
Menguji -4: negatif
Menguji -3: negatif
Menguji -2: negatif
Menguji -1: negatif
Menguji 0: tidak positif/negatif
Menguji 1: positif
Menguji 2: positif
Menguji 3: positif
Menguji 4: positif
Menguji 5: positif


Tangga if-else-if
Konstruksi pemrograman yang umum dijumpai dan yang berbasis if bersarang adalah tangga if-else-if. Format umum tangga if-else-if adalah

if(kondisi)
  statemen;
else if(kondisi)
  statemen;
else if(kondisi)
  statemen;
...
else
  statemen;

Ekspresi kondisional dievaluasi dari atas ke bawah. Begitu ditemukan kondisi yang bernilai true, maka statemen terkait akan dieksekusi, dan sisa tangga akan dilompati.

Jika tidak ada kondisi bernilai true, maka klausa else terakhir akan dieksekusi. Klausa else terakhir berperan sebagai kondisi default. Jika tidak ada else terakhir dan semua kondisi bernilai false, maka tidak akan ada aksi yang akan dilakukan.

Program berikut mendemonstrasikan tangga if-else-if. Program ini mencari faktor dijit tunggal terkecil (selain 1) atas sebuah nilai yang diberikan.

// Menentukan faktor dijit-tunggal terkecil.
using System;

class Tangga {
    static void Main() {
        int angka;

        for (angka = 2; angka < 12; angka++)
        {
            if ((angka % 2) == 0)
                Console.WriteLine("Faktor terkecil dari " + angka + " adalah 2.");
            else if ((angka % 3) == 0)
                Console.WriteLine("Faktor terkecil dari " + angka + " adalah 3.");
            else if ((angka % 5) == 0)
                Console.WriteLine("Faktor terkecil dari " + angka + " adalah 5.");
            else if ((angka % 7) == 0)
                Console.WriteLine("Faktor terkecil dari " + angka + " adalah 7.");
            else
                Console.WriteLine(angka + " tidak bisa dibagi 2, 3, 5, atau 7.");
        }
    }
}

Keluaran program adalah:

Faktor terkecil dari 2 adalah 2.
Faktor terkecil dari 3 adalah 3.
Faktor terkecil dari 4 adalah 2.
Faktor terkecil dari 5 adalah 5.
Faktor terkecil dari 6 adalah 2.
Faktor terkecil dari 7 adalah 7.
Faktor terkecil dari 8 adalah 2.
Faktor terkecil dari 9 adalah 3.
Faktor terkecil dari 10 adalah 2.
11 tidak bisa dibagi 2, 3, 5, atau 7.


Statemen switch
Statemen seleksi C# kedua adalah switch. Statemen ini memberikan cabang jamak. Statemen switch memampukan sebuah program untuk memilih di antara beberapa alternatif. Meskipun sederet statemen if bersarang dapat melakukan pengujian cabang jamak, dalam banyak situasi statemen switch merupakan pendekatan yang lebih efisien. Statemen switch bekerja seperti ini: Nilai dari sebuah ekspresi secara berurutan diuji terhadap serangkaian konstanta. Ketika kecocokan ditemukan, runtun statemen yang berkaitan dengan kecocokan tersebut akan dieksekusi. Format umum atas statemen switch adalah

switch(ekspresi) {
  case konstanta1:
    runtun statemen
    break;
  case konstanta2:
    runtun statemen
    break;
  case konstanta3:
    runtun statemen
    break;
  ...
  default:
    runtun statemen;
    break;
}

Ekspresi dalam switch harus bertipe integer, seperti char, byte, short, atau int, bertipe enumerasi, atau bertipe string. (Tipe enumerasi dan string akan didiskusikan nanti pada buku ini). Jadi, ekspresi tipe titik-mengambang tidak diijinkan. Seringkali, ekspresi pengendali switch hanya berupa sebuah variabel. Konstanta case harus bertipe yang kompatibel dengan ekspresi. Dua konstanta case di dalam switch yang sama tidak boleh memiliki nilai identik.

Runtun statemen dalam default akan dieksekusi jika tidak ada konstanta case yang cocok dengan ekspresi. default bersifat opsional; jika tidak ada, maka tidak ada aksi yang dieksekusi bila semua konstanta case tidak cocok dengan ekspresi. Ketika kecocokan ditemukan, statemen-statemen yang berkaitan dengan case tersebut akan dieksekusi sampai ditemukannya statemen break. Program berikut mendemonstrasikan switch:

// Demonstrasi switch.
using System;

class DemoSwitch {
  static void Main() {
    int i;

    for(i=0; i<10; i++)
      switch(i) {
        case 0:
          Console.WriteLine("i adalah nol");
          break;
        case 1:
          Console.WriteLine("i adalah satu");
          break;
        case 2:
          Console.WriteLine("i adalah dua");
          break;
        case 3:
          Console.WriteLine("i adalah tiga");
          break;
        case 4:
          Console.WriteLine("i adalah empat");
          break;
        default:
          Console.WriteLine("i adalah lima atau lebih");
          break;
    }
  }
}

Keluaran program ditunjukkan di sini:

i adalah nol
i adalah satu
i adalah dua
i adalah tiga
i adalah empat
i adalah lima atau lebih
i adalah lima atau lebih
i adalah lima atau lebih
i adalah lima atau lebih
i adalah lima atau lebih

Seperti yang dapat Anda lihat, setiap kali melalui loop, statemen-statemen yang berkaitan dengan konstanta case yang cocok dengan i akan dieksekusi. Ketika i lima atau lebih, tidak ada konstanta case yang cocok, sehingga default dieksekusi.

Pada contoh sebelumnya, switch dikendalikan oleh suatu variabel int. Seperti yang telah dijelaskan, Anda dapat mengendalikan switch dengan sembarang tipe integer, termasuk char. Di sini akan disajikan sebuah contoh yang menggunakan suatu ekspresi char dan konstanta case bertipe char.

// Menggunakan char untuk mengendalikan switch.
using System;

class DemoSwitch2 {
  static void Main() {
  char ch;

  for(ch='A'; ch<= 'E'; ch++)
    switch(ch) {
      case 'A':
        Console.WriteLine("ch adalah A");
        break;
      case 'B':
        Console.WriteLine("ch adalah B");
        break;
      case 'C':
        Console.WriteLine("ch adalah C");
        break;
      case 'D':
        Console.WriteLine("ch adalah D");
        break;
      case 'E':
        Console.WriteLine("ch adalah E");
        break;
    }
  }
}

Keluaran program ditampilkan di sini:

ch adalah A
ch adalah B
ch adalah C
ch adalah D
ch adalah E

Perhatikan bahwa contoh ini tidak memiliki kasus default. Ingat, default bersifat opsional. Ketika tidak diperlukan, default bisa diabaikan.

Anda dapat memiliki dua atau lebih label case yang merujuk ke runtun kode yang sama, seperti ditunjukkan pada contoh ini:

// Beberapa case dapat merujuk ke runtun kode yang sama.
using System;

class CaseKosong
{
    static void Main()
    {
        int i;
        for (i = 1; i < 5; i++)
            switch (i)
            {
                case 1:
                case 2:
                case 3: Console.WriteLine("i adalah 1, 2 atau 3");
                    break;
                case 4: Console.WriteLine("i adalah 4");
                    break;
            }
    }
}

Keluaran program ditunjukkan di sini:

i adalah 1, 2 atau 3
i adalah 1, 2 atau 3
i adalah 1, 2 atau 3
i adalah 4

Pada contoh ini, jika i mempunyai nilai 1, 2, atau 3, maka statemen WriteLine() pertama akan dieksekusi. Jika i bernilai 4, maka statemen WriteLine() kedua akan dieksekusi. Teknik penumpukan label case seperti ini sering dipakai ketika beberapa case mempunyai kode yang sama. Teknik ini mencegah duplikasi runtun kode yang tidak perlu.


Statemen switch Bersarang
Adalah dimungkinkan untuk memiliki sebuah switch yang menjadi bagian dari statemen switch sebelah luar. Konstanta case dari switch sebelah dalam dan sebelah luar dapat memiliki nilai sama dan tidak menimbulkan konflik penamaan. Sebagai contoh, fragmen kode berikut dapat diterima di dalam C#:

switch(ch1) {
  case 'A': Console.WriteLine("A ini adalah bagian dari switch sebelah luar.");
    switch(ch2) {
      case 'A':
        Console.WriteLine("A ini adalah bagian dari switch sebelah dalam.");
        break;
      case 'B': // ...
    } // akhir dari switch sebelah dalam
    break;
  case 'B': // ...

Loop for
Loop for telah dikenalkan pada Bab 1. Di sini, ia akan dijelaskan secara lebih detil. Anda akan terkejut tentang betapa tangguh dan fleksibelnya sebuah loop for. Dimulai dari menjelaskan format tradisional for. Format umum atas loop for dalam merepetisi sebuah statemen tunggal adalah

for(inisialisasi; kondisi; iterasi) statemen;

Untuk merepetisi sebuah blok, format umumnya adalah

for(inisialisasi; kondisi; iterasi) statemen;
{
  runtun statemen;
}

inisialisasi biasanya berupa sebuah statemen penugasan yang menetapkan nilai awal dari variabel kendali loop, yang berperan sebagai kounter pengendali loop. kondisi merupakan sebuah ekspresi Boolean yang menentukan apakah loop akan berulang atau berhenti. Ekspresi iterasi mendefinisikan jumlah perubahan variabel kendali loop setiap kali loop berulang. Perhatikan bahwa ketiga bagian loop for ini dipisahkan dengan titik koma. Loop for akan terus mengeksekusi sepanjang pengujian kondisi bernilai true. Ketika kondisi bernilai false, maka loop akan berhenti dan eksekusi program akan berlanjut ke statemen setelah for.

Berikut adalah sebuah program untuk menampilkan angka dari 100 sampai -100, dengan dekremen sebesar 5:

// Sebuah contoh loop for.
using System;

class DekrFor {
  static void Main() {
    int x;

    for(x = 100; x > -100; x -= 5)
      Console.WriteLine(x);
  }
}

Satu hal penting tentang loop for adalah bahwa ekspresi kondisional selalu diuji terlebih dahulu. Hal ini berarti bahwa kode di dalam loop tidak akan dieksekusi bila kondisi tersebut bernilai false. Berikut adalah contohnya:

for(hitung=10; hitung < 5; hitung++)
  x += hitung; // statemen ini tidak akan pernah dieksekusi

Loop ini tidak akan pernah dieksekusi karena variabel kendalinya, hitung, lebih besar dari 5 ketika pertama kali program mengeksekusi loop. Ini membuat ekspresi kondisional, hitung<5, bernilai false; jadi, satu iterasi loop pun tidak pernah terjadi.

Loop for paling berguna ketika Anda ingin melakukan iterasi sejumlah perulangan yang diketahui. Misalnya, progam berikut menggunakan dua loop for untuk menemukan angka prima antara 2 dan 20. Jika angka tidak prima, maka faktor terbesarnya yang ditampilkan.
// Menentukan jika sebuah angka adalah prima. Jika tidak, maka
// menampilkan faktor terbesarnya.
using System;

class CariPrima {
  static void Main() {
    int angka;
    int i;
    int faktor;
    bool apaprima;

    for (angka = 2; angka < 20; angka++) {
      apaprima = true;
      faktor = 0;
     
      // Apakah  angka dapat dibagi.
      for (i = 2; i <= angka / 2; i++) {
        if ((angka % i) == 0)
        {
          // angka dapat dibagi. Jadi, tidak prima.
          apaprima = false;
          faktor = i;
        }
      }

      if (apaprima)
        Console.WriteLine(angka + " adalah prima.");
      else
        Console.WriteLine("Faktor terbesar dari " + angka +
                          " adalah " + faktor);
    }
  }
}

Keluaran program ditunjukkan di sini:

2 adalah prima.
3 adalah prima.
Faktor terbesar dari 4 adalah 2
5 adalah prima.
Faktor terbesar dari 6 adalah 3
7 adalah prima.
Faktor terbesar dari 8 adalah 4
Faktor terbesar dari 9 adalah 3
Faktor terbesar dari 10 adalah 5
11 adalah prima.
Faktor terbesar dari 12 adalah 6
13 adalah prima.
Faktor terbesar dari 14 adalah 7
Faktor terbesar dari 15 adalah 5
Faktor terbesar dari 16 adalah 8
17 adalah prima.
Faktor terbesar dari 18 adalah 9
19 adalah prima.


Beberapa Variasi Pada Loop for
Loop for merupakan salah satu statemen paling fleksibel dalam bahasa C# karena mengijinkan berbagai variasi. Beberapa variasi tersebut akan didiskusikan di sini.


Menggunakan Beberapa Variabel Kendali Loop
Loop for membolehkan Anda untuk menggunakan dua atau lebih variabel untuk mengendalikan loop. Ketika menggunakan beberapa variabel kendali loop, statemen inisialisasi dan inkremen untuk tiap variabel dipisahkan dengan koma. Berikut adalah contohnya:

// Menggunakan koma di dalam statemen for.
using System;

class Koma {
  static void Main() {
    int i, j;

    for (i = 0, j = 10; i < j; i++, j--)
      Console.WriteLine("i dan j: " + i + " " + j);
  }
}

Keluaran program ditunjukkan di sini:

i dan j: 0 10
i dan j: 1 9
i dan j: 2 8
i dan j: 3 7
i dan j: 4 6

Di sini, koma memisahkan dua statemen inisialisasi dan dua ekspresi iterasi. Ketika loop dimulai, kedua i dan j diinisialisasi. Setiap kali loop berulang, i diinkremen dan j didekremen. Penggunaan beberapa variabel kendali loop dapat menyederhanakan algoritma. Anda dapat sebanyak mungkin inisialisasi dan statemen iterasi, tetapi pada prakteknya, variabel kendali loop lebih dari dua akan membuat loop for susah dimengerti.

Berikut adalah kegunaan praktis dari penggunaan beberapa variabel kendali loop di dalam sebuah statemen for. Program ini menggunakan dua variabel kendali loop di dalam loop for untuk menemukan faktor terkecil dan faktor terbesar dari sebuah angka, pada kasus ini 100. Perhatikan secara khusus kondisi terminasi, yang sangat bergantung pada variabel kendali loop.

// Menggunakan koma di dalam statemen for untuk menemukan faktor
// terkecil dan faktor terbesar dari sebuah angka.
using System;

class Koma2 {
    static void Main() {
        int i, j;
        int terkecil, terbesar;
        int angka;
       
        angka = 100;
        terkecil = terbesar = 1;

        for (i = 2, j = angka / 2; (i <= angka / 2) & (j >= 2); i++, j--)
        {
            if ((terkecil == 1) & ((angka % i) == 0))
                terkecil = i;
            if ((terbesar == 1) & ((angka % j) == 0))
                terbesar = j;
        }

        Console.WriteLine("Faktor terbesar: " + terbesar);
        Console.WriteLine("Faktor terkecil: " + terkecil);
    }
}

Berikut adalah keluaran program:

Faktor terbesar: 50
Faktor terkecil: 2


Ekspresi Kondisional
Ekspresi kondisional pengendali loop for dapat berupa sembarang ekspresi yang menghasilkan hasil bool. Kondisi ini bisa saja tidak melibatkan variabel kendali loop. Sebagai contoh, pada program berikut, loop for dikendalikan oleh nilai dari selesai.

// Kondisi loop dapat berupa sembarang ekspresi.
using System;

class Demofor {
    static void Main() {
        int i, j;
        bool selesai = false;

        for (i = 0, j = 100; !selesai; i++, j--)
        {
            if (i * i >= j) selesai = true;
            Console.WriteLine("i, j: " + i + " " + j);
        }
    }
}

Keluaran program ditunjukkan di sini:

i, j: 0 100
i, j: 1 99
i, j: 2 98
i, j: 3 97
i, j: 4 96
i, j: 5 95
i, j: 6 94
i, j: 7 93
i, j: 8 92
i, j: 9 91
i, j: 10 90
Pada contoh ini, loop for beriterasi sampai variabel bool, selesai, bernilai true. Variabel ini ditetapkan bernilai true di dalam loop ketika kuadrat dari i lebih besar dari atau sama dengan j.


Bagian Yang Hilang
Dalam C#, adalah hal yang memungkinkan untuk salah satu atau semuanya dari inisialisasi, kondisi, atau iterasi pada loop for dibiarkan kosong. Sebagai contoh, perhatikan program berikut:

// Bagian dari for dibiarkan kosong.
using System;

class Kosong {
    static void Main() {
        int i;
       
        for (i = 0; i < 10; )
        {
            Console.WriteLine("Lewat #" + i);
            i++; // menginkremen variabel kendali loop
        }
    }
}

Di sini, ekspresi iterasi pada loop for dibiarkan kosong. Variabel kendali loop i diinkremen di dalam tubuh loop. Ini berarti bahwa setiap kali loop berulang, i akan diuji untuk melihat apakah telah bernilai sama dengan 10. Jika ya, program keluar dari loop.

Berikut adalah keluaran program:

Lewat #0
Lewat #1
Lewat #2
Lewat #3
Lewat #4
Lewat #5
Lewat #6
Lewat #7
Lewat #8
Lewat #9

Pada contoh berikut, porsi inisialisasi dibiarkan kosong di dalam loop for:

// Menempatkan inisialisasi di luar loop for.
using System;

class Kosong2 {
    static void Main() {
        int i;
        i = 0; // menempatkan inisialisasi di luar loop
       
        for (; i < 10; )
        {
            Console.WriteLine("Lewat #" + i);
            i++; // menginkremen variabel kendali loop
        }
    }
}

Pada versi ini, i diinisialisasi sebelum loop for dimulai. Normalnya, Anda akan menginisialisasi variabel kendali loop di dalam loop for. Penempatan inisialisasi di luar loop umumnya dilakukan hanya ketika nilai awal dihasilkan melalui proses yang kompleks (yang terlalu panjang untuk dimuat di dalam statemen for).


Loop Tak Berhingga
Anda bisa menciptakan loop tak berhingga (loop yang tidak pernah berhenti) menggunakan for dengan membiarkan ekspresi kondisional kosong. Sebagai contoh, fragmen kode berikut menunjukkan cara banyak programer untuk menciptakan loop tak berhingga.

for(;;) // secara sengaja membuat loop tak berhingga
{
  //...
}

Loop ini akan berulang untuk selama-lamanya.


Loop Tanpa Tubuh
Dalam C#, tubuh yang berkaitan dengan sebuah loop for (atau sembarang loop lainnya) dapat dibiarkan kosong. Ini diijinkan karena statemen kosong secara sintaks adalah valid. Loop tanpa tubuh seringkali berguna. Sebagai contoh, program berikut menggunakan loop tanpa tubuh untuk menjumlahkan 1 sampai 5:

// Tubuh sebuah loop dapat dibiarkan kosong.
using System;

class Kosong3 {
    static void Main() {
        int i;
        int jum = 0;

        // Menjumlahkan angka 1 sampai 5.
        for (i = 1; i <= 5; jum += i++) ;
        Console.WriteLine("Hasil penjumlahan adalah " + jum);
    }
}

Keluaran program ditampilkan di sini:

Hasil penjumlahan adalah 15

Perhatikan bahwa proses penjumlahan ditangani di dalam statemen for, dan tidak diperlukan adanya tubuh loop. Perhatikan secara khusus pada ekspresi iterasi:

jum += i++
Jangan merasa bingung dengan statemen semacam ini. Statemen semacam ini umum dijumpai pada program C# yang ditulis secara profesional dan mudah dimengerti jika Anda memecahnya menjadi beberapa bagian. Dengan kata lain, ekspresi iterasi tersebut sama dengan dua statemen berikut:

jum = jum + i;
i++;


Mendeklarasikan Variabel Kendali Di Dalam Loop for
Seringkali variabel yang mengendalikan loop for dibutuhkan hanya untuk kepentingan loop dan tidak digunakan di tempat lain di dalam program. Ketika kasus ini terjadi, adalah hal yang memungkinkan untuk mendeklarasikan variabel tersebut di dalam porsi inisialisasi pada loop for. Sebagai contoh, program berikut menghitung penjumlahan dan faktorial atas angka 1 sampai 5. Program ini mendeklarasikan variabel kendali loop i di dalam loop for:

// Mendeklarasikan variabel kendali loop di dalam loop for.
using System;

class ForVar
{
    static void Main()
    {
        int jum = 0;
        int fakt = 1;

        // Menghitung penjumlahan dan faktorial dari 1 sampai 5.
        for (int i = 1; i <= 5; i++)
        {
            jum += i; // i hanya dikenal di dalam loop.
            fakt *= i;
        }
       
        // Tetapi, i tidak dikenal di sini.
        Console.WriteLine("Penjumlahan adalah " + jum);
        Console.WriteLine("Faktorial adalah " + fakt);
    }
}

Keluaran program ditampilkan di sini:

Penjumlahan adalah 15
Faktorial adalah 120

Ketika Anda mendeklarasikan sebuah variabel di dalam loop for, ada satu hal yang penting diingat: Skop variabel tersebut berhenti ketika statemen for berhenti atau tidak lagi berulang. Di luar loop for, variabel tersebut tidak dikenali. Jadi, pada contoh sebelumnya, i tidak dapat diakses dari luar loop for. Jika Anda perlu menggunakan variabel kendali di tempat lain di dalam program, Anda tidak boleh mendeklarasikannya di dalam loop for.


Loop while
Satu lagi loop di dalam C# adalah while. Format umum loop while adalah

while (kondisi) statemen;

dimana  statemen dapat berupa statemen tunggal maupun blok statemen, dan kondisi mendefinisikan kondisi yang mengendalikan loop dan dapat berupa sembarang ekspresi Boolean. statemen dieksekusi bila kondisi bernilai true. Jika bernilai false, kendali program akan melewatinya dan bergerak ke baris setelah loop.

Berikut adalah sebuah contoh sederhana dimana loop while dipakai untuk menghitung jumlah dijit di dalam suatu integer:

// Menghitung jumlah dijit di dalam suatu integer.
using System;

class DemoWhile
{
    static void Main()
    {
        int angka;
        int jumDijit;

        angka = 43567424;
        jumDijit = 0;

        Console.WriteLine("Angka: " + angka);
        while (angka > 0)
        {
            jumDijit++;
            angka = angka / 10;
        };

        Console.WriteLine("Jumlah dijit: " + jumDijit);
    }
}

Keluaran program ditunjukkan di sini:

Angka: 43567424
Jumlah dijit: 8

Loop while bekerja seperti ini: Nilai dari angka diuji. Jika angka lebih besar dari 0, kounter jumDijit diinkremen, dan angka dibagi dengan 10. Selama nilai di dalam angka lebih besar dari 0, maka loop akan berulang. Ketika angka bernilai 0, loop akan berhenti dan jumDijit memuat jumlah dijit di dalam integer yang diberikan.

Sama seperti loop for, loop while memeriksa ekspresi kondisional di awal loop, yang berarti bahwa kode di dalam tubuh loop bisa saja tidak akan pernah dieksekusi jika ekspresi kondisional bernilai false. Program berikut mengilustrasikan karakteristik ini. Program menghitung 2 pangkat 0 sampai 2 pangkat 9:

// Menghitung 2 pangkat 0 sampai 9.
using System;

class Pangkat {
  static void Main() {
    int e;
    int hasil;

    for(int i=0; i < 10; i++) {
      hasil = 1;
      e = i;

      while (e > 0)
      {
        hasil *= 2;
        e--;
      }

      Console.WriteLine("2 pangkat " + i + " adalah " + hasil);
    }
  }
}

Keluaran program ditunjukkan di sini:

2 pangkat 0 adalah 1
2 pangkat 1 adalah 2
2 pangkat 2 adalah 4
2 pangkat 3 adalah 8
2 pangkat 4 adalah 16
2 pangkat 5 adalah 32
2 pangkat 6 adalah 64
2 pangkat 7 adalah 128
2 pangkat 8 adalah 256
2 pangkat 9 adalah 512

Perhatikan bahwa loop while dieksekusi hanya ketika e bernilai lebih besar dari 0. Jadi, ketika e bernilai 0, tubuh loop while akan dilompati.


Loop do-while
Loop C# ketiga adalah do-while. Tidak seperti loop for dan while, dimana di dalamnya kondisi diuji di awal loop, loop do-while memeriksa kondisinya di akhir loop. Ini berarti bahwa loop do-while selalu dieksekusi sedikitnya sekali perulangan. Format umum atas loop do-while adalah

do {
  statemen-statemen;
} while (kondisi);

Meskipun sepasang kurung kurawal tidak diperlukan bila hanya satu statemen di dalam tubuh loop do-while, namun agar lebih mudah dibaca, tetap digunakan untuk menghindari kebingungan. Loop do-while dieksekusi sepanjang ekspresi kondisional bernilai true. Program berikut menggunakan loop do-while untuk menampilkan dijit-dijit dari sebuah integer dengan urutan terbalik:

// Menampilkan dijit-dijit dari sebuah integer dalam urutan terbalik.
using System;

class DemoDoWhile {
  static void Main() {
    int angka;
    int dijitBerikutnya;
    angka = 198;

    Console.WriteLine("Angka: " + angka);
    Console.Write("Angka dalam urutan terbalik: ");

    do
    {
      dijitBerikutnya = angka % 10;
      Console.Write(dijitBerikutnya);
      angka = angka / 10;
    } while (angka > 0);

    Console.WriteLine();
  }
}

Keluaran program ditampilkan di sini:

Angka: 198
Angka dalam urutan terbalik: 891

Berikut adalah bagaimana loop do-while bekerja: Pada tiap iterasi, dijit paling kiri didapatkan dengan menghitung sisa dari sebuah pembagian integer (pembagian oleh 10). Dijit ini kemudian ditampilkan. Selanjutnya, nilai di dalam angka dibagi oleh 10. Proses ini berulang sampai angka bernilai 0.


Loop foreach
Loop foreach beriterasi melalui elemen-elemn suatu koleksi. Koleksi merupakan sebuah grup objek. C# mendefinisikan beberapa tipe koleksi, salah satunya adalah array. Loop foreach didiskusikan pada Bab 6, ketika array dibahas.


Menggunakan break Untuk Keluar Loop
Adalah memungkinkan untuk memaksa keluar dari sebuah loop, dengan melompati sisa kode di dalam loop dan uji kondisional loop, menggunakan statemene break. Ketika statemen break dijumpai di dalam sebuah loop, loop akan berhenti, dan kendali program akan dialihkan ke statemen selanjutnya setelah loop. Berikut disajikan contohnya:

// Menggunakan break untuk keluar dari loop.
using System;

class DemoBreak {
    static void Main() {
       
        // Menggunakan break untuk keluar dari loop ini.
        for (int i = -10; i <= 10; i++)
        {
            if (i > 0) break; // loop berhenti ketika i positif
            Console.Write(i + " ");
        }
        Console.WriteLine("Selesai");
    }
}

Program menghasilkan keluaran seperti ini:

-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 Selesai

Seperti yang dapat Anda lihat, loop for tersebut didesain untuk beriterasi dari -10 sampai 10, dan statemen break menyebabkan loop berhenti mendadak, ketika i menjadi positif.

Statemen break dapat dipakai dengan semua loop dalam C#. Sebagai contoh, di sini adalah program sebelumnya menggunakan loop do-while:

// Menggunakan break untuk keluar dari loop do-while.
using System;

class DemoBreak2 {
    static void Main() {
        int i;
        i = -10;

        do
        {
            if (i > 0) break;
            Console.Write(i + " ");
            i++;
        } while (i <= 10);
       
        Console.WriteLine("Selesai");
    }
}

Di sini disajikan sebuah contoh lebih praktis atas penggunaan break. Program ini mencari faktor terkecil dari suatu angka.

// Mencari faktor terkecil dari suatu nilai.
using System;

class CariFaktorTerkecil {
    static void Main() {
        int faktor = 1;
        int angka = 1000;

        for (int i = 2; i <= angka / i; i++)
        {
            if ((angka % i) == 0)
            {
                faktor = i;
                break; // menghentikan loop ketika faktor ditemukan
            }
        }
        Console.WriteLine("Faktor terkecil adalah " + faktor);
    }
}

Keluaran program ditampilkan di sini:

Faktor terkecil adalah 2

Loop break menghentikan loop for ketika sebuah faktor ditemukan. Penggunaan break dalam situasi ini mencegah loop untuk mencoba mencari faktor lain setelah sebuah faktor telah ditemukan.

Ketika digunakan di dalam loop bersarang, statemen break akan menyebabkan kendali program keluar dari loop yang paling dalam. Sebagai contoh,

// Menggunakan break dengan loop bersarang.
using System;

class BreakBersarang {
    static void Main() {
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine("Kounter loop luar: " + i);
            Console.Write("Kounter loop dalam: ");
            int t = 0;
           
            while (t < 100)
            {
                if (t == 10) break; // keluar loop jika t bernilai 10
                Console.Write(t + " ");
                t++;
            }
            Console.WriteLine();
        }
        Console.WriteLine("Loop selesai.");
    }
}

Keluaran program ditunjukkan di sini:

Kounter loop luar: 0
Kounter loop dalam: 0 1 2 3 4 5 6 7 8 9
Kounter loop luar: 1
Kounter loop dalam: 0 1 2 3 4 5 6 7 8 9
Kounter loop luar: 2
Kounter loop dalam: 0 1 2 3 4 5 6 7 8 9
Loop selesai.

Seperti yang dapat Anda perhatikan, statemen break di dalam loop sebelah dalam menyebabkan kendali program keluar dari loop tersebut. Loop sebelah luar tidak terpengaruh.

Berikut adalah dua hal penting lain yang perlu diingat tentang break: Pertama, lebih dari satu statemen break dapat muncul di dalam sebuah loop. Namun, perlu hati-hati. Terlalu banyak statemen break memiliki kecenderungan untuk merusak struktur kode Anda. Kedua, statemen break yang menyebabkan kendali program keluar dari statemen switch hanya berpengaruh pada statemen switch tersebut dan tidak pada loop yang mengapitnya.
Menggunakan continue
Adalah memungkinkan untuk memaksa keluar dari iterasi sebuah loop, melompati struktur kendali normal pada loop. Hal ini dilakukan menggunakan continue. Statemen continue memaksa kendali program untuk ke iterasi berikutnya pada sebuah loop, melompati sisa kode yang ada. Jadi, continue secara esensial adalah komplemen dari break. Sebagai contoh, program berikut menggunakan continue untuk menampilan angka genap dari 0 sampai 100.

// Menggunakan continue.
using System;

class ContDemo {
    static void Main() {
       
        // Menampilkan angka genap antara 0 dan 100.
        for (int i = 0; i <= 100; i++)
        {
            if ((i % 2) != 0) continue; // iterasi selanjutnya
            Console.WriteLine(i);
        }
    }
}

Hanya angka genap yang ditampilkan, karena anga ganjil akan menyebabkan loop melompati pemanggilan WriteLine() dan kendali program dialihkan ke iterasi berikutnya.

Dalam loop while dan do-while, statemen continue akan menyebabkan kendali program secara langsung ke ekspresi kondisional dan melanjutkan proses perulangan. Pada kasus loop for, ekspresi iterasi loop dievaluasi, kemudian ekspresi kondisional dieksekusi, dan kemudian loop berlanjut.


return
Statemen return menyebabkan sebuah metode untuk kembali. Statemen ini juga dapat dipakai untuk menghasilkan nilai balik. Topik ini dibahas pada Bab 5.


goto
goto merupakan statemen pelompatan tak bersyarat dalam C#. Ketika dijumpai, kendali program melompat ke lokasi yang dispesifikasi oleh goto. Mekanisme goto tidak dipakai dalam buku ini di luar bagian ini. Penyebab utama tentang penggunaan goto adalah kecenderungannya untuk membuat program menjadi berantakan dan susah dibaca.

goto memerlukan label. Label adalah sembarang pengenal C# yang diikuti dengan titik koma. Sebagai contoh, loop dari 1 sampai 100 dapat ditulis menggunakan goto, seperti ditunjukkan di sini:

x = 1;
loop1:
  x++;
  if(x < 100) goto loop1;

goto dapat pula dipakai untuk melompati sebuah statemen case atau default di dalam switch. Secara teknis, statemen case dan default pada switch keduanya adalah label. Jadi, keduanya bisa menjadi target dari goto. Namun, statemen goto harus dieksekusi dari dalam switch. Yaitu, Anda tidak bisa memakai goto untuk melompat ke statemen switch. Berikut diberikan sebuah contoh yang mengilustrasikan goto di dalam switch:

// Menggunakan goto di dalam switch.
using System;

class SwitchGoto
{
    static void Main()
    {
        for (int i = 1; i < 5; i++)
        {
            switch (i)
            {
                case 1:
                    Console.WriteLine("Pada case 1");
                    goto case 3;
                case 2:
                    Console.WriteLine("Pada case 2");
                    goto case 1;
                case 3:
                    Console.WriteLine("Pada case 3");
                    goto default;
                default:
                    Console.WriteLine("Pada default");
                    break;
            }
            Console.WriteLine();
        }
        // goto case 1; // Error! tidak bisa lompat ke switch.
    }
}

Keluaran program ditampilkan di sini:

Pada case 1
Pada case 3
Pada default

Pada case 2
Pada case 1
Pada case 3
Pada default

Pada case 3
Pada default

Pada default

Di dalam switch, perhatikan bagaimana goto dipakai untuk melompati statemen case lain atau statemen default. Di samping itu, perhatikan bahwa statemen case tidak diakhiri dengan break. Jika Anda menghapus simbol komentar di awal baris ini

// goto case 1; // Error! tidak bisa lompat ke switch.
maka program tidak akan bisa dikompilasi. Kegunaan lain dari goto adalah keluar dari perulangan bersarang. Berikut diberikan contohnya:

// Demonstrasi goto.
using System;

class MenggunakanGoto {
    static void Main() {
        int i = 0, j = 0, k = 0;
       
        for (i = 0; i < 10; i++)
        {
            for (j = 0; j < 10; j++)
            {
                for (k = 0; k < 10; k++)
                {
                    Console.WriteLine("i, j, k: " + i + " " + j + " " + k);
                    if (k == 3) goto berhenti;
                }
            }
        }
    berhenti:
        Console.WriteLine("Berhenti! i, j, k: " + i + ", " + j + " " + k);
    }
}

Keluaran program ditampilkan di sini:

i, j, k: 0 0 0
i, j, k: 0 0 1
i, j, k: 0 0 2
i, j, k: 0 0 3
Berhenti! i, j, k: 0, 0 3

Penghapusan goto akan memaksa penggunaan tiga statemen if dan break. Pada kasus ini, goto menyederhanakan kode.

Satu hal penting: Meskipun Anda bisa melompat keluar dari sebuah blok (seperti yang ditunjukkan pada contoh sebelumnya), Anda tidak bisa menggunakan goto untuk melompat ke sebuah blok.


No comments:

Post a Comment