P Pascal dan Algoritma
Modul 10 dari 50 Roadmap
Modul 10 - Fase Dasar

Perulangan Bersarang dan Pembentukan Pola

Modul ini adalah puncak dari Fase 1. Kita akan menggabungkan seluruh struktur kontrol yang telah dipelajari: perulangan for, while, repeat, percabangan if, dan case menjadi perulangan bersarang. Anda akan menganalisis jumlah iterasi, membentuk pola bintang, segitiga, piramida, tabel perkalian, dan matriks sebagai latihan penalaran iteratif yang menjadi dasar pemrosesan data dua dimensi.

Estimasi 140 menit Tingkat Menengah 4 Flowchart 6 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 bersarang dan strukturnya.
  2. Menulis perulangan for bersarang dengan variabel pencacah yang berbeda.
  3. Menghitung jumlah iterasi total pada perulangan bersarang.
  4. Membentuk pola bintang persegi, segitiga, dan piramida.
  5. Membuat tabel perkalian dan tabel konversi berformat rapi.
  6. Memproses matriks dua dimensi dengan perulangan bersarang.
  7. Menggabungkan perulangan for, while, dan repeat dalam satu program.
  8. Menggambar flowchart perulangan bersarang.
  9. Menghindari kesalahan umum pada perulangan bersarang.
  10. Memecahkan masalah nyata yang memerlukan iterasi dua dimensi.
02

Capaian Pembelajaran

Indikator ketercapaian dan kaitan dengan modul selanjutnya

Capaian Pembelajaran Mata Kuliah

Mahasiswa mampu merancang dan mengimplementasikan algoritma iteratif berlapis untuk pemrosesan data dua dimensi, pembentukan pola visual, dan pemodelan masalah nyata yang memerlukan kombinasi struktur kontrol.

Indikator Ketercapaian Modul

Kode Indikator Bukti
IK-10.1 Menulis perulangan bersarang for dengan benar Latihan 1 dan 2
IK-10.2 Menghitung jumlah iterasi perulangan bersarang Latihan 1 dan 5
IK-10.3 Membentuk pola bintang dan piramida Latihan 3
IK-10.4 Memproses matriks dengan perulangan bersarang Latihan 4 dan studi kasus
IK-10.5 Menggabungkan berbagai struktur kontrol Latihan 5 dan studi kasus
Selamat, Anda Menyelesaikan Fase 1

Setelah modul ini, Anda telah menguasai seluruh fondasi pemrograman Pascal: tipe data, operator, input/output, percabangan, dan perulangan. Fase 2 akan mulai membahas modularisasi program melalui prosedur dan fungsi (Modul 11-15) serta struktur data array dan record (Modul 16-22).

03

Materi Teori

Konsep perulangan bersarang, analisis iterasi, dan pembentukan pola

3.1 Konsep Perulangan Bersarang

Perulangan bersarang (nested loop) adalah perulangan yang berada di dalam perulangan lain. Perulangan luar (outer loop) dieksekusi lebih dahulu, dan untuk setiap iterasinya, perulangan dalam (inner loop) akan dijalankan dari awal hingga selesai.

Perulangan bersarang digunakan ketika kita perlu memproses data dua dimensi: baris dan kolom, pasangan nilai, atau kombinasi dari dua himpunan. Contoh klasik adalah tabel perkalian, matriks, dan pola bintang.

nested_dasar.pasPascal
var
  i, j: integer;

begin
  for i := 1 to 3 do
  begin
    for j := 1 to 3 do
      write(i, '-', j, '  ');
    writeln;       { Pindah baris setelah inner loop selesai }
  end;
end.

Keluaran:

1-1 1-2 1-3 2-1 2-2 2-3 3-1 3-2 3-3

3.2 Analisis Jumlah Iterasi

Jumlah iterasi total pada perulangan bersarang adalah hasil kali jumlah iterasi masing-masing perulangan. Bila outer loop berjalan m kali dan inner loop berjalan n kali, maka total iterasi inner loop adalah m × n.

Outer Loop Inner Loop Total Iterasi Inner
1..3 (3 kali)1..3 (3 kali)9 kali
1..5 (5 kali)1..5 (5 kali)25 kali
1..3 (3 kali)1..i (variabel)1+2+3 = 6 kali
1..n1..mn × m
Analisis Kompleksitas

Perulangan bersarang dengan dua loop masing-masing n iterasi memiliki kompleksitas O(n²). Ini adalah salah satu sumber utama algoritma yang lambat, dan akan menjadi pertimbangan penting pada Modul 34. Untuk n kecil (misalnya kurang dari 1000), O(n²) masih dapat diterima. Untuk n besar, kita perlu mencari algoritma yang lebih efisien.

3.3 Bentuk-Bentuk Perulangan Bersarang

Perulangan bersarang tidak harus for di dalam for. Kita dapat mengombinasikan berbagai jenis perulangan.

Kombinasi Kapan Digunakan
for di dalam for Iterasi dua dimensi dengan batas tetap, seperti matriks dan tabel
for di dalam while Iterasi data yang jumlahnya tidak diketahui, dengan sub-iterasi berbatas
while di dalam for Untuk setiap baris, ulangi sampai kondisi terpenuhi
repeat di dalam for Untuk setiap iterasi, ulangi minimal satu kali sampai kondisi

3.4 Pola Bintang Sederhana

Pola bintang adalah latihan klasik perulangan bersarang. Outer loop mengontrol baris, inner loop mengontrol kolom.

a. Pola Persegi

Setiap baris memiliki jumlah bintang yang sama.

pola_persegi.pasPascal
var
  i, j, n: integer;

begin
  write('Ukuran: ');  readln(n);

  for i := 1 to n do
  begin
    for j := 1 to n do
      write('*');
    writeln;
  end;
