P Pascal dan Algoritma
Modul 7 dari 50 Roadmap
Modul 07 - Fase Dasar

Percabangan CASE-OF

Modul ini membahas struktur seleksi alternatif case-of yang lebih ringkas dan efisien dibandingkan rantai if-else-if ketika pilihan berbasis satu variabel dengan nilai-nilai diskrit. Anda akan mempelajari sintaks, penggunaan rentang nilai, klausa else, batasan tipe yang diperbolehkan, serta kapan sebaiknya memilih case daripada if.

Estimasi 110 menit Tingkat Dasar-Menengah 3 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 seleksi berbasis nilai ordinal dan posisinya sebagai alternatif if.
  2. Menulis struktur case-of dengan daftar nilai konstanta.
  3. Menggunakan klausa else pada case untuk menangani nilai di luar daftar.
  4. Menggunakan rentang nilai seperti 1..10 dalam case.
  5. Mengidentifikasi tipe data yang sah untuk ekspresi penyeleksi case.
  6. Membandingkan efisiensi dan keterbacaan case dengan rantai if-else-if.
  7. Menuliskan blok pernyataan dengan begin...end pada setiap cabang case.
  8. Menggambar flowchart untuk struktur case.
  9. Menghindari kesalahan umum seperti duplikasi label dan label di luar rentang tipe.
  10. Memecahkan masalah nyata dengan case secara tepat.
02

Capaian Pembelajaran

Indikator ketercapaian dan kaitan dengan modul selanjutnya

Capaian Pembelajaran Mata Kuliah

Mahasiswa mampu memilih struktur seleksi yang tepat antara if dan case berdasarkan karakteristik masalah, serta menulis case-of dengan benar dan efisien.

Indikator Ketercapaian Modul

Kode Indikator Bukti
IK-7.1 Menulis case-of dengan label nilai dan rentang Latihan 1 dan 3
IK-7.2 Menggunakan klausa else dengan tepat Latihan 1 dan 2
IK-7.3 Memilih antara case dan if secara beralasan Latihan 4
IK-7.4 Menggambar flowchart struktur case Latihan 4 dan studi kasus
IK-7.5 Mengidentifikasi kesalahan pada struktur case Latihan 5
Kaitan dengan Modul Berikutnya

case akan sering dipakai untuk membangun menu interaktif, mengelola state program, dan mengonversi nilai. Pada Modul 8 dan 9, kita akan menggabungkan case dengan perulangan untuk membuat menu yang dapat dijalankan berulang.

03

Materi Teori

Sintaks, aturan, penggunaan, dan perbandingan dengan IF

3.1 Konsep Seleksi Berbasis Nilai Ordinal

Rantai if-else-if bekerja baik untuk kondisi apa pun, termasuk rentang dan kombinasi beberapa variabel. Namun ketika masalahnya adalah memilih satu dari beberapa nilai diskrit dari satu variabel, rantai if menjadi panjang dan berulang.

Pascal menyediakan struktur case-of untuk situasi seperti ini. Ekspresi penyeleksi dievaluasi satu kali, lalu hasilnya dibandingkan dengan daftar label. Bila cocok, blok pernyataan yang sesuai dieksekusi.

Istilah Penting

Ekspresi penyeleksi (selector expression) adalah nilai yang diperiksa. Label case adalah nilai konstanta yang dibandingkan dengan ekspresi penyeleksi. Klausa else adalah blok yang dieksekusi bila tidak ada label yang cocok.

3.2 Sintaks Dasar CASE-OF

case ekspresi of
  label_1 : pernyataan_1;
  label_2 : pernyataan_2;
  label_n : pernyataan_n;
else
  pernyataan_default;
end;

Sintaks Pascal:

case_dasar.pasPascal
case pilihan of
  1 : writeln('Anda memilih menu satu');
  2 : writeln('Anda memilih menu dua');
  3 : writeln('Anda memilih menu tiga');
else
  writeln('Pilihan tidak dikenali');
end;

Perhatikan bahwa pada akhir case digunakan end; dengan titik koma. Berbeda dengan begin...end, end pada case tidak diikuti titik.

3.3 Tipe Data yang Sah untuk Ekspresi Penyeleksi

Ekspresi penyeleksi case harus bertipe ordinal, yaitu tipe yang nilainya dapat diurutkan dan memiliki representasi integer.

Tipe Sah? Catatan
Integer dan variannyaYaSah untuk semua tipe integer
CharYaNilai ordinal adalah kode ASCII
BooleanYaNilai ordinal 0 (false) dan 1 (true)
EnumerasiYaSetiap anggota memiliki nilai ordinal
SubrangeYaMewarisi tipe dasar ordinalnya
Byte, Word, ShortInt, dsb.YaSemua tipe integer
Real, Double, CurrencyTidakBukan tipe ordinal
StringTidakBukan tipe ordinal
Array, Record, SetTidakBukan tipe ordinal
PointerTidakBukan tipe ordinal (kecuali dikonversi)
Kesalahan Umum: Menggunakan Real

