Perulangan

Empat jenis perulangan: for / while / repeat / for-in

Silakan lihat contoh di bawah terlebih dahulu. Ubah file kode dari pelajaran sebelumnya yaitu mydemo.dpr, lalu ganti ekstensi filenya menjadi pas sehingga menjadi mydemo.pas. Ini adalah ekstensi standar untuk file sumber Pascal. Setelah itu unduh editor kode seperti Notepad++ yang mendukung pewarnaan sintaks, agar kode kamu jauh lebih mudah dibaca.

Berikut adalah contoh lengkap dengan komentar di setiap baris kode. Setelah contoh kode, kita akan jelaskan setiap perintah satu per satu secara berurutan.

// 2.8 Pernyataan perulangan: for, while, repeat, for..in
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
// Direktif kompiler FPC: aktifkan mode berorientasi objek, string panjang, nonaktifkan hitung referensi otomatis string
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
// Platform Windows: tentukan program sebagai aplikasi konsol (tanpa jendela GUI)
{$R+} // Aktifkan pemeriksaan batas rentang, sangat berguna untuk debug kesalahan indeks larik
var
  MyArray: array [0..9] of Integer; // Larik bilangan bulat dengan 10 elemen, indeks 0 sampai 9
  I: Integer; // Variabel penghitung perulangan
begin
// 1. Perulangan for urut naik: inisialisasi larik dengan nilai kuadrat bilangan 0 hingga 9
for I := 0 to 9 do
    MyArray[I] := I * I;

// 2. Perulangan for dasar untuk telusuri indeks larik dan cetak nilai kuadrat
for I := 0 to 9 do
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);

// 3. Fungsi Low/High ambil batas bawah dan atas larik secara otomatis, tidak perlu tulis 0 dan 9 secara statis, lebih mudah dikembangkan
for I := Low(MyArray) to High(MyArray) do
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);

// 4. Perulangan while: cek syarat terlebih dahulu, badan perulangan hanya dijalankan jika syarat benar
  I := 0;
while I < 10 do
begin
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);
    I := I + 1; // Tiga penulisan yang setara: I+=1 / Inc(I)
end;

// 5. Perulangan repeat-until: jalankan badan sekali terlebih dahulu, cek syarat keluar di bagian akhir
  I := 0;
repeat
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);
    Inc(I); // Tambah penghitung satu satuan
until I = 10;

// 6. Penelusuran for-in: ambil langsung nilai elemen tanpa memanipulasi indeks
for I in MyArray do
    WriteLn('Nilai kuadrat adalah ', I);
end.Code language: PHP (php)

Berikut adalah kode tanpa semua komentar

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$R+}

var
  MyArray: array [0..9] of Integer;
  I: Integer;

begin

for I := 0 to 9 do
    MyArray[I] := I * I;

for I := 0 to 9 do
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);

for I := Low(MyArray) to High(MyArray) do
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);

  I := 0;
while I < 10 do
begin
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);
    I := I + 1;
end;

  I := 0;
repeat
    WriteLn('Nilai kuadrat adalah ', MyArray[I]);
    Inc(I);
until I = 10;

for I in MyArray do
    WriteLn('Nilai kuadrat adalah ', I);

end.Code language: PHP (php)

Selanjutnya kita analisis kode setiap perulangan langkah demi langkah

Perulangan for

Memberikan nilai ke dalam larik menggunakan perulangan for

{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$R+}

var
  MyArray: array [0..9] of Integer;
  I: Integer;

begin

for I := 0 to 9 do
    MyArray[I] := I * I;

end.Code language: PHP (php)

Kode ini terbagi menjadi tiga bagian: bagian atas berisi direktif prakompilasi, bagian var untuk mendeklarasikan variabel (satu larik dan satu bilangan bulat), lalu blok eksekusi utama di antara begin dan end. yang berisi perulangan for. Perulangan ini memberikan nilai dari 0 sampai 9 ke variabel I secara berurutan lalu mengisi elemen larik melalui indeks.

Kita isi sepuluh elemen larik dari MyArray[0] hingga MyArray[9]. Tanda bintang * adalah operator perkalian.

MyArray[0] := 0 * 0;

MyArray[1] := 1 * 1;

MyArray[9] := 9 * 9;

Kemudian tambahkan satu perulangan for lain di bawah perulangan pertama untuk membaca setiap nilai elemen yang tersimpan di larik.

Setelah dikompilasi dan dijalankan, semua nilai akan tampil di layar output

Semua angka yang keluar adalah hasil kuadrat bilangan 0 hingga 9, sesuai dengan ekspektasi kita sebelumnya.

Jika kamu tidak tahu rentang indeks larik, gunakan fungsi bawaan untuk mendapatkan batas bawah dan batas atas.

Fungsi Low(NamaLarik) di atas berfungsi mengambil indeks terkecil dari sebuah larik

  • Low(Tipe/Variabel): mengambil nilai minimum / batas bawah dari tipe ordinal, larik, himpunan
  • High(Tipe/Variabel): mengambil nilai maksimum / batas atas dari tipe ordinal, larik, himpunan

Perulangan while dan repeat

