i
i
“bukuAjar” — 2011/9/22 — 13:39 — page i — #1
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page ii — #2
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page iii — #3
i
i
Pemrograman Menggunakan Bahasa C
Taufik Fuadi Abidin Irvanizam Zamanhuri Program Studi Informatika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Syiah Kuala
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page iv — #4
i
i
The work in this project was partially supported by Program Studi Informatika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Syiah Kuala
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page v — #5
i
i
Kata Pengantar Syukur Alhamdulillah penulis panjatkan ke hadirat Allah SWT yang telah melimpahkan rahmat-Nya sehingga penulis dapat menyelesaikan penulisan Buku Ajar yang berjudul "Pemrograman Menggunakan Bahasa C". Selawat dan salam penulis sanjungkan kepada Nabi Besar Muhammad SAW, keluarga dan sahabat beliau. Buku Ajar ini sangat bagus digunakan untuk mengajarkan Matakuliah Pemrograman bagi mahasiswa-mahasiswa baik Strata Satu (S1) Informatika atau Matematika maupun Diploma Tiga (D3) Manajemen Informatika. Di dalam buku ini disajikan tentang konsep-konsep dasar bahasa pemrograman C yang meliputi Input/Output serta Pernyataan, Tipe Data, Pernyataan Bersyarat, Perulangan, Array, Pointer, Fungsi, File, dan Typedef dan Struct. Semua materi tersebut disajikan sangat jelas dengan dilengkapi visualisasi dari program serta contoh-contoh program yang efektif dan efisien sehingga mahasiswa dengan mudah memahami konsep-konsep bahasa C. Penulisan Buku Ajar ini merupakan salah satu kegiatan akademik program studi Informatika, Fakultas Matematika dan Ilmu Pengetahuan Alam (FMIPA), Universitas Syiah Kuala (Unsyiah) dan didanai sepenuhnya oleh FMIPA Unsyiah melalui Dana Rutin Tahunan. Oleh karena itu, penulis ingin mengucapkan terimakasih kepada Pihak Dekanan FMIPA, Unsyiah dan pihak-pihak terkait lainnya yang telah mendukung secara langsung atau tidak langsung dalam penyempurnaan penulisan buku ajar ini. Akhirnya penulis juga menyadari bahwa penulisan Buku Ajar ini masih jauh dari kesempurnaan. Oleh karena itu kritik dan saran yang membangun sangat penulis harapkan. Semoga buku ini bermanfaat bagi semua pihak yang terkait dan menjadi lebih sempurna pada masa yang akan datang. Banda Aceh, Juni 2011 Taufik Fuadi Abidin & Irvanizam Zamanhuri
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page vi — #6
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page vii — #7
i
i
Daftar Isi Kata Pengantar
v
Daftar Isi
vii
Daftar Gambar
xi
Daftar Tabel
xiii
1 Pendahuluan ANSI/C dan Contoh 1.1 Pengantar . . . . . . . . . . . . . . 1.2 Objektif . . . . . . . . . . . . . . . 1.3 ANSI/C . . . . . . . . . . . . . . . 1.4 Penulisan Program yang Baik . . . 1.5 Kompilasi Menggunakan gcc . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
1 1 1 2 2 3
2 Input Output dan Pernyataan 2.1 Pendahuluan . . . . . . . . . . . 2.2 Objektif . . . . . . . . . . . . . . 2.3 Penggunaan printf() dan scanf() 2.4 Contoh Program . . . . . . . . . 2.5 Penggunaan Library ctype . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
5 5 5 5 7 10
. . . . .
3 Tipe Data 11 3.1 Pendahuluan . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 Objektif . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.3 Tipe Data Primitif . . . . . . . . . . . . . . . . . . . . 11 3.4 Presidensi dan Urutan Pemrosesan (Associativity) Operator dalam C . . . . . . . . . . . . . . . . . . . . . . 13 3.5 Operator-Operator . . . . . . . . . . . . . . . . . . . . 13 3.5.1 Operator Aritmatik, Relasional, dan Increment/Decrement . . . . . . . . . . . . . . . . . 13
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page viii — #8
i
3.6
3.5.2 Operator Assignment (=) . . . . . . . . . . . . 3.5.3 Assignment Operator . . . . . . . . . . . . . . . Konversi Tipe Data . . . . . . . . . . . . . . . . . . . .
i
14 15 16
4 Pernyataan Bersyarat (Conditional Statement) 4.1 Pendahuluan . . . . . . . . . . . . . . . . . . . . 4.2 Objektif . . . . . . . . . . . . . . . . . . . . . . . 4.3 Konsep Pernyataan Bersyarat . . . . . . . . . . . 4.4 Serangkaian Pernyataan (Compound Statement) . 4.5 Lokal Variabel . . . . . . . . . . . . . . . . . . . . 4.6 if dan if else Statement . . . . . . . . . . . . . . . 4.7 Switch Statement . . . . . . . . . . . . . . . . . . 4.8 Break dan Continue Statements . . . . . . . . . . 4.9 Continue Statement Lanjutan . . . . . . . . . . . 4.10 Conditional Operator . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
19 19 19 20 20 21 22 25 26 28 29
5 Perulangan (Loop) 5.1 Pendahuluan . . . . . . . . . . . . . . 5.2 Objektif . . . . . . . . . . . . . . . . . 5.3 do while Statement . . . . . . . . . . . 5.3.1 do while Statement (Dasar) . . 5.3.2 do while Statement (Lanjutan) 5.4 for Statement . . . . . . . . . . . . . . 5.4.1 for Statement (Dasar) . . . . . 5.4.2 for Statement (Lanjutan) . . . 5.5 while statement . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
31 31 31 31 31 33 34 34 35 37
. . . . . . . . . . .
41 41 41 41 41 42 42 42 43 43 44 44
. . . . . . . . .
. . . . . . . . .
6 Lanjutan Perulangan (Loop) dan Contoh 6.1 Pendahuluan . . . . . . . . . . . . . . . . 6.2 Objektif . . . . . . . . . . . . . . . . . . . 6.3 Contoh Perulangan for (Lanjutan) . . . . 6.3.1 Contoh 1 . . . . . . . . . . . . . . 6.3.2 Contoh 2 . . . . . . . . . . . . . . 6.3.3 Contoh 3 . . . . . . . . . . . . . . 6.3.4 Contoh 4 . . . . . . . . . . . . . . 6.3.5 Contoh 5 . . . . . . . . . . . . . . 6.3.6 Contoh 6 . . . . . . . . . . . . . . 6.3.7 Contoh 7 . . . . . . . . . . . . . . 6.3.8 Contoh 8 . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page ix — #9
i
7 Array Satu Dimensi 7.1 Pendahuluan . . . . . . . . . . . . 7.2 Objektif . . . . . . . . . . . . . . . 7.3 Definisi dan Pendeklarasian Array 7.4 Inisialisasi Nilai . . . . . . . . . . . 7.5 Indeks (Subscript) Dari Array . . . 7.6 Alokasi Memory Array . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
i
. . . . . .
8 Array Dua Dimensi 8.1 Pendahuluan . . . . . . . . . . . . . . . . . . . . . 8.2 Objektif . . . . . . . . . . . . . . . . . . . . . . . . 8.3 Pendeklarasian Array Dua Dimensi . . . . . . . . . 8.4 Inisialisasi Nilai . . . . . . . . . . . . . . . . . . . . 8.5 Indeks (Subscript) Dari Array Dua Dimensi . . . . 8.6 Alokasi memori untuk Array Dua Dimensi . . . . . 8.7 Contoh Program Menggunakan Array Dua Dimensi 8.7.1 Inisialiasi Nilai Array Dua Dimensi . . . . . 8.7.2 Pengurutan Data Dalam Array . . . . . . . 8.7.3 Penjumlahan Matrix Menggunakan Array . 9 Pointer 9.1 Pendahuluan . . . . . . 9.2 Objektif . . . . . . . . . 9.3 Pendeklarasian Pointer . 9.4 Visualisasi Pointer . . . 9.5 Operator Dereferensing . 9.6 Pointer Vs Array . . . . 9.7 String . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
10 Fungsi 10.1 Pendahuluan . . . . . . . . . . . . 10.2 Objektif . . . . . . . . . . . . . . . 10.3 Pendeklarasian Fungsi . . . . . . . 10.4 Fungsi Bertipe Void . . . . . . . . 10.5 Jenis-Jenis Fungsi . . . . . . . . . . 10.5.1 Fungsi Called by Value . . . 10.5.2 Fungsi Called by Reference 10.6 Fungsi String . . . . . . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . .
. . . . . . . . . .
. . . . . . .
. . . . . . . .
. . . . . .
45 45 45 45 46 47 47
. . . . . . . . . .
49 49 49 49 50 51 51 52 52 54 54
. . . . . . .
55 55 55 55 56 57 60 61
. . . . . . . .
63 63 63 63 65 66 66 67 68
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page x — #10
i
11 File 11.1 11.2 11.3 11.4 11.5
Pendahuluan . . . . . . . . . . . . . . . . . . Objektif . . . . . . . . . . . . . . . . . . . . . File . . . . . . . . . . . . . . . . . . . . . . . . Beberapa Contoh Manipulasi File . . . . . . . Beberapa Fungsi untuk Manipulasi File Teks
12 Typedef & Struct 12.1 Pendahuluan . . . . . . . . . . . 12.2 Objektif . . . . . . . . . . . . . . 12.3 Typedef . . . . . . . . . . . . . . 12.4 Penggunaan Typedef Pada Array 12.5 Contoh Penggunaan Typedef . . 12.6 Struct . . . . . . . . . . . . . . . 12.7 Pointer ke Sebuah Struct . . . . . Daftar Pustaka
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
i
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
73 73 73 73 74 76
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
77 77 77 77 78 79 79 80 83
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page xi — #11
i
i
Daftar Gambar 1.1
Contoh penulisan program yang baik.
3.1 3.2 3.3 3.4 3.5
Presidensi dan Urutan Pemrosesan (Associativity) Operator Aritmatik. . . . . . . . . . . . . . . . . . Operator Relasional. . . . . . . . . . . . . . . . . . Operator Increment/Decrement. . . . . . . . . . . . Contoh Operator Assignment. . . . . . . . . . . . .
. . . . .
. . . . .
13 14 14 15 15
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8
Contoh Contoh Contoh Contoh Contoh Contoh Contoh Contoh
. . . . . . . .
. . . . . . . .
21 23 23 25 27 29 29 30
5.1 5.2 5.3
Contoh penggunaan do while statement lanjutan . . . Dua buah program menggunakan do while statement . Konversi program C yang menggunakan for statement ke do while statement . . . . . . . . . . . . . . . . . . . Program untuk menghitung total penjumlahan 10 bilangan integer positif pertama . . . . . . . . . . . . . Beberapa program dengan menggunakan for statement Contoh program dengan menggunakan double for statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . Konversi statement while ke dalam bentuk do while dan for . . . . . . . . . . . . . . . . . . . . . . . . . . .
33 34
5.4 5.5 5.6 5.7 7.1 7.2 7.3
penggunaan variabel lokal . . penggunaan if else statement penggunaan if else statement penggunaan switch statement penggunaan break statement continue statement lanjutan conditional operator . . . . . conditional operator . . . . .
. . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
Contoh penginisialisasi array . . . . . . . . . . . . . . Visualisasi alamat array . . . . . . . . . . . . . . . . . Indeks (Subscript) dari array . . . . . . . . . . . . . .
3
35 36 36 37 38 46 47 47
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page xii — #12
i
i
7.4
Contoh penggunaan array dan visualisasinya . . . . . .
48
8.1 8.2 8.3 8.4 8.5
Visualisasi pendeklaraisin array dua dimensi . . . . . . Contoh penginisialisasi array dua dimensi . . . . . . . Indeks (Subscript) dari array dua dimensi . . . . . . . Visualisasi array dua dimensi dalam bentuk satu dimensi Visualiasai array num[i][j] . . . . . . . . . . . . . . . .
50 51 51 52 53
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8
Visualisasi pointer . . . . . . . Visualisasi pointer . . . . . . . Visualisasi pointer . . . . . . . Visualisasi pointer . . . . . . . Visualisasi pointer . . . . . . . Visualisasi pointer . . . . . . . Visualisasi pointer pada array . Kesamaan array dengan pointer
. . . . . . . .
56 58 59 59 59 60 60 60
10.1 Visualisasi fungsi . . . . . . . . . . . . . . . . . . . . . 10.2 Visualisasi fungsi . . . . . . . . . . . . . . . . . . . . . 10.3 Visualisasi fungsi . . . . . . . . . . . . . . . . . . . . .
66 68 68
12.1 Visualisasi struct . . . . . . . . . . . . . . . . . . . . . 12.2 Visualisasi struct . . . . . . . . . . . . . . . . . . . . .
80 81
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page xiii — #13
i
i
Daftar Tabel 2.1
Format Tipe Data . . . . . . . . . . . . . . . . . . . .
6
4.1
Operator relasional . . . . . . . . . . . . . . . . . . . .
20
11.1 Parameter Mode untuk Akses File . . . . . . . . . . .
74
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page xiv — #14
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 1 — #15
i
i
Bab 1
Pendahuluan ANSI/C dan Contoh 1.1
Pengantar
Bahasa C adalah bahasa pemrograman yang sangat populer dan powerful. Bahasa ini mulai dirancang sekitar tahun 70-an oleh Dennis Ritchie di Bell Laboratories dan menjadi ANSI C (standard C) pada awal tahun 1980. Bahasa pemrograman C banyak digunakan sebagai kernel bagi bahasa-bahasa yang baru dan lebih spesifik seperti C++ yang merupakan pengembangan lebih lanjut dari standard C. Contoh lain adalah Java, walau bukan merupakan kelanjutan dari standard C, tetapi banyak sintaks dalam Java yang mirip dengan sintaks C.
1.2
Objektif
Objektif dari materi ini adalah (i) memberikan gambaran awal tentang bahasa C, (ii) memperkenalkan bahasa C dengan contoh, (iii) mengajarkan teknik-teknik penulisan program yang baik, (iv) memilih nama untuk variabel, (v) indentation, dan (vi) penjelasan dalam program (comment).
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 2 — #16
i
2
i
Bab 1. Pendahuluan ANSI/C dan Contoh
1.3
ANSI/C
• Didesain oleh Dennis Ritchie di Bell Laboratory (Sekarang AT&T) • Diimplementasi sebagai bahasa pemograman Operating System (OS) Unix pada mini komputer PDP-11 di tahun 1972 • Berkembang dari bahasa B yang berjalan di mesin BCPL yang dikembangkan oleh Martin Richard di tahun 1967. • Tujuannya adalah menyempurnakan B dan merealisasikan ide pemograman berstruktur. • Tradisional C terwujud di tahun 80-an dan berhasil menjadi ANSI/ISO standard di tahun 1990. Adapun karakteristik adalah • Portable: – Dapat dengan mudah dipindahkan dari satu perangkat keras ke perangkat keras yang lain – Menyediakan standard library (fungsi-fungsi) • Mendukung modular programming: Program ditulis dalam beberapa modul atau dipisahkan dalam beberapa file • Dapat dikategorikan sebagai ’middle level language’
1.4
Penulisan Program yang Baik
Program yang ditulis dengan baik akan mengikuti kaidah-kaidah penulisan program yang telah disepakati. Penulisan program yang baik harus disertai dengan beberapa komen yang dapat memudahkan orang lain memahami alur dari program.
Selain itu, penulisan
program yang baik harus memiliki indent untuk blok program dan konsistensi dalam penamaan variabel.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 3 — #17
i
1.5. Kompilasi Menggunakan gcc
i
3
Gambar 1.1: Contoh penulisan program yang baik.
1.5
Kompilasi Menggunakan gcc
Kompile program di atas dengan menulis perintah berikut pada terminal (Linux): gcc -Wall -pedantic -g -o konversi konversi.c
Hasil kompilasi di atas akan membuat sebuah file dengan nama konversi (dibangkitkan dari sebuah buah konversi.c). Selanjutnya, file konversi tersebut dapat dijalankan secara langsung melalui terminal dengan perintah: ./konversi
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 4 — #18
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 5 — #19
i
i
Bab 2
Input Output dan Pernyataan 2.1
Pendahuluan
Pemahaman Bahasa Pemrograman C akan lebih mudah melalui contoh-contoh.
Dengan memperhatikan dan memahami contoh-
contoh program, mahasiswa diharapkan dapat memahami konsep bahasa pemrograman yang dipelajari secara lebih mudah dan cepat. Pada bab ini, pemahaman terhadap konsep dasar pemrograman C dilakukan dengan membahas dan memahami beberapa contoh program.
2.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan fungsi input dan output, (ii) pernyataan (Statement), dan iii mengajarkan teknikteknik penulisan program yang baik.
2.3
Penggunaan printf() dan scanf()
Fungsi printf() digunakan untuk output, sedangkan scanf() digunakan untuk input. Huruf "f" dalam printf dan scanf merupakan kepen-
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 6 — #20
i
6
i
Bab 2. Input Output dan Pernyataan
dekan dari kata "f ormatted".
Kedua fungsi tersebut dideklarasi
dalam header file stdio.h. Header file ini harus disertakan dalam program menggunakan kata kunci include.
/* standard library dimana EXIT_SUCCESS, EXIT_FAILURE, dan Lain-lain didefinisikan*/ #include <stdlib.h> /* standard I/O dimana printf dan scanf didefinisikan*/ #include <stdio.h>
printf dan scanf secara garis besar menerima dua argumen, yaitu string pengatur (control string) dan argumen lainnya. String pengatur digunakan untuk menentukan format dari argumen yang dikirim. Contoh:
Tabel Karakter Konversi c d u e f s ld lf o, x
2.1: Format Tipe Data Format argumen Character Decimal integer Unsigned decimal integer Floating point dalam notasi scientific Floating point (pecahan) String Long integer Double Octaldecimal dan hexadecimal
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 7 — #21
i
2.4. Contoh Program
2.4
i
7
Contoh Program
Pada sub bab 2.4 akan menampilkan beberapa contoh program C menggunakan fungsi printf , scanf, dan beberapa operator matematika. Selain itu juga pada sub bab 2.4 juga menampilkan contoh program penjumlahan dua variabel dan perintah assingment, penggunaan string pengatur %x untuk mengkonversi integer (basis 10) menjadi dalam format hexa desimal (basis 16), dan penggunaan string pengatur %o untuk mengkonversi integer (basis 10) menjadi dalam format hexa desimal (basis 8). Program 1 Penggunaan fungsi printf. #include < stdio.h> void main(void) { printf("\n"); printf("Hello Students."); printf("\n"); }
Program 2 Penjumlahan dua variabel dan perintah assingment. #include <stdio.h> void main(void) { int i,j,k; i = 4; j = 5; k = i + j; printf("Penjumlahan dua variabel i+j=%d\n",k); }
Program 6 memperlihatkan penggunaan pernyataan penjumlahan menggunakan perintah (operator)= dan pernyataan increment (++). Walaupun keduanya akan menghasilkan keluaran yang sama, namun pernyataan yang ditulis menggunakan (operator)= dan increment (++) diyakini, walaupun tidak signifikan, akan lebih cepat.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 8 — #22
i
8
i
Bab 2. Input Output dan Pernyataan
Program 3 Penggunaan string pengatur %x untuk mengkonversi integer (basis 10) menjadi dalam format hexa desimal (basis 16) #include <stdio.h> void main(void) { int i = 100; printf(" %x\n",i); } Program 4 Penggunaan string pengatur %o untuk mengkonversi integer (basis 10) menjadi dalam format hexa desimal (basis 8). #include <stdio.h> void main(void) { int i = 74; printf(" %o\n",i); } Program 5 Penggunaan scanf untuk beberapa tipe data. #include <stdio.h> #include <stdlib.h> int main(void){ char c1, c2; int ibil; float fbil; double dbil; printf("\n%s\n%s\n", "Demo scanf untuk beberapa tipe data","Input dua karakter, sebuah integer, float dan double"); scanf("%c,%c,%d,%f,%lf", &c1, &c2, &ibil, &fbil, &dbil); printf("\nOutput:\n"); printf("%4c %4c %5d %12.3f %15e\n\n",c1, c2, ibil, fbil,dbil); exit(EXIT_SUCCESS); }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 9 — #23
i
2.4. Contoh Program
i
9
Program 6 Penggunaan pernyataan increment dan (operator)=. #include <stdio.h> #include <stdlib.h> #define MAXLOOP 10 int main(void) { int counter = 1, total = 0; while(counter <= MAXLOOP) { total += counter; counter++; } printf("Total = %d\n ", total); exit(EXIT_SUCCESS); } #include <stdio.h> #include <stdlib.h> #define MAXLOOP 10 int main(void) { int counter = 1, total = 0; while(counter <= MAXLOOP){ total = total + counter; counter = counter + 1; } } printf("Total = %d\n ", total); exit(EXIT_SUCCESS); }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 10 — #24
i
10
i
Bab 2. Input Output dan Pernyataan
2.5
Penggunaan Library ctype
Library ctype dapat digunakan untuk memanipulasi karakter. Library ini sudah build-in pada bahasa pemrograman C. Program 7 Contoh program menggunakan library ctype. #include <stdio.h> #include <stdlib.h> #include
int main(void) { int character; while((character = getchar()) != EOF){ if(character == ’\n’) putchar(’\n’); else if(islower(character)) putchar(character = toupper(character)); else putchar(character); } exit(EXIT_SUCCESS); }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 11 — #25
i
i
Bab 3
Tipe Data 3.1
Pendahuluan
Setiap bahasa pemograman menyediakan tipe data.
C memiliki
beberapa tipe data primitif (intrinsic data type) yang merupakan bagian dari bahasa C itu sendiri. C juga memiliki tipe data lain yang biasa dikenal dengan istilah aggregate data type seperti array. Komplek data tipe dapat dibuat dengan kombinasi antara kedua tipe data tersebut. Bab ini akan membahas bagaimana deklarasi, ekspresi serta cara memanipulasi tipe data dalam C.
3.2
Objektif
Objektif dari bab ini adalah (i) memperkenalkan tipe data dan operator dalam C, (ii) menjelaskan beberapa contoh yang dapat menjebak programmer berkaitan dengan tipe data sehingga menimbulkan error, dan (iii) menjelaskan cara mengkonversi satu tipe data ke tipe data yang lain
3.3
Tipe Data Primitif
Pada dasarnya keyword signed sangat jarang digunakan karena signed int sama artinya dengan int. Compiler mengerti bila suatu variable
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 12 — #26
i
12
i
Bab 3. Tipe Data
dideklarasikan bertipe int maka variable tersebut adalah signed int atau bilangan integer positif maupun negatif. Unsigned int berarti bilangan yang dimaksud adalah bilangan integer positif saja. char signed short int unsigned short int float
signed char signed int unsigned int double
unsigned char signed long int unsigned long int long double
Untuk tipe komputer 16 bits, tipe data short dan int membutuhkan memori sebesar 2 byte dan long 4 byte. Sedangkan untuk komputer 32 bits, tipe data short membutuhkan memori sebesar 2 byte dan int dan long sebesar 4 byte. • Signed int – Komputer 16 bits −215 ≤ int ≤ 215 − 1 = −32768 ≤ int ≤ +32767 – Komputer 32 bits −231 ≤ int ≤ 231 − 1 = −2147483648 ≤ int ≤ +2147483647 • Unsigned int – Komputer 16 bits 0 ≤ int ≤ 216 − 1 = 0 ≤ int ≤ +65535 – Komputer 32 bits 0 ≤ int ≤ 232 − 1 = 0 ≤ int ≤ +4294967295 Fungsi sizeof digunakan untuk mengetahui ukuran memori yang dibutuhkan oleh suatu variabel bertipe data tertentu. Penyataan berikut memperlihatkan penggunaan dari fungsi sizeof tersebut. printf("Ukuran int = %d, Ukuran double = %d\n", sizeof(int), sizeof(double));
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 13 — #27
i
i
3.4. Presidensi dan Urutan Pemrosesan (Associativity) Operator dalam C 13
3.4
Presidensi dan Urutan Pemrosesan (Associativity) Operator dalam C
Gambar 3.1 memperlihatkan urutan pemrosesan dan presidensi dari sebuah operator dalam pemrograman C. Urutan pemrosesan dan presidensi harus diketahui agar keluaran dari pernyataan gabungan tidak keliru.
Gambar 3.1: Presidensi dan Urutan Pemrosesan (Associativity)
3.5 3.5.1
Operator-Operator Operator Aritmatik, Relasional, dan Increment/Decrement
Gambar 3.2 menampilkan operator aritmatika. Gambar 3.3 menampilkan operator relasional dan gambar 3.4 menampilkan operator increment/decrement.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 14 — #28
i
14
i
Bab 3. Tipe Data
Gambar 3.2: Operator Aritmatik.
Gambar 3.3: Operator Relasional.
Contoh: x y x y x y
3.5.2
= = = = = =
5; x++; 5; ++x; 5; x + x++;
Berapakah nilai y ?
Operator Assignment (=)
Penggunaan operator assignment (=) sering menjebak programmer karena operator ini bukanlah operator boolean (= =) yang digunakan untuk membandingkan dua buah nilai.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 15 — #29
i
i
15
3.5. Operator-Operator
Gambar 3.4: Operator Increment/Decrement.
Gambar 3.5: Contoh Operator Assignment.
3.5.3
Assignment Operator
Penggunaan pernyataan:
variabel(operator)=ekspresi memberikan
keluaran yang sama dengan pernyataan variabel=variable (operator) ekspresi. Contoh:
y y y y
+= /= += +=
x; (x + 2); (x %= 3)-(t *= 5); (x == 2)
y = y + x; y = y / (x + 2); y= y+ (x=x%3) - (t=t*5);
Berapakah nilai y jika nilai awal y = 10 dan x = 0 ?
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 16 — #30
i
16
i
Bab 3. Tipe Data
3.6
Konversi Tipe Data
Konversi data dapat dilakukan secara otomatis (automatic conversion/promotion) dan konversi secara manual (eksplisit/casting). Pengkonversian secara otomatis terjadi apabila dalam suatu pernyataan memiliki dua variabel dengan tipe yang berbeda sehingga salah satu dari variabel tersebut akan dikonversikan berdasarkan urutan berikut: int
Contoh char c; short s; int i; long l; unsigned u; float f; double d; long double ld; c u c u
- s / * 3.1 + 3 - ld
i dikonversi menjadi int - i dikonversi menjadi double dikonversi menjadi int dikonversi menjadi long double
Pengkonversian secara manual (casting) dilakukan secara ekslisit oleh programmer. Jika i adalah variabel bertipe int, maka • (double) i : Mengakibat i secara eksplisit terkonversi menjadi tipe double • (float) i + 3 : Equivalen dengan ((float) i) + 3 Berhubung operator casting lebih tinggi presidensinya dari pada operator + maka tanda kurung tidak perlu digunakan
Contoh
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 17 — #31
i
3.6. Konversi Tipe Data
i
17
x = (float) ((int) y + 1); (double) (x = 77) Tidak sama artinya dengan (double) x = 77, mengapa? int x = 7; int y = 3; float f; f = x / y; Nilai f = 2 f = (float) x / float (y); Nilai f = 2.3
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 18 — #32
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 19 — #33
i
i
Bab 4
Pernyataan Bersyarat (Conditional Statement) 4.1
Pendahuluan
Pernyataan bersyarat (conditional statement) dalam pemrograman lebih dikenal dengan istilah flow control of statement. C memiliki beberapa jenis conditional statement, antara lain: • if dan if...else statement • switch statement • break dan continue statement • conditional operator (?:)
4.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan dan menjelaskan loop dan conditional statement, dan (ii) menjelaskan perbedaan antara satu statement dengan statement yang lain
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 20 — #34
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
20
4.3
Konsep Pernyataan Bersyarat
Program-program bahasa C dieksekusikan secara berurutan dari baris ke baris. Namun, program tersebut bisa dikontrol eksekusinya dengan menggunakan suatu mekanisme pengontrol. Mekanisme pengontrol tersebut membandingkan suatu pernyataan dengan pernyataan lain yang dikenal sebagai kondisi, lalu mengeksekusi perintah-perintah yang memenuhi kondisi tersebut.
Dengan kata lain, jika kon-
disinya bernilai Benar (TRUE) maka compiler C akan menggerjakan semua perintah-perintah yang berada dalam prosedur mekanisme pengontrol. Mekanisme pengontrol dapat diimplementasikan dengan mengunakan operator relasional. Tabel 4.1 menampilkan operator-operator relasional. Tabel 4.1: Operator relasional Operator Simbol sama dengan == tidak sama dengan != lebih kecil < lebih besar > lebih kecil atau sama dengan ≤ lebih besar atau sama dengan ≥ tidak (not) ! dan (and) && atau (or) ||
4.4
Serangkaian Pernyataan (Compound Statement)
Compound statement atau serangkaian statement yang saling berkaitan biasanya ditulis secara berkelompok dalam tanda kurung kurawal { dan }. C menggunakan { dan } untuk mengapit beberapa statement dalam satu blok. Program 8 merupakan potongan program C dengan menggunakan Compound statement.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 21 — #35
i
4.5. Lokal Variabel
i
21
Program 8 Potongan program dengan menggunakan Compound statement. { a = 1; if (a > 0) { int b = a; b++; a += b; } }
Biasanya statement if, if..else, while, for, do dan switch selalu diikuti dengan statement yang berkaitan dengannya. Statement yang mengikuti if, if..else, while, for, do dan switch dapat berupa single statement maupun compound statement.
4.5
Lokal Variabel
C membenarkan pendeklarasian lokal variabel. Lokal variabel yang dideklarasikan dalam suatu blok akan bersifat private (tidak dapat diakses diluar blok). Gambar 4.1 menunjukkan contoh penggunaan variabel lokal.
Gambar 4.1: Contoh penggunaan variabel lokal
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 22 — #36
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
22
4.6
if dan if else Statement
Bentuk umum dari if statement adalah sebagai berikut: if () { }
Jika bernilai true maka perintah akan dieksekusikan.
Program 9 merupakan
potongan program C menggunakan if statement Program 9 Potongan program dengan menggunakan if statement. int main(){ int x=0; if(x !=0){ printf("Nilai x sama dengan nol"); } printf("Nilai x tidak sama dengan nol"); }
Sedangkan Bentuk umum dari if else statement adalah sebagai berikut: if () <statement #1> else <statement #2>
Dimana jika bernilai benar, maka <statement #1> dieksekusikan. Sebaliknya, jika bernilai salah, maka <statement #2> yang akan dieksekusikan. Namun pada realita, kadang-kadang sebuah program C mempunyai dua buah atau lebih ekspresi if else yang berada secara berdekatan. Hal ini membuat sedikit bingung bagi programmer untuk mengetahui ekspresi statement else mana yang akan menjadi "pasangan" bagi if tertentu. Akan tetapi, kompiler C secara automatis mengetahui setiap pasangan if else dan ini akan ditunjukkan melalui gambar 4.2
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 23 — #37
i
4.6. if dan if else Statement
i
23
Gambar 4.2: Contoh penggunaan if else statement dan 4.3. Pada gambar 4.2 terlihat bahwa else pertama (else a–) sangat dekat dengan statement if(y>0). Oleh karena itu, statement else itu merupakan else bagi if(y>0). Sedangkan statement else b = b/2 menjadi statement else bagi statement if (x>0).
Gambar 4.3: Contoh penggunaan if else statement Sebagai tambahan, jika pada kondisi statement if mempunyai lebih dari dua statement, maka statement-statement tersebut akan diapit oleh tanda kurung kurawal { dan }. Berikut bentuk umum dari if else statement untuk kondisi ini. if () { } else { }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 24 — #38
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
24
Program 10 merupakan potongan program C menggunakan if else statement dan menghasilkan sebuah program untuk menentukan nilai huruf dari kalkulasi nilai tugas, ujian tengah semester(uts) dan ujian akhir semester(uas). Kompiler C mengecek hasil dari variabel nilai. Jika nilai lebih kecil dari 90, kompiler C akan mengeksekusi statement else yang terdapat di dalamnya statement if (nilai ≥ 80). Setelah itu, jika nilai lebih kecil dari 80 maka kompiler C akan mengeksekusi statement else yang ke dua dan begitu juga seterusnya. Program 10 Potongan program dengan menggunakan if else statement. int main() { float uts, nilai, uas, tugas; printf("Tugas: "); scanf("\%f",\&tugas); printf("UTS: "); scanf("\%f",\&uts); printf("UAS: "); scanf("\%f",\&uas); nilai = 0.2 * tugas + 0.3 * uts + 0.5 * uas; if (nilai >= 90) printf("Nilai A"); else if (nilai >= 80) printf("Nilai B"); else if (nilai >= 65) printf("Nilai C"); else if (nilai >= 50) printf("Nilai D"); else printf("Nilai E"); return 0; } Adapun luaran dari program di atas adalah tergantung dari nilai inputan tugas, uas, dan uts. Setiap inputan nilai-nilai tersebut dimasukkan ke dalam sebuah alamat memory melalui perintah scanf. Inputan nilai tersebut ditampung ke dalam sebuah memory yang berbeda-beda. Asumsikan inputan tugas, uts, dan uas adalah 75, 70, 90, maka luaran dari program 10 adalah: Nilai B
Latihan: Berdasarkan contoh program 10, coba modifikasi program
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 25 — #39
i
4.7. Switch Statement
i
25
tersebut dengan menambahkan tanda kurung kurawal { dan } pada setiap statement if else.
4.7
Switch Statement
Bentuk umum dari switch statement adalah sebagai berikut : switch (ekspresi) { case ekspresi 1 : statement1 case ekspresi 2 : { statement1 statement2 ... } ... ... default : statement lainnya }
Gambar 4.4: Contoh penggunaan switch statement Cara kerja switch statement adalah sebagai berikut: • cek (ekspresi) dari switch • Kerjakan semua statement dari ekspresi case yang bernilai benar (true) • Jika tidak ada ekspresi case yang benar maka kerjakan statement pada bagian default
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 26 — #40
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
26
Program 11 Contoh penggunaan switch statement lain. int main() { int grade = 3; switch (grade) { case 1: printf("Fall (F)\n"); break; case 2: printf("Bad (D)\n"); break; case 3: printf("Good (C)\n"); case 4: printf("Very Good (B)\n"); break; case 5: printf("Excellent (A)\n"); break; default: printf("You have inputted false grade\n"); break; // break disini tidak perlu } }
Bagaimana hasil dari eksekusi Program 11? Output atau luaran dari Program 11 adalah: Good (C) Very Good (B)
Hasil tersebut diperoleh karena pada case 3 tidak ada perintah break. Ingat kembali bahwa kompiler C mengeksekusi program C secara berurutan dari baris ke baris. Oleh karena itu, setelah mengeksekusi case 3, kompiler C juga mengeksekusi bagian di case 4 dan keluar dari bagian switch setelah menjumpai break pada bagian case 4. Perintah break termasuk salah satu mekanisme pengontrol dan akan dibahas pada sub bab 4.8.
4.8
Break dan Continue Statements
Bentuk umum dari break statement adalah: break;
Tujuan break statement adalah: • memerintahkan compiler untuk keluar dari satu tingkat (biasanya digunakan pada statement pengulangan dan pilihan bercabang) • Menghentikan pengeksekusian program secara tidak normal
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 27 — #41
i
4.8. Break dan Continue Statements
i
27
Gambar 4.5 menunjukkan contoh dan penjelasan dari break statement.
Gambar 4.5: Contoh penggunaan break statement Bentuk umum dari continue statement adalah: continue;
Tujuan break statement adalah: • memerintahkan compiler untuk melanjutkan pengeksekusian program dalam satement pengulangan tanpa pengeksekusian program yang berada dibawah statement continue • Melanjutkan pengeksekusian program di dalam perulangan Program 12 memperlihatkan penggunaan break dan continue dalam sebuah perulangan do while. Pada program ini kompiler akan keluar dari perulangan do while ketika inputan nilai n < 0 atau n = 0 dan akan melanjutkan pengeksekusian program serta sekaligus mencetak string "Skip the value" ketika n > 0. Akan tetapi bila inputan nilai n = 0 maka kompiler akan keluar dari perulangan dengan mencetak string "The number is: 0". Namun, jika inputan nilai n tidak pernah sama dengan 0, maka string "the number is:" tidak akan pernah dicetak. Hal ini dikarenakan statement pencetakan string tersebut berada setelah statement continue di dalam perulangan.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 28 — #42
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
28
Program 12 Sebuah program C penggunaan break dan continue statement. int main() { int n; do { printf("\nEnter the number:"); scanf("%d",&n); if (n < 0) { break; } if(n>10) { printf("Skip the value\n"); continue; } printf("The number is: %d", n); } while (n != 0); }
Hasil atau luaran dari program 12 adalah: Enter the number :1 The number is:1 Enter the number :51 Skip the value Enter the number:-1
4.9
Continue Statement Lanjutan
Pada sub bab ini akan memperlihatkan perbedaan antara statement continue dan next. Statement continue melanjutkan eksekusi statement-statement yang berada di dalam perulangan secara berurutan dan tidak mengeksekusikan statement-statement yang berada setelah statement continue. Sedangkan statement next mengarahkan kompiler C untuk mengeksekusi semua statement yang berada setelah statement next. Berdasarkan contoh fig:continuelanjutan, ketika kompiler C mengeksekusikan statement continue, maka kompiler C secara langsung mengeksekusikan expr2 tanpa mengeksekusikan expr3. Sedangkan ketika kompiler C mengeksekusikan statement goto next, kompiler C mengeksekusikan expr3 dan tidak mengeksekusikan semua statement yang berada diantara goto next dan next.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 29 — #43
i
4.10. Conditional Operator
i
29
Gambar 4.6: Contoh continue statement lanjutan
4.10
Conditional Operator
Bentuk umum dari conditional operator adalah: expr1 ? expr2 : expr3
expr1 adalah evaluasi dari kondisi jika kondisi benar (TRUE) maka nilai dari operan tersebut adalah expr2 dan jika kondisi salah (FALSE) maka nilai dari operan tersebut adalah expr3.
Gambar 4.7: Contoh conditional operator Conditional Operator digunakan untuk mempersingkat dalam penulisan program. Semakin sedikit jumlah baris di dalam sebuah program, maka semakin cepat kompiler C dalam mengeksekusi
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 30 — #44
i
i
Bab 4. Pernyataan Bersyarat (Conditional Statement)
30
program tersebut. Di dalam bahasa pemrograman C, jumlah baris dari sebuah program dihitung dengan melihat jumlah dari karakter ’;’ di dalam program tersebut. Condition Operator merupakan suatu operator untuk mempersingat sebuah statement if else. Gambar 4.7 dan fig:expr2 memperlihatkan bagaimana cara mengubah statement if else ke dalam bentuk conditional operator.
Gambar 4.8: Contoh conditional operator Latihan: Bagaimanakan bentuk if..else dari statement conditional berikut: 1. 2.
age > 17 ? printf("You can vote.") : printf("You cannot vote."); val = ((y>0) ? 10 : ((x==0) ? 100 : 1000));
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 31 — #45
i
i
Bab 5
Perulangan (Loop) 5.1
Pendahuluan
Proses perulangan (loop) sangat diperlukan untuk membuat suatu proses yang sama pernyataannya berulang-ulang. Statement perulangan antara lain: • do statement • while statement • for statement
5.2
Objektif
Objektif dari pertemuan ini adalah (i) memperkenalkan dan menjelaskan loop, (ii) menjelaskan perbedaan dan kesamaan antara satu jenis perulangan dengan perulangan yang lain.
5.3 5.3.1
do while Statement do while Statement (Dasar)
Bentuk umum dari do statement adalah: do { <statement> } while (expr);
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 32 — #46
i
i
Bab 5. Perulangan (Loop)
32
Statement do while mengizinkan perulangan (loop) untuk mengeksekusikan <statement> selama kondisi expr bernilai TRUE. <statement> murupakan bagian yang akan diulang. Sedangkan <expr> adalah kondisi yang dievaluasi, jika kondisi benar maka proses perulangan dilakukan sedangkan jika kondisi bernilai salah proses perulangan dihentikan. Karena kompiler C mengeksekusikan secara teratur dari satu baris ke baris lain dan statement do { } while menempatkan kondisi exprt secara struktur di bagian terakhir, maka perulangan <statement> akan dieksekusi paling sedikit sekali. Program 13 dan 14 merupakan contoh program dengan menggunakan do while statement. Program 13 Contoh program dengan menggunakan do while. /* Demonstration of the do..while loop */ #include<stdio.h> #include<stdlib.h> int main() { int value, rDigit; printf(Enter a number to be reversed.\n); scanf("%d", &value); do { rDigit = value % 10; printf("%d", rDigit); value = value / 10; } while (value != 0); printf(\n); return 0; }
Program 14 Contoh potongan program dengan menggunakan do while. do { sum +=i; scanf("%d",&i); } while(i > 0)
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 33 — #47
i
5.3. do while Statement
i
33
Pada potongan program 14 terdapat beberapa hal yang perlu diperhatikan: • Minimal statement dalam do dilakukan satu kali. • Pengulangan berhenti jika data yang dimasukkan berupa bilangan nol (0) atau bilangan negatif. • Input dapat berupa bilangan bulat(int) ataupun bilangan real (float). • Proses perulangan untuk mendapatkan jumlah dari sum.
5.3.2
do while Statement (Lanjutan)
Gambar 5.1 menampilkan dua buah program dengan menggunakan do while statement. Program yang disebelah kiri merupakan program untuk menginputkan sebuah karakter dengan menggunakan dua buah perulangan do while. Jika karakter yang dimasukkan adalah ’y’ atau ’t’ dan setelah dikonversi menjadi huruf kapital, maka kompiler C akan mencetak string "Anda harus coba inputkan lagi". Akan tetapi jika yang dimasukkan adalah karakter ’t’, maka kompiler C akan keluar dari double perulangan tersebut.
Gambar 5.1: Contoh penggunaan do while statement lanjutan Pada gambar 5.2 menampilkan dua buah program dengan menggunakan do while statement. Kedua program C tersebut sekilas terlihat mirip. Namun, hasil atau luaran dari kedua program tersebut
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 34 — #48
i
i
Bab 5. Perulangan (Loop)
34
adalah berbeda. Perbadaannya adalah hanya letak dari penulisan sintaks k++ dan printf("%d",k). Akibatnya akan menghasilkan luaran yang berbeda. Program yang sebelah kiri mencetak nilai k terlebih dahulu kemudian nilai k di-increment-kan. Sedangkan program yang sebelah kanan meng-increment-kan nilai k terlebih dahulu kemudian mencetak nilai k.
Gambar 5.2: Dua buah program menggunakan do while statement
5.4 5.4.1
for Statement for Statement (Dasar)
Bentuk Umum for statement adalah: for (<expr1>;<expr2>;<expr3>) { <statement> }
Dimana <expr1> merupakan inisialisasi awal dari variable yang digunakan, dan <expr2> adalah expresi logika (bentuk perbandingan nilai, syarat). Pengulangan dilakukan jika kondisi pada expr2 masih benar (true). Sedangkan <expr3> adalah bagian update. Biasanya berbentuk penambahan atau pengurangan nilai variabel counter. Secara teknis, alur kerja program C yang menggunakan for statement adalah sama dengan program yang menggunakan do while.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 35 — #49
i
5.4. for Statement
i
35
Ketika kompiler mengeksekusi perintah for (<expr1>;<expr2>;<expr3>), sintaks pertama yang dieksekusi adalah <expr1>. Kemudian kompiler mengeksekusi <statement> yang berada di dalam looping body. Setelah penambahan atau pengurangan nilai variabel counter <expr3>, kompiler mengecek kondisi <expr2> untuk mengetahui apakah proses looping selanjutnya dikerjakan atau tidak. Proses ini sama seperti yang dilakukan pada statement do while. Gambar 5.3 akan menunjukkan proses konversi program C yang menggunakan for statement ke do while.
Gambar 5.3: Konversi program C yang menggunakan for statement ke do while statement
5.4.2
for Statement (Lanjutan)
Pada bagian ini akan ditampilkan tiga buah contoh program C dengan menggunakan perulangan for. Misalnya gambar 5.4 menunjukkan sebuah program C untuk menghitung total penjumlahan 10 bilangan integer positif pertama. Untuk mengimplementasikan algoritma ini, perlu diperhatikan beberapa faktor. Pertama adalah semua urutan bilangan tersebut harus ditampung ke dalam sebuah variabel (misalnya i). Kedua, nilai awal dari variabel i adalah 1 dan batas akhir dari variabel i adalah 10. Dan ketiga variabel i perlu bertambah satu-satu untuk setiap perulangan supaya semua urutan bilangan asli bisa dijumlahkan. Penjumlahan kumulatif dari bilangan tersebut dihitung secara teratur oleh kompiler dengan mengeksekusikan perintah U += i. Perintah ini ekivalen dengan
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 36 — #50
i
36
i
Bab 5. Perulangan (Loop)
U = U + i dengan memberikan nilai awal dari variabel i = 0 dan dideklarasikan sebelum statement for. Sedangkan pada gambar 5.5 menampilkan beberapa gaya penulisan program C dengan menggunakan perulangan for dan gambar 5.6 adalah salah satu contoh program dengan menggunakan double looping.
Gambar 5.4: Program untuk menghitung total penjumlahan 10 bilangan integer positif pertama
Gambar 5.5: Beberapa program dengan menggunakan for statement
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 37 — #51
i
5.5. while statement
Gambar 5.6: statement
5.5
i
37
Contoh program dengan menggunakan double for
while statement
Bentuk Umum dari while statement adalah: while (<expr>) { <statement>; } ;
Terdapat beberapa hal yang perlu diperhatikan: • <expr> adalah kondisi (syarat) dari while • <statement> disebut badan dari while loop • merupakan statement yang dikerjakan setelah pengulangan berakhir • pengulangan dilakukan jika kondisi (syarat) pada <expr> masih benar Statement while juga sangat mirip dengan statement do while dan for dalam cara pengeksekusian program. Gambar 5.7 akan menunjukkan bagaimana cara mengkonversi program C dengan menggunakan perulangan while menjadi program C dengan menggunakan perulangan for dan do while.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 38 — #52
i
38
i
Bab 5. Perulangan (Loop)
Gambar 5.7: Konversi statement while ke dalam bentuk do while dan for Pada sub bab ini beberapa contoh program C menggunakan perulangan while lanjutan akan ditampilkan seperti dua buah program berikut. Program ini adalah untuk menentukan akar persamaan kuadrat f (x) = 2x2 + 6x + 3
(5.1)
int main(void) { double xl= -1.5, xr=l.0, eps=0.00001, xm, fxl, fxm, epsb, abseps=1, x; xm = 0. 5 * (xl + xr) ; while(abseps >= eps) { abseps= abs (xm - xl); fx1 = 2*sqr(x1) +6*xl+3; fxm = 2*sqr(xm) +6*xm+3; epsb = fxl * fxm ; if (epsb < 0.0) xr = xm; else xl = xm ; xm = 0.5 * (xl + xr) ; x=xm; } printf(" Akar persamaan %lf\n", x); return 1; }
Sedangkan program berikut ini adalah untuk menampilkan urutan 10 bilangan integer positif pertama beserta mencari salah satu angka
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 39 — #53
i
5.5. while statement
i
39
apakbar angka tersebut berada di dalam urutan 10 bilangan positif pertama atau tidak. #include<stdio.h> int main(){ int x = 10, numberFound= 5; int i = 0, j = 1; // using while loop statement while(i < x){ i++; printf("%d\n",i); } // when,escape loop body while(j < x){ if(j == numberFound){ printf("number found\n"); break; } printf("%d...keep finding\n",j); j++; } return 1; }
Hasil luaran dari program tersebut adalah sebagai berikut: 1 2 3 4 5 6 7 8 9 10 1...keep finding 2...keep finding 3...keep finding 4...keep finding number found
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 40 — #54
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 41 — #55
i
i
Bab 6
Lanjutan Perulangan (Loop) dan Contoh 6.1
Pendahuluan
Karena kita ketahui bersama bahwa proses perulangan (loop) sangat diperlukan untuk membuat suatu proses yang sama pernyataannya berulang-ulang, materi ini akan memperlihatkan penggunaan statement perulangan dalam program.
6.2
Objektif
Objektif dari pertemuan ini adalah (i) memperlihatkan dengan contoh penggunaan statement perulangan, dan (ii) mendiskusikan keluaran yang akan dihasilkan oleh program .
6.3 6.3.1
Contoh Perulangan for (Lanjutan) Contoh 1
Coba diskusikan dan bagaimana hasil dari potongan program berikut. for (i=0,total =0;scantf("%d",&number)==1;) { if (number < 0) { continue; } total +=number;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 42 — #56
i
42
i
Bab 6. Lanjutan Perulangan (Loop) dan Contoh
} printf("Jumlah bilangan positif yang dimasukan = %d\n", total);
6.3.2
Contoh 2
Coba diskusikan dan bagaimana hasil dari potongan program berikut. while ((c=getchar()) !=EOF) if (c== ’ ’) ++blank_cnt; else if (c>= ’0’ && C <=’9’) ++digit_cnt; else if (c>= ’a’ && c<=’z’ || c>= ’A’ && c<=’B’ ++letter_cnt; else if (c>= ’\n’) ++nl_cnt; else ++other_cnt;
6.3.3
)
Contoh 3
Coba diskusikan dan bagaimana hasil dari potongan program berikut. i=-5 n=50; while (i
6.3.4
Contoh 4
Coba diskusikan dan bagaimana hasil dari potongan program berikut. k=1; printf("Masukkan Password : "); scanf("%s", pw); while (k <= 3) { if (pw=="sandi") break;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 43 — #57
i
6.3. Contoh Perulangan for (Lanjutan)
i
43
else { printf("password salah: "); printf("Masukkan Password : "); scanf("%s", pw); k++; } }
6.3.5
Contoh 5
Coba diskusikan dan bagaimana hasil dari potongan program berikut. include <stdio.h> int main (void) { int u15=0,u16=0,u17=0,u18=0,ul=0,n,u,i scanf("%d",&n); scanf("%d",&u); while (i <=n) { switch(u) { case 15 : u15++; case 16 : u16++; case 17 : u17++; case 18 : u18++; default : ul++; } } return 1; }
6.3.6
Contoh 6
Coba diskusikan dan bagaimana hasil dari potongan program berikut. int main(void) { double xl= -1.5, xr=l.0, eps=0.00001, xm,fxl,fxm, epsb; double abseps=1, x; char ch; do { xm = 0. 5 * (xl + xr) ; while(abseps >= eps) { abseps= abs (xm - xl); fx1 = 2*sqr(x1) +6*xl+3; fxm = 2*sqr(xm) +6*xm+3;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 44 — #58
i
44
i
Bab 6. Lanjutan Perulangan (Loop) dan Contoh epsb = fxl * fxm ; if(epsb < 0.0) xr = xm; else xl = xm ; xm = 0.5 * (xl + xr) ; x=xm; } printf(" Akar persamaan %lf\n", x); printf("\nUlangi (Y/T) ? "); do { ch = toupper(getch()); } while(!((ch==’Y’) || (ch ==’T’))); } while(!(ch == ’T’)); return 1;
}
6.3.7
Contoh 7
Coba diskusikan dan bagaimana hasil dari potongan program berikut. #include<stdio.h> int main(){ int i,j; for(i=0, j=100; (i<100) || (j>0); i++, j--) { printf("<%d><%d>\n",i,j); if(i==j){ printf("Mempunyai Nilai yang sama pada langkah ke %d\n",i); break; } } return 1; }
6.3.8
Contoh 8
Coba diskusikan dan bagaimana hasil dari potongan program berikut. #include<stdio.h> int main(){ int i,j; for(i=0; i<10; i++) { for(j=10; j>=i; j--){ printf("*"); } printf("\n"); } return 1; }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 45 — #59
i
i
Bab 7
Array Satu Dimensi 7.1
Pendahuluan
Memahami konsep array dimensi satu yang dikombinasikan dengan penggunaan operator pre-increment dan pre-decrement, postincrement dan post decrement. Tipe data array juga dikenal dengan istilah aggregate data type. Array juga biasa disebut sebagai pointer tetap (fixed pointer) karena setelah dideklarasikan, alamat awal dari array tersebut atau alamat pada slot 0 tidak dapat diubah-ubah layaknya pointer biasa.
7.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan cara pendeklarasian array, (ii) menjelaskan penggunaan array satu dimensi, dan (iii) memperlihatkan contoh array satu dimensi berserta visualisasinya.
7.3
Definisi dan Pendeklarasian Array
Array adalah kumpulan nilai dengan tipe data yang sama yang menggunakan nama sama. Array selain merupakan suatu bentuk struktur data juga merupakan pointer. Perbedaan utama antara array dengan ponter biasa adalah bahwa alamat yang ditunjuk oleh array pada saat dideklarasi tidak dapat diubah-ubah seperti halnya pointer yang lain. Cara pendeklarasian array sama seperti mendeklarasikan variabel denga tipe data yang lain, hanya saja diperlukan operator [ ] yang
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 46 — #60
i
46
i
Bab 7. Array Satu Dimensi
berisikan ukuran dari array yang dideklarasikan. pendeklarasian array adalah:
Bentuk umum
tipeDataArray namaArray[ukuran]
Dimana tipeDataArray adalah suatu tipe data untuk nilai dari sebuah array, namaArray adalah sebuah variabel array, dan ukuran adalah ukuran dari array. Berikut adalah beberapa contoh pendeklarasian array dengan tipe data dan ukuran yang berbeda-beda. int a[6] = {8, 4, 6, 3, 4, 10}; int ageOfStudents[60]; float ipkOfStudents[60];
Contoh pertama diatas adalah mendeklarasikan sebuah array satu dimensi dengan variabel a bertipe data integer dan berukuran 6 dengan langsung memberikan nilai awalnya. Contoh berikutnya adalah mendeklarasikan sebuah array satu dimensi dengan variabel ageOfStudents bertipe data integer dan berukuran 60 tanpa memberikan nilai awalnya. Sedangkan contoh yang ketiga adalah mendeklarasikan sebuah array satu dimensi dengan variabel ipkOfStudents bertipe data float dan berukuran 60 tanpa memberikan nilai awalnya.
7.4
Inisialisasi Nilai
Sama halnya seperti penginisialisasian nilai pada variabel, array juga dapat diberikan nilai pada saat pendeklarasian. Gambar 7.1 adalah bagaimana pendeklarasian, penginisialisasian, dan pengvisualisasian array.
Gambar 7.1: Contoh penginisialisasi array Pendeklarasian sebuah array membutuhkan sejumlah memori yang besarnya sesuai dengan besar ukuran tipe data dan ukuran array
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 47 — #61
i
7.5. Indeks (Subscript) Dari Array
i
47
itu sendiri. Jika diasumsikan alamat dari array A atau slot pertama dari array A di atas adalah 2310 dan ukuran dari tipe data int adalah 4 bytes, maka visualisasi dari pendeklarasian array A ditunjukkan melalui Gambar 7.2
Gambar 7.2: Visualisasi alamat array Adapun untuk menghitung total memori yang dibutuhkan dalam pendeklarasian sebuah array adalah dengan menggunakan formula berikut: TotalMemori(dalam satuan bytes)=sizeof(tipeData)*ukuran_array;
7.5
Indeks (Subscript) Dari Array
Indeks atau subscript dari array dalam C selalu dimulai dengan 0 sampai dengan ukuran array - 1. Sebagai contoh float farr[10]; maka indeks dari array farr adalah seperti pada gambar di bawah ini.
Gambar 7.3: Indeks (Subscript) dari array
7.6
Alokasi Memory Array
Array dapat dideklarasikan secara global (deklarasi di luar fungsi main) dan secara lokal (didalam sebuah fungsi atau main). Hati-
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 48 — #62
i
48
i
Bab 7. Array Satu Dimensi
hati jika kita mendeklarasikannya secara lokal, karena variabel lokal akan dibentuk dalam stack ketika fungsi tersebut dibentuk, dan akan dihapus ketika fungsi tersebut dihancurkan (ketika fungsi tersebut selesai dieksekusi). Mungkin hal ini tidak bermasalah bagi variabel biasa, namun array umumnya akan menuntut jumlah memory yang sangat besar (array float mydata[5000]; akan membutuhkan memory sebesar 20000 bytes), sementara stack hanya memiliki kapasitas sekitar 2000 - 4000 bytes. Oleh karena itu untuk array yang besar harus dideklarasikan secara global, atau mempergunakan perintah static (misalnya static float mydata[5000];) ketika kita mendeklarasikannya secara local. Gambar 7.4 menampilkan contoh dari array satu dimensi.
Gambar 7.4: Contoh penggunaan array dan visualisasinya
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 49 — #63
i
i
Bab 8
Array Dua Dimensi 8.1
Pendahuluan
Memahami konsep array multi dimensi yang dikombinasikan dengan penggunaan operator pre-increment dan pre-decrement, postincrement dan post decrement. C sebenarnya tidak mempunyai array multidimension. Akan tetapi karena sistem umum tipe C, maka kita bisa memiliki array dari array. Adapun array multi dimensi yang paling sederhana adalah array dua dimensi.
8.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan cara pendeklarasian array dua dimensi, (ii) menjelaskan penggunaan array dua dimensi, dan (iii) menjelaskan penggunaan array dua dimensi (multi dimensi).
8.3
Pendeklarasian Array Dua Dimensi
Bentuk umum pendeklarasian array dua dimensi adalah: tipeArray namaArray[jmlBaris][jmlKolom];
Dimana: • tipeArray adalah suatu tipe data untuk nilai dari sebuah array. • namaArray adalah sebuah variable array. • jmlBaris adalah ukuran baris dari array.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 50 — #64
i
50
i
Bab 8. Array Dua Dimensi • jmlKolom adalah ukuran kolom dari array.
Adapun contoh-contoh pendeklarain array dua dimensi yang benar dan salah di dalam program C adalah sebagai berikut: int a2[5][7]; float B[5][5]; char letter[5][3]; char letter[0][0] = ’a’;
/* /* /* /*
Benar Benar Benar Benar
*/ */ */ */
int a2[5, 7]; int a2[0, 4] = ’6’;
/* Salah */ /* Salah */
Pada dasarnya, array dua dimensi merupakan array satu dimensi. Bila sebuah array dd dideklarasikan menjadi array dua dimensi dengan menggunakan perintah int dd[3][7]; maka kita bisa memvisualisasikan array dd tersebut seperti yang terlihat pada gambar ??.
Gambar 8.1: Visualisasi pendeklaraisin array dua dimensi
8.4
Inisialisasi Nilai
Sama halnya seperti penginisialisasian array satu dimensi, array dua dimensi juga dapat diberikan nilai pada saat pendeklarasian. Gambar 7.1 adalah bagaimana pendeklarasian, penginisialisasian, dan pengvisualisasian array. Sama halnya seperti pendeklarasian array satu dimensi, array dua dimensi juga membutuhkan sejumlah memori dalam pendeklarasiannya. Meskipun pada sub bab 9.3 telah ditunjukkan visualisasi pendeklarian array dua dimensi dalam bentuk kubus, sebenarnya array dua dimensi mengalokasikan memori secara berurutan dalam bentuk array satu dimensi. Adapun untuk menetukan jumlah memori
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 51 — #65
i
8.5. Indeks (Subscript) Dari Array Dua Dimensi
i
51
Gambar 8.2: Contoh penginisialisasi array dua dimensi
yang dibutuhkan dalam pendeklarasian array dua dimensi dapat dihitung dengan menggunakan persamaan berikut: byte = sizeof(1st index)*sizeof(2nd index)*sizeof(tipe)
8.5
Indeks (Subscript) Dari Array Dua Dimensi
Indeks atau subscript dari array dalam C selalu dimulai dengan 0 sampai dengan ukuran array - 1. Sebagai contoh float data[5][5]; maka indeks dari array data adalah seperti pada gambar 8.3.
Gambar 8.3: Indeks (Subscript) dari array dua dimensi
8.6
Alokasi memori untuk Array Dua Dimensi
Array dimensi dua secara umum sama dengan array satu dimensi. Bila dideklarasi sebuah array int dd[3][4], maka array dd tersebut sebenarnya dialokasikan secara berurutan dalam bentuk array satu
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 52 — #66
i
52
i
Bab 8. Array Dua Dimensi
dimensi seperti yang terlihat pada gambar 8.4. Namun untuk lebih memudahkan kita memahami tentang array dua dimensi maka dibuatlah visualisasi array dua dimensi dalam bentuk kubus.
Gambar 8.4: dimensi
Visualisasi array dua dimensi dalam bentuk satu
Perlu dipahami bahwa di dalam penentuan slot array dua dimensi tidak sama seperti penentuan slot pada array satu dimensi. Seperti yang dijelaskan pada sub bab 7.5, penentuan slot array satu dimensi ditentukan dengan mengetahui alamat memori slot pertama dan ukuran tipe data variabel array tersebut. Jika sudah diketahui kedua parameter tersebut, dengan sangat mudah diketahui alamat memori untuk slot berikutnya. Akan tetapi untuk array dua dimensi tergantung dari nilai indeks baris atau kolomnya. Adapun penentuan slot Array dua dimensi dapat ditentukan dengan formula: dd[i][j] = base_address + sizeof(tipe) * i * 2nd index + sizeof(tipe) * j
Sebagai contoh, berdasarkan gambar 8.4, nilai dari array dd pada slot dd[2][3] adalah: dd[2][3] = 300 + sizeof(int) * 2 * 4 + sizeof(int) * 3 asumsikan sizeof(int) = 4 byte, maka dd[2][3] = 300 + 4 * 2 * 4 + 4 * 3 = 344
8.7 8.7.1
Contoh Program Menggunakan Array Dua Dimensi Inisialiasi Nilai Array Dua Dimensi
Program berikut mempunyai dua buah perulangan for yang berfungsi untuk memasukkan nilai-nilai ke dalam array num dan mencetak
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 53 — #67
i
8.7. Contoh Program Menggunakan Array Dua Dimensi
i
53
nilai-nilai tersebut pada output editor1 . Nilai-nilai tersebut diperoleh dari kalkulasi variabel counter i dan j. Setelah setiap hasil increment dari kedua variabel tersebut disubsitusikan ke dalam formula num[i][j] = (i * 4) + j + 1;, maka diperoleh nilai-nilai untuk setiap slot dari array num. Hasil atau luaran dari program ?? dapat divisualisaikan melaui gambar 8.5. #include <stdio.h> int main(void) { int i, j, num[3][4]; for(i=0; i<3; i++) for(j=0; j<4; j++) num[i][j] = (i * 4) + j + 1; /* print isi array num */ for(i=0; i<3; i++) { for(j=0; j<4; j++) printf("%3d ", num[i][j]); putchar(’\n’); } return 1; }
Gambar 8.5: Visualiasai array num[i][j]
1
seperti DOS pada window dan terminal pada Unix/Linux
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 54 — #68
i
54
i
Bab 8. Array Dua Dimensi
8.7.2
Pengurutan Data Dalam Array
Program berikut merupakan salah satu contoh program untuk mengurutkan data dengan menggunakan array dua dimensi. #include <stdio.h> #define N 12 int main(void) { int i, j, data[N] = {8,4,5,1,3,8,7,9,12,23,15,6}; for(i=0; ii; j--) if(data[j] < data[j-1]) { int temp = data[j]; data[j] = data[j-1]; data[j-1] = temp; } /* Cetak data yang telah terurut */ for(i=0; i
8.7.3
Penjumlahan Matrix Menggunakan Array
Program berikut merupakan contoh program C untuk menjumlahkan Matrix menggunakan array dua dimensi. #include <stdio.h> #define ROW 2 #define COL 3 int main(void) { int i, j; float matrixA[ROW][COL], matrixB[ROW][COL], matrixC[ROW][COL]; /*Tulis proses input data matrixA dan matrixB disini */ /*Proses penjumlahan ditampung oleh matrixC */ for(i=0; iCOL; j++) { matixC[i][j]= matixA[i][j]+ matixB[i][j]; printf("\t %3.2 f", matixC[i][j]); } } return 1; }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 55 — #69
i
i
Bab 9
Pointer 9.1
Pendahuluan
Pointer yang merupakan variabel yang dapat memegang alamat dari suatu objek dalam memori. Pointer digunakan untuk melalukan akses dan manipulasi alamat memori. Dalam C, array dan pointer memiliki keterkaitan yang erat. Array adalah pointer yang tetap (fixed pointer) sedangkan pointer itu sendiri tidak tetap, artinya alamat memori yang dipegangnya dapat berubah-ubah. Pemanggilan melalui alamat (call by reference) yang biasa diimplementasi pada fungsi dapat diwujudkan menggunakan pointer.
9.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan cara pendeklarasian pointer, (ii) menjelaskan penggunaan pointer, (iii)menjelaskan konsep dereferensing (menbaca / memberikan nilai yang ditunjuk oleh sebuah pointer), dan (iv) menjelaskan penggunaan indeks (subscript) pada pointer.
9.3
Pendeklarasian Pointer
Pointer dideklarasikan untuk memegang dan mengakses alamat dalam memori. Jika p adalah suatu variable maka &p merupakan lokasi atau alamat dalam memori dimana sebuah nilai yang dipegang oleh p disimpan. Dalam C, simbol asterisk ’*’ digunakan untuk mendeklarasikan sebuah pointer. Simbol ini ditulis setealh setelah tipe data dan
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 56 — #70
i
56
i
Bab 9. Pointer
sebelum nama dari sebuah pointer. Sebagai contoh: int
* pi;
Sintaks umum pendeklarasian pointer adalah: tipe_data
* nama_pointer;
Simbol asterik ’*’ memberitahu kompiler bahwa sebuah pointer yang menyimpan alamat memori bertipe int dideklarasikan. Pendeklarasian seperti contoh di atas hanya memberitahukan kompiler bahwa pi adalah pointer bertipe int tanpa memberikan nilai awal apapun kepada pointer pi. Sebuah pointer tanpa nilai awal akan secara otomatis memiliki nilai NULL. Pengujian terhadap pointer dapat dilakukan sebagai berikut: if (pi == NULL){ : }
9.4
Visualisasi Pointer
Bila dalam program terdapat pernyataan sebagai berikut: int int
i = 2; *pi = &i;
maka visualisasi dari kedua pernyataan di atas terlihat seperti pada gambar 9.1.
Gambar 9.1: Visualisasi pointer Artinya terdapat sebuah variabel i bertipe integer dengan nilai 2 dan pi adalah sebuah pointer yang memegang atau menunjuk ke alokasi memori bertipe int yang dimiliki oleh i. Pernyataan: int *pi = &i;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 57 — #71
i
9.5. Operator Dereferensing
i
57
bermakna bahwa sebuah pointer pi bertipe int dideklarasikan dengan nilai awal berupa alamat dari i yang bertipe int. Simbol & pada pernyataan di atas merupakan operator unari yang bearti alamat (address). Pada pernyataan di atas, nilai awal dari pi adalah alamat dari i dalam memori.
9.5
Operator Dereferensing
Operator dereferensing berarti pembacaan atau pemberian nilai data pada alamat yang dipegang oleh sebuah pointer. Operator deferensing juga menggunakan simbol asterik ’*’, akan tetapi sedikit berbeda dengan simbol asterik pada saat pendeklarasian pointer. Perhatikan pernyataan berikut: int i = 2; int *pi; pi = &i; *pi = 12; printf("%d\n", i);
Hasil keluaran dari program di atas adalah 12, dengan kata lain variabel i yang pada awalnya bernilai 2 berubah nilainya akibat dari pernyataan *pi = 12. Hal ini menunjukkan bahwa operator dereferensing dapat mengubah nilai dari suatu memori melalui pointer. Pada contoh di atas pi menunjuk ke alamat i, dan dereferensing *pi = 12 mengakibatkan nilai dari i yang ditunjuk oleh pi berubah menjadi 12. Contoh Lain Operator Dereferensing int int int int
i = 2; j = 3; *pi; *pj;
pi = &i; pj = pi; *pj = 20; printf("%d\n", i); pj = &j; pi = pj; *pi = 30; printf("%d\n", j);
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 58 — #72
i
58
i
Bab 9. Pointer Keluaran dari potongan program tersebut secara berurut adalah:
20 30
Terlihat bahwa nilai i yang pada awalnya bernilai 2 berubah menjadi 20 akibat dari dereferensing pointer *pj = 20; sedangkan nilai dari j yang pada awalnya bernilai 3 berubah menjadi 30 akibat dari dereferensing pointer *pi = 30; Visualisasi langkah demi langkah dari contoh program sebelumnya adalah sebagai berikut: int int int int
i = 2; j = 3; *pi; *pj;
Potongan program diatas dapat divisualisasikan seperti pada gambar 9.2.
Gambar 9.2: Visualisasi pointer Selanjutnya, pernyataan: pi pj
= &i; = pi;
mengakibatkan pointer pi menampung alamat dari variabel i dan ponter pj berubah nilainya menjadi sama dengan nilai pi. Ilustrasinya adalah sebagai terlihat pada gambar 9.3. Pernyataan *pj = 20; printf("%d\n", i);
mengakibatkan nilai variabel i yang ditunjuk oleh pointer pj berubah dari 2 menjadi 20. Selanjutnya, pernyataan:
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 59 — #73
i
9.5. Operator Dereferensing
i
59
Gambar 9.3: Visualisasi pointer
Gambar 9.4: Visualisasi pointer
pj = &j; pi = pj;
mengakibatkan arah dari pointer pj berubah dan tunjuk ke alamat variabel j yang juga bertipe int. Kemudian, pointer pi menampung nilai dari alamat c yang sebelumnya ditunjuk oleh pointer pj.
Gambar 9.5: Visualisasi pointer Dan yang terakhir pernyataan: *pi = 30; printf("%d\n", j);
mengakibatkan nilai dari variabel yang ditunjuk oleh pi berubah menjadi 30 akibat adanya operator dereferensing *pi = 30. Jadi, kesimpulannya adalah dengan menggunakan pointer dan operator derefensing nilai dari suatu variabel dalam memori dapat dengan sangat mudah dimanipulasi. Hal inil membuat pointer
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 60 — #74
i
60
i
Bab 9. Pointer
Gambar 9.6: Visualisasi pointer
menjadi sangat "powerful" dalam pemrograman sekaligus sebagai "the most possibility of bugs" atau dengan kata lain penyebab terbesar kesalahan dalam program. Oleh karena itu, pointer harus digunakan secara benar dan terkontrol.
9.6
Pointer Vs Array
Bila sebuah array dideklarasikan dengan nama array a sebagai berikut: int a[6] = {8, 4, 6, 3, 4, 10};
Gambar 9.7: Visualisasi pointer pada array Pembacaan data pada indeks ke 2 dari array a tersebut dapat dilakukan dengan menulis a[2]. Karena a adalah array dan merupakan pointer yang tetap (fixed pointer) maka operator dereferensing pun dapat diaplikasikan pada a.
Gambar 9.8: Kesamaan array dengan pointer
Bukti: a[2] = = = =
= *(a + sizeof(a) * 2) *(a+2) (a + 4 2) * * *(2310 + 8) = *(2318) 6
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 61 — #75
i
61
9.7. String
9.7
i
String
C tidak menyediakan tipe data primitif berupa string. String dalam pemrograman C direpresentasikan dengan menggunakan pointer bertipe char. Deklarasi: char * str =
"Pemrograman C"
mengakibatkan sebuah pointer str dibuat dengan nilai awal berupa kumpulan char yang membentuk kalimat Pemrograman C. Perhatikan dan diskusikan contoh program berikut: #include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { char ch[80], *pch = &ch[0]; strcpy(ch, "informatika unsyiah"); putchar(*pch++); putchar((*pch)++); putchar(*++pch); putchar(*++pch); putchar(++*pch); putchar(++(*pch)); putchar(++(*pch++)); ++pch; putchar(++(*++pch)); putchar(’\n’); printf("%s\n",ch); return (EXIT_SUCCESS); }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 62 — #76
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 63 — #77
i
i
Bab 10
Fungsi 10.1
Pendahuluan
Fungsi atau function adalah sub program yang dibuat untuk tujuan tertentu dan dapat dieksekusi secara berulang dalam sebuah program. Prototipe fungsi boleh dideklarasikan dalam sebuah atau beberapa file header, sebuah file yang berekstensi .h, sementara implementasi dari fungsi yang telah dideklarasi sebelumnya dapat diimplementasi langsung dalam file header yang sama ataupun diimplementasi secara terpisah dalam file lain yang berekstensi .c. Salah satu tujuan dari pembuatan sebuah fungsi adalah mempermudah proses pengembangan dan perawatan program.
10.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan cara mendefinisikan atau mendeklarasikan fungsi, (ii) menjelaskan cara mengeksekusi sebuah fungsi dalam program, (iii) memperkenalkan konsep called by value dan called by reference, dan (iv) memperkenalkan beberapa fungsi string.
10.3
Pendeklarasian Fungsi
Dalam C, bentuk umum pendeklarasian sebuah fungsi adalah mengikuti format berikut ini: tipe_data nama_fungsi(parameter) { pernyataan }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 64 — #78
i
64
i
Bab 10. Fungsi
Dari format pendeklarasian fungsi di atas, dapat disimpulkan bahwa sebuah fungsi dapat memiliki nilai kembalian (return value) dan dapat pula tidak memiliki nilai kembalian. Sebuah fungsi yang bertipe void adalah fungsi yang tidak memiliki nilai kembalian, sedangkan fungsi yang memiliki nilai kembalian disebut sebagai fungsi bernilai. Nilai yang dikembalikan oleh sebuah fungsi harus sesuai dengan tipe− data yang dideklarasikan pada saat sebuah fungsi dideklarasikan. Tipe data dari sebuah fungsi dapat berupa void, int, float, double, long, struct dan lain-lain. Fungsi yang bertipe void tidak akan mengirimkan nilai pada saat fungsi selesai dieksekusi, sementara fungsi yang bertipe selain void akan mengirimkan nilai kembalian pada saat fungsi tersebut selesai dieksekusi. Pengiriman nilai fungsi dilakukan menggunakan pernyataan return. Contoh: float celciusToFahreinheit(float celcius){ return ((celcius * 9/5) + 32); }
Contoh di atas memperlihatkan sebuah fungsi yang dideklarasi dengan nama celciusToFahreinheit dan memiliki sebuah parameter dengan nama celcius dan bertipe float. Fungsi itu sendiri bertipe float, artinya setelah fungsi selesai dijalankan maka akan ada sebuah nilai dengan tipe float dikembalikan kepada variabel atau pernyataan yang memanggil fungsi itu. Untuk contoh di atas, pernyataan yang dikembalikan oleh fungsi adalah pernyataan setelah kata kunci return, yaitu ((celcius * 9/5) + 32. Perhatikan pendeklarasian fungsi penjumlahan berikut ini: int penjumlahan(int operan1, int operan2){ return (operan1 + operan2); }
Contoh di atas memperlihatkan pendeklarasian fungsi penjumlahan yang bertipe int dan memiliki dua buah parameter yaitu operan1 dan operan2 yang kedua-duanya bertipe int. Tujuan dibuatnya fungsi penjumlahan tersebut adalah untuk menjumlahkan dua buah operan bertipe int dan mengembalikan nilai hasil penjumlahan itu kepada penyataan yang memanggilnya. Perhatikan conoth pemanggilan fungsi penjumlahan dalam sebuah program utama main(). #include <stdio.h> int main(void) {
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 65 — #79
i
10.4. Fungsi Bertipe Void
i
65
int a, b, c; printf("Penjumlahan dua bilangan bulat\n"); printf("a = "); scanf("%d", &a); printf("b = "); scanf("%d", &b); c = penjumlahan(a, b); printf("Hasil penjumlahan a + b = %d\n", c); return 1; }
10.4
Fungsi Bertipe Void
Fungsi bertipe void adalah fungsi yang tidak memiliki return value dan tidak memiliki pernyataan return dalam implementasinya. Program berikut memperlihatkan sebuah fungsi yang bertipe em void. void judulTabel() { printf("-----------------------\n"); printf(" No. U r a i a n\n"); printf("-----------------------\n"); }
Fungsi di atas juga tidak memiliki parameter. Fungsi yang tidak memiliki parameter hanya memiliki kurung buka dan kurung tutup setelah nama fungsinya tanpa ada parameter dideklarasi didalamnya. Cara pemanggilan fungsi yang tidak memiliki return value sama dengan cara pemanggilan fungsi dengan return value. Bila saat dipanggil nilai fungsi yang memiliki return value nilainya biasanya ditampung oleh variabel yang lain, maka untuk fungsi yang tidak memiliki return value, fungsi berdiri sendiri dan tidak memberikan nilainya kepada variabel manapun. Perhatikan contoh program berikut: #include <stdio.h> int main(void){ int i; judulTabel();
/*pemanggilan fungsi*/
return 1; }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 66 — #80
i
66
10.5 10.5.1
i
Bab 10. Fungsi
Jenis-Jenis Fungsi Fungsi Called by Value
Pengiriman nilai parameter sebuah fungsi secara called by value dilakukan dengan mengkopi nilai yang dikirim kepada parameter. Perhatikan fungsi penjumlahan yang telah diperlihatkan sebelumnya. Fungsi tersebut memiliki dua buah parameter. Pada saat fungsi tersebut dipanggil dalam program, nilai variabel a dan b di-copy kepada parameter operan1 dan operan2. Jika nilai operan1 dan operan2 mengalami perubahan maka nilai variabel a dan b tidak akan terpengaruh. Perhatikan contoh berikut ini: #include <stdio.h> int penjumlahan(int, int);
/* prototype fungsi */
int main(void) { int a = 2, b = 6, c; c = penjumlahan(a, b); printf("Hasil penjumlahan a + b = %d\n", c); printf("a = %d\n", a); printf("b = %d\n", b); return 1; } int penjumlahan(int operan1, int operan2) { operan1 = operan1 + 2; return (operan1 + operan2); }
Pada saat program tersebut dijalankan, memori dialokasikan untuk tiga buah variabel a, b dan c. Diketahui bahwa nilai variabel a adalah 2 dan nilai variabel b adalah 6, sementara nilai variabel c diawal tidak memiliki nilai.
Gambar 10.1: Visualisasi fungsi Pemanggilan fungsi pada pernyataan c=penjumlahan(a,b) mengakibatkan nilai dari variabel a dicopy kepada parameter operan1 dan nilai dari variabel b dicopy kepada parameter operan2. Perubahan
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 67 — #81
i
i
67
10.5. Jenis-Jenis Fungsi
nilai operan1 pada pernyataan operan1 = operan1 + 2 tidak akan mengubah nilai dari variabel a yang sebelumnya bernilai 2. Keluaran dari program di atas adalah: Hasil penjumlahan a + b = 10 a = 2 b = 6
10.5.2
Fungsi Called by Reference
Pengiriman nilai parameter sebuah fungsi secara called by reference dilakukan dengan cara mengirim alamat memori dari suatu variabel kepada parameter yang bersesuaian dalam bentuk pointer. Pemberian alamat memori kepada parameter dapat mengubah nilai dari variabel yang alamatnya dikirim. Perhatikan contoh berikut ini: #include <stdio.h> int penjumlahan(int *, int *);
/* prototype fungsi */
int main(void) { int a = 2, b = 6, c; c = penjumlahan(&a, &b); printf("Hasil penjumlahan a + b = %d\n", c); printf("a = %d\n", a); printf("b = %d\n", b); return 1; }
int penjumlahan(int * pa, int * pb) { *pb = *pb - 3; return (*pa + *pb); }
Pada saat program tersebut dijalankan, memori dialokasikan untuk tiga buah variabel a, b dan c. Diketahui bahwa nilai variabel a adalah 2 dan nilai variabel b adalah 6, sementara nilai variabel c diawal tidak memiliki nilai. Visualisasinya bisa dilihat pada gambar 10.2. Pemanggilan fungsi pada pernyataan c=penjumlahan(&a,&b) mengakibatkan alamat dari variabel a diberikan kepada pointer pa dan alamat dari variabel b diberikan kepada pointer pb. Visualisasinya bisa dilihat pada gambar 10.3.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 68 — #82
i
68
i
Bab 10. Fungsi
Gambar 10.2: Visualisasi fungsi
Gambar 10.3: Visualisasi fungsi
Pernyataan *pb = *pb - 3 akan mengakibatkan nilai dari b yang sebelumnnya bernilai 6 berubah menjadi 3, sehingga hasil penjumlahan bernilai 5. Keluaran dari program di atas adalah: Hasil penjumlahan a + b = 5 a = 2 b = 3
10.6
Fungsi String
Beberapa fungsi yang berkaitan dengan manipulasi tipe data string telah diimplementasikan sebelumnya dalam C. String adalah untaian karakter atau sekumpulkan karakter. Berikut adalah beberapa fungsi untuk data string: • Mengkopi string sumber ke string target s termasuk karakter 0 \00 (terminated string) char * strcpy(char * s, char * source) • Menyambung string sumber ke string s char * strcat(char * s, char * source) • Membandingkan string s1 dengan string s2 int strcmp(char * s1, char * s2). Fungsi strcmp akan mengirim nilai negatif bila string s1<s2, atau bernilai 0 bila string s1 = s2, atau bernilai positif jika string s1 > s2.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 69 — #83
i
10.6. Fungsi String
i
69
Contoh: #include <stdio.h> int main() { char string1[20]; char string2[20]; strcpy(string1, "Ahmad"); strcpy(string2, "Bani"); printf("Return Value: %d\n", strcmp( string1, string2)); strcpy(string1, "Hellooo"); strcpy(string2, "Helloo"); printf("Return Value: %d\n", strcmp( string1, string2)); strcpy(string1, "Hello"); strcpy(string2, "Hello"); printf("Return Value: %d\n", strcmp( string1, string2)); return 0; }
Contoh implementasi dari fungsi strcpy adalah sebagai berikut: char *strcpy(char *dest, *source){ while ((*dest++ = *source++) !="\0"); return dest; }
Atau char *strcpy(char *dest, *source){ while (*dest++ = *source++) ; return dest; }
Contoh implementasi dari fungsi strcat adalah sebagai berikut: char *strcat(char *first, char *second){ char *p; p =first; while (*p++) ;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 70 — #84
i
70
i
Bab 10. Fungsi
--p; while (*p++ = *second++) ; return first; }
Perhatikan contoh program yang memanipulasi string berikut ini. Perhatikan bagaimana pointer pA dan pB dapat memanipulasi karakter yang disimpan dalam setiap slot array strA dan strB. Bentuk kelompok yang terdiri atas 2-3 orang dan didiskusikan contoh program berikut ini. char strA[80] = "Sebuah string untuk tujuan demo"; char strB[80]; int main(void) { char *pA; char *pB; puts(strA); pA = strA; puts(pA); pB = strB; putchar(’\n’);
/* /* /* /* /* /* /*
sebuah pointer ke character */ sebuah pointer ke character */ print string A */ pointer pA tunjuk ke string A */ tampilkan yang ditunjuk pA */ pointe pB tunjuk ke string B */ buat baris baru */
/* selama *pA tidak ’\0’ tidak null */ while(*pA != ’\0’) { *pB++ = *pA++; } /* beri null string kepada strB */ *pB = ’\0’; puts(strB); /* print string B */ return EXIT_SUCCESS; }
Fungsi yang Berkenaan dengan Karakter • int isalnum(int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah alphanumeric. • int isalpha(int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah alphabet.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 71 — #85
i
10.6. Fungsi String
i
71
• int iscntrl(int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah karakter kontrol yang tidak dapat diprint seperti DEL, ESC, carriage return (CR), line feed (LF), dan lain-lain. • int isdigit(int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah digit. • int islower(int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah karakter huruf kecil. • int isupper (int c) Fungsi ini akan mengembalikan nilai nonzero bila parameter c adalah karakter huruf besar. • int ispunct(int c); Fungsi ini akan mengembalikan nilai nonzero bila parameter c merupakan tanda baca. Sebelum fungsi-fungsi di atas dapat digunakan, #include harus ditulis dalam program.
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 72 — #86
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 73 — #87
i
i
Bab 11
File 11.1
Pendahuluan
File merupakan unit standar penyimpanan data yang menggunakan konsep stream dalam proses pengaksesannya. Stream merupakan penghubung antara programmer dengan file. Sebuah stream terhubung dengan file yang disimpan dalam media penyimpanan melalui operasi OPEN dan terputus dari file melalui operasi CLOSE. Ada dua jenis stream yang dikenal dala pemrograman C, yaitu stream tipe teks (text) dan stream tipe binari (binary).
11.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan struktur data file, (ii) menjelaskan cara membuka, mengakses dan menutup file menggunakan stream teks, dan (iii) memperlihatkan beberapa contoh program yang menggunakan struktur data file.
11.3
File
Stream terhubung dengan file yang disimpan dalam media penyimpanan melalui operasi OPEN dan terputus dengan file melalui operasi CLOSE. Perintah membuka sebuah file dilakukan dengan fungsi fopen yang telah diimplementasikan dan prototipenya didefinisikan dalam library stdio.h, sementara perintah menutup sebuah file dapat dilakukan menggunakan fungsi fclose( ). FILE *fopen(char *nama_file, char *mode) FILE *fclose(FILE *file_pointer)
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 74 — #88
i
74
i
Bab 11. File
Mekanisme mengakses sebuah file ditentukan dari parameter mode. Nilai dari parameter mode dapay dilihat melalui tabel 11.1. Tabel 11.1: Parameter Mode untuk Akses File Mode Arti r Membuka sebuah file teks untuk pembacaan saja (read only) w Membuat sebuah file teks untuk penulisan a Menambahkan (append) data ke dalam sebuah file teks rb Membuka sebuah file binary untuk pembacaan saja wb Membuat sebuah file binary untuk penulisan ab Menambahkan data ke dalam sebuah file binary r+ Membuka sebuah file teks untuk pembacaan/penulisan w+ Membuat sebuah file teks untuk pembacaan/penulisan a+ Menambahkan data/membuat file teks untuk pembacaan/penulisan r+b/rb+ Membuka sebuah file binary untuk pembacaan/penulisan w+b/wb+ Membuat sebuah file binary untuk pembacaan/penulisan a+b/ab+ Menambahkan data ke file binary untuk pembacaan/penulisan Perhatikan penggalan dari program berikut ini: FILE
*ifp, *ofp;
ifp = fopen("input_file","r"); ofp = fopen("output_file","w"); : :
• ifp dan ofp adalah pointer ke FILE. • ifp tunjuk ke file dengan nama input− f ile dan file ini diakses dengan mode pembacaan saja (read-only). • ofp tunjuk ke file dengan nama output− f ile dan file ini diaskes dengan mode penulisan, artinya file output− f ile akan dibuat jika tidak ditemukan dalam media penyimpanan dan akan ditimpa (overwrite) jika file dengan nama yang sama telah ada dalam media penyimpanan.
11.4
Beberapa Contoh Manipulasi File
Contoh 1. Buka File, Baca Isinya dan Tulis ke Media Output
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 75 — #89
i
11.4. Beberapa Contoh Manipulasi File
i
75
Satu-Satu Karakter. #include #include <stdio.h> #include <stdlib.h> int main (void){ int c; FILE *fp; char *filename = "data.txt"; if((fp = fopen(filename, "r"))==NULL){ printf("Error dalam mengakses file...\n"); return EXIT_FAILURE; } while((c=fgetc(fp)) != EOF){ putchar(toupper(c)); } fclose(fp); return EXIT_SUCCESS; }
Contoh 2. Buka File, Jumlahkan, dan Tulis Penjumlahan ke dalam File. #include <stdio.h> #include <stdlib.h> int main (void){ int a, sum = 0; FILE *ifp, *ofp; ifp = fopen("input_file.txt", "r"); ofp = fopen("output_file.txt", "w"); while (fscanf(ifp,"%d",&a)==1){ sum += a; } fprintf(ofp, "Jumlah = %d\n",sum); fclose(ifp); fclose(ofp); return EXIT_SUCCESS; }
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 76 — #90
i
76
i
Bab 11. File
Contoh 3. Buka File, Jumlahkan, dan Tulis Penjumlahan ke dalam File. #include #include <stdio.h> #include <stdlib.h> int main(void){ FILE *fp; int ch; fp = fopen("output_file.txt", "w"); fprintf(fp, "%s", "Program Studi Informatika\n"); fprintf(fp, "%s", "UNSYIAH, Banda Aceh 23111\n\n\n"); fclose(fp); if((fp = fopen("output_file.txt", "r"))==NULL) { printf("Error dalam mengakses file...\n"); return EXIT_FAILURE; } while ((ch=fgetc(fp))!=EOF) { putchar(tolower(ch)); } fclose(fp); return EXIT_SUCCESS; }
11.5
Beberapa Fungsi untuk Manipulasi File Teks
• int fgetc(FILE *fp) Membaca sebuah byte dari sebuah stream • int fputc(int ch, FILE *fp) Menulis sebuah byte ke dalam sebuah stream • char *fgets(char *str, int num, FILE *fp) Membaca untaian karakter (string) dari sebuah stream • int fputs(char *str, FILE *fp) Menulis untaian karakter (string) ke dalam sebuah stream
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 77 — #91
i
i
Bab 12
Typedef & Struct 12.1
Pendahuluan
Kata kunci typedef dapat digunakan untuk membuat alias dari suatu tipe data. Struct merupakan perintah yang dapat digunakan untuk membuat struktur dari suatu record. Sebuah record bisa memiliki domain yang heterogen. Sebagai contoh, sebuah record yang merepresentasikan tentang seseorang memiliki atribut berupa nama yang bertipe string, umur yang bertipe integer, dan tinggi yang bertipe double. Biasanya penggunaan typedef dikombinasikan dalam pendeklarasian sebuah struct.
12.2
Objektif
Objektif dari materi ini adalah (i) memperkenalkan penggunaan typedef, (ii) memperkenalkan penggunaan struct, (iii) memperlihatkan cara mendeklarasi struct menggunakan kata kunci typedef.
12.3
Typedef
Kata kunci typedef dalam pemrograman C/C++ digunakan untuk membuat alias dari sebuah tipe data yang rumit. Walaupun typedef bisa digunakan untuk membuat alias dari pendefinisian tipe data primitif, typedef juga sering digunakan untuk mendefinisikan alias dari tipe data struct dan union. Perhatikan beberapa contoh penggunaan kata kunci typedef dalam pendeklarasian sebuah alias: typedef int Time; Time hours, minutes, seconds;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 78 — #92
i
78
i
Bab 12. Typedef & Struct
Pada contoh di atas, variabel Time merupakan alias dari tipe data primitif int. Setelah pendeklarasian alias int menjadi Time, pada saat pendeklarasian variabel hours, minutes, dan seconds, tipe data Time dapat digunakan sebagai tipe data dari ketiga variabel tersebut. Selanjutnya, pada saat variabel hours, minutes, dan seconds dideklarasikan, tipe data Time sudah dapat digunakan sebagai tipe data ketiga variabel tersebut. Sama halnya juga terjadi pada contoh berikut ini: typedef char * String; String nama_mahasiswa, alamat_mahasiswa;
Dalam C, pointer ke character merupakan satu-satunya cara mendeklarasi tipe data string. Pada contoh di atas, dengan menggunakan kata kunci typedef, sebuah tipe data baru String yang merupakan alias dari tipe data char* dideklarasikan. Selanjutnya, tipe data baru tersebut digunakan sebagai tipe data dari variabel nama− mahasiswa dan alamat− mahasiswa.
12.4
Penggunaan Typedef Pada Array
Pendeklarasian sebuah array bertipe int dilakukan dengan cara: int x[100];
Alias dari array bertipe int berukuran 100 tersebut dapat dibuat menggunakan kata kunci typedef sebagai berikut: • Langkah 1: Ganti variabel x dengan nama alias, misalnya Larik. int Larik[100];
• Langkah 2: Tambahkan kata kunci typedef sehingga menjadi: typedef int Larik[100];
• Langkah 3: Pendeklarasian variabel dengan tipe Larik berukuran 100 adalah: Larik a, b, c;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 79 — #93
i
12.5. Contoh Penggunaan Typedef
12.5
i
79
Contoh Penggunaan Typedef
Contoh 1: #define N 3 typedef float Scalar; typedef Scalar Vector[N]; void addVector(Vector a, Vector b, Vector c) { int i; for(i=0; i
Contoh 2: #define N 3 typedef float Scalar; typedef Scalar Matrix[N][N]; void addMatrix(Matrix a, Matrix b, Matrix c) { int i,j; for(i=0; i
12.6
Struct
Struct atau structure dalam C digunakan untuk membentuk tipe data dengan beberapa anggota (member) dengan tipe tertentu. Tipe data dari member sebuah struct boleh berbeda-beda. Cara mendeklarasi sebuah struct adalah sebagai berikut: struct tgl{ int hari; int bulan; int tahun; }; typedef struct tgl Tanggal; Tanggal date;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 80 — #94
i
80
i
Bab 12. Typedef & Struct
Atau dapat juga menggunakan kata kunci typedef pada saat mendeklarasikan struct tgl tersebut dengan menambahkan alias Tanggal dibagian akhir proses pendeklarasian struct itu. typedef struct tgl{ int hari; int bulan; int tahun; }Tanggal; Tanggal date;
Contoh di atas memperlihatkan bagaimana struct tgl yang memiliki member hari, bulan, dan tahun yang bertipe int dideklarasikan. Menggunakan kata kunci typedef, alias dari struct tgl dibuat. Selanjutnya, variabel date dapat dideklarasi bertipe alias Tanggal tersebut. Untuk mengakses anggota (member) dari sebuah struct, operator titik digunakan. Sebagai ilustrasi, perhatikan contoh berikut ini. date.hari = 2; date.tahun = 2001;
Pernyataan di atas mengakibatkan anggota dari struct date di atas memiliki nilai seperti tampak pada gambar 12.1.
Gambar 12.1: Visualisasi struct
12.7
Pointer ke Sebuah Struct
Pendeklarasian sebuah pointer ke struct tgl dapat dilakukan dengan cara: Tanggal date; Tanggal * pdate = &date;
Karena pdate merupakan pointer ke alias Tanggal dan date adalah sebuah variabel bertipe Tanggal, maka perintah pdate = &date;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 81 — #95
i
12.7. Pointer ke Sebuah Struct
i
81
Gambar 12.2: Visualisasi struct
mengakibatkan pointer pdate tunjuk ke alamat dari variabel date. Ilustrasi ini dapat dilihat melalui gambar 12.2 Untuk mengakses member dalam struct date menggunakan pointer pdate di atas, operator panah (->) harus digunakan sebelum nama member. Contoh: pdate -> hari = 2 pdate -> bulan = 11 pdate -> tahun = 1999;
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 82 — #96
i
i
i
i i
i
i
i
“bukuAjar” — 2011/9/22 — 13:39 — page 83 — #97
i
i
83
Daftar Pustaka
Daftar Pustaka Bronson, G. and H. Silver (1993). C for Engineers and Scientists: An Introduction to Programming with ANSI C. West Publishing Co. Feuer, A. (1998). The C Puzzle Book. Addison-Wesley Professional. Horton, I. (2006). Beginning C: From Novice to Professional, 4th edition. Apress. Jensen, T. Pointer Tutorial. URL: http://www.netcom.com/ ~tjensen/ptr/cpoint.htm. Kelly, A. and I. P. (1998). A Book on C: Programming in C, 4th edition. California: The Benjamin/Cummings Publishing Co. Kernighan, B. and D. M. Ritchie (1988). Language, 2nd edition. Prentice Hall, Inc.
The C Programming
Kochan, S. (2005). Programming in C: A Complete Introduction to the C Programming Language, 3rd edition. Sams Publishing. Solter, N. A. and S. Kleper (2005). Publishing Inc.
Professional C++.
Wiley
Vine, M. (2007). C Programming for the Absolute Beginner, 2nd edition. Course Technology PTR.
i
i i
i