Tutorial Belajar Pascal Part 38: Percabangan Kondisi IF Bersarang dalam Pascal
Dalam tutorial belajar pascal kali ini kita akan membahas penerapan lanjutan dari struktur IF THEN ELSE, yakni membuat percabangan IF bersarang, atau dikenal juga sebagai nested IF.
Konsep Dasar Kondisi IF Bersarang (Nested IF)
Secara sederhana, IF bersarang atau nested IF adalah penggunaan struktur IF di dalam IF. Kondisi seperti ini sering digunakan untuk kode program yang sudah cukup kompleks.
Terdapat banyak variasi dari nested IF, tergantung kode program yang ingin kita rancang. Salah satunya adalah sebagai berikut:
1 2 3 4 5 6 7 8 9 10 11 12 | IF (kondisi 1 ) THEN begin (kode program 1 ) IF (kondisi 1.1 ) THEN begin (kode program 1.1 ) end ; end ELSE begin (kode program 2 ) end ; |
Dalam contoh ini saya menempatkan sebuah kondisi IF di dalam IF (nested IF). Perhatikan bahwa (kode program 1.1) hanya akan dijalankan jika kondisi 1 dan kondisi 1.1 terpenuhi. Jika kondisi 1 tidak terpenuhi, program akan langsung lompat ke bagian ELSE.
Pascal dan mayoritas bahasa pemrograman lain tidak membatasi jumlah IF di dalam IF. Anda bisa membuat struktur yang lebih rumit seperti ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | IF (kondisi 1 ) THEN begin (kode program 1 ) IF (kondisi 1.1 ) THEN begin (kode program 1.1 ) IF (kondisi 1.1.1 ) THEN begin (kode program 1.1.1 ) end ; end ; end ELSE begin (kode program 2 ) IF (kondisi 2.1 ) THEN begin (kode program 2.1 ) end ; end ; |
Kali ini saya membuat struktur IF di dalam IF di dalam IF (2 level nested IF). Untuk kode program yang panjang seperti ini, anda harus hati-hati menentukan kode program mana yang masuk ke dalam blok IF.
Penulisan indenting (menjorokkan kode program beberapa spasi di awal) juga akan membantu kita membedakan kode program ini masuk IF yang ini, dan kode program itu masuk ke IF yang itu.
Contoh Kode Program Nested IF dalam Pascal
Cukup dengan teori seputar nested IF atau IF bersarang. Mari kita masuk ke contoh program. Saya ingin membuat sebuah program yang meminta input angka (integer), kemudian menginformasikan apakah angka itu angka genap atau ganjil, dan apakah angka itu besar atau kecil dari 10.
Dapatkah anda merancang kode programnya? Tentunya dengan menggunakan konsep nested IF. Disini terdapat 2 kondisi dengan 4 kemungkinan:
- Angka genap dan besar dari 10
- Angka genap dan kecil dari 10
- Angka ganjil dan besar dari 10
- Angka ganjil dan kecil dari 10
Berikut kode program yang saya gunakan:
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 | program struktur_if_then_else_nested; uses crt; var angka: integer ; begin clrscr; write ( 'Masukkan sebuah angka: ' ); readln(angka); if (angka mod 2 = 0 ) then begin write ( 'Angka yang anda masukkan merupakan bilangan genap ' ); if (angka > 10 ) then begin writeln ( 'dan besar dari 10' ); end else begin writeln ( 'dan kecil dari 10' ); end ; end else begin write ( 'Angka yang anda masukkan merupakan bilangan ganjil ' ); if (angka > 10 ) then begin writeln ( 'dan besar dari 10' ); end else begin writeln ( 'dan kecil dari 10' ); end ; end ; readln; end . |
Silahkan pelajari sebentar kode program diatas. Jika anda sudah mengikuti seluruh tutorial pascal di duniailkom, saya yakin bisa membaca maksud kode program ini (walaupun agak panjang).
Kemampuan logika juga akan berperan. Sebagai contoh, saya tidak perlu memeriksa apakah angka tersebut kecil dari 10, atau apakah angka itu tidak habis dibagi 2. Kondisi ini cukup dibuat menggunakan ELSE. Jika sebuah angka tidak lebih besar dari 10, pastinya angka itu kecil dari 10 (tidak perlu diperiksa). Jika angka tidak habis dibagi 2, berarti angka tersebut ganjil.
Saya juga menggunakan perintah write dan writeln secara bergantian, agar hasil akhir teks menjadi 1 baris.
Silahkan anda input berbagai angka, dan test apakah kode program tersebut sudah benar atau ada yang kurang.
Alternatif Penggunaan Nested IF
Dalam beberapa situasi, kita bisa mengubah nested IF menjadi IF "biasa" dengan bantuan operator logika AND.
Kode program yang saya buat sebelumnya digunakan untuk membuat hasil untuk 4 kemungkinan:
- Angka genap dan besar dari 10
- Angka genap dan kecil dari 10
- Angka ganjil dan besar dari 10
- Angka ganjil dan kecil dari 10
Dengan demikian, saya juga bisa membuat kode program sebagai berikut:
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 | program struktur_if_then_else_nested; uses crt; var angka: integer ; begin clrscr; write ( 'Masukkan sebuah angka: ' ); readln(angka); if (angka mod 2 = 0 ) and (angka > 10 ) then begin writeln ( 'Angka yang anda masukkan merupakan bilangan genap dan besar dari 10' ); end else if (angka mod 2 = 0 ) and (angka < 10 ) then begin writeln ( 'Angka yang anda masukkan merupakan bilangan genap dan kecil dari 10' ); end else if (angka mod 2 <> 0 ) and (angka > 10 ) then begin writeln ( 'Angka yang anda masukkan merupakan bilangan ganjil dan besar dari 10' ); end else if (angka mod 2 <> 0 ) and (angka < 10 ) then begin writeln ( 'Angka yang anda masukkan merupakan bilangan ganjil dan kecil dari 10' ); end ; readln; end . |
Yup, kali ini tanpa nested IF dan hasil yang didapat sama persis dengan kode program kita sebelumnya. Bagi kebanyakan orang, kode ini juga lebih mudah dibaca, karena kita langsung bisa melihat kondisi apa saja yang akan diperiksa.
Namun dari sudut pandang performa, nested IF lebih efisien daripada ini. Dalam situasi terburuk, variabel angka hanya diperiksa sebanyak 2 kali jika menggunakan nested IF. Misalkan saya menginput angka:= 7, pertama kali akan diperiksa kondisi: if (angka mod 2 = 0)? Tidak, program langsung menjalankan bagian ELSE, dan masuk ke kondisi kedua: if (angka > 10)? Tidak, jalankan ELSE.
Sedangkan yang tanpa nested IF, variabel angka akan diperiksa lebih dari 4 kali. Pertama if (angka mod 2 = 0)? Tidak. Program lanjut ke bagian ELSE IF kedua: if (angka mod 2 = 0)? Juga tidak, lanjut ke ELSE IF ketiga: if (angka mod 2 <> 0)? Betul. Kali ini program akan masuk ke kondisi (angka > 10)? Tidak. Sehingga akan dijalankan ELSE terakhir: if (angka mod 2 <> 0) and (angka < 10)? Benar.
Untuk kode program yang sederhana seperti diatas, efeknya tidak akan terasa (karena dieksekusi dengan sangat cepat). Beberapa programmer juga tidak keberatan mengorbankan sedikit performa agar kode program mudah dibaca daripada menggunakan nested IF.
Hati-hati Dengan Kesalahan Logika!
Dalam pembuatan kode program, kita sering melakukan kesalahan. Misalnya lupa menambahkan penutup titik koma ' ; ' diakhir setiap perintah atau salah memberikan tipe data ke sebuah variabel.
Kesalahan seperti ini disebut sebagai syntax error. Meskipun sering terjadi, error seperti ini gampang ditemukan. Compiler Pascal (aplikasi yang menerjemahkan kode program yang kita ketik), akan langsung menampilkan pesan error ini sebagai syntax error.
Jenis error yang kedua adalah kesalahan logika (logic error). Berbeda dengan syntax error, logic error sangat susah ditemukan. Error jenis ini tidak akan "diprotes" oleh compiler pascal, karena penulisan kode programnya memang sudah benar. Kesalahan ini disebabkan dari programmernya sendiri yang kurang hati-hati.
Sebagai contoh, 2 kode program yang saya tulis diatas mengandung kesalahan logika yang cukup fatal. Dapatkah anda menemukannya? Kode programnya sendiri memang tidak mengandung syntax error, soalnya kalau ada, program tentu tidak akan bisa jalan.
Masih belum ketemu? Bagaimana jika saya gunakan angka 10 sebagai input program?
Yup, kode program yang saya tulis hanya bisa membedakan angka yang kurang dari 10, dan angka yang lebih dari 10. Tetapi tidak untuk angka 10 itu sendiri.
Untuk contoh yang nested IF, hasilnya adalah: Angka yang anda masukkan merupakan bilangan genap dan kecil dari 10. Sedangkan untuk contoh kode program yang menggunakan operator AND. Tidak akan tampil hasil apa-apa.
Ini terjadi karena kode program tersebut "tidak sadar" bahwa ada 1 lagi logika kondisi, yakni jika angka tersebut adalah 10. Artinya, seharusnya ada 5 kemungkinan:
- Angka genap dan besar dari 10
- Angka genap dan kecil dari 10
- Angka ganjil dan besar dari 10
- Angka ganjil dan kecil dari 10
- Angka genap dan sama dengan 10
Sebagai solusi dari masalah ini, anda bisa menambahkan 1 lagi kondisi if untuk memeriksa if (angka = 10). Kode programnya tentu semakin kompleks, tapi bagus sebagai sarana latihan. Silahkan anda modifikasi kode diatas, dan test apakah anda bisa memodifikasi kode programnya untuk memproses angka 10.
Dalam tutorial ini kita telah membahas tentang struktur IF bersarang atau dikenal juga sebagai nested IF. Selain itu kita telah melihat salah satu contoh kesalahan logika yang bisa saja terjadi pada aplikasi yang sedang anda rancang.
Selain menggunakan struktur IF THEN ELSE, di dalam Pascal juga tersedia percabangan kode program menggunakan kondisi CASE. Inilah yang akan kita bahas selanjutnya: Tutorial Percabangan Kondisi CASE dalam bahasa pemrograman Pascal.
Out Of Topic Show Konversi KodeHide Konversi Kode Show EmoticonHide Emoticon