P Pascal dan Algoritma
Modul 9 dari 50 Roadmap
Modul 09 - Fase Dasar

Perulangan WHILE dan REPEAT-UNTIL

Modul ini melanjutkan pembahasan perulangan tak terkendali (conditional loop) melalui while dan repeat-until. Berbeda dari for yang jumlah iterasinya sudah diketahui, kedua struktur ini mengulang berdasarkan kondisi. Anda akan mempelajari perbedaan uji di awal dan uji di akhir, risiko infinite loop, serta teknik validasi input berulang yang menjadi dasar interaksi program dengan pengguna.

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

Tujuan Pembelajaran

Kompetensi yang ingin dicapai setelah menyelesaikan modul ini

Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:

  1. Menjelaskan konsep perulangan tak terkendali dan kapan menggunakannya.
  2. Menulis perulangan while dengan uji kondisi di awal.
  3. Menulis perulangan repeat-until dengan uji kondisi di akhir.
  4. Membedakan kapan menggunakan while dan kapan repeat.
  5. Mengidentifikasi risiko infinite loop dan cara mencegahnya.
  6. Menerapkan pola validasi input berulang.
  7. Menerapkan pola sentinel value untuk menghentikan perulangan berdasarkan data.
  8. Memilih struktur perulangan yang tepat berdasarkan karakteristik masalah.
  9. Menggambar flowchart untuk while dan repeat-until.
  10. Memecahkan masalah nyata dengan perulangan tak terkendali.
02

Capaian Pembelajaran

Indikator ketercapaian dan kaitan dengan modul selanjutnya

Capaian Pembelajaran Mata Kuliah

Mahasiswa mampu merancang perulangan tak terkendali untuk memproses data yang jumlahnya tidak diketahui sebelumnya, melakukan validasi input, dan mengimplementasikan algoritma iteratif berbasis kondisi.

Indikator Ketercapaian Modul

Kode Indikator Bukti
IK-9.1 Menulis perulangan while dengan kondisi yang benar Latihan 1 dan 2
IK-9.2 Menulis perulangan repeat-until dengan kondisi yang benar Latihan 2 dan 3
IK-9.3 Menerapkan pola validasi input berulang Latihan 3 dan 4
IK-9.4 Menerapkan pola sentinel value Latihan 4 dan studi kasus
IK-9.5 Mengidentifikasi dan mencegah infinite loop Latihan 5
Kaitan dengan Modul Berikutnya

Perulangan tak terkendali akan sangat berguna untuk memproses data dalam jumlah tak terbatas, membangun menu interaktif yang dapat dipilih berulang, dan mengimplementasikan algoritma pencarian seperti binary search (Modul 31) atau validasi pada sistem berkas (Modul 25).

03

Materi Teori

Sintaks, perbandingan, pola umum, dan risiko

3.1 Mengapa Perulangan Tak Terkendali

Perulangan for memerlukan pengetahuan tentang jumlah iterasi. Namun banyak situasi nyata tidak memiliki informasi ini:

Untuk kasus seperti ini, Pascal menyediakan while dan repeat-until yang mengulang selama kondisi tertentu terpenuhi.

3.2 Perulangan WHILE: Uji di Awal

selama kondisi lakukan
  pernyataan
akhir selama

Sintaks Pascal:

while_dasar.pasPascal
while kondisi do
  pernyataan;

Kondisi diperiksa sebelum setiap iterasi. Bila kondisi bernilai false pada pemeriksaan pertama, blok perulangan tidak dieksekusi sama sekali.

Contoh: Mencetak 1 sampai 5

while_cetak.pasPascal
var
  i: integer;

begin
  i := 1;
  while i <= 5 do
  begin
    writeln(i);
    i := i + 1;
  end;
end.

Perhatikan tiga komponen penting perulangan while:

  1. Inisialisasi di luar perulangan (i := 1;).
  2. Kondisi pada baris while (i <= 5).
  3. Perubahan variabel kontrol di dalam blok (i := i + 1;).
Bahaya Infinite Loop

Bila Anda lupa menuliskan i := i + 1;, maka nilai i akan selalu 1, kondisi selalu true, dan program akan berjalan tanpa henti. Ini disebut infinite loop. Selalu pastikan variabel kontrol berubah di dalam blok perulangan.

3.3 Perulangan REPEAT-UNTIL: Uji di Akhir

ulangi
  pernyataan
sampai kondisi

Sintaks Pascal:

repeat_dasar.pasPascal
repeat
  pernyataan;
until kondisi;

Blok perulangan dieksekusi terlebih dahulu, baru kemudian kondisi diperiksa. Bila kondisi bernilai true, perulangan berhenti. Artinya, blok selalu dieksekusi minimal satu kali.

Perhatikan: Kondisi pada REPEAT adalah "BERHENTI"

Kondisi pada repeat-until menyatakan kapan perulangan berhenti, bukan kapan perulangan berlanjut. Ini berbeda dari while dan for. Perhatikan baik-baik tanda dan logika kondisinya.

Contoh: Mencetak 1 sampai 5

repeat_cetak.pasPascal
var
  i: integer;

begin
  i := 1;
  repeat
    writeln(i);
    i := i + 1;
  until i > 5;
end.

Perulangan berhenti ketika i > 5 bernilai true. Jadi iterasi terjadi untuk i = 1, 2, 3, 4, 5.

3.4 Perbandingan WHILE vs REPEAT-UNTIL

