Tujuan Pembelajaran
Kompetensi yang ingin dicapai setelah menyelesaikan modul ini
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
- Menjelaskan konsep seleksi berbasis nilai ordinal dan posisinya sebagai alternatif
if. - Menulis struktur
case-ofdengan daftar nilai konstanta. - Menggunakan klausa
elsepadacaseuntuk menangani nilai di luar daftar. - Menggunakan rentang nilai seperti
1..10dalamcase. - Mengidentifikasi tipe data yang sah untuk ekspresi penyeleksi
case. - Membandingkan efisiensi dan keterbacaan
casedengan rantaiif-else-if. - Menuliskan blok pernyataan dengan
begin...endpada setiap cabangcase. - Menggambar flowchart untuk struktur
case. - Menghindari kesalahan umum seperti duplikasi label dan label di luar rentang tipe.
- Memecahkan masalah nyata dengan
casesecara tepat.
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 |
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.
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.
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 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 variannya | Ya | Sah untuk semua tipe integer |
| Char | Ya | Nilai ordinal adalah kode ASCII |
| Boolean | Ya | Nilai ordinal 0 (false) dan 1 (true) |
| Enumerasi | Ya | Setiap anggota memiliki nilai ordinal |
| Subrange | Ya | Mewarisi tipe dasar ordinalnya |
| Byte, Word, ShortInt, dsb. | Ya | Semua tipe integer |
| Real, Double, Currency | Tidak | Bukan tipe ordinal |
| String | Tidak | Bukan tipe ordinal |
| Array, Record, Set | Tidak | Bukan tipe ordinal |
| Pointer | Tidak | Bukan tipe ordinal (kecuali dikonversi) |
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 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 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 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;
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 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 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;
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.
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
- Ketika pilihan berbasis satu variabel ordinal.
- Ketika jumlah alternatif lebih dari empat atau lima.
- Ketika banyak label adalah rentang nilai (misalnya klasifikasi nilai).
- Ketika mengimplementasikan menu berbasis karakter atau integer.
- Ketika state machine sederhana sedang dibuat.
Kapan Menggunakan IF
- Ketika kondisi melibatkan lebih dari satu variabel.
- Ketika kondisi melibatkan tipe non-ordinal (real, string, record).
- Ketika hanya ada dua atau tiga alternatif.
- Ketika kondisi berbasis kombinasi boolean yang kompleks.
3.11 Case Bersarang
case dapat bersarang, meskipun
penggunaannya jarang diperlukan dan sebaiknya dihindari
bila bisa disederhanakan.
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
- Label duplikat. Dua label dengan nilai yang sama akan ditolak kompiler.
- Label di luar rentang tipe. Misalnya
case b of 300 : ...bilabbertipebyteyang hanya sampai 255. - Menggunakan real sebagai ekspresi penyeleksi. Tidak sah, harus ordinal.
- Lupa titik koma setelah blok
begin...end. Diperlukan sebelum label berikutnya. - Menuliskan rentang dengan urutan terbalik.
10..1bukan rentang yang sah. - Menggunakan variabel pada label. Label harus berupa konstanta atau literal.
- Lupa
end;di akhir case. Menyebabkan kesalahan sintaks. - Menghilangkan
elsetanpa 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 |
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
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
Contoh Kode Pascal Lengkap
Lima program untuk mendemonstrasikan struktur case
6.1 Program Nama Hari dengan Case Nilai Tunggal
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
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
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
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
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
Penjelasan Kode Baris per Baris
Membedah program HurufMutuCase dan VokalKonsonan secara rinci
7.1 Program HurufMutuCase
| Baris | Kode | Penjelasan |
|---|---|---|
| 4-7 | var |
Variabel penyeleksi nilai
bertipe integer karena
case memerlukan tipe ordinal.
|
| 13-19 | case nilai of |
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 |
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 |
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 |
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 |
Label dengan beberapa nilai dipisahkan koma. Semua nilai tersebut mengeksekusi blok pernyataan yang sama. |
| 21-22 | 'B'..'D', 'F'..'H', 'J'..'N', |
Kombinasi lima rentang konsonan. Bila ditulis
dengan if, ini akan
menjadi kondisi sangat panjang. Dengan rentang
case, penulisannya
sangat ringkas.
|
| 24-25 | else |
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..100 | Tidak | Lanjut ke label berikutnya |
| 70..84 | Ya | huruf := 'B', keluar dari case |
| Sisa label | - | Dilewati |
Hasil akhir: huruf = 'B'. Bila
nilai 78 dimasukkan, program menampilkan "Huruf mutu : B".
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.
Latihan Soal
Lima soal dengan tingkat kesulitan bertingkat
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
elseuntuk 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.
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
casedengan label rentang. - Setiap label mengeksekusi blok
begin...endyang menetapkan huruf dan keterangan. - Tampilkan nama mahasiswa, nilai, huruf, dan keterangan.
Konversi Kode Warna Resistor
SedangResistor 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
casedengan label karakter. - Konversi huruf kecil ke huruf besar dengan
UpCaseterlebih 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"?
Menu dengan Sub-Menu Bersarang
SedangBuat 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
casebersarang. - 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?
Deteksi Kesalahan Struktur Case
Sulit
Program berikut memiliki tujuh
kesalahan terkait sintaks atau logika case.
Temukan semuanya, lalu tuliskan versi yang benar.
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.
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
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.
-
Case bersarang untuk dua dimensi.
Kita memiliki dua variabel penyeleksi: jenis hari dan
kategori. Pendekatan ini menggunakan
caseluar untuk jenis hari dancasedalam untuk kategori. Hasilnya jauh lebih ringkas daripada 3 × 3 = 9 kondisiif. -
Konversi UpCase sebelum penyeleksian.
Dengan mengubah huruf kecil menjadi huruf besar sebelum
case, kita cukup menangani satu varian saja. Ini menyederhanakan daftar label. -
Variabel
validsebagai penanda. Bila kombinasi jenis hari dan kategori tidak valid,validmenjadifalse. Setelah blokcaseselesai, kita memeriksa apakah perlu menampilkan pesan kesalahan. -
Blok
begin...enduntuk case bersarang. Setiap cabangcaseluar memerlukan blok karena memuat lebih dari satu pernyataan (penetapan nama hari dan case dalam). -
Case kecil tanpa else pada akhir program.
Case terakhir untuk mengisi nama kategori tidak
memiliki
elsekarena kita sudah memastikan kategori valid di tahap sebelumnya.
9.8 Pengembangan Selanjutnya
| Modul | Pengembangan |
|---|---|
| Modul 8 | Menambahkan perulangan agar menu dapat dipilih berulang |
| Modul 11 | Memisahkan logika perhitungan harga ke fungsi terpisah |
| Modul 20 | Mengelompokkan jenis tiket ke dalam record |
| Modul 22 | Menggunakan tipe enumerasi untuk kategori penonton |
| Modul 25 | Menyimpan transaksi ke berkas |
| Modul 36 | Merancang kelas Tiket dengan properti dan method |
Rangkuman
Poin-poin kunci yang perlu diingat dari Modul 7
-
case-ofadalah struktur seleksi berbasis nilai ordinal dari satu variabel. - Ekspresi penyeleksi harus bertipe ordinal: integer, char, boolean, enumerasi, atau subrange. Real dan string tidak diperbolehkan.
-
Label case dapat berupa nilai tunggal
(
1 :), beberapa nilai dipisahkan koma ('a', 'e', 'i' :), rentang (70..84 :), atau kombinasi keduanya. -
Klausa
elsemenangani nilai yang tidak cocok dengan label mana pun. Selalu sertakanelseuntuk input dari pengguna. -
Blok
begin...enddiperlukan bila satu cabang memuat lebih dari satu pernyataan. Titik koma setelahendblok di dalam case wajib, berbeda dengan aturan padaif. -
Struktur case diakhiri dengan
end;bukanend.. -
caselebih ringkas daripada rantaiifketika alternatifnya banyak dan berbasis satu variabel. -
iftetap diperlukan ketika kondisi melibatkan beberapa variabel atau tipe non-ordinal. -
Kesalahan umum termasuk label duplikat,
label di luar rentang tipe, lupa titik koma setelah
blok, dan lupa
end;. - Case bersarang memungkinkan penyeleksian dua dimensi, tetapi gunakan secara bijak. Bila bersarang terlalu dalam, pertimbangkan memindahkan ke prosedur atau fungsi terpisah.
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.
Referensi
Sumber rujukan yang digunakan dalam penyusunan modul ini
Buku Teks
-
Jensen, K., & Wirth, N. (1991). Pascal User Manual and Report
(4th ed.). Springer-Verlag. Bab 9 membahas pernyataan
casesecara lengkap. -
Cantu, M. (2020). Object Pascal Handbook.
Marco Cantu. Bab tentang struktur kontrol dan
pernyataan
case. - Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang pemilihan berdasarkan nilai.
- Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 6 membahas struktur seleksi.
Dokumentasi Resmi
-
Free Pascal Team. Free Pascal Reference Guide.
Bab tentang pernyataan
case. Tersedia di freepascal.org/docs.html. - Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang tipe ordinal dan ekspresi penyeleksi.
-
Lazarus IDE Documentation. Panduan penggunaan struktur
casepada aplikasi.
Artikel dan Sumber Daring
-
IEEE Computer Society. (1990). IEEE Standard for Pascal
(IEEE Std 770-1983). Bab tentang pernyataan
case. - Wirth, N. (1971). "The Programming Language Pascal." Acta Informatica, 1(1), 35-63. Bab tentang struktur kontrol.
-
Free Pascal Community Forum. Diskusi tentang optimasi
casedan perbandingan performa dengan rantaiif.