Lecture Notes Algoritma dan Pemrograman

dokumen-dokumen yang mirip
OPERASI PERNYATAAN KONDISI

Gambar 1. Tampilan Layar Sebuah Program Animasi

Lecture Notes Algoritma dan Pemrograman

ALGORITMA & PEMROGRAMAN II ARRAY

MODUL PRAKTIKUM. MODUL I - VIII Modul penuntun dan bahan praktikum matakuliah algoritma dan pemograman

a. Array berdimensi satu o Setiap elemen array dapat diakses melalui indeks. o Indeks array (subscript) secara default dimulai dari 0.

PERTEMUAN 2 KONSEP DASAR PEMROGRAMAN

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER STMIK AMIKOM YOGYAKARTA

MATRIKS. Notasi yang digunakan NOTASI MATRIKS

BAB XII MENCARI DATA MAKSIMUM DAN MINIMUM

REVIEW ARRAY. Institut Teknologi Sumatera

BAB I. LARIK (ARRAY) Array (larik) ialah penampung sejumlah data sejenis (homogen) yang menggunakan satu identifier (pengenal).

Larik/ Array int a1, a2, a3, a4, a5;

Selection / Pemilihan PEMILIHAN

ALUR PROGRAM. SELEKSI KONDISI Statement If a. Bentuk If tunggal sederhana Sintaks : if ( kondisi ) statement ;

Dasar Pemrograman. Kondisi dan Perulangan. By : Hendri Sopryadi, S.Kom, M.T.I

Perulangan, Percabangan, dan Studi Kasus

Algoritme dan Pemrograman

ARRAY PENGANTAR PROGRAM STUDI. Institut Teknologi Sumatera

FAKULTAS TEKNIK UNIVERSITAS NEGERI YOGYAKARTA

BAB VI ARRAY PADA PEMROGRAMAN JAVA

Array 1 A. TUJUAN PEMBELAJARAN

Algoritma dan Pemrograman. Loop control structures: WHILE. Loop control structures: WHILE Perhatikan potongan program berikut: 12/29/2011

Minggu II Lanjutan Matriks

Algoritma & Pemrograman #10

Konsep Array dalam PBO

Pengenalan Array. Array Satu Dimensi

Pengurutan pada Array. Tim PHKI Modul Dasar Pemrograman Fakultas Ilmu Komputer UDINUS Semarang

BAB 5 PERULANGAN DAN ARRAY

PENYELEKSIAN KONDISI

Array. Pengantar. int a, b, c, d, e;

Sorting. Pertemuan ke 14.

Proses Perulangan (Looping) DASAR PROGRAMMING 1

ARRAY / LARIK. Oleh : Agus Priyanto, M.Kom SEKOLAH TINGGI TEKNOLOGI TELEMATIKA TELKOM. Smart, Trustworthy, And Teamwork

printf (" ======== Program untuk memilih nama bulan dalam setahun ======== \n \n");

Array Dimensi Satu. Pendahuluan. Slamet Kurniawan, S.Kom

IT234 - Algoritma dan Struktur Data. Ramos Somya

Bab 3. Decision 1 (Pengambilan Keputusan)

a[0] a[1] a[2] a[3] a[4] a[5] x

PENGURUTAN (SORTING) 1. Overview

Algoritma Pemrograman. Fery Updi,M.Kom

Gambar 13.1 Ilustrasi proses algoritma sorting

Kasus A : Tabel untuk AM

IT234 - Algoritma dan Struktur Data. Ramos Somya

Kisi-Kisi Ujian Akhir Semester Algoritma dan Pemrograman Lanjut

SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER STMIK AMIKOM YOGYAKARTA

PRAKTIKUM 4 PERCABANGAN

Array (Larik) Modul 7

LOGIKA ALGORITMA. Pertemuan 9 By: Augury

Array 1 Dimensi pada Java

PERSEGI PENGAMANAN UNIK KRISTAL. Mau belajar? Jangan hanya dibaca Kerjakan soalnya. disusun kembali oleh: Al. Krismanto, M.Sc

PENGANTAR KOMPUTER & SOFTWARE II. Array (Part II) Tim Pengajar KU Institut Teknologi Sumatera

DIKTAT MATA KULIAH PEMROGRAMAN I BAB VII ARRAY

Penerapan Relasi Rekursif dan Matriks dalam Partisi Bilangan Bulat