Aspek WHILE REPEAT-UNTIL
Posisi uji kondisi Di awal Di akhir
Jumlah iterasi minimum 0 kali (bisa tidak dieksekusi) 1 kali (selalu dieksekusi)
Makna kondisi Lanjut selama kondisi TRUE Berhenti ketika kondisi TRUE
Blok begin...end Diperlukan bila lebih dari satu pernyataan Tidak diperlukan (blok otomatis)
Titik koma sebelum penutup Setelah end Tidak ada titik koma sebelum until
Kapan Menggunakan Apa

Gunakan while ketika blok mungkin tidak dieksekusi sama sekali, misalnya memproses data dari berkas yang mungkin kosong. Gunakan repeat-until ketika blok harus dieksekusi minimal satu kali, seperti menampilkan menu atau meminta input yang harus divalidasi.

3.5 Pola Validasi Input Berulang

Pola paling umum untuk repeat-until adalah meminta input sampai pengguna memasukkan nilai yang sah.

validasi_input.pasPascal
var
  nilai: integer;

begin
  repeat
    write('Masukkan nilai (0-100): ');
    readln(nilai);

    if (nilai < 0) or (nilai > 100) then
      writeln('Nilai tidak valid. Coba lagi.');
  until (nilai >= 0) and (nilai <= 100);

  writeln('Nilai yang Anda masukkan: ', nilai);
end.

Perhatikan bahwa kondisi until menyatakan kondisi berhenti, yaitu ketika nilai sudah valid. Pesan kesalahan ditampilkan bila nilai tidak valid, lalu perulangan mengulang dari awal.

3.6 Pola Sentinel Value

Sentinel value adalah nilai khusus yang menandakan akhir data. Ketika pengguna memasukkan nilai sentinel, perulangan berhenti. Pola ini memungkinkan pemrosesan data dalam jumlah tak terbatas.

sentinel.pasPascal
const
  SENTINEL = -1;

var
  nilai, total, jumlah: integer;

begin
  total := 0;
  jumlah := 0;

  writeln('Masukkan nilai (-1 untuk selesai):');

  write('Nilai: ');
  readln(nilai);

  while nilai <> SENTINEL do
  begin
    total := total + nilai;
    jumlah := jumlah + 1;

    write('Nilai: ');
    readln(nilai);
  end;

  if jumlah > 0 then
    writeln('Rata-rata: ', total / jumlah:0:2)
  else
    writeln('Tidak ada data yang dimasukkan.');
end.

3.7 Mencegah Infinite Loop

Infinite loop terjadi ketika kondisi perulangan tidak pernah menjadi false (pada while) atau tidak pernah menjadi true (pada repeat-until).

Penyebab umum:

  1. Lupa mengubah variabel kontrol di dalam blok.
  2. Kondisi yang salah logika (misalnya < seharusnya >).
  3. Variabel kontrol diubah tapi tidak memengaruhi kondisi.
  4. Konversi tipe yang tidak disengaja mengubah nilai.
  5. Input pengguna yang tidak pernah memenuhi kondisi keluar.
Cara Menghentikan Program yang Infinite Loop

Bila program Anda terjebak dalam infinite loop, tekan Ctrl+C pada terminal, atau Ctrl+Break pada beberapa lingkungan. Selalu uji program Anda dengan data yang berbeda untuk memastikan tidak ada infinite loop yang tersembunyi.

3.8 Perulangan Bersarang dengan WHILE

while juga dapat bersarang di dalam while atau for. Setiap perulangan harus memiliki variabel kontrol sendiri.

while_bersarang.pasPascal
var
  i, j: integer;

begin
  i := 1;
  while i <= 3 do
  begin
    j := 1;
    while j <= 3 do
    begin
      write(i, 'x', j, '=', i * j, '  ');
      j := j + 1;
    end;
    writeln;
    i := i + 1;
  end;
end.

3.9 Konversi Antar Struktur Perulangan

Setiap struktur perulangan dapat dikonversi ke struktur lainnya. Memahami konversi ini memperdalam pemahaman tentang kapan masing-masing lebih tepat.

FOR ke WHILE

for_ke_while.pasPascal
{ Versi FOR }
for i := 1 to 5 do
  writeln(i);

{ Versi WHILE - ekuivalen }
i := 1;
while i <= 5 do
begin
  writeln(i);
  i := i + 1;
end;

WHILE ke REPEAT

while_ke_repeat.pasPascal
{ Versi WHILE }
i := 1;
while i <= 5 do
begin
  writeln(i);
  i := i + 1;
end;

{ Versi REPEAT - ekuivalen }
i := 1;
repeat
  writeln(i);
  i := i + 1;
until i > 5;

3.10 Kesalahan Umum pada WHILE dan REPEAT

  1. Lupa mengubah variabel kontrol. Menyebabkan infinite loop.
  2. Titik koma sebelum until. Kesalahan sintaks; until adalah bagian dari konstruksi repeat dan tidak dipisahkan titik koma.
  3. Kondisi terbalik pada until. Menuliskan kondisi lanjut, bukan kondisi berhenti.
  4. Inisialisasi variabel kontrol di dalam loop. Nilai ter-reset setiap iterasi dan loop tidak berhenti.
  5. Menggunakan while untuk situasi yang butuh minimal satu iterasi. Blok tidak dieksekusi sama sekali bila kondisi awal salah.
  6. Lupa blok begin...end pada while. Hanya pernyataan pertama yang diulang.
  7. Kondisi yang kompleks tanpa tanda kurung. Menyebabkan prioritas operator yang tidak diinginkan.
  8. Variabel kontrol diubah pada kondisi yang tidak dievaluasi. Misalnya mengubah variabel hanya di dalam cabang if yang mungkin tidak dijalankan.

