P Pascal dan Algoritma
Modul 6 dari 50 Roadmap
Modul 06 - Fase Dasar

Percabangan IF-THEN-ELSE

Modul ini memasuki struktur kontrol kedua setelah sequence: selection atau pemilihan. Anda akan mempelajari percabangan satu arah, dua arah, dan bersarang, aturan pasangan else, penggunaan blok begin...end pada cabang majemuk, serta kesalahan logika umum pada kondisi yang sering menimbulkan bug.

Estimasi 130 menit Tingkat Dasar-Menengah 4 Flowchart 5 Program Pascal 5 Latihan
01

Tujuan Pembelajaran

Kompetensi yang ingin dicapai setelah menyelesaikan modul ini

Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:

  1. Menjelaskan konsep percabangan dan posisinya sebagai struktur selection.
  2. Menulis percabangan satu arah dengan if...then.
  3. Menulis percabangan dua arah dengan if...then...else.
  4. Menggunakan blok begin...end pada cabang yang memuat lebih dari satu pernyataan.
  5. Menjelaskan aturan pemasangan else pada percabangan bersarang.
  6. Menyusun kondisi majemuk dengan operator logika and, or, dan not.
  7. Menghindari kesalahan logika umum pada kondisi majemuk.
  8. Menggambar flowchart untuk percabangan satu arah, dua arah, dan bersarang.
  9. Menerjemahkan logika percabangan ke dalam pseudocode dan kode Pascal.
  10. Memecahkan masalah nyata dengan percabangan bertingkat.
02

Capaian Pembelajaran

Indikator ketercapaian dan kaitan dengan modul selanjutnya

Capaian Pembelajaran Mata Kuliah

Mahasiswa mampu merancang logika pengambilan keputusan pada program dengan percabangan yang benar, jelas, dan bebas dari kesalahan logika, serta menerjemahkannya ke dalam kode Pascal yang dapat dikompilasi.

Indikator Ketercapaian Modul

Kode Indikator Bukti
IK-6.1 Menulis percabangan satu arah, dua arah, dan bersarang Latihan 1 dan 2
IK-6.2 Menggunakan blok begin...end pada cabang majemuk Latihan 2 dan 3
IK-6.3 Menyusun kondisi majemuk dengan operator logika Latihan 3 dan 4
IK-6.4 Menggambar flowchart percabangan dengan simbol yang tepat Latihan 4 dan studi kasus
IK-6.5 Mengidentifikasi kesalahan logika pada kondisi Latihan 5
Kaitan dengan Modul Berikutnya

Percabangan if adalah dasar untuk seluruh pengambilan keputusan dalam program. Modul 7 akan membahas case yang merupakan alternatif percabangan ketika kondisinya berbasis nilai ordinal. Modul 8 dan 9 akan menggabungkan percabangan dengan perulangan.

03

Materi Teori

Konsep percabangan, sintaks, aturan, dan pola umum

3.1 Konsep Percabangan

Sejauh ini program yang kita tulis berjalan lurus dari atas ke bawah. Setiap pernyataan dieksekusi satu kali secara berurutan. Namun banyak masalah nyata memerlukan keputusan: jika nilai ujian mencukupi, tampilkan "LULUS"; jika tidak, tampilkan "TIDAK LULUS".

Percabangan (branching) atau pemilihan (selection) memungkinkan program memilih satu jalur eksekusi dari beberapa alternatif berdasarkan kondisi tertentu. Ini adalah struktur kontrol kedua dalam teorema Bohm-Jacopini setelah sequence.

Definisi Kondisi

Kondisi adalah ekspresi yang menghasilkan nilai boolean (true atau false). Kondisi dapat berupa perbandingan sederhana seperti nilai > 70 atau gabungan beberapa perbandingan dengan operator logika.

3.2 Percabangan Satu Arah: IF-THEN

Bentuk paling sederhana dari percabangan. Bila kondisi benar, blok pernyataan dieksekusi. Bila salah, program melanjutkan ke pernyataan setelah blok if.

jika kondisi maka
  pernyataan
akhir jika

Sintaks Pascal:

if_then.pasPascal
if nilai > 70 then
  writeln('LULUS');

Perhatikan bahwa setelah kata kunci then, hanya satu pernyataan yang dieksekusi sebagai bagian dari percabangan. Bila perlu mengeksekusi beberapa pernyataan, bungkus dalam begin...end.

if_then_blok.pasPascal
if nilai > 70 then
begin
  writeln('LULUS');
  writeln('Selamat!');
  totalLulus := totalLulus + 1;
end;
Penting: Titik Koma Sebelum else

Perhatikan bahwa tidak ada titik koma sebelum kata kunci else. Titik koma hanya muncul di akhir pernyataan terakhir di dalam blok begin...end, bukan setelah end yang mendahului else. Kesalahan ini adalah salah satu yang paling sering terjadi.

3.3 Percabangan Dua Arah: IF-THEN-ELSE

Ketika kita ingin mengeksekusi satu blok bila kondisi benar dan blok lain bila kondisi salah, gunakan bentuk dua arah.

jika kondisi maka
  pernyataan_1
selain itu
  pernyataan_2
akhir jika

Sintaks Pascal:

if_then_else.pasPascal
if nilai >= 70 then
  writeln('LULUS')
else
  writeln('TIDAK LULUS');

Perhatikan dua hal. Pertama, tidak ada titik koma setelah writeln('LULUS') karena diikuti else. Kedua, seluruh konstruksi if...then...else diakhiri dengan satu titik koma di akhir, setelah cabang else.

3.4 Percabangan dengan Blok Majemuk