Bila Anda menulis case nilaiReal of dengan nilaiReal bertipe real, kompiler akan menolak dengan pesan "Ordinal type expected". Untuk nilai real, gunakan rantai if atau konversi terlebih dahulu ke integer dengan round atau trunc.

3.4 Label Case: Nilai Tunggal

Bentuk paling sederhana: satu label untuk satu nilai.

case_label_tunggal.pasPascal
case hari of
  1 : writeln('Senin');
  2 : writeln('Selasa');
  3 : writeln('Rabu');
  4 : writeln('Kamis');
  5 : writeln('Jumat');
  6 : writeln('Sabtu');
  7 : writeln('Minggu');
else
  writeln('Nomor hari tidak valid');
end;

3.5 Label Case: Beberapa Nilai dalam Satu Baris

Beberapa nilai dapat dikelompokkan dalam satu label, dipisahkan dengan koma. Semua nilai tersebut akan mengeksekusi blok pernyataan yang sama.

case_label_koma.pasPascal
case huruf of
  'a', 'e', 'i', 'o', 'u' : writeln('Huruf vokal');
  'b', 'c', 'd', 'f', 'g',
  'h', 'j', 'k', 'l', 'm',
  'n', 'p', 'q', 'r', 's',
  't', 'v', 'w', 'x', 'y', 'z' : writeln('Huruf konsonan');
else
  writeln('Bukan huruf');
end;

3.6 Label Case: Rentang Nilai

Rentang nilai dapat dituliskan dengan sintaks nilai_awal..nilai_akhir. Ini sangat berguna untuk klasifikasi nilai.

case_rentang.pasPascal
case nilai of
  85..100 : writeln('Nilai A');
  70..84  : writeln('Nilai B');
  60..69  : writeln('Nilai C');
  50..59  : writeln('Nilai D');
  0..49   : writeln('Nilai E');
else
  writeln('Nilai di luar rentang');
end;
Rentang vs Chain IF

Perhatikan betapa ringkasnya versi case dibandingkan rantai if-else-if untuk konversi nilai ke huruf mutu. Inilah salah satu keunggulan utama case.

3.7 Kombinasi Nilai Tunggal dan Rentang

Anda dapat mencampur nilai tunggal dan rentang dalam satu struktur case.

case_kombinasi.pasPascal
case kode of
  0       : writeln('Nol');
  1..5    : writeln('Antara 1 dan 5');
  6, 8, 10: writeln('Bilangan genap spesifik');
  7, 9    : writeln('Bilangan ganjil spesifik');
else
  writeln('Kode lain');
end;

3.8 Blok Pernyataan pada Case

Bila satu label memerlukan lebih dari satu pernyataan, gunakan begin...end seperti pada if.

case_blok.pasPascal
case pilihan of
  1 : begin
        writeln('Anda memilih opsi 1');
        totalOpsi1 := totalOpsi1 + 1;
        writeln('Total opsi 1: ', totalOpsi1);
      end;
  2 : begin
        writeln('Anda memilih opsi 2');
        totalOpsi2 := totalOpsi2 + 1;
      end;
else
  begin
    writeln('Pilihan tidak dikenali');
    totalError := totalError + 1;
  end;
end;
Aturan Titik Koma di dalam Case

Setiap end pada blok begin...end di dalam case diakhiri titik koma sebelum label berikutnya atau sebelum else. Ini berbeda dengan aturan pada if yang tidak boleh memiliki titik koma sebelum else.

3.9 Klausa ELSE pada Case

Klausa else dieksekusi bila tidak ada label yang cocok. Klausa ini bersifat opsional. Bila dihilangkan dan tidak ada label yang cocok, program akan melanjutkan ke pernyataan setelah end tanpa melakukan apa-apa.

Rekomendasi Praktik

Selalu sertakan klausa else pada case yang menerima input dari pengguna. Ini mencegah program diam-diam mengabaikan nilai yang tidak valid dan memudahkan pelacakan bug.

3.10 Perbandingan CASE dengan IF

Aspek IF CASE
Kondisi yang didukung Ekspresi boolean apa pun Nilai ordinal diskrit
Jumlah variabel Boleh lebih dari satu Hanya satu variabel penyeleksi
Rentang Ditulis dengan and Sintaks a..b
Jumlah alternatif ideal 2-5 alternatif Lebih dari 5 alternatif
Keterbacaan Panjang bila banyak alternatif Ringkas dan jelas
Efisiensi Rangkaian perbandingan Kompiler sering membuat tabel loncat
Kesalahan tipikal Titik koma sebelum else Label duplikat, label di luar rentang tipe

Kapan Menggunakan CASE

Kapan Menggunakan IF

3.11 Case Bersarang

case dapat bersarang, meskipun penggunaannya jarang diperlukan dan sebaiknya dihindari bila bisa disederhanakan.

case_bersarang.pasPascal
case kategori of
  'A' : case subKategori of
          1 : writeln('A-1');
          2 : writeln('A-2');
        else
          writeln('A-lain');
        end;
  'B' : writeln('Kategori B');
else
  writeln('Kategori tidak dikenali');
end;

