Sunday, December 25, 2016

Bab 5. Pemrograman Internet


JavaScript: Repetisi







5.1 Pengantar

Pada bab ini, akan dikenalkan statemen kendali lainnya (repetisi). Pada bab-bab mendatang, Anda akan melihat bahwa struktur kendali berguna dalam memanipulasi objek.

5.2 Hal-Hal Penting dari Repetisi Terkendali-Kounter
Repetisi terkendali-kounter memerlukan:
1.       Nama variabel kendali (atau kounter loop).
2.       Nilai awal variabel kendali.
3.       Operator inkremen (dekremen) untuk memodifikasi variabel kendali setiap kali loop beriterasi.
4.       Kondisi untuk menguji nilai akhir variabel kendali dalam menentukan apakah loop harus berlanjut beriterasi atau tidak.

Untuk melihat keempat elemen dari repetisi terkendali-kounter, perhatikan skrip sederhana yang ditunjukkan pada Gambar 5.1, yang menampilkan baris-baris teks XHTML dan mengilustrasikan tujuh ukuran font berbeda yang didukung oleh XHTML. Deklarasi pada baris 12 menamai variabel kendali (kounter), mencadangkan ruang memori untuknya dan menetapkannya menjadi nilai awal 1. Deklarasi dan inisialisasi kounter dapat pula dilakukan dengan statemen penugasan dan deklarasi berikut:

var kounter; // deklarasi kounter
kounter = 1; // inisialisasi kounter dengan 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.1: kounterWhile.html-->
<!-- Repetisi terkendali-kounter. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Repetisi terkendali-kounter</title>
        <script type = "text/javascript">
            <!--
            var kounter = 1; // inisialisasi

            while ( kounter <= 7 ) // kondisi repetisi
            {
                document.writeln( "<p style = \"font-size: " +
                    kounter + "ex\">ukuran font XHTML  " + kounter +
                    "ex</p>" );
                ++kounter; // inkremen
            } //akhir while
            // -->
        </script>
     </head><body></body>
</html>



Baris 16-18 pada statemen while menuliskan sebuah elemen paragraf yang memuat string “ukuran font XHTML” yang disambung dengan nilai dari variabel kendali, kounter, yang merepresentasikan ukuran font. Atribut style dari CSS menetapkan properti font-size menjadi nilai dari kounter yang disambung dengan ex. Karena karakter kutip-ganda membatasi awal dan akhir sebuah literal string dalam JavaScript, ia tidak dapat dipakai di dalam isi string kecuali jika ia diawali dengan sebuah \ untuk menciptakan runtun escape \”. Sebagai contoh, jika kounter bernilai 5, maka statemen sebelumnya akan menghasilkan markup

<p style = "font-size: 5ex">ukuran font XHTML font 5ex</p>

XHTML membolehkan penggunaan kutip tunggal (‘) atau kutip ganda (“) agar ditempatkan sebagai pengapit atribut. JavaScript membolehkan kutip tunggal agar ditempatkan di dalam sebuah literal string. Jadi, Anda dapat menempatkan kutip tunggal untuk mengapit properti font-size dalam menghasilkan keluaran XHTML ekivalen tanpa perlu menggunakan runtun escape.

Baris 19 pada statemen while menginkremen variabel kendali sebesar 1 untuk tiap iterasi loop (setiap kali tubuh loop dieksekusi). Kondisi kontinuasi-loop (baris 14) pada statemen while menguji apakah nilai dari variabel kendali bernilai kurang dari atau sama dengan 7 (nilai akhir dimana kondisi bernilai true). Perhatikan bahwa tubuh statemen while ini dieksekusi bahkan ketika variabel kendali bernilai 7. Loop berhenti ketika variabel kendali melebihi 7 (kounter menjadi 8).


5.3 Statemen Repetisi for
Statemen repetisi for menangani semua detil dari repetisi terkendali-kounter. Gambar 5.2 mengilustrasikan kekuatan dari statemen for dengan mengimplementasikan-ulang skrip pada Gambar 5.1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.2: kounterFor.html -->
<!-- Repetisi terkendali-kounter dengan statemen for. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Repetisi Terkendali-Kounter</title>
        <script type = "text/javascript">
            <!--
            // Inisialisasi, kondisi repetisi, dan
            // penginkremenan semua dicantumkan di dalam
            // header statemen for.
            for ( var kounter = 1; kounter <= 7; ++kounter )
                document.writeln( "<p style = \"font-size: " +
                    kounter + "ex\">ukuran font XHTML " + kounter +
                    "ex</p>" );
            // -->
        </script>
    </head><body></body>
</html>


Gambar 5.2 Repetisi terkendali-kounter dengan statemen for.


Ketika statemen for mulai dieksekusi (baris 15), variabel kendali kounter dideklarasikan dan diinisialisasi dengan 1 (yaitu, statemen pertama dari statemen for mendeklarasikan nama variabel kendali dan menyediakan nilai awal variabel kendali). Selanjutnya, kondisi kontinuasi-loop, kounter <= 7, diuji. Kondisi tersebut memuat nilai akhir (7) dari variabel kendali. Nilai awal kounter adalah 1. Oleh karena itu, kondisi terpenuhi (bernilai true), dan statemen tubuh (baris 16-18) menuliskan sebuah elemen paragraf pada dokumen XHTML. Kemudian, variabel kounter diinkremen pada ekspresi ++kounter dan loop berlanjut dieksekusi dengan pengujian kontinuasi-loop. Variabel kendali sekarang sama dengan 2, jadi belum memenuhi nilai akhir dan program kembali mengeksekusi statemen tubuh (melakukan iterasi loop berikutnya). Proses ini berlanjut sampai variabel kendali kounter menjadi 8, dimana pada titik ini pengujian kontinuasi-loop gagal dan repetisi berhenti.

