Tutorial Pemrograman C/C++: Bahasa C, Satu Bahasa Sejuta Cara
Jika melihat tampilan screenshot di samping ini, kira-kira bagaimanakah programnya?
Terus-terang bingung juga menentukan judul yang cocok untuk postingan kali ini. Kelamaan mikir judul, akhirnya saya putuskan untuk memilih judul seperti di atas – Satu Bahasa Sejuta Cara. Memang agak berlebihan kesannya, tapi kira-kira begitulah kesan saya terhadap bahasa pemrograman C. Dengan bahasa C kita bisa menyelesaikan permasalahan pemrograman dengan banyak cara. Dengan C/C++ programmer bebas berekspresi dan membuat program sesuai dengan gayanya. Namun demikian bahasa C juga termasuk bahasa pemrograman yang sulit dikuasai. Jika tidak berhati-hati, programmer dapat dengan mudah membuat kesalahan atau bug tanpa disadari.
Dengan dikembangkannya bahasa C++, maka progammer C bisa menambah kemampuannya dalam menangani program berskala besar dan kompleks. Dan karena pasar C++ saat ini lebih tinggi dibanding C, maka memang sebaiknya seorang programmer menguasai bahasa C++ jika ingin terjun di dunia pemrograman C/C++.
Btw, saya adalah pengguna C. Saya lebih banyak menggunakan C daripada C++. Oleh karenanya, pada postingan ini semua program yang saya berikan menggunakan bahasa C. Namun demikian, karena C adalah subset dari C++, maka program-program yang saya berikan di sini juga valid untuk kompiler C++.
Baiklah, kita akan langsung membuat program untuk membuat tampilan seperti screenshot di atas.
Program I
Pada program pertama ini, kita akan menggunakan cara yang sederhana.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| #include int main() { int i, j, n; printf ( "Masukkan nilai n = " ); scanf ( "%d" , &n); for (i=1; i<=n; i++) { for (j=1; j<=i; j++) printf ( "%3d" , i); for (j=1; j<=n-i; j++) printf ( "%3d" , 0); printf ( "\n\n" ); } return 0; } |
Program II
Sedikit modifikasi dari Program I dengan mengganti perulangan for dengan while.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include int main() { int i, j; int n; printf ( "Masukkan nilai n = " ); scanf ( "%d" , &n); i = 1; while (i<=n) { for (j=1; j<=i; j++) printf ( "%3d" , i); for (j=1; j<=n-i; j++) printf ( "%3d" , 0); printf ( "\n\n" ); i++; } return 0; } |
Program III
Masih menggunakan perulangan for dengan menambahkan pengkondisi if.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include int main() { int i, j; int n; printf ( "Masukkan nilai n = " ); scanf ( "%d" , &n); i = 1; for (i=1; i<=n; i++) { for (j=1; j<=n; j++) if (j<=i) printf ( "%3d" , i); else printf ( "%3d" , 0); printf ( "\n\n" ); } return 0; } |
Program IV
Tidak ada salahnya juga menggunakan variabel array seperti 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
| #include int main() { int i, j, n; int mat[11][11]; for (i=1; i<=10; i++) for (j=1; j<=10; j++) mat[i][j] = 0; printf ( "Masukkan nilai n = " ); scanf ( "%d" , &n); for (i=1; i<=n; i++) for (j=1; j<=i; j++) mat[i][j] = i; for (i=1; i<=n; i++) { for (j=1; j<=n; j++) printf ( "%3d" , mat[i][j]); printf ( "\n\n" ); } return 0; } |
Program V
Dan tidak ada larangan untuk membuat program yang sedikit rumit untuk menyelesaikan masalah yang mudah seperti 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
| #include #include #include int main() { int i, j, n; char *s[25]; printf ( "Masukkan nilai n = " ); scanf ( "%d" , &n); if (n<1 n="">9) 1> exit (1); for (i=0; i { s[i] = ( char *) calloc (n+1, sizeof ( char )); memset (s[i], '0' , n); memset (s[i], '1' +i, i+1); for (j=0; s[i][j]; j++) printf ( "%3c" , s[i][j]); printf ( "\n\n" ); free (s[i]); } return 0; } |
Untuk Program V ini akan saya berikan sedikit penjelesan mengenai bagaimana proses kerja programnya.
Variabel i dan j adalah variabel untuk index perulangan, sedangkan variabel n adalah variabel untuk menampung masukan nilai dari user. Variabel s adalah array pointer sebanyak 10. Cukup sepuluh karena kita akan membatasi masukan user tidak boleh lebih dari 9. Untuk membatasi masukan digunakan perintah if (n<1 n="">9) exit(1);1> Program akan exit jika user memasukkan nilai kurang-dari 1 atau lebih-dari 9. Jadi user harus memasukkan nilai bilangan bulat antara 1-9.
Pada perulangan for, perintah s[i] = (char *) calloc(n+1, sizeof(char)); akan mengalokasikan memori sebanyak n+1 dengan tipe char. Setelah perintah ini, maka sususans[i] untuk n=8 adalah sebagai berikut:
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s[i] | null | null | null | null | null | null | null | null | null |
Perintah selanjutnya memset(s[i], ’0′, n); akan mengisi nilai s[i] dengan karakter ’0′sehingga susunan s[i] sekarang menjadi:
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s[i] | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
Sekarang s telah menjadi null-terminated string bernilai “00000000”.
Perintah selanjutnya, yakni memset(s[i], ‘1’+i, i+1); akan mengisi s[i] dengan karakter ‘1’+i sebanyak i+1. Untuk i=0, maka karakter yang diisikan adalah ‘1’ sebanyak 1 karakter. Jadi untuk i=0, maka susunan s[0] adalah
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s[0] | ‘1’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
Untuk i=1, maka karakter yang diisikan adalah ‘2’ sebanyak 2 karakter, sehingga susunan karakter s[1] menjadi
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s[1] | ‘2’ | ‘2’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
Dan seterusnya untuk s[2] hingga s[7] sehingga susunan karakter s[0]-s[7] menjadi
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
s[0] | ‘1’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
s[1] | ‘2’ | ‘2’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
s[2] | ‘3’ | ‘3’ | ‘3’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
s[3] | ‘4’ | ‘4’ | ‘4’ | ‘4’ | ‘0’ | ‘0’ | ‘0’ | ‘0’ | null |
s[4] | ‘5’ | ‘5’ | ‘5’ | ‘5’ | ‘5’ | ‘0’ | ‘0’ | ‘0’ | null |
s[5] | ‘6’ | ‘6’ | ‘6’ | ‘6’ | ‘6’ | ‘6’ | ‘0’ | ‘0’ | null |
s[6] | ‘7’ | ‘7’ | ‘7’ | ‘7’ | ‘7’ | ‘7’ | ‘7’ | ‘0’ | null |
s[7] | ‘8’ | ‘8’ | ‘8’ | ‘8’ | ‘8’ | ‘8’ | ‘8’ | ‘8’ | null |
Selanjutnya, program akan membuat tampilan seperti screenshot di atas dengan menggunakan perintah for (j=0; s[i][j]; j++) printf("%3c", s[i][j]); dan printf(“\n\n”);
Perulangan j dimulai dari 0 hingga s[i][j] dengan penambahan j=j+1 pada setiap perulangan. Jika kita perhatikan, kondisi perulangan for j hanya ditulis s[i][j] tanpa operator pembanding.
Bagaimanakah kondisi s[i][j] yang tanpa operator pembanding seperti ==, <, atau >dapat menghentikan perulangan for j?
Pada bahasa C, nilai logika FALSE direpresentasikan sebagai 0 (nol) dan selain nol akan dinyatakan sebagai logika TRUE. Jadi perulangan for j yang dimulai dari 0 dan akan terus diulang selama nilai s[i][j] tidak-sama-dengan nol. Inilah mengapa kita mengalokasikan sebanyak n+1 dan menginisialisasi setiap array-of-char dengan 0 (null).
Untuk lebih mudahnya, perulangan for j dapat ditulis menjadi for (j=0; s[i][j]!=0; j++) atau lebih mudah lagi menjadi for (j=0; j.
Pada prakteknya, penulisan kode program yang rumit (less-readable) dipersilakan untuk kebutuhan pribadi, tapi sebaiknya tidak dipraktekkan pada kerja tim. :D
Jadi perulangan for j akan mencetak per karakter dari string s[i] dengan format “%3c” untuk memberikan jarak pada masing-masing karakter. Sedangkan printf(“\n\n”); berfungsi untuk memberi jarak baris pada masing-masing string.
Nah, saya rasa demikian penjelasan singkat untuk Program V. Dan saya rasa lima buah program cukup untuk mewakili judul di atas. Mungkin judul di atas perlu diganti menjadiBahasa C, Satu Bahasa Lima Cara.
0 comments:
Post a Comment