Tujuan Pembelajaran
Kompetensi yang ingin dicapai setelah menyelesaikan modul ini
Setelah menyelesaikan modul ini, mahasiswa diharapkan mampu:
- Menjelaskan konsep perulangan bersarang dan strukturnya.
- Menulis perulangan
forbersarang dengan variabel pencacah yang berbeda. - Menghitung jumlah iterasi total pada perulangan bersarang.
- Membentuk pola bintang persegi, segitiga, dan piramida.
- Membuat tabel perkalian dan tabel konversi berformat rapi.
- Memproses matriks dua dimensi dengan perulangan bersarang.
- Menggabungkan perulangan
for,while, danrepeatdalam satu program. - Menggambar flowchart perulangan bersarang.
- Menghindari kesalahan umum pada perulangan bersarang.
- Memecahkan masalah nyata yang memerlukan iterasi dua dimensi.
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 |
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).
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.
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:
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..n | 1..m | n × m |
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.
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.
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.
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).
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
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.
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):
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.
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:
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.
{ 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:
3.8 Menggambar Grafik Sederhana
Perulangan bersarang dapat dipakai untuk menggambar grafik batang (bar chart) sederhana dari data numerik.
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:
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
- Menggunakan variabel pencacah yang sama. Kedua perulangan harus menggunakan variabel berbeda (
idanj). Menggunakanipada keduanya akan merusak inner loop. - Lupa
writeln;setelah inner loop. Semua data akan tercetak dalam satu baris tanpa pemisah baris. - Lupa
begin...endpada outer loop. Inner loop dianggap satu-satunya pernyataan, danwritelnmenjadi di luar outer loop. - Menukar outer dan inner loop. Menghasilkan pola yang berbeda dari yang diinginkan.
- Inner loop tidak dieksekusi. Kondisi inner loop mungkin sudah salah sejak awal, misalnya
for j := 5 downto 1ketika batasnya 1. - Mengubah pencacah outer di dalam inner. Merusak integritas iterasi dan biasanya merupakan kesalahan kompilasi.
- Kesalahan off-by-one. Rentang yang salah, misalnya
1..n-1ketika seharusnya1..n. - Menggunakan variabel pencacah setelah inner loop. Nilai pencacah inner tidak dapat diandalkan setelah blok selesai.
3.10 Kapan Menggunakan Perulangan Bersarang
- Memproses data dua dimensi: baris dan kolom.
- Membentuk pola visual: bintang, piramida, grafik.
- Menghasilkan tabel kombinasi: tabel perkalian, tabel konversi.
- Mengiterasi pasangan nilai dari dua himpunan berbeda.
- Algoritma pengurutan O(n²) seperti bubble sort dan selection sort (Modul 19).
- Pemrosesan matriks dalam operasi aljabar linear.
- Pencarian dalam matriks atau grid dua dimensi.
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) |
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
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
Contoh Kode Pascal Lengkap
Enam program untuk mendemonstrasikan perulangan bersarang
6.1 Program Pola Persegi dan Segitiga
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:
6.2 Program Piramida Sama Kaki
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:
6.3 Program Tabel Perkalian Lengkap
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:
6.4 Program Bilangan Prima Sampai N
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:
6.5 Program Tabel Konversi Suhu
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):
6.6 Program Matriks Perkalian
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:
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 |
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 |
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; |
Variabel prima
bertipe boolean untuk menyimpan status
apakah i adalah bilangan prima.
|
| 14-15 | for i := 2 to n do |
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 |
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 |
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 |
|---|---|---|---|---|---|
| Awal | 2 | Ya (4 ≤ 9) | TRUE | 1 | Lanjut |
| 1 | 2 | Ya | TRUE | 1 | j = 3 |
| 2 | 3 | Ya (9 ≤ 9) | TRUE | 0 | prima = FALSE, j = 4 |
| 3 | 4 | Tidak, prima FALSE | FALSE | - | Keluar loop |
Karena 9 mod 3 = 0, maka 9
bukan prima. Perulangan berhenti lebih awal karena
kondisi prima sudah
false.
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).
Latihan Soal
Lima soal dengan tingkat kesulitan bertingkat
Analisis Iterasi Perulangan Bersarang
MudahHitung jumlah total iterasi inner loop untuk setiap perulangan bersarang berikut, lalu verifikasi dengan menulis program Pascal yang mencetak hasilnya.
for i := 1 to 5 do for j := 1 to 5 do ...for i := 1 to 5 do for j := 1 to i do ...for i := 1 to 5 do for j := i to 5 do ...for i := 1 to 3 do for j := 1 to 4 do for k := 1 to 2 do ...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?
Pola Bintang Beragam
MudahBuat 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):
Pertanyaan analisis: bagaimana pola belah ketupat dapat dibuat dengan menggabungkan dua pola piramida?
Tabel Perkalian dengan Format Kustom
SedangBuat 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:
Pertanyaan analisis: mengapa lebar field untuk nilai sel harus cukup besar (misalnya 5 atau 6) ketika n juga besar?
Matriks Identitas dan Matriks Segitiga
SedangBuat 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:
Pertanyaan analisis: bagaimana
kondisi i = j,
i <= j, dan
i >= j menentukan
posisi nilai 1?
Deteksi Kesalahan Perulangan Bersarang
SulitProgram berikut dimaksudkan untuk mencetak pola piramida, tetapi memiliki tujuh kesalahan sintaks atau logika. Temukan semuanya, lalu tuliskan versi yang benar.
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.
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 |
|---|---|
| Hari | 5 hari (Senin - Jumat) |
| Slot waktu | 4 slot (08:00, 10:00, 13:00, 15:00) |
| Status slot | Terisi (X) atau Kosong (-) |
| Grafik batang | Setiap 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
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
9.7 Pembahasan
Beberapa keputusan perancangan penting pada program ini.
-
Array dua dimensi.
Program ini menggunakan
array[1..JUMLAH_SLOT, 1..JUMLAH_HARI] of booleanuntuk 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. -
Tipe bentukan.
Mendefinisikan
ArrHari,ArrSlot, danArrIsidi bloktypemembuat program lebih mudah dibaca dan diubah. -
Header hari dicetak dengan perulangan.
Alih-alih menuliskan manual, kita iterasi
hari[j]. Bila suatu saat jumlah hari bertambah, cukup ubahJUMLAH_HARI. - Grid dicetak dengan nested loop. Outer loop untuk slot, inner loop untuk hari. Setiap sel dipilih berdasarkan status boolean.
- 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.
-
Konsistensi format.
Penggunaan
:8untuk 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 11 | Memisahkan pencetakan header dan grid ke prosedur terpisah |
| Modul 16 | Menggunakan array resmi untuk menyimpan data jadwal |
| Modul 17 | Mengolah matriks dengan operasi lengkap (transpose, penjumlahan) |
| Modul 20 | Mengelompokkan data jadwal dalam record |
| Modul 25 | Menyimpan jadwal ke berkas untuk arsip |
| Modul 46 | Menggunakan graph untuk merepresentasikan relasi antar mata kuliah |
Rangkuman
Poin-poin kunci yang perlu diingat dari Modul 10
- Perulangan bersarang adalah perulangan di dalam perulangan. Outer loop mengontrol iterasi luar, inner loop berjalan penuh untuk setiap iterasi outer.
- Jumlah iterasi total adalah hasil kali jumlah iterasi masing-masing perulangan. Untuk dua loop n iterasi, totalnya n².
- Setiap perulangan harus memiliki variabel pencacah sendiri. Menggunakan variabel yang sama akan merusak inner loop.
- Batas inner loop dapat bergantung pada outer loop. Contoh: segitiga dengan baris ke-i memiliki i bintang.
- 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.
- Rumus (2i - 1) menghasilkan deret bilangan ganjil 1, 3, 5, 7, ... yang membentuk piramida sama kaki.
- Tabel perkalian dan tabel konversi adalah aplikasi langsung perulangan bersarang. Header dicetak dengan satu loop, isi dengan loop bersarang.
- Matriks dua dimensi secara alami diproses dengan perulangan bersarang: outer loop untuk baris, inner loop untuk kolom.
-
Struktur perulangan dapat dikombinasikan.
fordi dalamwhile, atau sebaliknya, memungkinkan pemodelan masalah yang lebih kompleks. -
Lupa
writeln;setelah inner loop menyebabkan semua data tercetak dalam satu baris panjang. - Analisis kompleksitas: perulangan bersarang O(n²) perlu dihindari untuk n besar. Alternatif algoritma yang lebih efisien akan dibahas pada fase lanjutan.
- Anda telah menyelesaikan Fase 1. Selanjutnya, Fase 2 akan fokus pada modularisasi (prosedur dan fungsi) dan struktur data (array dan record).
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.
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 9 membahas perulangan bersarang dan struktur kontrol bertingkat.
- Cantu, M. (2020). Object Pascal Handbook. Marco Cantu. Bab tentang struktur kontrol dan pemrosesan data multidimensi.
- Cooper, D., & Clancy, M. (1982). Oh! Pascal! W. W. Norton & Company. Bab tentang iterasi bersarang dan pembentukan pola.
- Grogono, P. (1995). Programming with Pascal. Addison-Wesley. Bab 7 dan 8 membahas perulangan dan pemrosesan matriks.
- Knuth, D. E. (1997). The Art of Computer Programming, Volume 1 (3rd ed.). Addison-Wesley. Bab tentang analisis kompleksitas dan pola iteratif.
Dokumentasi Resmi
- Free Pascal Team. Free Pascal Reference Guide. Bab tentang perulangan bersarang. Tersedia di freepascal.org/docs.html.
- Free Pascal Team. Free Pascal Programmer's Guide. Bab tentang struktur kontrol dan optimasi.
- Lazarus IDE Documentation. Panduan penggunaan perulangan pada aplikasi.
Artikel dan Sumber Daring
- IEEE Computer Society. (1990). IEEE Standard for Pascal (IEEE Std 770-1983). Bab tentang pernyataan iteratif.
- Wirth, N. (1971). "The Programming Language Pascal." Acta Informatica, 1(1), 35-63. Bab tentang struktur kontrol dan komposisi.
- Free Pascal Community Forum. Diskusi tentang teknik optimasi perulangan bersarang.