Program berlanjut dengan mengeksekusi statemen pertama yang berada setelah statemen for. (Pada kasus ini, skrip berhenti, karena penerjemah telah meraih akhir skrip).

Gambar 5.3 melihat lebih dekat tentang statemen for pada baris 15 dari Gambar 5.2. Baris pertama dari statemen for (termasuk katakunci for dan semuanya yang ada di dalam kurung setelah katakunci for) sering disebut dengan header statemen for. Perhatikan bahwa statemen for “melakukan semuanya”, yaitu menetapkan semua item yang dibutuhkan oleh repetisi terkendali-kounter.



Gambar 5.3 Komponen-komponen dari header statemen for


Format umum dari statemen for adalah

for ( inisialisasi; ujiKontinuasiLoop; inkremen )
    statemen-statemen

dimana ekspresi inisialisasi menamai variabel kendali loop dan menyediakan nilai awalnya, ujiKontinuasiLoop merupakan ekspresi yang menguji kondisi kontinuasi-loop (yang memuat nilai akhir dari variabel kendali agar kondisi bernilai true), dan inkremen merupakan sebuah ekspresi yang menginkremen variabel kendali. Statemen for dapat direpresentasikan oleh statemen while ekivalen, dengan inisialisasi, ujiKontinuasiLoop, dan inkremen yang ditempatkan sebagai berikut:

inisialiasi;

while ( ujiKontinuasiLoop )
{
    statemen-statemen
    inkremen;
}

Jika ekspresi inisialisasi pada header statemen for merupakan definisi pertama dari variabel kendali, maka variabel kendali masih dapat dipakai setelah statemen for pada skrip.

Ketiga ekspresi pada statemen for bersifat opsional. Jika ujiKontinuasiLoop diabaikan, maka JavaScript mengasumsikan bahwa kondisi kontinuasi-loop bernilai true, dan menciptakan sebuah loop tak-berhingga. Anda dapat mengabaikan ekspresi inisialisasi jika variabel kendali diinisialisasi sebelum loop. Anda juga dapat mengabaikan ekspresi inkremen jika operasi inkremen dilakukan oleh statemen-statemen di dalam tubuh statemen for atau jika tidak perlu adanya inkremen. Ekspresi inkremen pada statemen for berperilaku sebagai statemen yang berdiri sendiri di akhir tubuh statemen for. Oleh karena itu, ekspresi-ekspresi

kounter = kounter + 1
kounter += 1
++kounter
kounter++

semua ekivalen di dalam bagian penginkremenan pada statemen for. Banyak programer lebih memilih format kounter++. Ini karena penginkremenan atas variabel kendali terjadi setelah tubuh loop dieksekusi, dan oleh karena itu format pascainkremen tampak lebih natural. Operasi prainkremen dan pascainkremen keduanya memiliki efek yang sama pada contoh ini, karena variabel yang sedang diinkremen tidak berada di dalam ekspresi yang lebih besar. Dua semikolon (;) pada header statemen for diperlukan.

Statemen for memiliki diagram alir mirip dengan statemen while. Sebagai contoh, Gambar 5.4 menunjukkan diagram alir dari statemen for

for ( var kounter = 1; kounter <= 7; ++kounter )
    document.writeln( "<p style = \"font-size: " +
        kounter + "ex\">ukuran font XHTML " + kounter +
        "ex</p>" );

Diagram alir ini memperjelas bahwa inisialisasi terjadi hanya sekali dan penginkremenan terjadi setelah tiap eksekusi atas statemen tubuh dilakukan. Perhatikan bahwa, selain simbol lingkaran kecil dan anak panah, diagram alir hanya memuat simbol-simbol persegipanjang dan sebuah simbol diamond.



Gambar 5.4 Diagram alir statemen repetisi for


5.4 Beberapa Contoh Penggunaan Statemen for
Contoh-contoh pada bagian ini menunjukkan beberapa metode dalam memodifikasi variabel kendali pada sebuah statemen for. Pada tiap kasus, dituliskan header for yang cocok. Perhatikan perubahan pada operator relasional untuk loop-loop yang mendekremen variabel kendali.

a)       Memodifikasi variabel kendali dari 1 sampai 100 dengan inkremen sebesar 1.
for ( var i = 1; i <= 100; ++i )
b)      Memodifikasi variabel kendali dari 100 sampai 1 dengan inkremen sebesar -1 (dekremen sebesar 1).
for ( var i = 100; i >= 1; --i )
c)       Memodifikasi variabel kendali dari 7 sampai 77 dengan langkah 7.
for ( var i = 7; i <= 77; i += 7 )
d)      Memodifikasi variabel kendali dari 20 sampai 2 dengan langkah -2.
for ( var i = 20; i >= 2; i -= 2 )
e)       Memodifikasi variabel kendali sehingga dihasilkan runtun nilai: 2, 5, 8, 11, 14, 17, 20.
for ( var j = 2; j <= 20; j += 3 )
f)        Memodifikasi variabel kendali sehingga dihasilkan runtun nilai: 99, 88, 77, 66, 55, 44, 33, 22, 11, 0.
for ( var j = 99; j >= 0; j -= 11 )

Dua skrip selanjutnya akan mendemonstrasikan statemen repetisi for. Gambar 5.5 menggunakan statemen for untuk menjumlahkan semua integer genap dari 2 sampai 100. Perhatikan bahwa ekspresi inkremen menambahkan 2 pada variabel kendali angka setelah tubuh dieksekusi pada tiap iterasi loop. Loop berhenti ketika angka memiliki nilai 102 (yang tidak ditambahkan pada jum).