3.11 Perbedaan Free Pascal dan Turbo Pascal

Aspek Turbo Pascal Free Pascal
Perulangan while Didukung Didukung, sama
Perulangan repeat Didukung Didukung, sama
Blok begin...end pada while Diperlukan bila > 1 pernyataan Sama
Blok otomatis pada repeat Ya, tidak perlu begin...end Sama
Deteksi infinite loop Tidak ada Tidak ada (runtime hazard)
04

Algoritma dan Flowchart

Representasi visual perulangan tak terkendali

4.1 Flowchart Perulangan WHILE

flowchart TD
    A(["Mulai"]) --> B["Inisialisasi"]
    B --> C{"Kondisi?"}
    C -- "True" --> D["Eksekusi blok"]
    D --> E["Update variabel kontrol"]
    E --> C
    C -- "False" --> F(["Selesai"])
      

Gambar 4.1 - Flowchart perulangan while dengan uji di awal

4.2 Flowchart Perulangan REPEAT-UNTIL

flowchart TD
    A(["Mulai"]) --> B["Inisialisasi"]
    B --> C["Eksekusi blok"]
    C --> D["Update variabel kontrol"]
    D --> E{"Kondisi berhenti?"}
    E -- "False" --> C
    E -- "True" --> F(["Selesai"])
      

Gambar 4.2 - Flowchart perulangan repeat-until dengan uji di akhir

4.3 Flowchart Validasi Input dengan REPEAT