BAGIAN A. PILIHAN GANDA Silanglah Jawaban yang Benar Pada Lembar Jawaban. Jawaban benar bernilai 3, salah atau kosong bernilai 0.

PEMROGRAMAN BERORIENTASI OBJEK. Pengulangan. Budhi Irawan, S.Si, M.T

BAB VI BAHASA C Pendahuluan

ARRAY. 7 th week Estu Sinduningrum ST,MT

Praktikum 7. Pengurutan (Sorting) Insertion Sort, Selection Sort POKOK BAHASAN: TUJUAN BELAJAR: DASAR TEORI:

V. STRUKTUR PEMILIHAN

OPERATOR DAN STATEMEN I/O

Selection, Looping, Branching

IF ELSE IF ELSE. BU : if (kondisi1) Statement; else if (kondisi2) Statement;

BAB 2 LANDASAN TEORI

Algoritma dan Pemrograman Array/Tabel[1] Oleh: Eddy Prasetyo N

Array ARRAY BERDIMENSI SATU. Representasi (Pemetaan) di memori. Lihat gambar dibawah ini, nilai data A (18) dismpan mulai dari alamat 1136 di memori.

Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu :

Gambar 1. Langkah-langkah pengurutan metode Insertion Sort (1)

Modul Praktikum Algoritma dan Struktur Data

Cara pertama adalah pada saat deklarasi variabel ditambahkan ke- yword const sebelum nama tipe data seperti

A. TUJUAN 1. Menjelaskan tentang prinsip dasar fungsi. 2. Menjelaskan tentang.parameter formal dan parameter aktual

1. Kompetensi Mengenal dan memahami algoritma percabangan yang komplek.

ARRAY. Karakteristik

BAB III ANALISA DAN PERANCANGAN APLIKASI

Struktur Kontrol Perulangan (Loop) Algoritme dan Pemrograman. Struktur Kontrol Perulangan: while. Struktur Kontrol Perulangan: while

Praktikum 6. Konsep Rekursi Perbandingan Perulangan biasa dan Rekursi Implementasi Rekursi dalam Bahasa C

BAB VI TIPE DATA ARRAY

Penggunaan Algoritma Runut-balik Pada Pencarian Solusi dalam Persoalan Magic Square

PRAKTIKUM 4 PENGAMBILAN KEPUTUSAN

Matriks. Tim Pengajar KU1072. KU1072/Pengenalan Teknologi Informasi B Tahap Tahun Pertama Bersama Institut Teknologi Bandung

Pengambilan Keputusan

Struktur Data Array. Rijal Fadilah S.Si

PRAKTIKUM 6 PENGULANGAN PROSES 2

SOAL C++ Created by Yuli Astuti,S.Kom Copyright 2009

Konsep Pemrograman. Bab 13. Pointer 3. Konsep Pemrograman Politeknik Elektronika Negeri Surabaya 2006 PENS-ITS. Umi Sa adah

KENDALI PROSES. 6.1 PENYELEKSIAN KONDISI (Selection)

Pada akhir pertemuan ini, diharapkan mahasiswa memiliki kemampuan untuk: Menggunakan struktur kendali pencabangan bersyarat dalam bahasa pemrograman.

Pengumuman Pekan ke- 5

Algoritma & Pemrograman #9. by antonius rachmat c, s.kom, m.cs

A. TUJUAN PEMBELAJARAN

Pertemuan 2 Matriks, part 2

Pengambilan Keputusan DASAR PEMROGRAMAN

Array dan Matriks. IF2121 / Algoritma dan Struktur Data Sem / /7/2017 IF2121/sem /2018 1

Keg. Pembelajaran 5 : Perulangan dalam C++ 1. Tujuan Kegiatan Pembelajaran 2. Uraian Materi while do..while for continue dan break go to

PENGANTAR KOMPUTER & SOFTWARE 2 MATRIX

Bahasa C Array. Slide diambil dari MK Dasar-Dasar Pemrograman Fasilkom UI Dimodifikasi dan disesuaikan dngn kebutuhan pengajaran di PTI-Undiksha

TEORI KONSEP PEMPROGRAMAN 3.1

Kisi-Kisi Ujian Tengah Semester Algoritma dan Pemrograman Lanjut

PRAKTIKUM 9 ARRAY. ARRAY BERDIMENSI SATU Suatu array berdimensi satu dideklarasikan dalam bentuk umum berupa :

