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