Perhatikan bahwa tubuh statemen for pada Gambar 5.5 sebenarnya dapat digabungkan ke porsi paling-kanan dari header for dengan menggunakan sebuah koma, sebagai berikut:

for ( var angka = 2; angka <= 100; jum += angka, angka += 2)
;

Sama halnya, inisialisasi jum = 0 dapat digabungkan ke bagian inisialisasi dari statemen for.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.5: Jumlah.html -->
<!-- Penjumlahan dengan struktur repetisi for. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Penjumlahan Semua Integer Genap dari 2 sampai 100</title>
        <script type = "text/javascript">
            <!--
            var jum = 0;

            for ( var angka = 2; angka <= 100; angka += 2 )
                jum += angka;

            document.writeln( "Penjumlahan dari semua integer genap " +
                "dari 2 sampai 100 adalah " + jum );
            // -->
        </script>
    </head><body></body>
</html>



Gambar 5.5 Penjumlahan menggunakan struktur repetisi for


Contoh berikutnya menghitung bunga tahunan menggunakan statemen for. Perhatikan statemen permasalahan berikut:

Seseorang menginvestasikan Rp. 1000.00 pada sebuah akun bank dengan suku bunga 5 persen. Bila diasumsikan bahwa bunga akan kembali disimpan pada deposit, hitunglah dan tampilkanlah jumlah uang di dalam akun di akhir setiap tahun selama 10 tahun. Gunakan formula berikut untuk menentukan jumlah uang di dalam akun:

           

dimana
            p adalah nilai uang awal yang diinvestasikan (prinsipal)
            r adalah suku bunga tahunan
            n adalah banyak tahun
            a adalah jumlah uang pada deposit di akhi tahun ke-n
                       
Permasalahan ini melibatkan sebuah loop yang melakukan perhitungan uang pada deposit untuk masing-masing tahun selama 10 tahun. Gambar 5.6 menyajikan solusi atas permasalahan ini dan menampilkan hasilnya pada sebuah tabel.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.6: Bunga.html-->
<!-- Compound interest calculation with a for loop. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Penghitungan Bunga Tahunan</title>
        <style type = "text/css">
            table { width: 100% }
            th { text-align: left }
        </style>
        <script type = "text/javascript">
            <!--
            var jumlah; // jumlah uang sekarang
            var prinsipal = 1000.0; // jumlah investasi awal
            var bunga = .05; // suku bunga

            document.writeln(
                "<table border = \"1\">" ); // awal tabel
            document.writeln(
                "<caption>Menghitung Bunga Tahunan</caption>" );
            document.writeln(
                "<thead><tr><th>Tahun</th>" ); // kepala kolom Tahun
            document.writeln(
                "<th>Uang pada Deposit</th>" ); // kepala kolom Uang
            document.writeln( "</tr></thead><tbody>" );

            // menampilkan baris tabel untuk tiap tahun
            for ( var tahun = 1; tahun <= 10; ++tahun )
            {
                jumlah = prinsipal * Math.pow( 1.0 + bunga, tahun );
                document.writeln( "<tr><td>" + tahun +
                    "</td><td>" +jumlah.toFixed(2) +
                    "</td></tr>" );
            }//akhir for

            document.writeln( "</tbody></table>" );
            // -->
         </script>
    </head><body></body>
</html>



Gambar 5.6 Menghitung bunga tahunan dengan sebuah loop for


Baris 16-18 mendeklarasikan tiga variabel dan menginisialisasi prinsipal dengan 1000.0 dan bunga dengan .05. Baris 20-21 menuliskan sebuah tag <table> XHTML, dan baris 22-23 menuliskan caption yang menyimpulkan isi tabel. Baris 24-25 menciptakan bagian header tabel (<thread>), sebuah kepala baris (<tr>), dan sebuah kepala kolom (<th>) yang memuat “Tahun”. Baris 26-28 menciptakan sebuah kepala tabel untuk “Uang pada Deposit” dan menuliskan tag penutup </tr> dan </thread>.

Statemen for (baris 31-37) mengeksekusi tubuhnya sebanyak 10 kali, menginkremen variabel kendali tahun dari 1 sampai 10 (perhatikan bahwa tahun merepresentasikan n pada statemen permasalahan). JavaScript tidak memiliki operator pemangkatan (eksponensiasi). Jadi, Anda menggunakan metode pow dari objek Math untuk kepentingan ini. Ekspresi Math.pow(x, y) menghitung nilai dari x yang dipangkatkan dengan y. Metode Math.pow memerlukan dua angka sebagai argumen dan memberikan nilai balik.

Baris 33 melakukan perhitungan menggunakan formula yang diberikan pada statemen permasalahan. Baris 34-36 menuliskan sebaris markup XHTML yang menciptakan baris lain di dalam tabel. Kolom pertama merupakan nilai tahun sekarang. Kolom kedua menampilkan nilai dari jumlah. Baris 39 menuliskan tag penutup </tbody> dan </table> setelah loop berhenti.

Baris 35 mengintroduksi objek Number dan metodenya, toFixed. Variabel jumlah memuat sebuah nilai numerik, jadi JavaScript merepresentasikannya sebagai sebuah objek Number. Metode toFixed dari sebuah objek Number memformat nilai dengan membulatkannya menjadi sebuah angka desimal dengan sejumlah dijit tertentu di belakang titik desimal. Pada baris 35, jumlah.toFixed(2) menghasilkan nilai dari jumlah dengan dua dijit di belakang titik desimal.