Algoritma Pemrograman 2B (Pemrograman C++)

Transkripsi:

Uji Magic Square (Ed. 2) 1/9 Lecture Notes Algoritma dan Pemrograman Uji Magic Square Thompson Susabda Ngoen Introduksi Magic square ialah suatu susunan bilangan mulai dari 1 sampai dengan n 2 dalam sebuah tabel berukuran n x n, dan setiap bilangan muncul tepat satu kali, sedemikian rupa sehingga jumlah nilai bilangan-bilangan pada setiap baris, setiap kolom, dan setiap diagonal adalah sama. Gambar 1. Magic Square Berukuran 3 dan 4 Kita akan menulis program untuk menguji apakah suatu susunan bilangan-bilangan merupakan magic square. Pada pembahasan ini ukuran magic square dibatasi maksimum 10. Data masukan diawali sebuah bilangan yang menyatakan ukuran magic square lalu diikuti bilangan-bilangan pembentuk magic square tersebut, seperti demikian: 3 8 1 6 3 5 7 4 9 2 Struktur Data Untuk menampung data magic square ini perlu disediakan sebuah larik dua dimensi dengan ukuran 10 x 10. Selain itu juga perlu disediakan variabel untuk untuk menampung: a) jumlah nilai masing-masing baris (10 buah), b) jumlah nilai masing-masing kolom (10 buah), c) jumlah nilai diagonal utama, dan d) jumlah nilai diagonal tambahan. Agar a, b, dan c dapat digabungkan ke dalam larik berukuran 10 x 10 tersebut maka gunakan larik berukuran 11 x 11. Gambar 2. Array Penampung Data Magic Square

Uji Magic Square (Ed. 2) 2/9 Urutan proses yang dilakukan adalah: a. inisialisasi dan membaca data magic square ke dalam array b. menghitung jumlah nilai masing-masing baris c. menghitung jumlah nilai masing-masing kolom d. menghitung jumlah nilai diagonal utama e. menghitung jumlah nilai diagonal tambahan f. menguji kesamaan jumlah nilai setiap baris, kolom, dan diagonal g. menguji keunikan masing-masing nilai A. Inisialisasi dan Membaca Data Magic Square Magic square sebenarnya berbentuk bujur sangkar, artinya ukuran baris sama dengan kolom. Namun untuk memperjelas pembahasan kita menggunakan dua variabel, yaitu jbrs untuk menyatakan jumlah baris bujur sangkar dan jklm untuk menyatakan jumlah kolom bujur sangkar. Inisialisasi dilakukan dengan memberi nilai nol kepada jumlah nilai masingmasing baris, kolom, dan diagonal. Data masukan dibaca dengan menggunakan nested for( ). Inisialisasi for (i = 0; i < 11; i++) { arr[i][10] = 0; arr[10][i] = 0; } diag_tambahan = 0; Membaca data scanf("%d", &jbrs); jklm = jbrs; scanf("%d", &arr[i][j]); B. Menghitung Jumlah Nilai Masing-Masing Baris Banyaknya baris data yang perlu diproses adalah sejumlah jbrs, atau dari 0 sampai dengan jbrs 1, sehingga: for (i = 0; i <= jbrs - 1; i++) atau Adapun elemen-elemen data yang dijumlahkan pada masing-masing baris diberikan Tabel 1 di bawah ini. Larik Baris Ke- Tabel 1. Penjumlahan Elemen-Elemen Sebaris Elemen Larik yang Dijumlahkan Penampung Hasil 1 arr[0][0], arr[0][1], arr[0][2] sampai dengan arr[0][jklm-1] arr[0][10] 2 arr[1][0], arr[1][1], arr[1][2] sampai dengan arr[1][jklm-1] arr[1][10] 3 arr[2][0], arr[2][1], arr[2][2] sampai dengan arr[2][jklm-1] arr[2][10] Perhatikan bahwa indeks pertama penampung hasil penjumlahan adalah sama dengan indeks pertama elemen-elemen sebaris yang dijumlahkan, sedangkan indeks kedua penampung hasil penjumlahan selalu 10.