end.

Keluaran untuk n = 5:

***** ***** ***** ***** *****

b. Segitiga Siku-Siku (Kiri Bawah)

Baris ke-i memiliki i bintang. Inner loop berjalan dari 1 hingga i.

segitiga_kiri.pasPascal
var
  i, j, n: integer;

begin
  write('Tinggi: ');  readln(n);

  for i := 1 to n do
  begin
    for j := 1 to i do
      write('*');
    writeln;
  end;
end.

Keluaran untuk n = 5:

* ** *** **** *****

c. Segitiga Siku-Siku (Kanan Bawah)

Baris ke-i memiliki (n - i) spasi lalu i bintang.

segitiga_kanan.pasPascal
var
  i, j, n: integer;

begin
  write('Tinggi: ');  readln(n);

  for i := 1 to n do
  begin
    for j := 1 to (n - i) do
      write(' ');
    for j := 1 to i do
      write('*');
    writeln;
  end;
end.

Keluaran untuk n = 5:

* ** *** **** *****

d. Piramida Sama Kaki

Baris ke-i memiliki (n - i) spasi lalu (2i - 1) bintang. Pola 1, 3, 5, 7, 9 terbentuk dari rumus (2i - 1).

piramida.pasPascal
var
  i, j, n: integer;

begin
  write('Tinggi: ');  readln(n);

  for i := 1 to n do
  begin
    for j := 1 to (n - i) do
      write(' ');
    for j := 1 to (2 * i - 1) do
      write('*');
    writeln;
  end;
end.

Keluaran untuk n = 5:

* *** ***** ******* *********

e. Piramida Terbalik

piramida_terbalik.pasPascal
var
  i, j, n: integer;

begin
  write('Tinggi: ');  readln(n);

  for i := n downto 1 do
  begin
    for j := 1 to (n - i) do
      write(' ');
    for j := 1 to (2 * i - 1) do
      write('*');
    writeln;
  end;
end.

Keluaran untuk n = 5:

********* ******* ***** *** *

3.5 Tabel Perkalian dan Tabel Konversi

Perulangan bersarang sangat berguna untuk menghasilkan tabel berformat. Setiap baris adalah kombinasi dari dua nilai.

tabel_perkalian_full.pasPascal
var
  i, j: integer;

begin
  write('    ');
  for j := 1 to 10 do
    write(j:5);
  writeln;
  writeln('---------------------------------------------');

  for i := 1 to 10 do
  begin
    write(i:3, ' |');
    for j := 1 to 10 do
      write((i * j):5);
    writeln;
  end;
end.

Keluaran (sebagian):

1 2 3 4 5 6 7 8 9 10 --------------------------------------------- 1 | 1 2 3 4 5 6 7 8 9 10 2 | 2 4 6 8 10 12 14 16 18 20 3 | 3 6 9 12 15 18 21 24 27 30 ...

3.6 Matriks Dua Dimensi

Matriks adalah kumpulan nilai yang disusun dalam baris dan kolom. Meskipun kita belum mempelajari array (Modul 16), kita dapat mensimulasikan operasi matriks dengan perulangan bersarang.

matriks_sederhana.pasPascal
var
  i, j, baris, kolom: integer;

begin
  write('Jumlah baris: ');  readln(baris);
  write('Jumlah kolom: ');  readln(kolom);

  for i := 1 to baris do
  begin
    for j := 1 to kolom do
      write((i * 10 + j):5);
    writeln;
  end;
end.

Keluaran untuk baris = 3, kolom = 4:

11 12 13 14 21 22 23 24 31 32 33 34

Pola i * 10 + j menghasilkan nilai unik untuk setiap posisi. Ini adalah salah satu cara untuk memberi label setiap sel tanpa menggunakan array.

3.7 Kombinasi Struktur Perulangan

Kita dapat mengombinasikan for, while, dan repeat dalam satu program untuk memodelkan masalah yang lebih kompleks.

kombinasi_loop.pasPascal
{ Mencetak bilangan prima kurang dari 30 }
var
  n, i: integer;
  prima: boolean;

begin
  for n := 2 to 30 do
  begin
    prima := true;
    i := 2;
    while (i * i <= n) and prima do
    begin
      if n mod i = 0 then
        prima := false;
      i := i + 1;
    end;

    if prima then
      write(n, ' ');
  end;

  writeln;
end.

Keluaran:

2 3 5 7 11 13 17 19 23 29

3.8 Menggambar Grafik Sederhana

Perulangan bersarang dapat dipakai untuk menggambar grafik batang (bar chart) sederhana dari data numerik.

grafik_batang.pasPascal
var
  nilai: array[1..5] of integer;
  i, j: integer;

begin
  writeln('Masukkan 5 nilai (0-20):');
  for i := 1 to 5 do
  begin
    write('Nilai ke-', i, ': ');
    readln(nilai[i]);
  end;

  writeln;
  for i := 1 to 5 do
  begin
    write('Baris ', i, ': ');
    for j := 1 to nilai[i] do
      write('#');
    writeln(' (', nilai[i], ')');
  end;
end.

Contoh keluaran:

Baris 1: ######## (8) Baris 2: ############### (15) Baris 3: ###### (6) Baris 4: #################### (20) Baris 5: ############ (12)
Catatan: Array Pratinjau

Contoh ini menggunakan array (array[1..5] of integer) yang baru akan dibahas resmi pada Modul 16. Untuk sementara, cukup pahami bahwa setiap variabel array menyimpan beberapa nilai yang diakses dengan indeks.

