P Pascal dan Algoritma
Modul 4 dari 50 Roadmap
Modul 04 - Fase Dasar

Operator, Ekspresi, dan Konversi Tipe

Setelah menguasai variabel dan tipe data, modul ini membahas bagaimana data diolah. Anda akan mempelajari operator aritmatika, relasional, logika, bitwise, dan set, memahami prioritas operator, serta menguasai teknik konversi tipe implisit dan eksplisit. Modul ini juga membahas secara mendalam dua kesalahan klasik: pembagian bilangan bulat dan perbandingan nilai real.

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

Tujuan Pembelajaran

Kompetensi yang ingin dicapai setelah menyelesaikan modul ini

Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:

  1. Menggunakan operator aritmatika dan membedakan perilaku / dan div.
  2. Menjelaskan fungsi mod dan menerapkannya untuk pemeriksaan keterbagian.
  3. Menggunakan operator relasional untuk membandingkan nilai.
  4. Menggabungkan kondisi dengan operator logika and, or, dan not.
  5. Menjelaskan konsep short-circuit evaluation pada operator logika.
  6. Menggunakan operator bitwise untuk manipulasi bit.
  7. Menerapkan prioritas operator dengan benar dalam ekspresi majemuk.
  8. Melakukan konversi tipe implisit dan eksplisit menggunakan fungsi standar.
  9. Menghindari kesalahan umum terkait pembagian bilangan bulat dan perbandingan nilai real.
  10. Menggunakan fungsi matematika standar seperti abs, sqr, sqrt, round, dan trunc.
02

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
Kaitan dengan Modul Berikutnya

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.

03

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:

ekspresi_dasar.pasPascal
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
+Penjumlahaninteger/realinteger/real7 + 3 = 10
-Penguranganinteger/realinteger/real7 - 3 = 4
*Perkalianinteger/realinteger/real7 * 3 = 21
/Pembagian realinteger/realreal7 / 2 = 3.5
divPembagian bulatintegerinteger7 div 2 = 3
modSisa bagiintegerinteger7 mod 2 = 1
Perbedaan Kritis: / vs div

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).

div_vs_slash.pasPascal
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 absolutAbs(-7)7
Sqr(x)KuadratSqr(5)25
Sqrt(x)Akar kuadratSqrt(16)4.0
Round(x)Pembulatan terdekatRound(3.6)4
Trunc(x)Pembuangan desimalTrunc(3.9)3
Int(x)Bagian bulat (real)Int(3.9)3.0
Frac(x)Bagian pecahanFrac(3.75)0.75
Power(x, y)x pangkat yPower(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 dengan7 = 7TRUE
<>Tidak sama dengan7 <> 8TRUE
<Lebih kecil7 < 8TRUE
>Lebih besar7 > 8FALSE
<=Kecil atau sama7 <= 7TRUE
>=Besar atau sama7 >= 8FALSE
Jangan Tertukar dengan Penugasan

= 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.

perbandingan_real.pasPascal
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).

perbandingan_real_toleransi.pasPascal
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, notAND, OR, NOTTRUETRUETRUETRUEFALSE
TRUEFALSEFALSETRUEFALSE
FALSETRUEFALSETRUETRUE
FALSEFALSEFALSEFALSETRUE

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
Manfaat Short-Circuit

Short-circuit memungkinkan penulisan kondisi yang lebih aman. Contoh:

short_circuit.pasPascal
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)
Catatan: AND dan OR Punya Dua Peran

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.

cek_ganjil_bitwise.pasPascal
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, shrKiri ke kanan
3+, -, or, xorKiri ke kanan
4=, <>, <, >, <=, >=, inKiri ke kanan

Berikut contoh yang sering mengejutkan pemula.