Ketika salah satu atau kedua cabang memuat lebih dari satu pernyataan, gunakan blok begin...end.

if_else_blok.pasPascal
if nilai >= 70 then
begin
  writeln('LULUS');
  writeln('Nilai akhir: ', nilai);
  totalLulus := totalLulus + 1;
end
else
begin
  writeln('TIDAK LULUS');
  writeln('Nilai akhir: ', nilai);
  totalTidakLulus := totalTidakLulus + 1;
end;

Perhatikan kembali aturan titik koma:

3.5 Percabangan Bersarang

Percabangan dapat berada di dalam percabangan lain, membentuk struktur bersarang. Ini diperlukan ketika pengambilan keputusan dilakukan secara bertingkat.

if_bersarang.pasPascal
if nilai >= 85 then
  writeln('Nilai A')
else if nilai >= 70 then
  writeln('Nilai B')
else if nilai >= 60 then
  writeln('Nilai C')
else if nilai >= 50 then
  writeln('Nilai D')
else
  writeln('Nilai E');

Konstruksi else if adalah pola umum untuk memilih dari beberapa alternatif. Dalam Pascal tidak ada kata kunci elif; kita menuliskan else if secara berurutan.

Aturan Pemasangan ELSE

Pada percabangan bersarang, setiap else berpasangan dengan if terdekat yang belum memiliki else. Aturan ini disebut dangling else. Untuk menghindari ambiguitas, selalu gunakan begin...end atau susun ulang logika.

Contoh Ambiguitas Dangling Else

Perhatikan kode berikut:

dangling_else.pasPascal
if a > 0 then
  if b > 0 then
    writeln('Keduanya positif')
  else
    writeln('a positif, b tidak');

Secara teknis, else berpasangan dengan if b > 0, bukan if a > 0. Bila ingin else berpasangan dengan if a > 0, gunakan blok:

dangling_else_aman.pasPascal
if a > 0 then
begin
  if b > 0 then
    writeln('Keduanya positif');
end
else
  writeln('a tidak positif');

3.6 Kondisi Majemuk

Kondisi pada if dapat digabungkan dengan operator logika and, or, dan not.

kondisi_majemuk.pasPascal
{ Rentang nilai 70-100 }
if (nilai >= 70) and (nilai <= 100) then
  writeln('Nilai valid dan lulus');

{ Salah satu dari dua kondisi }
if (hari = 'Sabtu') or (hari = 'Minggu') then
  writeln('Akhir pekan');

{ Negasi }
if not (sudahLogin) then
  writeln('Anda belum login');
Selalu Gunakan Tanda Kurung

Meskipun prioritas operator sudah jelas, selalu bungkus setiap perbandingan dengan tanda kurung ketika digabungkan dengan operator logika. Ini mencegah kesalahan dan memperjelas maksud kode.

Kesalahan Logika pada Kondisi Majemuk

Kesalahan paling umum adalah menuliskan rentang tanpa operator logika, yang dalam Pascal dievaluasi menjadi ekspresi boolean yang aneh.

kesalahan_rentang.pasPascal
{ SALAH: selalu true karena dievaluasi sebagai
  (0 <= nilai) <= 100, dan (0 <= nilai) bernilai true/false
  yang kemudian dibandingkan dengan 100 }
if 0 <= nilai <= 100 then
  writeln('Rentang valid');

{ BENAR: gunakan and }
if (nilai >= 0) and (nilai <= 100) then
  writeln('Rentang valid');

3.7 Pola Validasi Berbasis Kondisi Majemuk

Percabangan if sering dipakai untuk memvalidasi masukan. Pola umumnya adalah memeriksa apakah nilai berada dalam rentang yang sah, dan menampilkan pesan kesalahan bila tidak.

validasi.pasPascal
if (nilai < 0) or (nilai > 100) then
begin
  writeln('Kesalahan: nilai harus 0-100');
  writeln('Nilai yang Anda masukkan: ', nilai);
end
else
  writeln('Nilai valid: ', nilai);

3.8 Perbandingan dengan CASE-OF

Ketika percabangan berbasis satu variabel dengan banyak nilai diskrit, case sering lebih ringkas. Namun untuk kondisi berbasis rentang atau kombinasi beberapa variabel, if tetap lebih fleksibel.

Aspek IF CASE
Kondisi Bebas, dapat berupa boolean apa pun Berbasis nilai ordinal (integer, char, enumerasi)
Rentang Didukung penuh Didukung dengan sintaks 1..10
Kombinasi variabel Dapat menggabungkan beberapa variabel Hanya satu variabel penyeleksi
Jumlah alternatif Baik untuk 2-5 alternatif Baik untuk banyak alternatif
Efisiensi Cukup baik Lebih efisien untuk banyak nilai

3.9 Kesalahan Umum Percabangan

  1. Titik koma sebelum else. Mengakibatkan kesalahan kompilasi karena else dianggap tidak berpasangan.
  2. Lupa begin...end. Hanya pernyataan pertama yang dianggap bagian dari percabangan, sisanya selalu dieksekusi.
  3. Menulis 0 <= nilai <= 100. Selalu bernilai true karena dievaluasi dari kiri ke kanan. Gunakan and.
  4. Menggunakan = untuk penugasan. Dalam kondisi, = adalah pembanding; untuk penugasan gunakan :=.
  5. Ambiguitas dangling else. Selalu bungkus blok dalam begin...end bila ada percabangan bersarang.
  6. Kondisi berbalik. Menuliskan kondisi yang kebalikan dari yang dimaksud. Baca ulang logika sebelum mengompilasi.
  7. Lupa menginisialisasi variabel yang dipakai dalam kondisi. Variabel lokal tanpa inisialisasi bernilai acak.
  8. Menggunakan and/or pada nilai non-boolean. Operator ini juga bitwise untuk integer; pastikan operand bertipe boolean.