flowchart TD
    A(["Mulai"]) --> B[/"Baca nilai"/]
    B --> C{"nilai dalam
rentang 0-100?"} C -- "Tidak" --> D[/"Tampilkan pesan kesalahan"/] D --> B C -- "Ya" --> E[/"Tampilkan nilai"/] E --> F(["Selesai"])

Gambar 4.3 - Flowchart validasi input berulang dengan repeat-until

4.4 Flowchart Menu Interaktif dengan Sentinel

flowchart TD
    A(["Mulai"]) --> B["total = 0
jumlah = 0"] B --> C[/"Baca nilai"/] C --> D{"nilai = -1?"} D -- "Ya" --> H{"jumlah > 0?"} D -- "Tidak" --> E["total = total + nilai"] E --> F["jumlah = jumlah + 1"] F --> C H -- "Ya" --> I["rata = total / jumlah"] H -- "Tidak" --> J["Tampilkan pesan kosong"] I --> K[/"Tampilkan rata-rata"/] J --> K K --> L(["Selesai"])

Gambar 4.4 - Flowchart pemrosesan data dengan nilai sentinel

05

Pseudocode

Representasi algoritmik perulangan tak terkendali

5.1 Pseudocode Validasi Input Berulang

PROGRAM ValidasiInput
{ Meminta input sampai nilai berada dalam rentang yang sah }

KONSTANTA
  NILAI_MIN = 0
  NILAI_MAKS = 100

DEKLARASI
  nilai : integer
  valid : boolean

ALGORITMA
  valid <- false

  selama valid = false lakukan
    write("Masukkan nilai (0-100): ")
    read(nilai)

    jika (nilai >= NILAI_MIN) dan (nilai <= NILAI_MAKS) maka
      valid <- true
    selain itu
      write("Kesalahan: nilai tidak valid. Coba lagi.")
    akhir jika
  akhir selama

  write("Nilai yang Anda masukkan: ", nilai)
END

5.2 Pseudocode Rata-rata dengan Sentinel

PROGRAM RataSentinel
{ Menghitung rata-rata data sampai pengguna memasukkan -1 }

KONSTANTA
  SENTINEL = -1

DEKLARASI
  nilai   : integer
  total   : integer
  jumlah  : integer
  rata    : real

ALGORITMA
  total <- 0
  jumlah <- 0

  write("Masukkan nilai (-1 untuk berhenti):")

  ulangi
    write("Nilai: ")
    read(nilai)

    jika nilai <> SENTINEL maka
      total <- total + nilai
      jumlah <- jumlah + 1
    akhir jika
  sampai nilai = SENTINEL

  jika jumlah > 0 maka
    rata <- total / jumlah
    write("Jumlah data   : ", jumlah)
    write("Total nilai   : ", total)
    write("Rata-rata     : ", rata)
  selain itu
    write("Tidak ada data yang dimasukkan.")
  akhir jika
END

5.3 Pseudocode Menu Interaktif dengan Loop

PROGRAM MenuLoop
{ Menu yang dapat dipilih berulang sampai pengguna keluar }

DEKLARASI
  pilihan : integer
  selesai : boolean

ALGORITMA
  selesai <- false

  selama selesai = false lakukan
    write("============================")
    write("       MENU UTAMA")
    write("============================")
    write("1. Lihat data")
    write("2. Tambah data")
    write("3. Hapus data")
    write("0. Keluar")
    write("============================")
    write("Pilihan: ")
    read(pilihan)

    kasus pilihan dari
      1 : write("Menampilkan data...")
      2 : write("Menambah data...")
      3 : write("Menghapus data...")
      0 : selesai <- true
      selain itu
        write("Pilihan tidak valid")
    akhir kasus

    write("")
  akhir selama

  write("Terima kasih. Program selesai.")
END
06

Contoh Kode Pascal Lengkap

Lima program untuk mendemonstrasikan while dan repeat-until

6.1 Program Mencetak 1 sampai N dengan WHILE

while_cetak_n.pas Pascal
program WhileCetakN;
{ Mencetak 1 sampai n menggunakan while }

var
  n, i: integer;

begin
  write('Masukkan nilai n: ');
  readln(n);

  writeln;
  writeln('Mencetak 1 sampai ', n, ':');

  i := 1;
  while i <= n do
  begin
    write(i, ' ');
    i := i + 1;
  end;

  writeln;
  writeln('Selesai.');
end.

Contoh keluaran untuk n = 8:

Masukkan nilai n: 8

Mencetak 1 sampai 8:
1 2 3 4 5 6 7 8
Selesai.

6.2 Program Validasi Nilai Berulang

validasi_ulang.pas Pascal
program ValidasiUlang;
{ Meminta input sampai nilai valid }

const
  NILAI_MIN = 0;
  NILAI_MAKS = 100;

var
  nama: string;
  nilai: integer;

begin
  write('Nama mahasiswa : ');
  readln(nama);

  repeat
    write('Nilai ujian (0-100): ');
    readln(nilai);

    if (nilai < NILAI_MIN) or (nilai > NILAI_MAKS) then
      writeln('  -> Nilai tidak valid. Silakan coba lagi.');
  until (nilai >= NILAI_MIN) and (nilai <= NILAI_MAKS);

  writeln;
  writeln('========================================');
  writeln('Data berhasil disimpan');
  writeln('========================================');
  writeln('Nama  : ', nama);
  writeln('Nilai : ', nilai);
  writeln('========================================');
end.

6.3 Program Rata-rata dengan Sentinel

rata_sentinel.pas Pascal
program RataSentinel;
{ Menghitung rata-rata data sampai -1 dimasukkan }

const
  SENTINEL = -1;

var
  nilai, total, jumlah: integer;
  rata: real;

begin
  total := 0;
  jumlah := 0;

  writeln('Program Penghitung Rata-rata');
  writeln('Masukkan nilai (ketik -1 untuk selesai)');
  writeln('----------------------------------------');

  repeat
    write('Nilai: ');
    readln(nilai);

    if nilai <> SENTINEL then
    begin
      total := total + nilai;
      jumlah := jumlah + 1;
    end;
  until nilai = SENTINEL;

  writeln;
  writeln('----------------------------------------');

  if jumlah > 0 then
  begin
    rata := total / jumlah;
    writeln('Jumlah data   : ', jumlah);
    writeln('Total nilai   : ', total);
    writeln('Rata-rata     : ', rata:0:2);
  end
  else
    writeln('Tidak ada data yang dimasukkan.');
end.

Contoh sesi interaksi:

Program Penghitung Rata-rata
Masukkan nilai (ketik -1 untuk selesai)
----------------------------------------
Nilai: 85
Nilai: 92
Nilai: 78
Nilai: 88
Nilai: 95
Nilai: -1

----------------------------------------
Jumlah data   : 5
Total nilai   : 438
Rata-rata     : 87.60

6.4 Program Menu Interaktif dengan WHILE

menu_loop.pas Pascal
program MenuLoop;
{ Menu interaktif yang dapat dipilih berulang }

uses
  crt;

var
  pilihan: integer;
  selesai: boolean;

begin
  selesai := false;

  while not selesai do
  begin
    ClrScr;

    writeln('========================================');
    writeln('           MENU UTAMA');
    writeln('========================================');
    writeln('1. Lihat data mahasiswa');
    writeln('2. Tambah data mahasiswa');
    writeln('3. Hapus data mahasiswa');
    writeln('0. Keluar');
    writeln('========================================');
    write('Pilihan Anda: ');
    readln(pilihan);

    writeln;
    case pilihan of
      1 : writeln('Menampilkan 10 data mahasiswa...');
      2 : writeln('Formulir penambahan data dibuka.');
      3 : writeln('Konfirmasi penghapusan diperlukan.');
      0 : begin
            selesai := true;
            writeln('Terima kasih. Program selesai.');
          end;
    else
      writeln('Pilihan tidak valid. Silakan coba lagi.');
    end;

    if not selesai then
    begin
      writeln;
      writeln('Tekan Enter untuk melanjutkan...');
      readln;
    end;
  end;
end.

6.5 Program Konversi Bilangan Desimal ke Biner

desimal_biner.pas Pascal
program DesimalBiner;
{ Mengkonversi bilangan desimal positif ke biner dengan while }

var
  n, asli: int64;
  biner: string;
  digit: char;

begin
  write('Masukkan bilangan desimal: ');
  readln(n);

  if n < 0 then
    writeln('Hanya menerima bilangan non-negatif.')
  else if n = 0 then
    writeln('Biner: 0')
  else
  begin
    asli := n;
    biner := '';

    while n > 0 do
    begin
      if (n mod 2) = 0 then
        digit := '0'
      else
        digit := '1';

      biner := digit + biner;
      n := n div 2;
    end;

    writeln('Desimal: ', asli);
    writeln('Biner  : ', biner);
  end;
end.

Contoh keluaran untuk n = 2025:

Masukkan bilangan desimal: 2025
Desimal: 2025
Biner  : 11111101001

Perhatikan bagaimana while bekerja: kita terus membagi n dengan 2 dan menyimpan sisanya. Karena kita tidak tahu berapa bit yang dibutuhkan, while adalah pilihan yang tepat.

07

Penjelasan Kode Baris per Baris

Membedah program RataSentinel dan DesimalBiner secara rinci

7.1 Program RataSentinel

Baris Kode Penjelasan
5-6 SENTINEL = -1; Konstanta nilai sentinel. Dipilih -1 karena tidak mungkin menjadi nilai ujian yang sah.
8-10 nilai, total, jumlah: integer;
rata: real;
nilai menyimpan nilai yang baru dibaca, total akumulator, jumlah pencacah, dan rata hasil pembagian dalam real.
16-17 total := 0;
jumlah := 0;
Inisialisasi akumulator dan pencacah sebelum perulangan. Ini wajib.
21 repeat Awal perulangan. Blok akan dieksekusi minimal satu kali, bahkan bila pengguna langsung memasukkan sentinel.
22-23 write('Nilai: ');
readln(nilai);
Membaca nilai dari pengguna. Prompt menggunakan write (tanpa newline) agar pengguna dapat mengetik di baris yang sama.
25-29 if nilai <> SENTINEL then
begin
total := total + nilai;
jumlah := jumlah + 1;
end;
Bila nilai bukan sentinel, tambahkan ke total dan naikkan pencacah. Sentinel tidak dihitung sebagai data.
30 until nilai = SENTINEL; Kondisi berhenti. Perulangan berakhir ketika pengguna memasukkan sentinel. Perhatikan bahwa tidak ada titik koma sebelum until.
35-40 if jumlah > 0 then
begin
rata := total / jumlah;
...
end;
Menghitung rata-rata hanya bila ada data. Ini mencegah pembagian dengan nol.
42-43 else
writeln('Tidak ada data ...');
Penanganan kasus kosong. Berguna bila pengguna langsung menekan -1.

7.2 Program DesimalBiner

Baris Kode Penjelasan
5-7 n, asli: int64;
biner: string;
digit: char;
Tipe int64 digunakan agar dapat menerima bilangan besar. Variabel asli menyimpan nilai awal sebelum dimodifikasi.
14-16 if n < 0 then
writeln(...)
else if n = 0 then
Kasus khusus: negatif tidak diproses, nol ditangani langsung.
20-21 asli := n;
biner := '';
Simpan nilai asli dan inisialisasi string biner kosong.
23 while n > 0 do Kondisi perulangan: terus berjalan selama n masih positif. Karena kita tidak tahu berapa bit yang dibutuhkan, while lebih tepat daripada for.
25-28 if (n mod 2) = 0 then
digit := '0'
else
digit := '1';
Menentukan bit saat ini berdasarkan sisa pembagian dengan 2.
30 biner := digit + biner; Menambahkan digit di depan string, bukan di belakang. Karena kita menghasilkan bit dari LSB (least significant bit), hasil akhir perlu dibalik urutannya.
31 n := n div 2; Update variabel kontrol. Tanpa baris ini, perulangan akan berjalan tanpa henti (infinite loop).
34-35 writeln('Desimal: ', asli);
writeln('Biner : ', biner);
Menampilkan nilai asli dan hasil konversi.

7.3 Jejak Eksekusi DesimalBiner untuk n = 13

Iterasi n n mod 2 digit biner n div 2 (baru)
Awal13--""-
1131'1'"1"6
260'0'"01"3
331'1'"101"1
411'1'"1101"0
Berhenti0--"1101"-

Hasil akhir: 13 desimal = 1101 biner. Verifikasi: 1×8 + 1×4 + 0×2 + 1×1 = 8 + 4 + 0 + 1 = 13. Benar.

Pelajaran Kunci

Perulangan while sangat efektif ketika jumlah iterasi tidak dapat diprediksi tetapi ada kondisi berhenti yang jelas. Tiga hal yang wajib ada: (1) inisialisasi sebelum loop, (2) kondisi yang dapat menjadi false, dan (3) update variabel kontrol di dalam loop.

08

Latihan Soal

Lima soal dengan tingkat kesulitan bertingkat

1

Faktorial dengan WHILE

Mudah

Buat program yang menghitung faktorial dari n menggunakan perulangan while (bukan for).

Ketentuan:

  • Validasi agar n tidak negatif.
  • Gunakan tipe int64 untuk hasil faktorial.
  • Gambar flowchart terlebih dahulu.

Pertanyaan analisis: bandingkan versi while ini dengan versi for yang Anda tulis di Modul 8. Versi mana yang lebih ringkas? Versi mana yang lebih jelas?

2

Kuis Interaktif dengan REPEAT

Mudah

Buat program kuis sederhana yang menanyakan hasil perkalian dua bilangan acak. Program terus meminta jawaban sampai pengguna menjawab dengan benar. Setelah benar, tampilkan berapa kali percobaan yang dibutuhkan.

Contoh keluaran:

Berapa hasil 7 x 8? 54
Salah. Coba lagi.

Berapa hasil 7 x 8? 56
Benar! Anda berhasil dalam 2 percobaan.

Ketentuan:

  • Gunakan repeat-until.
  • Gunakan pencacah untuk menghitung percobaan.
  • Tampilkan pesan "Salah" bila jawaban tidak sesuai.
3

Validasi Password

Sedang

Buat program yang meminta pengguna memasukkan password. Password dianggap sah bila memenuhi kriteria berikut:

  • Panjang minimal 8 karakter.
  • Mengandung minimal satu huruf besar.
  • Mengandung minimal satu digit angka.

Ketentuan:

  • Gunakan repeat-until untuk meminta password sampai memenuhi semua kriteria.
  • Bila password tidak sah, tampilkan pesan yang menjelaskan kriteria yang belum dipenuhi.
  • Gunakan for dan case untuk memeriksa setiap karakter.

Pertanyaan analisis: mengapa kita tidak bisa menggunakan fungsi UpCase pada seluruh string secara langsung? Bagaimana cara memeriksa karakter satu per satu?

4

Deret Hingga Ambang Batas

Sedang

Buat program yang menghitung jumlah deret 1 + 1/2 + 1/3 + 1/4 + ... dan berhenti ketika jumlah tersebut melewati ambang yang ditentukan pengguna (misalnya 5.0).

Ketentuan:

  • Gunakan while karena jumlah suku tidak diketahui.
  • Tampilkan berapa suku yang dibutuhkan untuk melewati ambang.
  • Tampilkan jumlah akhir.

Contoh keluaran:

Ambang batas: 3.0
Suku 1: total = 1.000000
Suku 2: total = 1.500000
...
Suku 11: total = 3.019877
Ambang 3.0 tercapai pada suku ke-11 dengan total 3.019877.

Pertanyaan analisis: mengapa deret ini memerlukan jumlah suku yang sangat banyak untuk mencapai ambang yang besar? (Petunjuk: ini disebut deret harmonik.)

5

Deteksi Kesalahan Perulangan WHILE dan REPEAT

Sulit

Program berikut memiliki tujuh kesalahan terkait sintaks atau logika perulangan tak terkendali. Temukan semuanya, lalu tuliskan versi yang benar.

kacau_while.pasPascal
program KacauWhile;

var
  nilai, total: integer;
  selesai: boolean;

begin
  total := 0;
  selesai := false;

  while selesai do
  begin
    write('Nilai (0 untuk berhenti): ');
    readln(nilai);

    total := total + nilai;

    if nilai = 0 then
      selesai := true;
  end;

  repeat
    writeln('Iterasi');
  until selesai = true;

  writeln('Total: ', total);

  i := 1;
  while i <= 5 do
    writeln(i);
    i := i + 1;
end.

Ketentuan:

  • Sebutkan nomor baris setiap kesalahan.
  • Jelaskan mengapa baris tersebut salah.
  • Tuliskan versi perbaikan lengkap yang dapat dikompilasi.

Pertanyaan analisis: pada baris while selesai do, mengapa ini adalah kesalahan logika yang serius? Apa yang akan terjadi bila kode dijalankan?

09

Studi Kasus

Sistem Pemesanan Tiket Pesawat "Nusantara Air"

9.1 Deskripsi Masalah

Maskapai "Nusantara Air" ingin membuat program pemesanan tiket yang interaktif. Penumpang dapat memesan beberapa tiket dalam satu transaksi, memasukkan nama penumpang dan kelas penerbangan untuk setiap tiket. Program menghitung subtotal setiap tiket, akumulasi total, dan menampilkan ringkasan transaksi.

9.2 Aturan Tarif dan Diskon

Kelas Kode Tarif Dasar
EkonomiERp 750.000
BisnisBRp 1.500.000
First ClassFRp 2.800.000

Diskon diberikan berdasarkan jumlah tiket:

9.3 Flowchart Studi Kasus

flowchart TD
    A(["Mulai"]) --> B["total = 0
jumlahTiket = 0
lagi = true"] B --> C{"lagi = true?"} C -- "Tidak" --> L["Hitung diskon berdasarkan jumlahTiket"] C -- "Ya" --> D[/"Baca nama penumpang"/] D --> E[/"Baca kelas E/B/F"/] E --> F["Tentukan tarif berdasarkan kelas"] F --> G{"Kelas valid?"} G -- "Tidak" --> H[/"Tampilkan error, tidak tambah tiket"/] G -- "Ya" --> I["total = total + tarif
jumlahTiket = jumlahTiket + 1"] H --> J[/"Tanya lagi? (Y/T)"/] I --> J J --> K{"Jawaban = T?"} K -- "Ya" --> M["lagi = false"] K -- "Tidak" --> C M --> C L --> N["diskon = total * persenDiskon"] N --> O["totalAkhir = total - diskon"] O --> P[/"Tampilkan ringkasan transaksi"/] P --> Q(["Selesai"])

Gambar 9.1 - Flowchart pemesanan tiket dengan perulangan tak terkendali

9.4 Pseudocode Studi Kasus

PROGRAM PemesananTiket
{ Sistem pemesanan tiket pesawat dengan perulangan tak terkendali }

KONSTANTA
  TARIF_EKONOMI  = 750000
  TARIF_BISNIS   = 1500000
  TARIF_FIRST    = 2800000
  GARIS_GANDA    = "=========================================="
  GARIS_TUNGGAL  = "------------------------------------------"

DEKLARASI
  namaPenumpang : string
  kelas         : char
  tarif         : currency
  total         : currency
  diskon        : currency
  totalAkhir    : currency
  jumlahTiket   : integer
  persenDiskon  : integer
  jawaban       : char
  lagi          : boolean
  valid         : boolean

ALGORITMA
  total       <- 0
  jumlahTiket <- 0
  lagi        <- true

  write(GARIS_GANDA)
  write("PEMESANAN TIKET NUSANTARA AIR")
  write(GARIS_GANDA)

  selama lagi = true lakukan
    write("")
    write("Pemesanan tiket ke-", jumlahTiket + 1)
    write("Nama penumpang    : ")
    read(namaPenumpang)
    write("Kelas (E/B/F)     : ")
    read(kelas)

    kelas <- UpCase(kelas)
    valid <- true

    kasus kelas dari
      'E' : tarif <- TARIF_EKONOMI
      'B' : tarif <- TARIF_BISNIS
      'F' : tarif <- TARIF_FIRST
      selain itu
        valid <- false
    akhir kasus

    jika valid = true maka
      total       <- total + tarif
      jumlahTiket <- jumlahTiket + 1
      write("Tarif: Rp ", tarif)
    selain itu
      write("Kelas tidak valid. Tiket tidak ditambahkan.")
    akhir jika

    write("Tambah tiket lagi? (Y/T): ")
    read(jawaban)

    jika UpCase(jawaban) = 'T' maka
      lagi <- false
    akhir jika
  akhir selama

  { Hitung diskon berdasarkan jumlah tiket }
  jika jumlahTiket <= 2 maka
    persenDiskon <- 0
  selain jika jumlahTiket <= 5 maka
    persenDiskon <- 5
  selain itu
    persenDiskon <- 10
  akhir jika

  diskon     <- total * persenDiskon / 100
  totalAkhir <- total - diskon

  write("")
  write(GARIS_GANDA)
  write("RINGKASAN TRANSAKSI")
  write(GARIS_GANDA)
  write("Jumlah tiket      : ", jumlahTiket)
  write("Subtotal          : Rp ", total)
  write("Diskon (", persenDiskon, "%)     : Rp ", diskon)
  write(GARIS_TUNGGAL)
  write("Total bayar       : Rp ", totalAkhir)
  write(GARIS_GANDA)
END

9.5 Implementasi dalam Pascal

pemesanan_tiket.pas Pascal
program PemesananTiket;
{ Studi Kasus Modul 9 - Pemesanan tiket pesawat dengan while }

uses
  crt;

const
  TARIF_EKONOMI = 750000;
  TARIF_BISNIS  = 1500000;
  TARIF_FIRST   = 2800000;
  GARIS_GANDA   = '==========================================';
  GARIS_TUNGGAL = '------------------------------------------';

var
  namaPenumpang : string[50];
  kelas         : char;
  tarif         : currency;
  total         : currency;
  diskon        : currency;
  totalAkhir    : currency;
  jumlahTiket   : integer;
  persenDiskon  : integer;
  jawaban       : char;
  lagi          : boolean;
  valid         : boolean;

begin
  total := 0;
  jumlahTiket := 0;
  lagi := true;

  writeln(GARIS_GANDA);
  writeln('PEMESANAN TIKET NUSANTARA AIR');
  writeln(GARIS_GANDA);

  while lagi do
  begin
    writeln;
    writeln('Pemesanan tiket ke-', jumlahTiket + 1);

    write('Nama penumpang    : ');
    readln(namaPenumpang);

    write('Kelas (E/B/F)     : ');
    readln(kelas);

    kelas := UpCase(kelas);
    valid := true;
    tarif := 0;

    case kelas of
      'E' : tarif := TARIF_EKONOMI;
      'B' : tarif := TARIF_BISNIS;
      'F' : tarif := TARIF_FIRST;
    else
      valid := false;
    end;

    if valid then
    begin
      total := total + tarif;
      jumlahTiket := jumlahTiket + 1;
      writeln('Tarif             : Rp ', tarif:0:0);
    end
    else
      writeln('Kelas tidak valid. Tiket tidak ditambahkan.');

    writeln;
    write('Tambah tiket lagi? (Y/T): ');
    readln(jawaban);

    if UpCase(jawaban) = 'T' then
      lagi := false;
  end;

  { Hitung diskon berdasarkan jumlah tiket }
  if jumlahTiket <= 2 then
    persenDiskon := 0
  else if jumlahTiket <= 5 then
    persenDiskon := 5
  else
    persenDiskon := 10;

  diskon := total * persenDiskon / 100;
  totalAkhir := total - diskon;

  writeln;
  writeln(GARIS_GANDA);
  writeln('RINGKASAN TRANSAKSI');
  writeln(GARIS_GANDA);
  writeln('Jumlah tiket      : ', jumlahTiket);
  writeln('Subtotal          : Rp ', total:0:2);
  writeln('Diskon (', persenDiskon, '%)     : Rp ', diskon:0:2);
  writeln(GARIS_TUNGGAL);
  writeln('Total bayar       : Rp ', totalAkhir:0:2);
  writeln(GARIS_GANDA);
end.

9.6 Contoh Keluaran

==========================================
PEMESANAN TIKET NUSANTARA AIR
==========================================

Pemesanan tiket ke-1
Nama penumpang    : Andi Wijaya
Kelas (E/B/F)     : B
Tarif             : Rp 1500000

Tambah tiket lagi? (Y/T): Y

Pemesanan tiket ke-2
Nama penumpang    : Budi Santoso
Kelas (E/B/F)     : E
Tarif             : Rp 750000

Tambah tiket lagi? (Y/T): Y

Pemesanan tiket ke-3
Nama penumpang    : Citra Dewi
Kelas (E/B/F)     : F
Tarif             : Rp 2800000

Tambah tiket lagi? (Y/T): T

==========================================
RINGKASAN TRANSAKSI
==========================================
Jumlah tiket      : 3
Subtotal          : Rp 5050000.00
Diskon (5%)     : Rp 252500.00
------------------------------------------
Total bayar       : Rp 4797500.00
==========================================

9.7 Pembahasan

Beberapa keputusan perancangan penting pada program ini.

  1. Perulangan while dengan flag lagi. Kita menggunakan variabel boolean lagi sebagai penanda. Selama lagi bernilai true, perulangan berlanjut. Ketika pengguna menjawab "T", lagi menjadi false dan perulangan berhenti.
  2. Flag vs langsung kondisi. Kita bisa menuliskan kondisi perulangan langsung sebagai while UpCase(jawaban) <> 'T' do, tetapi menggunakan flag membuat logika lebih jelas dan mudah diubah.
  3. Validasi kelas di dalam perulangan. Bila kelas tidak valid, tiket tidak ditambahkan. Total dan jumlah tiket hanya bertambah setelah kelas tervalidasi. Ini menjaga integritas data.
  4. Diskon dihitung setelah semua tiket dipesan. Karena diskon bergantung pada jumlah total tiket, kita perlu menyimpan seluruh tiket terlebih dahulu, lalu menghitung diskon di akhir. Di modul berikutnya, kita akan menggunakan array untuk menyimpan detail setiap tiket.
  5. Konversi UpCase sebelum case. Ini memastikan pengguna dapat memasukkan 'e' atau 'E' tanpa masalah.
  6. Penanganan kasus jumlahTiket = 0. Bila pengguna langsung menjawab 'T' pada permintaan pertama, total tetap 0 dan jumlahTiket tetap 0. Program tetap menampilkan ringkasan dengan nilai nol.

9.8 Pengembangan Selanjutnya

Modul Pengembangan
Modul 10Menampilkan grafik sederhana dari data transaksi
Modul 11Memindahkan proses pemesanan tiket ke prosedur terpisah
Modul 16Menyimpan setiap tiket dalam array
Modul 20Mengelompokkan data tiket dalam record
Modul 25Menyimpan data transaksi ke berkas
Modul 41Menambahkan exception handling untuk input yang salah
10

Rangkuman

Poin-poin kunci yang perlu diingat dari Modul 9

  1. Perulangan while menguji kondisi di awal. Blok mungkin tidak dieksekusi sama sekali.
  2. Perulangan repeat-until menguji kondisi di akhir. Blok selalu dieksekusi minimal satu kali.
  3. Kondisi pada while menyatakan kapan perulangan berlanjut. Kondisi pada repeat menyatakan kapan perulangan berhenti.
  4. Tiga komponen perulangan: inisialisasi sebelum loop, kondisi pada header loop, dan update variabel kontrol di dalam blok.
  5. Infinite loop terjadi ketika kondisi tidak pernah berubah. Penyebab umum: lupa update variabel kontrol atau kondisi logika yang salah.
  6. Pola validasi input berulang menggunakan repeat-until: ulangi permintaan sampai input memenuhi kriteria.
  7. Pola sentinel value menggunakan nilai khusus (misalnya -1) sebagai penanda akhir data. Sangat berguna untuk memproses data dalam jumlah tak terbatas.
  8. Pola flag boolean menggunakan variabel boolean untuk mengontrol perulangan, berguna ketika ada beberapa kondisi berhenti.
  9. Konversi antar struktur perulangan memungkinkan. Setiap for dapat ditulis ulang sebagai while, dan sebaliknya, meskipun keterbacaan bisa berbeda.
  10. Perulangan bersarang dapat dilakukan dengan while, tetapi setiap perulangan harus memiliki variabel kontrol sendiri.
  11. Titik koma sebelum until adalah kesalahan sintaks. until adalah bagian dari konstruksi repeat.
  12. Pemilihan struktur perulangan: for untuk jumlah iterasi pasti, while untuk iterasi kondisional yang mungkin nol, dan repeat untuk iterasi kondisional yang minimal satu.
Sebelum Melanjutkan

Pastikan Anda sudah dapat memilih struktur perulangan yang tepat untuk berbagai situasi. Latihan 2, 3, dan 5 adalah indikator yang baik untuk mengukur pemahaman. Modul 10 akan memperdalam perulangan bersarang, di mana Anda akan membuat pola dan matriks dengan iterasi berlapis.

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 9 membahas pernyataan while dan repeat.
  2. Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan perulangan kondisional.
  3. Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang iterasi kondisional.
  4. Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 7 membahas struktur perulangan tak terkendali.
  5. Knuth, D. E. (1997). The Art of Computer Programming, Volume 1 (3rd ed.). Addison-Wesley. Bab tentang pola iteratif dan algoritma berbasis kondisi.

Dokumentasi Resmi

  1. Free Pascal Team. Free Pascal Reference Guide. Bab tentang pernyataan while dan repeat. Tersedia di freepascal.org/docs.html.
  2. Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang struktur kontrol dan kondisi.
  3. Lazarus IDE Documentation. Panduan penggunaan perulangan pada aplikasi.

Artikel dan Sumber Daring

  1. IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang pernyataan iteratif.
  2. Wirth, N. (1971). "The Programming Language Pascal." Acta Informatica, 1(1), 35-63. Bab tentang struktur kontrol.
  3. Free Pascal Community Forum. Diskusi tentang perbedaan performa antara for, while, dan repeat.