Uji Magic Square (Ed. 2) 3/9 arr[0][0], arr[0][1], arr[0][2] s/d arr[0][jklm-1] dijumlahkan ke arr[0][10] arr[1][0], arr[1][1], arr[1][2] s/d arr[1][jklm-1] dijumlahkan ke arr[1][10] Dengan demikian penjumlahan bilangan-bilangan sebaris, misalnya baris dengan indeks i dapat ditulis sebagai: for (j = 0; j <= jklm - 1; j++) arr[i][10] = arr[i][10] + arr[i][j]; atau arr[i][10] = arr[i][10] + arr[i][j]; dan penjumlahan bilangan-bilangan untuk masing-masing baris dapat dituliskan sebagai: arr[i][10] = arr[i][10] + arr[i][j]; C. Menghitung Jumlah Nilai Masing-Masing Kolom Banyaknya kolom data yang perlu diproses adalah sejumlah jklm, atau dari 0 sampai dengan jklm 1, sehingga: for (i = 0; i <= jklm - 1; i++) atau for (i = 0; i < jklm; i++) Adapun elemen-elemen yang dijumlahkan pada masing-masing kolom diberikan Tabel 2 di bawah ini. Tabel 2. Penjumlahan Elemen-Elemen Sekolom Larik Elemen Array Yang Dijumlahkan Kolom Ke- Penampung Hasil 1 arr[0][0], arr[1][0], arr[2][0] sampai dengan arr[jbrs-1][0] arr[10][0] 2 arr[0][1], arr[1][1], arr[2][1] sampai dengan arr[jbrs-1][1] arr[10][1] 3 arr[0][2], arr[1][2], arr[2][2] sampai dengan arr[jbrs-1][2] arr[10][2] Perhatikan bahwa indeks pertama penampung hasil penjumlahan selalu 10, sedangkan indeks kedua penampung hasil penjumlahan adalah sama dengan indeks kedua elemen-elemen yang dijumlahkan. arr[0][0], arr[1][0], arr[2][0] s/d arr[jbrs-1][0] dijumlahkan ke arr[10][0] arr[0][1], arr[1][1], arr[2][1] s/d arr[jbrs-1][1] dijumlahkan ke arr[10][1] Dengan demikian penjumlahan bilangan-bilangan sekolom, misalnya kolom dengan indeks i dapat ditulis sebagai: for (j = 0; j < jbrs; j++) arr[10][j] = arr[10][j] + arr[i][j]; dan penjumlahan bilangan-bilangan untuk masing-masing kolom dapat dituliskan sebagai for (i = 0; i < jklm; i++) for (j = 0; j < jbrs; j++) arr[10][j] = arr[10][j] + arr[i][j];

Uji Magic Square (Ed. 2) 4/9 D. Menghitung Jumlah Nilai Diagonal Utama Elemen-elemen pembentuk diagonal utama adalah arr[0][0], arr[1][1], arr[2][2], arr[3][3] dan seterusnya, yaitu elemen-elemen yang indeks pertama dan dan indeks keduanya sama. Jumlah nilai elemen-elemen diagonal utama akan ditampung di arr[10][10]. Dengan menggunakan nested for() maka program menjadi: if (i == j) arr[10][10] = arr[10][10] + arr[i][j]; atau dengan menggunakan satu instruksi for maka didapat: arr[10][10] += arr[i][i]; E. Menghitung Jumlah Nilai Diagonal Tambahan Manakah elemen pembentuk diagonal tambahan? Perhatikan Gambar 3 dan Tabel 3 di bawah ini. Indeks Pertama Gambar 3. Magic Square Berbagai Ukuran dan Elemen Diagonal Tambahan Tabel 3. Elemen Diagonal Tambahan Ukuran Elemen Pembentuk Diagonal Tambahan 2 x 2 arr[0][1], arr[1][0] 3 x 3 arr[0][2], arr[1][1], [2][0] 4 x 4 arr[0][3], arr[1][2], arr[2][1], arr[3][0] Perhatikan magic square berukuran 2 x 2. Elemen pertama pembentuk diagonal tambahan mempunyai indeks pertama bernilai 0. Elemen kedua pembentuk diagonal tambahan mempunyai Indeks pertama elemen bernilai 1. Perhatikan magic square berukuran 3 x 3. Elemen pertama pembentuk diagonal tambahan mempunyai Indeks pertama bernilai 0. Elemen keduanya berindeks pertama bernilai 1, dan elemen ketiganya berindeks pertama bernilai 2. Pada magic square berukuran 4 x 4 pola yang sama berlaku, yaitu indeks pertamanya dimulai dari 0, lalu 1, 2, dan 3; sehingga dapat disimpulkan bahwa untuk magic square berukuran n x n, indeks pertama bernilai 0, 1, 2, 3, dan seterusnya sampai dengan n 1. Indeks Kedua Perhatikan magic square ukuran 2 x 2 pada Tabel 3. Indeks kedua elemen pertamanya bernilai 1. Indeks kedua elemen keduanya bernilai satu kurang dari nilai indeks kedua elemen pertama. 2 x 2 arr[0][1], arr[1][0]

