• Tidak ada hasil yang ditemukan

Lecture Notes Algoritma dan Pemrograman

N/A
N/A
Protected

Academic year: 2021

Membagikan "Lecture Notes Algoritma dan Pemrograman"

Copied!
9
0
0

Teks penuh

(1)

L

ecture

N

otes

Algoritma dan Pemrograman

Uji Magic Square

Thompson Susabda Ngoen

Introduksi

Magic square ialah suatu susunan bilangan mulai dari 1 sampai dengan n2 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.

(2)

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 masing-masing baris, kolom, dan diagonal. Data masukan dibaca dengan menggunakan nestedfor( ). ª 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; for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++) 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

for (i = 0; i < jbrs; i++)

Adapun elemen-elemen data yang dijumlahkan pada masing-masing baris diberikan Tabel 1 di bawah ini.

Tabel 1. Penjumlahan Elemen-Elemen Sebaris Larik

Baris Ke-

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.

(3)

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

for (j = 0; j < jklm; j++)

arr[i][10] = arr[i][10] + arr[i][j];

dan penjumlahan bilangan-bilangan untuk masing-masing baris dapat dituliskan sebagai:

for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++)

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

Kolom Ke-

Elemen Array Yang Dijumlahkan 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++)

(4)

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:

for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++)

if (i == j) arr[10][10] = arr[10][10] + arr[i][j];

atau dengan menggunakan satu instruksi for maka didapat:

for (i = 0; i < jbrs; i++) 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.

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]

Indeks Pertama

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.

(5)

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

for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++) if (j == jbrs – i – 1)

diag_tambahan = daig_tambahan + arr[i][j];

ª atau dengan menggunakan satu instruksi for maka didapat:

for (i = 0; i < jbrs; i++)

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.

(6)

ª 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 membandingkan-nya dengan jumlah nilai lain, misalmembandingkan-nya 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

(7)

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

for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++) 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 for (i = 0; i < jbrs; i++) 15 for (j = 0; j < jklm; j++) 16 scanf("%d", &arr[i][j]); 17

(8)

18 for (i = 0; i < jbrs; i++) /*** bagian b ***/ 19 for (j = 0; j < jklm; j++)

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 for (i = 0; i < jbrs; i++) /*** bagian d ***/ 27 for (j = 0; j < jklm; j++)

28 if (i == j) arr[10][10] = arr[10][10] + arr[i][j]; 29

30 diag_tambahan = 0; /*** bagian e ***/ 31 for (i = 0; i < jbrs; i++)

32 for (j = 0; j < jklm; j++) 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 for (i = 0; i < jbrs; i++)

52 for (j = 0; j < jklm; j++) 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.

for (i = 0; i < jbrs; i++) for (j = 0; j < jklm; j++) {

(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 for (i = 0; i < jbrs; i++) 16 for (j = 0; j < jklm; j++) { 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 }

Gambar

Gambar 1. Magic Square Berukuran 3 dan 4
Tabel 4. Indeks Pertama dan Kedua Elemen Diagonal Tambahan  Elemen Ke  Indeks Pertama  Indeks Kedua
Gambar 4. Array test

Referensi

Dokumen terkait

Peraturan Pemerintah Nomor 54 Tahun 2004 tentang Majelis Rakyat Papua merupakan pelaksanaan dari Undang-Undang Nomor 21 Tahun 2001 tentang Otonomi Khusus Bagi Provinsi Papua

Untuk melakukan perhitungan laju dosis neutron menggunakan program MCNP5v1.2 diperlukan parameter input yaitu geometri bahan bakar dan teras RGTT200K, posisi sumber

Salmadanis menceritakan bagaimana pengalaman awalnya masuk penjara, awal-awal masuk penjara Salmadanis pernah beberapa kali berkelahi di Rutan Padang, “kalau tidak kuat mungkin

dan skunder sedangkan teknik pengumpulan data dengan menggunakan wawancara,observasi dan pemeriksaan penunjang. M mengatakan tidak ada keluhan. Leopold II: bagian kanan

Kondisi yang membuat anak muda tidak dapat lepas dari telepon seluler ( nomophobia alias no mobile phone phobia ), koneksi internet, charger , powerbank

Ebook ini akan mengingatkan dan membantu pemahaman Anda dalam bentuk soal Bahasa Indonesia, sehingga Anda dapat lebih mudah dalam menjawab soal-soal

Berdasarkan hasil kajian reproduksi ikan kurisi yang didaratkan di PPN Karangantu Banten, maka pengelolaan yang dapat dilakukan adalah selektivitas alat tangkap, pengaturan

Penelitian tentang ragam kesulitan belajar Protista dan faktor penyebabnya penting dilakukan agar pada pembelajaran yang akan datang guru diharapkan dapat menyusun