3.10 Perbedaan Free Pascal dan Turbo Pascal

Aspek Turbo Pascal Free Pascal
Percabangan if Didukung Didukung, sama
else if Didukung Didukung, sama
Operator logika Short-circuit tidak aktif default Short-circuit aktif default
Tipe boolean Boolean klasik (1 byte) Boolean klasik + ByteBool, WordBool, LongBool
04

Algoritma dan Flowchart

Representasi visual untuk percabangan satu arah, dua arah, dan bersarang

4.1 Flowchart Percabangan Satu Arah

flowchart TD
    A(["Mulai"]) --> B[/"Baca nilai"/]
    B --> C{"nilai > 70?"}
    C -- "Ya" --> D[/"Tampilkan LULUS"/]
    C -- "Tidak" --> E["Lewati"]
    D --> F(["Selesai"])
    E --> F
      

Gambar 4.1 - Flowchart percabangan satu arah

4.2 Flowchart Percabangan Dua Arah

flowchart TD
    A(["Mulai"]) --> B[/"Baca nilai"/]
    B --> C{"nilai >= 70?"}
    C -- "Ya" --> D[/"Tampilkan LULUS"/]
    C -- "Tidak" --> E[/"Tampilkan TIDAK LULUS"/]
    D --> F(["Selesai"])
    E --> F
      

Gambar 4.2 - Flowchart percabangan dua arah

4.3 Flowchart Percabangan Bersarang: Konversi Nilai ke Huruf Mutu

flowchart TD
    A(["Mulai"]) --> B[/"Baca nilai"/]
    B --> C{"nilai >= 85?"}
    C -- "Ya" --> D["Huruf = 'A'"]
    C -- "Tidak" --> E{"nilai >= 70?"}
    E -- "Ya" --> F["Huruf = 'B'"]
    E -- "Tidak" --> G{"nilai >= 60?"}
    G -- "Ya" --> H["Huruf = 'C'"]
    G -- "Tidak" --> I{"nilai >= 50?"}
    I -- "Ya" --> J["Huruf = 'D'"]
    I -- "Tidak" --> K["Huruf = 'E'"]
    D --> L[/"Tampilkan huruf"/]
    F --> L
    H --> L
    J --> L
    K --> L
    L --> M(["Selesai"])
      

Gambar 4.3 - Flowchart percabangan bersarang konversi nilai ke huruf mutu

4.4 Flowchart Klasifikasi Bilangan

Contoh klasifikasi bilangan bulat menjadi positif, negatif, atau nol, dengan penanganan tambahan untuk bilangan genap dan ganjil.

flowchart TD
    A(["Mulai"]) --> B[/"Baca n"/]
    B --> C{"n > 0?"}
    C -- "Ya" --> D{"n mod 2 = 0?"}
    C -- "Tidak" --> E{"n < 0?"}
    D -- "Ya" --> F[/"Positif Genap"/]
    D -- "Tidak" --> G[/"Positif Ganjil"/]
    E -- "Ya" --> H["Negatif"]
    E -- "Tidak" --> I["Nol"]
    H --> J[/"Tampilkan klasifikasi"/]
    I --> J
    F --> J
    G --> J
    J --> K(["Selesai"])
      

Gambar 4.4 - Flowchart klasifikasi bilangan dengan percabangan bersarang

05

Pseudocode

Representasi algoritmik untuk percabangan

5.1 Pseudocode Konversi Nilai ke Huruf Mutu

PROGRAM KonversiNilaiHuruf
{ Mengkonversi nilai numerik menjadi huruf mutu }

DEKLARASI
  nilai : integer
  huruf : char

ALGORITMA
  write("Masukkan nilai ujian (0-100): ")
  read(nilai)

  jika (nilai < 0) atau (nilai > 100) maka
    write("Kesalahan: nilai di luar rentang")
  selain itu
    jika nilai >= 85 maka
      huruf <- 'A'
    selain jika nilai >= 70 maka
      huruf <- 'B'
    selain jika nilai >= 60 maka
      huruf <- 'C'
    selain jika nilai >= 50 maka
      huruf <- 'D'
    selain itu
      huruf <- 'E'
    akhir jika

    write("Nilai: ", nilai)
    write("Huruf mutu: ", huruf)
  akhir jika
END

5.2 Pseudocode Klasifikasi Segitiga

PROGRAM KlasifikasiSegitiga
{ Menentukan jenis segitiga berdasarkan panjang sisinya }

DEKLARASI
  a, b, c : real

ALGORITMA
  write("Masukkan sisi a: ")
  read(a)
  write("Masukkan sisi b: ")
  read(b)
  write("Masukkan sisi c: ")
  read(c)

  jika (a + b <= c) atau (a + c <= b) atau (b + c <= a) maka
    write("Bukan segitiga yang valid")
  selain itu
    jika (a = b) dan (b = c) maka
      write("Segitiga sama sisi")
    selain jika (a = b) atau (a = c) atau (b = c) maka
      write("Segitiga sama kaki")
    selain itu
      write("Segitiga sembarang")
    akhir jika
  akhir jika
END

5.3 Pseudocode Penentuan Tarif Pajak Progresif

PROGRAM PajakProgresif
{ Menentukan tarif pajak berdasarkan penghasilan }