3.9 Kesalahan Umum pada Perulangan Bersarang

  1. Menggunakan variabel pencacah yang sama. Kedua perulangan harus menggunakan variabel berbeda (i dan j). Menggunakan i pada keduanya akan merusak inner loop.
  2. Lupa writeln; setelah inner loop. Semua data akan tercetak dalam satu baris tanpa pemisah baris.
  3. Lupa begin...end pada outer loop. Inner loop dianggap satu-satunya pernyataan, dan writeln menjadi di luar outer loop.
  4. Menukar outer dan inner loop. Menghasilkan pola yang berbeda dari yang diinginkan.
  5. Inner loop tidak dieksekusi. Kondisi inner loop mungkin sudah salah sejak awal, misalnya for j := 5 downto 1 ketika batasnya 1.
  6. Mengubah pencacah outer di dalam inner. Merusak integritas iterasi dan biasanya merupakan kesalahan kompilasi.
  7. Kesalahan off-by-one. Rentang yang salah, misalnya 1..n-1 ketika seharusnya 1..n.
  8. Menggunakan variabel pencacah setelah inner loop. Nilai pencacah inner tidak dapat diandalkan setelah blok selesai.

3.10 Kapan Menggunakan Perulangan Bersarang

3.11 Perbedaan Free Pascal dan Turbo Pascal

Aspek Turbo Pascal Free Pascal
Nested loop Didukung penuh Didukung penuh
Kedalaman nesting Terbatas (biasanya 16 tingkat) Praktis tidak terbatas
Optimasi jump table Tidak ada Ada untuk case bersarang
Kinerja loop bersarang Relatif lebih lambat (16-bit) Lebih cepat (32/64-bit)
04

Algoritma dan Flowchart

Representasi visual perulangan bersarang

4.1 Flowchart Perulangan Bersarang Umum

