Menggambar Kotak (Ed. 2) 1/6
Lecture Notes
Menggambar Kotak
Algoritma dan Pemrograman
Thompson Susabda Ngoen
Di dalam penulisan program adakalanya kita perlu menggambar kotak (bingkai segi empat) di layar komputer agar tampilan menjadi lebih indah. Compiler yang digunakan harus mempunyai function-function untuk mengatur posisi cursor di layar komputer, seperti gotoxy() yang didefinisikan di berkas header conio.h pada compiler Turbo C++ 3.0 dan Borland C++ 3.1. IDE Dev-C++ juga mempunyai function ini di berkas header conio2.h.
Gambar 1. Tampilan Layar Sebuah Program Animasi
A. Koordinat Titik Data apa yang kita perlukan agar kotak tersebut bisa digambar? Ya, koordinat kotak tersebut. Sebuah kotak mempunyai empat titik. Berapa titik koordinat yang diperlukan? Keempat titik? Dua titik saja? Dua titik yang mana? Kiri atas dan kiri bawah? Misalkan keempat titik kotak kita beri nama A, B, C, dan D. Misalkan kolom kiri kotak adalah x1, kolom kanan kotak adalah x2, baris atas kotak adalah y1, dan baris bawah kotak adalah y2. Dengan demikian titik A berkoordinat x1, y1; titik B berkoordinat x2, y1; titik C berkoordinat x2, y2; dan titik D berkoordinat x1, y2.
Gambar 2. Koordinat Kotak
Jika koordinat yang diambil adalah titik A dan B maka kita mendapat data x1, x2, dan y1, sebanyak 3 data, tidak ada data y2. Jika koordinat yang diambil adalah titik A dan D maka
INSTITUT BISNIS dan INFORMATIKA INDONESIA
Menggambar Kotak (Ed. 2) 2/6
kita mendapat data x1, y1, dan y2, sebanyak 3 data, tidak ada data x2. Jika koordinat yang diambil adalah titik-titik diagonal A dan C maka kita mendapat data x1, y1, x2, y2. Sama halnya jika kita menggunakan koordinat titik B dan D maka kita mendapat data x1, y1, x2, y2. Jadi data yang diperlukan adalah koordinat kedua titik diagonal.
B. Cara Pertama Kotak ini terdiri atas 8 bagian: karakter kiri atas (a), garis horisontal atas (b), karakter kanan atas (c), garis vertikal kanan (d), karakter kanan bawah (e), garis horisontal bawah (f), karakter kanan bawah (g), dan garis vertikal kiri (h).
Gambar 3. Komponen Kotak
Hal yang harus diingat adalah bahwa cursor yang berada di koordinat (x, y) setelah mencetak satu karakter akan pindah ke koordinat (x+1, y). Jika posisi cursor saat pencatakan berada di kolom 80, maka cursor akan pindah ke kolom satu baris berikutnya. Pada cara pertama kita menggambar kotak dengan urutan searah putaran jarum jam mulai dari pojok kiri atas: a, b, c, d, e, f, g, dan h. a adalah ╔ (karakter ASCII berkode 201) pada koordinat (x1, y1) b adalah sejumlah potongan garis horisontal ═ (karakter ASCII berkode 205) pada koordinat (x1+1, y1), (x1+2, y1), … sampai dengan (x2-1, y1). c adalah ╗ (karakter ASCII berkode 187) pada koordinat (x2, y1). d adalah sejumlah potongan garis vertikal ║ (karakter ASCII berkode 186) pada koordinat (x2, y1+1), (x2, y1+2), … sampai dengan (x2, y2-1). e adalah ╝( karakter ASCII berkode 188) pada koordinat (x2, y2). f adalah sejumlah potongan garis horisontal ═ pada koordinat (x1+1, y2), (x1+2, y2), … sampai dengan (x2-1, y2). g adalah ╚ (karakter ASCII berkode 200) pada koordinat (x1, y2). h adalah sejumlah potongan garis vertikal pada koordinat (x1, y1+1), (x1, y1+2), … sampai dengan (x1, y2-1). Karakter kiri atas dicetaka dengan instruksi gotoxy(x1, y1); printf("%c",201); /*** a ***/
Setelah selesai mencetak a cursor berada di koordinat (x1+1, y1). Ini adalah koordinat awal untuk mencetak b. Jadi posisi cursor sudah tepat dan tidak perlu diatur kembali dengan gotoxy( ). Pada saat mencetak b posisi baris selalu berada di y1 sedangkan posisi kolom berubah-ubah mulai dari x1+1 ke kanan sampai dengan x2-1. Posisi kolom ini yang perlu dikendalian misalnya dengan variabel i. for (i = x1 + 1; i <= x2 - 1; i++) printf("%c", 205);
/*** b ***/
INSTITUT BISNIS dan INFORMATIKA INDONESIA
Menggambar Kotak (Ed. 2) 3/6
Setelah selesai mencetak b cursor berada pada koordinat (x2, y1), tepat di koordinat untuk mencetak c. Jadi c dapat langsung dicetak tanpa harus terlebih dahulu memindahkan cursor. printf("%c", 187);
/*** c ***/
Setelah selesai mencetak c cursor berada pada koordinat (x2+1, y1). Ini bukan posisi awal untuk mencetak garis vertikal d yang berada pada koordinat (x2, y1+1). Hal lain yang perlu diperhatikan adalah setelah mencetak satu ruas garis vertikal cursor pindah ke kolom di sebelah kanannya sedangkan ruas garis vertikal berikutnya harus berada tepat di bawah ruas garis vertikal yang telah dicetak. Artinya posisi kolom harus selalu berada pada x2 sedangkan setiap selesai mencetak satu ruas garis cursor berada pada posisi kolom x2+1. Oleh karena itu sebelum mencetak setiap ruas garis vertikal, cursor harus dipindahkan dulu ke kolom x2. Posisi baris ruas garis berubah-ubah mulai dari y1+1 sampai dengan y2-1. Posisi baris ini perlu ‘divariabelkan’, misalnya dikendalian oleh pencacah i. for (i = y1 + 1; i <= y2 - 1; i++) { gotoxy(x2, i); printf("%c", 186); }
/*** d ***/
Sebelum mencetak e pindahkan cursor ke posisi (x2, y2). gotoxy(x2, y2); printf("%c", 188);
/*** e ***/
Garis horisontal f dapat dicetak dari arah kanan ke kiri atau dari kiri ke kanan. Misalkan kita mencetaknya dari kanan ke kiri. Ruas garis ini selalu berada pada baris y2 sedangkan kolomnya berubah-ubah mulai dari x2-1, x2-2, mundur terus sampai kolom x1+1. Kendalikan posisi kolom dengan sebuah pencacah. for(i = x2 - 1; i >= x1 + 1; i--) { gotoxy(i, y2); printf("%c", 205); }
/*** f ***/
Karakter g harus dicetak pada koordinat (x1, y2) sedangkan saat ini cursor berada di koordinat (x1+1, y2). Oleh karena itu cursor perlu dipindahkan sebelum mencetak. gotoxy(x1, y2); printf("%c", 200);
/*** g ***/
Pencetakan garis vertikal h mirip dengan pencetakan garis vertikal d, cursor harus diatur setiap kali seruas garis dicetak. for (i = y2 - 1; i >= y1 + 1; i--) { gotoxy(x1, i); printf("%c", 186); }
/*** h ***/
Kedelapan bagian ini kita gabung menjadi Program 1. Program 1. Menggambar Kotak (A) 1 # include <stdio.h> 2 # include
3 4 int main() { 5 int x1, y1, x2, y2, i; 6 7 scanf("%d %d %d %d", &x1, &y1, &x2, &y2); 8 gotoxy(x1, y1); printf("%c",201); /* a 9 for (i = x1 + 1; i < x2; i++) printf("%c", 205); /* b 10 printf("%c", 187); /* c 11 for (i = y1 + 1; i < y2; i++) { /* d 12 gotoxy(x2, i); printf("%c", 186); 13 }
INSTITUT BISNIS dan INFORMATIKA INDONESIA
*/ */ */ */
Menggambar Kotak (Ed. 2) 4/6 14 15 16 17 18 19 20 21 22 23 }
gotoxy(x2, y2); printf("%c", 188); for(i = x2-1; i > x1; i--) { gotoxy(i, y2); printf("%c", 205); } gotoxy(x1, y2); printf("%c", 200); for (i = y2 - 1; i > y1; i--) { gotoxy(x1, i); printf("%c", 186); } return 0;
/* e */ /* f */ /* g */ /* h */
C. Cara Kedua Pada cara ini urutan pencetakan karakter pembentuk kotak tidak runut, yang penting kotaknya jadi. Jika diperhatikan ternyata ada kemiripan pencetakan garis b dan f. Perbedaannya hanya pada posisi baris. Demikian juga dengan kemiripan pencetakan garis vertikal d dan h. Perbedaannya hanya pada posisi kolom. Jadi apabila yang dipentingkan adalah hasil akhir maka urutan pencetakan dapat diubah agar program lebih efisien. Urutan pencetakan adalah a, c, e, g, b dan f, d dan h. Program 2. Menggambar Kotak (B) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# include <stdio.h> # include int main() { int x1, y1, x2, y2, i; scanf("%d %d %d gotoxy(x1, y1); gotoxy(x2, y1); gotoxy(x2, y2); gotoxy(x1, y2);
}
%d", &x1, &y1, &x2, printf("%c", 201); printf("%c", 187); printf("%c", 188); printf("%c", 200);
&y2); /* a */ /* c */ /* e */ /* g */
for (i = x1 + 1; i < x2; i++) { gotoxy(i, y1); printf("%c", 205); gotoxy(i, y2); printf("%c", 205); }
/* b */ /* f */
for (i = y1 + 1; i < y2; i++) { gotoxy(x2, i); printf("%c", 186); gotoxy(x1, i); printf("%c", 186); } return 0;
/* d */ /* h */
D. Kotak Berbagai Bentuk Garis Pada kedua contoh di atas karakter pembentuk kotak adalah garis ganda. Selain bentuk garis ganda mungkin ada baiknya jika program kita bisa mengakomodasi pencetakan kotak dengan bentuk garis lain. Instruksi-instruksi pencetakan kotak kita jadikan sebuah function dengan parameter: 1) koordinat kiri atas, 2) koordinat kanan bawah, 3) kode bentuk garis. Parameter ketiga ada kode bentuk garis, bukan kedelapan karakter pembentuk kotak. Hal ini dilakukan agar mudah bagi instruksi yang memanggil function ini, cukup kirimkan kode kotaknya. Bentuk garis kotak ada empat jenis seperti ditunjukkan Tabel 1. Karakter pembentuk garis horizontal atas dan bawah sama. Karakter pembentuk garis vertikal kiri dan kanan sama. Walaupun demikian kita menggunakan larik delapan karakter untuk memudahkan membayang bentuk karakter yang dimaksud.
INSTITUT BISNIS dan INFORMATIKA INDONESIA
Menggambar Kotak (Ed. 2) 5/6 Tabel 1. Berbagai Bentuk Garis Kotak Kotak
Kode ASCII Karakter Kiri Kiri Kanan Bawah Bawah Bawah
Kiri Atas
Atas
Kanan Atas
1
218
196
191
179
217
196
192
179
2
213
205
184
179
190
205
212
179
3
214
196
183
186
189
196
211
186
4
201
205
187
186
188
205
200
186
Kode
Bentuk
Kiri
Program 3. Menggambar Kotak (C) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
# include <stdio.h> # include void kotak (int x1, int y1, int x2, int y2, int kode) { char kar[8]; int i; switch(kode) { case 1: kar[0] = 218; kar[1] = 196; kar[2] kar[4] = 217; kar[5] = 196; kar[6] break; case 2: kar[0] = 213; kar[1] = 205; kar[2] kar[4] = 190; kar[5] = 205; kar[6] break; case 3: kar[0] = 214; kar[1] = 196; kar[2] kar[4] = 189; kar[5] = 196; kar[6] break; case 4: kar[0] = 201; kar[1] = 205; kar[2] kar[4] = 188; kar[5] = 205; kar[6] } gotoxy(x1, y1); putchar(kar[0]); /* a gotoxy(x2, y1); putchar(kar[2]); /* c gotoxy(x2, y2); putchar(kar[4]); /* e gotoxy(x1, y2); putchar(kar[6]); /* g
}
= 191; kar[3] = 179; = 192; kar[7] = 179; = 184; kar[3] = 179; = 212; kar[7] = 179; = 183; kar[3] = 186; = 211; kar[7] = 186; = 187; kar[3] = 186; = 200; kar[7] = 186; */ */ */ */
for (i = x1 + 1; i < x2; i++) { gotoxy(i, y1); putchar(kar[1]); gotoxy(i, y2); putchar(kar[5]); }
/* b */ /* f */
for (i = y1 + 1; i < y2; i++) { gotoxy(x2, i); putchar(kar[3]); gotoxy(x1, i); putchar(kar[7]); }
/* d */ /* h */
int main() { int x1, y1, x2, y2, kode;
}
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &kode); kotak (x1, y1, x2, y2, kode); return 0;
INSTITUT BISNIS dan INFORMATIKA INDONESIA
Menggambar Kotak (Ed. 2) 6/6
2 3 30 10 2 ••••••••••••••••••••••••••••• • • • • • • • • • • • • •••••••••••••••••••••••••••••
SOAL LATIHAN
1. Tulis function untuk menampilkan kotak dengan urutan yang simetri: kiri tengah atas, kanan tengah atas, kiri tengah bawah, kanan tengah bawah berakhir di tengah kiri dan kanan.
2. Tulis function untuk menampilkan kotak dengan membentuk serangkaian kotak berukuran lebih kecil tapi proporsional dengan ukuran kotak yang diinginkan seperti diilustrasikan gambar di bawah ini. Ketika menggambar kotak berikutnya hapus kotak sebelumnya.
Semua kotak-kotak tersebut mempunyai koordinat kiri atas yang sama seperti diilustrasikan gambar di bawah ini.
INSTITUT BISNIS dan INFORMATIKA INDONESIA