3.12 Kesalahan Umum pada CASE

  1. Label duplikat. Dua label dengan nilai yang sama akan ditolak kompiler.
  2. Label di luar rentang tipe. Misalnya case b of 300 : ... bila b bertipe byte yang hanya sampai 255.
  3. Menggunakan real sebagai ekspresi penyeleksi. Tidak sah, harus ordinal.
  4. Lupa titik koma setelah blok begin...end. Diperlukan sebelum label berikutnya.
  5. Menuliskan rentang dengan urutan terbalik. 10..1 bukan rentang yang sah.
  6. Menggunakan variabel pada label. Label harus berupa konstanta atau literal.
  7. Lupa end; di akhir case. Menyebabkan kesalahan sintaks.
  8. Menghilangkan else tanpa menyadari. Nilai yang tidak cocok akan diabaikan tanpa peringatan.

3.13 Perbedaan Free Pascal dan Turbo Pascal

Aspek Turbo Pascal Free Pascal
Klausa else Didukung Didukung
Rentang nilai Didukung Didukung
Label string Tidak didukung Tidak didukung (hanya ordinal)
Case bersarang Didukung Didukung
Optimasi kompilasi Sederhana Lebih canggih, sering memakai jump table
04

Algoritma dan Flowchart

Representasi visual struktur case

4.1 Flowchart Struktur Case dengan Nilai Tunggal

flowchart TD
    A(["Mulai"]) --> B[/"Baca pilihan"/]
    B --> C{"pilihan = 1?"}
    C -- "Ya" --> D[/"Proses opsi 1"/]
    C -- "Tidak" --> E{"pilihan = 2?"}
    E -- "Ya" --> F[/"Proses opsi 2"/]
    E -- "Tidak" --> G{"pilihan = 3?"}
    G -- "Ya" --> H[/"Proses opsi 3"/]
    G -- "Tidak" --> I[/"Proses default else"/]
    D --> J(["Selesai"])
    F --> J
    H --> J
    I --> J
      

Gambar 4.1 - Flowchart struktur case dengan nilai tunggal

4.2 Flowchart Konversi Nilai ke Huruf Mutu dengan Rentang

flowchart TD
    A(["Mulai"]) --> B[/"Baca nilai"/]
    B --> C{"85 <= nilai <= 100?"}
    C -- "Ya" --> D["huruf = 'A'"]
    C -- "Tidak" --> E{"70 <= nilai <= 84?"}
    E -- "Ya" --> F["huruf = 'B'"]
    E -- "Tidak" --> G{"60 <= nilai <= 69?"}
    G -- "Ya" --> H["huruf = 'C'"]
    G -- "Tidak" --> I{"50 <= nilai <= 59?"}
    I -- "Ya" --> J["huruf = 'D'"]
    I -- "Tidak" --> K{"0 <= nilai <= 49?"}
    K -- "Ya" --> L["huruf = 'E'"]
    K -- "Tidak" --> M["huruf = 'X' (tidak valid)"]
    D --> N[/"Tampilkan huruf"/]
    F --> N
    H --> N
    J --> N
    L --> N
    M --> N
    N --> O(["Selesai"])
      

Gambar 4.2 - Flowchart konversi nilai ke huruf mutu dengan rentang case

4.3 Flowchart Menu Interaktif

flowchart TD
    A(["Mulai"]) --> B[/"Tampilkan menu"/]
    B --> C[/"Baca pilihan"/]
    C --> D{"Pilihan valid?"}
    D -- "1" --> E[/"Tampilkan data"/]
    D -- "2" --> F[/"Tambah data"/]
    D -- "3" --> G[/"Hapus data"/]
    D -- "4" --> H[/"Keluar dari menu"/]
    D -- "Lainnya" --> I[/"Tampilkan pesan kesalahan"/]
    E --> J(["Selesai"])
    F --> J
    G --> J
    H --> J
    I --> J
      

Gambar 4.3 - Flowchart menu interaktif dengan case

05

Pseudocode

Representasi algoritmik untuk struktur case

5.1 Pseudocode Konversi Nilai ke Huruf Mutu

PROGRAM KonversiNilaiHuruf
{ Mengkonversi nilai numerik ke huruf mutu menggunakan case }

DEKLARASI
  nilai : integer
  huruf : char

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

  kasus nilai dari
    85 sampai 100 : huruf <- 'A'
    70 sampai 84  : huruf <- 'B'
    60 sampai 69  : huruf <- 'C'
    50 sampai 59  : huruf <- 'D'
    0 sampai 49   : huruf <- 'E'
    selain itu
      huruf <- 'X'
  akhir kasus

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

5.2 Pseudocode Menu Interaktif

PROGRAM MenuInteraktif
{ Menampilkan menu dan memproses pilihan pengguna }

DEKLARASI
  pilihan : char

ALGORITMA
  write("========================================")
  write("           MENU UTAMA")
  write("========================================")
  write("1. Tampilkan data")
  write("2. Tambah data")
  write("3. Hapus data")
  write("4. Keluar")
  write("========================================")
  write("Pilihan Anda (1-4): ")
  read(pilihan)

  kasus pilihan dari
    '1' : write("Menampilkan data...")
    '2' : write("Menambah data...")
    '3' : write("Menghapus data...")
    '4' : write("Keluar dari program")
    selain itu
      write("Pilihan tidak valid")
  akhir kasus