KONSTANTA
  BATAS_1 = 5000000
  BATAS_2 = 25000000
  BATAS_3 = 50000000

DEKLARASI
  penghasilan : currency
  tarif       : real
  persen      : integer

ALGORITMA
  write("Penghasilan bulanan (Rp): ")
  read(penghasilan)

  jika penghasilan < BATAS_1 maka
    tarif  <- 0.05
    persen <- 5
  selain jika penghasilan < BATAS_2 maka
    tarif  <- 0.10
    persen <- 10
  selain jika penghasilan < BATAS_3 maka
    tarif  <- 0.15
    persen <- 15
  selain itu
    tarif  <- 0.20
    persen <- 20
  akhir jika

  write("Tarif pajak: ", persen, " persen")
  write("Pajak: Rp ", penghasilan * tarif)
END
06

Contoh Kode Pascal Lengkap

Lima program untuk mendemonstrasikan percabangan

6.1 Program Cek Bilangan Ganjil Genap

cek_ganjil_genap.pas Pascal
program CekGanjilGenap;
{ Menentukan apakah bilangan bulat genap atau ganjil }

var
  n: integer;

begin
  write('Masukkan bilangan bulat: ');
  readln(n);

  if n mod 2 = 0 then
    writeln(n, ' adalah bilangan genap')
  else
    writeln(n, ' adalah bilangan ganjil');
end.

Contoh sesi interaksi:

Masukkan bilangan bulat: 17
17 adalah bilangan ganjil

6.2 Program Validasi Nilai Ujian

validasi_nilai.pas Pascal
program ValidasiNilai;
{ Memvalidasi nilai ujian dalam rentang 0-100 }

const
  NILAI_MIN = 0;
  NILAI_MAKS = 100;

var
  nama: string;
  nilai: integer;

begin
  write('Nama mahasiswa : ');
  readln(nama);

  write('Nilai ujian    : ');
  readln(nilai);

  writeln;

  if (nilai >= NILAI_MIN) and (nilai <= NILAI_MAKS) then
  begin
    writeln('Nama  : ', nama);
    writeln('Nilai : ', nilai);
    writeln('Status: VALID');

    if nilai >= 70 then
      writeln('Hasil : LULUS')
    else
      writeln('Hasil : TIDAK LULUS');
  end
  else
  begin
    writeln('Nama  : ', nama);
    writeln('Nilai : ', nilai);
    writeln('Status: TIDAK VALID');
    writeln('Keterangan: nilai harus antara ',
            NILAI_MIN, ' dan ', NILAI_MAKS);
  end;
end.

Contoh keluaran (nilai valid):

Nama mahasiswa : Andi Wijaya
Nilai ujian    : 78

Nama  : Andi Wijaya
Nilai : 78
Status: VALID
Hasil : LULUS

6.3 Program Konversi Nilai ke Huruf Mutu

huruf_mutu.pas Pascal
program HurufMutu;
{ Mengkonversi nilai numerik ke huruf mutu }

var
  nilai: integer;
  huruf: char;

begin
  write('Masukkan nilai ujian (0-100): ');
  readln(nilai);

  if (nilai < 0) or (nilai > 100) then
    writeln('Kesalahan: nilai di luar rentang yang sah')
  else
  begin
    if nilai >= 85 then
      huruf := 'A'
    else if nilai >= 70 then
      huruf := 'B'
    else if nilai >= 60 then
      huruf := 'C'
    else if nilai >= 50 then
      huruf := 'D'
    else
      huruf := 'E';

    writeln;
    writeln('Nilai      : ', nilai);
    writeln('Huruf mutu : ', huruf);
  end;
end.

6.4 Program Klasifikasi Segitiga

klasifikasi_segitiga.pas Pascal
program KlasifikasiSegitiga;
{ Menentukan jenis segitiga berdasarkan panjang sisinya }

var
  a, b, c: real;
  jenis: string;

begin
  writeln('Masukkan panjang tiga sisi segitiga:');
  write('Sisi a: ');  readln(a);
  write('Sisi b: ');  readln(b);
  write('Sisi c: ');  readln(c);

  if (a + b <= c) or (a + c <= b) or (b + c <= a) then
    jenis := 'Bukan segitiga yang valid'
  else if (a = b) and (b = c) then
    jenis := 'Segitiga sama sisi'
  else if (a = b) or (a = c) or (b = c) then
    jenis := 'Segitiga sama kaki'
  else
    jenis := 'Segitiga sembarang';

  writeln;
  writeln('Sisi a: ', a:0:2);
  writeln('Sisi b: ', b:0:2);
  writeln('Sisi c: ', c:0:2);
  writeln('Jenis : ', jenis);
end.

Contoh keluaran:

Masukkan panjang tiga sisi segitiga:
Sisi a: 5
Sisi b: 5
Sisi c: 5

Sisi a: 5.00
Sisi b: 5.00
Sisi c: 5.00
Jenis : Segitiga sama sisi

6.5 Program Kalkulator Diskon Berjenjang

diskon_berjenjang.pas Pascal
program DiskonBerjenjang;
{ Menghitung diskon berdasarkan total belanja }

const
  BATAS_1  = 100000;
  BATAS_2  = 500000;
  BATAS_3  = 1000000;
  DISKON_1 = 0.05;
  DISKON_2 = 0.10;
  DISKON_3 = 0.15;

var
  totalBelanja: currency;
  persenDiskon: integer;
  nilaiDiskon : currency;
  totalBayar  : currency;