Uji Magic Square (Ed. 2) 5/9 Perhatikan magic square ukuran 3 x 3 pada Tabel 3. Indeks kedua elemen pertamanya bernilai 2. Indeks kedua elemen-elemen selanjutnya bernilai satu kurang dari nilai indeks kedua elemen sebelumnya. 3 x 3 arr[0][2], arr[1][1], arr[2][0] Demikian pula dengan magic square berukuran 4 x 4 yang indeks kedua elemen pertamanya bernilai 3, dan indeks kedua elemen-elemen berikutnya bernilai satu kurang dari nilai indeks kedua elemen sebelumnya. 4 x 4 arr[0][3], arr[1][2], arr[2][ 1], arr[3][0] Dengan demikian dapat disimpulkan bahwa jika magic square berukuran n x n maka indeks keduanya bernilai mulai dari n 1, lalu bernilai kurang-kurang satu, sampai dengan nol. Dengan menggabungkan ketentuan tentang indeks pertama dan ketentuan indeks kedua, yaitu: - indeks pertama bernilai 0, 1, 2, 3, dan seterusnya sampai dengan n-1 - indeks kedua bernilai n-1, n-2, n-3, dan seterusnya sampai dengan 0 Tabel 4. Indeks Pertama dan Kedua Elemen Diagonal Tambahan Elemen Ke Indeks Pertama Indeks Kedua 1 [0] [n-1] 2 [1] [n-2] 3 [2] [n-3] n [n-1] 0 maka didapatkan relasi yaitu indeks kedua = n - indeks pertama - 1, dengan n berupa ukuran magic square. Dengan menggunakan variabel i untuk mengendalikan indeks pertama dan variabel j untuk mengendalikan indeks kedua maka program menjadi Jumlah nilai elemen diagonal tambahan if (j == jbrs i 1) diag_tambahan = daig_tambahan + arr[i][j]; atau dengan menggunakan satu instruksi for maka didapat: diag_tambahan = diag_tambahan + arr[i][jbrs i - 1]; F. Menguji Kesamaan Jumlah Nilai Kita menggunakan sebuah variabel yang berfungsi sebagai switch, misalnya ms. Pada awalnya ms diberi nilai 1. Pada proses pengujian apabila ternyata jumlah nilai tidak sama maka nilai ms diubah menjadi 0. Pengujian kesamaan jumlah nilai baris dilakukan dengan membadingkan jumlah nilai baris ke-1 dengan jumlah nilai baris ke-2, jumlah nilai baris ke-1 dengan jumlah nilai baris ke-3 dan seterusnya.