END

5.3 Pseudocode Kalkulator Berbasis Kode Operasi

PROGRAM KalkulatorKode
{ Kalkulator dengan kode operasi numerik }

DEKLARASI
  a, b    : real
  kode    : integer
  hasil   : real

ALGORITMA
  write("Bilangan pertama: ")
  read(a)
  write("Bilangan kedua  : ")
  read(b)

  write("Kode operasi:")
  write("1 = tambah, 2 = kurang, 3 = kali, 4 = bagi")
  write("Kode: ")
  read(kode)

  kasus kode dari
    1 : hasil <- a + b
    2 : hasil <- a - b
    3 : hasil <- a * b
    4 :
      jika b = 0 maka
        write("Kesalahan: pembagian dengan nol")
        hasil <- 0
      selain itu
        hasil <- a / b
      akhir jika
    selain itu
      write("Kode operasi tidak valid")
      hasil <- 0
  akhir kasus

  write("Hasil: ", hasil)
END
06

Contoh Kode Pascal Lengkap

Lima program untuk mendemonstrasikan struktur case

6.1 Program Nama Hari dengan Case Nilai Tunggal

nama_hari.pas Pascal
program NamaHari;
{ Menampilkan nama hari berdasarkan nomor 1-7 }

var
  nomor: integer;

begin
  write('Masukkan nomor hari (1-7): ');
  readln(nomor);

  case nomor of
    1 : writeln('Senin');
    2 : writeln('Selasa');
    3 : writeln('Rabu');
    4 : writeln('Kamis');
    5 : writeln('Jumat');
    6 : writeln('Sabtu');
    7 : writeln('Minggu');
  else
    writeln('Nomor hari tidak valid');
  end;
end.

Contoh sesi interaksi:

Masukkan nomor hari (1-7): 3
Rabu

6.2 Program Konversi Nilai ke Huruf Mutu dengan Rentang

huruf_mutu_case.pas Pascal
program HurufMutuCase;
{ Konversi nilai ke huruf mutu menggunakan case }

var
  nama: string;
  nilai: integer;
  huruf: char;

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

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

  case nilai of
    85..100 : huruf := 'A';
    70..84  : huruf := 'B';
    60..69  : huruf := 'C';
    50..59  : huruf := 'D';
    0..49   : huruf := 'E';
  else
    huruf := 'X';
  end;

  writeln;
  writeln('Nama       : ', nama);
  writeln('Nilai      : ', nilai);

  if huruf = 'X' then
    writeln('Status     : Nilai di luar rentang yang sah')
  else
    writeln('Huruf mutu : ', huruf);
end.

6.3 Program Deteksi Huruf Vokal dan Konsonan

vokal_konsonan.pas Pascal
program VokalKonsonan;
{ Mendeteksi apakah karakter adalah vokal, konsonan, atau bukan huruf }

uses
  crt;

var
  huruf: char;

begin
  write('Masukkan satu huruf: ');
  readln(huruf);

  huruf := UpCase(huruf);

  case huruf of
    'A', 'E', 'I', 'O', 'U' :
      writeln(huruf, ' adalah huruf vokal');

    'B'..'D', 'F'..'H', 'J'..'N', 'P'..'T', 'V'..'Z' :
      writeln(huruf, ' adalah huruf konsonan');
  else
    writeln(huruf, ' bukan huruf alfabet');
  end;
end.

Contoh keluaran:

Masukkan satu huruf: e
E adalah huruf vokal

6.4 Program Menu Interaktif Sederhana

menu_case.pas Pascal
program MenuCase;
{ Menu interaktif sederhana dengan case }

uses
  crt;

var
  pilihan: char;

begin
  ClrScr;

  writeln('========================================');
  writeln('           MENU UTAMA');
  writeln('========================================');
  writeln('1. Tampilkan data mahasiswa');
  writeln('2. Tambah data mahasiswa');
  writeln('3. Hapus data mahasiswa');
  writeln('4. Keluar');
  writeln('========================================');
  write('Pilihan Anda (1-4): ');

  pilihan := ReadKey;
  writeln(pilihan);

  writeln;
  case pilihan of
    '1' : begin
            writeln('Anda memilih: Tampilkan data');
            writeln('Menampilkan 10 data mahasiswa...');
          end;
    '2' : begin
            writeln('Anda memilih: Tambah data');
            writeln('Formulir penambahan data dibuka.');
          end;
    '3' : begin
            writeln('Anda memilih: Hapus data');
            writeln('Konfirmasi penghapusan diperlukan.');
          end;
    '4' : writeln('Anda memilih: Keluar');
  else
    writeln('Pilihan tidak valid');
  end;

  writeln;
  writeln('Tekan tombol apa saja untuk keluar...');
  ReadKey;
end.

6.5 Program Kalkulator Sederhana dengan Kode Operasi

kalkulator_kode.pas Pascal
program KalkulatorKode;
{ Kalkulator dengan kode operasi numerik }

var
  a, b: real;
  kode: integer;
  hasil: real;

