Tujuan Pembelajaran
Kompetensi yang ingin dicapai setelah menyelesaikan modul ini
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
- Menjelaskan konsep percabangan dan posisinya sebagai struktur selection.
- Menulis percabangan satu arah dengan
if...then. - Menulis percabangan dua arah dengan
if...then...else. - Menggunakan blok
begin...endpada cabang yang memuat lebih dari satu pernyataan. - Menjelaskan aturan pemasangan
elsepada percabangan bersarang. - Menyusun kondisi majemuk dengan operator logika
and,or, dannot. - Menghindari kesalahan logika umum pada kondisi majemuk.
- Menggambar flowchart untuk percabangan satu arah, dua arah, dan bersarang.
- Menerjemahkan logika percabangan ke dalam pseudocode dan kode Pascal.
- Memecahkan masalah nyata dengan percabangan bertingkat.
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 |
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.
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.
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 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 nilai > 70 then
begin
writeln('LULUS');
writeln('Selamat!');
totalLulus := totalLulus + 1;
end;
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 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 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:
- Setiap pernyataan di dalam blok diakhiri titik koma.
endyang mendahuluielsetidak diikuti titik koma.enddi akhir cabangelsediikuti titik koma sebagai penutup konstruksiif.
3.5 Percabangan Bersarang
Percabangan dapat berada di dalam percabangan lain, membentuk struktur bersarang. Ini diperlukan ketika pengambilan keputusan dilakukan secara bertingkat.
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.
Perhatikan kode berikut:
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:
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.
{ 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');
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.
{ 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.
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
- Titik koma sebelum
else. Mengakibatkan kesalahan kompilasi karenaelsedianggap tidak berpasangan. - Lupa
begin...end. Hanya pernyataan pertama yang dianggap bagian dari percabangan, sisanya selalu dieksekusi. - Menulis
0 <= nilai <= 100. Selalu bernilaitruekarena dievaluasi dari kiri ke kanan. Gunakanand. - Menggunakan
=untuk penugasan. Dalam kondisi,=adalah pembanding; untuk penugasan gunakan:=. - Ambiguitas dangling else. Selalu bungkus blok dalam
begin...endbila ada percabangan bersarang. - Kondisi berbalik. Menuliskan kondisi yang kebalikan dari yang dimaksud. Baca ulang logika sebelum mengompilasi.
- Lupa menginisialisasi variabel yang dipakai dalam kondisi. Variabel lokal tanpa inisialisasi bernilai acak.
- Menggunakan
and/orpada 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 |
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
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
Contoh Kode Pascal Lengkap
Lima program untuk mendemonstrasikan percabangan
6.1 Program Cek Bilangan Ganjil Genap
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
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
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
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
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 ========================================
Penjelasan Kode Baris per Baris
Membedah program ValidasiNilai dan HurufMutu secara rinci
7.1 Program ValidasiNilai
| Baris | Kode | Penjelasan |
|---|---|---|
| 5-6 | NILAI_MIN = 0; |
Dua konstanta untuk batas nilai. Dengan konstanta, bila aturan validasi berubah, cukup ubah di satu tempat. |
| 8-10 | nama: string; |
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 |
Blok begin...end membungkus
cabang "nilai valid". Ada lima pernyataan di dalamnya.
|
| 22-25 | if nilai >= 70 then |
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 |
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 ', |
Menampilkan batas nilai menggunakan konstanta, sehingga pesan otomatis menyesuaikan bila konstanta diubah. |
7.2 Program HurufMutu
| Baris | Kode | Penjelasan |
|---|---|---|
| 5-6 | nilai: integer; |
Variabel huruf bertipe
char karena menyimpan
satu karakter huruf mutu.
|
| 13-14 | if (nilai < 0) or (nilai > 100) then |
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 |
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 |
Cabang terakhir tanpa kondisi. Ini menangkap semua nilai yang belum tertangkap oleh kondisi sebelumnya, yaitu nilai di bawah 50. |
| 28-30 | writeln; |
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 > 100 | FALSE | Lewati cabang kesalahan |
nilai >= 85 | FALSE (78 < 85) | Lanjut ke kondisi berikutnya |
nilai >= 70 | TRUE | huruf := 'B' |
| Sisa rantai | - | Dilewati |
Hasil akhir: huruf = 'B'.
Program menampilkan "Nilai: 78" dan "Huruf mutu: B".
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.
Latihan Soal
Lima soal dengan tingkat kesulitan bertingkat
Bilangan Positif, Negatif, atau Nol
MudahBuat 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.
Tahun Kabisat
MudahTahun 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?
Klasifikasi Nilai dengan Keterangan
SedangBuat 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?
Kalkulator Indeks Massa Tubuh
SedangBuat 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?
Deteksi Kesalahan Logika Percabangan
SulitProgram berikut memiliki enam kesalahan terkait sintaks atau logika percabangan. Temukan semuanya, lalu tuliskan versi yang benar.
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?
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
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.
- Konstanta untuk setiap kriteria. Dengan konstanta, aturan beasiswa mudah diubah tanpa menyentuh logika percabangan.
-
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. - 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.
-
Variabel
berhakbertipe boolean. Meskipun dapat diturunkan darikategori, menyimpannya secara eksplisit memisahkan data dari penyajian dan mempermudah bila logika perlu dikembangkan. -
Rantai
else ifyang 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 7 | Bila kriteria berbasis nilai diskrit, gunakan case |
| Modul 11 | Memindahkan logika penentuan ke fungsi yang mengembalikan string |
| Modul 16 | Memproses banyak mahasiswa dengan array |
| Modul 20 | Mengelompokkan data mahasiswa dalam record |
| Modul 25 | Menyimpan hasil penentuan ke berkas |
| Modul 41 | Menambahkan exception handling untuk menangani data yang tidak lengkap |
Rangkuman
Poin-poin kunci yang perlu diingat dari Modul 6
- Percabangan adalah struktur kontrol selection yang memungkinkan program memilih satu jalur eksekusi dari beberapa alternatif.
-
Percabangan satu arah memakai
if...then. Blok pernyataan dieksekusi hanya bila kondisi benar. -
Percabangan dua arah memakai
if...then...else. Satu blok dieksekusi bila kondisi benar, blok lain bila salah. -
Blok
begin...enddiperlukan bila cabang memuat lebih dari satu pernyataan. -
Tidak ada titik koma sebelum
else. Ini adalah kesalahan sintaks yang paling sering terjadi. -
Rantai
else ifmemungkinkan pemilihan dari banyak alternatif tanpa bersarang terlalu dalam. - Urutan pemeriksaan penting. Periksa kondisi dari yang paling ketat ke paling longgar.
-
Aturan dangling else: setiap
elseberpasangan denganifterdekat yang belum memilikielse. Gunakanbegin...enduntuk menghindari ambiguitas. -
Kondisi majemuk dibentuk dengan
and,or, dannot. Selalu bungkus setiap perbandingan dengan tanda kurung. -
Menulis
0 <= x <= 100selalu bernilaitrue. Gunakan(x >= 0) and (x <= 100). - Validasi rentang adalah pola umum percabangan: memeriksa apakah masukan berada dalam rentang yang sah, dan menampilkan pesan kesalahan bila tidak.
-
Alternatif
caselebih ringkas ketika percabangan berbasis nilai diskrit dari satu variabel.
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.
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
ifdancase. - Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan percabangan pada Free Pascal.
- Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang pengambilan keputusan.
- Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 6 membahas struktur kontrol.
- Dahl, O. J., Dijkstra, E. W., & Hoare, C. A. R. (1972). Structured Programming. Academic Press. Rujukan klasik tentang pemrograman terstruktur.
Dokumentasi Resmi
-
Free Pascal Team. Free Pascal Reference Guide.
Bab tentang pernyataan
if. Tersedia di freepascal.org/docs.html. - Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang struktur kontrol dan tipografi sintaks.
- Lazarus IDE Documentation. Panduan penggunaan struktur kontrol dalam aplikasi.
Artikel dan Sumber Daring
- IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang pernyataan bersyarat.
- Dijkstra, E. W. (1968). "Go To Statement Considered Harmful." Communications of the ACM, 11(3), 147-148. Artikel klasik tentang pemrograman terstruktur.
- Free Pascal Community Forum. Diskusi tentang dangling else dan best practice percabangan.