begin
  write('Total belanja (Rp): ');
  readln(totalBelanja);

  if totalBelanja < BATAS_1 then
  begin
    persenDiskon := 0;
    nilaiDiskon  := 0;
  end
  else if totalBelanja < BATAS_2 then
  begin
    persenDiskon := 5;
    nilaiDiskon  := totalBelanja * DISKON_1;
  end
  else if totalBelanja < BATAS_3 then
  begin
    persenDiskon := 10;
    nilaiDiskon  := totalBelanja * DISKON_2;
  end
  else
  begin
    persenDiskon := 15;
    nilaiDiskon  := totalBelanja * DISKON_3;
  end;

  totalBayar := totalBelanja - nilaiDiskon;

  writeln;
  writeln('========================================');
  writeln('Total belanja  : Rp ', totalBelanja:0:2);
  writeln('Diskon         : ', persenDiskon, '%');
  writeln('Nilai diskon   : Rp ', nilaiDiskon:0:2);
  writeln('----------------------------------------');
  writeln('Total bayar    : Rp ', totalBayar:0:2);
  writeln('========================================');
end.

Contoh keluaran:

Total belanja (Rp): 750000

========================================
Total belanja  : Rp 750000.00
Diskon         : 10%
Nilai diskon   : Rp 75000.00
----------------------------------------
Total bayar    : Rp 675000.00
========================================
07

Penjelasan Kode Baris per Baris

Membedah program ValidasiNilai dan HurufMutu secara rinci

7.1 Program ValidasiNilai

Baris Kode Penjelasan
5-6 NILAI_MIN = 0;
NILAI_MAKS = 100;
Dua konstanta untuk batas nilai. Dengan konstanta, bila aturan validasi berubah, cukup ubah di satu tempat.
8-10 nama: string;
nilai: integer;
Variabel untuk menyimpan nama dan nilai.
16 if (nilai >= NILAI_MIN) and (nilai <= NILAI_MAKS) then Kondisi majemuk memeriksa apakah nilai berada dalam rentang yang sah. Setiap perbandingan dibungkus tanda kurung, lalu digabungkan dengan and. Kedua perbandingan harus benar agar nilai dianggap valid.
17-19 begin
writeln('Nama : ', nama);
...
Blok begin...end membungkus cabang "nilai valid". Ada lima pernyataan di dalamnya.
22-25 if nilai >= 70 then
writeln('Hasil : LULUS')
else
writeln('Hasil : TIDAK LULUS');
Percabangan bersarang di dalam cabang "nilai valid". Ini adalah percabangan dua arah yang memeriksa kelulusan. Perhatikan bahwa end; setelah cabang luar di baris ke-26 mengakhiri blok luar.
26-33 end
else
begin
...
Cabang else dari percabangan luar, dieksekusi ketika nilai tidak valid. Perhatikan aturan titik koma: end sebelum else tidak diikuti titik koma, sedangkan end di akhir (baris ke-33) diikuti titik koma.
31-32 writeln('Keterangan: nilai harus antara ',
NILAI_MIN, ' dan ', NILAI_MAKS);
Menampilkan batas nilai menggunakan konstanta, sehingga pesan otomatis menyesuaikan bila konstanta diubah.

7.2 Program HurufMutu

Baris Kode Penjelasan
5-6 nilai: integer;
huruf: char;
Variabel huruf bertipe char karena menyimpan satu karakter huruf mutu.
13-14 if (nilai < 0) or (nilai > 100) then
writeln('Kesalahan: ...')
Validasi rentang. Karena kita ingin mendeteksi nilai di luar rentang, kondisi menggunakan or: cukup salah satu perbandingan benar untuk menyatakan nilai tidak sah.
16-24 if nilai >= 85 then
huruf := 'A'
else if nilai >= 70 then
...
Rantai else if untuk mengklasifikasi nilai. Perhatikan urutan pemeriksaan: dari batas tertinggi ke terendah. Ini penting karena begitu kondisi pertama terpenuhi, sisa rantai dilewati.
25-26 else
huruf := 'E';
Cabang terakhir tanpa kondisi. Ini menangkap semua nilai yang belum tertangkap oleh kondisi sebelumnya, yaitu nilai di bawah 50.
28-30 writeln;
writeln('Nilai : ', nilai);
writeln('Huruf mutu : ', huruf);
Menampilkan hasil. Perhatikan jarak antar kolom di dalam string literal untuk merapikan tampilan.

7.3 Jejak Eksekusi HurufMutu untuk nilai = 78

Kondisi Hasil Aksi
nilai < 0 or nilai > 100FALSELewati cabang kesalahan
nilai >= 85FALSE (78 < 85)Lanjut ke kondisi berikutnya
nilai >= 70TRUEhuruf := 'B'
Sisa rantai-Dilewati

Hasil akhir: huruf = 'B'. Program menampilkan "Nilai: 78" dan "Huruf mutu: B".

Pelajaran Kunci

Urutan pemeriksaan pada rantai else if sangat penting. Bila diperiksa dari kondisi terendah ke tertinggi, hampir semua nilai akan tertangkap oleh kondisi pertama. Selalu urutkan dari kondisi paling spesifik atau paling ketat ke paling longgar.

08

Latihan Soal

Lima soal dengan tingkat kesulitan bertingkat

1

Bilangan Positif, Negatif, atau Nol

Mudah

Buat program yang membaca sebuah bilangan bulat dan menentukan apakah bilangan tersebut positif, negatif, atau nol.

Ketentuan:

  • Gambar flowchart dan tulis pseudocode.
  • Tulis kode Pascal lengkap dengan nama program CekTandaBilangan.
  • Gunakan percabangan bertingkat if...else if...else.
2

Tahun Kabisat