begin
  write('Bilangan pertama: ');  readln(a);
  write('Bilangan kedua  : ');  readln(b);

  writeln;
  writeln('Kode operasi:');
  writeln('  1 = tambah');
  writeln('  2 = kurang');
  writeln('  3 = kali');
  writeln('  4 = bagi');
  write('Kode: ');
  readln(kode);

  case kode of
    1 : hasil := a + b;
    2 : hasil := a - b;
    3 : hasil := a * b;
    4 : if b = 0 then
        begin
          writeln('Kesalahan: pembagian dengan nol');
          hasil := 0;
        end
        else
          hasil := a / b;
  else
    begin
      writeln('Kode operasi tidak valid');
      hasil := 0;
    end;
  end;

  writeln;
  writeln('Hasil: ', hasil:0:4);
end.

Contoh sesi interaksi:

Bilangan pertama: 12
Bilangan kedua  : 5

Kode operasi:
  1 = tambah
  2 = kurang
  3 = kali
  4 = bagi
Kode: 3

Hasil: 60.0000
07

Penjelasan Kode Baris per Baris

Membedah program HurufMutuCase dan VokalKonsonan secara rinci

7.1 Program HurufMutuCase

Baris Kode Penjelasan
4-7 var
nama: string;
nilai: integer;
huruf: char;
Variabel penyeleksi nilai bertipe integer karena case memerlukan tipe ordinal.
13-19 case nilai of
85..100 : huruf := 'A';
70..84 : huruf := 'B';
...
Struktur case dengan lima label rentang. Setiap label diikuti titik dua lalu pernyataan, diakhiri titik koma. Perhatikan bahwa label rentang lebih ringkas daripada memakai if berantai.
20-22 else
huruf := 'X';
end;
Klausa else menangkap nilai yang tidak masuk rentang mana pun (nilai negatif atau di atas 100). Huruf ditandai 'X' sebagai penanda tidak valid. Perhatikan aturan titik koma: setelah pernyataan huruf := 'X' ada titik koma sebelum end.
24-31 if huruf = 'X' then
writeln('Status : Nilai di luar rentang yang sah')
else
writeln('Huruf mutu : ', huruf);
Setelah case, kita memeriksa apakah huruf bernilai 'X'. Bila ya, tampilkan pesan kesalahan; bila tidak, tampilkan huruf mutu. Pola ini memisahkan pengambilan keputusan (di case) dari penyajian.

7.2 Program VokalKonsonan

Baris Kode Penjelasan
5-6 uses
crt;
Mendaftarkan unit crt untuk fungsi UpCase. Alternatif tanpa unit ini adalah membuat konversi manual dengan kondisi.
15 huruf := UpCase(huruf); Mengonversi huruf kecil menjadi huruf besar. Ini memastikan case cukup memeriksa huruf besar saja, sehingga lebih ringkas.
17-18 case huruf of
'A', 'E', 'I', 'O', 'U' :
Label dengan beberapa nilai dipisahkan koma. Semua nilai tersebut mengeksekusi blok pernyataan yang sama.
21-22 'B'..'D', 'F'..'H', 'J'..'N',
'P'..'T', 'V'..'Z' :
Kombinasi lima rentang konsonan. Bila ditulis dengan if, ini akan menjadi kondisi sangat panjang. Dengan rentang case, penulisannya sangat ringkas.
24-25 else
writeln(huruf, ' bukan huruf alfabet');
Menangani karakter seperti angka, tanda baca, spasi, atau simbol.

7.3 Jejak Eksekusi HurufMutuCase untuk nilai = 78

Label yang Diperiksa 78 dalam rentang? Aksi
85..100TidakLanjut ke label berikutnya
70..84Yahuruf := 'B', keluar dari case
Sisa label-Dilewati

Hasil akhir: huruf = 'B'. Bila nilai 78 dimasukkan, program menampilkan "Huruf mutu : B".

Pelajaran Kunci

case dengan rentang sangat efektif untuk klasifikasi nilai, tarif berjenjang, dan pengelompokan kode. Kuncinya adalah memastikan rentang tidak tumpang tindih dan mencakup semua kemungkinan nilai yang sah. Klausa else menjadi jaring pengaman untuk nilai di luar rentang.

08

Latihan Soal

Lima soal dengan tingkat kesulitan bertingkat

1

Nama Bulan dengan Case

Mudah

Buat program nama_bulan.pas yang menerima nomor bulan (1-12) dan menampilkan nama bulan tersebut. Gunakan struktur case.

Ketentuan:

  • Sertakan klausa else untuk nomor di luar 1-12.
  • Tampilkan juga jumlah hari pada bulan tersebut (asumsi bukan tahun kabisat).
  • Gambar flowchart terlebih dahulu.

Pertanyaan tambahan: apakah bulan-bulan dengan jumlah hari yang sama dapat dikelompokkan dalam satu label? Berikan contohnya.

2

Kategori Nilai dengan Keterangan

Mudah

Buat program yang menerima nilai ujian 0-100 dan menampilkan huruf mutu beserta keterangan menggunakan struktur case dengan rentang.