Di dalam badan perulangan while yang dibungkus begin end;, variabel I akan bertambah satu di bagian akhir blok. Setelah penambahan, alur kode akan kembali ke baris while I < 10 do untuk pengecekan syarat ulang. Jika syarat benar, badan perulangan dijalankan lagi, I bertambah satu sekali lagi lalu dicek kembali. Proses ini berhenti ketika I < 10 menjadi salah, yaitu saat I bernilai 10.

Perbedaan utama antara while dan repeat-until

  1. Logika pengecekan syarat berlawanan
  • while Syarat do: syarat benar → lanjut perulangan; syarat salah → keluar perulangan
  • repeat ... until Syarat: syarat benar → keluar perulangan; syarat salah → lanjut perulangan
  1. Jumlah minimal eksekusi berbeda
  • while: jika syarat awal salah, badan perulangan tidak pernah dijalankan sama sekali
  • repeat-until: apapun syaratnya, badan perulangan pasti dijalankan minimal satu kali

Jika kamu sudah mempelajari bahasa C, C++ atau Java akan mudah paham. repeat-until fungsinya hampir sama dengan do-while. Jalankan badan sekali terlebih dahulu, lalu cek syarat setelah until; jika salah maka ulangi perulangan.

repeat-until tidak memerlukan begin dan end, karena repeat sampai until sudah menjadi satu blok kode utuh. Kamu bisa menambahkan begin end secara manual tapi tidak disarankan.

Arti harfiah dari repeat-until adalah “ulangi … sampai”, cara kerjanya mudah dipahami dari namanya sendiri.


Saat penelusuran berlangsung, semua nilai di MyArray akan diberikan ke I secara berurutan sehingga kamu bisa mengolah I langsung di dalam perulangan. Tidak perlu menambah indeks secara manual bahkan tidak perlu pakai indeks sama sekali sampai semua elemen larik selesai ditelusuri.

Penjelasan perulangan for standar (for I := ... to/downto)

  1. Mirip dengan perulangan for bahasa C namun batasannya lebih ketat, hanya bisa telusuri nilai ordinal berurutan (bilangan bulat, tipe enumerasi);
  2. Mendukung penelusuran terbalik dengan downto: for I := 9 downto 0 do;
  3. Fungsi batas Low(xx) / High(xx) hanya dihitung satu kali saat perulangan dimulai sehingga efisien saat berjalan;
  4. Setelah perulangan selesai secara normal nilai variabel I tidak terdefinisi dan kompiler akan mengeluarkan peringatan. Jika keluar lebih awal pakai Break atau Exit, I akan menyimpan angka saat itu.

Penelusuran for-in (gaya foreach modern)

Dapat menelusuri empat tipe data tanpa mengatur indeks secara manual:

  1. Larik: baca langsung setiap nilai elemen (sudah ditunjukkan di contoh sebelumnya)
  2. Tipe enumerasi
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
{$R+}

type TAnimalKind = (Duck,Cat,Dog);

var AK:TAnimalKind;
begin
  for AK in TAnimalKind do 
    WriteLn(AK);
end.Code language: PHP (php)
  1. Tipe himpunan
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}

type
  // Definisikan tipe enumerasi
  TAnimalKind = (Duck, Cat, Dog);
  // Definisikan tipe himpunan berdasarkan enumerasi
  TAnimals = set of TAnimalKind;

var
  Animals: TAnimals;
  AK: TAnimalKind;
begin
  // Berikan dua nilai enumerasi ke himpunan: Duck dan Cat
  Animals := [Duck, Cat];

  // Telusuri semua anggota yang ada di himpunan pakai for-in
  for AK in Animals do
  begin
    WriteLn('Hewan yang ditemukan: ', AK);
  end;
end.Code language: PHP (php)
  1. Daftar generik (dipelajari di bab berikutnya)
{$ifdef FPC} {$mode objfpc}{$H+}{$J-} {$endif}
{$ifdef MSWINDOWS} {$apptype CONSOLE} {$endif}
uses
  SysUtils, Generics.Collections; // Muat unit kontainer generik

type
  TMyClass = class  // Kelas buatan sendiri untuk simpan bilangan dan kuadratnya
    I, Square: Integer;
  end;
  // Buat instansi daftar objek generik dengan manajemen siklus hidup otomatis
  TMyClassList = {$ifdef FPC}specialize{$endif} TObjectList&lt;TMyClass&gt;;
var
  List: TMyClassList;
  C: TMyClass;
  I: Integer;
begin
  List := TMyClassList.Create(true); // true: hapus objek internal otomatis saat daftar dihancurkan
try
  // Buat objek dalam perulangan lalu masukkan ke daftar
for I := 0 to 9 do
begin
      C := TMyClass.Create;
      C.I := I;
      C.Square := I * I;
      List.Add(C);
end;
  // Telusuri setiap objek buatan di daftar langsung pakai for-in
for C in List do
      WriteLn('Kuadrat dari ', C.I, ' adalah ', C.Square);
finally
    FreeAndNil(List); // Hapus daftar dengan aman, cegah kebocoran memori
end;
end.
Code language: HTML, XML (xml)

Catatan: contoh ini menggunakan kelas dan generik. Pemula boleh lewati sementara, akan dijelaskan rinci di bab pemrograman berorientasi objek.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *