Tuesday, May 13, 2014

Tutorial Pemrograman C/C++: Visualisasi Segitiga Deret Bilangan Ganjil


segitiga
Gambar di samping ini adalah hasil eksekusi dari program console yang menampilkan deret bilangan ganjil dengan visualisasi berupa segitiga. Segitiga disusun oleh deretan karakter yang jumlahnya sama dengan nilai elemen pada deret bilangan ganjil. Pada contoh di samping, program menggunakan karakter caping ‘^’ untuk merepresentasikan elemen deret bilangan ganjil.
Puncak segitiga  dibentuk oleh 1 karakter (elemen pertama deret bilangan ganjil adalah 1). Baris kedua segitia dibentuk oleh 3 karakter (elemen kedua deret bilangan ganjil adalah 3). Dan seterusnya hingga elemen ke-n dengan n adalah masukan berupa integer yang diberikan oleh user. Pada contoh di atas, program menampilkan segitiga untuk 20 bilangan ganjil antara 0-40.
Bagaimanakah kode programnya? Mari kita simak program berikut ini.
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
#include
#include
#include
 
int main()
{
    int i, n, *odd;
    char *s[50];
 
    printf("Masukkan nilai n = ");
    scanf("%d", &n);
 
    odd = (int *)calloc(n, sizeof(int));
 
    for (i=1; i<=n; i++) odd[i-1] = 2*i-1;
 
    for (i=0; i
    {
        s[i] = (char *)calloc(odd[n-1]+1, sizeof(char));
        memset(s[i], 32, odd[n-1]);
        memset(s[i]+n-1-i, '^', odd[i]);
        printf("%s   --> %2d\n", s[i], odd[i]);
        free(s[i]);
    }
    free(odd);
    return 0;
}
Secara singkat, program di atas dapat dijelaskan sebagai berikut.
Variabel int i adalah variabel counter yang nantinya akan digunakan pada perulangan. Sedangkan variabel int n digunakan untuk menyimpan nilai masukan dari user. Variabel pointer int *odd nantinya akan digunakan untuk menyimpan deret bilangan ganjil dengan jumlah elemen sebanyak n, yakni nilai yang dimasukkan user. Dan variabel char *s[50]adalah variabel array dari pointer string sebanyak 50 elemen. Variabel ini digunakan sebagai buffer string tempat untuk “menggambar” segitiga deret bilangan ganjil.
Setelah program menerima masukan nilai n dari user melalui perintah scanf(“%d”, &n), maka program akan mengalokasikan memori pada alamat yang ditunjuk oleh variabel odd sebanyak n menggunakan fungsi calloc() sebagai berikut:
1
odd = (int *)calloc(n, sizeof(int));
Perintah tersebut akan mengalokasikan ruang memori sebanyak n dengan tipedata intdengan nilai yang diinisialisasi menjadi 0. Dengan kata lain, sekarang kita memiliki array integer sebanyak n. Inilah yang disebut sebagai array dinamis.
index01234
odd00000
Selanjutnya, program akan menghitung deret bilangan ganjil menggunakan perulangan for dengan menerapkan rumus bilangan ganjil ke-n = 2*n-1 sebagai berikut.
1
for (i=1; i<=n; i++) odd[i-1] = 2*i-1;
Semisal n=5, maka setelah perulangan selesai, variabel odd akan berisi 1, 3, 5, 7, 9.
index01234
odd13579
Setelah deret bilangan ganjil selesai dihitung, maka selanjutnya program akan “menggambar” segitiga deret bilangan ganjil dengan cara memanipulasi string. Perhatikan perulangan for berikut ini.
1
2
3
4
5
6
7
8
for (i=0; i
{
    s[i] = (char *)calloc(odd[n-1]+1, sizeof(char));
    memset(s[i], 32, odd[n-1]);
    memset(s[i]+n-1-i, '^', odd[i]);
    printf("%s   --> %2d\n", s[i], odd[i]);
    free(s[i]);
}
Baris pertama dalam perulangan berfungsi mengalokasikan string dengan penunjuk s[i]sebanyak odd[n-1]+1 karakter. odd[n-1] adalah elemen terakhir (terbesar) dari deret bilangan ganjil yang telah dihitung pada perulangan sebelumnya. Penambahan 1 karakter pada alokasi memori berguna untuk memastikan bahwa string yang kita bentuk tidakoverload/overrun. Karena pengalokasian menggunakan fungsi calloc(), maka secara otomatis string akan diinisialisasi dengan karakter null.
Jadi n=5, maka s adalah array string dengan jumlah elemen 5 dengan masing-masing elemen string memiliki lebar 10 karakter, yakni bilangan ganjil ke-5 (yakni 9) ditambah 1. Setelah pengalokasian dengan calloc(), maka akan kita dapatkan variabel array string s sebagai berikut:
s[0]nullnullnullnullnullnullnullnullnullnull
s[1]nullnullnullnullnullnullnullnullnullnull
s[2]nullnullnullnullnullnullnullnullnullnull
s[3]nullnullnullnullnullnullnullnullnullnull
s[4]nullnullnullnullnullnullnullnullnullnull
Btw, mengapa inisialisasi dengan nilai ’0\’ sangat penting? Alasannya adalah agar string dapat dicetak dengan benar (null-terminated string).
Selanjutnya, baris kedua dalam perulangan yakni memset(s[i], 32, odd[n-1]); berfungsi mengeset nilai memori dengan alamat yang ditunjuk s[i] dengan karakter kode 32 (spasi) sebanyak odd[n-1] atau untuk n=5, maka odd[n-1] adalah 9. Jadi perintah tersebut mengeset nilai dari 9 elemen/karakter pertama dari s[i] dengan karakter spasi.
Setelah perintah ini, maka susunan karakter dari variabel s[i] adalah sebagai berikut:
index0123456789
s[0]spasispasispasispasispasispasispasispasispasinull
s[1]spasispasispasispasispasispasispasispasispasinull
s[2]spasispasispasispasispasispasispasispasispasinull
s[3]spasispasispasispasispasispasispasispasispasinull
s[4]spasispasispasispasispasispasispasispasispasinull
Setelah string berisi deretan spasi dan diakhiri karakter null, maka langkah selanjutnya adalah menempatkan karakter ‘^’ pada kolom yang sesuai. Perintah untuk melakukan hal ini adalah memset(s[i]+n-1-i, ‘^’, odd[i]);. Perintah ini akan mengeset alamat memori yang ditunjuk oleh s[i]+n-1-i dengan karakter ‘^’ sebanyak odd[i].
Ketika i=0, maka alamat yang ditunjuk adalah s[0]+5-1-0 atau s[0]+4. Adapun jumlah karakter ‘^’ yang diisikan adalah odd[0] yang dalam hal ini bernilai 1. Jadi setelah perintah ini (untuk i=0), maka variabel string s[0] akan menjadi
index0123456789
s[0]spasispasispasispasi‘^’spasispasispasispasinull
Ketika i=1, maka alamat yang ditunjuk adalah s[1]+5-1-1 atau s[1]+3. Adapun jumlah karakter ‘^’ yang diisikan adalah odd[1] yang dalam hal ini bernilai 3. Jadi setelah perintah ini (untuk i=1), maka variabel string s[1] akan menjadi
index0123456789
s[1]spasispasispasi‘^’‘^’‘^’spasispasispasinull
Ketika i=2, maka alamat yang ditunjuk adalah s[2]+5-1-2 atau s[2]+2. Adapun jumlah karakter ‘^’ yang diisikan adalah odd[2] yang dalam hal ini bernilai 5. Jadi setelah perintah ini (untuk i=1), maka variabel string s[2] akan menjadi
index0123456789
s[2]spasispasi‘^’‘^’‘^’‘^’‘^’spasispasinull
Hal yang sama juga diterapkan untuk i=3 dan i=4.
Setelah mengisi karakter ‘^’ pada posisi dan jumlah yang tepat, program mencetak string tersebut dengan printf(“%s   –> %2d\n”, s[i], odd[i]);.
Perintah tersebut, selain mencetak string s[i], juga mencetak nilai bilangan ganjilnya dengan menambahkan tanpa panah ‘—>’ diantara keduanya.
Setelah dicetak, maka program membebaskan alokasi memori dengan perintah free(s[i]);
Proses berlangsung sebanyak n kali dan hasilnya adalah tampilan segitia yang merepresentasikan deret bilangan ganjil.
Nah, berikut adalah hasil eksekusi program dengan masukan nilai n = 40.
segitiga40
Saya mohon maaf jika penjelasan saya kurang lengkap atau kurang terstruktur atau membingungkan. Semoga saja keterampilan menulis saya semakin meningkat sehingga dapat menghasilkan tulisan yang lebih baik.

0 comments:

Post a Comment

Followers

English French German Spain Italian Dutch Russian Portuguese Japanese Korean Arabic Chinese Simplified


  © Blogger template 'A Click Apart' by Ourblogtemplates.com 2008

Back to TOP