Kategori:

  • A (85-100): "Istimewa"
  • B (70-84): "Baik"
  • C (60-69): "Cukup"
  • D (50-59): "Kurang"
  • E (0-49): "Sangat kurang"
  • Di luar rentang: "Tidak valid"

Ketentuan:

  • Gunakan case dengan label rentang.
  • Setiap label mengeksekusi blok begin...end yang menetapkan huruf dan keterangan.
  • Tampilkan nama mahasiswa, nilai, huruf, dan keterangan.
3

Konversi Kode Warna Resistor

Sedang

Resistor memiliki kode warna yang merepresentasikan nilai. Buat program yang menerima kode warna sebagai string satu huruf dan menampilkan nilai digitnya.

Kode warna:

  • H (Hitam) = 0
  • C (Coklat) = 1
  • M (Merah) = 2
  • O (Oranye) = 3
  • K (Kuning) = 4
  • I (Hijau) = 5
  • B (Biru) = 6
  • U (Ungu) = 7
  • A (Abu-abu) = 8
  • P (Putih) = 9

Ketentuan:

  • Gunakan case dengan label karakter.
  • Konversi huruf kecil ke huruf besar dengan UpCase terlebih dahulu.
  • Bila kode tidak dikenali, tampilkan pesan kesalahan.

Pertanyaan analisis: mengapa pada kasus ini case lebih tepat dibanding if? Apa yang terjadi bila kita ingin mengonversi kode warna yang berupa string panjang seperti "Merah"?

4

Menu dengan Sub-Menu Bersarang

Sedang

Buat program menu dengan dua tingkat: menu utama dan sub-menu. Menu utama memiliki tiga opsi, dan opsi pertama memiliki sub-menu dengan tiga pilihan.

Struktur:

Menu Utama:
  1. Kelola Data
     a. Lihat data
     b. Tambah data
     c. Hapus data
  2. Laporan
  3. Keluar

Ketentuan:

  • Gunakan case bersarang.
  • Setiap pilihan menampilkan pesan yang sesuai.
  • Gambar flowchart untuk struktur bersarang ini.

Pertanyaan analisis: kapan penggunaan case bersarang lebih tepat dibanding memisahkan sub-menu ke dalam prosedur tersendiri?

5

Deteksi Kesalahan Struktur Case

Sulit

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

kacau_case.pasPascal
program KacauCase;

var
  nilai: real;
  huruf: char;
  kode: byte;

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

  case nilai of
    85..100 : huruf := 'A';
    70..85  : huruf := 'B';
    60..69  : huruf := 'C';
    50..59  : huruf := 'D';
    0..49   : huruf := 'E';
  else
    huruf := 'X'
  end;

  write('Kode: ');
  readln(kode);
  case kode of
    1..2    : writeln('Rendah')
    3..4    : writeln('Sedang')
    250..300: writeln('Tinggi')
  else
    writeln('Tidak valid');
  end;

  writeln('Huruf: ', huruf);
end.

Ketentuan:

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

Pertanyaan analisis: pada label rentang 70..85, apa yang terjadi dengan nilai 85? Apakah akan diklasifikasi sebagai A atau B? Jelaskan mengapa kasus seperti ini perlu dihindari.

09

Studi Kasus

Sistem Tiket Bioskop "Layar Emas"

9.1 Deskripsi Masalah

Bioskop "Layar Emas" menerapkan tarif tiket yang berbeda berdasarkan jenis hari dan kategori penonton. Program menerima jenis hari (weekday/weekend/holiday) sebagai kode karakter dan kategori penonton (anak/dewasa/lansia) sebagai kode karakter, kemudian menghitung harga tiket yang harus dibayar.

9.2 Aturan Tarif

Jenis Hari Anak (< 12) Dewasa Lansia (≥ 60)
Weekday (W) Rp 30.000 Rp 45.000 Rp 35.000
Weekend (E) Rp 40.000 Rp 60.000 Rp 45.000
Holiday (H) Rp 50.000 Rp 75.000 Rp 55.000

9.3 Flowchart Studi Kasus