flowchart TD
    A(["Mulai"]) --> B["i = 1"]
    B --> C{"i <= n?"}
    C -- "Tidak" --> Z(["Selesai"])
    C -- "Ya" --> D["j = 1"]
    D --> E{"j <= m?"}
    E -- "Tidak" --> Y["Pindah baris
i = i + 1"] Y --> C E -- "Ya" --> F["Proses(i, j)"] F --> G["j = j + 1"] G --> E

Gambar 4.1 - Flowchart perulangan bersarang umum

4.2 Flowchart Segitiga Siku-Siku Kiri Bawah

flowchart TD
    A(["Mulai"]) --> B[/"Baca n"/]
    B --> C["i = 1"]
    C --> D{"i <= n?"}
    D -- "Tidak" --> Z(["Selesai"])
    D -- "Ya" --> E["j = 1"]
    E --> F{"j <= i?"}
    F -- "Tidak" --> Y["writeln
i = i + 1"] Y --> D F -- "Ya" --> G["write('*')"] G --> H["j = j + 1"] H --> F

Gambar 4.2 - Flowchart segitiga siku-siku dengan batas inner loop bergantung outer loop

4.3 Flowchart Piramida Sama Kaki

flowchart TD
    A(["Mulai"]) --> B[/"Baca n"/]
    B --> C["i = 1"]
    C --> D{"i <= n?"}
    D -- "Tidak" --> Z(["Selesai"])
    D -- "Ya" --> E["Cetak spasi
n-i kali"] E --> F["Cetak bintang
2i-1 kali"] F --> G["writeln"] G --> H["i = i + 1"] H --> D

Gambar 4.3 - Flowchart piramida dengan spasi dan bintang

4.4 Flowchart Tabel Perkalian

flowchart TD
    A(["Mulai"]) --> B["Cetak header kolom"]
    B --> C["Cetak garis pemisah"]
    C --> D["i = 1"]
    D --> E{"i <= 10?"}
    E -- "Tidak" --> Z(["Selesai"])
    E -- "Ya" --> F["Cetak nomor baris"]
    F --> G["j = 1"]
    G --> H{"j <= 10?"}
    H -- "Tidak" --> Y["writeln
i = i + 1"] Y --> E H -- "Ya" --> I["Cetak i * j"] I --> J["j = j + 1"] J --> H

Gambar 4.4 - Flowchart tabel perkalian 10x10

05

Pseudocode

Representasi algoritmik perulangan bersarang

5.1 Pseudocode Segitiga Siku-Siku

PROGRAM SegitigaSikuSiku
{ Mencetak segitiga siku-siku dengan bintang }

DEKLARASI
  n : integer
  i, j : integer

ALGORITMA
  write("Tinggi segitiga: ")
  read(n)

  untuk i <- 1 sampai n lakukan
    untuk j <- 1 sampai i lakukan
      write("*")
    akhir untuk
    write("")
  akhir untuk
END

5.2 Pseudocode Piramida Sama Kaki

PROGRAM Piramida
{ Mencetak piramida sama kaki dengan bintang }

DEKLARASI
  n : integer
  i, j : integer

ALGORITMA
  write("Tinggi piramida: ")
  read(n)

  untuk i <- 1 sampai n lakukan
    { Cetak spasi kosong }
    untuk j <- 1 sampai (n - i) lakukan
      write(" ")
    akhir untuk

    { Cetak bintang }
    untuk j <- 1 sampai (2 * i - 1) lakukan
      write("*")
    akhir untuk

    write("")
  akhir untuk
END

5.3 Pseudocode Tabel Perkalian Lengkap

PROGRAM TabelPerkalian
{ Mencetak tabel perkalian 1 sampai 10 }

DEKLARASI
  i, j : integer

ALGORITMA
  { Cetak header baris kolom }
  write("    ")
  untuk j <- 1 sampai 10 lakukan
    write(j dengan lebar 5)
  akhir untuk
  write("")
  write("---------------------------------------------")

  { Cetak isi tabel }
  untuk i <- 1 sampai 10 lakukan
    write(i dengan lebar 3, " |")
    untuk j <- 1 sampai 10 lakukan
      write((i * j) dengan lebar 5)
    akhir untuk
    write("")
  akhir untuk
END

5.4 Pseudocode Bilangan Prima Sampai N

PROGRAM PrimaSampaiN
{ Mencetak semua bilangan prima dari 2 sampai n }

DEKLARASI
  n       : integer
  i, j    : integer
  prima   : boolean

ALGORITMA
  write("Batas atas: ")
  read(n)

  untuk i <- 2 sampai n lakukan
    prima <- true
    j <- 2

    selama (j * j <= i) dan (prima = true) lakukan
      jika i mod j = 0 maka
        prima <- false
      akhir jika
      j <- j + 1
    akhir selama

    jika prima = true maka
      write(i, " ")
    akhir jika
  akhir untuk

  write("")
END
06

Contoh Kode Pascal Lengkap

Enam program untuk mendemonstrasikan perulangan bersarang

6.1 Program Pola Persegi dan Segitiga

pola_dasar.pas Pascal
program PolaDasar;
{ Mendemonstrasikan pola persegi dan segitiga dengan perulangan bersarang }

var
  n, i, j: integer;

begin
  write('Ukuran pola: ');
  readln(n);

  writeln;
  writeln('=== Pola Persegi ===');
  for i := 1 to n do
  begin
    for j := 1 to n do
      write('* ');
    writeln;
  end;

  writeln;
  writeln('=== Segitiga Siku-Siku Kiri ===');
  for i := 1 to n do
  begin
    for j := 1 to i do
      write('* ');
    writeln;
  end;

  writeln;
  writeln('=== Segitiga Siku-Siku Kanan ===');
  for i := 1 to n do
  begin
    for j := 1 to (n - i) do
      write('  ');
    for j := 1 to i do
      write('* ');
    writeln;
  end;
end.

Contoh keluaran untuk n = 5:

=== Pola Persegi === * * * * * * * * * * * * * * * * * * * * * * * * * === Segitiga Siku-Siku Kiri === * * * * * * * * * * * * * * * === Segitiga Siku-Siku Kanan === * * * * * * * * * * * * * * *

6.2 Program Piramida Sama Kaki

piramida_lengkap.pas Pascal
program PiramidaLengkap;
{ Mencetak piramida sama kaki dengan perulangan bersarang }

var
  n, i, j: integer;

begin
  write('Tinggi piramida: ');
  readln(n);

  writeln;
  writeln('=== Piramida ===');
  for i := 1 to n do
  begin
    { Cetak spasi kosong }
    for j := 1 to (n - i) do
      write('  ');

    { Cetak bintang }
    for j := 1 to (2 * i - 1) do
      write('* ');

    writeln;
  end;

  writeln;
  writeln('=== Piramida Terbalik ===');
  for i := n downto 1 do
  begin
    for j := 1 to (n - i) do
      write('  ');
    for j := 1 to (2 * i - 1) do
      write('* ');
    writeln;
  end;
end.

Contoh keluaran untuk n = 5:

=== Piramida === * * * * * * * * * * * * * * * * * * * * * * * * * === Piramida Terbalik === * * * * * * * * * * * * * * * * * * * * * * * * *

6.3 Program Tabel Perkalian Lengkap

tabel_perkalian.pas Pascal
program TabelPerkalian;
{ Mencetak tabel perkalian 1 sampai 10 dengan format rapi }

var
  i, j: integer;

begin
  writeln('Tabel Perkalian 1 sampai 10');
  writeln('==============================================');

  { Header kolom }
  write('    ');
  for j := 1 to 10 do
    write(j:5);
  writeln;

  writeln('==============================================');

  { Isi tabel }
  for i := 1 to 10 do
  begin
    write(i:3, ' |');
    for j := 1 to 10 do
      write((i * j):5);
    writeln;
  end;

  writeln('==============================================');
end.

Contoh keluaran:

Tabel Perkalian 1 sampai 10 ============================================== 1 2 3 4 5 6 7 8 9 10 ============================================== 1 | 1 2 3 4 5 6 7 8 9 10 2 | 2 4 6 8 10 12 14 16 18 20 3 | 3 6 9 12 15 18 21 24 27 30 4 | 4 8 12 16 20 24 28 32 36 40 ...

6.4 Program Bilangan Prima Sampai N

prima_sampai_n.pas Pascal
program PrimaSampaiN;
{ Mencetak semua bilangan prima dari 2 sampai n }

var
  n, i, j: integer;
  prima: boolean;

begin
  write('Batas atas: ');
  readln(n);

  writeln;
  writeln('Bilangan prima dari 2 sampai ', n, ':');

  for i := 2 to n do
  begin
    prima := true;
    j := 2;

    while (j * j <= i) and prima do
    begin
      if i mod j = 0 then
        prima := false;
      j := j + 1;
    end;

    if prima then
      write(i, ' ');
  end;

  writeln;
end.

Contoh keluaran untuk n = 50:

Bilangan prima dari 2 sampai 50: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

6.5 Program Tabel Konversi Suhu

tabel_suhu.pas Pascal
program TabelSuhu;
{ Mencetak tabel konversi suhu Celsius ke Fahrenheit dan Kelvin }

var
  celsius, fahrenheit, kelvin: double;
  i: integer;

begin
  writeln('Tabel Konversi Suhu');
  writeln('======================================');
  writeln('Celsius   Fahrenheit      Kelvin');
  writeln('--------------------------------------');

  for i := 0 to 10 do
  begin
    celsius := i * 10;
    fahrenheit := (celsius * 9 / 5) + 32;
    kelvin := celsius + 273.15;

    writeln(celsius:7:1, fahrenheit:13:2, kelvin:12:2);
  end;

  writeln('======================================');
end.

Contoh keluaran (sebagian):

Tabel Konversi Suhu ====================================== Celsius Fahrenheit Kelvin -------------------------------------- 0.0 32.00 273.15 10.0 50.00 283.15 20.0 68.00 293.15 30.0 86.00 303.15 ... 100.0 212.00 373.15 ======================================

6.6 Program Matriks Perkalian

matriks_perkalian.pas Pascal
program MatriksPerkalian;
{ Menampilkan matriks berisi hasil kali indeks baris dan kolom }

var
  baris, kolom, i, j: integer;

begin
  write('Jumlah baris: ');  readln(baris);
  write('Jumlah kolom: ');  readln(kolom);

  writeln;
  writeln('Matriks Perkalian ', baris, ' x ', kolom);
  writeln('-----------------------------------------');

  for i := 1 to baris do
  begin
    for j := 1 to kolom do
      write((i * j):6);
    writeln;
  end;

  writeln('-----------------------------------------');
end.

Contoh keluaran untuk 4 x 5:

Matriks Perkalian 4 x 5 ----------------------------------------- 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 -----------------------------------------
07

Penjelasan Kode Baris per Baris

Membedah program PolaDasar dan PrimaSampaiN secara rinci

7.1 Program PolaDasar — Bagian Segitiga Siku-Siku Kiri

Baris Kode Penjelasan
5-6 n, i, j: integer; Tiga variabel integer. n menyimpan ukuran, i adalah pencacah baris (outer), dan j adalah pencacah kolom (inner).
17-22 for i := 1 to n do
begin
for j := 1 to i do
write('* ');
writeln;
end;
Blok utama segitiga. Outer loop i berjalan dari 1 sampai n. Untuk setiap baris, inner loop j berjalan dari 1 sampai i. Batas inner loop bergantung pada outer loop: baris ke-i memiliki i bintang.
19 for j := 1 to i do Baris kunci yang membuat pola segitiga. Perhatikan i di sini, bukan n. Inilah yang membedakan segitiga dari persegi.
20 write('* '); Menggunakan write (bukan writeln) agar bintang tercetak pada baris yang sama. Spasi setelah bintang membuat jarak antar karakter agar terlihat lebih rapi.
21 writeln; Pindah ke baris berikutnya setelah inner loop selesai. Tanpa baris ini, semua bintang akan tercetak dalam satu baris panjang.
24-30 for i := 1 to n do
begin
for j := 1 to (n - i) do
write(' ');
for j := 1 to i do
write('* ');
writeln;
end;
Blok segitiga kanan. Untuk setiap baris, pertama cetak spasi sebanyak (n - i), lalu cetak bintang sebanyak i. Hasilnya, baris pertama memiliki paling banyak spasi, baris terakhir tidak ada spasi.

7.2 Program PrimaSampaiN

Baris Kode Penjelasan
5-7 n, i, j: integer;
prima: boolean;
Variabel prima bertipe boolean untuk menyimpan status apakah i adalah bilangan prima.
14-15 for i := 2 to n do
begin
Outer loop mengiterasi setiap kandidat bilangan dari 2 sampai n. Dimulai dari 2 karena 1 bukan prima.
16 prima := true; Inisialisasi asumsi. Kita mulai dengan asumsi i adalah prima, dan akan dibuktikan sebaliknya.
17 j := 2; Inisialisasi pencacah untuk while. Kita mulai dari 2 karena setiap bilangan habis dibagi 1.
19 while (j * j <= i) and prima do Kondisi while yang cerdas. Kita hanya perlu memeriksa pembagi sampai akar kuadrat dari i. Bila tidak ada pembagi hingga akar kuadrat, i pasti prima. Kondisi kedua prima memungkinkan keluar lebih awal ketika sudah ditemukan pembagi.
21-22 if i mod j = 0 then
prima := false;
Bila i habis dibagi j, i bukan prima. Kita tidak langsung keluar, melainkan menandai prima := false agar while berhenti pada iterasi berikutnya.
23 j := j + 1; Update variabel kontrol while. Tanpa baris ini, terjadi infinite loop.
26-27 if prima then
write(i, ' ');
Setelah while selesai, kita memeriksa status. Bila masih prima, cetak i. Perhatikan spasi sebagai pemisah.

7.3 Jejak Eksekusi PrimaSampaiN untuk i = 9

Iterasi j j*j <= 9? prima? 9 mod j Aksi
Awal2Ya (4 ≤ 9)TRUE1Lanjut
12YaTRUE1j = 3
23Ya (9 ≤ 9)TRUE0prima = FALSE, j = 4
34Tidak, prima FALSEFALSE-Keluar loop

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

Pelajaran Kunci

Perulangan bersarang memungkinkan kita memodelkan masalah dua dimensi dengan elegan. Kunci utamanya adalah memahami hubungan antara outer dan inner loop: apakah batas inner loop tetap (seperti matriks), bergantung pada outer (seperti segitiga), atau dikombinasikan dengan kondisi lain (seperti pencarian prima).

08

Latihan Soal

Lima soal dengan tingkat kesulitan bertingkat

1

Analisis Iterasi Perulangan Bersarang

Mudah

Hitung jumlah total iterasi inner loop untuk setiap perulangan bersarang berikut, lalu verifikasi dengan menulis program Pascal yang mencetak hasilnya.

  1. for i := 1 to 5 do for j := 1 to 5 do ...
  2. for i := 1 to 5 do for j := 1 to i do ...
  3. for i := 1 to 5 do for j := i to 5 do ...
  4. for i := 1 to 3 do for j := 1 to 4 do for k := 1 to 2 do ...
  5. for i := 5 downto 1 do for j := 1 to i do ...

Pertanyaan analisis: mengapa jumlah total iterasi pada soal nomor 4 adalah perkalian dari ketiga batas?

2

Pola Bintang Beragam

Mudah

Buat program yang menerima tinggi n dan mencetak empat pola berikut secara berurutan:

Pola A — Segitiga kanan atas:

***** **** *** ** *

Pola B — Piramida:

* *** ***** ******* *********

Pola C — Belah ketupat:

* *** ***** ******* ********* ******* ***** *** *

Pola D — Segitiga Pascal sederhana (angka):

1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

Pertanyaan analisis: bagaimana pola belah ketupat dapat dibuat dengan menggabungkan dua pola piramida?

3

Tabel Perkalian dengan Format Kustom

Sedang

Buat program yang menampilkan tabel perkalian 1 sampai n, di mana n dimasukkan oleh pengguna. Format yang diharapkan:

  • Header kolom berisi angka 1 sampai n dengan lebar field 6.
  • Setiap baris diawali dengan nomor baris diikuti tanda "|".
  • Nilai sel adalah hasil kali baris × kolom.
  • Garis pemisah ganda menggunakan karakter "=" untuk header dan "-" untuk baris.

Contoh keluaran untuk n = 5:

Tabel Perkalian 1 sampai 5 ============================ 1 2 3 4 5 ---------------------------- 1 | 1 2 3 4 5 2 | 2 4 6 8 10 3 | 3 6 9 12 15 4 | 4 8 12 16 20 5 | 5 10 15 20 25 ============================

Pertanyaan analisis: mengapa lebar field untuk nilai sel harus cukup besar (misalnya 5 atau 6) ketika n juga besar?

4

Matriks Identitas dan Matriks Segitiga

Sedang

Buat program yang menerima ukuran n dan mencetak tiga jenis matriks n × n:

  • Matriks identitas: berisi 1 pada diagonal utama dan 0 di posisi lain.
  • Matriks segitiga atas: berisi 1 pada posisi (i, j) dengan i ≤ j, dan 0 di posisi lain.
  • Matriks segitiga bawah: berisi 1 pada posisi (i, j) dengan i ≥ j, dan 0 di posisi lain.

Contoh untuk n = 4:

Matriks Identitas: 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 Matriks Segitiga Atas: 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 Matriks Segitiga Bawah: 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1

Pertanyaan analisis: bagaimana kondisi i = j, i <= j, dan i >= j menentukan posisi nilai 1?

5

Deteksi Kesalahan Perulangan Bersarang

Sulit

Program berikut dimaksudkan untuk mencetak pola piramida, tetapi memiliki tujuh kesalahan sintaks atau logika. Temukan semuanya, lalu tuliskan versi yang benar.

kacau_nested.pasPascal
program KacauNested;

var
  n, i, j: integer;

begin
  write('Tinggi: ');
  readln(n);

  for i := 1 to n do;
  begin
    for j := 1 to (n - i) do
      write(' ');
    for j := 1 to i do
      write('* ')
    writeln;
  end;

  for i := n to 1 do
  begin
    for j := 1 to n - i do
      write(' ');
    for j := 1 to 2 * i - 1 do
      write('*');
    writeln;
  end;
end.

Ketentuan:

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

Pertanyaan analisis: setelah kesalahan diperbaiki, apakah pola yang dihasilkan sudah benar? Jelaskan mengapa perulangan kedua seharusnya menggunakan downto bukan to untuk mencetak piramida terbalik.

09

Studi Kasus

Papan Jadwal Kuliah dan Laporan Visual

9.1 Deskripsi Masalah

Universitas "Cendekia Nusantara" ingin membuat papan jadwal kuliah mingguan untuk program studi Teknik Informatika. Papan menampilkan jadwal dalam format grid dengan baris sebagai slot waktu dan kolom sebagai hari. Program juga membuat ringkasan visual berupa grafik batang yang menunjukkan berapa banyak kelas pada setiap hari.

9.2 Struktur Data dan Aturan

Aspek Keterangan
Hari5 hari (Senin - Jumat)
Slot waktu4 slot (08:00, 10:00, 13:00, 15:00)
Status slotTerisi (X) atau Kosong (-)
Grafik batangSetiap kelas direpresentasikan dengan karakter '#'

Untuk studi kasus ini, jadwal disimpan dalam matriks boolean yang disimulasikan. Karena array belum dibahas, kita gunakan pendekatan sederhana: setiap slot diisi berdasarkan aturan tetap.

9.3 Flowchart Studi Kasus

flowchart TD
    A(["Mulai"]) --> B["Cetak header hari"]
    B --> C["i = 1 (slot)"]
    C --> D{"i <= jumlahSlot?"}
    D -- "Tidak" --> L["Cetak grafik batang"]
    D -- "Ya" --> E["Cetak label slot waktu"]
    E --> F["j = 1 (hari)"]
    F --> G{"j <= jumlahHari?"}
    G -- "Tidak" --> K["writeln, i = i + 1"]
    K --> D
    G -- "Ya" --> H{"Slot terisi?"}
    H -- "Ya" --> I["Cetak '[X]'"]
    H -- "Tidak" --> J["Cetak '[ ]'"]
    I --> N["j = j + 1"]
    J --> N
    N --> G
    L --> M(["Selesai"])
      

Gambar 9.1 - Flowchart papan jadwal kuliah dengan grid

9.4 Pseudocode Studi Kasus

PROGRAM PapanJadwal
{ Menampilkan jadwal kuliah mingguan dan grafik batang }

KONSTANTA
  JUMLAH_HARI = 5
  JUMLAH_SLOT = 4
  GARIS_GANDA = "=============================================================="
  GARIS_TUNGGAL = "--------------------------------------------------------------"

DEKLARASI
  hari   : array[1..5] of string
  slot   : array[1..4] of string
  isi    : array[1..4, 1..5] of boolean
  i, j   : integer
  jumlahKelas : integer

ALGORITMA
  hari[1] <- "Senin"
  hari[2] <- "Selasa"
  hari[3] <- "Rabu"
  hari[4] <- "Kamis"
  hari[5] <- "Jumat"

  slot[1] <- "08:00"
  slot[2] <- "10:00"
  slot[3] <- "13:00"
  slot[4] <- "15:00"

  { Inisialisasi jadwal }
  untuk i <- 1 sampai JUMLAH_SLOT lakukan
    untuk j <- 1 sampai JUMLAH_HARI lakukan
      isi[i, j] <- false
    akhir untuk
  akhir untuk

  isi[1, 1] <- true
  isi[1, 3] <- true
  isi[2, 2] <- true
  isi[2, 4] <- true
  isi[3, 1] <- true
  isi[3, 5] <- true
  isi[4, 2] <- true
  isi[4, 3] <- true

  { Cetak header }
  write(GARIS_GANDA)
  write("           JADWAL KULIAH TEKNIK INFORMATIKA")
  write(GARIS_GANDA)
  write("Slot    |", ...)   { header hari }

  { Cetak isi grid }
  untuk i <- 1 sampai JUMLAH_SLOT lakukan
    write(slot[i] lebar 7, " |")
    untuk j <- 1 sampai JUMLAH_HARI lakukan
      jika isi[i, j] = true maka
        write("[X]  ")
      selain itu
        write("[ ]  ")
      akhir jika
    akhir untuk
    write("")
  akhir untuk

  write(GARIS_GANDA)

  { Cetak grafik batang }
  write("")
  write("JUMLAH KELAS PER HARI:")
  write(GARIS_TUNGGAL)

  untuk j <- 1 sampai JUMLAH_HARI lakukan
    jumlahKelas <- 0
    untuk i <- 1 sampai JUMLAH_SLOT lakukan
      jika isi[i, j] = true maka
        jumlahKelas <- jumlahKelas + 1
      akhir jika
    akhir untuk

    write(hari[j] lebar 8, ": ")
    untuk i <- 1 sampai jumlahKelas lakukan
      write("#")
    akhir untuk
    write(" (", jumlahKelas, ")")
  akhir untuk

  write(GARIS_TUNGGAL)
END

9.5 Implementasi dalam Pascal

papan_jadwal.pas Pascal
program PapanJadwal;
{ Studi Kasus Modul 10 - Papan jadwal kuliah dan grafik batang }

const
  JUMLAH_HARI   = 5;
  JUMLAH_SLOT   = 4;
  GARIS_GANDA   = '==============================================================';
  GARIS_TUNGGAL = '--------------------------------------------------------------';

type
  ArrHari = array[1..JUMLAH_HARI] of string[8];
  ArrSlot = array[1..JUMLAH_SLOT] of string[8];
  ArrIsi  = array[1..JUMLAH_SLOT, 1..JUMLAH_HARI] of boolean;

var
  hari   : ArrHari;
  slot   : ArrSlot;
  isi    : ArrIsi;
  i, j, jumlahKelas: integer;

begin
  hari[1] := 'Senin';
  hari[2] := 'Selasa';
  hari[3] := 'Rabu';
  hari[4] := 'Kamis';
  hari[5] := 'Jumat';

  slot[1] := '08:00';
  slot[2] := '10:00';
  slot[3] := '13:00';
  slot[4] := '15:00';

  { Inisialisasi semua slot kosong }
  for i := 1 to JUMLAH_SLOT do
    for j := 1 to JUMLAH_HARI do
      isi[i, j] := false;

  { Isi beberapa slot dengan kelas }
  isi[1, 1] := true;   { Senin 08:00 }
  isi[1, 3] := true;   { Rabu 08:00 }
  isi[2, 2] := true;   { Selasa 10:00 }
  isi[2, 4] := true;   { Kamis 10:00 }
  isi[3, 1] := true;   { Senin 13:00 }
  isi[3, 5] := true;   { Jumat 13:00 }
  isi[4, 2] := true;   { Selasa 15:00 }
  isi[4, 3] := true;   { Rabu 15:00 }

  { Cetak header }
  writeln(GARIS_GANDA);
  writeln('           JADWAL KULIAH TEKNIK INFORMATIKA');
  writeln(GARIS_GANDA);

  write('Slot    |');
  for j := 1 to JUMLAH_HARI do
    write(hari[j]:8);
  writeln;
  writeln(GARIS_TUNGGAL);

  { Cetak isi grid }
  for i := 1 to JUMLAH_SLOT do
  begin
    write(slot[i]:7, ' |');
    for j := 1 to JUMLAH_HARI do
    begin
      if isi[i, j] then
        write('[X]':8)
      else
        write('[ ]':8);
    end;
    writeln;
  end;

  writeln(GARIS_TUNGGAL);

  { Cetak grafik batang }
  writeln;
  writeln('JUMLAH KELAS PER HARI:');
  writeln(GARIS_TUNGGAL);

  for j := 1 to JUMLAH_HARI do
  begin
    jumlahKelas := 0;
    for i := 1 to JUMLAH_SLOT do
      if isi[i, j] then
        jumlahKelas := jumlahKelas + 1;

    write(hari[j]:8, ': ');
    for i := 1 to jumlahKelas do
      write('#');
    writeln(' (', jumlahKelas, ')');
  end;

  writeln(GARIS_TUNGGAL);
end.

9.6 Contoh Keluaran

============================================================== JADWAL KULIAH TEKNIK INFORMATIKA ============================================================== Slot | Senin Selasa Rabu Kamis Jumat -------------------------------------------------------------- 08:00 | [X] [ ] [X] [ ] [ ] 10:00 | [ ] [X] [ ] [X] [ ] 13:00 | [X] [ ] [ ] [ ] [X] 15:00 | [ ] [X] [X] [ ] [ ] -------------------------------------------------------------- JUMLAH KELAS PER HARI: -------------------------------------------------------------- Senin: ### (3) Selasa: ## (2) Rabu: ## (2) Kamis: # (1) Jumat: # (1) --------------------------------------------------------------

9.7 Pembahasan

Beberapa keputusan perancangan penting pada program ini.

  1. Array dua dimensi. Program ini menggunakan array[1..JUMLAH_SLOT, 1..JUMLAH_HARI] of boolean untuk menyimpan status setiap slot. Meskipun array baru dibahas resmi pada Modul 16, penggunaannya di sini memberi gambaran tentang bagaimana perulangan bersarang alami berpasangan dengan struktur data dua dimensi.
  2. Tipe bentukan. Mendefinisikan ArrHari, ArrSlot, dan ArrIsi di blok type membuat program lebih mudah dibaca dan diubah.
  3. Header hari dicetak dengan perulangan. Alih-alih menuliskan manual, kita iterasi hari[j]. Bila suatu saat jumlah hari bertambah, cukup ubah JUMLAH_HARI.
  4. Grid dicetak dengan nested loop. Outer loop untuk slot, inner loop untuk hari. Setiap sel dipilih berdasarkan status boolean.
  5. Grafik batang dihitung dengan perulangan terbalik. Untuk setiap hari (kolom), kita iterasi semua slot (baris). Perhatikan bahwa urutan outer dan inner di sini terbalik dibandingkan pencetakan grid, karena kita ingin mengelompokkan berdasarkan hari.
  6. Konsistensi format. Penggunaan :8 untuk setiap kolom memastikan semua baris memiliki lebar yang sama dan rapi. Ini adalah praktik yang akan terus dipakai dalam laporan-laporan berikutnya.

9.8 Pengembangan Selanjutnya

Modul Pengembangan
Modul 11Memisahkan pencetakan header dan grid ke prosedur terpisah
Modul 16Menggunakan array resmi untuk menyimpan data jadwal
Modul 17Mengolah matriks dengan operasi lengkap (transpose, penjumlahan)
Modul 20Mengelompokkan data jadwal dalam record
Modul 25Menyimpan jadwal ke berkas untuk arsip
Modul 46Menggunakan graph untuk merepresentasikan relasi antar mata kuliah
10

Rangkuman

Poin-poin kunci yang perlu diingat dari Modul 10

  1. Perulangan bersarang adalah perulangan di dalam perulangan. Outer loop mengontrol iterasi luar, inner loop berjalan penuh untuk setiap iterasi outer.
  2. Jumlah iterasi total adalah hasil kali jumlah iterasi masing-masing perulangan. Untuk dua loop n iterasi, totalnya n².
  3. Setiap perulangan harus memiliki variabel pencacah sendiri. Menggunakan variabel yang sama akan merusak inner loop.
  4. Batas inner loop dapat bergantung pada outer loop. Contoh: segitiga dengan baris ke-i memiliki i bintang.
  5. Pola persegi: kedua loop berjalan dari 1 sampai n. Pola segitiga: inner loop berjalan dari 1 sampai i. Pola piramida: tambahkan loop spasi sebelum loop bintang.
  6. Rumus (2i - 1) menghasilkan deret bilangan ganjil 1, 3, 5, 7, ... yang membentuk piramida sama kaki.
  7. Tabel perkalian dan tabel konversi adalah aplikasi langsung perulangan bersarang. Header dicetak dengan satu loop, isi dengan loop bersarang.
  8. Matriks dua dimensi secara alami diproses dengan perulangan bersarang: outer loop untuk baris, inner loop untuk kolom.
  9. Struktur perulangan dapat dikombinasikan. for di dalam while, atau sebaliknya, memungkinkan pemodelan masalah yang lebih kompleks.
  10. Lupa writeln; setelah inner loop menyebabkan semua data tercetak dalam satu baris panjang.
  11. Analisis kompleksitas: perulangan bersarang O(n²) perlu dihindari untuk n besar. Alternatif algoritma yang lebih efisien akan dibahas pada fase lanjutan.
  12. Anda telah menyelesaikan Fase 1. Selanjutnya, Fase 2 akan fokus pada modularisasi (prosedur dan fungsi) dan struktur data (array dan record).
Sebelum Melanjutkan ke Fase 2

Pastikan Anda sudah dapat menulis perulangan bersarang untuk pola bintang, tabel, dan matriks tanpa melihat contoh. Latihan 3 dan 5 adalah indikator yang baik. Modul 11 akan memulai Fase 2 dengan prosedur, yang memungkinkan Anda memecah program menjadi blok-blok yang dapat dipakai ulang.

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 perulangan bersarang dan struktur kontrol bertingkat.
  2. Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan pemrosesan data multidimensi.
  3. Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang iterasi bersarang dan pembentukan pola.
  4. Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 7 dan 8 membahas perulangan dan pemrosesan matriks.
  5. Knuth, D. E. (1997). The Art of Computer Programming, Volume 1 (3rd ed.). Addison-Wesley. Bab tentang analisis kompleksitas dan pola iteratif.

Dokumentasi Resmi

  1. Free Pascal Team. Free Pascal Reference Guide. Bab tentang perulangan bersarang. Tersedia di freepascal.org/docs.html.
  2. Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang struktur kontrol dan optimasi.
  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 dan komposisi.
  3. Free Pascal Community Forum. Diskusi tentang teknik optimasi perulangan bersarang.