Tujuan Pembelajaran
Kompetensi yang ingin dicapai setelah menyelesaikan modul ini
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
- Menggunakan operator aritmatika dan membedakan perilaku
/dandiv. - Menjelaskan fungsi
moddan menerapkannya untuk pemeriksaan keterbagian. - Menggunakan operator relasional untuk membandingkan nilai.
- Menggabungkan kondisi dengan operator logika
and,or, dannot. - Menjelaskan konsep short-circuit evaluation pada operator logika.
- Menggunakan operator bitwise untuk manipulasi bit.
- Menerapkan prioritas operator dengan benar dalam ekspresi majemuk.
- Melakukan konversi tipe implisit dan eksplisit menggunakan fungsi standar.
- Menghindari kesalahan umum terkait pembagian bilangan bulat dan perbandingan nilai real.
- Menggunakan fungsi matematika standar seperti
abs,sqr,sqrt,round, dantrunc.
Capaian Pembelajaran
Indikator ketercapaian dan kaitan dengan modul selanjutnya
Capaian Pembelajaran Mata Kuliah
Mahasiswa mampu menyusun ekspresi aritmatika, relasional, dan logika dengan benar, serta melakukan konversi antar tipe data sesuai kebutuhan perhitungan, sehingga program menghasilkan nilai yang akurat.
Indikator Ketercapaian Modul
| Kode | Indikator | Bukti |
|---|---|---|
| IK-4.1 | Membedakan hasil operasi /, div, dan mod |
Latihan 1 dan 3 |
| IK-4.2 | Menyusun kondisi logika majemuk dengan prioritas yang benar | Latihan 2 dan 4 |
| IK-4.3 | Melakukan konversi tipe dengan fungsi standar | Latihan 3 dan 5 |
| IK-4.4 | Menggunakan fungsi matematika standar dengan tepat | Latihan 4 dan studi kasus |
| IK-4.5 | Mengidentifikasi dan menghindari kesalahan umum ekspresi | Latihan 5 |
Operator dan ekspresi menjadi fondasi untuk percabangan pada Modul 6 dan 7, perulangan pada Modul 8 dan 9, serta seluruh algoritma pada fase-fase lanjutan. Kemampuan menyusun kondisi logika yang benar khususnya akan sangat menentukan pada percabangan bersarang.
Materi Teori
Operator, ekspresi, prioritas, dan konversi tipe secara menyeluruh
3.1 Pengertian Operator dan Ekspresi
Operator adalah simbol yang melakukan operasi terhadap satu atau lebih nilai. Operand adalah nilai yang dioperasikan. Gabungan operator dan operand disebut ekspresi.
Contoh ekspresi sederhana:
luas := panjang * lebar;
rata := (nilaiA + nilaiB + nilaiC) / 3;
lulus := (nilai >= 70) and (kehadiran >= 75);
Pada baris pertama, * adalah operator,
panjang dan lebar
adalah operand, dan panjang * lebar
adalah ekspresi.
Operator dalam Pascal dikelompokkan menjadi beberapa kategori berdasarkan jenis operasinya.
3.2 Operator Aritmatika
Operator aritmatika bekerja pada nilai numerik (integer atau real) dan menghasilkan nilai numerik.
| Operator | Nama | Tipe Operand | Tipe Hasil | Contoh |
|---|---|---|---|---|
+ | Penjumlahan | integer/real | integer/real | 7 + 3 = 10 |
- | Pengurangan | integer/real | integer/real | 7 - 3 = 4 |
* | Perkalian | integer/real | integer/real | 7 * 3 = 21 |
/ | Pembagian real | integer/real | real | 7 / 2 = 3.5 |
div | Pembagian bulat | integer | integer | 7 div 2 = 3 |
mod | Sisa bagi | integer | integer | 7 mod 2 = 1 |
Operator / selalu menghasilkan
real, bahkan ketika kedua operand
adalah integer. Operator div
hanya bekerja pada integer dan menghasilkan integer dengan
membuang bagian desimal (pembulatan ke arah nol, bukan
pembulatan ke bawah).
writeln(7 / 2); { 3.50000000000000E+000 }
writeln(7 div 2); { 3 }
writeln(7 mod 2); { 1 }
writeln(-7 div 2); { -3, bukan -4 }
writeln(-7 mod 2); { -1, bukan 1 }
Fungsi Matematika Standar
Selain operator, Pascal menyediakan fungsi matematika bawaan yang sering dipakai.
| Fungsi | Fungsi | Contoh | Hasil |
|---|---|---|---|
Abs(x) | Nilai absolut | Abs(-7) | 7 |
Sqr(x) | Kuadrat | Sqr(5) | 25 |
Sqrt(x) | Akar kuadrat | Sqrt(16) | 4.0 |
Round(x) | Pembulatan terdekat | Round(3.6) | 4 |
Trunc(x) | Pembuangan desimal | Trunc(3.9) | 3 |
Int(x) | Bagian bulat (real) | Int(3.9) | 3.0 |
Frac(x) | Bagian pecahan | Frac(3.75) | 0.75 |
Power(x, y) | x pangkat y | Power(2, 10) | 1024.0 |
3.3 Operator Relasional (Perbandingan)
Operator relasional membandingkan dua nilai dan menghasilkan boolean
(true atau false).
| Operator | Arti | Contoh | Hasil |
|---|---|---|---|
= | Sama dengan | 7 = 7 | TRUE |
<> | Tidak sama dengan | 7 <> 8 | TRUE |
< | Lebih kecil | 7 < 8 | TRUE |
> | Lebih besar | 7 > 8 | FALSE |
<= | Kecil atau sama | 7 <= 7 | TRUE |
>= | Besar atau sama | 7 >= 8 | FALSE |
= adalah pembanding,
sedangkan := adalah
penugasan. Menulis
if x = 5 then benar;
menulis x = 5; sebagai pernyataan
tunggal akan menghasilkan kesalahan kompilasi.
Perbandingan Nilai Real
Nilai real disimpan sebagai pendekatan, sehingga perbandingan
langsung dengan = sering menyesatkan.
Perhatikan contoh klasik berikut.
var
a, b: double;
begin
a := 0.1 + 0.2;
b := 0.3;
if a = b then
writeln('Sama')
else
writeln('Tidak sama'); { Ini yang akan tercetak }
writeln('a = ', a:0:20);
writeln('b = ', b:0:20);
end.
Alih-alih membandingkan langsung, bandingkan selisihnya dengan toleransi kecil (epsilon).
const
EPSILON = 1E-9;
var
a, b: double;
begin
a := 0.1 + 0.2;
b := 0.3;
if Abs(a - b) < EPSILON then
writeln('Sama (dalam toleransi)')
else
writeln('Tidak sama');
end.
3.4 Operator Logika
Operator logika bekerja pada nilai boolean dan menghasilkan boolean.
| Operator | Nama | A | B | A and B | A or B | not A |
|---|---|---|---|---|---|---|
and, or, not | AND, OR, NOT | TRUE | TRUE | TRUE | TRUE | FALSE |
| TRUE | FALSE | FALSE | TRUE | FALSE | ||
| FALSE | TRUE | FALSE | TRUE | TRUE | ||
| FALSE | FALSE | FALSE | FALSE | TRUE |
Operator xor juga tersedia untuk
logika eksklusif. Operator xor
menghasilkan true hanya ketika
tepat satu operand bernilai true.
Short-Circuit Evaluation
Free Pascal dan Delphi modern mendukung short-circuit evaluation
secara default. Artinya, pada ekspresi
A and B, bila A
sudah false, maka
B tidak dievaluasi sama sekali.
Demikian pula pada A or B, bila
A sudah true,
maka B dilewati.
Perilaku ini dapat dikendalikan dengan direktif kompilator:
| Direktif | Efek |
|---|---|
{$B-} | Short-circuit aktif (default) |
{$B+} | Evaluasi penuh, kedua operand selalu dievaluasi |
Short-circuit memungkinkan penulisan kondisi yang lebih aman. Contoh:
if (p <> nil) and (p^.nilai > 0) then
writeln('Nilai positif');
Bila p bernilai nil,
ekspresi kedua tidak dievaluasi, sehingga tidak terjadi
pointer dereference yang ilegal.
3.5 Operator Bitwise
Operator bitwise memanipulasi nilai pada tingkat bit individual. Operator ini hanya bekerja pada tipe integer.
| Operator | Nama | Contoh (biner) | Hasil |
|---|---|---|---|
and |
AND bitwise | 1100 AND 1010 | 1000 (8) |
or |
OR bitwise | 1100 OR 1010 | 1110 (14) |
xor |
XOR bitwise | 1100 XOR 1010 | 0110 (6) |
not |
NOT bitwise | NOT 1100 (8-bit) | 11110011 |
shl |
Shift left | 0011 SHL 2 | 1100 (12) |
shr |
Shift right | 1100 SHR 2 | 0011 (3) |
Operator and dan
or dalam Pascal berlaku baik untuk
boolean maupun bitwise. Kompiler menentukan perilaku berdasarkan
tipe operand. Bila operand bertipe boolean, hasilnya boolean.
Bila operand bertipe integer, hasilnya adalah operasi bitwise.
Aplikasi Bitwise: Mengecek Bilangan Ganjil
Karena bilangan ganjil selalu memiliki bit terakhir 1, kita dapat
memeriksa bit terakhir dengan operator and.
var
n: integer;
begin
write('Masukkan bilangan bulat: ');
readln(n);
if (n and 1) = 1 then
writeln(n, ' adalah bilangan ganjil')
else
writeln(n, ' adalah bilangan genap');
end.
3.6 Prioritas Operator
Ketika sebuah ekspresi memuat beberapa operator, urutan evaluasinya ditentukan oleh prioritas. Operator dengan prioritas lebih tinggi dievaluasi lebih dahulu.
| Prioritas | Operator | Asosiativitas |
|---|---|---|
| 1 (tertinggi) | not, tanda negatif uner (-x), @ | Kanan ke kiri |
| 2 | *, /, div, mod, and, shl, shr | Kiri ke kanan |
| 3 | +, -, or, xor | Kiri ke kanan |
| 4 | =, <>, <, >, <=, >=, in | Kiri ke kanan |
Berikut contoh yang sering mengejutkan pemula.
writeln(2 + 3 * 4); { 14, bukan 20 }
writeln((2 + 3) * 4); { 20 }
writeln(10 - 3 - 2); { 5, dievaluasi kiri ke kanan }
writeln(2 + 3 = 5); { TRUE, karena + lebih tinggi dari = }
writeln(not true or false); { TRUE, karena not lebih tinggi dari or }
Meskipun Anda hafal prioritas, selalu gunakan tanda kurung untuk memperjelas maksud Anda. Kode yang jelas lebih penting daripada kode yang singkat.
3.7 Konversi Tipe Implisit
Pascal melakukan konversi tipe otomatis pada beberapa situasi. Konversi implisit umumnya bergerak dari tipe yang lebih sempit ke tipe yang lebih luas, atau dari integer ke real.
| Dari | Ke | Terjadi Otomatis? | Catatan |
|---|---|---|---|
| Byte | Integer | Ya | Melebar, tidak ada kehilangan |
| Integer | LongInt | Ya | Aman |
| Integer | Real | Ya | Aman, dapat direpresentasikan tepat hingga 2^53 |
| Real | Integer | Tidak | Perlu konversi eksplisit (round/trunc) |
| Char | String | Ya | Dapat digabung |
| String | Integer | Tidak | Perlu Val |
3.8 Konversi Tipe Eksplisit
Ketika konversi implisit tidak tersedia atau Anda ingin mengontrol secara eksplisit, gunakan fungsi konversi berikut.
| Fungsi | Dari | Ke | Contoh | Hasil |
|---|---|---|---|---|
Round(x) | Real | Integer | Round(3.6) | 4 |
Trunc(x) | Real | Integer | Trunc(3.9) | 3 |
Int(x) | Real | Real | Int(3.9) | 3.0 |
Frac(x) | Real | Real | Frac(3.75) | 0.75 |
Ord(x) | Ordinal | Integer | Ord('A') | 65 |
Chr(x) | Integer | Char | Chr(66) | 'B' |
Str(x, s) | Numerik | String | Str(42, s) | s = '42' |
Val(s, x, kode) | String | Numerik | Val('42', x, kode) | x = 42, kode = 0 |
Contoh Konversi String ke Angka
Prosedur Val memerlukan tiga argumen:
string sumber, variabel hasil, dan variabel kode kesalahan.
Bila konversi berhasil, kode kesalahan bernilai 0. Bila gagal,
kode kesalahan menunjukkan posisi karakter yang bermasalah.
var
s: string;
n: integer;
kode: integer;
begin
s := '123';
Val(s, n, kode);
if kode = 0 then
writeln('Konversi berhasil: ', n)
else
writeln('Konversi gagal pada karakter ke-', kode);
end.
3.9 Pembagian Bulat: Sumber Kesalahan Klasik
Karena operator / selalu menghasilkan
real, sedangkan div selalu integer,
perhatikan dengan cermat konteks pembagian.
var
a, b: integer;
hasil1: real;
hasil2: integer;
begin
a := 7;
b := 2;
hasil1 := a / b; { hasil1 = 3.5, benar }
hasil2 := a div b; { hasil2 = 3, memotong desimal }
{ Kesalahan umum: hasil2 := a / b; }
{ Ini akan menghasilkan kesalahan kompilasi karena
tidak dapat menugaskan real ke integer. }
end.
Perhatikan urutan evaluasi pada ekspresi seperti
1 / 2 * 4. Karena
/ menghasilkan real, hasilnya adalah
0.5 * 4 = 2.0. Namun pada ekspresi
1 div 2 * 4, hasilnya adalah
0 * 4 = 0. Perbedaan ini sering
menimbulkan bug.
3.10 Kesalahan Umum Terkait Operator dan Ekspresi
- Menukar
=dan:=.=adalah pembanding,:=adalah penugasan. - Pembagian integer tak sengaja. Memakai
divpadahal ingin/, atau sebaliknya. - Membandingkan real dengan
=. Gunakan toleransi epsilon. - Mengabaikan prioritas operator. Selalu gunakan tanda kurung untuk memperjelas.
- Salah mengartikan
mod.modmengikuti perilaku pembagian bulat Pascal (pembulatan ke arah nol), bukan matematis (pembulatan ke bawah). - Menggunakan
and/orpada integer. Operator ini juga bitwise; pastikan operand bertipe boolean bila maksudnya logika. - Bergantung pada short-circuit pada kode lama. Kode yang dikompilasi dengan
{$B+}akan mengevaluasi kedua sisi. Jangan andalkan short-circuit untuk validasi pointer pada kode portabel. - Lupa bahwa
/menghasilkan real. Menyimpan hasil/ke variabel integer menyebabkan kesalahan kompilasi.
3.11 Perbedaan Free Pascal dan Turbo Pascal
| Aspek | Turbo Pascal | Free Pascal |
|---|---|---|
| Short-circuit default | Nonaktif (evaluasi penuh) | Aktif (short-circuit) pada mode modern |
Operator / |
Menghasilkan real | Menghasilkan real (sama) |
Fungsi Power |
Tidak tersedia langsung | Tersedia di unit Math |
Fungsi Int |
Bagian bulat sebagai real | Sama, tersedia di unit Math |
Operator in |
Ada, untuk himpunan | Ada, untuk himpunan |
Algoritma dan Flowchart
Alur evaluasi ekspresi, konversi tipe, dan penggunaan operator
4.1 Flowchart Prioritas Operator Aritmatika
Diagram berikut menggambarkan bagaimana ekspresi
2 + 3 * 4 - 10 div 3 dievaluasi
selangkah demi selangkah.
flowchart TD
A(["Ekspresi awal:
2 + 3 * 4 - 10 div 3"]) --> B["Identifikasi operator
prioritas tertinggi:
3 * 4 dan 10 div 3"]
B --> C["Evaluasi 3 * 4 = 12"]
C --> D["Evaluasi 10 div 3 = 3"]
D --> E["Ekspresi menjadi:
2 + 12 - 3"]
E --> F["Evaluasi kiri ke kanan:
2 + 12 = 14"]
F --> G["Evaluasi 14 - 3 = 11"]
G --> H(["Hasil akhir = 11"])
Gambar 4.1 - Langkah evaluasi ekspresi aritmatika majemuk
4.2 Flowchart Konversi Tipe Otomatis
Diagram berikut menggambarkan alur yang dijalankan kompiler ketika menemui operasi antar tipe yang berbeda.
flowchart TD
A(["Operasi biner
a OP b"]) --> B{"Tipe a = tipe b?"}
B -- "Ya" --> C["Langsung eksekusi"]
B -- "Tidak" --> D{"Ada tipe
yang dapat
dilebarkan?"}
D -- "Ya" --> E["Konversi implisit
ke tipe yang lebih luas"]
D -- "Tidak" --> F{"Konversi eksplisit
diberikan?"}
F -- "Ya" --> G["Terapkan konversi
eksplisit"]
F -- "Tidak" --> H["Error:
incompatible types"]
E --> C
G --> C
C --> I(["Selesai"])
H --> J(["Selesai dengan kesalahan"])
Gambar 4.2 - Alur konversi tipe implisit dan eksplisit
4.3 Flowchart Pengecekan Bilangan Prima
Contoh penerapan operator mod untuk
memeriksa keterbagian. Algoritma sederhana ini memeriksa apakah
sebuah bilangan dapat dibagi oleh bilangan lain selain 1 dan
dirinya sendiri.
flowchart TD
A(["Mulai"]) --> B[/"Baca n"/]
B --> C{"n < 2?"}
C -- "Ya" --> D["Bukan prima"]
C -- "Tidak" --> E["i = 2, prima = true"]
E --> F{"i < n dan
prima = true?"}
F -- "Tidak" --> J{"prima?"}
F -- "Ya" --> G{"n mod i = 0?"}
G -- "Ya" --> H["prima = false"]
G -- "Tidak" --> I["i = i + 1"]
H --> I
I --> F
J -- "Ya" --> K[/"Tampilkan PRIMA"/]
J -- "Tidak" --> L[/"Tampilkan BUKAN PRIMA"/]
D --> M(["Selesai"])
K --> M
L --> M
Gambar 4.3 - Flowchart pemeriksaan bilangan prima dengan operator mod
Pseudocode
Representasi algoritmik dari operasi aritmatika dan konversi
5.1 Pseudocode Kalkulator Sederhana
PROGRAM KalkulatorSederhana
{ Melakukan empat operasi dasar pada dua bilangan }
DEKLARASI
a, b : real
operasi : char
ALGORITMA
write("Masukkan bilangan pertama: ")
read(a)
write("Masukkan bilangan kedua: ")
read(b)
write("Operasi (+ - * /): ")
read(operasi)
jika operasi = '+' maka
write("Hasil: ", a + b)
selain jika operasi = '-' maka
write("Hasil: ", a - b)
selain jika operasi = '*' maka
write("Hasil: ", a * b)
selain jika operasi = '/' maka
jika b = 0 maka
write("Kesalahan: pembagian dengan nol")
selain itu
write("Hasil: ", a / b)
akhir jika
selain itu
write("Operasi tidak dikenali")
akhir jika
END
5.2 Pseudocode Konversi Suhu
PROGRAM KonversiSuhu
{ Mengkonversi Celsius ke Fahrenheit dan Kelvin }
DEKLARASI
celsius : real
fahrenheit : real
kelvin : real
ALGORITMA
write("Masukkan suhu Celsius: ")
read(celsius)
fahrenheit <- celsius * 9 / 5 + 32
kelvin <- celsius + 273.15
write("Fahrenheit : ", fahrenheit)
write("Kelvin : ", kelvin)
END
5.3 Pseudocode Pemeriksaan Bilangan Prima
PROGRAM CekBilanganPrima
{ Menentukan apakah sebuah bilangan bulat positif adalah prima }
DEKLARASI
n : integer
i : integer
prima : boolean
ALGORITMA
write("Masukkan bilangan bulat: ")
read(n)
jika n < 2 maka
prima <- false
selain itu
prima <- true
i <- 2
selama i < n dan prima = true lakukan
jika n mod i = 0 maka
prima <- false
akhir jika
i <- i + 1
akhir selama
akhir jika
jika prima = true maka
write(n, " adalah bilangan prima")
selain itu
write(n, " bukan bilangan prima")
akhir jika
END
Contoh Kode Pascal Lengkap
Empat program untuk mendemonstrasikan operator dan konversi tipe
6.1 Program Demonstrasi Semua Operator Aritmatika
program DemoAritmatika;
{ Mendemonstrasikan seluruh operator aritmatika Pascal }
var
a, b: integer;
hasilReal: real;
begin
a := 17;
b := 5;
writeln('a = ', a, ', b = ', b);
writeln('----------------------------------------');
writeln('a + b = ', a + b);
writeln('a - b = ', a - b);
writeln('a * b = ', a * b);
hasilReal := a / b;
writeln('a / b = ', hasilReal:0:6, ' (real)');
writeln('a div b = ', a div b, ' (integer)');
writeln('a mod b = ', a mod b, ' (integer)');
writeln('----------------------------------------');
writeln('Fungsi matematika pada a = ', a);
writeln('Abs(-a) = ', Abs(-a));
writeln('Sqr(a) = ', Sqr(a));
writeln('Sqrt(a) = ', Sqrt(a):0:6);
writeln('Round(a / b) = ', Round(a / b));
writeln('Trunc(a / b) = ', Trunc(a / b));
end.
Keluaran:
a = 17, b = 5 ---------------------------------------- a + b = 22 a - b = 12 a * b = 85 a / b = 3.400000 (real) a div b = 3 (integer) a mod b = 2 (integer) ---------------------------------------- Fungsi matematika pada a = 17 Abs(-a) = 17 Sqr(a) = 289 Sqrt(a) = 4.123106 Round(a / b) = 3 Trunc(a / b) = 3
6.2 Program Demonstrasi Operator Logika dan Short-Circuit
program DemoLogika;
{ Mendemonstrasikan operator logika dan tabel kebenaran }
var
a, b: boolean;
begin
writeln('Tabel Kebenaran Operator Logika');
writeln('----------------------------------------');
writeln('A B A and B A or B A xor B not A');
writeln('----------------------------------------');
a := true; b := true;
writeln(a:5, b:6, (a and b):9, (a or b):9, (a xor b):10, (not a):8);
a := true; b := false;
writeln(a:5, b:6, (a and b):9, (a or b):9, (a xor b):10, (not a):8);
a := false; b := true;
writeln(a:5, b:6, (a and b):9, (a or b):9, (a xor b):10, (not a):8);
a := false; b := false;
writeln(a:5, b:6, (a and b):9, (a or b):9, (a xor b):10, (not a):8);
writeln('----------------------------------------');
{ Demonstrasi short-circuit }
writeln('Short-circuit: (false) and (1/0 = 0)');
if false and (1 / 0 = 0) then
writeln('Tidak akan tercetak')
else
writeln('Bagian kanan tidak dievaluasi');
end.
Keluaran:
Tabel Kebenaran Operator Logika ---------------------------------------- A B A and B A or B A xor B not A ---------------------------------------- TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE ---------------------------------------- Short-circuit: (false) and (1/0 = 0) Bagian kanan tidak dievaluasi
6.3 Program Konversi Tipe dan String
program DemoKonversi;
{ Mendemonstrasikan konversi tipe di Pascal }
var
n: integer;
r: real;
s: string;
c: char;
kode: integer;
begin
writeln('=== Konversi Real ke Integer ===');
r := 3.75;
writeln('Nilai real : ', r:0:4);
writeln('Round(r) : ', Round(r));
writeln('Trunc(r) : ', Trunc(r));
writeln('Int(r) : ', Int(r):0:4);
writeln('Frac(r) : ', Frac(r):0:4);
writeln;
writeln('=== Konversi Integer ke Real ===');
n := 42;
r := n; { implisit }
writeln('n (integer) : ', n);
writeln('r (real) : ', r:0:2);
writeln;
writeln('=== Konversi Char dan Ordinal ===');
c := 'Z';
writeln('Karakter : ', c);
writeln('Ord(c) : ', Ord(c));
writeln('Chr(65) : ', Chr(65));
writeln('Succ(c) : ', Succ(c));
writeln('Pred(c) : ', Pred(c));
writeln;
writeln('=== Konversi String dan Angka ===');
n := 12345;
Str(n, s);
writeln('Str(12345, s) : s = "', s, '"');
s := '67890';
Val(s, n, kode);
writeln('Val("67890", n) : n = ', n, ', kode = ', kode);
s := '12abc';
Val(s, n, kode);
writeln('Val("12abc", n) : n = ', n, ', kode = ', kode);
end.
Keluaran:
=== Konversi Real ke Integer ===
Nilai real : 3.7500
Round(r) : 4
Trunc(r) : 3
Int(r) : 3.0000
Frac(r) : 0.7500
=== Konversi Integer ke Real ===
n (integer) : 42
r (real) : 42.00
=== Konversi Char dan Ordinal ===
Karakter : Z
Ord(c) : 90
Chr(65) : A
Succ(c) : [
Pred(c) : Y
=== Konversi String dan Angka ===
Str(12345, s) : s = "12345"
Val("67890", n) : n = 67890, kode = 0
Val("12abc", n) : n = 12, kode = 3
6.4 Program Pemeriksaan Bilangan Prima
program CekPrima;
{ Menentukan apakah sebuah bilangan bulat positif adalah prima }
var
n: integer;
i: integer;
prima: boolean;
jumlahFaktor: integer;
begin
write('Masukkan bilangan bulat positif: ');
readln(n);
if n < 2 then
begin
prima := false;
jumlahFaktor := 0;
end
else
begin
prima := true;
jumlahFaktor := 2; { 1 dan n }
i := 2;
while (i <= n div 2) and prima do
begin
if n mod i = 0 then
begin
prima := false;
jumlahFaktor := jumlahFaktor + 1;
end;
i := i + 1;
end;
end;
writeln;
writeln('Bilangan yang diperiksa: ', n);
if prima then
writeln('Status: PRIMA')
else
writeln('Status: BUKAN PRIMA');
writeln('Jumlah faktor yang ditemukan: ', jumlahFaktor);
end.
Contoh sesi interaksi:
Masukkan bilangan bulat positif: 97 Bilangan yang diperiksa: 97 Status: PRIMA Jumlah faktor yang ditemukan: 2
Penjelasan Kode Baris per Baris
Membedah program DemoAritmatika dan CekPrima secara rinci
7.1 Program DemoAritmatika
| Baris | Kode | Penjelasan |
|---|---|---|
| 5-6 | a, b: integer; |
Dua variabel integer dan satu variabel real. Variabel
hasilReal khusus menampung
hasil operator / yang
menghasilkan real.
|
| 9-10 | a := 17; |
Inisialisasi nilai. Dipilih 17 dan 5 karena keduanya
relatif prima, sehingga hasil div
dan mod terlihat jelas.
|
| 15-17 | writeln('a + b = ', a + b); |
Menampilkan operasi penjumlahan, pengurangan, dan perkalian. Hasilnya bertipe integer. |
| 19-20 | hasilReal := a / b; |
Operator / menghasilkan real,
disimpan ke hasilReal. Format
:0:6 menampilkan enam angka
desimal: 3.400000.
|
| 22-23 | writeln('a div b = ', a div b, ...); |
17 div 5 = 3 (bagian bulat),
17 mod 5 = 2 (sisa bagi).
Perhatikan bahwa 3 * 5 + 2 = 17,
membuktikan identitas
a = (a div b) * b + (a mod b).
|
| 26 | writeln('Abs(-a) = ', Abs(-a)); |
-a adalah operator uner
yang menghasilkan -17. Abs(-17)
mengembalikan 17.
|
| 27-28 | writeln('Sqr(a) = ', Sqr(a)); |
Sqr(17) = 289 menghasilkan integer.
Sqrt(17) menghasilkan real
dengan enam angka desimal.
|
| 29-30 | writeln('Round(a / b) = ', Round(a / b)); |
Karena a / b = 3.4,
Round menghasilkan 3
(pembulatan terdekat), sedangkan
Trunc juga menghasilkan 3
(pemotongan desimal).
|
7.2 Program CekPrima
| Baris | Kode | Penjelasan |
|---|---|---|
| 5-8 | n: integer; |
Variabel n menyimpan bilangan
yang diperiksa, i adalah
pencacah, prima menyimpan
status, dan jumlahFaktor
menghitung berapa banyak faktor yang ditemukan.
|
| 13-17 | if n < 2 then |
Kasus khusus: bilangan kurang dari 2 bukan prima.
Blok begin...end diperlukan
karena ada dua pernyataan.
|
| 18-23 | else |
Untuk n >= 2, kita mulai dengan asumsi prima dan dua faktor pasti (1 dan n sendiri). Pencacah mulai dari 2. |
| 24 | while (i <= n div 2) and prima do |
Perulangan berhenti ketika i melampaui setengah dari n
(optimasi: faktor terbesar selain n adalah n div 2),
atau ketika sudah ditemukan bukan prima.
Perhatikan penggunaan div
untuk menghitung batas atas secara efisien.
|
| 26-30 | if n mod i = 0 then |
n mod i = 0 berarti i adalah
faktor n. Karena kita mencari bilangan prima, cukup satu
faktor saja untuk menyimpulkan bukan prima. Operator
mod di sini menjadi kunci.
|
| 32 | i := i + 1; |
Menaikkan pencacah. Bila tidak ada baris ini, akan terjadi infinite loop. |
| 37-40 | if prima then |
Variabel boolean prima
dapat langsung dipakai sebagai kondisi, tanpa perlu
dituliskan prima = true.
|
7.3 Jejak Eksekusi CekPrima untuk n = 15
| Iterasi | i | i <= 7 dan prima? | 15 mod i | Aksi | prima |
|---|---|---|---|---|---|
| Awal | 2 | Ya | 1 | Lanjut | TRUE |
| 1 | 2 | Ya | 1 | Tidak nol, lanjut | TRUE |
| 2 | 3 | Ya | 0 | Faktor ditemukan | FALSE |
| Berhenti | 4 | Tidak (prima false) | - | Keluar loop | FALSE |
Karena 15 mod 3 = 0, maka 15 bukan
bilangan prima. Perulangan berhenti lebih awal karena kondisi
prima sudah bernilai
false.
Operator mod adalah alat yang
sangat berguna untuk memeriksa keterbagian. Bersama
div, keduanya memungkinkan
kita mengerjakan operasi matematika diskrit pada bilangan
bulat tanpa harus beralih ke tipe real.
Latihan Soal
Lima soal dengan tingkat kesulitan bertingkat
Evaluasi Ekspresi
MudahHitung nilai setiap ekspresi berikut tanpa menjalankan program. Kemudian verifikasi jawaban Anda dengan menulis program Pascal kecil untuk menampilkan hasilnya.
10 + 3 * 2 - 4(10 + 3) * (2 - 4)20 div 3 + 20 mod 3-7 div 2dan-7 mod 22 + 3 < 4 * 2not (3 > 5) or (4 = 4)5 and 3(bitwise)5 or 3(bitwise)
Pertanyaan tambahan: mengapa
-7 div 2 menghasilkan -3 bukan -4?
Jelaskan konsep yang mendasarinya.
Konversi Waktu
Mudah
Buat program konversi_waktu.pas
yang membaca jumlah detik (integer) dan mengkonversinya menjadi
jam, menit, dan detik.
Contoh:
- Masukan: 3661 detik
- Keluaran: 1 jam, 1 menit, 1 detik
Petunjuk:
- 1 jam = 3600 detik, 1 menit = 60 detik.
- Gunakan
divdanmodsecara berurutan.
Pertanyaan analisis: mengapa kita tidak bisa
menggunakan operator / untuk
konversi ini?
Kalkulator Diskon Berjenjang
SedangBuat program yang menerima total belanja dan menghitung diskon berdasarkan aturan berikut.
- Belanja < 100.000: tidak ada diskon
- 100.000 ≤ belanja < 500.000: diskon 5 persen
- 500.000 ≤ belanja < 1.000.000: diskon 10 persen
- Belanja ≥ 1.000.000: diskon 15 persen
Ketentuan:
- Simpan setiap batas dan persentase dalam konstanta bertipe.
- Gunakan operator relasional dan logika yang tepat.
- Tampilkan total belanja, diskon, dan total yang harus dibayar.
- Gunakan
currencyuntuk semua nilai uang.
Pertanyaan analisis: mengapa kondisi
100000 <= belanja < 500000
tidak valid dalam Pascal, dan bagaimana cara yang benar
menuliskannya?
Geometri: Luas dan Keliling Lingkaran
SedangBuat program yang menerima jari-jari lingkaran dan menghitung luas serta kelilingnya. Simpan nilai Pi sebagai konstanta.
Rumus:
- Luas = Pi * r2
- Keliling = 2 * Pi * r
Ketentuan:
- Definisikan
Pi = 3.14159265358979sebagai konstanta. - Gunakan fungsi
Sqruntuk menghitung r2. - Tampilkan hasil dengan empat angka desimal.
Pertanyaan analisis: bila jari-jari bertipe integer, apakah hasil luas dan keliling tetap akurat? Jelaskan mengapa Anda perlu memperhatikan tipe data pada operasi yang melibatkan konstanta real.
Deteksi Kesalahan Operator
SulitProgram berikut memiliki delapan kesalahan terkait operator, prioritas, atau konversi tipe. Temukan semuanya, lalu tuliskan versi yang benar.
program KacauOperator;
var
a, b, c: integer;
hasil: integer;
rerata: real;
begin
a := 10;
b := 3;
c = 5;
hasil := a / b;
rerata := a + b + c / 3;
if a = b then
writeln('Sama')
else if a <> b and c > 4 then
writeln('Kondisi terpenuhi');
if hasil := 3 then
writeln('Hasil tiga');
writeln('Selesai');
end.
Ketentuan:
- Sebutkan nomor baris setiap kesalahan.
- Jelaskan mengapa baris tersebut salah.
- Tuliskan versi perbaikan lengkap yang dapat dikompilasi.
Pertanyaan analisis: pada ekspresi
rerata := a + b + c / 3, apa
hasilnya bila operator dijalankan tanpa tanda kurung? Mengapa
hasil ini hampir pasti bukan yang diinginkan?
Studi Kasus
Sistem Perhitungan Gaji Karyawan
9.1 Deskripsi Masalah
PT "Maju Bersama" memerlukan program untuk menghitung gaji bersih karyawan bulanan. Setiap karyawan memiliki: nama, jumlah jam kerja reguler, jumlah jam lembur, dan gaji pokok. Program menghitung upah lembur, gaji kotor, potongan pajak, dan gaji bersih.
9.2 Aturan Perhitungan
| Komponen | Rumus | Keterangan |
|---|---|---|
| Upah per jam | Gaji pokok / 173 | Berdasarkan standar jam kerja bulanan |
| Upah lembur | Jam lembur × upah per jam × 1.5 | Tarif lembur 1,5 kali upah normal |
| Gaji kotor | Gaji pokok + upah lembur | Sebelum potongan |
| Pajak | 5 persen dari gaji kotor | Tarif tetap untuk studi kasus |
| Gaji bersih | Gaji kotor − pajak | Yang diterima karyawan |
9.3 Flowchart Studi Kasus
flowchart TD
A(["Mulai"]) --> B[/"Baca nama, jamLembur, gajiPokok"/]
B --> C["upahPerJam = gajiPokok / 173"]
C --> D["upahLembur = jamLembur * upahPerJam * 1.5"]
D --> E["gajiKotor = gajiPokok + upahLembur"]
E --> F["pajak = gajiKotor * 0.05"]
F --> G["gajiBersih = gajiKotor - pajak"]
G --> H[/"Tampilkan slip gaji"/]
H --> I(["Selesai"])
Gambar 9.1 - Flowchart perhitungan gaji karyawan
9.4 Pseudocode Studi Kasus
PROGRAM PerhitunganGaji
{ Menghitung gaji bersih karyawan bulanan }
KONSTANTA
JAM_KERJA_BULANAN = 173
TARIF_LEMBUR = 1.5
TARIF_PAJAK = 0.05
GARIS_GANDA = "=========================================="
GARIS_TUNGGAL = "------------------------------------------"
DEKLARASI
nama : string
jamLembur : integer
gajiPokok : currency
upahPerJam : currency
upahLembur : currency
gajiKotor : currency
pajak : currency
gajiBersih : currency
ALGORITMA
write("Nama karyawan : ")
read(nama)
write("Jam lembur (jam) : ")
read(jamLembur)
write("Gaji pokok (Rp) : ")
read(gajiPokok)
upahPerJam <- gajiPokok / JAM_KERJA_BULANAN
upahLembur <- jamLembur * upahPerJam * TARIF_LEMBUR
gajiKotor <- gajiPokok + upahLembur
pajak <- gajiKotor * TARIF_PAJAK
gajiBersih <- gajiKotor - pajak
write(GARIS_GANDA)
write("SLIP GAJI KARYAWAN")
write("PT Maju Bersama")
write(GARIS_GANDA)
write("Nama : ", nama)
write("Jam lembur : ", jamLembur, " jam")
write("Gaji pokok : Rp ", gajiPokok)
write(GARIS_TUNGGAL)
write("Upah per jam : Rp ", upahPerJam)
write("Upah lembur : Rp ", upahLembur)
write("Gaji kotor : Rp ", gajiKotor)
write("Pajak 5 persen: Rp ", pajak)
write(GARIS_TUNGGAL)
write("Gaji bersih : Rp ", gajiBersih)
write(GARIS_GANDA)
END
9.5 Implementasi dalam Pascal
program PerhitunganGaji;
{ Studi Kasus Modul 4 - Perhitungan gaji bersih karyawan }
const
JAM_KERJA_BULANAN = 173;
TARIF_LEMBUR = 1.5;
TARIF_PAJAK = 0.05;
GARIS_GANDA = '==========================================';
GARIS_TUNGGAL = '------------------------------------------';
var
nama : string[50];
jamLembur : integer;
gajiPokok : currency;
upahPerJam : currency;
upahLembur : currency;
gajiKotor : currency;
pajak : currency;
gajiBersih : currency;
begin
writeln('Formulir Perhitungan Gaji');
writeln(GARIS_TUNGGAL);
writeln;
write('Nama karyawan : ');
readln(nama);
write('Jam lembur (jam) : ');
readln(jamLembur);
write('Gaji pokok (Rp) : ');
readln(gajiPokok);
upahPerJam := gajiPokok / JAM_KERJA_BULANAN;
upahLembur := jamLembur * upahPerJam * TARIF_LEMBUR;
gajiKotor := gajiPokok + upahLembur;
pajak := gajiKotor * TARIF_PAJAK;
gajiBersih := gajiKotor - pajak;
writeln;
writeln(GARIS_GANDA);
writeln('SLIP GAJI KARYAWAN');
writeln('PT Maju Bersama');
writeln(GARIS_GANDA);
writeln('Nama : ', nama);
writeln('Jam lembur : ', jamLembur, ' jam');
writeln('Gaji pokok : Rp ', gajiPokok:0:2);
writeln(GARIS_TUNGGAL);
writeln('Upah per jam : Rp ', upahPerJam:0:2);
writeln('Upah lembur : Rp ', upahLembur:0:2);
writeln('Gaji kotor : Rp ', gajiKotor:0:2);
writeln('Pajak 5 persen: Rp ', pajak:0:2);
writeln(GARIS_TUNGGAL);
writeln('Gaji bersih : Rp ', gajiBersih:0:2);
writeln(GARIS_GANDA);
end.
9.6 Contoh Keluaran
Formulir Perhitungan Gaji ------------------------------------------ Nama karyawan : Budi Hartono Jam lembur (jam) : 12 Gaji pokok (Rp) : 6500000 ========================================== SLIP GAJI KARYAWAN PT Maju Bersama ========================================== Nama : Budi Hartono Jam lembur : 12 jam Gaji pokok : Rp 6500000.00 ------------------------------------------ Upah per jam : Rp 37572.25 Upah lembur : Rp 676300.58 Gaji kotor : Rp 7176300.58 Pajak 5 persen: Rp 358815.03 ------------------------------------------ Gaji bersih : Rp 6817485.55 ==========================================
9.7 Pembahasan
Beberapa keputusan perancangan penting pada program ini.
-
Konstanta bertipe untuk tarif. Dengan mendefinisikan
TARIF_LEMBURdanTARIF_PAJAKsebagai konstanta, bila tarif berubah cukup ubah satu tempat. -
Operator
/untuk upah per jam. Karena gaji pokok tidak selalu habis dibagi 173, operator/menghasilkan real. Dengan tipecurrency, hasilnya tetap presisi hingga 4 angka desimal. -
Urutan operasi perkalian.
jamLembur * upahPerJam * TARIF_LEMBURdievaluasi kiri ke kanan: pertama jamLembur × upahPerJam, lalu hasilnya × TARIF_LEMBUR. Semua bertipe currency, sehingga tidak ada konversi tersembunyi. -
Penggunaan currency. Semua nilai moneter
menggunakan
currency, sehingga tidak ada kesalahan pembulatan akumulatif seperti padareal. -
Blok keluaran terstruktur. Slip gaji disusun
dengan
writelntunggal per baris, memudahkan modifikasi format di kemudian hari.
9.8 Pengembangan Selanjutnya
| Modul | Pengembangan |
|---|---|
| Modul 6 | Menambahkan perhitungan pajak progresif berdasarkan golongan gaji |
| Modul 8 | Memproses gaji seluruh karyawan dengan perulangan |
| Modul 11 | Memindahkan perhitungan ke prosedur dan fungsi terpisah |
| Modul 20 | Mengelompokkan data karyawan dalam record |
| Modul 25 | Menyimpan slip gaji ke berkas |
| Modul 36 | Merancang kelas Karyawan dengan method hitung gaji |
Rangkuman
Poin-poin kunci yang perlu diingat dari Modul 4
-
Operator aritmatika meliputi
+,-,*,/,div, danmod. Perhatikan bahwa/menghasilkan real, sedangkandivmenghasilkan integer. -
Operator
modmenghasilkan sisa bagi dan mengikuti perilaku pembagian bulat Pascal (pembulatan ke arah nol). -
Fungsi matematika standar seperti
Abs,Sqr,Sqrt,Round, danTruncsangat berguna dalam perhitungan. -
Operator relasional membandingkan dua nilai
dan menghasilkan boolean.
=adalah pembanding,:=adalah penugasan. -
Jangan membandingkan real dengan
=secara langsung. Gunakan toleransi epsilon. -
Operator logika
and,or,not, danxorbekerja pada boolean. - Short-circuit evaluation aktif secara default pada Free Pascal modern. Bila operand kiri sudah menentukan hasil, operand kanan tidak dievaluasi.
-
Operator bitwise bekerja pada tingkat bit.
anddanorberlaku untuk integer (bitwise) maupun boolean (logika). - Prioritas operator menentukan urutan evaluasi. Selalu gunakan tanda kurung untuk memperjelas maksud.
-
Konversi tipe implisit terjadi dari tipe
sempit ke tipe lebar. Konversi sebaliknya memerlukan fungsi
eksplisit seperti
RoundatauTrunc. -
Fungsi
OrddanChrmengkonversi antara char dan kode ordinalnya. FungsiStrdanValmengkonversi antara angka dan string. -
Waspadai pembagian bilangan bulat.
1 div 2menghasilkan 0, bukan 0.5. Kesalahan ini sering menimbulkan bug yang sulit dilacak.
Pastikan Anda sudah dapat menuliskan ekspresi majemuk dengan
benar dan memahami kapan memakai /
versus div. Latihan 1 dan 5 adalah
indikator yang baik untuk mengukur pemahaman. Modul 5 akan
membahas pemformatan input/output secara mendalam.
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 6 membahas ekspresi dan operator secara formal.
- Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab 4 membahas operator dan ekspresi pada Free Pascal dan Delphi.
- Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang ekspresi dan konversi tipe dengan pendekatan pedagogis yang sangat baik.
- Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 4 membahas operator dan ekspresi.
- Goldberg, D. (1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic." ACM Computing Surveys, 23(1), 5-48. Rujukan klasik tentang presisi real.
Dokumentasi Resmi
- Free Pascal Team. Free Pascal Reference Guide. Bab tentang operator, ekspresi, dan fungsi standar. Tersedia di freepascal.org/docs.html.
-
Free Pascal Team. Free Pascal Programmer's Guide.
Bab tentang direktif kompilator
{$B+}dan{$B-}. - Lazarus IDE Documentation. Panduan penggunaan fungsi matematika dan konversi tipe.
Artikel dan Sumber Daring
- IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang ekspresi dan operator.
-
Knuth, D. E. (1997). The Art of Computer Programming, Volume 1
(3rd ed.). Addison-Wesley. Bab 1 membahas aritmatika bilangan bulat
dan sifat
divsertamod. - Free Pascal Community Forum. Diskusi tentang perilaku short-circuit pada berbagai mode kompilasi.