Uji Magic Square (Ed. 2) 6/9 Uji kesamaan jumlah nilai baris-baris ms = 1; for (i = 1; i < jbrs; i++) if (arr[i][10]!= arr[0][10]) ms = 0; Pengujian kesamaan jumlah nilai kolom dilakukan jika jumlah nilai baris adalah sama, yaitu jika variabel ms masih bernilai 1. Pengujian kesamaan jumlah nilai kolom dilakukan dengan membadingkan jumlah nilai kolom ke-1 dengan jumlah nilai kolom ke-2, jumlah nilai kolom ke-1 dengan jumlah nilai kolom ke-3, dan seterusnya Uji kesamaan jumlah nilai kolom-kolom if (ms == 1) for (i = 1; i < jklm; i++) if (arr[10][i]!= arr[10][0]) ms = 0; Pengujian kesamaan jumlah nilai diagonal dilakukan dengan membandingkannya dengan jumlah nilai lain, misalnya dengan jumlah nilai baris pertama. Uji kesamaan jumlah nilai diagonal if (ms == 1 && arr[10][10]!= arr[0][10]) ms = 0; if (ms == 1 && diag_tambahan!= arr[0][10]) ms = 0; G. Menguji Keunikan Nilai Mengapa keunikan nilai masing-masing elemen magic square perlu diuji? Bukankah bila semua baris, semua kolom, dan kedua diagonal mempunyai jumlah nilai yang sama pasti menandakan bilangan-bilangan yang diuji membentuk magic square? Belum tentu. Apabila semua bilangannya bernilai sama maka semua jumlah nilai akan sama padahal bukan magic square. Pegujian keunikan nilai dilakukan apabila jumlah nilai semua baris, kolom, dan diagonal ternyata sama, yaitu variabel ms masih bernilai 1. Ketentuan lain mengenai magic square adalah bahwa masing-masing elemen harus bernilai antara 1 dan n x n (termasuk kedua nilai batas), dan semua nilai tersebut bersifat unik. Jadi terdapat dua ketentuan yang harus dipenuhi: 1. nilai setiap elemen tidak boleh lebih kecil dari 1 atau lebih besar daripada n x n 2. tidak boleh ada dua elemen atau lebih yang bernilai sama. Pengujian butir 1 mudah dilakukan. Pengujian butir 2 agak rumit. Misalnya magic square berukuran 3 x 3. Untuk menguji keunikan nilai elemen arr[0][1] maka harus membandingkan nilai elemen ini dengan dengan arr[0][0]. Untuk menguji keunikan nilai elemen arr[0][2] maka harus membandingkan nilai elemen ini dengan arr[0][0] dan arr[0][1]. Untuk menguji keunikan nilai elemen arr[2][2] maka harus membandingkan nilai elemen ini dengan semua elemen lainnya. Apakah ada cara lain yang lebih sederhana? Ada, dengan bantuan sebuah array lain untuk menampung nilai elemen yang sudah pernah muncul. Untuk menguji keunikan nilai ini kita memerlukan sebuah array satu dimensi yang mempunyai indeks [1] sampai dengan [n x n]. Pada pembahasan soal ini kita menggunakan array berlemen 101, misalnya diberi nama test. Pada mulanya

Uji Magic Square (Ed. 2) 7/9 masing-masing elemen test [1] sampai dengan test[100] diberi nilai nol. Gambar 4. Array test Kemudian dilakukan penelusuran terhadap masing-masing elemen magic square. Jika elemen magic square bernilai 6 misalnya maka nilai test[6] ditambah 1. Gambar 5. Mengubah Nilai Array test Setelah semua elemen magic square selesai diprose, lakukan pemeriksaan terhadap test[1] sampai dengan test[n x n]. Jika masing-masing elemen ini bernilai 1 berarti masing-masing nilai muncul tepat satu kali. Jika terdapat test[a] yang bernilai > 1 berarti nilai a muncul lebih dari satu kali pada magic square. Jika terdapt test[b] yang bernilai 0 berarti nilai b tidak pernah muncul pada magic square. Inisialisasi array test for (i = 1; i <= jbrs * jbrs; i++) test[i] = 0 Mengisi array test test[arr[i][j]]++; Menguji keunikan nilai for (i = 1; i <= jbrs * jbrs; i++) if (test[i]!= 1) { ms = 0; break; } Program 1. Uji Magic Square (A) 1 # include <stdio.h> 2 3 int main() { 4 int arr[11][11], test[101], diag_tambahan, jbrs, jklm, i, j, ms; 5 6 for (i = 0; i < 11; i++) { /*** bagian a ***/ 7 arr[i][10] = 0; 8 arr[10][i] = 0; 9 } 10 diag_tambahan = 0; 11 12 scanf("%d", &jbrs); 13 jklm = jbrs; 14 15 16 scanf("%d", &arr[i][j]); 17

