Tujuan Pembelajaran
Kompetensi yang ingin dicapai setelah menyelesaikan modul ini
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
- Membedakan konsep variabel dan konstanta serta menentukan kapan menggunakan masing-masing.
- Menerapkan aturan penamaan identifier yang sah dalam Pascal.
- Mengidentifikasi reserved words dan menghindari penggunaannya sebagai nama identifier.
- Menjelaskan perbedaan dan kegunaan setiap tipe data integer dalam Pascal.
- Memilih tipe data real yang tepat berdasarkan presisi dan efisiensi memori.
- Membedakan tipe
chardanstringserta batasan panjangnya. - Menggunakan tipe data boolean dalam logika program.
- Mendeklarasikan konstanta tak bertipe dan konstanta bertipe sesuai kebutuhan.
- Menjelaskan nilai default variabel global di Pascal dan mengapa inisialisasi eksplisit tetap dianjurkan.
- Menghindari kesalahan umum terkait pemilihan tipe data dan overflow.
Capaian Pembelajaran
Indikator ketercapaian dan kaitan dengan modul selanjutnya
Capaian Pembelajaran Mata Kuliah
Mahasiswa mampu memodelkan data dari permasalahan nyata ke dalam variabel dan konstanta bertipe tepat, sehingga program yang dihasilkan akurat, efisien, dan mudah dipelihara.
Indikator Ketercapaian Modul
| Kode | Indikator | Bukti |
|---|---|---|
| IK-3.1 | Menulis identifier yang sah dan deskriptif | Latihan 1, 2, dan 5 |
| IK-3.2 | Memilih tipe integer yang sesuai rentang data | Latihan 3 dan 4 |
| IK-3.3 | Menggunakan konstanta bertipe dan tak bertipe secara tepat | Latihan 4 dan studi kasus |
| IK-3.4 | Membedakan perlakuan char dan string dalam program | Latihan 2 dan 5 |
| IK-3.5 | Mengidentifikasi risiko overflow dan underflow | Latihan 5 |
Tipe data yang dikuasai di modul ini akan menjadi dasar untuk pembahasan operator dan ekspresi pada Modul 4, pemformatan input/output pada Modul 5, serta pengembangan tipe bentukan (record, enumerasi, subrange) pada Modul 20 hingga 22.
Materi Teori
Variabel, konstanta, identifier, dan seluruh tipe data dasar Pascal
3.1 Variabel dan Konstanta: Perbedaan Mendasar
Dalam program, kita perlu menyimpan data sementara agar dapat diolah kembali. Ada dua wadah penyimpanan utama dalam Pascal: variabel dan konstanta.
| Aspek | Variabel | Konstanta |
|---|---|---|
| Nilai | Dapat berubah selama program berjalan | Tetap, tidak dapat diubah setelah didefinisikan |
| Deklarasi | Blok var |
Blok const |
| Nilai awal | Default nol, kosong, atau tidak terdefinisi | Wajib diberi nilai saat dideklarasikan |
| Penggunaan khas | Menyimpan masukan, hasil perhitungan, akumulator | Tarif pajak, nama lembaga, konstanta matematis |
| Keuntungan | Fleksibel mengikuti alur program | Mencegah perubahan tak sengaja dan memudahkan pemeliharaan |
Perhatikan contoh berikut.
const
PPN = 0.11; { konstanta: nilai tetap }
NAMA_TOKO = 'Cendekia';
var
hargaBarang: real; { variabel: nilai bisa berubah }
jumlahBeli: integer; { variabel: nilai bisa berubah }
totalBayar: real; { variabel: nilai bisa berubah }
Bila Anda mencoba menuliskan PPN := 0.12;
di dalam program, kompiler akan menolak karena
PPN dideklarasikan sebagai konstanta.
Inilah perlindungan yang diberikan konstanta: mencegah perubahan
yang tidak disengaja.
3.2 Identifier: Nama untuk Variabel dan Konstanta
Identifier adalah nama yang Anda berikan kepada variabel, konstanta, tipe, prosedur, atau fungsi. Pascal memiliki aturan ketat untuk identifier yang sah.
Aturan Identifier yang Sah
- Dimulai dengan huruf (A-Z, a-z) atau garis bawah (
_). - Karakter berikutnya boleh huruf, angka, atau garis bawah.
- Tidak boleh mengandung spasi atau tanda baca khusus seperti
@ # $ % - + =. - Tidak boleh sama dengan reserved word (kata kunci bahasa).
- Bersifat case-insensitive:
nilai,Nilai, danNILAIdianggap sama. - Panjang identifier bebas, namun disarankan maksimal 63 karakter untuk keterbacaan.
| Identifier | Sah? | Alasan |
|---|---|---|
totalBayar | Ya | Dimulai huruf, hanya huruf dan angka |
_harga | Ya | Garis bawah di awal diizinkan |
nilai2 | Ya | Angka di posisi bukan awal |
2nilai | Tidak | Dimulai dengan angka |
total-bayar | Tidak | Mengandung tanda hubung |
total bayar | Tidak | Mengandung spasi |
begin | Tidak | Reserved word |
integer | Tidak | Nama tipe standar, dianggap reserved |
TotalBayar | Ya | Beda huruf besar-kecil tidak berpengaruh, tetapi boleh dipakai |
Kami menggunakan camelCase untuk variabel
(totalBayar) dan
HURUF_BESAR_SEMUA untuk konstanta
(PPN, NAMA_TOKO).
Konvensi ini tidak wajib, tetapi konsistensi sangat membantu
membaca kode.
3.3 Reserved Words dan Standard Identifiers
Pascal memiliki daftar kata yang sudah "dipesan" oleh bahasa dan tidak boleh dipakai sebagai identifier. Kata-kata ini terbagi menjadi dua kelompok besar.
a. Reserved Words (Tidak Bisa Ditimpa)
Kata-kata ini adalah bagian dari sintaks inti Pascal dan sama sekali tidak boleh dipakai sebagai nama variabel, konstanta, tipe, atau subprogram.
| Daftar Reserved Words Pascal | ||||
|---|---|---|---|---|
| and | array | begin | case | const |
| div | do | downto | else | end |
| file | for | function | goto | if |
| in | label | mod | nil | not |
| of | or | packed | procedure | program |
| record | repeat | set | then | to |
| type | until | var | while | with |
b. Standard Identifiers (Dapat Ditimpa, tetapi Tidak Disarankan)
Kata-kata berikut sudah didefinisikan sebagai bagian dari pustaka standar Pascal. Secara teknis Anda boleh memakai nama yang sama untuk variabel Anda sendiri, tetapi ini akan menutupi definisi aslinya dan sangat tidak disarankan.
| Daftar Standard Identifiers (Contoh Umum) | ||||
|---|---|---|---|---|
| integer | real | char | string | boolean |
| true | false | abs | sqr | sqrt |
| sin | cos | ln | exp | round |
| trunc | ord | chr | succ | pred |
| read | readln | write | writeln | length |
| copy | pos | insert | delete | upcase |
Bila Anda mendeklarasikan var integer: integer;
maka kata integer di dalam blok
berikutnya akan merujuk pada variabel Anda, bukan tipe data.
Akibatnya, deklarasi variabel selanjutnya yang bertipe integer
akan menghasilkan kesalahan kompilasi.
3.4 Tipe Data Integer
Tipe integer menyimpan bilangan bulat (tanpa titik desimal), baik positif, negatif, maupun nol. Pascal menyediakan beberapa tipe integer dengan rentang dan ukuran memori berbeda.
| Tipe | Ukuran | Rentang Nilai | Penggunaan Khas |
|---|---|---|---|
ShortInt | 1 byte | -128 s.d. 127 | Data sangat kecil, penghematan memori |
Byte | 1 byte | 0 s.d. 255 | Nilai non-negatif kecil, warna RGB |
SmallInt | 2 byte | -32.768 s.d. 32.767 | Nilai sedang |
Word | 2 byte | 0 s.d. 65.535 | Nilai non-negatif sedang |
Integer | 2 atau 4 byte | Bergantung platform | Pilihan default untuk bilangan bulat umum |
LongInt | 4 byte | -2.147.483.648 s.d. 2.147.483.647 | Nilai besar |
Cardinal | 4 byte | 0 s.d. 4.294.967.295 | Nilai besar non-negatif |
Int64 | 8 byte | -9,2 x 1018 s.d. 9,2 x 1018 | Nilai sangat besar |
QWord | 8 byte | 0 s.d. 1,8 x 1019 | Nilai sangat besar non-negatif |
Pada Free Pascal untuk platform 32-bit dan 64-bit, tipe
integer berukuran 4 byte dengan rentang
sama seperti longint. Pada Turbo Pascal
(16-bit), integer berukuran 2 byte.
Perbedaan ini penting ketika Anda memindahkan kode lama.
3.5 Tipe Data Real
Tipe real menyimpan bilangan pecahan atau bilangan dengan titik desimal. Pascal menyediakan beberapa tipe real dengan tingkat presisi dan ukuran memori berbeda.
| Tipe | Ukuran | Presisi | Rentang (Perkiraan) | Penggunaan Khas |
|---|---|---|---|---|
Single | 4 byte | 7-8 digit | ±1,5 x 10-45 s.d. ±3,4 x 1038 | Grafik, pengukuran cepat |
Real | 4 atau 8 byte | Bergantung platform | Bergantung platform | Default umum, namun kurang spesifik |
Double | 8 byte | 15-16 digit | ±5,0 x 10-324 s.d. ±1,7 x 10308 | Perhitungan ilmiah umum |
Extended | 10 byte | 19-20 digit | ±3,4 x 10-4932 s.d. ±1,1 x 104932 | Presisi sangat tinggi |
Comp | 8 byte | 19-20 digit | ±9,2 x 1018 | Perhitungan uang dalam jumlah besar |
Currency | 8 byte | 4 digit desimal | ±922.337.203.685.477,5807 | Transaksi keuangan, akuntansi |
Tipe real menyimpan nilai secara pendekatan (floating point),
sehingga operasi seperti 0.1 + 0.2
bisa menghasilkan 0.30000000000000004
alih-alih 0.3. Untuk keuangan,
gunakan currency yang menyimpan
nilai sebagai bilangan bulat dengan skala tetap.
3.6 Tipe Data Char
Tipe char menyimpan tepat satu karakter.
Ukurannya 1 byte, dan setiap karakter berkorespondensi dengan kode
ASCII (0-255).
var
huruf: char;
digit: char;
simbol: char;
begin
huruf := 'A';
digit := '7';
simbol := '#';
writeln('Huruf : ', huruf);
writeln('Digit : ', digit);
writeln('Simbol : ', simbol);
end.
Perhatikan bahwa literal char ditulis dengan tanda petik tunggal,
sama seperti string. Perbedaan terletak pada jumlah karakter:
'A' adalah char, sedangkan
'Andi' adalah string.
Fungsi ord mengubah char menjadi kode
ASCII-nya, dan chr melakukan sebaliknya.
var
kode: integer;
karakter: char;
begin
kode := ord('A');
writeln('Kode ASCII dari A adalah ', kode); { 65 }
karakter := chr(66);
writeln('Karakter dengan kode 66 adalah ', karakter); { B }
end.
3.7 Tipe Data String
String adalah kumpulan karakter. Pascal memiliki beberapa jenis string yang berbeda dalam kapasitas dan cara penyimpanan.
| Tipe | Panjang Maks | Ukuran | Keterangan |
|---|---|---|---|
ShortString |
255 karakter | 256 byte tetap | Gaya asli Turbo Pascal. Panjang disimpan di byte pertama. |
AnsiString |
~2 GB | Dinamis | Default Free Pascal modern. Berisi karakter 8-bit. |
UnicodeString |
~2 GB | Dinamis | Mendukung karakter Unicode (UTF-16). |
WideString |
~2 GB | Dinamis | Setara UnicodeString pada Windows. |
PChar |
Tak terbatas | Pointer | Pointer ke array char diakhiri null. Untuk interoperabilitas C. |
Notasi string[n] mendefinisikan string
dengan panjang maksimal tertentu, misalnya
string[30] untuk 30 karakter. Notasi
ini kompatibel dengan semua mode Pascal dan berguna untuk
menghemat memori.
Fungsi dan Prosedur String Umum
| Nama | Jenis | Fungsi |
|---|---|---|
Length(S) | Fungsi | Mengembalikan panjang string S |
Copy(S, i, n) | Fungsi | Menyalin n karakter mulai dari posisi i |
Pos(Sub, S) | Fungsi | Posisi pertama Sub dalam S (0 bila tidak ditemukan) |
Concat(S1, S2, ...) | Fungsi | Menggabungkan string |
UpCase(C) | Fungsi | Mengubah satu karakter menjadi huruf besar |
Delete(S, i, n) | Prosedur | Menghapus n karakter mulai posisi i |
Insert(Sub, S, i) | Prosedur | Menyisipkan Sub ke dalam S di posisi i |
Str(N, S) | Prosedur | Mengubah angka menjadi string |
Val(S, N, kode) | Prosedur | Mengubah string menjadi angka |
Pengolahan string secara lengkap akan dibahas pada Modul 23.
3.8 Tipe Data Boolean
Tipe boolean hanya memiliki dua nilai:
true (benar) atau
false (salah). Ukurannya 1 byte.
Tipe ini digunakan dalam pengambilan keputusan dan penyimpanan
status.
var
sudahLogin: boolean;
lulus: boolean;
nilai: integer;
begin
sudahLogin := true;
nilai := 78;
lulus := nilai >= 70;
writeln('Sudah login? ', sudahLogin);
writeln('Nilai: ', nilai);
writeln('Lulus? ', lulus);
end.
Keluaran:
Sudah login? TRUE Nilai: 78 Lulus? TRUE
Perhatikan bahwa program menampilkan TRUE
dan FALSE dalam huruf besar.
3.9 Konstanta: Tak Bertipe dan Bertipe
Pascal membedakan dua jenis konstanta.
a. Konstanta Tak Bertipe (Untyped Constant)
Bentuk yang paling umum: nama, tanda sama dengan, dan nilai. Tipe data ditentukan otomatis oleh kompiler.
const
PPN = 0.11;
NAMA_TOKO = 'Cendekia';
MAKS_NILAI = 100;
STATUS_AKTIF = true;
Konstanta ini memiliki tipe yang ditentukan dari bentuk nilainya:
PPN bertipe real,
NAMA_TOKO bertipe string,
MAKS_NILAI bertipe integer, dan
STATUS_AKTIF bertipe boolean.
b. Konstanta Bertipe (Typed Constant)
Konstanta yang dideklarasikan dengan tipe eksplisit. Meskipun disebut "konstanta", secara teknis konstanta bertipe dapat diubah isinya — namun ini sangat tidak disarankan.
const
BATAS: integer = 100;
NAMA: string[20] = 'Budi';
SUHU: real = 36.5;
Konstanta bertipe berguna ketika Anda ingin menentukan tipe secara eksplisit, misalnya untuk mengontrol ukuran string atau memastikan tipe integer tertentu.
3.10 Inisialisasi dan Nilai Default
Variabel global di Pascal secara default diinisialisasi ke nol
(untuk tipe numerik), karakter kosong (untuk char), string kosong
(untuk string), atau false (untuk
boolean). Namun, jangan bergantung pada perilaku ini. Selalu
inisialisasi variabel Anda secara eksplisit.
| Tipe | Nilai Default Global | Nilai Default Lokal |
|---|---|---|
| Integer, LongInt, dsb. | 0 | Tidak terdefinisi |
| Real, Double, Extended | 0.0 | Tidak terdefinisi |
| Char | #0 (null character) | Tidak terdefinisi |
| String | '' (kosong) | Tidak terdefinisi |
| Boolean | false | Tidak terdefinisi |
Variabel lokal di dalam prosedur atau fungsi tidak dijamin
bernilai nol. Bila Anda membacanya tanpa inisialisasi, Anda
akan mendapatkan nilai acak dari sisa memori. Inisialisasi
eksplisit seperti total := 0;
adalah kebiasaan yang wajib dibangun sejak awal.
3.11 Panduan Memilih Tipe Data
Pertanyaan-pertanyaan berikut membantu memilih tipe data yang tepat.
- Apakah nilainya bilangan bulat? Bila ya, gunakan tipe integer yang sesuai rentangnya.
- Apakah nilainya memerlukan pecahan? Bila ya, tentukan tingkat presisi yang dibutuhkan.
- Apakah nilainya uang? Bila ya, gunakan
currency, bukan real biasa. - Apakah nilainya satu karakter? Gunakan
char, bukan string satu karakter. - Apakah nilainya logis ya/tidak? Gunakan
boolean. - Berapa rentang maksimumnya? Pilih tipe terkecil yang masih mencakup rentang tersebut untuk menghemat memori.
3.12 Kesalahan Umum Terkait Tipe Data
- Integer overflow. Menyimpan nilai yang melebihi rentang tipe. Contoh:
bytehanya sampai 255; menyimpan 300 akan menghasilkan nilai yang tidak diharapkan. - Pembagian integer. Operator
/selalu menghasilkan real, sedangkandivmenghasilkan integer. Tertukar keduanya adalah kesalahan umum. - Membandingkan real dengan sama dengan. Karena real adalah pendekatan,
0.1 + 0.2 = 0.3bisa bernilai false. Selalu bandingkan dengan toleransi. - Menggunakan real untuk uang. Menyebabkan kesalahan pembulatan akumulatif. Gunakan
currency. - Menimpa nama tipe standar. Mendeklarasikan variabel bernama
integerataustringakan menutupi tipe aslinya. - Lupa panjang string. Pada mode Turbo Pascal, string default hanya 255 karakter. Melebihi batas ini akan memotong data secara diam-diam.
- Mengabaikan perbedaan char dan string satu karakter.
'A'(char) dan'A'(string) secara literal sama, tetapi tipe datanya berbeda. - Menggunakan boolean sebagai integer. Meskipun secara internal boolean disimpan sebagai 0/1, konversi eksplisit lebih disarankan.
Perhatikan program berikut. Nilai yang dicetak tidak seperti yang diharapkan karena overflow.
var
kecil: byte;
begin
kecil := 250;
writeln('Sebelum: ', kecil);
kecil := kecil + 10; { 260 melebihi batas byte }
writeln('Sesudah: ', kecil); { Hasil: 4, bukan 260 }
end.
Dengan direktif {$Q+}, overflow
akan menghasilkan kesalahan runtime, bukan nilai yang salah.
Algoritma dan Flowchart
Pemilihan tipe data, alur deklarasi, dan konversi antar tipe
4.1 Flowchart Pemilihan Tipe Data Numerik
Diagram berikut memandu pemilihan tipe data numerik yang tepat berdasarkan sifat data yang akan disimpan.
flowchart TD
A(["Data numerik?"]) --> B{"Butuh pecahan?"}
B -- "Tidak" --> C{"Selalu non-negatif?"}
B -- "Ya" --> D{"Data uang?"}
C -- "Ya" --> E{"Nilai <= 255?"}
C -- "Tidak" --> F{"Nilai <= 32767?"}
E -- "Ya" --> G["Gunakan Byte"]
E -- "Tidak" --> H["Gunakan Word"]
F -- "Ya" --> I["Gunakan SmallInt"]
F -- "Tidak" --> J["Gunakan Integer atau LongInt"]
D -- "Ya" --> K["Gunakan Currency"]
D -- "Tidak" --> L{"Presisi tinggi?"}
L -- "Ya" --> M["Gunakan Extended"]
L -- "Tidak" --> N["Gunakan Double"]
Gambar 4.1 - Pohon keputusan pemilihan tipe data numerik
4.2 Flowchart Alur Deklarasi dan Inisialisasi
Diagram ini menggambarkan alur internal ketika program mendeklarasikan variabel, menginisialisasinya, dan menggunakannya.
flowchart TD
A(["Mulai Program"]) --> B["Kompiler membaca blok var"]
B --> C["Alokasi memori untuk setiap variabel"]
C --> D["Inisialisasi default (nol atau kosong)"]
D --> E["Masuk ke blok begin"]
E --> F{"Variabel akan diisi
dari input?"}
F -- "Ya" --> G["readln(variabel)"]
F -- "Tidak" --> H["variabel := nilai awal"]
G --> I["Proses perhitungan"]
H --> I
I --> J["writeln(variabel)"]
J --> K(["Selesai"])
Gambar 4.2 - Alur deklarasi, inisialisasi, dan penggunaan variabel
4.3 Flowchart Konversi Suhu dengan Pemilihan Tipe
Contoh konkret penggunaan tipe data: konversi suhu dari Celsius ke Fahrenheit, Reamur, dan Kelvin. Semua hasil menggunakan tipe real.
flowchart TD
A(["Mulai"]) --> B[/"Baca celsius (real)"/]
B --> C["fahrenheit = (celsius * 9 / 5) + 32"]
C --> D["reamur = celsius * 4 / 5"]
D --> E["kelvin = celsius + 273.15"]
E --> F[/"Tampilkan fahrenheit, reamur, kelvin"/]
F --> G(["Selesai"])
Gambar 4.3 - Flowchart konversi suhu dengan tipe real
Pseudocode
Representasi algoritmik dari deklarasi dan penggunaan tipe data
5.1 Pseudocode Konversi Suhu
PROGRAM KonversiSuhu
{ Mengkonversi suhu dari Celsius ke tiga satuan lain }
DEKLARASI
celsius : real
fahrenheit : real
reamur : real
kelvin : real
ALGORITMA
write("Masukkan suhu dalam Celsius: ")
read(celsius)
fahrenheit <- (celsius * 9 / 5) + 32
reamur <- celsius * 4 / 5
kelvin <- celsius + 273.15
write("Suhu dalam Fahrenheit: ", fahrenheit)
write("Suhu dalam Reamur : ", reamur)
write("Suhu dalam Kelvin : ", kelvin)
END
5.2 Pseudocode Data Mahasiswa dengan Tipe Beragam
PROGRAM DataMahasiswa
{ Mendemonstrasikan penggunaan berbagai tipe data dasar }
KONSTANTA
MAKS_NILAI = 100
NAMA_KAMPUS = "Universitas Nusantara"
DEKLARASI
nama : string
nim : string
angkatan : integer
nilaiUjian : real
nilaiHuruf : char
terdaftar : boolean
ALGORITMA
write("Nama mahasiswa : ")
read(nama)
write("NIM : ")
read(nim)
write("Angkatan : ")
read(angkatan)
write("Nilai ujian : ")
read(nilaiUjian)
nilaiHuruf <- tentukanHurufMutu(nilaiUjian)
terdaftar <- true
write("====================================")
write(NAMA_KAMPUS)
write("====================================")
write("Nama : ", nama)
write("NIM : ", nim)
write("Angkatan : ", angkatan)
write("Nilai : ", nilaiUjian)
write("Huruf : ", nilaiHuruf)
write("Status : ", terdaftar)
END
5.3 Pseudocode Validasi Rentang Nilai
PROGRAM ValidasiNilaiUjian
{ Memastikan nilai masukan berada dalam rentang yang sah }
KONSTANTA
NILAI_MIN = 0
NILAI_MAKS = 100
DEKLARASI
nilai : integer
ALGORITMA
write("Masukkan nilai ujian (0-100): ")
read(nilai)
jika nilai < NILAI_MIN atau nilai > NILAI_MAKS maka
write("Kesalahan: nilai di luar rentang yang sah.")
selain itu
write("Nilai valid: ", nilai)
akhir jika
END
Contoh Kode Pascal Lengkap
Empat program untuk mendemonstrasikan tipe data dan konstanta
6.1 Program Demonstrasi Semua Tipe Data Dasar
Program ini mendeklarasikan dan menampilkan nilai dari seluruh tipe data dasar yang dibahas pada modul ini.
program DemoTipeData;
{ Mendemonstrasikan tipe data dasar Pascal }
var
kecilNegatif : shortint;
kecilPositif : byte;
sedangInt : smallint;
besarInt : longint;
nilaiReal : double;
nilaiUang : currency;
satuHuruf : char;
namaLengkap : string;
sudahLulus : boolean;
begin
kecilNegatif := -100;
kecilPositif := 200;
sedangInt := -30000;
besarInt := 2000000000;
nilaiReal := 3.14159265358979;
nilaiUang := 125000.75;
satuHuruf := 'A';
namaLengkap := 'Budi Santoso';
sudahLulus := true;
writeln('=== Demonstrasi Tipe Data Dasar Pascal ===');
writeln;
writeln('ShortInt : ', kecilNegatif);
writeln('Byte : ', kecilPositif);
writeln('SmallInt : ', sedangInt);
writeln('LongInt : ', besarInt);
writeln('Double : ', nilaiReal:0:14);
writeln('Currency : ', nilaiUang:0:2);
writeln('Char : ', satuHuruf);
writeln('String : ', namaLengkap);
writeln('Boolean : ', sudahLulus);
end.
Keluaran yang diharapkan:
=== Demonstrasi Tipe Data Dasar Pascal === ShortInt : -100 Byte : 200 SmallInt : -30000 LongInt : 2000000000 Double : 3.14159265358979 Currency : 125000.75 Char : A String : Budi Santoso Boolean : TRUE
6.2 Program Konversi Suhu dengan Tipe Real
Program ini menerapkan tipe double
untuk presisi yang memadai dalam perhitungan konversi suhu.
program KonversiSuhu;
{ Mengkonversi suhu dari Celsius ke Fahrenheit, Reamur, dan Kelvin }
const
TITIK_BEKU_KELVIN = 273.15;
var
celsius : double;
fahrenheit : double;
reamur : double;
kelvin : double;
begin
write('Masukkan suhu dalam Celsius: ');
readln(celsius);
fahrenheit := (celsius * 9 / 5) + 32;
reamur := celsius * 4 / 5;
kelvin := celsius + TITIK_BEKU_KELVIN;
writeln;
writeln('=== Hasil Konversi ===');
writeln('Celsius : ', celsius:0:2, ' derajat');
writeln('Fahrenheit : ', fahrenheit:0:2, ' derajat');
writeln('Reamur : ', reamur:0:2, ' derajat');
writeln('Kelvin : ', kelvin:0:2, ' Kelvin');
end.
Contoh keluaran:
Masukkan suhu dalam Celsius: 25 === Hasil Konversi === Celsius : 25.00 derajat Fahrenheit : 77.00 derajat Reamur : 20.00 derajat Kelvin : 298.15 Kelvin
6.3 Program dengan Konstanta Bertipe
Program ini mendemonstrasikan penggunaan konstanta bertipe untuk mendefinisikan pengaturan aplikasi kecil.
program KonstantaBertipe;
{ Mendemonstrasikan konstanta bertipe }
const
NAMA_APLIKASI : string[30] = 'Sistem Penilaian v1.0';
BATAS_LULUS : integer = 70;
PPN_PERSEN : real = 0.11;
MAKS_SKS : byte = 24;
STATUS_DEFAULT : boolean = false;
var
namaMahasiswa : string;
nilai : integer;
sks : byte;
sudahTerdaftar: boolean;
begin
writeln(NAMA_APLIKASI);
writeln('----------------------------------------');
write('Nama mahasiswa : ');
readln(namaMahasiswa);
write('Nilai ujian : ');
readln(nilai);
write('SKS diambil : ');
readln(sks);
sudahTerdaftar := true;
writeln;
writeln('Ringkasan:');
writeln('Nama : ', namaMahasiswa);
writeln('Nilai : ', nilai);
writeln('Batas lulus : ', BATAS_LULUS);
writeln('SKS : ', sks, ' dari maks ', MAKS_SKS);
writeln('Terdaftar : ', sudahTerdaftar);
if nilai >= BATAS_LULUS then
writeln('Status : LULUS')
else
writeln('Status : BELUM LULUS');
end.
6.4 Program Perbandingan Tipe Char dan String
Program ini menunjukkan perbedaan praktis antara
char dan string
dalam penggunaan sehari-hari.
program CharVsString;
{ Membandingkan perilaku tipe char dan string }
var
satuKarakter : char;
satuHurufStr : string;
namaLengkap : string;
inisial : char;
begin
satuKarakter := 'A';
satuHurufStr := 'A';
namaLengkap := 'Andi Wijaya';
inisial := namaLengkap[1];
writeln('=== Perbandingan Char dan String ===');
writeln;
writeln('satuKarakter (char) : ', satuKarakter);
writeln('satuHurufStr (string) : ', satuHurufStr);
writeln('namaLengkap (string) : ', namaLengkap);
writeln('inisial (char) : ', inisial);
writeln;
writeln('Panjang namaLengkap : ', length(namaLengkap));
writeln('Kode ASCII satuKarakter: ', ord(satuKarakter));
writeln('Kode ASCII inisial : ', ord(inisial));
end.
Keluaran:
=== Perbandingan Char dan String === satuKarakter (char) : A satuHurufStr (string) : A namaLengkap (string) : Andi Wijaya inisial (char) : A Panjang namaLengkap : 11 Kode ASCII satuKarakter: 65 Kode ASCII inisial : 65
Penjelasan Kode Baris per Baris
Membedah program DemoTipeData dan KonstantaBertipe secara rinci
7.1 Program DemoTipeData
| Baris | Kode | Penjelasan |
|---|---|---|
| 1-2 | program DemoTipeData; |
Judul program diikuti komentar yang menjelaskan tujuan. |
| 5 | kecilNegatif : shortint; |
Variabel bertipe shortint (1 byte)
dengan rentang -128 hingga 127. Cocok untuk nilai kecil
negatif.
|
| 6 | kecilPositif : byte; |
Variabel bertipe byte (1 byte)
dengan rentang 0 hingga 255. Tidak dapat menyimpan nilai
negatif.
|
| 7 | sedangInt : smallint; |
Variabel bertipe smallint (2 byte),
rentang sekitar -32 ribu hingga +32 ribu.
|
| 8 | besarInt : longint; |
Variabel bertipe longint (4 byte),
rentang hingga lebih dari 2 miliar.
|
| 9 | nilaiReal : double; |
Variabel bertipe double (8 byte)
untuk bilangan pecahan dengan presisi tinggi.
|
| 10 | nilaiUang : currency; |
Variabel bertipe currency untuk
nilai uang. Menyimpan 4 angka desimal secara eksak.
|
| 11 | satuHuruf : char; |
Variabel bertipe char untuk
menyimpan satu karakter.
|
| 12 | namaLengkap : string; |
Variabel bertipe string dinamis
(AnsiString di Free Pascal). Panjang menyesuaikan isi.
|
| 13 | sudahLulus : boolean; |
Variabel bertipe boolean,
bernilai true atau
false.
|
| 16-24 | kecilNegatif := -100; |
Pemberian nilai awal ke setiap variabel. Perhatikan bahwa
literal real memakai titik (.),
bukan koma seperti di Indonesia. Literal char diapit petik
tunggal.
|
| 26-35 | writeln('ShortInt : ', kecilNegatif); |
Menampilkan setiap nilai. Perhatikan pemformatan
:0:14 untuk
double agar 14 angka desimal
tercetak, dan :0:2 untuk
currency agar 2 angka desimal
tercetak.
|
7.2 Program KonstantaBertipe
| Baris | Kode | Penjelasan |
|---|---|---|
| 5 | NAMA_APLIKASI : string[30] = 'Sistem Penilaian v1.0'; |
Konstanta bertipe string dengan panjang maksimum 30 karakter.
Notasi string[30] membatasi
panjang dan memakai memori tetap. Bila nilai yang diberikan
lebih panjang, akan dipotong.
|
| 6 | BATAS_LULUS : integer = 70; |
Konstanta bertipe integer. Berbeda dengan konstanta tak
bertipe, tipe data ditulis eksplisit sebelum tanda
=.
|
| 7 | PPN_PERSEN : real = 0.11; |
Konstanta bertipe real. Karena sudah didefinisikan sebagai
konstanta, nilai PPN_PERSEN
tidak dapat diubah di dalam program.
|
| 8 | MAKS_SKS : byte = 24; |
Konstanta bertipe byte. Nilai 24 berada dalam rentang byte (0-255), sehingga tipe ini lebih hemat memori dibandingkan integer. |
| 9 | STATUS_DEFAULT : boolean = false; |
Konstanta bertipe boolean. Meskipun tidak dipakai di program ini, contoh ini menunjukkan bahwa boolean juga dapat dijadikan konstanta bertipe. |
| 25-26 | if nilai >= BATAS_LULUS then |
Perbandingan nilai dengan konstanta. Karena
BATAS_LULUS adalah konstanta,
bila suatu saat batas lulus berubah, cukup satu baris
yang perlu diubah, bukan setiap tempat yang membandingkan.
|
7.3 Jejak Eksekusi KonstantaBertipe
Tabel berikut menunjukkan jejak eksekusi dengan masukan nama = Rina, nilai = 78, sks = 20.
| Baris | Pernyataan | Efek |
|---|---|---|
| 13-14 | writeln header | Header tampil |
| 16-17 | readln namaMahasiswa | namaMahasiswa = "Rina" |
| 19-20 | readln nilai | nilai = 78 |
| 22-23 | readln sks | sks = 20 |
| 25 | sudahTerdaftar := true | sudahTerdaftar = TRUE |
| 29-33 | writeln ringkasan | Ringkasan tampil |
| 35-38 | if nilai >= 70 | Karena 78 >= 70, cetak "LULUS" |
Perhatikan bahwa setiap tipe data memiliki rentang dan kegunaan
spesifik. Memilih tipe yang tepat sejak awal bukan hanya soal
efisiensi memori, tetapi juga soal kejelasan maksud program.
Ketika Anda menuliskan byte, Anda
sudah menyatakan bahwa nilai ini tidak akan pernah negatif.
Latihan Soal
Lima soal dengan tingkat kesulitan bertingkat
Validasi Identifier
MudahPeriksa setiap identifier berikut. Tentukan mana yang sah dan mana yang tidak, serta jelaskan alasannya.
totalHarga2total_namaPenggunaharga-barangnilai UjianNILAI_AKHIRconstintegerdataKu$hitungTotalBayar2025
Pertanyaan tambahan: mengapa Pascal memperbolehkan
identifier seperti NILAI_AKHIR dan
nilai_akhir sekaligus, dan apa
implikasinya terhadap gaya penulisan kode?
Kartu Data Diri
Mudah
Buat program kartu_data_diri.pas yang
membaca data berikut dari pengguna dan menampilkannya kembali:
- Nama lengkap (string)
- Inisial nama (char)
- Usia (byte)
- Tinggi badan dalam cm (real)
- Berat badan dalam kg (real)
- Sudah menikah atau belum (boolean)
Ketentuan:
- Gunakan tipe data yang tepat untuk setiap field.
- Definisikan konstanta untuk garis pemisah.
- Untuk tinggi dan berat, tampilkan dua angka desimal.
- Untuk usia, gunakan
bytekarena tidak mungkin negatif dan tidak lebih dari 255.
Konversi Mata Uang
SedangBuat program yang mengkonversi nilai rupiah ke tiga mata uang asing. Kurs disimpan sebagai konstanta.
Kurs yang digunakan:
- 1 USD = 15.750 IDR
- 1 EUR = 17.200 IDR
- 1 SGD = 11.800 IDR
Ketentuan:
- Simpan setiap kurs sebagai konstanta bertipe real.
- Simpan nilai rupiah dalam variabel bertipe
int64agar dapat menampung nilai besar. - Tampilkan setiap hasil konversi dengan dua angka desimal.
Pertanyaan analisis: mengapa kita tidak
menggunakan tipe real untuk menyimpan
nilai rupiah dalam program ini, padahal nilainya bisa sangat besar?
Sistem Nilai Akademik
SedangBuat program yang menerima nama mahasiswa, nilai ujian, dan nilai tugas, lalu menghitung nilai akhir dengan bobot 60 persen ujian dan 40 persen tugas. Tentukan juga huruf mutu berdasarkan nilai akhir.
Aturan huruf mutu:
- A: nilai akhir >= 85
- B: 70 <= nilai akhir < 85
- C: 60 <= nilai akhir < 70
- D: 50 <= nilai akhir < 60
- E: nilai akhir < 50
Ketentuan:
- Simpan bobot sebagai konstanta bertipe real.
- Simpan huruf mutu sebagai variabel bertipe
char. - Simpan nama dan NIM sebagai string.
Pertanyaan analisis: bila nilai ujian = 80 dan nilai tugas = 90, berapa nilai akhirnya? Manfaatkan tabel jejak untuk memverifikasi perhitungan Anda.
Deteksi Kesalahan Tipe Data
SulitProgram berikut memiliki tujuh kesalahan terkait tipe data, identifier, atau konstanta. Temukan semuanya, lalu tuliskan versi yang benar.
program KacauTipe;
const
PPN = 0.11
nama_toko = 'Cendekia';
var
integer: byte;
harga barang: real;
jumlahBeli: integer;
totalBayar: currency;
huruf: string;
begin
harga barang := 125000;
jumlahBeli := 3;
totalBayar := harga barang * jumlahBeli;
PPN := 0.12;
huruf := 'A';
integer := 100;
writeln('Total: ', totalBayar);
end.
Ketentuan:
- Sebutkan nomor baris setiap kesalahan.
- Jelaskan mengapa baris tersebut salah.
- Tuliskan versi perbaikan lengkap yang dapat dikompilasi.
Pertanyaan analisis: setelah semua kesalahan
diperbaiki, apakah program menghasilkan keluaran yang benar?
Bila nilai PPN seharusnya 0.12,
bagaimana cara yang benar mengubahnya? (Petunjuk: konstanta
tidak dapat diubah; solusinya adalah mengubah definisi konstanta
itu sendiri.)
Studi Kasus
Sistem Inventaris Toko Elektronik
9.1 Deskripsi Masalah
Toko elektronik "Elektro Jaya" ingin mendata barang yang masuk. Setiap barang memiliki: kode barang, nama barang, kategori, jumlah stok, harga satuan, dan status ketersediaan. Program menerima data ini lalu menampilkan ringkasan dalam bentuk kartu inventaris.
9.2 Analisis Tipe Data
Sebelum menulis kode, kita petakan setiap field ke tipe data yang tepat.
| Field | Sifat Data | Tipe Terpilih | Alasan |
|---|---|---|---|
| Kode barang | Kombinasi huruf dan angka, misal "ELK-001" | string[10] |
Lebih dari satu karakter dan panjang terbatas |
| Nama barang | Teks panjang, misal "Laptop ASUS VivoBook" | string[50] |
Cukup menampung nama panjang |
| Kategori | Satu karakter, misal 'L' untuk Laptop | char |
Hanya satu karakter |
| Jumlah stok | Bilangan bulat non-negatif, umumnya < 1000 | word |
Tidak negatif, rentang 0-65535 sudah cukup |
| Harga satuan | Nilai uang, misal 8.500.000,00 | currency |
Presisi eksak untuk keuangan |
| Status ketersediaan | Ya/tidak | boolean |
Hanya dua nilai logis |
9.3 Flowchart Studi Kasus
flowchart TD
A(["Mulai"]) --> B[/"Baca kode, nama, kategori, stok, harga"/]
B --> C["Tentukan status berdasarkan stok"]
C --> D{"Stok > 0?"}
D -- "Ya" --> E["status = TERSEDIA"]
D -- "Tidak" --> F["status = HABIS"]
E --> G["Hitung nilai inventaris
= stok * harga"]
F --> G
G --> H[/"Tampilkan kartu inventaris"/]
H --> I(["Selesai"])
Gambar 9.1 - Flowchart pendataan inventaris toko elektronik
9.4 Pseudocode Studi Kasus
PROGRAM InventarisTokoElektronik
{ Mencatat satu barang masuk dan menampilkan kartu inventaris }
KONSTANTA
NAMA_TOKO = "Elektro Jaya"
GARIS_GANDA = "=========================================="
GARIS_TUNGGAL= "------------------------------------------"
DEKLARASI
kodeBarang : string
namaBarang : string
kategori : char
jumlahStok : word
hargaSatuan : currency
nilaiInventaris : currency
tersedia : boolean
ALGORITMA
write("Kode barang : ")
read(kodeBarang)
write("Nama barang : ")
read(namaBarang)
write("Kategori (1 huruf): ")
read(kategori)
write("Jumlah stok : ")
read(jumlahStok)
write("Harga satuan : ")
read(hargaSatuan)
tersedia <- jumlahStok > 0
nilaiInventaris <- jumlahStok * hargaSatuan
write(GARIS_GANDA)
write(NAMA_TOKO)
write(GARIS_GANDA)
write("Kode Barang : ", kodeBarang)
write("Nama Barang : ", namaBarang)
write("Kategori : ", kategori)
write("Stok : ", jumlahStok, " unit")
write("Harga Satuan : Rp ", hargaSatuan)
write("Nilai Total : Rp ", nilaiInventaris)
write(GARIS_TUNGGAL)
jika tersedia = true maka
write("Status : TERSEDIA")
selain itu
write("Status : HABIS")
akhir jika
write(GARIS_GANDA)
END
9.5 Implementasi dalam Pascal
program InventarisTokoElektronik;
{ Studi Kasus Modul 3 - Pendataan inventaris toko elektronik }
const
NAMA_TOKO : string[20] = 'Elektro Jaya';
GARIS_GANDA = '==========================================';
GARIS_TUNGGAL = '------------------------------------------';
var
kodeBarang : string[10];
namaBarang : string[50];
kategori : char;
jumlahStok : word;
hargaSatuan : currency;
nilaiInventaris : currency;
tersedia : boolean;
begin
writeln('Formulir Pendataan Barang');
writeln(GARIS_TUNGGAL);
writeln;
write('Kode barang : ');
readln(kodeBarang);
write('Nama barang : ');
readln(namaBarang);
write('Kategori (1 huruf) : ');
readln(kategori);
write('Jumlah stok : ');
readln(jumlahStok);
write('Harga satuan (Rp) : ');
readln(hargaSatuan);
tersedia := jumlahStok > 0;
nilaiInventaris := jumlahStok * hargaSatuan;
writeln;
writeln(GARIS_GANDA);
writeln(NAMA_TOKO);
writeln(GARIS_GANDA);
writeln('Kode Barang : ', kodeBarang);
writeln('Nama Barang : ', namaBarang);
writeln('Kategori : ', kategori);
writeln('Stok : ', jumlahStok, ' unit');
writeln('Harga Satuan : Rp ', hargaSatuan:0:2);
writeln('Nilai Total : Rp ', nilaiInventaris:0:2);
writeln(GARIS_TUNGGAL);
if tersedia then
writeln('Status : TERSEDIA')
else
writeln('Status : HABIS');
writeln(GARIS_GANDA);
end.
9.6 Contoh Keluaran
Formulir Pendataan Barang ------------------------------------------ Kode barang : ELK-001 Nama barang : Laptop ASUS VivoBook 14 Kategori (1 huruf) : L Jumlah stok : 15 Harga satuan (Rp) : 8500000 ========================================== Elektro Jaya ========================================== Kode Barang : ELK-001 Nama Barang : Laptop ASUS VivoBook 14 Kategori : L Stok : 15 unit Harga Satuan : Rp 8500000.00 Nilai Total : Rp 127500000.00 ------------------------------------------ Status : TERSEDIA ==========================================
9.7 Pembahasan
Beberapa keputusan perancangan penting pada program ini.
-
Tipe currency untuk harga. Nilai 8.500.000
dikalikan 15 menghasilkan 127.500.000. Bila memakai tipe
real, hasilnya bisa sedikit menyimpang karena presisi floating point. Dengancurrency, hasilnya eksak. -
Tipe word untuk stok. Jumlah stok tidak
mungkin negatif dan tidak lebih dari 65.535. Tipe
wordmemilih rentang tepat sekaligus mendokumentasikan bahwa nilai ini tidak boleh negatif. -
Tipe char untuk kategori. Karena kategori hanya
satu huruf,
charlebih tepat dan lebih hemat memori daripada string. -
Konstanta bertipe untuk nama toko. Panjang
nama dibatasi 20 karakter dengan notasi
string[20]. Ini menghindari penggunaan memori berlebihan dan memastikan format konsisten. -
Boolean untuk status. Meskipun status bisa
disimpan sebagai string "TERSEDIA"/"HABIS", menyimpannya
sebagai boolean
tersediamemisahkan data dari penyajian. Nanti, ketika kita memerlukan format tampilan berbeda, kita cukup mengubah blok keluaran tanpa menyentuh logika.
9.8 Pengembangan Selanjutnya
| Modul | Pengembangan |
|---|---|
| Modul 4 | Menambahkan perhitungan diskon dan pajak dengan operator |
| Modul 5 | Memperhalus format tampilan dengan lebar field |
| Modul 6 | Menambahkan validasi rentang untuk setiap masukan |
| Modul 8 | Mendata banyak barang sekaligus dengan perulangan |
| Modul 20 | Mengelompokkan field ke dalam record Barang |
| Modul 25 | Menyimpan data inventaris ke berkas |
Rangkuman
Poin-poin kunci yang perlu diingat dari Modul 3
-
Variabel menyimpan nilai yang dapat berubah
selama program berjalan, dideklarasikan di blok
var. -
Konstanta menyimpan nilai tetap yang tidak
dapat diubah setelah dideklarasikan, dideklarasikan di blok
const. - Identifier harus dimulai dengan huruf atau garis bawah, diikuti huruf, angka, atau garis bawah. Tidak boleh mengandung spasi atau tanda baca. Pascal bersifat case-insensitive.
-
Reserved words seperti
begin,end,var,consttidak boleh dipakai sebagai identifier. -
Tipe integer tersedia dalam berbagai ukuran:
byte,shortint,smallint,word,integer,longint,int64. Pilih berdasarkan rentang nilai. -
Tipe real meliputi
single,double,extended,comp, dancurrency. Untuk uang, gunakancurrency. -
Char menyimpan satu karakter (1 byte),
sedangkan string menyimpan banyak karakter.
Notasi
string[n]membatasi panjang maksimal. -
Boolean hanya memiliki nilai
trueataufalse. - Konstanta tak bertipe mendefinisikan nilai tanpa tipe eksplisit. Konstanta bertipe menuliskan tipe secara eksplisit dan berguna untuk mengontrol ukuran memori.
- Selalu inisialisasi eksplisit. Jangan bergantung pada nilai default, terutama untuk variabel lokal.
-
Waspadai overflow. Pilih tipe yang cukup
besar untuk rentang nilai Anda. Gunakan
{$Q+}untuk mendeteksi overflow saat runtime. -
Jangan pakai real untuk uang. Gunakan
currencyagar tidak ada kesalahan pembulatan.
Pastikan Anda sudah terbiasa memilih tipe data yang tepat untuk setiap situasi. Cobalah melihat program-program kecil di sekitar Anda dan pikirkan tipe data apa yang cocok untuk setiap field. Modul 4 akan membahas operator dan ekspresi, termasuk konversi antar tipe.
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 tipe data sederhana secara formal.
- Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab 3 dan 4 membahas tipe data dan variabel pada Free Pascal dan Delphi modern.
- Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang variabel dan konstanta dengan pendekatan pedagogis yang sangat baik.
- Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 3 membahas tipe data dan deklarasi.
- Savitch, W. (2009). Problem Solving with C++ (7th ed.). Pearson. Meskipun bukan tentang Pascal, bab tentang tipe data dan representasi bilangan sangat relevan.
Dokumentasi Resmi
- Free Pascal Team. Free Pascal Reference Guide. Bab tentang tipe data, variabel, dan konstanta. Tersedia di freepascal.org/docs.html.
- Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang identifier, reserved words, dan direktif kompilator.
- Lazarus IDE Documentation. Panduan penggunaan IDE dan pengenalan tipe data. Tersedia di wiki.lazarus.freepascal.org.
Artikel dan Sumber Daring
- IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang tipe data dan deklarasi.
- Goldberg, D. (1991). "What Every Computer Scientist Should Know About Floating-Point Arithmetic." ACM Computing Surveys, 23(1), 5-48. Artikel klasik yang menjelaskan mengapa real tidak cocok untuk uang.
- Free Pascal Community Forum. Diskusi tentang perbedaan tipe integer di berbagai platform.