flowchart TD
    A(["Mulai"]) --> B[/"Baca jenisHari, kategori, jumlahTiket"/]
    B --> C{"Jenis hari
valid?"} C -- "Tidak" --> D["Tampilkan error
Jenis hari tidak valid"] C -- "Ya" --> E{"Kategori
penonton?"} E -- "A (Anak)" --> F["Tentukan harga anak"] E -- "D (Dewasa)" --> G["Tentukan harga dewasa"] E -- "L (Lansia)" --> H["Tentukan harga lansia"] E -- "Lainnya" --> I["Tampilkan error
Kategori tidak valid"] F --> J["totalBayar = harga * jumlahTiket"] G --> J H --> J I --> K(["Selesai"]) J --> L[/"Tampilkan total bayar"/] L --> K D --> K

Gambar 9.1 - Flowchart perhitungan tiket bioskop dengan case bersarang

9.4 Pseudocode Studi Kasus

PROGRAM TiketBioskop
{ Menghitung harga tiket berdasarkan jenis hari dan kategori penonton }

KONSTANTA
  GARIS_GANDA   = "=========================================="
  GARIS_TUNGGAL = "------------------------------------------"

DEKLARASI
  jenisHari   : char
  kategori    : char
  jumlahTiket : integer
  hargaTiket  : currency
  totalBayar  : currency
  namaHari    : string
  namaKategori: string
  valid       : boolean

ALGORITMA
  write("Jenis hari (W=weekday, E=weekend, H=holiday): ")
  read(jenisHari)
  write("Kategori (A=anak, D=dewasa, L=lansia)     : ")
  read(kategori)
  write("Jumlah tiket                              : ")
  read(jumlahTiket)

  jenisHari <- UpCase(jenisHari)
  kategori  <- UpCase(kategori)

  valid <- true
  hargaTiket <- 0

  kasus jenisHari dari
    'W' :
      namaHari <- "Weekday"
      kasus kategori dari
        'A' : hargaTiket <- 30000
        'D' : hargaTiket <- 45000
        'L' : hargaTiket <- 35000
        selain itu
          valid <- false
      akhir kasus
    'E' :
      namaHari <- "Weekend"
      kasus kategori dari
        'A' : hargaTiket <- 40000
        'D' : hargaTiket <- 60000
        'L' : hargaTiket <- 45000
        selain itu
          valid <- false
      akhir kasus
    'H' :
      namaHari <- "Holiday"
      kasus kategori dari
        'A' : hargaTiket <- 50000
        'D' : hargaTiket <- 75000
        'L' : hargaTiket <- 55000
        selain itu
          valid <- false
      akhir kasus
    selain itu
      valid <- false
  akhir kasus

  jika valid = false maka
    write("Kesalahan: kombinasi jenis hari dan kategori tidak valid")
  selain itu
    kasus kategori dari
      'A' : namaKategori <- "Anak"
      'D' : namaKategori <- "Dewasa"
      'L' : namaKategori <- "Lansia"
    akhir kasus

    totalBayar <- hargaTiket * jumlahTiket

    write(GARIS_GANDA)
    write("BIOSKOP LAYAR EMAS")
    write("Struk Pemesanan Tiket")
    write(GARIS_GANDA)
    write("Jenis Hari    : ", namaHari)
    write("Kategori      : ", namaKategori)
    write("Jumlah Tiket  : ", jumlahTiket)
    write("Harga Satuan  : Rp ", hargaTiket)
    write(GARIS_TUNGGAL)
    write("Total Bayar   : Rp ", totalBayar)
    write(GARIS_GANDA)
  akhir jika
END

9.5 Implementasi dalam Pascal

tiket_bioskop.pas Pascal
program TiketBioskop;
{ Studi Kasus Modul 7 - Perhitungan tiket bioskop dengan case bersarang }

uses
  crt;

const
  GARIS_GANDA   = '==========================================';
  GARIS_TUNGGAL = '------------------------------------------';

var
  jenisHari   : char;
  kategori    : char;
  jumlahTiket : integer;
  hargaTiket  : currency;
  totalBayar  : currency;
  namaHari    : string[15];
  namaKategori: string[15];
  valid       : boolean;

begin
  writeln('Formulir Pemesanan Tiket Bioskop Layar Emas');
  writeln(GARIS_TUNGGAL);
  writeln;

  write('Jenis hari (W/E/H) : ');  readln(jenisHari);
  write('Kategori (A/D/L)   : ');  readln(kategori);
  write('Jumlah tiket       : ');  readln(jumlahTiket);

  jenisHari := UpCase(jenisHari);
  kategori  := UpCase(kategori);

  valid := true;
  hargaTiket := 0;

  case jenisHari of
    'W' :
      begin
        namaHari := 'Weekday';
        case kategori of
          'A' : hargaTiket := 30000;
          'D' : hargaTiket := 45000;
          'L' : hargaTiket := 35000;
        else
          valid := false;
        end;
      end;
    'E' :
      begin
        namaHari := 'Weekend';
        case kategori of
          'A' : hargaTiket := 40000;
          'D' : hargaTiket := 60000;
          'L' : hargaTiket := 45000;
        else
          valid := false;
        end;
      end;
    'H' :
      begin
        namaHari := 'Holiday';
        case kategori of
          'A' : hargaTiket := 50000;
          'D' : hargaTiket := 75000;
          'L' : hargaTiket := 55000;
        else
          valid := false;
        end;
      end;
  else
    valid := false;
  end;

  if not valid then
  begin
    writeln;
    writeln('Kesalahan: kombinasi jenis hari dan kategori tidak valid.');
    writeln('Periksa kembali pilihan Anda.');
  end
  else
  begin
    case kategori of
      'A' : namaKategori := 'Anak';
      'D' : namaKategori := 'Dewasa';
      'L' : namaKategori := 'Lansia';
    end;

    totalBayar := hargaTiket * jumlahTiket;

    writeln;
    writeln(GARIS_GANDA);
    writeln('BIOSKOP LAYAR EMAS');
    writeln('Struk Pemesanan Tiket');
    writeln(GARIS_GANDA);
    writeln('Jenis Hari    : ', namaHari);
    writeln('Kategori      : ', namaKategori);
    writeln('Jumlah Tiket  : ', jumlahTiket, ' lembar');
    writeln('Harga Satuan  : Rp ', hargaTiket:0:0);
    writeln(GARIS_TUNGGAL);
    writeln('Total Bayar   : Rp ', totalBayar:0:0);
    writeln(GARIS_GANDA);
  end;
end.

9.6 Contoh Keluaran

Formulir Pemesanan Tiket Bioskop Layar Emas
------------------------------------------

Jenis hari (W/E/H) : E
Kategori (A/D/L)   : D
Jumlah tiket       : 3

==========================================
BIOSKOP LAYAR EMAS
Struk Pemesanan Tiket
==========================================
Jenis Hari    : Weekend
Kategori      : Dewasa
Jumlah Tiket  : 3 lembar
Harga Satuan  : Rp 60000
------------------------------------------
Total Bayar   : Rp 180000
==========================================

9.7 Pembahasan

Beberapa keputusan perancangan penting pada program ini.

  1. Case bersarang untuk dua dimensi. Kita memiliki dua variabel penyeleksi: jenis hari dan kategori. Pendekatan ini menggunakan case luar untuk jenis hari dan case dalam untuk kategori. Hasilnya jauh lebih ringkas daripada 3 × 3 = 9 kondisi if.
  2. Konversi UpCase sebelum penyeleksian. Dengan mengubah huruf kecil menjadi huruf besar sebelum case, kita cukup menangani satu varian saja. Ini menyederhanakan daftar label.
  3. Variabel valid sebagai penanda. Bila kombinasi jenis hari dan kategori tidak valid, valid menjadi false. Setelah blok case selesai, kita memeriksa apakah perlu menampilkan pesan kesalahan.
  4. Blok begin...end untuk case bersarang. Setiap cabang case luar memerlukan blok karena memuat lebih dari satu pernyataan (penetapan nama hari dan case dalam).
  5. Case kecil tanpa else pada akhir program. Case terakhir untuk mengisi nama kategori tidak memiliki else karena kita sudah memastikan kategori valid di tahap sebelumnya.

9.8 Pengembangan Selanjutnya

Modul Pengembangan
Modul 8Menambahkan perulangan agar menu dapat dipilih berulang
Modul 11Memisahkan logika perhitungan harga ke fungsi terpisah
Modul 20Mengelompokkan jenis tiket ke dalam record
Modul 22Menggunakan tipe enumerasi untuk kategori penonton
Modul 25Menyimpan transaksi ke berkas
Modul 36Merancang kelas Tiket dengan properti dan method
10

Rangkuman

Poin-poin kunci yang perlu diingat dari Modul 7

  1. case-of adalah struktur seleksi berbasis nilai ordinal dari satu variabel.
  2. Ekspresi penyeleksi harus bertipe ordinal: integer, char, boolean, enumerasi, atau subrange. Real dan string tidak diperbolehkan.
  3. Label case dapat berupa nilai tunggal (1 :), beberapa nilai dipisahkan koma ('a', 'e', 'i' :), rentang (70..84 :), atau kombinasi keduanya.
  4. Klausa else menangani nilai yang tidak cocok dengan label mana pun. Selalu sertakan else untuk input dari pengguna.
  5. Blok begin...end diperlukan bila satu cabang memuat lebih dari satu pernyataan. Titik koma setelah end blok di dalam case wajib, berbeda dengan aturan pada if.
  6. Struktur case diakhiri dengan end; bukan end..
  7. case lebih ringkas daripada rantai if ketika alternatifnya banyak dan berbasis satu variabel.
  8. if tetap diperlukan ketika kondisi melibatkan beberapa variabel atau tipe non-ordinal.
  9. Kesalahan umum termasuk label duplikat, label di luar rentang tipe, lupa titik koma setelah blok, dan lupa end;.
  10. Case bersarang memungkinkan penyeleksian dua dimensi, tetapi gunakan secara bijak. Bila bersarang terlalu dalam, pertimbangkan memindahkan ke prosedur atau fungsi terpisah.
Sebelum Melanjutkan

Pastikan Anda sudah dapat menulis case dengan label tunggal, rentang, dan bersarang tanpa kesalahan sintaks. Latihan 5 adalah indikator yang baik. Modul 8 akan mulai membahas perulangan, memungkinkan program Anda mengeksekusi blok kode berkali-kali.

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 case secara lengkap.
  2. Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan pernyataan case.
  3. Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang pemilihan berdasarkan nilai.
  4. Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 6 membahas struktur seleksi.

Dokumentasi Resmi

  1. Free Pascal Team. Free Pascal Reference Guide. Bab tentang pernyataan case. Tersedia di freepascal.org/docs.html.
  2. Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang tipe ordinal dan ekspresi penyeleksi.
  3. Lazarus IDE Documentation. Panduan penggunaan struktur case pada aplikasi.

Artikel dan Sumber Daring

  1. IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang pernyataan case.
  2. Wirth, N. (1971). "The Programming Language Pascal." Acta Informatica, 1(1), 35-63. Bab tentang struktur kontrol.
  3. Free Pascal Community Forum. Diskusi tentang optimasi case dan perbandingan performa dengan rantai if.