Mudah

Tahun kabisat adalah tahun yang habis dibagi 4, kecuali tahun abad (habis dibagi 100) yang bukan kabisat, kecuali tahun yang habis dibagi 400.

Aturan:

  • Bila tahun habis dibagi 400 → kabisat.
  • Bila tahun habis dibagi 100 → bukan kabisat.
  • Bila tahun habis dibagi 4 → kabisat.
  • Selain itu → bukan kabisat.

Ketentuan:

  • Gunakan operator mod.
  • Gambar flowchart.
  • Tulis pseudocode dan kode Pascal lengkap.

Pertanyaan analisis: mengapa kita tidak bisa menggabungkan aturan menjadi (tahun mod 4 = 0) and (tahun mod 100 <> 0) saja?

3

Klasifikasi Nilai dengan Keterangan

Sedang

Buat program yang menerima nama mahasiswa dan nilai ujian (0-100), lalu menampilkan huruf mutu dan keterangan status.

Aturan:

  • A (85-100): "Lulus dengan pujian"
  • B (70-84): "Lulus"
  • C (60-69): "Lulus dengan perbaikan"
  • D (50-59): "Lulus bersyarat"
  • E (0-49): "Tidak lulus"

Ketentuan:

  • Validasi rentang nilai terlebih dahulu.
  • Tampilkan nama, nilai, huruf mutu, dan keterangan.
  • Gunakan percabangan bersarang.

Pertanyaan analisis: bila masukan nilai adalah 105, apa yang seharusnya terjadi? Bagaimana cara memastikan program tidak salah mengklasifikasi?

4

Kalkulator Indeks Massa Tubuh

Sedang

Buat program yang menghitung Indeks Massa Tubuh (IMT) berdasarkan berat badan (kg) dan tinggi badan (m), lalu mengklasifikasikan hasilnya.

Rumus: IMT = berat / (tinggi × tinggi)

Klasifikasi:

  • IMT < 18.5: "Kurus"
  • 18.5 ≤ IMT < 25: "Normal"
  • 25 ≤ IMT < 30: "Kelebihan berat"
  • IMT ≥ 30: "Obesitas"

Ketentuan:

  • Gambar flowchart dan tulis pseudocode.
  • Simpan batas IMT sebagai konstanta bertipe real.
  • Tampilkan nilai IMT dengan dua angka desimal beserta klasifikasinya.
  • Validasi agar tinggi badan tidak nol (untuk menghindari pembagian dengan nol).

Pertanyaan analisis: mengapa penting memvalidasi tinggi badan sebelum melakukan pembagian? Apa yang akan terjadi bila tinggi badan nol dan validasi tidak dilakukan?

5

Deteksi Kesalahan Logika Percabangan

Sulit

Program berikut memiliki enam kesalahan terkait sintaks atau logika percabangan. Temukan semuanya, lalu tuliskan versi yang benar.

kacau_if.pasPascal
program KacauIf;

var
  nilai: integer;
  huruf: char;

begin
  write('Nilai: ');
  readln(nilai);

  if 0 <= nilai <= 100 then
    if nilai >= 85 then
      huruf := 'A';
    else if nilai >= 70 then
      huruf := 'B';
    else
      huruf := 'C'
    writeln('Huruf: ', huruf);

  if nilai > 100 then
    writeln('Nilai terlalu besar');
    writeln('Periksa kembali nilai');
end.

Ketentuan:

  • Sebutkan nomor baris setiap kesalahan.
  • Jelaskan mengapa baris tersebut salah.
  • Tuliskan versi perbaikan lengkap yang dapat dikompilasi.

Pertanyaan analisis: pada kondisi 0 <= nilai <= 100, mengapa Pascal tidak mengeluarkan kesalahan kompilasi? Ekspresi seperti apa yang sebenarnya dibentuk?

09

Studi Kasus

Sistem Penentuan Beasiswa Mahasiswa

9.1 Deskripsi Masalah

Universitas "Cendekia Nusantara" memiliki program beasiswa berdasarkan beberapa kriteria. Setiap mahasiswa dinilai berdasarkan Indeks Prestasi Kumulatif (IPK), penghasilan orang tua, dan jumlah tanggungan keluarga. Program akan menentukan apakah mahasiswa berhak menerima beasiswa, dan bila ya, kategori beasiswa apa yang diberikan.

9.2 Aturan Penentuan Beasiswa

Kategori IPK Penghasilan Orang Tua Tanggungan
Beasiswa Penuh ≥ 3.75 ≤ Rp 3.000.000 ≥ 3 orang
Beasiswa Sebagian ≥ 3.50 ≤ Rp 5.000.000 ≥ 2 orang
Beasiswa Parsial ≥ 3.25 ≤ Rp 7.000.000 ≥ 1 orang
Tidak Berhak Tidak memenuhi kriteria di atas

9.3 Flowchart Studi Kasus