Uji Magic Square (Ed. 2) 8/9 18 /*** bagian b ***/ 19 20 arr[i][10] = arr[i][10] + arr[i][j]; 21 22 for (i = 0; i < jklm; i++) /*** bagian c ***/ 23 for (j = 0; j < jbrs; j++) 24 arr[10][j] = arr[10][j] + arr[i][j]; 25 26 /*** bagian d ***/ 27 28 if (i == j) arr[10][10] = arr[10][10] + arr[i][j]; 29 30 diag_tambahan = 0; /*** bagian e ***/ 31 32 33 if (j == jbrs i 1) 34 diag_tambahan = diag_tambahan + arr[i][j]; 35 36 ms = 1; /*** bagian f ***/ 37 for (i = 1; i < jbrs; i++) 38 if (arr[i][10]!= arr[0][10]) ms = 0; 39 40 if (ms == 1) 41 for (i = 1; i < jklm; i++) 42 if (arr[10][i]!= arr[10][0]) ms = 0; 43 44 if (ms && arr[10][10]!= arr[0][10]) ms = 0; 45 if (ms && diag_tambahan!= arr[0][10]) ms = 0; 46 47 /*** bagian g, inisialisasi array test ***/ 48 for (i = 1; i <= jbrs * jbrs; i++) test[i] = 0; 49 50 /*** bagian g, mengisi array test ***/ 51 52 53 test[arr[i][j]]++; 54 55 /*** bagian g, menguji keunikan nilai ***/ 56 for (i = 1; i <= jbrs * jbrs; i++) 57 if (test[i]!= 1) { 58 ms = 0; 59 break; 60 } 61 62 if (ms == 1) printf("magic square"); 63 else printf("bukan magic square"); 64 return 0; 65 } Programnya cukup panjang. Apakah dapat dipersingkat? Mari kita analisis program di atas. Bagian a untuk membaca data magic square (baris ke-14 s.d. ke-16) terdiri atas sebuah nested for. Bagian b (baris ke-18 s.d. ke-20) terdiri atas sebuah nested for. Bagian c (baris ke-22 s.d. ke-24) terdiri dari sebuah nested for. Bagian d (baris ke-26 s.d. ke-28) terdiri atas sebuah nested for. Bagian e (baris ke-31 s.d. ke-34) terdiri dari sebuah nested for. Bagian f mengisi larik test (baris ke-51 s.d. ke-53) juga terdiri atas sebuah nested for. Yang agak berbeda adalah bagian c yang instruksi for luar mempunyai kondisi i<jklm dan instruksi for dalam yang mempunyai kondisi j<jbrs. Tetapi karena jbrs bernilai sama dengan jklm maka kedua variabel ini dapat dipertukarkan. Dengan demikian keenam bagian ini bisa digabung. {

Uji Magic Square (Ed. 2) 9/9 } scanf("%d", &arr[i][j]); //***** a arr[i][10] = arr[i][10] + arr[i][j]; //***** b arr[10][j] = arr[10][j] + arr[i][j]; //***** c if (i == j) arr[10][10] = arr[10[10] + arr[i][j]; //***** d if (j == jbrs i 1) diag_tambahan += arr[i][j]; //***** e test[arr[i][j]]++; //***** f Bagian F yang melakukan pengujian jumlah nilai baris (baris ke-37 dan ke-38) dan pengujian jumlah nilai kolom (baris ke-41 dan ke-42) juga dapat digabung karena jbrs bernilai sama dengan jklm. ms = 1; for (i = 1; i < jbrs; i++) { if (arr[i][10]!= arr[0][10]) ms = 0; if (arr[10][i]!= arr[10][0]) ms = 0; } Program 2. Uji Magic Square (B) 1 # include <stdio.h> 2 3 int main() { 4 int arr[11][11], test[101], diag_tambahan, jbrs, jklm, i, j, ms; 5 6 for (i = 0; i < 11; i++){ 7 arr[i][10] = 0; 8 arr[10][i] = 0; 9 } 10 diag_tambahan = 0; 11 for (i = 0; i <= 100; i++) test[i] = 0; 12 13 scanf("%d", &jbrs); 14 jklm = jbrs; 15 16 { 17 scanf("%d", &arr[i][j]); // a 18 arr[i][10] += arr[i][j]; // b 19 arr[10][j] += arr[i][j]; // c 20 if (i == j) arr[10][10] += arr[i][j]; // d 21 if (j == jbrs i 1) diag_tambahan += arr[i][j]; // e 22 test[arr[i][j]]++; // f 23 } 24 25 ms = 1; 26 for (i = 1; i < jbrs; i++) { 27 if (arr[i][10]!= arr[0][10]) ms = 0; 28 if (arr[10][i]!= arr[10][0]) ms = 0; 29 } 30 31 if (ms && arr[10][10]!= arr[0][10]) ms = 0; 32 if (ms && diag_tambahan!= arr[0][10]) ms = 0; 33 34 for (i = 1; i <= jbrs * jbrs; i++) 35 if (test[i]!= 1) ms = 0; 36 37 if (ms) printf("magic square"); 38 else printf("bukan magic square"); 39 return 0; 40 }