Variabel jumlah, prinsipal, dan bunga merepresentasikan angka-angka pada skrip ini. Ingat bahwa JavaScript merepresentasikan semua angka sebagai angka titik-mengambang (pecahan). Fitur ini cocok pada contoh ini, karena Anda sedang berhubungan dengan bagian pecahan dari rupiah dan memerlukan tipe yang membolehkan titik desimal dalam nilainya.


5.5 Statemen Seleksi-Jamak switch
Ada kalanya, sebuah algoritma memuat sederet keputusan dimana di dalamnya sebuah variabel atau ekspresi diuji secara terpisah untuk tiap nilai yang diasumsikan, dan pelbagai aksi akan diambil untuk tiap nilai tersebut. JavaScript menyediakan statemen seleksi-jamak switch untuk menangani pembuatan keputusan semacam itu. Skrip pada Gambar 5.7 mendemonstrasikan tiga format list CSS yang ditentukan oleh nilai yang dimasukkan oleh pengguna.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.7: UjiSwitch.html -->
<!-- Menggunakan statemen seleksi-jamak switch. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Pemilihan FOrmat List CS</title>
        <script type = "text/javascript">
            <!--
            var pilihan; // pilihan pengguna
            var awalTag; // tag awal
            var akhirTag; // tag akhir
            var masukanValid = true; // indikasi jika masukan valid
            var tipeList; // tipe list sebagai sebuah string

            pilihan = window.prompt( "Pilihlah sebuah gaya list:\n" +
                "1 (nomor), 2 (huruf), 3 (roman)", "1" );

            switch ( pilihan )
            {
                case "1":
                    awalTag = "<ol>";
                    akhirTag = "</ol>";
                    tipeList = "<h1>List Bernomor</h1>";
                    break;
                case "2":
                    awalTag = "<ol style = \"list-style-type: upper-alpha\">";
                    akhirTag = "</ol>";
                    tipeList = "<h1>List Berhuruf</h1>";
                    break;
                case "3":
                    awalTag = "<ol style = \"list-style-type: upper-roman\">";
                    akhirTag = "</ol>";
                    tipeList = "<h1>List Bernomor Roman</h1>";
                    break;
                default:
                    masukanValid = false;
            } //akhir switch

            if ( masukanValid == true )
            {
                document.writeln( tipeList + awalTag );

                for ( var i = 1; i <= 3; ++i )
                    document.writeln( "<li>Item list" + i + "</li>" );

                document.writeln( akhirTag );
            } //akhir if
            else
                document.writeln( "Pilihan tak-valid: " + pilihan );
            // -->
        </script>
    </head>
    <body>
        <p>Klik Refresh untuk menjalankan skrip ini kembali</p>
    </body>
</html>



Gambar 5.7 Penggunaan statemen seleksi-jamak switch


Baris 12 pada skrip mendeklarasikan variabel pilihan. Variabel ini menyimpan pilihan pengguna, yang menentukan tipe list XHTML yang akan ditampilkan. Baris 13-14 mendeklarasikan variabel awalTag dan akhirTag, yang akan menyimpan tag-tag XHTML yang akan dipakai untuk menciptakan elemen list. Baris 15 mendeklarasikan variabel masukanValid dan menginisialisasinya dengan true. Skrip menggunakan variabel ini untuk menentukan apakah pengguna memberikan pilihan yang valid atau tidak. Jika pilihan tak-valid, maka skrip akan menetapkan masukanValid menjadi false. Baris 16 mendeklarasikan variabel tipeList, yang akan menyimpan sebuah elemen h1 yang mengindikasikan tipe list.