prioritas.pasPascal
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 }
Tips Praktis

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
ByteIntegerYaMelebar, tidak ada kehilangan
IntegerLongIntYaAman
IntegerRealYaAman, dapat direpresentasikan tepat hingga 2^53
RealIntegerTidakPerlu konversi eksplisit (round/trunc)
CharStringYaDapat digabung
StringIntegerTidakPerlu 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)RealIntegerRound(3.6)4
Trunc(x)RealIntegerTrunc(3.9)3
Int(x)RealRealInt(3.9)3.0
Frac(x)RealRealFrac(3.75)0.75
Ord(x)OrdinalIntegerOrd('A')65
Chr(x)IntegerCharChr(66)'B'
Str(x, s)NumerikStringStr(42, s)s = '42'
Val(s, x, kode)StringNumerikVal('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.

konversi_string.pasPascal
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.

pembagian_hati_hati.pasPascal
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.
Kesalahan Umum

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

  1. Menukar = dan :=. = adalah pembanding, := adalah penugasan.
  2. Pembagian integer tak sengaja. Memakai div padahal ingin /, atau sebaliknya.
  3. Membandingkan real dengan =. Gunakan toleransi epsilon.
  4. Mengabaikan prioritas operator. Selalu gunakan tanda kurung untuk memperjelas.
  5. Salah mengartikan mod. mod mengikuti perilaku pembagian bulat Pascal (pembulatan ke arah nol), bukan matematis (pembulatan ke bawah).
  6. Menggunakan and/or pada integer. Operator ini juga bitwise; pastikan operand bertipe boolean bila maksudnya logika.
  7. 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.
  8. 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
04

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

05

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
06

Contoh Kode Pascal Lengkap

Empat program untuk mendemonstrasikan operator dan konversi tipe

6.1 Program Demonstrasi Semua Operator Aritmatika

demo_aritmatika.pas Pascal
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

demo_logika.pas Pascal
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

demo_konversi.pas Pascal
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

cek_prima.pas Pascal
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
07

Penjelasan Kode Baris per Baris

Membedah program DemoAritmatika dan CekPrima secara rinci

7.1 Program DemoAritmatika

Baris Kode Penjelasan
5-6 a, b: integer;
hasilReal: real;
Dua variabel integer dan satu variabel real. Variabel hasilReal khusus menampung hasil operator / yang menghasilkan real.
9-10 a := 17;
b := 5;
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;
writeln('a / b = ', hasilReal:0:6, ...);
Operator / menghasilkan real, disimpan ke hasilReal. Format :0:6 menampilkan enam angka desimal: 3.400000.
22-23 writeln('a div b = ', a div b, ...);
writeln('a mod b = ', a mod 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));
writeln('Sqrt(a) = ', Sqrt(a):0:6);
Sqr(17) = 289 menghasilkan integer. Sqrt(17) menghasilkan real dengan enam angka desimal.
29-30 writeln('Round(a / b) = ', Round(a / b));
writeln('Trunc(a / b) = ', Trunc(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;
i: integer;
prima: boolean;
jumlahFaktor: 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
begin
prima := false;
jumlahFaktor := 0;
end
Kasus khusus: bilangan kurang dari 2 bukan prima. Blok begin...end diperlukan karena ada dua pernyataan.
18-23 else
begin
prima := true;
jumlahFaktor := 2;
i := 2;
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
begin
prima := false;
jumlahFaktor := jumlahFaktor + 1;
end;
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
writeln('Status: PRIMA')
else
writeln('Status: BUKAN PRIMA');
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
Awal2Ya1LanjutTRUE
12Ya1Tidak nol, lanjutTRUE
23Ya0Faktor ditemukanFALSE
Berhenti4Tidak (prima false)-Keluar loopFALSE

Karena 15 mod 3 = 0, maka 15 bukan bilangan prima. Perulangan berhenti lebih awal karena kondisi prima sudah bernilai false.

Pelajaran Kunci

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.

08

Latihan Soal

Lima soal dengan tingkat kesulitan bertingkat

1

Evaluasi Ekspresi

Mudah

Hitung nilai setiap ekspresi berikut tanpa menjalankan program. Kemudian verifikasi jawaban Anda dengan menulis program Pascal kecil untuk menampilkan hasilnya.

  1. 10 + 3 * 2 - 4
  2. (10 + 3) * (2 - 4)
  3. 20 div 3 + 20 mod 3
  4. -7 div 2 dan -7 mod 2
  5. 2 + 3 < 4 * 2
  6. not (3 > 5) or (4 = 4)
  7. 5 and 3 (bitwise)
  8. 5 or 3 (bitwise)

Pertanyaan tambahan: mengapa -7 div 2 menghasilkan -3 bukan -4? Jelaskan konsep yang mendasarinya.

2

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 div dan mod secara berurutan.

Pertanyaan analisis: mengapa kita tidak bisa menggunakan operator / untuk konversi ini?

3

Kalkulator Diskon Berjenjang

Sedang

Buat 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 currency untuk semua nilai uang.

Pertanyaan analisis: mengapa kondisi 100000 <= belanja < 500000 tidak valid dalam Pascal, dan bagaimana cara yang benar menuliskannya?

4

Geometri: Luas dan Keliling Lingkaran

Sedang

Buat 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.14159265358979 sebagai konstanta.
  • Gunakan fungsi Sqr untuk 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.

5

Deteksi Kesalahan Operator

Sulit

Program berikut memiliki delapan kesalahan terkait operator, prioritas, atau konversi tipe. Temukan semuanya, lalu tuliskan versi yang benar.

kacau_operator.pasPascal
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?

09

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

perhitungan_gaji.pas 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.

  1. Konstanta bertipe untuk tarif. Dengan mendefinisikan TARIF_LEMBUR dan TARIF_PAJAK sebagai konstanta, bila tarif berubah cukup ubah satu tempat.
  2. Operator / untuk upah per jam. Karena gaji pokok tidak selalu habis dibagi 173, operator / menghasilkan real. Dengan tipe currency, hasilnya tetap presisi hingga 4 angka desimal.
  3. Urutan operasi perkalian. jamLembur * upahPerJam * TARIF_LEMBUR dievaluasi kiri ke kanan: pertama jamLembur × upahPerJam, lalu hasilnya × TARIF_LEMBUR. Semua bertipe currency, sehingga tidak ada konversi tersembunyi.
  4. Penggunaan currency. Semua nilai moneter menggunakan currency, sehingga tidak ada kesalahan pembulatan akumulatif seperti pada real.
  5. Blok keluaran terstruktur. Slip gaji disusun dengan writeln tunggal per baris, memudahkan modifikasi format di kemudian hari.

9.8 Pengembangan Selanjutnya

Modul Pengembangan
Modul 6Menambahkan perhitungan pajak progresif berdasarkan golongan gaji
Modul 8Memproses gaji seluruh karyawan dengan perulangan
Modul 11Memindahkan perhitungan ke prosedur dan fungsi terpisah
Modul 20Mengelompokkan data karyawan dalam record
Modul 25Menyimpan slip gaji ke berkas
Modul 36Merancang kelas Karyawan dengan method hitung gaji
10

Rangkuman

Poin-poin kunci yang perlu diingat dari Modul 4

  1. Operator aritmatika meliputi +, -, *, /, div, dan mod. Perhatikan bahwa / menghasilkan real, sedangkan div menghasilkan integer.
  2. Operator mod menghasilkan sisa bagi dan mengikuti perilaku pembagian bulat Pascal (pembulatan ke arah nol).
  3. Fungsi matematika standar seperti Abs, Sqr, Sqrt, Round, dan Trunc sangat berguna dalam perhitungan.
  4. Operator relasional membandingkan dua nilai dan menghasilkan boolean. = adalah pembanding, := adalah penugasan.
  5. Jangan membandingkan real dengan = secara langsung. Gunakan toleransi epsilon.
  6. Operator logika and, or, not, dan xor bekerja pada boolean.
  7. Short-circuit evaluation aktif secara default pada Free Pascal modern. Bila operand kiri sudah menentukan hasil, operand kanan tidak dievaluasi.
  8. Operator bitwise bekerja pada tingkat bit. and dan or berlaku untuk integer (bitwise) maupun boolean (logika).
  9. Prioritas operator menentukan urutan evaluasi. Selalu gunakan tanda kurung untuk memperjelas maksud.
  10. Konversi tipe implisit terjadi dari tipe sempit ke tipe lebar. Konversi sebaliknya memerlukan fungsi eksplisit seperti Round atau Trunc.
  11. Fungsi Ord dan Chr mengkonversi antara char dan kode ordinalnya. Fungsi Str dan Val mengkonversi antara angka dan string.
  12. Waspadai pembagian bilangan bulat. 1 div 2 menghasilkan 0, bukan 0.5. Kesalahan ini sering menimbulkan bug yang sulit dilacak.
Sebelum Melanjutkan

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.

11

Referensi

Sumber rujukan yang digunakan dalam penyusunan modul ini

Buku Teks

  1. Jensen, K., & Wirth, N. (1991). Pascal User Manual and Report (4th ed.). Springer-Verlag. Bab 6 membahas ekspresi dan operator secara formal.
  2. Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab 4 membahas operator dan ekspresi pada Free Pascal dan Delphi.
  3. Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang ekspresi dan konversi tipe dengan pendekatan pedagogis yang sangat baik.
  4. Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 4 membahas operator dan ekspresi.
  5. 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

  1. Free Pascal Team. Free Pascal Reference Guide. Bab tentang operator, ekspresi, dan fungsi standar. Tersedia di freepascal.org/docs.html.
  2. Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang direktif kompilator {$B+} dan {$B-}.
  3. Lazarus IDE Documentation. Panduan penggunaan fungsi matematika dan konversi tipe.

Artikel dan Sumber Daring

  1. IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang ekspresi dan operator.
  2. Knuth, D. E. (1997). The Art of Computer Programming, Volume 1 (3rd ed.). Addison-Wesley. Bab 1 membahas aritmatika bilangan bulat dan sifat div serta mod.
  3. Free Pascal Community Forum. Diskusi tentang perilaku short-circuit pada berbagai mode kompilasi.