flowchart TD
    A(["Mulai"]) --> B[/"Baca nama, IPK, penghasilan, tanggungan"/]
    B --> C{"IPK >= 3.75 dan
penghasilan <= 3jt dan
tanggungan >= 3?"} C -- "Ya" --> D["Kategori = Beasiswa Penuh"] C -- "Tidak" --> E{"IPK >= 3.50 dan
penghasilan <= 5jt dan
tanggungan >= 2?"} E -- "Ya" --> F["Kategori = Beasiswa Sebagian"] E -- "Tidak" --> G{"IPK >= 3.25 dan
penghasilan <= 7jt dan
tanggungan >= 1?"} G -- "Ya" --> H["Kategori = Beasiswa Parsial"] G -- "Tidak" --> I["Kategori = Tidak Berhak"] D --> J[/"Tampilkan hasil"/] F --> J H --> J I --> J J --> K(["Selesai"])

Gambar 9.1 - Flowchart penentuan beasiswa

9.4 Pseudocode Studi Kasus

PROGRAM PenentuanBeasiswa
{ Menentukan kategori beasiswa berdasarkan IPK, penghasilan, dan tanggungan }

KONSTANTA
  IPK_MIN_1         = 3.75
  IPK_MIN_2         = 3.50
  IPK_MIN_3         = 3.25
  PENGHASILAN_1     = 3000000
  PENGHASILAN_2     = 5000000
  PENGHASILAN_3     = 7000000
  TANGGUNGAN_1      = 3
  TANGGUNGAN_2      = 2
  TANGGUNGAN_3      = 1
  GARIS_GANDA       = "=========================================="
  GARIS_TUNGGAL     = "------------------------------------------"

DEKLARASI
  nama          : string
  nim           : string
  ipk           : real
  penghasilan   : currency
  tanggungan    : integer
  kategori      : string
  berhak        : boolean

ALGORITMA
  write("Nama mahasiswa       : ")
  read(nama)
  write("NIM                  : ")
  read(nim)
  write("IPK                  : ")
  read(ipk)
  write("Penghasilan ortu     : ")
  read(penghasilan)
  write("Jumlah tanggungan    : ")
  read(tanggungan)

  jika (ipk >= IPK_MIN_1) dan
       (penghasilan <= PENGHASILAN_1) dan
       (tanggungan >= TANGGUNGAN_1) maka
    kategori <- "Beasiswa Penuh"
    berhak <- true
  selain jika (ipk >= IPK_MIN_2) dan
              (penghasilan <= PENGHASILAN_2) dan
              (tanggungan >= TANGGUNGAN_2) maka
    kategori <- "Beasiswa Sebagian"
    berhak <- true
  selain jika (ipk >= IPK_MIN_3) dan
              (penghasilan <= PENGHASILAN_3) dan
              (tanggungan >= TANGGUNGAN_3) maka
    kategori <- "Beasiswa Parsial"
    berhak <- true
  selain itu
    kategori <- "Tidak Berhak"
    berhak <- false
  akhir jika

  write(GARIS_GANDA)
  write("HASIL PENENTUAN BEASISWA")
  write(GARIS_GANDA)
  write("Nama         : ", nama)
  write("NIM          : ", nim)
  write("IPK          : ", ipk:0:2)
  write("Penghasilan  : Rp ", penghasilan)
  write("Tanggungan   : ", tanggungan, " orang")
  write(GARIS_TUNGGAL)
  write("Kategori     : ", kategori)
  write("Status       : ", berhak)
  write(GARIS_GANDA)
END

9.5 Implementasi dalam Pascal

penentuan_beasiswa.pas Pascal
program PenentuanBeasiswa;
{ Studi Kasus Modul 6 - Penentuan beasiswa berdasarkan kriteria }

const
  IPK_MIN_1     = 3.75;
  IPK_MIN_2     = 3.50;
  IPK_MIN_3     = 3.25;
  PENGHASILAN_1 = 3000000;
  PENGHASILAN_2 = 5000000;
  PENGHASILAN_3 = 7000000;
  TANGGUNGAN_1  = 3;
  TANGGUNGAN_2  = 2;
  TANGGUNGAN_3  = 1;
  GARIS_GANDA   = '==========================================';
  GARIS_TUNGGAL = '------------------------------------------';

var
  nama        : string[50];
  nim         : string[15];
  ipk         : real;
  penghasilan : currency;
  tanggungan  : integer;
  kategori    : string[25];
  berhak      : boolean;

begin
  writeln('Formulir Pendaftaran Beasiswa');
  writeln(GARIS_TUNGGAL);
  writeln;

  write('Nama mahasiswa    : ');  readln(nama);
  write('NIM               : ');  readln(nim);
  write('IPK               : ');  readln(ipk);
  write('Penghasilan ortu  : ');  readln(penghasilan);
  write('Jumlah tanggungan : ');  readln(tanggungan);

  if (ipk >= IPK_MIN_1) and
     (penghasilan <= PENGHASILAN_1) and
     (tanggungan >= TANGGUNGAN_1) then
  begin
    kategori := 'Beasiswa Penuh';
    berhak := true;
  end
  else if (ipk >= IPK_MIN_2) and
          (penghasilan <= PENGHASILAN_2) and
          (tanggungan >= TANGGUNGAN_2) then
  begin
    kategori := 'Beasiswa Sebagian';
    berhak := true;
  end
  else if (ipk >= IPK_MIN_3) and
          (penghasilan <= PENGHASILAN_3) and
          (tanggungan >= TANGGUNGAN_3) then
  begin
    kategori := 'Beasiswa Parsial';
    berhak := true;
  end
  else
  begin
    kategori := 'Tidak Berhak';
    berhak := false;
  end;

  writeln;
  writeln(GARIS_GANDA);
  writeln('HASIL PENENTUAN BEASISWA');
  writeln(GARIS_GANDA);
  writeln('Nama         : ', nama);
  writeln('NIM          : ', nim);
  writeln('IPK          : ', ipk:0:2);
  writeln('Penghasilan  : Rp ', penghasilan:0:0);
  writeln('Tanggungan   : ', tanggungan, ' orang');
  writeln(GARIS_TUNGGAL);
  writeln('Kategori     : ', kategori);
  writeln('Status       : ', berhak);
  writeln(GARIS_GANDA);
end.

9.6 Contoh Keluaran

Formulir Pendaftaran Beasiswa
------------------------------------------

Nama mahasiswa    : Siti Nurhaliza
NIM               : 2025010001
IPK               : 3.85
Penghasilan ortu  : 2500000
Jumlah tanggungan : 4

==========================================
HASIL PENENTUAN BEASISWA
==========================================
Nama         : Siti Nurhaliza
NIM          : 2025010001
IPK          : 3.85
Penghasilan  : Rp 2500000
Tanggungan   : 4 orang
------------------------------------------
Kategori     : Beasiswa Penuh
Status       : TRUE
==========================================

9.7 Pembahasan

Beberapa keputusan perancangan penting pada program ini.

  1. Konstanta untuk setiap kriteria. Dengan konstanta, aturan beasiswa mudah diubah tanpa menyentuh logika percabangan.
  2. Kondisi majemuk dengan and. Setiap kategori memerlukan tiga syarat yang harus dipenuhi bersamaan. Bila salah satu syarat gagal, kategori tersebut tidak berlaku dan pemeriksaan berpindah ke kategori berikutnya.
  3. Urutan pemeriksaan dari ketat ke longgar. Kategori "Beasiswa Penuh" diperiksa lebih dahulu karena syaratnya paling ketat. Bila diperiksa dari yang paling longgar, mahasiswa berprestasi tinggi akan terjebak di kategori yang lebih rendah.
  4. Variabel berhak bertipe boolean. Meskipun dapat diturunkan dari kategori, menyimpannya secara eksplisit memisahkan data dari penyajian dan mempermudah bila logika perlu dikembangkan.
  5. Rantai else if yang panjang. Rantai ini adalah alternatif dari percabangan bersarang yang lebih dalam. Format ini lebih mudah dibaca daripada percabangan yang bersarang secara berlapis.

9.8 Pengembangan Selanjutnya

Modul Pengembangan
Modul 7Bila kriteria berbasis nilai diskrit, gunakan case
Modul 11Memindahkan logika penentuan ke fungsi yang mengembalikan string
Modul 16Memproses banyak mahasiswa dengan array
Modul 20Mengelompokkan data mahasiswa dalam record
Modul 25Menyimpan hasil penentuan ke berkas
Modul 41Menambahkan exception handling untuk menangani data yang tidak lengkap
10

Rangkuman

Poin-poin kunci yang perlu diingat dari Modul 6

  1. Percabangan adalah struktur kontrol selection yang memungkinkan program memilih satu jalur eksekusi dari beberapa alternatif.
  2. Percabangan satu arah memakai if...then. Blok pernyataan dieksekusi hanya bila kondisi benar.
  3. Percabangan dua arah memakai if...then...else. Satu blok dieksekusi bila kondisi benar, blok lain bila salah.
  4. Blok begin...end diperlukan bila cabang memuat lebih dari satu pernyataan.
  5. Tidak ada titik koma sebelum else. Ini adalah kesalahan sintaks yang paling sering terjadi.
  6. Rantai else if memungkinkan pemilihan dari banyak alternatif tanpa bersarang terlalu dalam.
  7. Urutan pemeriksaan penting. Periksa kondisi dari yang paling ketat ke paling longgar.
  8. Aturan dangling else: setiap else berpasangan dengan if terdekat yang belum memiliki else. Gunakan begin...end untuk menghindari ambiguitas.
  9. Kondisi majemuk dibentuk dengan and, or, dan not. Selalu bungkus setiap perbandingan dengan tanda kurung.
  10. Menulis 0 <= x <= 100 selalu bernilai true. Gunakan (x >= 0) and (x <= 100).
  11. Validasi rentang adalah pola umum percabangan: memeriksa apakah masukan berada dalam rentang yang sah, dan menampilkan pesan kesalahan bila tidak.
  12. Alternatif case lebih ringkas ketika percabangan berbasis nilai diskrit dari satu variabel.
Sebelum Melanjutkan

Pastikan Anda sudah dapat menulis percabangan bersarang tanpa kesalahan titik koma, dan memahami urutan pemeriksaan yang tepat. Latihan 5 adalah indikator yang baik untuk mengukur pemahaman. Modul 7 akan membahas case sebagai alternatif untuk beberapa situasi percabangan.

11

Referensi

Sumber rujukan yang digunakan dalam penyusunan modul ini

Buku Teks

  1. Jensen, K., & Wirth, N. (1991). Pascal User Manual and Report (4th ed.). Springer-Verlag. Bab 9 membahas pernyataan if dan case.
  2. Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan percabangan pada Free Pascal.
  3. Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang pengambilan keputusan.
  4. Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 6 membahas struktur kontrol.
  5. Dahl, O. J., Dijkstra, E. W., & Hoare, C. A. R. (1972). Structured Programming. Academic Press. Rujukan klasik tentang pemrograman terstruktur.

Dokumentasi Resmi

  1. Free Pascal Team. Free Pascal Reference Guide. Bab tentang pernyataan if. Tersedia di freepascal.org/docs.html.
  2. Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang struktur kontrol dan tipografi sintaks.
  3. Lazarus IDE Documentation. Panduan penggunaan struktur kontrol dalam aplikasi.

Artikel dan Sumber Daring

  1. IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang pernyataan bersyarat.
  2. Dijkstra, E. W. (1968). "Go To Statement Considered Harmful." Communications of the ACM, 11(3), 147-148. Artikel klasik tentang pemrograman terstruktur.
  3. Free Pascal Community Forum. Diskusi tentang dangling else dan best practice percabangan.