Baris 18-19 meminta pengguna untuk memasukkan 1 untuk menampilkan list bernomor, 2 untuk menampilkan list berhuruf, dan 3 untuk menampilkan list dengan numeral roman. Baris 21-40 mendefinisikan sebuah statemen switch yang menugaskan kepada variabel awalTag, akhirTag, dan tipeList nilai-nilai yang didasarkan pada masukan oleh pengguna pada dialog prompt. Anda menciptakan berbagai list menggunakan properti list-style-type dari CSS, yang memampukan Anda untuk menetapkan sistem penomoran untuk list (daftar). Nilai-nilai yang dapat ditugaskan kepada properti tersebut adalah decimal (nomor, sebagai default, lower-roman (Roman huruf kecil), upper-roman (Roman huruf besar), lower-alpha (huruf kecil), upper-alpha (huruf besar), dan lainnya.

Statemen switch terdiri-dari sederet label case dan sebuah kasus default opsional. Ketika aliran kendali mencapai statemen switch, skrip mengevaluasi ekspresi pengendali (pilihan pada contoh ini) yang diapit oleh sepasang kurung yang berada setelah katakunci switch. Nilai dari ekspresi ini dibandingkan dengan nilai pada tiap label case, dimulai dari label case pertama. Diasumsikan bahwa pengguna memasukkan 2. Ingat bahwa nilai yang diketikkan oleh pengguna pada dialog prompt adalah sebuah string. Jadi, string 2 dibandingkan dengan string pada tiap case di dalam statemen switch. Jika terjadi kecocokan (case “2”:), maka statemen-statemen pada case tersebut akan dieksekusi. Untuk string 2 (baris 29-32), awalTag ditetapkan sebagai tag pembuka ol dengan properti list-style-type ditetapkan menjadi upper-alpha, akhirTag ditetapkan menjadi “</ol>” untuk mengindikasikan akhir dari list, dan tipeList ditetapkan menjadi “<h1>List Bernomor</h1>”. Jika tidak ada kecocokan yang terjadi antara nilai dari ekspresi pengendali dan sebuah label case, maka kasus default akan dieksekusi dan variabel masukanValid akan ditetapkan menjadi false.

Statemen break pada baris 32 menyebabkan kendali program berlanjut ke statemen pertama yang terletak setelah statemen switch. Jika break tidak digunakan di suatu lokasi pada statemen switch, maka setiap kali terjadi kecocokan, semua statemen pada case yang lain juga akan dieksekusi.

Selanjutnya, aliran kendali berlanjut ke statemen if pada baris 42, yang menguji variabel masukanValid untuk menentukan apakah nilai bernilai true. Jika ya, baris 44-49 akan menuliskan tipeList, awalTag, ketiga item list (<li>), dan akhirTag. Sebaliknya, skrip akan menuliskan teks pada dokumen XHTML yang mengindikasikan bahwa pilihan tak-valid telah diberikan (baris 52).

Tiap case dapat memiliki aksi jamak (beberapa statemen). Statemen switch berbeda dari lainnya, dimana kurung kurawal tidak diperlukan untuk mengapit aksi jamak pada sebuah case. Diagram alir statemen switch digambarkan pada Gambar 5.8.

Diagram alir tersebut memperjelas bahwa setiap statemen break di akhir sebuah case menyebabkan kendali keluar dari statemen switch dengan segera. Statemen break tidak diperlukan untuk case terakhir pada statemen switch, karena kendali program secara otomatis akan berlanjut ke statemen berikutnya.



Gambar 5.8 Statemen seleksi-jamak switch


5.6 Statemen Repetisi do...while
Statemen repetisi do...while mirip dengan statemen while. Pada statemen while, pengujian kontinuasi-loop terjadi di awal loop, sebelum tubuh loop dieksekusi. Statemen do...while menguji kondisi kontinuasi-loop setelah tubuh loop dieksekusi. Oleh karena itu, tubuh loop selalu dieksekusi minimal sekali. Ketika loop do...while berhenti, eksekusi berlanjut ke statemen pertama yang terletak setelah klausa while. Perhatikan bahwa tidak penting menggunakan kurung kurawal pada statemen do...while jika hanya terdapat satu statemen pada tubuhnya. Namun, kurung kurawal disertakan untuk menghindari kebingungan antara statemen while dan statemen do...while. Sebagai contoh,

while ( kondisi )

biasanya dipandang sebagai kepala statemen while. Statemen do...while tanpa menggunakan kurung kurawal yang mengapit tubuh statemen-tunggal memiliki format

do
    statemen
while ( kondisi );

yang bisa membingungkan. Baris terakhir, while( kondisi);, dapat disalah-artikan sebagai sebuah statemen while yang memuat sebuah statemen kosong (tanda titik koma itu sendiri). Jadi, untuk menghindari kebingungan, statemen do...while dengan tubuh satu-statemen seringkali dituliskan sebagai berikut:

do
{
    statemen
} while ( kondisi );

Skrip pada Gambar 5.9 menggunakan sebuah statemen do...while untuk menampilkan masing-masing dari enam tipe kepala (heading) XHTML (h1 sampai h6). Baris 12 mendeklarasikan variabel kendali kounter dan menginisialisasinya dengan 1. Saat memasuki statemen do...while, baris 15-17 menuliskan sebagai teks XHTML pada dokumen. Nilai dari variabel kendali kounter digunakan untuk menciptakan tag kepala awal dan tag kepala akhir (yaitu, <h1> dan </h1>) dan untuk menciptakan baris teks yang akan ditampilkan (yaitu, Ini adalah kepala level h1). Baris 18 menginkremen kounter sebelum pengujian kontinuasi-loop terjadi di akhir loop.

Diagram alir do...while pada Gambar 5.10 memperjelas bahwa pengujian kontinuasi-loop tidak terjadi sampai aksi dieksekusi minimal sekali.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.9: UjiDoWhile.html -->
<!-- Penggunaan statemen repetisi do...while.-->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Penggunaan statemen repetisi do...while</title>
        <script type = "text/javascript">
            <!--
            var kounter = 1;

            do {
                document.writeln( "<h" + kounter + ">Ini adalah " +
                    "sebuah level kepala h" + kounter + "</h" +
                    kounter + ">" );
                ++kounter;
            } while ( kounter <= 6 );
            // -->
        </script>

    </head><body></body>
</html>



Gambar 5.9 Penggunaan statemen repetisi do...while




Gambar 5.10 Diagram alir statemen reptisi do...while


5.7 Statemen break dan continue
Statemen break dan continue dipakai untuk mengubah aliran kendali. Statemen break, ketika dieksekusi di dalam statemen while, for, do...while, atau switch, menyebabkan aliran kendali keluar dengan segera dari statemen tersebut. Eksekusi berlanjut terhadap statemen pertama yang terletak setelah struktur terkait. Statemen break umumnya dipakai untuk keluar secara mendadak dari sebuah loop atau untuk melompati sisa tubuh dari sebuah statemen switch (seperti pada Gambar 5.7). Gambar 5.11 mendemonstrasikan statemen break di dalam sebuah statemen repetisi for.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.11: UjiBreak.html -->
<!-- Penggunaan statemen break di dalam statemen for. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>
            Menggunakan statemen break di dalam statemen for
        </title>
        <script type = "text/javascript">
            <!--
            for ( var hitung = 1; hitung <= 10; ++hitung )
            {
                if ( hitung == 5 )
                    break; // keluar loop hanya jika hitung == 5

                document.writeln( "Hitung adalah: " + hitung + "<br />" );
            } //akhir for

            document.writeln(
                "Keluar dari loop pada hitung = " + hitung );
            // -->
        </script>
    </head><body></body>
</html>

Pada tiap iterasi dari statemen for pada baris 14-20, skrip menuliskan nilai dari hitung pada dokumen XHTML. Ketika statemen if pada baris 16 mendeteksi bahwa hitung bernilai 5, statemen break pada baris 17 dieksekusi. Statemen ini menghentikan statemen for, dan program berlanjut ke baris 22 (statemen berikutnya yang terletak setelah statemen for), dimana skrip menuliskan nilai dari hitung ketika loop berhenti (yaitu, 5). Loop mengeksekusi baris 19 hanya empat kali.




Gambar 5.11 Penggunaan statemen break di dalam sebuah statemen for


Statemen continue, ketika dieksekusi di dalam sebuah statemen while, for, atau do...while, akan melompati statemen-statemen tersisa pada tubuh dan berlanjut ke iterasi berikutnya dari loop. Di dalam statemen while dan do...while, pengujian kontinuasi-loop dievaluasi setelah statemen continue dieksekusi. Pada statemen for, ekspresi inkremen dieksekusi, kemudian kondisi kontinuasi-loop dievaluasi. Inilah yang membedakan statemen for dan while

Gambar 5.12 menggunakan continue di dalam sebuah statemen for untuk melompati statemen document.writeln pada baris 20 ketika statemen if pada baris 17 menentukan bahwa nilai dari hitung adalah 5. Ketika statemen continue dieksekusi, skrip akan melompati sisa tubuh dari statemen for. Kendali program berlanjut ke ekspresi inkremen untuk menginkremen variabel kendali statemen for, yang diikuti dengan pengujian kontinuasi-loop untuk menentukan apakah loop harus berlanjut atau berhenti.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.12: UjiContinue.html -->
<!-- Penggunaan statemen continue di dalam sebuah statemen for. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>
            Penggunaan statemen continue di dalam sebuah statemen for
        </title>

        <script type = "text/javascript">
            <!--
            for ( var hitung = 1; hitung <= 10; ++hitung )
            {
                if ( hitung == 5 )
                    continue; // melompati sisa tubuh hanya jika hitung == 5

                document.writeln( "Hitung adalah: " + hitung + "<br />" );
            } //end for

            document.writeln( "Menggunakan continue untuk melompati penampilan 5" );
            // -->
        </script>

    </head><body></body>
</html>





Gambar 5.12 Penggunaan statemen continue di dalam sebuah statemen for


5.8 Statemen break dan continue Berlabel
Statemen break dapat mengakibatkan kendali program keluar dengan segera dari statemen while, for, do...while, atau switch. Untuk keluar dari struktur bersarang, Anda dapat menggunakan statemen break berlabel. Statemen ini, ketika dieksekusi di dalam sebuah statemen while, for, do...while, atau switch, menyebabkan kendali program keluar dari statemen tersebut dan dari semua statemen repetisi yang mengapitnya; eksekusi program akan dimulai dengan statemen pertama yang terletak setelah statemen berlabel pengapit (sebuah statemen yang diawali dengan sebuah label). Statemen berlabel dapat berupa sebuah blok (sehimpunan statemen yang diapit oleh sepasang kurung kurawal). Statemen break berlabel umumnya dipakai untuk menghentikan struktur repetisi bersarang yang memuat statemen while, for, do...while, atau switch. Gambar 5.13 mendemonstrasikan statemen break berlabel di dalam sebuah statemen for bersarang.

Blok berlabel (baris 12-28) dimulai dengan sebuah label (pengenal yang diikuti oleh sebuah semikolon). Di sini, Anda menggunakan label berhenti:. Blok tersebut diapit oleh sepasang kurung kurawal di akhir baris 12 dan pada baris 28, dan mencakup statemen for bersarang pada baris 13 dan statemen document.writeln pada baris 27. Ketika statemen if pada baris 17 mendeteksi bahwa baris sama dengan 5, maka statemen pada baris 18 akan dieksekusi. Statemen ini menghentikan statemen for pada baris 15 dan statemen for pengapit pada baris 13, dan program berlanjut ke statemen pada baris 30 (statemen pertama setelah blok berlabel). Statemen for sebelah dalam hanya dieksekusi sebanyak empat kali. Perhatikan bahwa statemen document.writeln pada baris 27 tidak pernah dieksekusi, karena ia dicantumkan di dalam blok berlabel dan statemen for sebelah luar tidak pernah tuntas dieksekusi.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.13: UjiLabelBreak.html -->
<!-- Statemen break berlabel di dalam sebuah statemen for bersarang. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Penggunaan statemen break dengan sebuah label</title>
        <script type = "text/javascript">
            <!--
            berhenti: { // blok berlabel
                for ( var baris = 1; baris <= 10; ++baris )
                {
                    for ( var kolom = 1; kolom <= 5 ; ++kolom )
                    {
                        if ( baris == 5 )
                            break berhenti; // lompat ke akhir blok berhenti

                        document.write( "* " );
                    } //akhir for

                    document.writeln( "<br />" );
                } //akhir for

                // baris berikut dilompati
                document.writeln( "Baris ini tidak ditampilkan" );
            } // akhir blok berlabel berhenti

            document.writeln( "Akhir skrip" );
            // -->
        </script>
    </head><body></body>
</html>



Gambar 5.13 Statemen break berlabel di dalam statemen for bersarang


Statemen continue menyebabkan kendali program beralih ke iterasi berikutnya pada statemen while, for, atau do...while. Statemen continue berlabel, ketika dieksekusi pada sebuah statemen repetisi (while, for, atau do...while), akan melompati sisa statemen pada tubuh struktur dan semua statemen repetisi pengapit, kemudian berlanjut ke iterasi berikutnya pada statemen repetisi berlabel (sebuah statemen repetisi yang diawali dengan suatu label). Pada statemen while dan do...while berlabel, pengujian kontinuasi-loop dievaluasi segera setelah statemen continue dieksekusi. Pada sebuah statemen for berlabel, ekspresi inkremen dieksekusi, kemudian pengujian kontinuasi-loop dievaluasi. Gambar 5.14 menggunakan statemen continue berlabel di dalam sebuah statemen for bersarang yang menyebabkan eksekusi berlanjut ke iterasi berikutnya dari statemen for sebelah luar.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.14: UjiLabelContinue.html -->
<!-- Statemen continue berlabel di dalam statemen for bersarang. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Penggunaan statemen continue dengan sebuah label</title>
        <script type = "text/javascript">
            <!--
            barisBerikutnya: // label target dari statemen continue
                for ( var baris = 1; baris <= 5; ++baris )
                {
                    document.writeln( "<br />" );

                    for ( var kolom = 1; kolom <= 10; ++kolom )
                    {
                        if ( kolom > baris )
                            continue barisBerikutnya; // iterasi berikutnya dari loop berlabel

                        document.write( "* " );
                    } //akhir for
                } //akhir for
            // -->
        </script>
    </head><body></body>
</html>



Gambar 5.14 Statemen continue berlabel di dalam sebuah statemen for bersarang


Statemen for berlabel (baris 13-24) diawali dengan label barisBerikutnya pada baris 12. Ketika statemen if pada baris 19 di dalam statemen for sebelah dalam mendeteksi bahwa kolom lebih besar dari baris, baris 20 dieksekusi dan kendali program berlanjut ke ekspresi inkremen atas variabel kendali dari statemen for sebelah luar. Meskipun statemen for sebelah dalam beriterasi dari 1 sampai 10, banyaknya karakter * yang ditampilkan pada sebuah baris tidak pernah melebihi nilai baris.


5.9 Operator Logikal
Sejauh ini, Anda hanya mempelajari kondisi-kondisi sederhana seperti hitung <= 10, total > 1000, dan angka != nilaiSentinel. Semua kondisi ini diekspresikan menggunakan operator-operator relasional >, <, >=, dan <=, dan menggunakan operator-operator ekualitas == dan !=. Setiap keputusan diuji berdasarkan satu kondisi. Untuk membuat sebuah keputusan berdasarkan kondisi jamak (beberapa kondisi), Anda perlu melakukan beberapa pengujian di dalam statemen-statemen terpisah atau di dalam statemen if atau if...else.

JavaScript menyediakan beberapa operator logikal yang dapat digunakan untuk membentuk kondisi-kondisi kompleks dengan menggabungkan beberapa kondisi sederhana. Operator-operator logikal ini adalah && (AND logikal), || (OR logikal), dan ! (NOT logikal, yang juga disebut dengan negasi logikal). Berikut akan diberikan contoh dari tiap operator ini.

Dimisalkan bahwa, pada suatu titik di dalam sebuah program, Anda ingin memastikan bahwa dua kondisi bernilai true sebelum Anda memilih jalur eksekusi tertentu. Pada kasus ini, Anda dapat menggunakan operator logikal &&, sebagai berikut:

if ( jenisKelamin == 1 && usia >= 65 )
    ++wanitaDewasa;

Statemen if ini memuat dua kondisi sederhana. Kondisi jenisKelamin == 1 akan dievaluasi untuk menentukan, misalnya, apakah seseorang berjenis kelamin perempuan. Kondisi usia >= 65 dievaluasi untuk menentukan apakah seseorang telah berumur dewasa. Statemen if kemudian memiliki kondisi tergabung

jenisKelamin == 1 && usia >= 65

Kondisi ini bernilai true jika dan hanya jika kedua kondisi sederhana tersebut bernilai true. Terakhir, jika kondisi tergabung tersebut bernilai true, maka wanitaDewasa diinkremen sebesar 1. Jika salah satu atau kedua kondisi sederhana tersebut bernilai false, maka program akan melompati penginkremenan dan berlanjut ke statemen yang terletak setelah statemen if. Kondisi tergabung tersebut dapat dibuat lebih mudah dibaca dengan menambahkan sepasang kurung:

 ( jenisKelamin == 1 ) && ( usia >= 65 )

Tabel pada Gambar 5.15 menyimpulkan operator &&. Tabel tersebut menunjukkan empat kemungkinan kombinasi dari nilai false dan true untuk ekspresi1 dan ekspresi2. Tabel semacam itu disebut dengan tabel kebenaran. JavaScript mengevaluasi menjadi false atau true atas semua ekspresi yang memuat operator relasional, operator ekualitas dan/atau operator logikal.

ekspresi1
ekspresi2
ekspresi1 && ekspresi2
false
false

false
false
true

false
true
false

false
true
true

true
Gambar 5.15 Tabel kebenaran untuk operator && (AND logikal)

Sekarang perhatikan operator || (OR logikal). Dimisalkan bahwa Anda ingin memastikan bahwa salah satu atau kedua kondisi bernilai true sebelum Anda memilih lintasan eksekusi tertentu. Pada kasus ini, Anda menggunakan operator ||, seperti pada segmen program berikut:

if ( rerataSemester >= 90 || ujianAkhir >= 90 )
    document.writeln( "Nilai mahasiswa adalah A" );

Statemen ini juga memuat dua kondisi sederhana. Kondisi rerataSemester >= 90 dievaluasi untuk menentukan apakah mahasiswa layak mendapatkan “A” pada matakuliah tertentu yang dinilai berdasarkan kinerja pada satu semester. Kondisi ujianAkhir >= 90 dievaluasi untuk menentukan apakah mahasiswa layak mendapatkan “A” pada matakuliah tertentu yang dinilai berdasarkan ujian akhir. Statemen if kemudian memiliki kondisi tergabung

rerataSemester >= 90 || ujianAkhir >= 90

dan memberikan mahasiswa nilai “A” jika salah satu atau kedua kondiri bernilai true. Perhatikan bahwa pesan “Nilai mahasiswa adalah A” tidak ditampilkan hanya ketika kedua kondisi sederhana bernilai false. Gambar 5.16 merupakan sebuah tabel kebenaran untuk operator OR logikal (||).

ekspresi1
ekspresi2
ekspresi1 || ekspresi2
false
false

false
false
true

true
true
false

true
true
true

true
Gambar 5.16 Tabel kebenaran untuk operator || (OR logikal)

Operator && memiliki derajat keutamaan lebih tinggi daripada operator ||. Kedua operator tersebut berasosiasi dari kiri ke kanan. Evaluasi terhadap ekspresi

jenisKelamin == 1 && usia >= 65

berhenti dengan segera jika jenisKelamin tidak sama dengan 1 (yaitu, keseluruhan ekpsresi bernilai false) dan berlanjut jika jenisKelamin bernilai 1 (yaitu, keseluruhan ekspresi bisa bernilai true jika kondisi usia >= 65 bernilai true). Sama halnya, operator || akan segera menghasilkan true jika operand pertama bernilai true. Fitur ini disebut dengan evaluasi jalan-pintas.

JavaScript menyediakan operator ! (negasi logikal) untuk memampukan seorang programer dalam membalik makna sebuah kondisi (yaitu, nilai true menjadi false, dan nilai false menjadi true). Tidak seperti operator logikal && dan ||, yang mengkombinasikan dua kondisi, operator negasi logikal hanya mempunyai satu kondisi sebagai operand. Operator negasi logikal ditempatkan sebelum sebuah kondisi untuk memilih sebuah lintasan eksekusi jika kondisi asli (tanpa operator logikal) bernilai false, seperti pada segmen program berikut:

if ( ! ( nilai == nilaiSentinel ) )
    document.writeln( "Nilai berikutnya adalah " + nilai );

Sepasang kurung yang mengapit kondisi nilai == nilaiSentinel diperlukan, karena operator negasi logikal memiliki derajat keutamaan lebih tinggi daripada operator ekualitas. Gambar 5.17 merupakan tabel kebenaran untuk operator negasi logikal.

ekspresi
!ekspresi
false
true

true
false

Gambar 5.17 Tabel kebenaran untuk operator ! (negasi logikal)

Pada banyak kasus, Anda dapat menghindari penggunaan negasi dengan mengekspresikan kondisi secara berbeda menggunakan operator relasional atau operator ekualitas yang sesuai. Sebagai contoh, statemen sebelumnya dapat dituliskan sebagai berikut:

if ( nilai != nilaiSentinel )
    document.writeln( "Nilai berikutnya adalah " + nilai );

Skrip pada Gambar 5.18 mendemonstrasikan semua operator logikal dengan menghasilkan tabel kebenarannya masing-masing. Skrip tersebut menghasilkan sebuah tabel XHTML yang memuat hasil-hasil.


Keluaran dari Gambar 5.18, string “false” dan “true” mengindikasikan nilai operand false dan true pada tiap kondisi. Hasil kondisi ditampilkan sebagai true atau false.

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
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<!-- Gambar 5.18: OperatorLogikal.html -->
<!-- Demonstrasi operator logikal. -->
<html xmlns = "http://www.w3.org/1999/xhtml">
    <head>
        <title>Demonstrasi operator Logikal</title>
        <style type = "text/css">
            table { width: 100% }
            td.left { width: 25% }
        </style>
        <script type = "text/javascript">
            <!--
            document.writeln(
                "<table border = \"1\"" );
            document.writeln(
                "<caption>Demonstrasi Operator " +
                "Logikal</caption>" );
            document.writeln(
                "<tr><td class = \"left\">AND LOGIKAL (&&)</td>" +
                "<td>false && false: " + ( false && false ) +
                "<br />false && true: " + ( false && true ) +
                "<br />true && false: " + ( true && false ) +
                "<br />true && true: " + ( true && true ) +
                "</td></tr>" );
            document.writeln(
                "<tr><td class = \"left\">OR LOGIKAL (||)</td>" +
                "<td>false || false: " + ( false || false ) +
                "<br />false || true: " + ( false || true ) +
                "<br />true || false: " + ( true || false ) +
                "<br />true || true: " + ( true || true ) +
                "</td></tr>" );
            document.writeln(
                "<tr><td class = \"left\">NOT LOGIKAL (!)</td>" +
                "<td>!false: " + ( !false ) +
                "<br />!true: " + ( !true ) + "</td></tr>" );
            document.writeln( "</table>" );
            // -->
        </script>
    </head><body></body>
</html>



Gambar 5.18 Demonstrasi operator-operator logikal


Gambar 5.19 menampilkan derajat keutamaan dan asosiatifitas dari operator-operator JavaScript yang telah dikenalkan sejauh ini. Operator-operator tersebut ditampilkan dari atas ke bawah dengan urutan derajat keutamaan menurun.

Operator
Asosiatifitas
Tipe
++  --  !
kanan ke kiri

unary
* /  %
kiri ke kanan

multiplikatif
+  -
kiri ke kanan

aditif
<  <=  >  >=
kiri ke kanan

relasional
==  !=
kiri ke kanan

ekualitas
&&
kiri ke kanan
AND logikal
||
kiri ke kanan
OR logikal
?:
kanan ke kiri

kondisional
=  +=  -=  *=  /=  %=
kanan ke kiri

penugasan
Gambar 5.19 Derajat keutamaan dan asosiatifitas semua operator yang telah didiskusikan sejauh ini





No comments:

Post a Comment