Pemograman Bahasa C

229
PEMOGRAMAN BAHASA C Oleh: SALAHUDDIN, SST

description

PEMOGRAMAN BAHASA COleh: SALAHUDDIN, SSTPOLITEKNIK NEGERI LHOKSEUMAWE 2008DAFTAR ISIDaftar Isi BAB I SEKILAS TENTANG C 1.1 Sejarah dan Ruang Lingkup C 1.2 Kelebihan dan Kelemahan C 1.3 Proses Kompilasi dan Linking Program C 1.4 Struktur Penulisan Program C 1.5 Pengenalan Program C 1.5.1 Pengenalan Fungsi-Fungsi Dasar 1.5.2 Pengenalan Praprosesor #include 1.5.3 Komentar dalam Program Kesimpulan Latihan BAB II DASAR-DASAR PEMROGRAMAN C 2.1 Tipe Data Dasar 2.2 Variabel 2.2.1 Aturan Pendefi

Transcript of Pemograman Bahasa C

Page 1: Pemograman Bahasa C

PEMOGRAMAN BAHASA C

Oleh:

SALAHUDDIN, SST

POLITEKNIK NEGERI LHOKSEUMAWE2008

Page 2: Pemograman Bahasa C

DAFTAR ISI

Daftar Isi ii

BAB I SEKILAS TENTANG C 11.1 Sejarah dan Ruang Lingkup C 11.2 Kelebihan dan Kelemahan C 21.3 Proses Kompilasi dan Linking Program C 31.4 Struktur Penulisan Program C 51.5 Pengenalan Program C 6

1.5.1 Pengenalan Fungsi-Fungsi Dasar 61.5.2 Pengenalan Praprosesor #include 81.5.3 Komentar dalam Program 8

Kesimpulan 9Latihan 10

BAB II DASAR-DASAR PEMROGRAMAN C 112.1 Tipe Data Dasar 112.2 Variabel 12

2.2.1 Aturan Pendefinisian Variabel 122.2.2 Mendeklarasikan Variabel 122.2.3 Memberikan Nilai ke Variabel 132.2.4 Inisialisasi Variabel 13

2.3 Konstanta 142.4 Operator 14

2.4.1 Operator Aritmatika 152.4.2 Operator Penurunan dan Penaikan 162.4.3 Prioritas Operator Aritmatika 172.4.4 Operator Penugasan 182.4.5 Operator Kombinasi (Pemendekan) 18

2.5 Menampilkan Data ke Layar 192.5.1 Fungsi printf() 192.5.2 Fungsi putchar() 23

2.6 Memasukkan Data dari Keyboard 232.6.1 Fungsi scanf() 232.6.2 Fungsi getchar() 25

Kesimpulan 26Latihan 26

BAB III PENGAMBILAN KEPUTUSAN 283.1 Operator Kondisi 28

3.1.1 Operator Relasi 293.1.2 Operator Logika 293.1.3 Prioritas Operator Logika dan Relasi 31

3.2 Pernyataan if 323.3 Pernyataan if-else 343.4 Pernyataan if di dalam if 353.5 Pernyataan else-if 373.6 Pernyataan switch 39Kesimpulan 41Latihan 42

BAB IV PENGULANGAN PROSES 444.1 Pernyataan for 444.2 Pernyataan while 494.3 Pernyataan do-while 524.4 Pernyataan break 554.5 Pernyataan continue 564.6 Loop di dalam Loop (nested loop) 584.7 Pernyataan goto 604.8 Menggunakan exit() Untuk Menghentikan Eksekusi Program 61Kesimpulan 62Latihan 63

Page 3: Pemograman Bahasa C

BAB V FUNGSI 645.1 Dasar Fungsi 645.2 Memberikan Nilai Keluaran Fungsi 665.3 Fungsi dengan Keluaran Bukan Integer 695.4 Prototipe Fungsi (Function Prototype) 715.5 Parameter Formal dan Parameter Aktual 735.6 Cara Melewatkan Parameter 745.7 Penggolongan Variabel Berdasarkan Kelas Penyimpanan 79

5.7.1 Variabel Lokal 795.7.2 Variabel Eksternal 815.7.3 Variabel Statis 845.7.4 Variabel Register 85

5.8 Menciptakan Sejumlah Fungsi 865.9 Rekursi 875.10 Pengenalan Konsep Pemrograman Terstruktur 89Kesimpulan 90Latihan 90

BAB VI ARRAY 926.1 Array Berdimensi Satu 92

6.1.1 Mendeklarasikan Array Berdimensi Satu 926.1.2 Mengakses Elemen Array Berdimensi Satu9 936.1.3 Inisialisasi Array Berdimensi Satu 956.1.4 Beberapa Variasi dalam Mendeklarasikan Array 97

6.2 Array Berdimensi Dua 976.2.1 Mendeklarasikan Array Berdimensi Dua 97

6.2.2 Mengakses Elemen Array Berdimensi Dua 976.2.3 Inisialisasi Array Berdimensi Dua 1006.3 Array Berdimensi Banyak 1026.4 Inisialisasi Array Tak Berukuran 1056.5 Array Sebagai Parameter 107Kesimpulan 112Latihan 112

BAB VII. STRING 1147.1 Konstanta dan Variabel String 114

7.1.1 Konstanta String 1147.1.2 Variabel String 115

7.2 Inisialisasi String 1157.3 Input Output Data String 116

7.3.1 Memasukkan Data String 1167.3.2 Menampilkan Isi Variabel String 118

7.4 Mengakses Elemen String 1197.5 Fungsi-Fungsi Mengenai String 122

7.5.1 Fungsi strcpy() untuk Menyalin Nilai String 1227.5.2 Fungsi strlen() untuk Mengetahui Panjang Nilai String 1237.5.3 Fungsi strcat() untuk Menggabung Nilai String 1237.5.4 Fungsi strcmp() untuk Membandingkan Dua Nilai String 1247.5.5 Fungsi strchr() untuk Mencari Nilai Karakter dalam String 125

Kesimpulan 127Latihan 128

BAB VIII POINTER 1298.1 Konsep Dasar Pointer 1298.2 Mendeklarasikan Variabel Pointer 1308.3 Mengatur Pointer agar Menunjuk ke Variabel Lain 1308.4 Mengakses Isi Suatu Variabel Melalui Pointer 1318.5 Mengakses dan Mengubah Isi Suatu Variabel Pointer 1348.6 Pointer dan Array 1358.7 Pointer dan String 1378.8 Array dari Pointer 1398.9 Pointer Menunjuk Pointer 1408.10 Pointer dalam Fungsi 141

8.10.1 Pointer sebagai parameter fungsi 1418.10.2 Pointer sebagai keluaran fungsi (return value) 143

Page 4: Pemograman Bahasa C

Kesimpulan 144Latihan 145

IX STRUKTUR 1469.1 Mendefinisikan & Mendeklarasikan Struktur 1469.2 Mengakses Elemen Struktur 1489.3 Menginisialisasi Struktur 1499.4 Array dan Struktur 1519.5 Struktur dan Fungsi 154

9.5.1Melewatkan Elemen Struktur ke dalam Fungsi 1559.5.2Melewatkan Struktur ke dalam Fungsi 157

9.6 Struktur dan Pointer (Pointer ke Struktur) 158Kesimpulan 160Latihan 161

BAB X DATA TINGKAT LANJUT 16210.1 Union 16210.2 Bitfield 16510.3 Enumerasi 17010.4 Typedef 17310.5 Ternary Operation 17510.6 Tipe Cast 176Kesimpulan 178Latihan 179

BAB XI OPERASI FILE 18011.1 Struktur File 18011.2 Tahapan Operasi File 181

11.2.1 Membuka / Mengaktifkan File 18111.2.2 Menutup File 183

11.3 Operasi Penyimpanan dan Pembacaan File Per Karakter 18311.3.1 Fungsi fputc() 18311.3.2 Fungsi fgetc() 185

11.4 File Biner dan File Teks 18611.5 Operasi Penyimpanan dan Pembacaan File Per Int 18711.6 Operasi Penyimpanan dan Pembacaan File Per Blok 19011.7 Menyimpan dan Membaca Data String pada File 19311.8 Mengakses File Biner secara Acak 19711.9 Menghapus File 20311.10 Mengganti Nama File 204Kesimpulan 205Latihan 206

BAB I

Page 5: Pemograman Bahasa C

SEKILAS TENTANG C

Tujuan :

1. Menjelaskan sejarah dan ruang lingkup pemakaian bahasa C

2. Menjelaskan kelebihan dan kekurangan bahasa C

3. Menjelaskan proses kompilasi dan linking program C

4. Menjelaskan struktur penulisan bahasa C dan menjelaskan komponen-komponen program dalam

contoh aplikasi sederhana

1.1. Sejarah dan Ruang Lingkup C

Akar dari bahasa C adalah bahasa BCPL yang dikembangkan oleh Martin Richards pada tahun

1967. Bahasa ini memberikan ide kepada Ken Thompson yang kemudian mengembangkan bahasa yang

disebut dengan B pada tahun 1970. Perkembangan selanjutnya dari bahasa B adalah bahasa C oleh Dennis

Ritchie sekitar tahun 1970-an di Bell Telephone Laboratories Inc. (sekarang adalah AT&T Bell

Laboratories). Bahasa C pertama kali digunakan pada komputer Digital Equipment Corporation PDP-11

yang menggunakan sistem operasi UNIX.

C adalah bahasa yang standar, artinya suatu program yang ditulis dengan versi bahasa C tertentu

akan dapat dikompilasi dengan versi bahasa C yang lain dengan sedikit modifikasi. Standar bahasa C yang

asli adalah standar dari UNIX. Sistem operasi, kompiler C dan seluruh program aplikasi UNIX yang

esensial ditulis dalam bahasa C. Patokan dari standar UNIX ini diambilkan dari buku yang ditulis oleh

Brian Kerninghan dan Dennis Ritchie berjudul "The C Programming Language", diterbitkan oleh Prentice-

Hall tahun 1978. Deskripsi C dari Kerninghan dan Ritchie ini kemudian dikenal secara umum sebagai

"K&R C". Kepopuleran bahasa C membuat versi-versi dari bahasa ini banyak dibuat untuk komputer

mikro. Untuk membuat versi-versi tersebut menjadi standar, ANSI (American National Standards

Institute) membentuk suatu komite (ANSI committee X3J11) pada tahun 1983 yang kemudian menetapkan

standar ANSI untuk bahasa C. Standar ANSI ini didasarkan kepada standar UNIX yang diperluas.

Standar ANSI menetapkan sebanyak 32 buah kata-kata kunci (keywords) standar. Versi-versi bahasa C

yang menyediakan paling tidak 32 kata-kata kunci ini dengan sintaks yang sesuai dengan yang ditentukan

oleh standar, maka dapat dikatakan mengikuti standar ANSI. Buku ajar ini didasarkan pada bahasa C dari

standar ANSI.

Pada saat ini C merupakan bahasa pemrograman yang sangat populer di dunia. Banyak

pemrograman yang dibuat dengan bahasa C seperti assembler, interpreter, program paket, sistem operasi,

editor, kompiler, program bantu, Word Star, Dbase, aplikasi untuk bisnis, matematika, dan game, bahkan

ada pula yang menerapkannya untuk kecerdasan buatan. Dalam beberapa literatur bahasa C digolongkan

sebagai bahasa tingkat menengah. Penggolongan ke dalam bahasa tingkat menengah bukanlah berarti

bahwa bahasa C lebih sulit dibandingkan dengan bahasa tingkat tinggi seperti PASCAL atau BASIC.

Demikian juga bahasa C bukanlah bahasa yang berorientasi pada mesin seperti bahasa mesin dan

assembly. Pada kenyataannya bahasa C mengkombinasikan elemen dalam bahasa tingkat tinggi dan bahasa

tingkat rendah. Kemudahan dalam membuat program yang ditawarkan pada bahasa tingkat tinggi dan

kecepatan eksekusi dari bahasa tingkat rendah merupakan tujuan diwujudkannya bahasa C.

1.2. Kelebihan dan Kelemahan C.

Page 6: Pemograman Bahasa C

Beberapa kelebihan dari bahasa C:

Bahasa C tersedia hampir di semua jenis komputer, baik mikro, mini maupun komputer besar (mainframe

computer).

Kode bahasa C bersifat portabel. Suatu aplikasi yang ditulis dengan bahasa C untuk suatu komputer

tertentu dapat digunakan di komputer lain hanya dengan sedikit modifikasi.

Berbagai struktur data dan pengendalian proses disediakan dalam C sehingga memungkinkan untuk

membuat program yang terstruktur. Struktur bahasa yang baik, selain mudah dipelajari juga memudahkan

dalam pembuatan program, pelacakan kesalahan program dan akan menghasilkan dokumentasi program

yang baik.

Dibandingkan dengan bahasa mesin atau assembly, C jauh lebih mudah dipahami dan pemrogram tidak

perlu mengetahui mesin komputer secara detil. Dengan demikian tidak akan menyita waktu yang

terlampau banyak dalam menyelesaikan suatu masalah ke dalam bentuk program. Hal ini dikarenakan C

merupakan bahasa yang berorientasi pada permasalahan, bukan berorientasi pada mesin.

C memungkinkan memanipulasi data dalam bentuk bit maupun byte. Di samping itu juga memungkinkan

untuk memanipulasi alamat dari suatu data atau pointer.

Adapun kelemahan bahasa C yang dirasakan oleh para pemula bahasa C:

Banyaknya operator serta fleksibilitas penulisan program kadang-kadang membingungkan pemakai.

Kalau tidak dikuasai sudah tentu akan menimbulkan masalah.

Para pemrogram C tingkat pemula umumnya belum pernah mengenal pointer dan tidak terbiasa

menggunakannya. Padahal keampuhan C justru terletak pada pointer.

Kesulitan yang diuraikan di depan akan bersifat sementara saja. Kalau para pemula C mau

mempelajarinya, sebenarnya tak ada yang dikatakan sulit sekali mengenai C. Mereka yang sudah terbiasa

justru menyatakan bahwa bekerja dengan C sangat menyenangkan. Pepatah mengatakan “Di mana ada

kemauan di situ ada jalan” dan “Jika tak kenal maka tak sayang”.

1.3. Proses Kompilasi dan Linking Program C

Agar suatu program dalam bahasa pemrograman dapat dimengerti oleh komputer, program

haruslah diterjemahkan dahulu ke dalam kode mesin. Adapun penerjemah yang digunakan bisa berupa

interpreter atau kompiler.

Interpreter adalah suatu jenis penerjemah yang menerjemahkan baris per baris intsruksi untuk setiap

saat. Keuntungan pemakaian interpreter, penyusunan program relatif lebih cepat dan bisa langsung diuji

sekalipun masih ada beberapa kesalahan secara kaidah dalam program. Sedangkan kelemahannya,

kecepatannya menjadi lambat sebab sebelum suatu instruksi dijalankan selalu harus diterjemahkan terlebih

dahulu. Selain itu, saat program dieksekusi, interpreter juga harus berada dalam memori. Jadi memori selalu

digunakan baik untuk program maupun interpreter. Di samping itu, program sumber (source program) yaitu

program aslinya tidak dapat dirahasiakan (orang lain selalu bisa melihatnya).

Kebanyakan versi C yang beredar di pasaran menggunakan penerjemah berupa kompiler. Kompiler

merupakan jenis penerjemah yang lain, dengan cara kerjanya yaitu menerjemahkan seluruh instruksi dalam

Page 7: Pemograman Bahasa C

program sekaligus. Proses pengkompilasian ini cukup dilakukan sekali saja. Selanjutnya hasil penerjemahan

(setelah melalui tahapan yang lain) bisa dijalankan secara langsung, tanpa tergantung lagi oleh program

sumber maupun kompilernya. Keuntungannya, proses eksekusi dapat berjalan dengan cepat, sebab tak ada

lagi proses penerjemahan. Di samping itu, program sumber bisa dirahasiakan, sebab yang dieksekusi adalah

program yang sudah dalam bentuk kode mesin. Sedangkan kelemahannya, proses pembuatan dan pengujian

membutuhkan waktu relatif lebih lama, sebab ada waktu untuk mengkompilasi (menerjemahkan) dan ada pula

waktu melakukan proses linking. Perlu pula diketahui, program akan berhasil dikompilasi hanya jika program

tak mengandung kesalahan secara kaidah sama sekali.

Proses dari bentuk program sumber C (source program, yaitu program yang ditulis dalam bahasa C)

hingga menjadi program yang executable (dapat dieksekusi secara langsung) ditunjukkan pada Gambar 1.1 di

bawah ini.

Gambar 1.1 Proses Kompilasi-Linking dari program C

Keterangan Gambar :

Pertama-tama program C ditulis dengan menggunakan editor. Program ini disimpan dalam file

yang disebut file program sumber (dengan ciri utama memiliki ekstensi .c).

EDITOR EDITOR

FILE INCLUDE(FILE JUDUL)

xxx.h

FILE PROGRAMSUMBERyyy.c

KOMPILER

FILE OBYEK

LAIN

LINKER

FILE

EXECUTABLE

FILE OBYEK FILE PUSTAKA

(library file)

Page 8: Pemograman Bahasa C

File include (umumnya memiliki ekstensi .h, misalnya stdio.h, atau biasa disebut dengan file

judul (header file)) berisi kode yang akan dilibatkan dalam program C (Pada program tertentu

bisa saja tidak melibatkan file include).

Berikutnya, kode dalam file program sumber maupun kode pada file include akan dikompilasi

oleh kompiler menjadi kode obyek. Kode obyek ini disimpan pada file yang biasanya

berekstensi .obj, atau .o (bergantung kepada lingkungan/environment sistem operasi yang

dipakai). Kode obyek berbentuk kode mesin, oleh karena itu tidak dapat dibaca oleh pemrogram.

Akan tetapi kode ini sendiri juga belum bisa dipahami komputer.

Supaya bisa dimengerti oleh komputer, maka kode obyek bersama-sama dengan kode obyek

yang lain (kalau ada) dan isi file pustaka (library file, yaitu file yang berisi rutin untuk

melaksanakan tugas tertentu. File ini disediakan oleh pembuat kompiler, biasanya memiliki

ekstensi .lib) perlu dikaitkan (linking) dengan menggunakan linker, membentuk sebuah program

yang executable (program yang dapat dijalankan/dieksekusi secara langsung dalam lingkungan

sistem operasi).

Program hasil linker ini disimpan dalam file yang disebut file executable, yang biasanya

berekstensi .exe.

1.4. Struktur Penulisan Program C

Untuk dapat memahami bagaimana suatu program ditulis, maka struktur dari program harus

dimengerti terlebih dahulu. Tiap bahasa komputer mempunyai struktur program yang berbeda.

Struktur program memberikan gambaran secara luas, bagaimana bentuk program secara umum.

Program C pada hakekatnya tersusun atas sejumlah blok fungsi. Sebuah program minimal

mengandung sebuah fungsi. Fungsi pertama yang harus ada dalam program C dan sudah ditentukan

namanya adalah main(). Setiap fungsi terdiri atas satu atau beberapa pernyataan, yang secara

keseluruhan dimaksudkan untuk melaksanakan tugas khusus. Bagian pernyataan fungsi (sering

disebut tubuh fungsi) diawali dengan tanda kurung kurawal buka ({) dan diakhiri dengan tanda

kurung kurawal tutup (}). Di antara kurung kurawal itu dapat dituliskan statemen-statemen program

C. Namun pada kenyataannya, suatu fungsi bisa saja tidak mengandung pernyataan sama sekali.

Walaupun fungsi tidak memiliki pernyataan, kurung kurawal haruslah tetap ada. Sebab kurung

kurawal mengisyaratkan awal dan akhir definisi fungsi. Berikut ini adalah struktur dari program C

main(){

statemen-statemen; fungsi utama}

fungsi_fungsi_lain(){

statemen-statemen; fungsi-fungsi lain yang} ditulis oleh pemrogram

Page 9: Pemograman Bahasa C

Bahasa C dikatakan sebagai bahasa pemrograman terstruktur karena strukturnya

menggunakan fungsi-fungsi sebagai program-program bagiannya (subroutine). Fungsi-fungsi yang

ada selain fungsi utama (main()) merupakan program-program bagian. Fungsi-fungsi ini dapat

ditulis setelah fungsi utama atau diletakkan di file pustaka (library). Jika fungsi-fungsi diletakkan di

file pustaka dan akan dipakai di suatu program, maka nama file judulnya (header file) harus

dilibatkan dalam program yang menggunakannya dengan preprocessor directive berupa #include.

1.5.Pengenalan Program C

1.5.1. Pengenalan Fungsi-Fungsi Dasar

a. Fungsi main()

Pada program C, main() merupakan fungsi yang istimewa. Fungsi main() harus ada pada program,

sebab fungsi inilah yang menjadi titik awal dan titik akhir eksekusi program. Tanda { di awal

fungsi menyatakan awal tubuh fungsi dan sekaligus awal eksekusi program, sedangkan tanda } di

akhir fungsi merupakan akhir tubuh fungsi dan sekaligus adalah akhir eksekusi program. Jika

program terdiri atas lebih dari satu fungsi, fungsi main() biasa ditempatkan pada posisi yang

paling atas dalam pendefinisian fungsi. Hal ini hanya merupakan kebiasaan. Tujuannya untuk

memudahkan pencarian terhadap program utama bagi pemrogram. Jadi bukanlah merupakan

suatu keharusan.

b. Fungsi printf().

Fungsi printf() merupakan fungsi yang umum dipakai untuk menampilkan suatu keluaran pada

layar peraga. Untuk menampilkan tulisan

Selamat belajar bahasa Cmisalnya, pernyataan yang diperlukan berupa:

printf(“Selamat belajar bahasa C”);

Pernyataan di atas berupa pemanggilan fungsi printf() dengan argumen atau parameter berupa

string. Dalam C suatu konstanta string ditulis dengan diawali dan diakhiri tanda petik-ganda (“).

Perlu juga diketahui pernyataan dalam C selalu diakhiri dengan tanda titik koma (;). Tanda titik

koma dipakai sebagai tanda pemberhentian sebuah pernyataan dan bukanlah sebagai pemisah

antara dua pernyataan. Tanda \ pada string yang dilewatkan sebagai argumen printf() mempunyai

makna yang khusus. Tanda ini bisa digunakan untuk menyatakan karakter khusus seperti karakter

baris-baru ataupun karakter backslash (miring kiri). Jadi karakter seperti \n sebenarnya

menyatakan sebuah karakter. Contoh karakter yang ditulis dengan diawali tanda \ adalah:

\” menyatakan karakter petik-ganda

\\ menyatakan karakter backslash

\t menyatakan karakter tab

Page 10: Pemograman Bahasa C

Dalam bentuk yang lebih umum, format printf()

printf(“string kontrol”, daftar argumen);

dengan string kontrol dapat berupa satu atau sejumlah karakter yang akan ditampilkan ataupun

berupa penentu format yang akan mengatur penampilan dari argumen yang terletak pada daftar

argumen. Mengenai penentu format di antaranya berupa:

%d untuk menampilkan bilangan bulat (integer)

%f untuk menampilkan bilangan titik-mengambang (pecahan)

%c untuk menampilkan sebuah karakter

%s untuk menampilkan sebuah string

Contoh:

#include <stdio.h>

main( ){

printf(“No : %d\n”, 10);printf(“Nama : %s\n”, “Ali”);printf(“Nilai : %f\n”,80.5);printf(“Huruf : %c\n”,‘A’);

}

1.5.2. Pengenalan Praprosesor #include

#include merupakan salah satu jenis pengarah praprosesor (preprocessor directive). Pengarah

praprosesor ini dipakai untuk membaca file yang di antaranya berisi deklarasi fungsi dan definisi

konstanta. Beberapa file judul disediakan dalam C. File-file ini mempunyai ciri yaitu namanya

diakhiri dengan ekstensi .h. Misalnya pada program #include <stdio.h> menyatakan pada kompiler

agar membaca file bernama stdio.h saat pelaksanaan kompilasi.

Bentuk umum #include:

#include “namafile”

Bentuk pertama (#include <namafile>) mengisyaratkan bahwa pencarian file dilakukan pada

direktori khusus, yaitu direktori file include. Sedangkan bentuk kedua (#include “namafile”)

menyatakan bahwa pencarian file dilakukan pertama kali pada direktori aktif tempat program sumber

dan seandainya tidak ditemukan pencarian akan dilanjutkan pada direktori lainnya yang sesuai

dengan perintah pada sistem operasi.

Kebanyakan program melibatkan file stdio.h (file-judul I/O standard, yang disediakan dalam

C). Program yang melibatkan file ini yaitu program yang menggunakan pustaka I/O (input-output)

standar seperti printf().

Page 11: Pemograman Bahasa C

1.5.3. Komentar dalam Program

Untuk keperluan dokumentasi dengan maksud agar program mudah dipahami di suatu saat

lain, biasanya pada program disertakan komentar atau keterangan mengenai program. Dalam C,

suatu komentar ditulis dengan diawali dengan tanda /* dan diakhiri dengan tanda */.

Contoh :

/* Tanda ini adalah komentar */

#include <stdio.h>

main(){

printf(“Coba\n”); /* Ini adl program pertama */}

Kesimpulan :

Akar dari bahasa C adalah bahasa BCPL yang dikembangkan oleh Martin Richards pada tahun

1967.

Bahasa C pertama kali digunakan pada komputer Digital Equipment Corporation PDP-11

yang menggunakan sistem operasi UNIX.

C adalah bahasa yang standar, artinya suatu program yang ditulis dengan versi bahasa C

tertentu akan dapat dikompilasi dengan versi bahasa C yang lain dengan sedikit modifikasi.

Standar bahasa C yang asli adalah standar dari UNIX.

Interpreter adalah suatu jenis penerjemah yang menerjemahkan baris per baris intsruksi untuk

setiap saat, sedangkan kompiler merupakan jenis penerjemah cara kerjanya adalah

menerjemahkan seluruh instruksi dalam program sekaligus.

Program C pada hakekatnya tersusun atas sejumlah blok fungsi.

Fungsi main() merupakan fungsi istimewa yang harus ada pada program, sebab fungsi inilah

yang menjadi titik awal dan titik akhir eksekusi program.

Fungsi printf() merupakan fungsi yang umum dipakai untuk menampilkan suatu keluaran pada

layar peraga.

#include merupakan salah satu jenis pengarah praprosesor (preprocessor directive) yang

dipakai untuk membaca file yang di antaranya berisi deklarasi fungsi dan definisi konstanta.

Untuk keperluan dokumentasi, di dalam program disertakan komentar yang ditulis dengan

diawali dengan tanda /* dan diakhiri dengan tanda */.

Page 12: Pemograman Bahasa C

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Apakah keluaran dari program di bawah ini :

#include <stdio.h>main(){

printf("The black dog was big. ");printf("The cow jumped over the moon.\n");

}

2. Gunakan pernyataan printf() untuk menampilkan (di layar) nilai dari sebuah variabel

(misalkan namanya = sum) yang bertipe integer.

3. Gunakan pernyataan printf() untuk menampilkan (di layar) string “Welcome” yang diikuti

dengan sebuah perintah ganti baris.

4. Gunakan pernyataan printf() untuk menampilkan (di layar) sebuah karakter dari variabel yang

bertipe karakter (misalkan namanya = letter).

5. Gunakan pernyataan printf() untuk menampilkan (di layar) nilai dari sebuah variabel float

(misalkan namanya = discount).

6. Gunakan pernyataan scanf() untuk membaca masukan sebuah nilai desimal dari keyboard dan

memasukkannya ke sebuah variabel integer (misalkan namanya = sum).

7. Gunakan pernyataan scanf() untuk membaca masukan nilai float dari keyboard dan

memasukkannya ke sebuah variabel float (misalkan namanya = discount_rate).

8. Gunakan pernyataan scanf() untuk membaca masukan sebuah karakter dari keyboard dan

memasukkannya ke sebuah variabel karakter (misalkan namanya = opr).

BAB IIDASAR-DASAR PEMROGRAMAN

Tujuan :

1. Menjelaskan tentang beberapa tipe data dasar (jenis dan jangkauannya)

2. Menjelaskan tentang Variabel

3. Menjelaskan tentang konstanta

4. Menjelaskan tentang berbagai jenis operator dan pemakaiannya

5. Menjelaskan tentang instruksi I/O

2.1. Tipe Data Dasar

Data merupakan suatu nilai yang bisa dinyatakan dalam bentuk konstanta atau variabel.

Konstanta menyatakan nilai yang tetap, sedangkan variabel menyatakan nilai yang dapat diubah-

ubah selama eksekusi berlangsung, Data berdasarkan jenisnya dapat dibagi menjadi lima kelompok,

yang dinamakan sebagai tipe data dasar. Kelima tipe data dasar adalah:

Page 13: Pemograman Bahasa C

Bilangan bulat (integer)

Bilangan real presisi-tunggal

Bilangan real presisi-ganda

Karakter

Tak-bertipe (void), keterangan lebih lanjut tentang void dijelaskan dalam Bab V.

Kata-kunci yang berkaitan dengan tipe data dasar secara berurutan di antaranya adalah int

(short int, long int, signed int dan unsigned int), float, double, dan char.

Tabel 2-1 memberikan informasi mengenai ukuran memori yang diperlukan dan kawasan dari

masing-masing tipe data dasar.

Tabel 2-1. Ukuran memori untuk tipe data

Untuk tipe data short int, long int, signed int dan unsigned int, maka ukuran memori yang diperlukan

serta kawasan dari masint-masing tipe data adalah sebagai berikut :

Tabel 2-2 Ukuran memori untuk tipe data int

Catatan :

Ukuran dan kawasan dari masing-masing tipe data adalah bergantung pada jenis mesin yang

digunakan (misalnya mesin 16 bit bisa jadi memberikan hasil berbeda dengan mesin 32 bit).

2.2 Variabel

2.2.1 Aturan Pendefinisan Variabel

Aturan penulisan pengenal untuk sebuah variabel, konstanta atau fungsi yang didefinisikan

oleh pemrogram adalah sebagai berikut :

Pengenal harus diawali dengan huruf (A..Z, a..z) atau karakter garis bawah ( _ ).

Selanjutnya dapat berupa huruf, digit (0..9) atau karakter garis bawah atau tanda dollar ($).

Panjang pengenal boleh lebih dari 31 karakter, tetapi hanya 31 karakter pertama yang akan

dianggap berarti.

Pengenal tidak boleh menggunakan nama yang tergolong sebagai kata-kata cadangan (reserved

words) seperti int, if, while dan sebagainya.

Tipe Total bit Kawasan Keterangan

char 8 -128 s/d 127 karakterint 32 -2147483648 s/d 2147483647 bilangan integerfloat 32 1.7E-38 s/d 3.4E+38 bilangan real presisi-tunggaldouble 64 2.2E-308 s/d 1.7E+308 bilangan real presisi-ganda

Tipe Total bit Kawasan Keterangan

short int 16 -32768 s/d 32767 short integerlong int 32 -2147483648 s/d 2147483647 long integersigned int 32 -2147483648 s/d 2147483647 biasa disingkat dengan intunsigned int 32 0 s/d 4294967295 bilangan int tak bertanda

Page 14: Pemograman Bahasa C

2.2.2 Mendeklarasikan Variabel

Variabel digunakan dalam program untuk menyimpan suatu nilai, dan nilai yang ada padanya

dapat diubah-ubah selama eksekusi program berlangsung. Variabel yang akan digunakan dalam

program haruslah dideklarasikan terlebih dahulu. Pengertian deklarasi di sini berarti memesan

memori dan menentukan jenis data yang bisa disimpan di dalamnya. Bentuk umum deklarasi

variabel:

Pada pendeklarasian varibel, daftar-variabel dapat berupa sebuah variabel atau beberapa

variabel yang dipisahkan dengan koma. Contoh:

int var_bulat1;

float var_pecahan1, var_pecahan2;

2.2.3 Memberikan Nilai ke Variabel

Untuk memberikan nilai ke variabel yang telah dideklarasikan, maka bentuk umum

pernyataan yang digunakan adalah :

Contoh:

int var_bulat = 10;double var_pecahan = 10.5;

2.2.4 Inisialisasi Variabel

Adakalanya dalam penulisan program, setelah dideklarasikan, variabel langsung diberi nilai

awal. Sebagai contoh yaitu variabel nilai :

int nilai;nilai = 10;

Dua pernyataan di atas sebenarnya dapat disingkat melalui pendeklarasian yang disertai penugasan

nilai, sebagai berikut :

int nilai= 10;Cara seperti ini banyak dipakai dalam program C, di samping menghemat penulisan pernyataan, juga

lebih memberikan kejelasan, khususnya untuk variabel yang perlu diberi nilai awal (diinisialisasi).

2.3 Konstanta

Konstanta menyatakan nilai yang tetap. Berbeda dengan variabel, suatu konstanta tidak

dideklarasikan. Namun seperti halnya variabel, konstanta juga memiliki tipe. Penulisan konstanta

mempunyai aturan tersendiri, sesuai dengan tipe masing-masing.

Konstanta karakter misalnya ditulis dengan diawali dan diakhiri dengan tanda petik tunggal,

contohnya : ‘A’ dan ‘@’.

tipe daftar-variabel;

nama_variabel = nilai;

Page 15: Pemograman Bahasa C

Konstanta integer ditulis dengan tanda mengandung pemisah ribuan dan tak mengandung bagian

pecahan, contohnya : –1 dan 32767.

Konstanta real (float dan double) bisa mengandung pecahan (dengan tanda berupa titik) dan

nilainya bisa ditulis dalam bentuk eksponensial (menggunakan tanda e), contohnya : 27.5f (untuk

tipe float) atau 27.5 (untuk tipe double) dan 2.1e+5 (maksudnya 2,1 x 105 ).

Konstanta string merupakan deretan karakter yang diawali dan diakhiri dengan tanda petik-ganda

(“), contohnya :“Pemrograman Dasar C”.

2.4 Operator

Operator merupakan simbol atau karakter yang biasa dilibatkan dalam program untuk

melakukan sesuatu operasi atau manipulasi, seperti menjumlahkan dua buah nilai, memberikan nilai

ke suatu variabel, membandingkan kesamaan dua buah nilai. Sebagian operator C tergolong sebagai

operator binary, yaitu operator yang dikenakan terhadap dua buah nilai (operand). Contoh :

a + b

Simbol + merupakan operator untuk melakukan operasi penjumlahan dari kedua operand-nya

(yaitu a dan b). Karena operator penjumlahan melibatkan dua operator ini tergolong sebagai

operator binary.

-cSimbol - (minus) juga merupakan operator. Simbol ini termasuk sebagai operator unary, yaitu

operator yang hanya memiliki sebuah operand (yaitu c pada contoh ini).

2.4.1. Operator Aritmatika

Operator untuk operasi aritmatika yang tergolong sebagai operator binary adalah :

* perkalian

/ pembagian

% sisa pembagian

+ penjumlahan

- pengurangan

Adapun operator yang tergolong sebagai operator unary.

- tanda minus

+ tanda plus

Contoh pemakaian operator aritmatika misalnya untuk memperoleh nilai diskriminan dari

suatu persamaan kuadrat : D = b2 – 4ac

/* File program : diskrim.c Menghitung diskriminan pers kuadrat ax^2 + bx + c = 0 */

# include <stdio.h>

main(){

Page 16: Pemograman Bahasa C

float a,b,c,d; a = 3.0f; b = 4.0f; c = 7.0f;

d = b*b-4*a*c; printf(“Diskriminan =%f\n”,d);}

Contoh eksekusi :

Diskriminan = -84.000000

Operator yang telah dituliskan di atas, yang perlu diberi penjelasan lebih lanjut adalah operator

sisa pembagian. Beberapa contoh berikut kiranya akan memperjelas makna dari operator ini .

Sisa pembagian bilangan 7 dengan 2 adalah 1 (7 % 2 1)

Sisa pembagian bilangan 6 dengan 2 adalah 0 (6 % 2 0)

Sisa pembagian bilangan 8 dengan 3 adalah 1 (8 % 3 2)

Kegunaan operator ini diantaranya bisa dipakai untuk menentukan suatu bilangan bulat

termasuk ganjil atau genap, berdasarkan logika : “Jika bilangan habis dibagi dua (sisanya nol),

bilangan termasuk genap. Sebaliknya, termasuk ganjil”.

2.4.2. Operator Penurunan dan Penaikan

Masih berkaitan dengan operasi aritmatika, C menyediakan operator yang disebut sebagai

operator penaikan dan operator penurunan, yaitu :

++ operator penaikan

-- operator penurunan

Operator penaikan digunakan untuk menaikkan nilai variabel sebesar satu. Penempatan operator

terhadap variabel dapat dilakukan di muka atau di belakangnya, contohnya :

x = x+1;

y = y+1;

Bisa ditulis menjadi :

++x;

--y;

atau :

x++;

y--;

Page 17: Pemograman Bahasa C

Bergantung pada kondisi yang dibutuhkan oleh pemrogram. Di bawah ini adalah contoh

yang akan menunjukkan perbedaan pemakaian dan hasil dari ++x dengan x++ (atau pemakaian y--

dengan –-y).

/* File program : pre_post.cContoh penggunaan pre & post Increment operator */

#include <stdio.h>

main(){

int count = 0, loop;

loop = ++count; /* count=count+1; loop=count; */printf("loop = %d, count = %d\n", loop, count);

loop = count++; /* loop=count; count=count+1; */printf("loop = %d, count = %d\n", loop, count);

}

Contoh eksekusi :

loop = 1, count = 1loop = 1, count = 22.4.3. Prioritas Operator Aritmatika

Tabel di bawah ini memberikan penjelasan mengenai prioritas dari masing-masing operator.

Operator yang mempunyai prioritas tinggi akan diutamakan dalam hal pengerjaan dibandingkan

dengan operator yang memiliki prioritas lebih rendah.

Tabel 2.3 Tabel prioritas operator aritmatika dan urutan pengerjaannya

*) Bentuk unary + dan unary – memiliki prioritas yang lebih tinggi daripada bentuk binary + dan

binary -

2.4.4. Operator Penugasan

Operator penugasan (assignment operator) digunakan untuk memindahkan nilai dari suatu

ungkapan (expression) ke suatu pengenal. Operator pengerjaan yang umum digunakan dalam bahasa

pemrograman, termasuk bahasa C adalah operator sama dengan (=). Contohnya :

fahrenheit = celcius * 1.8 + 32;

PRIORITAS OPERATOR URUTAN PENGERJAAN

Tertinggi ( ) dari kiri ke kanan

! ++ -- + - dari kanan ke kiri *)

* / % dari kiri ke kanan

+ - dari kiri ke kanan *)

Terendah = += -= *= /= %= dari kanan ke kiri

Page 18: Pemograman Bahasa C

Maka ‘=’ adalah operator penugasan yang akan memberikan nilai dari ungkapan : celcius * 1.8 + 32

kepada variabel fahrenheit.

Bahasa C juga memungkinkan dibentuknya statemen penugasan menggunakan operator

pengerjaan jamak dengan bentuk sebagai berikut :

pengenal1 = pengenal2 = … = ungkapan ;

Misalnya :

a = b = 15; maka nilai variabel ‘a ‘ akan sama dengan nilai variabel ‘b‘ akan sama dengan 15.

2.4.5 Operator Kombinasi (Pemendekan)

C menyediakan operator yang dimaksudkan untuk memendekkan penulisan operasi penugasan semacam

x = x + 2;y = y * 4;

menjadix += 2;y *= 4;

Daftar berikut memberikan seluruh kemungkinan operator kombinasi dalam suatu

pernyataan serta pernyataan padanannya.

Tabel 2.4 Seluruh kemungkinan operator kombinasi dan padanannya

2.5. Menampilkan Data ke Layar

Untuk keperluan menampilkan data/informasi, C menyediakan sejumlah fungsi. Beberapa di

antaranya adalah berupa printf() dan putchar().

2.5.1. Fungsi printf()

x += 2; kependekan dari x = x + 2;

x -= 2; kependekan dari x = x - 2;

x *= 2; kependekan dari x = x * 2;

x /= 2; kependekan dari x = x / 2;

x %= 2; kependekan dari x = x % 2;

x <<= 2; kependekan dari x = x << 2;

x >>= 2; kependekan dari x = x >> 2;

x &= 2; kependekan dari x = x & 2;

x |= 2; kependekan dari x = x | 2;

x ^= 2; kependekan dari x = x ^ 2;

Page 19: Pemograman Bahasa C

Fungsi printf() merupakan fungsi yang paling umum digunakan dalam menampilkan data.

Berbagai jenis data dapat ditampilkan ke layar dengan memakai fungsi ini. Bentuk umum

pernyataan printf() :

printf(“string kontrol”,argumen1, argumen2,...);

String kontrol dapat berupa keterangan yang akan ditampilkan pada layar beserta penentu format

(seperti %d, %f,%c). Penentu format dipakai untuk memberi tahu kompiler mengenai jenis data yang

akan ditampilkan. Argumen sesudah string kontrol (argumen1, argumen2,...)adalah data yang akan

ditampilkan ke layar. Argumen ini dapat berupa variabel, konstanta dan bahkan ungkapan. Misal :

printf(“%d”,20); /* argumen berupa konstanta */

printf(“%d”,a); /*argumen berupa variabel */

printf(“%d”,a+20); /*argumen berupa ungkapan */

Penentu format untuk data string atau karakter :

Untuk menampilkan data bilangan, penentu format yang dipakai berupa salah satu dari

bentuk dalam Tabel 2.5.

Tabel 2.5 Penentu format pada printf()

Contoh di bawah ini akan menjelaskan perbedaan format %g, %e dan %f dalam menampilkan

bilangan real.

/*File program : form_efg.c

%c untuk menampilkan sebuah karakter%s untuk menampilkan sebuah string

%u untuk menampilkan data bilangan tak bertanda (unsigned) dalam bentuk desimal.%d untuk menampilkan bilangan integer bertanda (signed) dalam bentuk desimal%i%o untuk menampilkan bilangan bulat tak bertanda dalam bentuk oktal.%x untuk menampilkan bilangan bulat tak bertanda dalam bentuk heksadesimal%X (%x notasi yang dipakai : a, b, c, d, e dan f sedangkan %X notasi yang

dipakai : A, B, C, D, E dan F )%f untuk menampilkan bilangan real dalam notasi : dddd.dddddd%e untuk menampilkan bilangan real dalam notasi eksponensial%E%g untuk menampilkan bilangan real dalam bentuk notasi seperti %f,%E atau %F%G bergantung pada kepresisian data (digit 0 yang tak berarti tak akan ditampilkan)l merupakan awalan yang digunakan untuk %d,%u,%x,%X,%o untuk menyatakan

long int (misal %ld). Jika diterapkan bersama %e,%E,%f,%F,%g atau %G akan menyatakan double

L Merupakan awalan yang digunakan untuk %f,%e,%E,%g dan %G untuk menyatakan long double

h Merupakan awalan yang digunakan untuk %d,%i,%o,%u,%x, atau %X, untuk menyatakan short int.

Page 20: Pemograman Bahasa C

Perbedaan format %g, %e dan %f */

#include <stdio.h>

main(){

float x = 251000.0f;

printf(“Format e => %e\n”, x);printf(“Format f => %f\n”, x);printf(“Format g => %g\n”, x);

}Contoh eksekusi :

Format e => 2.510000e+005

Format f => 251000.000000Format g => 251000

Tampak bahwa penentu format %e menampilkan bilangan dalam bentuk eksponensial. Jika penentu fomat yang digunakan berupa %f, bagian pecahan secara default akan ditampilkan dalam bentuk 6 digit. Sedangkan jika digunakan penentu format %g, maka digit yang tak berarti tak akan ditampilkan.

Untuk menentukan panjang medan yang disediakan bagi tampilan data, maka sesudah tanda

% dalam penentu format dapat disisipi dengan bilangan bulat yang menyatakan panjang medan.

Untuk data yang berupa bilangan bulat, misal pada :

printf(“Abad %4d”, 20);

%4d menyatakan medan untuk menampilkan bilangan 20 adalah sepanjang 4 karakter.

printf(“Abad %4d”, 20);

Untuk data yang berupa bilangan real, spesifikasi medannya berupa

m = panjang medan

n = jumlah digit pecahan

Contoh pada pernyataan :

printf(“Harga : Rp %8.2f\n”, 500.0);

%8.2f menyatakan panjang medan dari bilangan real yang akan ditampilkan adalah 8 karakter

dengan jumlah digit pecahan 2 buah.

printf(“Harga : Rp %8.2f\n”, 500.0);

H a r g a : R p 5 0 0 . 0 0

m.n

A b a d 2 0

Page 21: Pemograman Bahasa C

Kalau hanya jumlah digit pecahan yang perlu ditentukan, panjang medan tak perlu disertakan,

misal :

printf(“%.2f\n”, 600.0);printf(“%.2f\n”, 7500.25);

hasilnya :600.007500.25

Untuk data yang berupa string, contoh :

printf(“%12s”, “Bahasa C”);

maka akan ditampilkan sebagai berikut

Tampak dalam berbagai jenis data di atas, penentu format yang mengandung panjang medan,

secara default akan menampilkan data dalam bentuk rata kanan terhadap panjang medan yang

diberikan. Untuk data string yang biasanya dikehendaki untuk ditampilkan dalam bentuk rata

kiri, maka sesudah tanda % pada penentu format %s perlu disisipkan tanda – (minus), contoh :

printf(“%-12s”, “Bahasa C”);

menyatakan bahwa string akan ditampilkan dalam medan dengan panjang 12 karakter dan diatur rata kiri. Sehingga tampilan di atas berubah menjadi :

/* File program : formatpjg.cContoh penggunaan format panjang medan data */

#include <stdio.h>

main(){

int nilai1 = 20;float nilai2 = 500.0f;

printf("Abad %5d\n", nilai1);printf("%10.2f\n", nilai2);printf("%10s\n", "Bahasa C");printf("%-10s\n", "Bahasa C");

}

Contoh eksekusi :

Abad 20 500.00 Bahasa C

B a h a s a C

B a h a s a C

Page 22: Pemograman Bahasa C

Bahasa C

_____________________________________________________________________2.5.2 Fungsi putchar()

Fungsi putchar() digunakan khusus untuk menampilkan sebuah karakter di layar.

Penampilan karakter tidak diakhiri dengan perpindahan baris.

Contoh :

putchar(‘A’);

menghasilkan keluaran yang sama dengan

printf(“%c”,’A’);

2.6. Memasukan Data dari Keyboard

Data dapat dimasukan lewat keyboard saat eksekusi berlangsung. Untuk keperluan ini, C

menyediakan sejumlah fungsi, di antaranya adalah scanf(), getchar().

2.6.1. Fungsi scanf()

Fungsi scanf() merupakan fungsi yang dapat digunakan untuk memasukkan berbagai jenis

data. Misalnya untuk memasukkan data jari-jari lingkaran pada contoh program lingkaran.c, maka

penulisan

radius = 20;dapat diganti menjadi

scanf(“%f”,&radius);Selengkapnya, terlihat dalam contoh program di bawah ini.

/* File program : lingkaran.cMenghitung keliling dan luas lingkaran */

#include <stdio.h>

main(){

double radius, keliling, luas;

printf("Masukkan jari-jari lingkaran : ");scanf("%lf",&radius);

keliling = 2 * 3.14 * radius; /* PI = 3.14 */

luas = 0.5 * 3.14 * radius * radius;

printf("\nData lingkaran\n");printf("Jari-jari = %8.2lf\n", radius);printf("Keliling = %8.2lf\n", keliling);printf("Luas = %8.2lf\n", luas);

}

Page 23: Pemograman Bahasa C

Contoh eksekusi :

Masukkan jari-jari lingkaran = 5

Data lingkaranJari-jari = 5.00Keliling = 31.40Luas = 39.25

Bentuk scanf() sesungguhnya menyerupai fungsi printf(). Fungsi ini melibatkan penentu

format yang pada dasarnya sama digunakan pada printf(). Secara umum bentuk scanf() adalah

sebagai berikut :

scanf(“string kontrol”, daftar_argumen);

Dengan string kontrol dapat berupa :

Penentu format

Karakter spasi-putih (white-space)

Karakter bukan spasi-putih

Penentu format menyatakan jenis data yang akan dibaca. Pada scanf() penentu format dapat berupa

salah satu di antara yang ada pada daftar berikut :

Tabel 2.6 Penentu format scanf()

Pada bentuk scanf(), daftar_argumen dapat berupa satu atau beberapa argumen dan haruslah

berupa alamat. Misalnya hendak membaca bilangan real dan ditempatkan ke variabel radius, maka

yang ditulis dalam scanf() adalah alamat dari radius. Untuk menyatakan alamat dari variabel, di

depan variabel dapat ditambahkan tanda & (tanda & dinamakan sebagai operator alamat). Sehingga

&radius menyatakan alamat dari radius. Dalam bentuk yang lengkap :

scanf(“%f”, &radius);

berarti (bagi komputer) : “bacalah sebuah bilangan real (%f) dan tempatkan ke alamat dari radius

(&radius)”.

%c membaca sebuah karakter%s membaca sebuah string (dibahas pada bab vii)%i atau %d membaca sebuah integer desimal%e atau %f membaca sebuah bilangan real (bisa dalam bentuk eksponensial)%o membaca sebuah integer oktal%x membaca sebuah integer heksadesimal%u membaca sebuah integer tak bertandal awalan untuk membaca data long int (misal : %ld) atau untuk

membaca data double (misal : %lf)L awalan untuk membaca data long double (misal : %Lf)h awalan untuk membaca data short int

Page 24: Pemograman Bahasa C

2.6.3 Fungsi getchar()

Fungsi getchar() digunakan khusus untuk menerima masukan berupa sebuah karakter dari

keyboard. Contoh :

c = getchar();

maka variabel c akan berisi karakter yang diketikkan oleh user atau EOF (end of file) jika ditemui

akhir dari file.

Kesimpulan :

Data merupakan suatu nilai yang bisa dinyatakan dalam bentuk konstanta atau variabel.

Konstanta menyatakan nilai yang tetap, sedangkan variabel menyatakan nilai yang dapat

diubah-ubah selama eksekusi berlangsung,

Variabel yang akan digunakan haruslah dideklarasikan terlebih dahulu, adakalanya langsung

dideklarasikan sekaligus diberi nilai (diinisialisasi).

Operator merupakan simbol atau karakter yang biasa dilibatkan dalam program untuk

melakukan sesuatu operasi atau manipulasi

Operator yang terkait dengan operasi aritmatika antara lain adalah operator aritmatika,

operator penurunan dan penaikan, operator penugasan (assignment) dan operator kombinasi

(pemendekan)

Untuk menampilkan data/informasi ke layar digunakan fungsi printf() dan putchar().

Untuk memasukkan data melalui keyboard saat eksekusi berlangsung digunakan fungsi scanf()

dan getchar().

Latihan :

1. Mengapa nama-nama variabel di bawah ini tidak valid ?

(a) value$sum(b) exit flag(c) 3lotsofmoney(d) char

2. Berapakah hasil akhir dari program berikut :

#include <stdio.h>main(){

int a = 22;

a = a + 5;a = a-2;printf("a = %d\n", a);

}

Page 25: Pemograman Bahasa C

3. Berapakah nilai x setelah pernyataan-pernyataan berikut dijalankan, apabila x bertipe int :

(a) x = (2 + 3) – 10 * 2;

(b) x = (2 + 3) – (10 * 2);

(c) x = 10 % 3 * 2 + 1;

4. Nyatakan dalam bentuk pernyataan :

(a) y = bx2 + 0,5x – c

(b) y =

5. Apa hasil eksekusi dari program berikut :

#include <stdio.h>main(){

char kar = ‘A’;

kar = kar + 32;printf("%c\n",kar);

}

BAB III

PENGAMBILAN KEPUTUSAN

3.1.1. Operator Relasi

Operator relasi biasa dipakai untuk membandingkan dua buah nilai. Hasil pembandingan

berupa keadaan benar atau salah. Keseluruhan operator relasi pada C ditunjukkan pada Tabel 3-1.

Tabel 3-1. Operasi relasi

OperatorMakna

>>=<

<===!=

Lebih dari

Lebih dari atau sama dengan

Kurang dari

Kurang dari atau sama denganSama dengan

Tidak sama dengan

Khususnya untuk operator relasi sama dengan (==) harap dibedakan dengan operator (=) yang

merupakan operator penugasan (assignment). Contoh:

Pembandingan Hasil

1 > 2 Salah

1 < 2 Benar

A == 1 Benar, jika A bernilai 1

Salah, jika A tidak bernilai 1

0,3xz 2a

Page 26: Pemograman Bahasa C

'A' < 'B' Benar, karena kode ASCII untuk karakter ‘A’

kurang dari kode ASCII untuk karakter ‘B’ *)

kar == 'Y' Benar, jika kar berisi 'Y'

Salah, jika kar tidak berisi 'Y'*) Dalam daftar ASCII standar, kode untuk karakter ‘A’ = 65 sedangkan karakter ‘B’ = 66, ‘C’ = 67,

‘D’ = 68 dan seterusnya sampai dengan karakter ‘Z’ = 90.

3.1.2. Operator Logika.

Operator logika biasa dipakai untuk menghubungkan ekspresi relasi. Keseluruhan operator

logika ditunjukkan pada tabel 3-2.

Tabel 3-2. Operator logika

Operator Makna&&

||!

dan (AND)atau (OR)

tidak (NOT)Bentuk pemakaian operator && dan || adalah

Baik operand1 maupun operand2 dapat berupa ekspresi relasi ataupun ekspresi logika. Hasil

ekspresi bias bernilai benar atau salah. Pada C nilai hasil dari sebuah ekspresi relasi atau ekspresi

logika jika dinyatakan dengan angka adalah :

Salah nilai = 0

Benar nilai != 0 (misalnya nilai = 1)

Tabel 3-3 memberikan penjelasan hasil operasi ekspresi logika yang menggunakan operator &&

maupun || untuk berbagai kemungkinan keadaan operand-nya.

Tabel 3-3. Kemungkinan pada operasi logika && dan ||

Operand1Operand2 Hasil

|| &&SalahSalahBenarBenar

SalahBenarSalahBenar

0111

0001

Tampak bahwa operator atau (||) menghasilkan nilai 1 jika ada operand yang benar. Hasil

berupa 0 jika semua operand adalah salah. Adapun operator logika dan (&&) memberikan hasil 1

hanya jika kedua operand adalah benar.

Beberapa contoh ekspresi logika di antaranya :

(kar > 'A') && (kar < 'Z')

Hasil operasi logika && adalah benar hanya jika kar > 'A' dan kar < 'Z' (dalam hal ini yang

diperbandingkan adalah kode ASCII dari karakter tsb).

(pilihan == 'Y') || (pilihan == 'y')

Hasil operasi logika || adalah benar jika pilihan berupa 'Y' atau 'y'

operand1 operator operand2

Page 27: Pemograman Bahasa C

Sedangkan bentuk pemakaian operator logika ! adalah :

dengan operand dapat berupa ekspresi logika ataupun ekspresi relasi.

Hasil operasi ! bernilai :

1 jika operand bernilai salah

0 jika operand bernilai benar

Perhatikan contoh potongan program di bawah ini :

if (!sudah_benar)printf(“Masukan Anda salah!\n”);

Pada contoh potongan program di atas, dilakukan pengecekan kondisi terhadap nilai dari variabel

sudah_benar. Jika variabel sudah_benar bernilai 0, maka kondisi !sudah_benar akan bernilai

benar (true) sehingga instruksi :

printf(“Masukan Anda salah!\n”);

akan diproses. Penjelasan lebih rinci tentang pengecekan kondisi dengan pernyataan if dibahas pada

sub bab 3.2.

3.1.3 Prioritas Operator Logika dan Relasi

Tabel berikut ini memberikan penjelasan singkat mengenai prioritas di antara berbagai

operator logika dan operator relasi.

Tabel 3-4 Prioritas operator logika dan relasi

Berdasarkan prioritas yang ditunjukkan pada tabel 3-4, maka ekspresi seperti

(kar > 'A') && (kar < 'Z')

sama saja kalau ditulis menjadi

kar > 'A' && kar < 'Z'

Hanya saja penulisan dengan menggunakan tanda kurung akan lebih memberikan kejelasan.

3.2 Pernyataan if

Pernyataan if mempunyai bentuk umum :

Bentuk ini menyatakan :

if (kondisi ) pernyataan;

Tertinggi : !> >= < <== = !=&&

Terendah: ||

Page 28: Pemograman Bahasa C

jika kondisi yang diseleksi adalah benar (bernilai logika = 1), maka pernyataan yang

mengikutinya akan diproses.

Sebaliknya, jika kondisi yang diseleksi adalah tidak benar (bernilai logika = 0), maka pernyataan

yang mengikutinya tidak akan diproses.

Mengenai kodisi harus ditulis diantara tanda kurung, sedangkan pernyataan dapat berupa sebuah

pernyataan tunggal, pernyataan majemuk atau pernyataan kosong. Diagram alir dapat dilihat seperti

gambar 3.1

Gambar 3.1. Diagram alir if

Contoh penggunaan pernyataan if adalah untuk menentukan besarnya potongan harga yang

diterima oleh seorang pembeli, berdasarkan kriteria :

tidak ada potongan harga jika total pembelian kurang dari Rp. 100.000 (dalam hal ini potongan

harga diinisialisasi dengan nol).

bila total pembelian lebih dari atau sama dengan Rp. 100.000, potongan harga yang diterima

dirubah menjadi sebesar 5% dari total pembelian.

/* File program : discount.cContoh penggunaan if untuk menghitung nilai discount */

#include <stdio.h>

main(){

double total_pembelian, discount = 0;/* discount diinisialisasi dengan nilai 0 */

printf("Total pembelian = Rp “);scanf("%lf", &total_pembelian);

if(total_pembelian >= 100.000) discount = 0.05 * total_pembelian;

printf("Besarnya discount = Rp %.2lf\n", discount);}

kondisi

pernyataan

salah

benar

Page 29: Pemograman Bahasa C

Contoh eksekusi :

Total pembelian = Rp 200000Besarnya discount = Rp 10000.00

Untuk pernyataan if yang diikuti dengan pernyataan majemuk, bentuknya adalah sebagai

berikut :

if (kondisi)

{ /* tanda awal pernyataan majemuk*/

pernyataan-1;

pernyataan–2;

.

.

.

pernyataan-n;

} /* tanda akhir pernyataan majemuk */

Pernyataan-pernyataan yang berada dalam tanda kurung { dan } akan dijalankan hanya bila kondisi if

bernilai benar.

3.3. Pernyataan if-else

Pernyataan if-else memiliki bentuk :

Diagram alir dapat dilihat seperti gambar 3.2.

Gambar 3.2. Diagram alir if-else

Arti dari pernyataan if-else :

Jika kondisi benar, maka pernyataan-1 dijalankan.

Sedangkan bila kondisi bernilai salah, maka pernyataaan-2 yang dijalankan.

if (kondisi) pernyataan-1;else pernyataan-2;

kondisi

pernyataan-1

salah

benar

pernyataan-2

Page 30: Pemograman Bahasa C

Masing-masing pernyataan-1 dan pernyataan-2 dapat berupa sebuah pernyataan tunggal,

pernyataan majemuk ataupun pernyataan kosong.

Contoh penggunaan pernyataan if-else adalah untuk menyeleksi nilai suatu bilangan pembagi.

Jika nilai bilangan pembagi adalah nol, maka hasil pembagian dengan nilai nol akan mendapatkan

hasil tak berhingga. Jika ditemui nilai pembaginya nol, maka proses pembagian tidak akan

dilakukan.

/* File program : bagi.cPemakaian if-else untuk menyeleksi bilangan pembagi */

#include <stdio.h>

main(){

float a, b;

printf("Masukkan nilai a : ");scanf("%f", &a);printf("Masukkan nilai b : ");scanf("%f", &b);

if (b == 0)printf("\n%g dibagi dengan nol = TAK BERHINGGA\n", a);

elseprintf("\n%g dibagi dengan %g = %g\n", a, b, a/b);

}Contoh eksekusi :

Masukkan nilai a : 5Masukkan nilai b : 05 dibagi dengan nol = TAK BERHINGGA3.4. Pernyataan if di dalam if

Di dalam suatu pernyataan if (atau if-else) bisa saja terdapat pernyataan if (atau if-else) yang

lain. Bentuk seperti ini dinamakan sebagai nested if. Secara umum, bentuk dari pernyataan ini

adalah sebagai berikut :

if (kondisi-1)if (kondisi-2)..

if(kondisi-n)pernyataan;

elsepernyataan;..

elsepernyataan;

elsepernyataan;

Page 31: Pemograman Bahasa C

Kondisi yang akan diseleksi pertama kali adalah kondisi yang terluar (kondisi-1). Jika kondisi-1

bernilai salah, maka statemen else yang terluar (pasangan if yang bersangkutan) yang akan

diproses. Jika else (pasangannya tsb) tidak ditulis, maka penyeleksian kondisi akan dihentikan.

Jika kondisi-1 bernilai benar, maka kondisi berikutnya yang lebih dalam (kondisi-2) akan

diseleksi. Jika kondisi-2 bernilai salah, maka statemen else pasangan dari if yang bersangkutan

yang akan diproses. Jika else (untuk kondisi-2) tidak ditulis, maka penyeleksian kondisi akan

dihentikan.

Dengan cara yang sama, penyeleksian kondisi akan dilakukan sampai dengan kondisi-n, jika

kondisi-kondisi sebelumnya bernilai benar.

/* File program : determinan1.cProgram untuk menghitung determinan dan akar-akar persamaan kuadrat menggunakan if bersarang */

#include <stdio.h>#include <math.h>

main(){ float a, b, c, d = 0;

double x1, x2, imaginair;

printf("MENCARI AKAR-AKAR PERSAMAAN KUADRAT a+bx+c=0\n");printf("\nMasukkan nilai a : ");scanf("%f", &a);printf("Masukkan nilai b : ");scanf("%f", &b);printf("Masukkan nilai c : ");scanf("%f", &c);

d = b*b-4*a*c; /* menghitung determinan */

if (d >= 0)if (d == 0){

x1 = -b / (2 * a);printf("\nDua akar real kembar yaitu : \n");printf("x1 = x2 = %g\n", x1);

}else{

x1 = (-b + sqrt(d))/(2*a);x2 = (-b - sqrt(d))/(2*a);printf("\nDua akar real berlainan yaitu :\n");printf("x1 = %g\n", x1);printf("x2 = %g\n", x2);

}else{

imaginair = (sqrt(-d)/(2*a));x1 = -b/(2*a);

Page 32: Pemograman Bahasa C

printf("\nDua akar imaginair berlainan yaitu : \n");printf("x1 = %g + %gi\n", x1, imaginair);printf("x2 = %g - %gi\n", x1, imaginair);

}}Contoh eksekusi :MENCARI AKAR-AKAR PERSAMAAN KUADRAT a+bx+c=0Masukkan nilai a : 3Masukkan nilai b : 6Masukkan nilai c : 2Dua akar real berlainan yaitu :X1 = -0.42265X2 = -1.577353.5 Pernyataan else-if

Contoh implementasi nested if ini misalnya pembuatan sebuah program kalkulator sederhana.

User memberikan masukan dengan format :

Jenis operasi yang dikenakan bergantung pada jenis operator ang dimasukkan oleh user. Oleh

karena itu program akan mengecek apakah operator berupa tanda ‘*’, ‘/’, ‘+’, ataukah tanda ‘-‘ .

Jika operator berupa tanda ‘*’ maka operand1 akan dikalikan dengan operand2.

Jika operator berupa tanda ‘/’ maka operand1 akan dibagi dengan operand2.

Jika operator berupa tanda ‘+’ maka operand1 akan dijumlahkan dengan operand2.

Jika operator berupa tanda ‘-’ maka operand1 akan dikurangi dengan operand2.

Kalau operator yang dimasukkan bukan merupakan salah satu dari jenis operator di atas, maka

ekspresi tersebut tidak akan diproses, dan user akan mendapatkan pesan berupa : “Invalid

operator !”

/* File program : kalkulator1.c Contoh penggunaan else if untuk mengimplementasikan program kalkulator sederhana */#include <stdio.h>

main(){

int valid_operator = 1; /* valid_operator diinisialisasi dengan logika 1 */char operator;float number1, number2, result;

printf("Masukkan 2 buah bilangan dan sebuah operator\n");printf("dengan format : number1 operator number2\n\n");scanf("%f %c %f", &number1, &operator, &number2);

if(operator == '*')result = number1 * number2;

else if(operator == '/')result = number1 / number2;

else if(operator == '+')

operand1 operator operand2

Page 33: Pemograman Bahasa C

result = number1 + number2;else if(operator == '-')

result = number1 - number2;else

valid_operator = 0;

if(valid_operator)printf("\n%g %c %g is %g\n", number1, operator, number2, result );

elseprintf("Invalid operator!\n");

}

Contoh eksekusi :

Masukkan 2 buah bilangan dan sebuah operatordengan format : number1 operator number2

23.2 + 1223.2 + 12 is 35.23.6 Pernyataan switch

Pernyataan switch merupakan pernyataan yang dirancang khusus untuk menangani pengambilan

keputusan yang melibatkan sejumlah alternatif, misalnya untuk menggantikan pernyataan if

bertingkat. Bentuk umum pernyataan switch adalah :

Dengan ekspresi dapat berupa ekspresi bertipe integer atau bertipe karakter. Demikian juga

konstanta-1, konstanta-2, …, konstanta-n dapat berupa konstanta integer atau karakter. Setiap

pernyataan-i (pernyataan-1, … , pernyataan-n) dapat berupa pernyataan tunggal ataupun pernyataan

jamak. Dalam hal ini urutan penulisan pernyataan case tidak berpengaruh. Proses penyeleksian

berlangsung sebagai berikut :

switch (ekspresi) {

case konstanta-1:pernyataan-1;......break;

case konstanta-2:...

case konstanta-n:pernyataan-n;.......break;

default:..............break;

}

Page 34: Pemograman Bahasa C

pengujian pada switch akan dimulai dari konstanta-1. Kalau nilai konstanta-1 cocok dengan

ekspresi maka pernyataan-1 dijalankan. Kata kunci break harus disertakan di bagian akhir

setiap pernyataan case, yang akan mengarahkan eksekusi ke akhir switch.

Kalau ternyata pernyataan-1 tidak sama dengan nilai ekspresi, pengujian dilanjutkan pada

konstanta-2, dan berikutnya serupa dengan pengujian pada konstanta-1.

Jika sampai pada pengujian case yang terakhir ternyata tidak ada kecocokan, maka pernyataan

yang mengikuti kata kunci default yang akan dieksekusi. Kata kunci default ini bersifat opsional.

Tanda kurung kurawal tutup (}) menandakan akhir dari proses penyeleksian kondisi case.

Di bawah ini contoh program pemakaian pernyataan switch untuk menggantikan if-else bertingkat

pada program kalkulator1.c di atas.

/* File program : kalkulator2.cContoh penggunaan pernyataan switch untuk mengimplementasikan kalkulator sederhana */

#include <stdio.h>

main(){

int valid_operator = 1;char operator;float number1, number2, result;

printf("Masukkan 2 buah bilangan dan sebuah operator\n");printf("dengan format : number1 operator number2\n\n");scanf("%f %c %f", &number1, &operator, &number2);

switch(operator) {case '*' : result = number1 * number2; break;case '/' : result = number1 / number2; break;case '+' : result = number1 + number2; break;case '-' : result = number1 - number2; break;default : valid_operator = 0;}

if(valid_operator)printf("%g %c %g is %g\n", number1, operator, number2,result);

elseprintf("Invalid operator!\n");

}

Contoh eksekusi :Masukkan 2 buah bilangan dan sebuah operatorDengan format : number1 operator number2

23.2 = 12invalid operator !

Page 35: Pemograman Bahasa C

Kesimpulan :

Operator kondisi adalah operator yang digunakan untuk menghasilkan kondisi benar (true) dan

salah (false), yang terdiri atas operator relasi dan operator logika.

Operator relasi biasa dipakai untuk membandingkan dua buah nilai.

Operator logika biasa dipakai untuk menghubungkan ekspresi relasi.

Untuk penyeleksian kondisi dalam rangka pengambilan keputusan bisa digunakan salah satu dari

pernyataan berikut ini :

a. Pernyataan if, bentuk umumnya :

b. Pernyataan if-else, bentuk umumnya :

c. Pernyataan if di dalam if, bentuk umumnya :

d. Pernyataan else-if, bentuk umumnya :

if (kondisi ) pernyataan;

if (kondisi) pernyataan-1;else pernyataan-2;

if (kondisi-1)if (kondisi-2)..

if(kondisi-n)pernyataan;

elsepernyataan;..

elsepernyataan;

elsepernyataan;

if (kondisi-1)pernyataan-1;

else if (kondisi-2)pernyataan-2;

.

.else if(kondisi-n)

pernyataan-n;else

pernyataan-(n+1);

Page 36: Pemograman Bahasa C

e. Pernyataan switch, bentuk umumnya :

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Gunakan statemen if untuk membandingkan nilai dari sebuah variabel integer (sum) dengan

nilai 65. Jika lebih kecil, maka tampilkan pesan : “Maaf, Anda harus mencoba lagi!”.

2. Jika variabel total sama dengan variabel tebak, cetaklah nilai dari total, jika tidak sama,

maka cetaklah nilai dari tebak.

3. Jika variabel sum sama dengan 10 dan variabel total kurang dari 20, maka tampilkan pesan :

“Tidak sesuai!”

4. Jika variabel flag sama dengan 1 atau variabel letter bukan ‘X’, maka assign nilai 0 kepada

variabel exit_flag, jika tidak, maka set exit_flag sama dengan 1.

5. Tulislah kembali pernyataan-pernyataan di bawah ini dengan menggunakan pernyataan

switch

if( letter == 'X' )sum = 0;

else if ( letter == 'Z' )valid_flag = 1;

else if( letter == 'A' )sum = 1;

elseprintf("Unknown letter -->%c\n", letter );

switch (ekspresi) {

case konstanta-1:pernyataan-1;......break;

case konstanta-2:...

case konstanta-n:pernyataan-n;.......break;

default:..............break;

}

Page 37: Pemograman Bahasa C

BAB IVPENGULANGAN PROSES

Tujuan :

6. Menjelaskan proses pengulangan menggunakan pernyataan for

7. Menjelaskan proses pengulangan menggunakan pernyataan while

8. Menjelaskan proses pengulangan menggunakan pernyataan do-while

9. Menjelaskan penggunaan pernyataan break

10. Menjelaskan penggunaan pernyataan continue

11. Menjelaskan penggunaan pernyataan goto

12. Menjelaskan loop di dalam loop (nested loop) dan contoh kasusnya

13. Menjelaskan penggunaan exit() untuk menghentikan eksekusi program dan contoh kasusnya

4.1 Pernyataan for

Mengulang suatu proses merupakan tindakan yang banyak dijumpai dalam pemrograman.

Pada semua bahasa pemrograman, pengulangan proses ditangani dengan suatu mekanisme yang

disebut loop. Dengan menggunakan loop, suatu proses yang berulang misalnya menampilkan tulisan

yang sama seratus kali pada layar dapat diimpelementasikan dengan kode program yang pendek.

Pernyataan pertama yang digunakan untuk keperluan pengulangan proses adalah pernyataan

for. Bentuk pernyataan ini :

Kegunaan dari masing-masing ungkapan pada pernyataan for.

Ungkapan1 : digunakan untuk memberikan inisialisasi terhadap variabel pengendali loop.

Ungkapan2 : dipakai sebagai kondisi untuk keluar dari loop.

Ungkapan3 : dipakai sebagai pengatur kenaikan nilai variabel pengendali loop.

Ketiga ungkapan dalam for tersebut harus dipisahkan dengan tanda titik koma (;). Dalam hal ini

pernyatan bisa berupa pernyataan tunggal maupun jamak. Jika pernyataannya berbentuk jamak,

maka pernyataan-pernyataan tersebut harus diletakkan di antara kurung kurawal buka ({) dan kurung

kurawal tutup (}), sehingga formatnya menjadi :

for (ungkapan1; ungkapan2; ungkapan3) pernyataan;

for (ungkapan1; ungkapan2; ungkapan3) {

pernyataan;pernyataan;...

}

Page 38: Pemograman Bahasa C

Contoh penggunaan for, misalnya untuk menampilkan deretan angka sebagai berikut :

20

30

40

50

.

.

.

100

Untuk keperluan ini, pernyataan for yang digunakan berupa :

for (bilangan = 20; bilangan <= 100; bilangan += 10)printf("%d\n", bilangan);

Kalau digambarkan dalam bentuk diagram alir, akan terlihat sbb :

Gambar 4.1. Diagram alir for

bilangan = 20

bilangan <=100

Cetak bilangan

bilangan = bilangan + 10

salah

Keluar loop

benar

Page 39: Pemograman Bahasa C

/* File program : for1.cContoh pemakaian for untuk membentuk deret naik */

#include <stdio.h>

main(){

int bilangan;

for(bilangan = 20; bilangan <= 100; bilangan += 10)printf("%d\n", bilangan);

}

Contoh eksekusi :

2030405060708090100Pada program di atas, kenaikan terhadap variabel pengendali loop sebesar 10 (positif), yang

dinyatakan dengan ungkapan

bilangan += 10

yang sama artinya dengan

bilangan = bilangan + 10

Pada contoh yang melibatkan pernyataan for di atas, kenaikan variabel pengendali loop

berupa nilai positif. Sebenarnya kenaikan terhadap variabel pengendali loop bisa diatur bernilai

negatif. Cara ini dapat digunakan untuk memperoleh deret sebagai berikut :

605040302010Untuk itu selengkapnya program yang dibutuhkan adalah sebagai berikut :

/* File program : for2.c Contoh pemakaian for untuk membentuk deret turun */

#include <stdio.h>

Page 40: Pemograman Bahasa C

main(){

int bilangan;

for (bilangan = 60; bilangan >= 10; bilangan -= 10)printf("%d\n", bilangan);

}Contoh eksekusi :605040302010

Kadang-kadang dijumpai adanya pernyataan for yang tidak mengandung bagian ungkapan

yang lengkap (beberapa ungkapan dikosongkan). Dengan cara ini, pernyataan

for (bilangan = 20; bilangan <= 100; bilangan += 10) printf(“%d\n”, bilangan);dapat ditulis menjadi :

bilangan = 20; /* inisialisasi di luar for */for ( ; bilangan <= 100; )

ungkapan kosong

{printf(“%d\n”, bilangan);bilangan += 10;

}

Tampak bahwa ungkapan yang biasa dipakai untuk inisialisasi variabel pengendali loop tak ada.

Sebagai gantinya pengendalian loop diatur sebelum pernyataan for, berupa

bilangan = 20;Pengosongan ini juga dilakukan pada ungkapan yang biasa dipakai untuk menaikkan nilai variabel

pengendali loop. Sebagai gantinya, di dalam tubuh loop diberikan pernyataan untuk menaikkan nilai

variabel pengendali loop, yaitu berupa

bilangan += 10;Ungkapan yang tidak dihilangkan berupa bilangan <=100. Ungkapan ini tetap disertakan karena

dipakai sebagai kondisi untuk keluar dari loop.

Sesungguhnya ungkapan yang dipakai sebagai kondisi keluar dari loop juga bisa dihilangkan,

sehingga bentuknya menjadi

for (;;)

pernyataan Suatu pertanyaan mungkin timbul “Lalu bagaimana caranya kalau ingin keluar dari loop pada bentuk

di atas?”. Caranya adalah dengan menggunakan pernyataan yang dirancang khusus untuk keluar dari

loop. Mengenai hal ini akan dibahas pada sub bab yang lain.

Page 41: Pemograman Bahasa C

4.2 Pernyataan while

Pada pernyataan while, pengecekan terhadap loop dilakukan di bagian awal (sebelum tubuh

loop). Lebih jelasnya, bentuk pernyataan while adalah sebagai berikut :

dengan pernyataan dapat berupa pernyataan tunggal, pernyataan majemuk ataupun pernyataan

kosong. Proses pengulangan terhadap pernyataan dijelaskan pada gambar berikut :

Gambar 4.2. Diagram alir while

Dengan melihat gambar 4.2, tampak bahwa ada kemungkinan pernyataan yang merupakan tubuh

loop tidak dijalankan sama sekali, yaitu kalau hasil pengujian kondisi while yang pertama kali

ternyata bernilai salah.

Contoh pemakaian while misalnya untuk mengatur agar tombol yang ditekan oleh pemakai

program berupa salah satu diantara 'Y','y', 'T' atau 't'. Impelementasinya :

/*File program : pilihan.cUntuk membaca tombol Y atau T */#include <stdio.h>main(){

char pilihan;/* diberi nilai salah lebih dahulu */int sudah_benar = 0;

printf("Pilihlah Y atau T.\n");

/* program dilanjutkan jika tombol Y,y,T atau t ditekan */

while (kondisi)

pernyataan;

pernyataan

kondisi

benar

salah

keluar loop

Page 42: Pemograman Bahasa C

while(!sudah_benar){

pilihan = getchar(); /* baca tombol */sudah_benar = (pilihan == 'Y') || (pilihan == 'y')||

(pilihan == 'T') || (pilihan == 't');}

/* memberi keterangan tentang pilihan */switch(pilihan){case 'Y':case 'y':

puts("\nPilihan anda adalah Y");break;

case 'T':case 't':

puts("\nPilihan anda adalah T");}

}

Contoh eksekusi :Pilihlah Y atau TPilihan anda adalah YInisialisasi terhadap variabel sudah_benar yang akan dijalankan pada kondisi while dengan memberi

nilai awal bernilai false (sudah_benar = 0) dimaksudkan agar tubuh loop

{pilihan = getchar( ); /* baca tombol */sudah_benar = (pilihan == 'Y') || (pilihan== 'y')||

(pilihan == 'T') || (pilihan == 't');}

dijalankan minimal sekali.

Contoh lain pemakaian while dapat dilihat pada program yang digunakan untuk menghitung

banyaknya karakter dari kalimat yang dimasukkan melalui keyboard (termasuk karakter spasi).

Untuk mengakhiri pemasukan kalimat, tombol ENTER (‘\n’) harus ditekan. Karena itu, tombol

ENTER inilah yang dijadikan kondisi penghitungan jumlah spasi maupun karakter seluruhnya.

Lengkapnya, kondisi yang dipakai dalam while berupa :

while((kar = getchar()) != '\n') Ungkapan di atas mempunyai arti :

Bacalah sebuah karakter dan berikan ke variabel kar

Kemudian bandingkan apakah karakter tersebut = ‘\n’ (ENTER)

Ungkapan menghasilkan nilai benar jika tombol yang ditekan bukan ENTER. Pada program kalau

tombol yang ditekan bukan ENTER , maka :

Jumlah karakter dinaikkan sebesar satu melalui pernyataan : jumkar++;

Kalau karakter berupa SPASI, maka jumlah spasi dinaikkan sebesar satu, melalui

pernyataan : if (kar == ‘ ‘) jumspasi++;

Page 43: Pemograman Bahasa C

/* File program : jumkar.cMenghitung jumlah kata dan karakter dalam suatu kalimat */

#include <stdio.h>

main(){

char kar;int jumkar = 0, jumspasi = 0;

puts("Masukkan sebuah kalimat dan akhiri dgn ENTER.\n");puts("Saya akan menghitung jumlah karakter ");puts("pada kalimat tersebut.\n");

while((kar = getchar()) != '\n'){

jumkar++;if (kar == ' ') jumspasi++;

}

printf("\nJumlah karakter = %d", jumkar);printf("\nJumlah SPASI = %d\n\n", jumspasi);

}Contoh eksekusi :

Masukkan sebuah kalimat, akhiri dgn ENTER.Saya akan menghitung jumlah karakter pada kalimat tersebut.Belajar bahasa C sangat menyenangkanJumlah karakter = 36Jumlah SPASI = 44.3 Pernyataan do-while

Bentuk pernyataan do-while

Pada pernyataan do-while, tubuh loop berupa pernyataan,dengan pernyataan bisa berupa

pernyataan tunggal, pernyataan majemuk ataupun pernyataan kosong. Pada pernyataan do, mula-

mula pernyataan dijalankan. Selanjutnya, kondisi diuji. Sendainya kondisi bernilai benar, maka

pernyataan dijalankan lagi, kemudian kondisi diperiksa kembali, dan seterusnya. Kalau kondisi

bernilai salah pada saat dites, maka pernyataan tidak dijalankan lagi. Untuk lebih jelasnya dapat

dilihat pada Gambar 4.3. Berdasarkan Gambar 4.3 terlihat bahwa tubuh loop minimal akan

dijalankan sekali.

do

pernyataan;

while (kondisi)

Page 44: Pemograman Bahasa C

Gambar 4.3. Diagram alir do-while

Program berikut memberikan contoh pemakaian do-while untuk mengatur penampilan tulisan

"BAHASA C" sebanyak sepuluh kali.

Contoh:

i = 0;do {

puts("BAHASA C");i++;

} while(i<10);Pada program di atas, variabel pencacah dipakai untuk menghitung jumlah tulisan yang sudah

ditampilkan pada layar. Selama nilai pencacah kurang dari 10, maka perintah

puts("BAHASA C");

akan dilaksanakan kembali

Penanganan pembacaan tombol pada contoh program pilihan.c yang memakai while di atas,

kalau diimplementasikan dengan memakai do-while adalah sebagai berikut

/* File program : pilihan2.cUntuk membaca tombol Y atau T */

#include <stdio.h>

main(){

char pilihan;int sudah_benar;

pernyataan

kondisi

Tubuh loop

benar

salah

keluar loop

Page 45: Pemograman Bahasa C

printf("Pilihlah Y atau T.\n");

/* program dilanjutkan kalau tombol Y,y,T atau t ditekan */do {

pilihan = getchar( ); /* baca tombol */sudah_benar = (pilihan == 'Y') || (pilihan== 'y')||

(pilihan == 'T') || (pilihan == 't');} while(! sudah_benar);

/* memberi keterangan tentang pilihan */switch(pilihan){case 'Y':case 'y':

puts("\nPilihan anda adalah Y");break;

case 'T':case 't':

puts("\nPilihan anda adalah T");}

}

Contoh eksekusi :

Pilihlah Y atau TPilihan anda adalah T

Mula-mula tombol dibaca dengan menggunakan getchar() dan kemudian diberikan ke variabel

pilihan. Sesudah itu, variabel sudah_benar akan diisi dengan nilai benar (1) atau salah (0)

tergantung dari nilai pilihan. Kalau pilihan berisi salah satu diantara ‘Y’,‘y’, ‘T’ atau ‘t’, maka sudah

berisi salah satu diantara ‘Y’, ‘y’, ‘T’ atau ‘t’, maka sudah_benar akan berisi benar. Nilai pada

vaiabel sudah_benar ini selanjutnya dijadikan sebagai kondisi do-while. Pengulangan terhadap

pembacaan tombol akan dilakukan kembali selama sudah_benar benilai salah.

4.4 Pernyataan break.

Pernyataan break sesungguhnya telah diperkenalkan pada pernyataan switch. Pernyataan ini

berfungsi untuk keluar dari loop for, do-while dan while. Sedangkan pada switch yaitu untuk menuju

ke akhir (keluar dari) struktur switch. Sebagai contoh dapat dilihat pada gambar 4.4. Kalau

pernyataan break dijalankan maka eksekusi akan dilanjutkan ke pernyataan yang terletak sesudah

akhir tubuh loop for.

Page 46: Pemograman Bahasa C

Gambar 4.4 Ilustrasi pengaruh break

Pada contoh potongan program berikut, pembacaan dan penampilan terhadap tombol yang

ditekan akan berakhir kalau tombol yang ditekan adalah ENTER (‘\n’). Pernyataan yang digunakan

untuk keperluan ini :

if (kar == ‘\n’)

break; /* keluar dari loop for */

Yang menyatakan “Jika tombol yang ditekan berupa ENTER, maka keluarlah dari loop for”. Untuk

lebih jelasnya, perhatikan program di bawah ini.

/* File program : tamat.cPemakaian break untuk keluar dari looping */

#include <stdio.h>

main(){

char kar;

printf("Ketik sembarang kalimat");printf(" dan akhiri dengan ENTER\n\n");

for ( ; ; ){

kar = getchar(); if(kar == '\n')

break;}printf("Selesai\n");

}

Contoh eksekusi :

Ketik sembarang kalimat dan akhiri dengan ENTER :Menulis apa saja

for ( ; ; ){

. .

if ( …… ) break;

. .

} /* akhir tubuh loop for */

puts(“\nSelesai…”);

Page 47: Pemograman Bahasa C

SelesaiJika pernyataan break berada dalam loop yang bertingkat (nested loop), maka pernyataan break

hanya akan membuat proses keluar dari loop yang bersangkutan (tempat break dituliskan), bukan

keluar dari semua loop.

4.5 Pernyataan Continue

Pernyataan continue digunakan untuk mengarahkan eksekusi ke iterasi (proses) berikutnya

pada loop yang sama. Pada do-while dan while, pernyataan continue menyebabkan eksekusi menuju

ke kondisi pengujian pengulangan, seperti yang dilukiskan pada Gambar 4.5. Pada loop for,

pernyataan contunue menyebabkan bagian penaik variabel pengendali loop dikerjakan (ungkapan3

pada struktur for) dan kondisi untuk keluar dari loop for (ungkapan2 pada struktur for) diuji kembali.

Program ini digunakan untuk memasukkan data harus diulangi dan hal ini dikendalikan

dengan continue. Untuk mengakhiri pemasukan data, data yang dimasukkan harus bernilai kurang

dari 0. Perlu diketahui kondisi bernilai 1.

while (kondisi) do{ { continue; continue;} } while (kondisi)

Gambar 4.5 Pengaruh continue pada while dan do-while

Menyatakan bahwa kondisi selalu dianggap benar. Untuk keluar dari loop, pernyataan yang

digunakan berupa break.

Pengaruh continue pada loop for diperlihatkan pada dibawah ini. Program ini dipakai untuk

menampilkan bilangan ganjil yang terletak antara 7 sampai dengan 25, kecuali 15.

/* File program : ganjil.cmenampilkan bilangan ganjil antara 7 - 25 kecuali 15 */

#include <stdio.h>

main(){

int x;

for (x = 7; x <= 25; x += 2){

if (x == 15)continue;

printf("%4d", x);}printf("\n");

}

Page 48: Pemograman Bahasa C

Contoh eksekusi :

7 9 11 13 17 19 21 23 25Pada program di atas, untuk menghindari agar nilai 15 tidak ditampilkan ke layar, pernyataan yang

digunakan berupa

if ( x == 15) continue;

Artinya, jika kondisi x == 15 bernilai benar, pernyataan continue menyebabkan pernyataan sisanya

yaitu

printf(“%d”,x);

diabaikan dan eksekusi diarahkan kepada ungkapan :

x += 2 dan kemudian menguji kondisi :

x <= 25Pada program di atas, pernyataan :

for (x = 7; x <= 25; x += 2){

if (x == 15)continue;

printf("%4d", x);}

dapat ditulis dalam bentuk lain sebagai berikut :

for (x = 7; x <= 25; x += 2)if (x != 15)

printf(“%4d”, x);

4.6 Loop Di Dalam Loop

Dalam suatu loop bisa terkandung loop yang lain. Loop yang terletak di dalam loop biasa

disebut dengan loop di dalam loop (nested loop). Salah satu contoh nested loop misalnya pada

permasalahan untuk membuat tabel perkalian:

1 2 3 4 5 6 7 8

1 1 2 3 4 5 6 7 8

2 2 4 6 8 10 12 14 16

3 3 6 9 12 15 18 21 24

4 4 8 12 16 20 24 28 32

5 5 10 15 20 25 30 35 40

6 6 12 18 24 30 36 42 48

7 7 14 21 28 35 42 49 56

8 8 16 24 32 40 48 56 64

Implementasi dalam program selengkapnya adalah sebagai berikut :

Page 49: Pemograman Bahasa C

/* File program : tblkali.c Loop for bersarang untuk membuat tabel perkalian */

#include <stdio.h>

#define MAKS 8

main(){

int baris, kolom, hasil_kali;

for (baris = 1; baris <= MAKS; baris++){

for (kolom = 1; kolom <= MAKS; kolom++){

hasil_kali = baris * kolom;printf ("%2d", hasil_kali);

}printf("\n"); /* pindah baris */

}}

Bagian yang terletak dalam bingkai di depan dapat dapat diperoleh melalui

for (baris = 1; baris <= MAKS; baris++){ hasil_kali = baris * kolom; printf (“%2d”, hasil_kali);}

dengan MAKS didefinisikan bernilai 8. Bagian loop yang terdalam :

for (kolom = 1; kolom <= MAKS; kolom++){ hasil_kali = baris * kolom; printf (“%2d”, hasil_kali);}

digunakan untuk mencetak suatu deret hasil perkalian dalam satu baris. Untuk berpindah ke baris

berikutnya, pernyataan yang digunakan yaitu

printf(“\n”);Adapun pencetakan untuk semua baris dikendalikan melalui

for (baris = 1; baris <= MAKS; baris++)

Pernyataan di atas mempunyai arti “dari baris ke-1 sampai dengan baris ke-MAKS”.

Page 50: Pemograman Bahasa C

4.7 Pernyataan goto

Pernyataan goto merupakan intruksi untuk mengarahkan eksekusi ke pernyataan yang diawali

dengan suatu label. Label sendiri berupa suatu pengenal (identifier) yang diikuti dengan tanda titik

dua (:)

Contoh pemakaian goto ditujukan pada program dibawah ini:

Pernyataan

goto cetak;

Mengisyaratkan agar eksekusi dilanjutkan ke pernyataan yang diawali dengan label

cetak:

Pernyataan

if (++pencacah <= 10)goto cetak;

Mempunyai arti :

Naikkan nilai pencacah sebesar 1

Kemudian, jika pencacah kurang dari atau sama dengan 10 maka eksekusi menuju ke label cetak.

Penerapan goto biasanya dilakukan pada loop di dalam loop (nested loop), dengan tujuan

memudahkan untuk keluar dari loop terdalam menuju ke pernyataan yang terletak di luar loop

terluar.

4.8. Menggunakan exit ( ) Untuk Menghentikan Eksekusi Program.

Suatu eksekusi program dapat dihentikan (secara normal) melalui pemanggilan fungsi exit( ).

Hal ini biasa dilakukan, jika di dalam suatu eksekusi terdapat suatu kondisi yang tak dikehendaki.

Prototipe dari fungsi exit() didefinisikan pada file stdlib.h, yang memiliki deklarasi sebagai berikut :

void exit(int status);

Menurut kebiasaan, nilai nol diberikan pada argumen exit() untuk menunjukkan penghentian

program yang normal. Sedangkan untuk menunjukkan kesalahan, nilai yang diberikan pada argumen

fungsi diisi dengan nilai bukan-nol. Pada contoh program berikut, eksekusi program akan dihentikan

hanya jika tombol ‘X’ ditekan

/* File program : keluar.cPemakaian exit() untuk menghentikan eksekusi program */

#include <stdio.h>#include <stdlib.h>

main(){

char kar;

Page 51: Pemograman Bahasa C

printf("Tekanlah X untuk menghentikan program.\n");

for ( ; ;){

while ((kar = getchar()) == 'X')exit(0);

}}Kesimpulan :

Pada semua bahasa pemrograman, pengulangan proses ditangani dengan suatu mekanisme

yang disebut loop.

Pernyataan-pernyataan yang bisa digunaan untuk keperluan pengulangan proses (looping)

adalah :

(a) Pernyataan for, dengan bentuk umum sebagai berikut:

Jika pernyataannya berbentuk jamak, maka pernyataan-pernyataan tersebut harus diletakkan di

antara kurung kurawal buka ({) dan kurung kurawal tutup (})

(b) Pernyataan while, dengan bentuk umum sebagai berikut:

(c) Pernyataan do-while, dengan bentuk umum sebagai berikut :

Pernyataan break berfungsi untuk keluar dari loop for, do-while dan while.

Pernyataan continue digunakan untuk mengarahkan eksekusi ke iterasi (proses) berikutnya

pada loop yang sama.

Dalam suatu loop bisa terkandung loop yang lain (nested loop).

Pernyataan goto merupakan intruksi untuk mengarahkan eksekusi ke pernyataan yang diawali

dengan suatu label. Label sendiri berupa suatu pengenal (identifier) yang diikuti dengan tanda

titik dua (:)

Suatu eksekusi program dapat dihentikan (secara normal) melalui pemanggilan fungsi exit( ).

Hal ini biasa dilakukan, jika di dalam suatu eksekusi terdapat suatu kondisi yang tak

dikehendaki.

for (ungkapan1; ungkapan2; ungkapan3) pernyataan;

while (kondisi)

pernyataan;

do

pernyataan;

while (kondisi)

Page 52: Pemograman Bahasa C

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Gunakan loop for untuk menampilkan nilai 1 sampai dengan 10 dalam baris-baris yang

terpisah.

2. Gunakan loop for untuk mendapatkan tampilan sbb :

1

22

333

4444

55555

3. Gunakan loop for untuk menjumlahkan seluruh bilangan antara 10 sampai dengan 100 ke

dalam sebuah variabel total. Asumsikan bahwa variabel total tidak diinisialisasi terlebih

dahulu dengan nilai nol.

4. Gunakan loop for untuk menampilkan seluruh karaker dari A sampai dengan Z dalam baris-

baris yang terpisah.

5. Hitunglah bilangan triangular dari masukan pengguna, yang dibaca dari keyboard dengan

menggunakan scanf(). Bilangan triangular adalah penjumlahan dari bilangan masukan

dengan seluruh bilangan sebelumnya, sehingga bilangan triangular dari 7 adalah : 7 + 6 + 5 +

4 + 3 + 2 + 1

6. Gunakan loop while untuk menampilkan bilangan integer antara 1 sampai dengan 10 di layar

sbb : 123456768910

7. Gunakan nested while loop untuk mendapatkan keluran sbb :

1

22

333

4444

55555

Page 53: Pemograman Bahasa C

BAB VFUNGSI

Tujuan :

1. Memecah program dalam fungsi fungsi yang sederhana.

2. Menjelaskan tentang pemrograman terstruktur.

3. Mengetahui perbedaan antara variabel lokal, eksternal, statis dan register

Fungsi adalah suatu bagian dari program yang dirancang untuk melaksanakan tugas tertentu

dan letaknya dipisahkan dari program yang menggunakannya. Elemen utama dari program bahasa C

berupa fungsi-fungsi, dalam hal ini program dari bahasa C dibentuk dari kumpulan fungsi pustaka

(standar) dan fungsi yang dibuat sendiri oleh pemrogram. Fungsi banyak digunakan pada program C

dengan tujuan :

a. Program menjadi terstruktur, sehingga mudah dipahami dan mudah dikembangkan. Dengan

memisahkan langkah-langkah detail ke satu atau lebih fungsi-fungsi, maka fungsi utama (main())

menjadi lebih pendek, jelas dan mudah dimengerti.

b. dapat mengurangi pengulangan (duplikasi) kode. Langkah-langkah program yang sama dan

dipakai berulang-ulang di program dapat dituliskan sekali saja secara terpisah dalam bentuk

fungsi-fungsi. Selanjutnya bagian program yang membutuhkan langkah-langkah ini tidak perlu

selalu menuliskannya, tetapi cukup memanggil fungsi-fungsi tersebut.

5.1 Dasar Fungsi

Fungsi standar C yang mengemban tugas khusus contohnya adalah ;

printf() , yaitu untuk menampilkan informasi atau data ke layar.

scanf() , yaitu untuk membaca kode tombol yang diinputkan.

Pada umumnya fungsi memerlukan nilai masukan atau parameter yang disebut sebagai

argumen. Nilai masukan ini akan diolah oleh fungsi. Hasil akhir fungsi berupa sebuah nilai (disebut

sebagai return value atau nilai keluaran fungsi). Oleh karena itu fungsi sering digambarkan sebagai

"kotak gelap" seperti ditunjukkan pada gambar di bawah ini.

Gambar 5.1 Fungsi sebagai sebuah kotak gelapPenggambaran sebagai kotak gelap di antaranya menjelaskan bahwa bagian dalam fungsi

bersifat pribadi bagi fungsi. Tak ada suatu pernyataan di luar fungsi yang bisa mengakses bagian

dalam fungsi, selain melalui parameter (atau variabel eksternal yang akan dibahas belakangan).

Misalnya melakukan goto dari pernyataan di luar fungsi ke pernyataan dalam fungsi adalah tidak

diperkenankan.

FUNGSI

Parameter KeluaranFungsi

Page 54: Pemograman Bahasa C

Bentuk umum dari definisi sebuah fungsi adalah sebagai berikut ;

Keterangan :

tipe-keluaran-fungsi, dapat berupa salah satu tipe data C, misalnya char atau int . Kalau penentu

tipe tidak disebutkan maka dianggap bertipe int (secara default).

tubuh fungsi berisi deklarasi variabel (kalau ada) dan statemen-statemen yang akan melakukan

tugas yang akan diberikan kepada fungsi yang bersangkutan. Tubuh fungsi ini ditulis di dalam

tanda kurung kurawal buka dan kurung kurawal tutup.

Sebuah fungsi yang sederhana bisa saja tidak mengandung parameter sama sekali dan tentu saja

untuk keadaan ini deklarasi parameter juga tidak ada. Contoh ;

inisialisasi()

{return(0);

}

Pada fungsi di atas :

tipe keluaran fungsi tidak disebutkan, berarti keluaran fungsi ber tipe int.

inisialisasi adalah nama fungsi

Tanda () sesudah nama fungsi menyatakan bahwa fungsi tak memiliki parameter.

Tanda { dan } adalah awal dan akhir fungsi

return(0) merupakan sebuah pernyataan dalam tubuh fungsi.

inisialisasi()

{return(0);

}

Gambar 5.2 Penjelasan definisi sebuah fungsi

5.2 Memberikan Nilai Keluaran Fungsi

Suatu fungsi dibuat untuk maksud menyelesaikan tugas tertentu. Suatu fungsi dapat hanya

melakukan suatu tugas saja tanpa memberikan suatu hasil keluaran atau melakukan suatu tugas dan

kemudian memberikan hasil keluaran. Fungsi yang hanya melakukan suatu tugas saja tanpa

memberikan hasil keluaran misalnya adalah fungsi untuk menampilkan hasil di layar.

Dalam tubuh fungsi, pernyataan yang digunakan untuk memberikan nilai keluaran fungsi

berupa return. Sebagai contoh, pada fungsi inisialisasi() di atas terdapat pernyataan

tipe-keluaran-fungsi nama-fungsi (deklarasi argumen){

tubuh fungsi}

Nama fungsiSepasang tanda kurung, tanpa argumenTak ada tanda titik komaAwal fungsiTubuh fungsiAkhir fungsi

Page 55: Pemograman Bahasa C

return(0);

merupakan pernyataan untuk memberikan nilai keluaran fungsi berupa nol. Selengkapnya perhatikan

program di bawah ini

/* File program : inisial.cContoh pembuatan fungsi */

int inisialisasi();

#include <stdio.h>

main() {

int x, y;

x = inisialisasi();printf("x = %d\n", x);y = inisialisasi(); printf("y = %d\n", y);

}

int inisialisasi(){

return(0);}

Contoh eksekusi :

x = 0y = 0

Program di atas sekaligus menjelaskan bahwa suatu fungsi cukup didefinisikan satu kali tetapi bisa

digunakan beberapa kali. Pada keadaan semacam ini seandainya tubuh fungsi mengandung banyak

pernyataan, maka pemakaian fungsi dapat menghindari duplikasi kode dan tentu saja menghemat

penulisan program maupun kode dalam memori.

Gambar 5.3 Proses pemanggilan fungsi

main() {

int x, y;

x = inisialisasi();printf("x = %d\n", x);y = inisialisasi(); printf("y = %d\n", y);

}

int inisialisasi(){

return(0);}

pemanggilan fungsi

definisi fungsi

Page 56: Pemograman Bahasa C

Misalnya pada saat pernyataan

x = inisialisasi();

dijalankan, mula-mula eksekusi akan diarahkan ke fungsi inisialisasi(), selanjutnya suatu nilai

keluaran (hasil fungsi) akhir fungsi diberikan ke x. Proses yang serupa, dilakukan untuk pernyataan

y = inisialisasi();

Bagi suatu fungsi, jika suatu pernyataan return dieksekusi, maka eksekusi terhadap fungsi

akan berakhir dan nilai pada parameter return akan menjadi keluaran fungsi. Untuk fungsi yang

tidak memiliki pernyataan return, tanda } pada bagian akhir fungsi akan menyatakan akhir eksekusi

fungsi. Di bawah ini diberikan contoh sebuah fungsi yang mengandung dua buah pernyataan return.

Fungsi digunakan untuk memperoleh nilai minimum di antara 2 buah nilai yang menjadi

parameternya.

int minimum(int x, int y){

if (x < y)return(x);

elsereturn(y);

}

Pada fungsi di atas terdapat dua buah parameter berupa x dan y. Oleh karena itu fungsi juga

mengandung bagian untuk mendeklarasikan parameter, yang menyatakan x dan y bertipe int.

Adapun penentuan nilai keluaran fungsi dilakukan pada tubuh fungsi, berupa pernyataan

if (x < y)return(x);

elsereturn(y);

yang menyatakan :

jika x < y maka nilai keluaran fungsi adalah sebesar nilai x.

untuk keadaan lainnya (x >= y) maka keluaran fungsi adalah sebesar y.

Selengkapnya perhatikan program di bawah ini.

/* File program : minimum1.c */

#include <stdio.h>

int minimum (int, int);

main(){

int a, b, kecil;

printf("Masukkan nilai a : ");scanf("%d", &a);

Page 57: Pemograman Bahasa C

printf("Masukkan nilai b : ");scanf("%d", &b);

kecil = minimum(a, b);printf("\nBilangan terkecil antara %d dan %d adalah

%d\n\n", a, b, kecil);}

int minimum(int x, int y){

if (x < y)return(x);

elsereturn(y);

}

Contoh eksekusi :

Masukkan nilai a = 4Masukkan nilai b = 2

Bilangan terkecil antara 4 dan 2 adalah 2

5.3 Fungsi Dengan Nilai Keluaran Bertipe Bukan Integer

Untuk fungsi yang mempunyai keluaran bertipe bukan integer, maka fungsi haruslah

didefiniskan dengan diawali tipe keluaran fungsinya (ditulis di depan nama fungsi). Sebagai contoh

untuk menghasilkan nilai terkecil di antara dua buah nilai real, maka definisinya berupa :

float minimum(float x, float y){

if (x < y)return(x);

else return(y);

}

Perhatikan, di depan nama minimum diberikan tipe keluaran fungsi berupa float. Seluruh parameter

sendiri juga didefinisikan dengan tipe float. Selengkapnya adalah sebagai berikut :

/* File program : minimum2.c */

#include <stdio.h>

float minimum (float, float);main(){

float a, b, kecil;

printf("Masukkan nilai a : ");scanf("%f", &a);printf("Masukkan nilai b : ");scanf("%f", &b);

Page 58: Pemograman Bahasa C

kecil = minimum(a, b);printf("\nBilangan terkecil antara %g dan %g adalah

%g\n\n", a, b, kecil);}

float minimum(float x, float y){

if (x < y)return(x);

elsereturn(y);

}

Contoh eksekusi :

Masukkan nilai a = 5.5Masukkan nilai b = 6.23

Bilangan terkecil antara 5 dan 6.23 adalah 5.5

Khusus untuk fungsi yang dirancang tanpa memberikan nilai keluaran (melainkan hanya

menjalankan suatu tugas khusus) biasa didefinisikan dengan diawali kata kunci void (di depan nama

fungsi). Sebagai contoh perhatikan program di bawah ini.

/* File program : void.cContoh fungsi tanpa nilai keluaran (pamakaian void) */

#include <stdio.h>

void info_program(); /* deklarasi fungsi */

main(){

info_program(); /* pemanggilan fungsi */}

void info_program() /* definisi fungsi */{

puts("==================================");puts("Progam dibuat oleh Moh. Izzuddin ");puts("Tanggal : 12 Juni 2001 ");puts(" ");puts("Selamat menggunakannya....... ");puts("==================================");

}Contoh eksekusi :

==================================Progam dibuat oleh Moh. Izzuddin Tanggal : 12 Juni 2001

Selamat menggunakannya....... ==================================

Page 59: Pemograman Bahasa C

5.4 Prototipe Fungsi

Prototipe fungsi digunakan untuk menjelaskan kepada kompiler mengenai :

tipe keluaran fungsi

jumlah parameter

tipe dari masing-masing parameter.

Bagi kompiler, informasi dalam prototipe akan dipakai untuk memeriksa keabsahan

(validitas) parameter dalam pemanggilan fungsi. Salah satu keuntungannya adalah, kompiler akan

melakukan konversi seandainya antara tipe parameter dalam fungsi dan parameter saat pemanggilan

fungsi tidak sama, atau akan menunjukan kesalahan bila jumlah parameter dalam definisi dan saat

pemanggilan berbeda.

Contoh prototipe fungsi;

float jumlah (float x, float y);

atau

float jumlah (float, float);

Penjelasannya adalah sbb :

float jumlah (float, float);

Gambar 5.4 Prototipe fungsi

Perhatikan contoh program di bawah ini.

/* File program : jumlah.ccontoh pemakaian prototipe fungsi */

#include <stdio.h>

float jumlah(float, float); /* prototipe fungsi */

main(){

float a, b,c;

printf("Masukkan nilai a : ");scanf("%f", &a);printf("Masukkan nilai b : ");scanf("%f", &b);

Nama fungsi

Diakhiri dengan titik komaTipe parameter keduaTipe parameter pertamaTipe keluaran fungsi

Page 60: Pemograman Bahasa C

c = jumlah(a, b);printf("\nHasil penjumlahan a + b = %g\n", c);

}

float jumlah(float x, float y) /* definisi fungsi */{

return(x + y);}

Contoh eksekusi :

Masukkan nilai a : 4.5Masukkan nilai b : 7.65

Hasil penjumlahan a + b = 12.15

Untuk fungsi yang tidak memiliki argumen (contoh program void.c), maka deklarasinya adalah

void info_program(void);

Catatan :

Untuk fungsi-fungsi pustaka, prototipe dari fungsi-fungsi berada di file-file judulnya (header

file). Misalnya fungsi pustaka printf() dan scanf() prototipenya berada pada file dengan nama

stdio.h

Untuk fungsi pustaka pencantuman pada prototipe fungsi dapat dilakukan dengan menggunakan

preprocessor directive #include.

5.5 Parameter formal dan Parameter Aktual

Parameter formal adalah variabel yang ada pada daftar parameter dalam definisi fungsi.

Pada contoh program di atas misalnya, maka dalam fungsi jumlah() variabel x dan y dinamakan

sebagai parameter formal. Adapun parameter aktual adalah parameter (tidak selalu berupa variabel)

yang dipakai dalam pemanggilan fungsi.

Gambar 5.5 Paramater formal dan parameter aktual

menyatakan bahwa info_program() tidak memiliki parameter

main(){

...c = jumlah(a, b);...

}

float jumlah(float x, float y){

return(x + y);}

parameter aktual

parameter formal

Page 61: Pemograman Bahasa C

Pada pernyataan :

x = jumlah(a, b);y = jumlah(20.1, 45.6);

a dan b merupakan parameter aktual dari fungsi jumlah() dalam hal ini parameter berupa variabel.

Demikian juga 20.1 dan 45.6 adalah parameter aktual, dalam hal ini berupa konstanta. Bahkan bisa

juga parameter aktual berupa ungkapan yang melibatkan operator, misalnya :

printf("%g\n", jumlah(2+3, 3+6));

5.6 Cara melewatkan Parameter

Ada dua cara untuk melewatkan parameter kedalam fungsi, yaitu berupa ;

Pemanggilan dengan nilai (call by value)

Pemanggilan dengan referensi (call by reference)

Pemanggilan dengan nilai merupakan cara yang dipakai untuk seluruh fungsi buatan yang

telah dibahas didepan. Pada pemanggilan dengan nilai, nilai dari parameter aktual akan disalin ke

parameter formal. Dengan cara ini nilai parameter aktual tidak bisa dirubah sekalipun nilai parameter

formal berubah. Untuk lebih jelasnya lihat pada fungsi tukar() pada contoh berikut ini.;

/* File program : tukar1.cUntuk melihat pengaruh pemanggilan nilai pada fungsi untuk penukaran dua data */

#include <stdio.h>

void tukar (int, int);

main(){

int a,b;

a = 88;b = 77;

printf("Nilai sebelum pemanggilan fungsi\n");printf("a = %d b = %d\n", a, b);

tukar(a,b);

printf("\nNilai setelah pemanggilan fungsi\n");printf("a = %d b = %d\n", a, b);

}

void tukar(int x, int y){

int z;

ungkapan

Page 62: Pemograman Bahasa C

z = x;x = y;y = z;

printf("\nNilai di akhir fungsi tukar()\n");printf("x = %d y = %d\n", x, y);

}Contoh eksekusi :

Nilai sebelum pemanggilan fungsia = 88 b = 77

Nilai di akhir fungsi tukar()x = 77 y = 88

Nilai setelah pemanggilan fungsia = 88 b = 77

Tampak bahwa sekeluarnya dari pemanggilan fungsi tukar(), variabel a dan b (yang dilewatkan

ke fungsi tukar() tidak berubah, walaupun pada fungsi tukar() telah terjadi penukaran antara

parameter x dan y . Mengapa hal ini bisa terjadi ? Sebab x hanyalah salinan dari a dan y adalah

salinan dari b (Lihat gambar 5.6 di bawah ini). Pada saat pemanggilan fungsi, maka :

x bernilai 88 (nilai a)

y bernilai 77 (nilai b)

Sesudah pernyataan-pernyataan berikut dijalankan, maka :z = x;x = y;y = z;

x akan bernilai 77 dan y bernilai 88.

Gambar 5.6 Proses penukaran nilaiGambar 5.6 menjelaskan bahwa a dan b tidak berubah. Yang berubah hanyalah parameter x dan y.

Pemanggilan dengan referensi (call by reference) merupakan upaya untuk melewatkan alamat

dari suatu variabel ke dalam fungsi. Cara ini dapat dipakai untuk mengubah isi suatu variabel di luar

fungsi dengan pelaksanaan pengubahan dilakukan di dalam fungsi. Sebagai contoh perhatikan

program tukar2.c yang merupakan modifikasi dari tukar1.c. Perubahan yang pertama terletak

dalam definisi fungsi, yang kini berupa

x y z

88 77 ?

x y z

88 77 88

77 77 88 77 88 88

x y z x y z

mula-mula sesudah : z = x

sesudah : y = zsesudah : x = y

Page 63: Pemograman Bahasa C

void tukar(int *px, int *py){

int z;

z = *px;*px = *py;*py = z;

printf("\nNilai di akhir fungsi tukar()\n");printf("x = %d y = %d\n", *px, *py);

}

Adapun perubahan dalam parameter aktualnya menjadi :

tukar(&a,&b); /* alamat a dan alamat b */

Dalam deklarasi parameter

int *px, int *py

menyatakan bahwa px dan py adalah suatu variabel pointer. Yang dimaksudkan sebagai variabel

pointer adalah suatu variabel yang menunjuk ke variabel lain. Lebih jelasnya, variabel pointer berisi

alamat dari variabel lain.

Adapun pada pemanggilan fungsi, &a dan &b masing-masing berarti "alamat a" dan "alamat

b". Dengan pemanggilan seperti ini, hubungan antara variabel pointer px dan py dengan variabel a

dan b adalah seperti ditunjukkan pada gambar 5.7. Dalam hal ini, px dikatakan menunjuk variabel a

dan py menunjuk variabel b.

Gambar 5.7Variabel pointer px menunjuk variabel a dan variabel pointer py menunjuk variabel b

/* File program : tukar2.cUntuk melihat pengaruh pemanggilan nilai pada fungsi untuk penukaran dua data */

#include <stdio.h>

void tukar (int *px, int *py); /* prototype fungsi */

main(){

int a,b;

alamat a alamat b

px py

a b

Page 64: Pemograman Bahasa C

a = 88;b = 77;

printf("Nilai sebelum pemanggilan fungsi\n");printf("a = %d b = %d\n", a, b);

tukar(&a,&b); /* alamat a dan alamat b */

printf("\nNilai setelah pemanggilan fungsi\n");printf("a = %d b = %d\n", a, b);

}

void tukar(int *px, int *py){

int z;

z = *px;*px = *py;*py = z;

printf("\nNilai di akhir fungsi tukar()\n");printf("x = %d y = %d\n", *px, *py);

}Contoh eksekusi :

Nilai sebelum pemanggilan fungsia = 88 b = 77

Nilai di akhir fungsi tukar()x = 77 y = 88

Nilai setelah pemanggilan fungsia = 77 b = 88

Setelah px menunjuk a dan py menunjuk b, proses penukaran isi a dan b dilakukan dengan cara

sebagai berikut :

z = *px; /* 1 */*px = *py; /* 2 */*py = z; /* 3 */

Pertama variabel z diisi dengan nilai yang ditunjuk oleh px. Kedua, yang ditunjuk oleh px diisi

dengan yang ditunjuk oleh py (berarti a diisi dengan b). Ketiga, yang ditunjuk oleh py diberi nilai

z. Dengan melalui tiga pernyataan di atas, nilai a dab b dapat diubah di dalam fungsi.

Catatan : Pembahasan lebih lanjut mengenai pointer dapat dilihat pada bab VIII.

Page 65: Pemograman Bahasa C

5.7 Penggolongan Variabel berdasarkan kelas Penyimpanan

Suatu variabel, di samping dapat digolongkan berdasarkan jenis/tipe data juga dapat

diklasifikasikan berdasarkan kelas penyimpanan (storage class). Penggolongan berdasarkan kelas

penyimpanan berupa :

variabel lokal

variabel eksternal

variabel statis

variabel register

5.7.1 Variabel Lokal

Variabel lokal adalah variabel yang dideklarasikan dalam fungsi, dengan sifat :

secara otomatis diciptakan ketika fungsi dipanggil dan akan sirna (lenyap) ketika eksekusi

terhadap fungsi berakhir.

Hanya dikenal oleh fungsi tempat variabel tersebut dideklarasikan

Tidak ada inisialisasi secara otomatis (saat variabel diciptakan, nilainya tak menentu).

Dalam banyak literatur, variabel lokal disebut juga dengan variabel otomatis. Variabel yang

termasuk dalam golongan ini bisa dideklarasikan dengan menambahkan kata kuci auto di depan tipe-

data variabel. Kata kunci ini bersifat opsional, biasanya disertakan sebagai penjelas saja. Contoh

variabel lokal ditunjukkan pada gambar 5.8.

Gambar 5.8 Variabel lokal

Pada fung_x(), deklarasi

int x;

dapat ditulis menjadi

auto int x;

void fung_x(void)

{

int x;

x adalah variabel lokal bagi fungsi fung_x()

Page 66: Pemograman Bahasa C

Penerapan variabel lokal yaitu bila variabel hanya dipakai oleh suatu fungsi (tidak

dimaksudkan untuk dipakai oleh fungsi yang lain). Pada contoh berikut, antara variabel i dalam

fungsi main() dan fung_1() tidak ada kaitannya, sebab masing-masing merupakan variabel lokal.

/* File program : lokal.c */

#include <stdio.h>

void fung_1(void);

main()

{

int i = 20;

fung_1();

printf("nilai i di dalam main() = %d\n", i);

}

void fung_1(void)

{

int i = 11;

printf("nilai i di dalam fung_1() = %d\n", i);

}

Contoh eksekusi :

nilai i di dalam fung_1() = 11nilai i di dalam main() = 20

5.7.2 Variabel Eksternal

Variabel eksternal merupakan variabel yang dideklarasikan di luar fungsi, dengan sifat :

dapat diakses oleh semua fungsi

kalau tak diberi nilai, secara otomatis diinisialisasi dengan nilai sama dengan nol.

Page 67: Pemograman Bahasa C

Contoh variabel eksternal ada pda program ekstern1.c yaitu berupa variabel i. Pada

pendeklarasian

int i = 273;

Menyatakan bahwa i merupakan variabel eksternal dan diberi nilai awal sama denan 273.

Nilai dari variabel i selanjutnya dapat diubah oleh fungsi tambah() maupun main(). Setiap fungsi

tambah() dipanggil maka nilai i akan bertambah satu.

/* File program : ekstern1.cContoh program dengan variabel eksternal */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

i++;}

Contoh eksekusi :

Nilai awal i = 273Nilai i kini = 280Nilai i kini = 281Nilai i kini = 282

Pada contoh di atas, terlihat bahwa i hanya dideklarasikan di bagian atas program, dan tak

dideklarasikan lagi dalam fungsi main() maupun tambah(). Oleh karena i merupakan variabel

eksternal maka dapat digunakan oleh kedua fungsi tsb. Namun ada satu hal yang perlu diketahui,

variabel eksternal haruslah dideklarasikan sebelum definisi fungsi yang akan mempergunakannya.

Untuk memperjelas bahwa suatu variabel dalam fungsi merupakan variabel eksternal, di dalam

fungsi yang menggunakannya dapat mendeklarasikan variabel itu kembali dengan menambahkan

kata kunci extern di depan tipe data variabel. Sebagai contoh, program ekstern1.c ditulis kembali

menjadi seperti pada ekstern2.c.

Page 68: Pemograman Bahasa C

/* File program : ekstern2.cContoh program yang menggunakan variabel eksternal dan memakai kata kunci extern */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

extern int i; /* variabel eksternal */

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

extern int i; /* variabel eksternal */

i++;}

Contoh eksekusi :

Nilai awal i = 273Nilai i kini = 280Nilai i kini = 281Nilai i kini = 282

Kalau dalam suatu program terdapat suatu variabel eksternal, suatu fungsi bisa saja

menggunakan nama variabel yang sama dengan variabel eksternal, namun diperlakukan sebagai

variabel lokal. Untuk lebih jelasnya perhatikan contoh program di bawah ini.

/* File program : ekstern3.cContoh program yang menggunakan variabel eksternal dan variabel lokal dengan nama yang sama */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

extern int i; /* variabel eksternal */

Page 69: Pemograman Bahasa C

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

int i; /* variabel lokal */i++;

}

Contoh eksekusi :

Nilai awal i = 273Nilai i kini = 280Nilai i kini = 280Nilai i kini = 280

Pada program di atas, bagi fungsi main() i adalah variabel eksternal. Namun bagi fungsi

tambah(), i merupakan variabel lokal, sebab pada fungsi ini i dideklarasikan tanpa kata kunci

extern. Hal ini terlihat jelas dengan mengamati hasil eksekusi program. Pernyataan:

i++;

Pada fungsi tambah() tidak mempengaruhi nilai i yang ditampilkan pada fungsi main() (bandingkan

dengan hasil eksekusi pada ekstern2.c).

5.7.3 Variabel Statis

Variabel statis dapat berupa variabel internal (didefinisikan di dalam fungsi) maupun variabel

eksternal. Sifat variabel ini :

Kalau variabel statis bersifat internal, maka variabel hanya dikenal oleh fungsi tempat variabel

dideklarasikan

Kalau variabel statis bersifat eksternal, maka variabel dapat dipergunakan oleh semua fungsi

yang terletak pada file yang sama, tempat variabel statis dideklarasikan

Berbeda dengan variabel lokal, variabel statis tidak akan hilang sekeluarnya dari fungsi (nilai

pada variabel akan tetap diingat).

Inisialisasi akan dilakukan hanya sekali, yaitu saat fungsi dipanggil yang pertama kali. Kalau tak

ada inisialisasi oleh pemrogram secara otomatis akan diberi nilai awal nol

Variabel statis diperoleh dengan menambahkan kata kunci static di depan tipe data variabel.

Sebagai contoh perhatikan program di bawah ini.

Page 70: Pemograman Bahasa C

/* File program : statis.c

Contoh variabel statis */

#include <stdio.h>

void fung_y(void);

main()

{

int y = 20;

fung_y();

fung_y();

printf("Nilai y dalam main() = %d\n", y);

}

void fung_y(void)

{

static int y;

y++;

printf("Nilai y dalam fung_y() = %d\n", y);

}

Contoh eksekusi :

Nilai y dalam fung_y() = 1Nilai y dalam fung_y() = 2Nilai y dalam main() = 20

Page 71: Pemograman Bahasa C

5.7.4 Variabel Register

Variabel register adalah variabel yang nilainya disimpan dalam register dan bukan dalam

memori RAM. Variabel yang seperti ini hanya bisa diterapkan pada variabel yang lokal atau

parameter formal, yang bertipe char atau int. Variabel register biasa diterapkan pada variabel yang

digunakan sebagai pengendali loop. Tujuannya untuk mempercepat proses dalam loop. Sebab

variabel yang dioperasikan pada register memiliki kecepatan yang jauh lebih tinggi daripada variabel

yang diletakkan pada RAM. Contoh pemakaiannya bisa dilihat pada program di bawah ini.

/* File program : var_reg.c

Contoh variabel register */

#include <stdio.h>

main()

{

register int i; /* variabel register */

int jumlah = 0;

for(i = 1; i <= 100; i++)

jumlah = jumlah + i;

printf("1 + 2 + 3 + ... + 100 = %d\n", jumlah);

}

Contoh eksekusi :

1 + 2 + 3 + ... + 100 = 5050

5.8 Menciptakan Sejumlah Fungsi

Pada C, semua fungsi bersifat sederajat. Suatu fungsi tidak dapat didefinisikan di dalam

fungsi yang lain. Akan tetapi suatu fungsi diperbolehkan memanggil fungsi yang lain, dan tidak

tergantung kepada peletakan definisi fungsi pada program. Komunikasi antara fungsi dalam C

ditunjukkan dalam gambar 5.9. Gambar tersebut menjelaskan kalau suatu fungsi katakanlah

fungsi_a() memanggil fungsi_b(), maka bisa saja fungsi_b() memanggil fungsi_a(). Contoh

program yang melibatkan fungsi yang memanggil fungsi yang lain ada pada program kom_fung.c,

yaitu fungsi_1() dipanggil dalam main(), sedangkan fungsi_2() dipanggil oleh fungsi_1().

Page 72: Pemograman Bahasa C

Gambar 5.9 Komunikasi antar fungsi dalam C

/* File program : kom_fung.ccontoh fungsi yang memanggil fungsi yang lain */

#include <stdio.h>

void fungsi_1(void);void fungsi_2(void);

main(){

fungsi_1();}

void fungsi_1(){

puts("fungsi 1 dijalankan");fungsi_2();

}

void fungsi_2(){

puts("fungsi 2 dijalankan");}

Contoh eksekusi :

fungsi 1 dijalankanfungsi 2 dijalankan

5.9 Rekursi

Fungsi dalam C dapat dipakai secara rekursi, dalam artian suatu fungsi dapat memanggil

dirinya sendiri. Sebagai contoh penerapan fungsi rekursi yaitu untuk menghitung nilai

xn

dengan n berupa bilagnan bulat positif. Solusi dari persoalan ini dapat berupa :

Jika n = 1, maka xn = x

Selain itu maka xn = x * xn-1

Misalnya x = 2 dan n = 3, proses pemecahannya seperti diuraikan pada gambar 5.10.

fungsi_a()

fungsi_c()

fungsi_b()

Page 73: Pemograman Bahasa C

Gambar 5.10 Pemecahan secara rekursi

Penuangan dalam bentuk program

/* File program : faktor.c Contoh penerapan rekursi untuk memperoleh nilai factorial */

#include <stdio.h>

int faktorial(int);

main(){ int x;

puts("MENCARI FAKTORIAL DARI X!");printf("Masukkan nilai x (bulat positif) : ");scanf("%d", &x);

printf("Faktorial dari %d = %d\n", x, faktorial(x));}

int faktorial(int m){

if(m == 1)return(1);

elsereturn(m * faktorial(m-1));

}Contoh eksekusi :

MENCARI FAKTORIAL DARI X!Masukkan nilai x (bulat positif) : 4Faktorial dari 4 = 24

23 = 2 *

22

22 = 2 *

21

21 = 2

8 4 2

Page 74: Pemograman Bahasa C

Rekursi jarang dipakai, di antaranya disebabkan :

Biasanya rekursi akan menjadikan fungsi sulit dimengerti. Hanya cocok untuk persoalan tertentu

saja (misalnya pada binary tree atau pohon biner). Untuk fungsi rekursi pada program faktor.c di

atas misalnya, akan lebih mudah dipahami kalau ditulis menjadi :

int faktorial(int m){

int i, fak;

fak = 1;for(i = 1; i <= m; i++)

fak = fak * i;

return(fak);

}

Memerlukan stack dengan ukuran yang lebih besar. Sebab setiap kali fungsi dipanggil, variabel

lokal dan parameter formal akan ditempatkan ke stack dan adakalanya akan menyebabkan stack

tak cukup lagi (stack overflow).

5.10 Pengenalan Konsep Pemrograman Terstruktur

Fungsi sangat bermanfaat untuk membuat program yang terstruktur. Suatu program yang

terstruktur dikembangkan dengan menggunakan “top-down design” (rancang atas bawah). Pada C

suatu program disusun dari sejumlah fungsi dengan tugas tertentu. Selanjutnya masing masing fungsi

dipecah-pecah lagi menjadi fungsi yang lebih kecil. Pembuatan program dengan cara ini akan

memudahkan dalam pencarian kesalahan ataupun dalam hal pengembangan dan tentu saja mudah

dipahami/ dipelajari.

Dalam bentuk diagram, model suatu program C yang terstruktur adalah seperti yang tertera

pada bagan berikut ini. Namun sekali lagi perlu diketahui, bahwa pada C semua fungsi sebenarnya

berkedudukan sederajat.

Fungsi main() terdiri dari fungsi_a() sampai dengan fungsi_n(), menegaskan bahwa dalam

program fungsi main() akan memanggil fungsi_a() sampai dengan fungsi_n(). Adapun fungsi-

fungsi yang dipanggil oleh fungsi main() juga bisa memanggil fungsi-fungsi yang lain.

Page 75: Pemograman Bahasa C

fungsi utamamain()

fungsi_a() … fungsi_n()

fungsi_a1() … fungsi_am()

Gambar 5.11 Model terstruktur Program C

Kesimpulan

Fungsi digunakan untuk memecah program yang besar menjadi program-program kecil sesuai

dengan fungsi masing-masing.

Fungsi bisa memberikan nilai balik dan bisa tanpa memberikan nilai balik kepada fungsi yang

memanggilnya.

Fungsi yang memberikan nilai balik harus memiliki tipe dan ditulis didepan nama fungsi.

Bila fungsi tidak memberikan nilai balik maka fungsi tersebut bertipe “void “ dan ditulis

didepan nama fungsi.

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Buatlah sebuah fungsi yang berfungsi untuk menampilkan sebuah string (di layar) = “Pilihan

Menu” (misalkan nama fungsinya = menu). Fungsi tersebut tidak memiliki nilai kembalian

(return value) dan juga tidak menerima parameter masukan apapun.

2. Tulislah prototipe fungsi untuk fungsi pada soal nomor 1 di atas.

3. Buatlah sebuah fungsi (misalkan nama fungsinya = cetak) yang berfungsi untuk

menampilkan sebuah string (di layar). Fungsi tersebut tidak memiliki nilai kembalian (return

value), tetapi menerima parameter masukan berupa string yang akan dicetak (catatan : string

merupakan array karakter).

4. Tulislah prototipe fungsi untuk fungsi pada soal nomor 3 di atas.

5. Buatlah sebuah fungsi (misalkan nama fungsinya = total) yang berfungsi untuk menjumlah

total nilai dari array integer yang dikirim sebagai parameter masukan fungsi tsb. Fungsi

tersebut memberikan nilai kembalian (return value) bertipe integer yang berisi total hasil

perhitungannya. Dalam hal ini fungsi tsb memiliki 2 parameter masukan berupa array integer

dan sebuah variabel integer yang menunjukkan jumlah elemen dari array tsb.

Page 76: Pemograman Bahasa C

6. Tulislah prototipe fungsi untuk fungsi pada soal nomor 5 di atas.

BAB VIARRAY

Tujuan :

14. Menjelaskan tentang array berdimensi satu

15. Menjelaskan tentang array berdimensi dua

16. Menjelaskan tentang array berdimensi banyak

17. Menjelaskan tentang inisialisasi array tak berukuran.

18. Menjelaskan array sebagai parameter fungsi

Dalam beberapa literatur, array sering disebut (diterjemahkan) sebagai larik. Array

adalah kumpulan dari nilai-nilai data bertipe sama dalam urutan tertentu yang menggunakan sebuah

nama yang sama. Nilai-nilai data di suatu array disebut dengan elemen-elemen array. Letak urutan

dari elemen-elemen array ditunjukkan oleh suatu subscript atau indeks.

Array bisa berupa array berdimensi satu, dua, tiga atau lebih. Array berdimensi satu (one-

dimensional array) mewakili bentuk suatu vektor. Array berdimensi dua (two-dimensional array)

mewakili bentuk dari suatu matriks atau tabel. Array berdimensi tiga (three-dimensional array)

mewakili bentuk suatu ruang.

6.1 Array Berdimensi Satu

6.1.1 Mendeklarasikan Array

Suatu array berdimensi satu dideklarasikan dalam bentuk umum berupa :

dengan :

tipe_data : untuk menyatakan tipe dari elemen array, misalnya int, char, float.

nama_var : nama variabel array

ukuran : untuk menyatakan jumlah maksimal elemen array.

Contoh pendeklarasian array :

float nilai_tes[5];

menyatakan bahwa array nilai_tes mengandung 10 elemen bertipe float.

6.1.2 Mengakses Elemen Array

Pada C, data array akan disimpan dalam memori yang berurutan. Elemen pertama mempunyai indeks bernilai 0. Jika variabel nilai_tes dideklarasikan sebagai array dengan 5 elemen, maka elemen pertama memiliki indeks sama dengan 0, dan elemen terakhir memiliki indeks 4. Gambar 6.1 di bawah ini menjelaskan urutan komponen dalam array.

tipe_data nama_var[ukuran];

Page 77: Pemograman Bahasa C

Gambar 6.1 Array berdimensi satu

Bentuk umum pengaksesan array adalah sbb :

sehingga, untuk array nilai_tes, maka :

nilai_tes[0] elemen pertama dari nilai_tes

nilai_tes[4] elemen ke-5 dari nilai_tes

Contoh :

nilai_tes[0] = 70; /* contoh 1 */scanf(“%f”, &nilai_tes[2]); /* contoh 2 */

Contoh pertama merupakan pemberian nilai 70 ke nilai_tes[0]. Sedangkan contoh 2 merupakan

perintah untuk membaca data bilangan dari keyboard dan diberikan ke nilai_tes[2].

Pada contoh 2 ini

&nilai_tes[2]

berarti “alamat dari nilai_tes[2]”. Perlu diingat bahwa scanf() memerlukan argumen berupa alamat

dari variabel yang digunakan untuk menyimpan nilai masukan. Selengkapnya perhatikan contoh

program di bawah ini

/* File program : nilai_tes.c Pemakaian array utk menyimpan sejumlah nilai tes */

#include <stdio.h>

#define MAKS 5

main(){

int i;float total = 0, rata;float nilai_tes[MAKS]; /* deklarasi array */

nilai_tes[0]

nilai_tes[1]

nilai_tes[2]

nilai_tes[3]

nilai_tes[4]

tipe float

total 5 elemen

float nilai_tes[5]

nama_var[indeks]

Page 78: Pemograman Bahasa C

for(i=0; i < MAKS; i++) /* pemasukan data nilai_tes */{

printf("Nilai tes ke-%d : ", i+1);scanf("%f", &nilai_tes[i]);/* menghitung jumlah seluruh nilai */total = total + nilai_tes[i];

}

rata = total / MAKS; /* hitung nilai rata-rata */

/* cetak nilai rata-rata */printf("\nNilai rata-rata = %g\n", rata);

}

Contoh eksekusi :

Nilai tes ke-1 : 56.5Nilai tes ke-2 : 67.75Nilai tes ke-3 : 80Nilai tes ke-4 : 77Nilai tes ke-5 : 78.5

Nilai rata-rata = 71.95

6.1.3 Inisialisasi Array Berdimensi Satu

Sebuah array dapat diinisialisasi sekaligus pada saat dideklarasikan. Untuk mendeklarasikan

array, nilai-nilai yang diinisialisasikan dituliskan di antara kurung kurawal ({}) yang dipisahkan

dengan koma.

/* File program : jhari.c */

#include <stdio.h>

main(){

int bulan, tahun, jhari;int jum_hari[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

puts("MEMPEROLEH JUMLAH HARI");puts("PADA SUATU BULAN DAN SUATU TAHUN");puts("--------------------------------");printf("Masukkan bulan (1..12) : ");scanf("%d", &bulan);printf("Masukkan tahunnya : ");scanf("%d", &tahun);

if(bulan == 2)if((tahun % 4 == 0) && (tahun % 100 != 0))

jhari = 29;

Page 79: Pemograman Bahasa C

elsejhari = 28;

elsejhari = jum_hari[bulan-1];

printf("\nJumlah hari dalam bulan %d tahun %d adalah %d hari\n", bulan, tahun, jhari);

}

Contoh eksekusi :

MEMPEROLEH JUMLAH HARIPADA SUATU BULAN DAN SUATU TAHUN--------------------------------Masukkan bulan (1..12) : 2Masukkan tahunnya : 1988

Jumlah hari dalam bulan 2 tahun 1988 adalah 29 hari

Pada program jhari.c di atas

int jum_hari[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

merupakan instruksi untuk mendeklarasikan array jum_hari yang memiliki 12 elemen yang bersifat

statis dan sekaligus melakukan inisialisasi terhadap masing-masing elemen array.

/* File program : inisial.c */

#include <stdio.h>

main(){

int i;int values[] = {1,2,3,4,5,6,7,8,9};char word[] = {'H','e','l','l','o'};

for(i = 0; i < 9; ++i )printf("values[%d] is %d\n", i, values[i]);

printf("\n");for(i = 0; i < 6; ++i )

printf("word[%d] is %c\n", i, word[i]);}Contoh eksekusi :

values[0] is 1values[1] is 2values[2] is 3values[3] is 4values[4] is 5values[5] is 6values[6] is 7values[7] is 8

Page 80: Pemograman Bahasa C

values[8] is 9word[0] is Hword[1] is eword[2] is lword[3] is lword[4] is o

Perhatikan, pada contoh inisial.c di atas, pendeklarasian nama variabel array tidak disertai ukuran

yang mengindikasikan besarnya array. Dalam kondisi seperti ini, C akan menginisialisasi ukuran

array tersebut sejumlah elemen yang diberikan di dalam kurung kurawal pada saat proses inisialisasi.

Sehingga array values terdiri atas 9 elemen dan array word memiliki 5 elemen.

6.1.4 Beberapa Variasi dalam Mendeklarasikan Array

Ada beberapa variasi cara mendeklarasikan sebuah array (dalam hal ini yang berdimensi

satu), di antaranya adalah sebagai berikut :

int numbers[10];

int numbers[10] = { 34, 27, 16 };

int numbers[] = { 2, -3, 45, 79, -14, 5, 9, 28, -1, 0 };

char text[] = "Welcome to New Zealand.";

float radix[12] = { 134.362, 1913.248 };

double radians[1000];

6.2 Array Berdimensi Dua

Data seperti yang disajikan pada Tabel 6-1, dapat disimpan pada sebuah array berdimensi

dua. Dimensi pertama dari array digunakan untuk menyatakan kode program kursus dan dimensi

kedua untuk menyatakan tahun kursus.

Tabel 6-1. Data Kelulusan Siswa Pada Sebuah Kursus Komputer

Tahun 1998 1999 2000 Program1. (INTRO) 80 540 10322. (BASIC) 15 83 3013. (PASCAL) 8 12 154. (C) 10 129 257

6.2.1 Mendeklarasikan Array Berdimensi Dua

Pendeklarasian yang diperlukan untuk menyimpan data kelulusan siswa pada Tabel 6-1

adalah:

int data_lulus[4][3];

Nilai 3 untuk menyatakan banyaknya tahun dan 4 menyatakan banyaknya program kursus. Gambar 6.2 memberikan ilustrasi untuk memudahkan pemahaman tentang array berdimensi dua.

Page 81: Pemograman Bahasa C

80 540 103215 83 3018 12 15

10 129 257

int data_lulus[4][3];

Gambar 6.2 Array berdimensi dua

Sama halnya pada array berdimensi satu, data array aka ditempatkan pada memori yang

berurutan. Perhatikan Gambar 6.3.

80 540 1032 15 83 301 80

Gambar 6.3 Model penyimpanan array dimensi dua pada memori

6.2.2 Mengakses Elemen Array

Array seperti data_lulus dapat diakses dalam bentuk

data_lulus[indeks pertama, indeks kedua]

Contoh :(1) data_lulus[0][1] = 540;

merupakan instruksi untuk memberikan nilai 540 ke array data_lulus untuk indeks pertama = 0

dan indeks kedua bernilai 1.

(2) printf(“%d”,data_lulus[2][0]);

merupakan perintah untuk menampilkan elemen yang memiliki indeks pertama = 2 dan indeks kedua = 0.

540

data_lulus[0][1] = 540;

Gambar 6.4. Pemberian nilai ke array berdimensi dua

Perhatikan contoh program di bawah ini.

/* File program : lulus.cContoh pemakaian array berdimensi dua */

#include <stdio.h>

0 1 2

0123

indeks kedua (tahun)

indeks pertama (program kursus)

0 1 2

0123

Page 82: Pemograman Bahasa C

main( ){

int tahun, kode_program;int data_lulus[4][3] ;/* Memberikan data ke array */data_lulus[0][0] = 80;data_lulus[0][1] = 540;data_lulus[0][2] = 1032;

data_lulus[1][0] = 15;data_lulus[1][1] = 83;data_lulus[1][2] = 301;

data_lulus[2][0] = 8;data_lulus[2][1] = 12;data_lulus[2][2] = 15;

data_lulus[3][0] = 10;data_lulus[3][1] = 129;data_lulus[3][2] = 257;

/* proses utk memperoleh informasi jml siswa yg lulus */printf("Masukkan tahun dr data yg ingin anda ketahui ");printf("(1998..2000) : ");scanf("%d", &tahun);printf("Masukkan kode program kursus yang ingin anda

ketahui");printf("(1 = INTRO, 2 = BASIC, 3 = PASCAL, 4 = C) : ");scanf("%d", &kode_program);printf("\nTotal kelulusan program tsb = %d\n",

data_lulus[kode_program - 1][tahun - 1998] );}

Contoh eksekusi :

Masukkan tahun dr data yg ingin anda ketahui (1998…2000) : 2000Masukkan kode program kursus dari data yang ingin anda ketahui (1 = INTRO, 2 = BASIC, 3 = PASCAL, 4 = C) : 3

Total kelulusan program tsb = 15

6.2.3 Inisialisasi Array Berdimensi Dua

Gambar berikut memberikan penjelasan tentang inisialisasi yang dilakukan terhadap array berdimensi dua :

0 1 1 1 1 1 0 0

0 1 0 0 0 1 0 0

Page 83: Pemograman Bahasa C

0 1 0 0 0 1 0 01 1 1 1 1 1 1 01 1 0 0 0 0 1 01 1 0 0 0 0 1 01 1 0 0 0 0 1 00 0 0 0 0 0 0 0

Gambar 6.5 Representasi inisialisasi array berdimensi dua

Untuk itu, deklarasi dan inisialisasi yang dilakukan berupa :

INT HURUF_A[8][8] = {

{ 0, 1, 1, 1, 1, 1, 0, 0 } ,

{ 0, 1, 0, 0, 0, 1, 0, 0 } , { 0, 1, 0, 0, 0, 1, 0, 0 } , { 1, 1, 1, 1, 1, 1, 1, 0 } , { 1, 1, 0, 0, 0, 0, 1, 0 } , { 1, 1, 0, 0, 0, 0, 1, 0 } , { 1, 1, 0, 0, 0, 0, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0 }};

atau bisa juga ditulis sebagai berikut :

int huruf_A[8][8] ={ 0, 1, 1, 1, 1, 1, 0, 0,

0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0

};

Contoh program berikut memenfaatkan data yang ada pada array huruf_A untuk membentuk

karakter A dengan ukuran besar. Setiap nilai satu pada array akan diganti dengan karakter ber-ASCII

219 (DBh) dan nilai 0 akan diganti dengan karakter spasi.

/* File program : hurufA.cContoh inisialisasi array dimensi dua */

#include <stdio.h>

main(){

int i,j;int huruf_A[8][8] = {

{ 0, 1, 1, 1, 1, 1, 0, 0 } ,{ 0, 1, 0, 0, 0, 1, 0, 0 } ,{ 0, 1, 0, 0, 0, 1, 0, 0 } ,

Page 84: Pemograman Bahasa C

{ 1, 1, 1, 1, 1, 1, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 0, 0, 0, 0, 0, 0, 0, 0 }

};

for(i = 0; i < 8; i++){

for(j = 0; j < 8; j++)if(huruf_A[i][j] !=0 )

putchar('\xDB\n');else

putchar (' '); /* spasi */putchar('\n');

}}

Contoh eksekusi :

6.3. Array Berdimensi Banyak.

C memungkinkan untuk membuat array yang dimensinya lebih dari dua. Bentuk umum pendeklarasian array berdimensi banyak :

tipe nama_var[ukuran 1][ukuran2}…[ukuranN];

sebagai contoh :

int data_huruf[2][8][8];

merupakan pendeklarasian array data_huruf sebagai array berdimensi tiga.

Sama halnya dengan array berdimensi satu atau dua, array berdimensi banyak juga bisa

diinisialisasi. Contoh inisialisasi array berdimensi tiga :

int data_huruf [2][8][8] ={ { { 0, 1, 1, 1, 1, 1, 0, 0 } ,

{ 0, 1, 0, 0, 0, 1, 0, 0 } ,{ 0, 1, 0, 0, 0, 1, 0, 0 } ,

Page 85: Pemograman Bahasa C

{ 1, 1, 1, 1, 1, 1, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 1, 1, 0, 0, 0, 0, 1, 0 } ,{ 0, 0, 0, 0, 0, 0, 0, 0 }

},

{ {1, 1, 1, 1, 1, 1, 0, 0 } , {1, 0, 0, 0, 0, 1, 0, 0 } , {1, 0, 0, 0, 0, 1, 0, 0 } , {1, 1, 1, 1, 1, 1, 1, 0 } , {1, 1, 0, 0, 0, 0, 1, 0 } , {1, 1, 0, 0, 0, 0, 1, 0 } , {1, 1, 1, 1, 1, 1, 1, 0 } , {0, 0, 0, 0, 0, 0, 0, 0 } } };

atau bisa juga ditulis menjadi

int data_huruf [2][8][8] = 0, 1, 1, 1, 1, 1, 0, 0,

0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,

1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

Program berikut merupakan pengembangan dari Program 8 – 4, digunakan untuk

menampilkan dua buah huruf dengan ukuran besar.

/* File program: data_huruf.c Contoh inisialisasi array dimensi tiga */

# include <stdio.h>

main(){

int i, j, k;int data_huruf[2][8][8] = {

{{ 0, 1, 1, 1, 1, 1, 0, 0 },{ 0, 1, 0, 0, 0, 1, 0, 0 },

Page 86: Pemograman Bahasa C

{ 0, 1, 0, 0, 0, 1, 0, 0 },{ 1, 1, 1, 1, 1, 1, 1, 0 },{ 1, 1, 0, 0, 0, 0, 1, 0 },{ 1, 1, 0, 0, 0, 0, 1, 0 },{ 1, 1, 0, 0, 0, 0, 1, 0 },{ 0, 0, 0, 0, 0, 0, 0, 0 }},{{1, 1, 1, 1, 1, 1, 0, 0 },{1, 0, 0, 0, 0, 1, 0, 0 },{1, 0, 0, 0, 0, 1, 0, 0 },{1, 1, 1, 1, 1, 1, 1, 0 },{1, 1, 0, 0, 0, 0, 1, 0 },{1, 1, 0, 0, 0, 0, 1, 0 },{1, 1, 1, 1, 1, 1, 1, 0 },{0, 0, 0, 0, 0, 0, 0, 0 } }

};

for(i = 0; i < 2; i++) /* Tampilkan huruf */{

for(j = 0; j < 8; j++){

for(k = 0; k < 8; k++)if(data_huruf[i][j][k] != 0)

putchar('\xDB');else

putchar(' '); /* spasi */printf("\n"); /* pindah baris */

}printf("\n"); /* pindah baris */

}}

Contoh Eksekusi :

Page 87: Pemograman Bahasa C

6.4. Inisialisasi Array Tak Berukuran

Inisialisasi array yang tak berukuran dapat dilakukan untuk array berdimensi satu atau lebih.

Untuk array berrdimensi lebih dari satu, dimensi terkirilah yang boleh tak berukuran. Dengan cara ini

tabel dalam array dapat diperluas atau dikurangi tanpa mengubah ukuran array. Sebagai contoh :

tak berukuran

int skala[] = { 1, 2, 4, 6, 8 };

merupakan pendeklarasian array berdimensi satu yang tak berukuran. Secara otomatis

skala[ 0 ] bernilai 1

skala[ 1 ] bernilai 2

skala[ 2 ] bernilai 4

skala[ 3 ] bernilai 6

skala[ 4 ] bernilai 8

Contoh lain :

char konversi[][2] = { ’A’, ’T’, ’E’, ’M’, ’I’, ’V’, ’O’, ’S’, ’U’, ’J’, };

Pada contoh ini,

konversi[0][0] bernilai ’A’

konversi[0][1] bernilai ’T’

konversi[1][0] bernilai ’E’

konversi[1][1] bernilai ’M’

……..

Contoh berikut akan menyandikan suatu kalimat yang dimasukkan melalui keyboard dengan

menggunakan data yang ada pada tabel konversi. Misal, huruf A akan diganti menjadi T, huruf T

akan diganti menjadi A.

/* File program : sandi.ccontoh inisialisasi array tak berukuran */

#include <stdio.h>#include <stdlib.h>

Page 88: Pemograman Bahasa C

#define JUM_KOLOM 2#define MAX_KAR 256

main(){

char konversi[][JUM_KOLOM] = {'A', 'T','a', 't','E', 'M','e', 'm','I', 'V','i', 'v','O', 'S','o', 's','U', 'J','u', 'j'

};

char kalimat[MAX_KAR], karakter;int i = 0, j, jum_kar, jum_penyandi;

printf("Masukkan sebuah kalimat dan akhiri dengan ENTER\n");

printf("Kemudian kalimat tsb akan saya sandikan\n");printf("Kalimat: ");

/* Memasukkan data karakter ke array kalimat */while((kalimat[i] = getchar()) != '\n')

i++;jum_kar = i ;

/* sandikan dan menampilkan ke layar */printf("\nHasil setelah disandikan: ");jum_penyandi = sizeof(konversi) / JUM_KOLOM;

for(i = 0; i < jum_kar; i++){

karakter = kalimat [i];for(j = 0; j < jum_penyandi; j++){

if(karakter == konversi[j][0]){

karakter = konversi[j][1];break; /* keluar dari for terdalam */

}if(karakter == konversi[j][1]){

karakter = konversi[j][0];break; /* keluar dari for terdalam */

}}putchar (karakter);

}

Page 89: Pemograman Bahasa C

printf("\n\n");}

Contoh Eksekusi :

Masukkan sebuah kalimat dan akhiri dengan ENTER Kemudian kalimat tsb akan saya sandikan Kalimat : Saya belajar

Hasil setelah disandikan: Otyt bmltutr

Pada program diatas ,

sizeof(konversi)/JUM_KOLOM)

merupakan ungkapan untuk memperoleh banyaknya baris (ukuran dari dimensi pertama) dalam array

konversi. Dengan cara ini tabel konversi dapat diperluas tanpa perlu memberitahu banyaknya jumlah

dimensi pertama secara ekplisit.

6.5. Array Sebagai Parameter

Array juga dapat dilewatkan sebagai parameter fungsi. Sebagai contoh ditujukan pada

program sorting.c. Program digunakan untuk memasukkan sejumlah data, kemudian data tersebut

diurutkan naik (ascending) dan dicetak ke layar.

Untuk melakukan sorting (proses pengurutan data), cara yang dipakai yaitu metode buble sort

(suatu metode pengurutan yang paling sederhana, dan memiliki kecepatan pengurutan yang sangat

lambat).

Algoritma pada metode pengurutan ini adalah sebagai berikut :

1. Atur i bernilai 0

2. Bandingkan x[i] dengan x[j], dengan j berjalan dari i + 1 sampai dengan n-1.

3. Pada setiap pembandingan, jika x[i] > x[j], maka isi x[i] dan x[j] ditukarkan

4. Bila i < (n – 1), ulangi mulai langkah 2.

Catatan: i = indeks array

x = nama array untuk menyimpan data

n = jumlah data

Algoritma diatas berlaku untuk pengurutan menaik (ascending). Untuk pengurutan menurun

(descending), penukaran dilakukan jika x[i] < x[j].

Page 90: Pemograman Bahasa C

Penjelasan proses pengurutan terhadap 5 buah data ditunjukkan pada gambar 6.6. Data semula (sebelum pengurutan) adalah

50,5 30,3 20,2 25,2 31,3

Setelah pengurutan menaik (secara ascending), hasil yang diharapkan berupa

20,2 25,2 30,3 31,3 50,5

Gambar 6.6 Proses pengurutan data secara ascending dengan metode Buble Sort

/* File program : sorting.c */#include <stdio.h>

#define MAKS 20

void pemasukan_data(float [], int *);void pengurutan_data(float [], int);void penampilan_data(float [], int);

main()

50.5

30.3

20.2

25.2

31.3

0

1

2

3

4

i = 0 j = 1

30.3

50.5

20.2

25.2

31.3

20.2

50.5

30.3

25.2

31.3

20.2

50.5

30.3

25.2

31.3

j = 2 j = 3 j = 4

20.2

50.5

30.3

25.2

31.3

0

1

2

3

4

i = 1 j = 2

20.2

30.3

50.5

25.2

31.3

20.2

25.2

50.5

30.3

31.3

j = 3 j = 4

20.2

25.2

50.5

30.3

31.3

0

1

2

3

4

i = 2 j = 3

20.2

25.2

30.3

50.5

31.3

j = 4

20.2

25.2

30.3

50.5

31.3

0

1

2

3

4

i = 3 j = 4

20.2

25.2

30.3

31.3

50.5

Hasil akhir

Page 91: Pemograman Bahasa C

{float data[MAKS];int jum_data;

pemasukan_data(data, &jum_data);pengurutan_data(data, jum_data);penampilan_data(data, jum_data);

}

void pemasukan_data(float x[], int *pjumlah){

int jum, i;

printf("Jumlah data = ");scanf("%d", &jum);

for(i=0; i<jum; i++){

printf("Data ke-%d : ", i+1);scanf("%f", &x[i]);

}

*pjumlah = jum;}

void pengurutan_data(float x[], int jumlah){

int i, j;float smtr;

for(i=0; i<jumlah-1; i++)for(j=i+1; j<jumlah; j++)

if(x[i] > x[j]) /* penukaran data */{

smtr = x[i];x[i] = x[j];x[j] = smtr;

}}

void penampilan_data(float x[], int jumlah){

int i;

printf("\nData setelah diurutkan :\n\n");for (i=0; i<jumlah; i++)

printf("Data ke-%d : %g\n", i+1, x[i]);}

Contoh Eksekusi :

Jumlah data = 5

Page 92: Pemograman Bahasa C

Data ke-1 : 50.5Data ke-2 : 30.3Data ke-3 : 20.2Data ke-4 : 25.2Data ke-5 : 31.3Data setelah diurutkan

Data ke-1 : 20.2Data ke-2 : 25.2Data ke-3 : 30.3Data ke-4 : 31.3Data ke-5 : 50.5

Pada fungsi main( );

float data[MAKS];

merupakan instruksi untuk mendeklarasikan array data dengan elemen bertipe float dan

jumlahnya sebanyak MAKS elemen.

pemasukan_data(data, &jum_data);

merupakan instruksi untuk memanggil fungsi pemasukan_data ( ). Pada pemanggilan fungsi,

data merupakan array. Yang perlu diperhatikan, parameter array ditulis tanpa diawali dengan &,

sekalipun tujuan dari pemanggilan fungsi yaitu untuk mengisikan data ke array. Sebab nama

array tanpa kurung siku dalam parameter fungsi berarti ”alamat dari array”.

Sedangkan &jum_data berarti ”alamat dari jum_data”. Tanda & harus disertakan sebab variabel

jum_data akan diisi oleh fungsi pemasukan_data ().

pengurutan_data(data, jum_data);

Merupakan instruksi untuk menjalankan fungsi pengurutan _data (), dalam hal ini data

dilewatkan ke fungsi dengan referensi (memberikan alamat array), karena memang hal ini

merupakan cara satu-satunya untuk melewatkan array. Sedangkan jumlah data dilewatkan ke

fungsi dalam bentuk nilai (pemanggilan dengan nilai).

penampilan_data(data,jum_data);

Merupakan instruksi untuk memanggil fungsi penampilan_data().

Pada fungsi untuk pemasukan data, pengurutan data maupun penampilan data,

data[i]

menyatakan elemen data ke-i.

Beberapa hal tambahan yang perlu diketahui:

Untuk menyatakan alamat dari suatu elemen array, bentuk umumnya adalah

Page 93: Pemograman Bahasa C

&nama_array[indeks]

Misalnya,

&data[1]

menyatakan alamt dari elemen ke-1. Adapun

&data[0]

sama saja dengan:

data

Suatu array berdimensi satu dalam parameter formal dideklarasikan dengan bentuk

tipe nama_array[]

dengan di dalam tanda kurung siku tak disebutkan mengenai jumlah elemen. Jumlah elemen dinyatakan dalam parameter tersendiri (atau dinyatakan dalam bentuk variabel eksternal). Untuk array berdimensi lebih dari satu, kurung siku terkirilah yang kosong.

Kesimpulan :

Array adalah kumpulan dari nilai-nilai data bertipe sama dalam urutan tertentu yang

menggunakan sebuah nama yang sama.

Nilai-nilai data di suatu array disebut dengan elemen-elemen array.

Letak urutan dari elemen-elemen array ditunjukkan oleh suatu subscript atau indeks.

Array bisa berupa array berdimensi satu, dua, tiga atau lebih.

Data array akan disimpan dalam memori yang berurutan, dengan elemen pertama mempunyai

indeks yang bernilai 0.

Sebuah array dapat diinisialisasi sekaligus pada saat dideklarasikan, caranya saat

mendeklarasikan array, nilai-nilai yang diinisialisasikan dituliskan di antara kurung kurawal ({})

yang dipisahkan dengan koma.

Array juga dapat dilewatkan sebagai parameter fungsi.

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

Page 94: Pemograman Bahasa C

1. Deklarasikan sebuah variabel array (misalkan nama variabelnya = letters) yang

mengalokasikan untuk 10 elemen bertipe char.

2. Masukkan karakter ‘Z’ pada elemen yang ke-empat dari array letters.

3. Gunakan loop for untuk menghitung nilai akumulasi (total) dari seluruh isi sebuah array

integer (array of int, misalkan namanya = numbers) yang memliki 5 elemen.

4. Deklarasikan sebuah array multidimensi yang elemennya bertipe float (array of float,

misalkan namanya = balances) yang memiliki 3 baris dan 5 kolom.

5. Gunakan loop for untuk menghitung nilai total dari seluruh isi array balances di atas.

6. Deklarasikan sebuah array karakter (array of char, mislakan namanya = words) dan sekaligus

inisialisasikan dengan nilai string = “Hello”

7. Deklarasikan sebuah array karakter (array of char, mislakan namanya = stuff) dengan alokasi

50 elemen. Selanjutnya isikan dengan nilai string = “Welcome” pada body programnya

(bukan pada saat deklarasi)

8. Gunakan statemen printf() untuk menampilkan (di layar) isi elemen ke-tiga dari sebuah array

integer (array of int, misalkan namanya = totals)

9. Gunakan statemen printf() untuk menampilkan (di layar) string yang merupakan isi dari

sebuah array karakter (array of char, misalkan namanya = words)

10. Gunakan statemen scanf() untuk membaca string masukan dari keyboard dan

memasukkannya ke array words.

11. Tuliskan loop for untuk membaca 5 karakter (gunakan statemen scanf()) dan

memasukkannya ke dalam array words, mulai dari indeks 0.

BAB VIISTRING

Tujuan :

1. Menjelaskan tentang konsep string

2. Menjelaskan operasi I/O pada string.

3. Menjelaskan cara mengakses elemen string

4. Menjelaskan berbagai fungsi mengenai string

7.1 Konstanta dan Variabel String

String merupakan bentuk data yang biasa dipakai dalam bahasa pemrograman untuk

keperluan menampung dan memanipulasi data teks, misalnya untuk menampung (menyimpan) suatu

kalimat. Pada bahasa C, string bukanlah merupakan tipe data tersendiri, melainkan hanyalah

kumpulan dari nilai-nilai karakter yang berurutan dalam bentuk array berdimensi satu.

Page 95: Pemograman Bahasa C

7.1.1 Konstanta String

Suatu konstanta string ditulis dengan diawali dan diakhiri tanda petik ganda, misalnya:

“ABCDE”

Nilai string ini disimpan dalam memori secara berurutan dengan komposisi sebagai berikut:

memori rendah memori tingi

Gambar 7.1 Komposisi penyimpanan string dalam memori

Setiap karakter akan menempati memori sebesar 1 byte. Byte terakhir otomatis akan berisi

karakter NULL (\0). Dengan mengetahui bahwa suatu string diakhiri nilai NULL, maka akhir dari

nilai suatu string akan dapat dideteksi. Sebagai sebuah array karakter, karakter pertama dari nilai

string mempunyai indeks ke-0, karakter kedua mempunyai indeks ke-1, dan seterusnya.

7.1.2 Variabel String

Variabel string adalah variabel yang dipakai utuk menyimpan nilai string. Misalnya

char name[15];

merupakan instruksi untuk mendeklarasikan variabel string dengan panjang maksimal 15 karakter

(termasuk karakter NULL). Deklarasi tersebut sebenarnya tidak lain merupakan deklarasi array

bertipe char.

7.2 Inisialisasi String

Suatu variabel string dapat diinisialisasi seperti halnya array yang lain. Namun tentu saja

elemen terakhirnya haruslah berupa karakter NULL. Sebagai contoh :

char name[] = {'R','I','N', 'I',’\0’};

yang menyatakan bahwa name adalah variabel string dengan nilai awal berupa string : “RINI” .

Bentuk inisialisasi yang lebih singkat :

char name[] = “RINI”;

A B C D E \0

Page 96: Pemograman Bahasa C

Pada bentuk ini, karakter NULL tidak perlu ditulis. Secara implisit akan disisipkan oleh kompiler.

Perlu diperhatikan, bila name dideklarasikan sebagai string, penugasan (assignment) suatu string ke

variabel string seperti

name = “RINI”;

adalah tidak diperkenankan. Pengisian string ke variabel string akan dibahas pada sub bab

berikutnya.

7.3 Input Output Data String

7.3.1 Memasukkan Data String

Pemasukan data string ke dalam suatu variabel biasa dilakukan dengan fungsi gets() atau

scanf(). Bentuk umum pemakaiannya adalah sebagai berikut :

#include <stdio.h>gets(nama_array);

atau

#include <stdio.h>scanf(“%s”, nama_array);

Perhatikan : nama_array adalah variabel bertipe array of char yang akan digunakan untuk

menyimpan string masukan.

Di depan nama_array tidak perlu ada operator & (operator alamat), karena

nama_array tanpa kurung siku sudah menyatakan alamat yang ditempati oleh

elemen pertama dari array tsb.

Kalau memakai scanf(), data string masukan tidak boleh mengandung spasi.

Di bawah ini diberikan contoh program untuk memasukkan data nama seseorang ke dalam array

bernama name.

/* File program : yourname.cContoh memasukkan data string dari keyboard */

#include <stdio.h>

main(){

char name[15];

printf("Masukkan nama Anda : ");gets(name);

printf("\nHalo, %s. Selamat belajar string.\n", name);}

Page 97: Pemograman Bahasa C

Contoh eksekusi :

Masukkan nama Anda : SAIFUDDINHalo, SAIFUDDIN. Selamat belajar string.

Ruang yang disediakan setelah deklarasi: char name[15];

name :

Setelah data yang dimasukkan berupa : SAIFUDDIN

name :

karakter NULL

byte sisa tak dipakai

Gambar 7.2 Variabel string dan data string

Pada gambar di atas nama array tanpa kurung siku (name) menyatakan alamat dari lokasi data

string. Dan dengan pemasukan data seperti di atas, lokasi memori yang terletak sesudah lokasi yang

berisi ‘N’ akan secara otomatis terisi karakter NULL (lihat gambar 7.2)

Perlu diketahui, fungsi gets() akan membaca seluruh karakter yang diketik melalui keyboard

sampai tombol ENTER ditekan. Dalam hal ini tidak ada pengecekan terhadap batasan panjang array

yang merupakan argumennya. Jika string yang dimasukkan melebihi ukuran array, maka sisa string

(panjang string masukan dikurangi ukuran array plus karakter NULL) akan ditempatkan di lokasi

sesudah bagian akhir dari array tersebut. Tentu saja kejadian seperti ini bisa menimbulkan hal yang

tidak diinginkan, misalnya berubahnya isi variabel yang dideklarasikan sesudah array tersebut

karena tertumpuki oleh string yang dimasukkan (overwrite), atau perilaku program yang sama sekali

berbeda dengan kemauan user yang dalam hal ini pelacakan kesalahannya (debugging) sangat sulit

dilakukan, atau bahkan terjadi penghentian program secara tidak normal.

Untuk mengatasi hal itu, disarankan untuk menggunakan fungsi fgets() untuk menggantikan

fungsi gets() dalam memasukkan data string.

S A I F U D D I N \0

Page 98: Pemograman Bahasa C

Bentuk umum pemakaian fgets() adalah :

#include <stdio.h>fgets(nama_array, sizeof nama_array, stdin);

Untuk lebih jelasnya, perhatikan contoh penggunaan fungsi fgets() ini pada contoh program untuk

menghitung karakter masukan (hitkar.c) di halaman ??????.

7.3.2 Menampilkan Isi Variabel String

Untuk menampilkan isi variabel string, fungsi yang digunakan adalah puts() atau printf().

Bentuk umum pemakaiannya adalah sebagai berikut :

#include <stdio.h>puts(var_string);

atau

printf("%s",var_string);

Dalam hal ini var_string adalah sebuah variabel yang berupa sebuah array of char. Fungsi puts()

akan menampilkan isi dari var_string dan secara otomatis menambahkan karakter '\n' di akhir string.

Sedangkan fungsi printf() akan menampilkan isi variabel string tanpa memberikan tambahan '\n'.

Sehingga, agar kedua pernyataan di atas memberikan keluaran yang sama, maka pada pernyataan

printf() dirubah menjadi :

printf("%s\n", var_string);

Contoh program berikut akan menampilkan isi variabel kompiler_c, berdasarkan dua bentuk

inisialisasi string yang dibahas pada sub bab 7.3

/* File program : initstr.c Contoh inisialisasi string */

#include <stdio.h>

void bentuk1(void);void bentuk2(void);

main(){

bentuk1();bentuk2();

}

Page 99: Pemograman Bahasa C

void bentuk1(void){

char kompiler_c[] ={'V','i','s','u','a','l',' ','C','+','+','\0'};

puts(kompiler_c);}

void bentuk2(void){

char kompiler_c[] = "Visual C++";printf("%s\n", kompiler_c);

}

Contoh eksekusi :

Visual C++Visual C++

7.4 Mengakses Elemen String

Variabel string merupakan bentuk khusus dari array bertipe char. Oleh karena itu, elemen

dari variabel string dapat diakses seperti halnya pengaksesan elemen pada array. Program berikut

menunjukkan cara mengakses elemen array untuk menghitung total karakter dari string yang

dimasukkan melalui keyboard.

/* File Program : hitkar.cContoh untuk menghitung banyaknya karakter dari suatu string yang dimasukkan melalui keyboard */

#include <stdio.h>

#define MAKS 256

main(){

int i, jumkar = 0;char teks[MAKS];

puts("Masukkan suatu kalimat (maks 255 karakter).");puts("Saya akan menghitung jumlah karakternya.\n");fgets(teks, sizeof teks, stdin);for(i=0; teks[i]; i++)

jumkar++;

printf("\nJumlah karakter = %d\n", jumkar);}Contoh eksekusi :

Masukkan satu kalimat (maks 255 karakter).

Page 100: Pemograman Bahasa C

Saya akan menghitung jumlah karakternya.

SAYA SUKA BELAJAR BAHASA C

Jumlah karakter = 26

Perhitungan jumlah karakter dari string teks dapat dilakukan dengan memeriksa elemen dari string

dimulai dari posisi yang pertama (indeks ke-0) sampai ditemukannya karakter NULL. Elemen yang

ke-i dari teks dinyatakan dengan

teks[i]

Pemeriksaan terhadap teks[i] selama tidak berupa karakter NULL (dimulai dari indeks ke-0)

dilakukan dengan instruksi

for(i=0; teks[i]; i++) jumkar++;

Kondisi teks[i] pada for mempunyai makna yang secara implisit berupa

teks[i] != ‘\0;

atau “karakter yang ke-i dari teks tidak sama dengan karakter NULL”

Contoh berikut ini akan memberikan gambaran mengenai cara menyalin nilai ke suatu variabel

string.

/* File program : salinstr.c Contoh menyalin suatu string */

#include <stdio.h>

#define MAKS 30

main(){

int i;char keterangan[] = “Saya menyukai bahasa C”;char kalimat[MAKS];

i=0;while (keterangan[i] != ‘\0’)

{kalimat[i] = keterangan[i];i++;

}kalimat[i] = ‘\0’; /* beri karakter NULL */printf(“Isi kalimat : %s\n”, kalimat);

}

Page 101: Pemograman Bahasa C

Contoh eksekusi :

Isi kalimat : Saya menyukai bahasa C

Untuk menyalin isi variabel string keterangan ke kalimat, pernyataan yang digunakan berupa

i=0;while (keterangan[i] != ‘\0’)

{kalimat[i] = keterangan[i];i++;

}

Selama keterangan[i] tidaklah berupa karakter NULL, maka keterangan[i] disalin ke kalimat[i].

Jelas bahwa di dalam loop while tidak terdapat penyalinan karakter NULL dari keterangan ke

kalimat. Oleh karena itu sekeluarnya dari loop while, pemberian karakter NULL ke kalimat perlu

dilakukan. Pernyataan yang digunakan berupa

kalimat[i] = ‘\0’;

Bentuk yang lebih singkat untuk melakukan penyalinan dari keterangan ke kalimat berupa

i=0;while (kalimat[i] = keterangan[i])

i++;

Dengan penulisan seperti di atas, penyalinan karakter NULL juga akan dilakukan secara otomatis.

Setelah menyalin karakter NULL (karena kondisi bernilai NULL) maka eksekusi terhadap loop akan

dihentikan. Dengan demikian sekeluarnya dari loop tidak perlu lagi ada pernyataan.

kalimat[i] = ‘\0’;

7.5 Fungsi-Fungsi Mengenai String

Berikut ini akan dibahas beberapa fungsi pustaka yang umumnya disediakan oleh kompiler C

untuk mengoperasikan suatu nilai string. Fungsi-fungsi pustaka untuk operasi string, prototype-

prototype nya berada di file judul string.h. Beberapa di antara fungsi pustaka untuk operasi string

akan dibahas di bawah ini.

7.5.1 Fungsi strcpy() untuk Menyalin Nilai String

Bentuk pemakaian :

#include <string.h>strcpy(tujuan, asal)

Page 102: Pemograman Bahasa C

Fungsi ini dipakai untuk menyalin string asal ke variabel string tujuan termasuk karakter '\0'.

Keluaran dari fungsi ini (return value) adalah string tujuan. Dalam hal ini, variabel tujuan haruslah

mempunyai ukuran yang dapat digunakan untuk menampung seluruh karakter dari string asal.

Contoh implementasinya bisa dilihat pada program salinstr2.c di bawah ini.

/* File program :salinstr2.c Contoh menyalin isi str2 ke str1 */

#include <stdio.h>#include <string.h>

#define MAKS 80

main(){

char str1[MAKS];char str2[]="ABCDE";

strcpy(str1, str2); /* menyalin isi str2 ke str1 */printf("String pertama adalah : %s\n", str1);printf("String kedua adalah : %s\n", str2);

}

Contoh eksekusi :

String pertama adalah : ABCDString kedua adalah : ABCD

7.5.2 Fungsi strlen() untuk Mengetahui Panjang Nilai String

Bentuk pemakaian :

#include <string.h>strlen(var_string);

Fungsi ini digunakan untuk memperoleh banyaknya karakter di dalam string yang menjadi

argumennya (var_string). Keluaran dari fungsi ini adalah panjang dari var_string. Karakter NULL

tidak ikut dihitung. Contoh implementasinya bisa dilihat pada program panjangstr.c di bawah ini.

/* File program : panjangstr.cContoh memperoleh panjang suatu string */

#include <stdio.h>#include <string.h>

main(){

Page 103: Pemograman Bahasa C

char salam[] = "Halo";

printf("Panjang string = %d karakter\n", strlen(salam));}

Contoh eksekusi :Panjang string = 4 karakter

7.5.3 Fungsi strcat() untuk Menggabung Nilai String

Bentuk pemakaian :

#include <string.h>strcat(tujuan, sumber);

Menggabungkan dua buah nilai string tidak dapat dilakukan dengan operator ‘+’, karena

operator ini bukan operator untuk operasi string. Penggabungan dua buah nilai string dapat

dilakukan dengan fungsi pustaka strcat() dengan menambahkan string sumber ke bagian akhir dari

string tujuan. Keluaran dari fungsi ini adalah string tujuan. Contoh implementasinya bisa dilihat

pada program gabungstr.c di bawah ini.

/* File program :gabungstr.c Contoh menggabungkan isi string1 dengan string2 */

#include <stdio.h>#include <string.h>

#define PJG 15

main(){

char str1[PJG], str2[PJG];

strcpy(str1, “sala”); /* str1 diisi “sala” */strcpy(str2, “tiga”); /* str2 diisi “tiga” */

strcat(str1, str2); /* tambahkan str2 ke akhir str1 */

printf(“str1 %s str2 %s\n”, str1, str2);}

Contoh eksekusi :

str1 salatiga str2 tiga

Page 104: Pemograman Bahasa C

Dalam hal ini str1 (“sala”) digabungkan dengan str2 (“tiga”) dengan hasilnya berada di str1

(“salatiga”).

7.5.4 Fungsi strcmp() untuk Membandingkan Dua Nilai String

Membandingkan dua nilai string juga tidak dapat digunakan dengan operator hubungan,

karena operator tersebut tidak untuk operasi string. Membandingkan dua buah nilai string dapat

dilakukan dengan fungsi pustaka strcmp().

Contoh bentuk pemakaian fungsi :

#include <string.h>strcmp(str1, str2);

Fungsi ini dipakai untuk membandingkan string str1 dengan string str2. Keluaran dari fungsi

ini bertipe int yang berupa nilai :

-1, jika str1 kurang dari str2

0, jika str1 sama dengan str2

1, jika str1 lebih dari str2

Pembandingan dilakukan untuk karakter pada posisi yang sama dari str1 dan str2, dimulai

dari karakter terkiri. Acuan pembandingan dari dua buah karakter didasarkan oleh nilai ASCII-nya.

Misal, karakter ‘A’ lebih kecil daripada ‘B’ dan karakter ‘B lebih kecil daripada ‘C’. Contoh

implementasinya bisa dilihat pada program bandingstr.c di bawah ini.

/* File program :bandingstr.c Contoh membandingkan isi dua buah string */

#include <stdio.h>#include <string.h>

main(){

char str1[]="HALO”;char str2[]="Halo";char str3[]="HALO”;

printf(“Hasil pembandingan %s dengan %s --> %d\n”, str1, str2, strcmp(str1, str2));

printf(“Hasil pembandingan %s dengan %s --> %d\n”, str2, str1, strcmp(str2, str1));

printf(“Hasil pembandingan %s dengan %s --> %d\n”, str1, str3, strcmp(str1, str3));

}

Contoh eksekusi :

Page 105: Pemograman Bahasa C

Hasil pembandingan HALO dengan Halo --> -1Hasil pembandingan Halo dengan HALO --> 1Hasil pembandingan HALO dengan HALO --> 0

7.5.5 Fungsi strchr() untuk Mencari Nilai Karakter dalam String

Bentuk pemakaian :

#include <string.h>strchr(var_string, kar);

Fungsi ini dapat digunakan untuk mencari suatu nilai karakter yang berada dalam suatu nilai

string. Dalam hal ini adalah mencari karakter kar dalam string var_string. Keluaran dari fungsi ini

adalah alamat posisi dari karakter pertama pada nilai string, yang sama dengan karakter yang dicari.

Jika karakter yang dicari tidak ada dalam nilai string, maka fungsi ini akan memberikan hasil nilai

pointer kosong (null). Contoh implementasinya bisa dilihat pada program carikar.c di bawah ini.

/* File program : carikar.c Contoh mencari karakter dalam sebuah string */

#include <stdio.h>#include <string.h>

main(){

char str[]="ABcde”; /* inisialisasi string */char *hasil1,*hasil2;/* var bertipe pointer to char, agar bisa ditampilkan isi dari alamat yang ditunjuk oleh hasil1 & hasil2 */

hasil1 = strchr(str, ‘B’);hasil2 = strchr(str, ‘X’);

printf(“Dari string ABcde\n”);printf(“Mencari karakter B = %s\n”, hasil1);printf(“Mencari karakter X = %s\n”, hasil2);

}

Contoh eksekusi :

Dari string ABcdeMencari karakter B = BcdeMencari karakter X = (null)

Contoh di atas menunjukkan penggunaan fungsi strchr() untuk mencari nilai karakter ‘B’ dan

karakter ‘X’ dalam string ‘ABcde’. Karakter ‘B’ ada dalam nilai string yang dicari, sehingga fungsi

strchr() memberikan hasil alamat dari karakter B tersebut yang kemudian alamat ini disimpan dalam

Page 106: Pemograman Bahasa C

variabel pointer hasil1. Jika variabel pointer hasil1 ini ditampilkan dengan menggunakan kode

format untuk nilai string (%s), maka mulai dari alamat tersebut sampai dengan akhir dari nilai string

yang bersangkutan akan ditampilkan, sehingga didapatkan keluaran :

Mencari karakter B = Bcde

Sedangkan pencarian karakter ‘X’ memberikan hasil null karena karakter tersebut tidak ditemukan

dalam string ‘ABcde”, sehingga didapatkan keluaran :

Mencari karakter X = (null)

Keterangan lebih lanjut tentang pointer ini, akan dibahas pada bab XIII.

Kesimpulan :

String merupakan bentuk data yang biasa dipakai dalam bahasa pemrograman untuk keperluan

menampung dan memanipulasi data teks.

Pada bahasa C, string bukanlah merupakan tipe data tersendiri, melainkan hanyalah kumpulan

dari nilai-nilai karakter yang berurutan dalam bentuk array berdimensi satu

Suatu konstanta string ditulis dengan diawali dan diakhiri tanda petik ganda

Pemasukan data string ke dalam suatu variabel biasa dilakukan dengan fungsi gets() atau scanf().

Untuk menampilkan isi variabel string, fungsi yang digunakan adalah puts() atau printf().

Untuk mengoperasikan suatu nilai string ada beberapa fungsi pustaka yang prototype-prototype-

nya berada di file judul string.h, sehingga dalam suatu program yang di dalamnya terdapat

manipulasi string, haruslan ditambah : #include <string.h>.

Beberapa fungsi untuk manipulasi string adalah sbb :

a. Fungsi strcpy() untuk menyalin nilai string

b. Fungsi strlen() untuk mengetahui panjang nilai string

c. Fungsi strcat() untuk menggabung nilai string

d. Fungsi strcmp() untuk membandingkan dua nilai string

e. Fungsi strchr() untuk mencari nilai karakter dalam string

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Ketikkan sebuah kalimat melalui keyboard dengan menggunakan gets() (atau fgets())

kemudian didapatkan keluaran berupa laporan tentang jumlah huruf kecil dan huruf kapital

dalam kalimat tsb.

Page 107: Pemograman Bahasa C

2. Masukkan nama Anda, rubah ke dalam huruf besar semua, balikkan urutan hurufnya,

selanjutnya tampilkan hasilnya di layar.

3. Ketikkan sebuah kalimat, hitung dan tampilkan jumlah spasinya.

4. Ketikkan sebuah kalimat, kemudian tampilkan kalimat tsb satu kata perbaris. Asumsikan ada

satu spasi yang memisahkan setiap kata dan kalimat diakhiri dengan sebuah tanda titik.

5. Ketikkan sebuah kalimat melalui keyboard kemudian didapatkan keluaran berupa laporan

apakah kalimat tsb palindrom ataukah bukan. Misal :

Kalimat : KASUR RUSAK

Termasuk PALINDROM

Kalimat : MAKAN MALAM

Bukan PALINDROM

Catatan : disebut palindrom adalah bila urutan kalimat dibalik akan menghasilkan kalimat yang sama. Gunakan berbagai fungsi berkaitan dengan string yang sudah dijelaskan di atas.

Page 108: Pemograman Bahasa C

BAB VIII

Pointer

Tujuan :

1. Menjelaskan tentang konsep dari variabel pointer

2. Menjelaskan tentang pointer array

3. Menjelaskan tentang pointer string

4. Menjelaskan tentang array pointer

5. Menjelaskan tentang pointer dalam fungsi

6. Menjelaskan tentang pointer sebagai parameter fungsi

7. Menjelaskan tentang pointer yang menunjuk pointer.

8.1 Konsep Dasar Pointer

Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke obyek lain. Pada

kenyataan yang sebenarnya, variabel pointer berisi alamat dari suatu obyek lain (yaitu obyek yang

dikatakan ditunjuk oleh pointer). Sebagai contoh, px adalah variabel pointer dan x adalah variabel

yang ditunjuk oleh px. Kalau x berada pada alamat memori (alamat awal) 1000, maka px akan berisi

1000. Sebagaimana diilustrasikan pada gambar 8.1 di bawah ini

pxzzzz

Address

1000x

Gambar 8.1 Variabel pointer px menunjuk ke variabel x

8.2 Mendeklarasikan Variabel Pointer

Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :

1000

?

tipe *nama_variabel

Page 109: Pemograman Bahasa C

dengan tipe dapat berupa sembarang tipe yang sudah dibahas pada bab-bab sebelumnya, maupun

bab-bab berikutnya. Adapun nama_variabel adalah nama dari variabel pointer. Sebagai contoh :

int px; / *contoh 1 */char *pch1, *pch2; / *contoh 2 */

Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu data bertipe

int, sedangkan contoh kedua masing pch1 dan pch2 adalah variabel pointer yang menunjuk ke data

bertipe char.

8.3 Mengatur Pointer agar Menunjuk ke Variabel Lain

Agar suatu pointer menunjuk ke variabel lain, mula-mula pointer harus diisi dengan alamat

dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu variabel, operator &

(operator alamat, bersifat unary) bisa dipergunakan, dengan menempatkannya di depan nama

variabel. Sebagai contoh, bila x dideklarasikan sebagai variabel bertipe int, maka

&xberarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke suatu variabel pointer px

(yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int) yaitu :

Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel x. Setelah pernyataan

tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel x.

8.4 Mengakses Isi Suatu Variabel Melalui Pointer

Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung) ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak langsung dilakukan dengan menggunakan operator indirection (tak langsung) berupa simbol * (bersifat unary). Contoh penerapan operator * yaitu :

*pxyang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px” . Sebagai contoh jika y

bertipe int, maka sesudah dua pernyataan berikut

px = &x;

px = &x;y = *px;

menyatakan variabel pointer

char *pch1, *pch2; tanda akhir pernyataan deklarasi

nama variabel pointertipe data yang ditunjukoleh variabel pointer

Gambar 8.2 Ilustrasi pendeklarasian variabel pointer

Page 110: Pemograman Bahasa C

y akan berisi nilai yang sama dengan nilai x. Untuk lebih jelasnya perhatikan contoh program

ptr1.c

/* Program : ptr1.c */

#include <stdio.h>

main(){ int y, x = 87; /* x & y bertipe int */

int *px;/* var pointer yang menunjuk ke data yang bertipe int */

x = 87;

px = &x; /* px diisi dengan alamat dari variabel x */ y = *px; /* y diisi dengan nilai yg ditunjuk oleh px */

printf("Alamat x = %p\n", &x);printf("Isi px = %p\n", px);printf("Isi x = %d\n", x);printf("Nilai yang ditunjuk oleh px = %d\n", *px);printf("Nilai y = %d\n", y);

}Contoh eksekusi :Alamat x = 0012FF78Isi px = 0012FF78Isi x = 87Nilai yang ditunjuk oleh px = 87Nilai y = 87

Pada program di atas, dua pernyataan

sebenarnya dapat digantikan dengan sebuah pernyataan berupay = x;Seandainya pada program di atas tidak terdapat pernyataan

namun terdapat pernyataan

maka y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk ke variabel x. Hal seperti ini

harap diperhatikan. Kalau program melibatkan pointer, dan pointer belum diinisialisasi, ada

kemungkinan akan terjadi masalah yang dinamakan “bug” yang bisa mengakibatkan komputer tidak

dapat dikendalikan (hang).

Selain itu tipe variabel pointer dan tipe data yang ditunjuk harus sejenis. Bila tidak sejenis

maka akan terjadi hasil yang tidak diinginkan. Lebih jelasnya perhatikan contoh program ptr2.c.

px = &x;y = *px;

px = &x;

y = *px;

Page 111: Pemograman Bahasa C

/* Program : ptr2.c */

#include <stdio.h>

main(){

int *pu;int nu;int u = 1234;

pu = &u;nu = *pu;

printf("Alamat dari u = %p\n", &u);printf("Isi pu = %p\n", pu);printf("Isi u = %d\n", u);printf("Nilai yang ditunjuk oleh pu = %d\n", *pu);printf("Nilai nu = %d\n", nu);

}Pada contoh di atas, saat penugasan

pu = &u; maka pu akan menunjuk data berukuran 4 byte (tipe float) sekalipun u berukuran 2 byte (tipe int).

Oleh karena itu, pernyataan

nu = *pu; tidak akan membuat nu berisi nilai u. untuk lebih jelasnya lihat gambar berikut.

8.5 Mengakses dan Mengubah isi suatu variabel Pointer

Contoh berikut memberikan gambaran tentang pengubahan isi suatu variabel secara tak

langsung (yaitu melalui pointer). Mula-mula pd dideklarasikan sebagai pointer yang menunjuk ke

suatu data bertipe float dan d sebagai variabel bertipe float. Selanjutnya

d = 54.5; digunakan untuk mengisikan nilai 54,5 secara langsung ke variabel d. Adapun

pd = &d; digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd menunjuk ke variabel d.

Sedangkan pernyataan berikutnya

float *pu;float nu;int u;

- - - - - - - -pu = &u;

data yang ditunjuk oleh pu

bukan bagian dari u

u

Gambar 8.3 Ilustrasi kesalahan yang terjadi karena tipe tidak sejenis

Page 112: Pemograman Bahasa C

*pd = *pd + 10; (atau: *pd += 10; ) merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di atas berarti

“jumlahkan yang ditunjuk pd dengan 10 kemudian berikan ke yang ditunjuk oleh pd”, atau identik

dengan pernyataan

d = d + 10;Akan tetapi, seandainya tidak ada instruksi

pd = &d; maka pernyataan

*pd = *pd + 10; tidaklah sama dengan

d = d + 10;

/* Program : ptr3.c */

#include <stdio.h>

main(){

float d = 54.5f, *pd;

printf("Isi d mula-mula = %g\n", d);

pd = &d;*pd += 10;

printf("Isi d sekarang = %g\n", d);}Contoh eksekusi :Isi d mula-mula = 54.5Isi d sekarang = 64.58.5 Pointer dan Array

Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan berikut akan memberikan gambaran hubungan antara pointer dan array.

Misalnya dideklarasikan di dalam suatu fungsi static int tgl_lahir[3] = { 01, 09, 64 };

dan int *ptgl;

Kemudian diberikan instruksi ptgl = &tgl_lahir[0];

maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di atas bisa

juga ditulis menjadi

ptgl = tgl_lahir; sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah penugasan seperti di atas,

*ptgl dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array tgl_lahir.

Hal ini bisa dilihat melalui pembuktian program berikut.

/* Program : ptr4.c */

Page 113: Pemograman Bahasa C

#include <stdio.h>

main(){

static int tgl_lahir[] = {16, 4, 1974};int *ptgl;

ptgl = tgl_lahir;

printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);printf("Nilai dari tgl_lahir[0] = %d\n", tgl_lahir[0]);

}Contoh eksekusi :Nilai yang ditunjuk oleh ptgl = 16Nilai dari tgl_lahir[0] = 16

/* Program : ptr5.c */

#include <stdio.h>

main(){

static int tgl_lahir[] = {16, 4, 1974};int *ptgl, i;

ptgl = tgl_lahir;

printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);for (i=0; i<3; i++)

printf("Nilai dari tgl_lahir[i] = %d\n", *(ptgl+i));

}Contoh eksekusi:Nilai yang ditunjuk oleh ptgl = 16Nilai dari tgl_lahir[0] = 16Nilai dari tgl_lahir[1] = 4Nilai dari tgl_lahir[2] = 1974

/* Program : ptr6.c */

#include <stdio.h>

main(){

static int tgl_lahir[] = {16, 4, 1974};int i;int *ptgl;

ptgl = tgl_lahir;

printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);for (i=0; i<3; i++)

Page 114: Pemograman Bahasa C

printf("Nilai dari tgl_lahir[i] = %d\n", *ptgl++);}Keterangan : tgl_lahir[i] = *(ptgl+i) = *ptgl++8.6 Pointer dan String

Contoh hubungan pointer dan string ditunjukkan pada program berikut.

/* Program : ptr4.c */

#include <stdio.h>

main(){ /* pkota menunjuk konstanta string “SEMARANG” */ char *pkota = “SEMARANG”; printf(“String yang ditunjuk olej pkota = ”);

puts(pkota);}Contoh eksekusi :String yang ditunjuk oleh pkota = SEMARANG

Pada program di atas, char *pkota = “SEMARANG”;

akan menyebabkan kompiler mengalokasikan variabel pkota sebagai variabel pointer yang menunjuk ke obyek bertipe char

dan menempatkan konstanta “SEMARANG” dalam suatu memori

kemudian pointer pkota akan menunjuk ke lokasi string “SEMARANG”.

Pernyataan di atas menyerupai pernyataan char kota[] = “SEMARANG”;

tetapi sebenarnya kedua pernyataan inisialisasi di depan tidaklah tepat sama. Sebab pkota adalah

pointer (menyatakan alamat) yang dengan mudah dapat diatur agar menunjuk ke string lain (bukan

string “SEMARANG”), sedangkan kota adalah array (array menyatakan alamat yang konstan, tak

dapat diubah). Perhatikan dua program di bawah ini

/* Program : arrnama.c Menukarkan isi 2 string tanpa pemakaian pointer */

#include <stdio.h>#include <string.h>

#define PANJANG 20

pkota

SEMARANG\0

Lokasi awal string “SEMARANG”

Gambar 8.4 Pointer menunjuk data string

Page 115: Pemograman Bahasa C

char nama1[PANJANG] = "JAMES BOND";char nama2[PANJANG] = "HERCULE POIROT"; main(){ char namax[PANJANG];

puts("SEMULA : ");printf("nama1 --> %s\n", nama1);

printf("nama2 --> %s\n", nama2);

strcpy(namax, nama1);strcpy(nama1, nama2);strcpy(nama2, namax);

puts("KINI : ");printf("nama1 --> %s\n", nama1);

printf("nama2 --> %s\n", nama2);}

/* Program : ptrnama.c Menukarkan isi 2 string dengan fasilitas pointer */

#include <stdio.h>#include <string.h>

char *nama1 = "JAMES BOND";char *nama2 = "HERCULE POIROT"; main(){ char *namax;

puts("SEMULA : ");printf("nama1 --> %s\n", nama1);

/* nama1:pointer yg menunjuk ke string JAMES BOND */printf("nama2 --> %s\n", nama2);

/* nama2:pointer yg menunjuk ke string HERCULE POIROT */

namax = nama1;nama1 = nama2;nama2 = namax;

puts("KINI : ");printf("nama1 --> %s\n", nama1);printf("nama2 --> %s\n", nama2);

}8.7 Array dari Pointer

Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Sebagai contoh:

char *namahari[10];

merupakan pernyataan untuk mendeklarasikan array pointer. Array namahari terdiri dari 10

elemen berupa pointer yang menunjuk ke data bertipe char.

Page 116: Pemograman Bahasa C

Array pointer bisa diinisialisasi sewaktu pendeklarasian. Sebagai contoh:

static char *namahari[] =

{“Senin”, “Selasa”, “Rabu”, “Kamis”, “Jumat”, “Sabtu”, “Minggu”};

Pada contoh ini,

namahari[0] berisi alamat yang menunjuk ke string “Senin”.

namahari[1] berisi alamat yang menunjuk ke string “Selasa”.

namahari[2] berisi alamat yang menunjuk ke string “Rabu”.

dan sebagainya.8.8 Pointer menunjuk Pointer

Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan contoh

mengenai pointer menunjuk pointer.

Untuk membentuk rantai pointer seperti pada gambar di atas, pendeklarasian yang diperlukan

berupa

int var_x;int *ptr1;int **ptr2;

Perhatikan pada deklarasi di depan:

var_x adalah variabel bertipe int.

ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.

ptr2 adalah variabel pointer yang menunjuk ke pointer int.

(itulah sebabnya deklarasinya berupa int **ptr2; )

Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa

?

?

?

?

?

xxxx

namahari

Gambar 8.5 Array pointer

Pointer ptr2

Pointer ptr1

Variabel var_x

alamat ptr1

alamat ptr1 nilai

Gambar 8.6 Pointer yang menunjuk pointer

Page 117: Pemograman Bahasa C

ptr1 = &var_x; Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang diperlukan adalah

ptr2 = &ptr1; Contoh berikut memberikan gambaran cara pengaksesan nilai pada var_x melalui pointer ptr2

dan ptr1.

/* File program : ppointer.cContoh program untuk pointer yang menunjuk pointer */

#include <stdio.h>

main(){ int var_x = 273;

int *ptr1;int **ptr2;

ptr1 = &var_x;

ptr2 = &ptr1;

printf("Nilai var_x = %d\n", *ptr1);printf("Nilai var_x = %d\n", **ptr2);

}Contoh eksekusi :Nilai var_x = 273Nilai var_x = 2738.9 Pointer dalam Fungsi

Pointer dan kaitannya dengan fungsi yang akan dibahas berikut meliputi :

Pointer sebagai parameter fungsi

Pointer sebagai keluaran fungsi

8.9.1 Pointer sebagai parameter fungsi

Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu variabel internal dapat

diubah oleh fungsi yang dipanggil.

Sebagai contoh dapat dilihat pada fungsi berikut.

void naikkan_nilai (int *x, int *y){ *x = *x + 2; *y = *y + 2;}

Fungsi di atas dimaksudkan agar kalau dipanggil, variabel yang berkenaan dengan parameter

aktual dapat diubah nilainya, masing-masing dinaikkan sebesar 2. Contoh pemanggilan :

naikkan_nilai(&a, &b); Perhatikan, dalam hal ini variabel a dan b harus ditulis diawali operator alamat (&) yang berarti

menyatakan alamat variabel, sebab parameter fungsi dalam pendefinisian berupa pointer.

/* Program : argptr.cFungsi dengan argumen berupa pointer */

Page 118: Pemograman Bahasa C

#include <stdio.h>

void naikkan_nilai(int *x, int *y);

main(){ int a = 3;

int b = 7;

printf("SEMULA : a = %d b = %d\n", a, b);

naikkan_nilai(&a, &b);printf("KINI : a = %d b = %d\n", a, b);

}

void naikkan_nilai(int *x, int *y){

*x = *x + 2;*y = *y + 2;

}Contoh eksekusi :Semula : a = 3 b = 7Kini : a = 5 b = 9

8.9.2 Pointer sebagai keluaran fungsi (return value)

Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Misalnya, suatu fungsi menghasilkan

keluaran berupa pointer yang menunjuk ke string nama_bulan, seperti pada contoh berikut.

char *nama_bulan(int n){ static char *bulan[]= {“Kode bulan salah”, “Januari”, “Februari”, Maret”,

“April”, “Mei”, “Juni”, “Juli”, "Agustus”, “September”, “Oktober”, “Nopember”,“Desember”

}; return ( (n<1 | | n>12) ? bulan[0] : bulan[n] );}

Pada definisi fungsi di atas, char *nama_bulan()

menyatakan bahwa keluaran fungsi nama_bulan() berupa pointer yang menunjuk ke obyek char

(atau string).

Dalam fungsi nama_bulan(), mula-mula array bernama bulan dideklarasikan dan sekaligus

diinisialisasi agar menunjuk sejumlah string yang menyatakan nama bulan. Di bagian akhir

fungsi, pernyataan

return ( (n<1 || n>12) ? bulan[0] : bulan[n] ); menyatakan bahwa hasil fungsi berupa pointer yang menunjuk ke

string “Kode bulan salah” (bulan[0]) jika masukan fungsi n<1 atau n>12

bulan[n] untuk n yang terletak antara 1 sampai dengan 12.

Page 119: Pemograman Bahasa C

/* File program : pbulan.c Fungsi dengan keluaran berupa pointer yang menunjuk string */

#include <stdio.h>

char *nama_bulan(int n);

main(){

int bl;

printf("Bulan 1..12 : ");scanf("%d", &bl);printf("Bulan ke-%d adalah %s\n", bl, nama_bulan(bl));

}

char *nama_bulan(int n){

static char *bulan[] = {"Kode bulan salah",

"Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","November","Desember"

};

return ((n<1||n>12) ? bulan[0] : bulan[n]);}

Kesimpulan

Tipe variabel pointer adalah tipe variabel yang berisi alamat dari variabel yang sebenarnya.

Tipe variabel pointer harus sama dengan tipe varibel yang ditunjuk.

Hubungan antara pointer dan array pada C sangatlah erat, sebab sesungguhnya array secara

internal akan diterjemahkan dalam bentuk pointer

Varibel pointer bisa berupa string, array atau tipe variabel yang lainnya.

Suatu pointer bisa saja menunjuk ke pointer lain (pointer to pointer)

Variabel pointer bisa digunakan sebagai parameter dalam sebuah fungsi, sebagaimana juga

bisa dijadikan sebagai nilai balik (return value) dari sebuah fungsi.

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1.Berapa nilai dari z dan s pada output program dibawah ini.

Page 120: Pemograman Bahasa C

/* Program : lat1.c */#include <stdio.h>

main(){

int z = 20, s = 30;int *pz, *ps;

pz = &z;ps = &s;

*pz += *ps;

printf("z = %d\n", z);printf("s = %d\n", s);

}2. Bagaimana bentuk output dari program dibawah ini ?/* Program : ps1.c */#include <stdio.h>

main(){

char c = 'Q';char *char_pointer = &c;

printf("%c %c\n", c, *char_pointer);c = '/';printf("%c %c\n", c, *char_pointer);*char_pointer = '(';printf("%c %c\n", c, *char_pointer);

}3. Buat program untuk menampilkan sebaris string seperti contoh berikut ;

“Selamat Pagi“

menggunakan variable pointer (pointer to string).

4. Buat potongan program untuk mencetak huruf ketiga ( L ) dari kata :

“P O L I T E K N I K “ dengan menggunakan variabel pointer .

BAB IXSTRUKTUR

Tujuan :

1. Menjelaskan cara mendeklarasikan struktur

2. Menjelaskan cara menginisialisasi struktur

3. Menjelaskan cara mengakses elemen struktur

4. Menjelaskan pemebentukan array dari struktur (array of struct)

5. Menjelaskan tentang hubungan antara struktur dengan fungsi

6. Menjelaskan tentang hubungan antara struktur dengan pointer

Page 121: Pemograman Bahasa C

Struktur adalah pengelompokan variabel-variabel yang bernaung dalam satu nama yang

sama. Berbeda dengan larik (array) yang berisi kumpulan variabel-variabel yang bertipe sama

dalam satu nama, maka suatu struktur dapat terdiri atas variabel-variabel yang berbeda tipenya dalam

satu nama struktur. Struktur biasa dipakai untuk mengelompokkan beberapa informasi yang

berkaitan menjadi sebuah kesatuan (dalam bahasa PASCAL, struktur disebut dengan record).

Variabel-variabel yang membentuk suatu struktur, selanjutnya disebut sebagai elemen dari struktur atau field. Dengan demikian dimungkinkan suatu struktur dapat berisi elemen-elemen data berbeda tipe seperti char, int, float, double, dan lain-lain. Contoh sebuah struktur adalah informasi data tanggal (date) yang berisi :

- day

- month, dan

- year

9.1 Mendefinisikan & Mendeklarasikan Struktur

Suatu struktur didefinisikan dengan menggunakan kata kunci struct. Contoh pendefinisian

sebuah tipe data struktur :

struct date {int month;int day;int year;

};yang mendefinisikan sebuah tipe data struktur bernama date yang memiliki tiga buah elemen (field)

berupa : - day

- month

- year

struct date { int month;

int day;int year;

};

Gambar 9.1 Pendefinisian tipe strukturUntuk mendeklarasikan sebuah variabel today yang bertipe struktur date pernyataan yang

diperlukan adalah sebagai berikut:

struct date today;

Gambar 9.2 Pendeklarasian variabel bertipe strukturPernyataan di atas menyatakan bahwa variabel today bertipe struktur date.

kata kunci nama tipe struktur

masing-masing disebut field atau elemen struktur

mengawali dan mengakhiri elemen-elemen struktur

variabel strukturnama tipe struktur

Page 122: Pemograman Bahasa C

Dalam mendefinisikan sebuah struktur, elemen yang terkandung di dalamnya bisa juga berupa sebuah struktur, contoh :

struct date {int month, day, year;

};

struct person {char name[30];struct date birthday;

};

struct person student;Diagram struktur data dari variabel student dapat digambarkan sbb :

name

student month

birthday day

year

Gambar 9.3. Struktur data dari variabel student

9.2 Mengakses Elemen Struktur

Elemen dari suatu variabel struktur dapat diakses dengan menyebutkan nama variabel

struktur diikuti dengan operator titik (‘.’) dan nama dari elemen strukturnya. Cara penulisannya

sebagai berikut

Untuk memberikan data nama ke field name dari variabel student di atas, maka pernyataan

yang diperlukan misalnya adalah :

strcpy(student.name, "MUHAMMAD IHSAN");

Pada pernyataan di atas, student.name dapat dibaca sebagai "field name dari student". Contoh

berikut merupakan instruksi untuk mengisikan data pada field birthday :

student.birthday.day = 10;

Sedangkan untuk mendapatkan isi suatu field dari variabel struktur, contohnya :

tgl = student.birthday.day;

puts(student.name);

Contoh pertama merupakan instruksi untuk memberikan isi dari field day ke variabel tgl. Sedangkan

contoh kedua merupakan instruksi untuk menampilkan isi dari field name.

Program berikut merupakan contoh yang melibatkan variabel struktur. Mula-mula field

dari struktur diisi dengan suatu data, kemudian isinya ditampilkan.

variabel_struktur.nama_field

Page 123: Pemograman Bahasa C

/* File program : student1.cMengisi field dr variabel struktur kemudian menampilkannya */

#include <stdio.h>#include <string.h>

struct date { /* definisi global dari tipe date */int month;int day;int year;

};

struct person { /* definisi global dari tipe person */char name[30];struct date birthday;

};

/* deklarasi global dari variabel student*/struct person student; main(){

/* memberikan nilai kepada field dari struktur student */strcpy(student.name, "MUHAMMAD IHSAN");student.birthday.month = 8;student.birthday.day = 10;student.birthday.year = 1970;

/* menampilkan isi semua field dari struktur student */printf("Name : %s\n", student.name);printf("Birthday : %d-%d-%d\n",student.birthday.month,

student.birthday.day, student.birthday.year );}Contoh eksekusi :Name : MUHAMMAD IHSANBirthday : 8-10-1970

9.3 Menginisialisasi Struktur

Sebuah struktur juga bisa diinisialisasi pada saat dideklarasikan. Hal ini serupa dengan

inisialisasi array, yaitu elemen-elemennya dituliskan di dalam sepasang kurung kurawal (‘{ }‘)

dengan masing-masing dipisahkan dengan koma. Deklarasi struktur didahului dengan kata kunci

static, contoh

static struct zodiak bintang =

{"Sagitarius", 22, 11, 21, 12};

Selengkapnya perhatikan contoh program di bawah ini.

/* File program : zodiak.cMenentukan zodiak berdasarkan data tanggal lahir masukan */

#include <stdio.h>

Page 124: Pemograman Bahasa C

main(){

struct zodiak { char nama[11];int tgl_awal;int bln_awal;int tgl_akhir;int bln_akhir;

};

static struct zodiak bintang ={"Sagitarius", 22, 11, 21, 12};int tgl_lhr, bln_lhr, thn_lhr;

printf("Masukkan tgl lahir Anda (XX-XX-XXXX): ");scanf("%d-%d-%d",&tgl_lhr, &bln_lhr, &thn_lhr);

if((tgl_lhr >= bintang.tgl_awal && bln_lhr == bintang.bln_awal) || (tgl_lhr <= bintang.tgl_akhir && bln_lhr == bintang.bln_akhir))printf("Bintang Anda adalah %s\n", bintang.nama);

elseprintf("Bintang Anda bukan %s\n", bintang.nama);

}Contoh eksekusi :Masukkan tgl lahir Anda (XX-XX-XXXX): 23–11-1972Bintang Anda adalah Sagitarius

9.4 Array dan Struktur

Elemen-elemen dari suatu array juga dapat berbentuk sebuah struktur. Misalnya array

yang dipakai untuk menyimpan sejumlah data siswa (struct student). Array struktur berdimensi satu

ini membentuk suatu tabel, dengan barisnya menunjukkan elemen dari array-nya dan kolomnya

menunjukkan elemen dari struktur. Dalam hal ini maka deklarasi yang dibutuhkan adalah sebagai

berikut :

#define MAKS 20...

struct date { /* definisi dari tipe date */int month;int day;int year;

};

struct person { /* definisi dari tipe person */char name[30];struct date birthday;

};

Page 125: Pemograman Bahasa C

/* deklarasi dari variabel array student */struct person student[MAKS];

yang artinya, mendeklarasikan array student yang memiliki elemen yang bertipe struct person

sebanyak MAKS. Setelah array student dideklarasikan, maka ruang yang disediakan ditunjukkan

dalam gambar 9.4 di bawah ini.

Gambar 9.4 Array dari struktur

Elemen-elemen dari array stuktur tersebut bisa diakses dengan cara sebagai berikut :

for (i=0; i<MAKS; i++) {

printf("Name : ");fgets(student[i].name, sizeof student[i].name,

stdin);printf("Birthday (mm-dd-yyyy): ");scanf("%d-%d-%d", &student[i].birthday.month,

&student[i].birthday.day, &student[i].birthday.year);

printf("\n");

/* hapus sisa data dalam penampung keyboard */fflush(stdin);

};Selengkapnya perhatikan contoh program di bawah ini.

/* File program : student2.cArray struktur untuk menyimpan data-data student */

#include <stdio.h>

#define MAKS 20

struct date { /* definisi global dr tipe date */int month;

birthday

name daymonth year

0

1

18

19

Page 126: Pemograman Bahasa C

int day;int year;

};struct person { /* definisi global dr tipe person */

char name[30];struct date birthday;

};

/* deklarasi global dari variabel student */struct person student[MAKS];

main(){

int i=0, sudah_benar, jml;char lagi;

/* memasukkan data */do {

printf("Name : ");fgets(student[i].name, sizeof student[i].name,

stdin);

printf("Birthday (mm-dd-yyyy): ");scanf("%d-%d-%d", &student[i].birthday.month,

&student[i].birthday.day, &student[i].birthday.year);

printf("\n");

i++;

printf("Mau memasukkan data lagi [Y/T] ? ");do {

lagi = getchar( ); /* baca tombol */sudah_benar = (lagi == 'Y') || (lagi== 'y')||

(lagi == 'T') || (lagi == 't');} while(! sudah_benar);

/* hapus sisa data dalam penampung keyboard */fflush(stdin);printf("\n");

} while(lagi == 'Y' || lagi == 'y');

jml = i;

/* menampilkan data */printf("DATA SISWA\n");for (i=0; i<jml; i++){

printf("%d. Name : %s", i+1, student[i].name);printf(" Birthday : %d-%d-%d\n\n",

student[i].birthday.month,student[i].birthday.day, student[i].birthday.year );

Page 127: Pemograman Bahasa C

};}Contoh eksekusi :Name : SalsabilaBirthday (mm-dd-yyyy) : 10-25-1979

Mau memasukkan data lagi [Y/T] ? y

Name : WildanBirthday (mm-dd-yyyy) : 4-16-1974

Mau memasukkan data lagi [Y/T] ? t

DATA SISWA1. Name : Salsabila

Birthday : 10-25-1979

2. Name : WildanBirthday : 4-16-1974

Di samping cara pendeklarasian di atas, struktur juga dapat dideklarasikan dalam berbagai

bentuk yang lain, di antaranya sbb :

struct date { int month, day, year;} today, tomorrow;

struct person {char name[30];struct date birthday;

} student[MAKS];yaitu mendefinisikan struktur date, sekaligus mendeklarasikan variabel today dan tomorrow dengan

tipe struktur date. Demikian juga mendefinisikan struktur person, sekaligus mendeklarasikan

variabel array student sebanyak MAKS elemen dengan tipe struktur person. Atau cara lainnya

mendefinisikan, mendeklarasikan sekaligus menginisialisasi struktur, sebagai berikut :

struct date { int month, day, year;} today = {5,14,2001};

9.5 Struktur dan Fungsi

Melewatkan sebuah struktur untuk menjadi parameter sebuah fungsi dapat dilakukan sama

dengan pengiriman parameter berupa variabel biasa. Fungsi yang mendapat kiriman parameter

tersebut juga bisa mengirimkan hasil baliknya yang juga berupa sebuah struktur (pass by reference).

9.5.1 Melewatkan Elemen Struktur ke dalam Fungsi

Melewatkan parameter berupa elemen struktur dapat dilakukan sebagaimana pengiriman

parameter berupa variabel biasa, dapat dilakukan baik secara nilai (pass by value) maupun secara

acuan (pass by reference).

Page 128: Pemograman Bahasa C

/* File program : cetak1.c Melewatkan elemen struktur sbg parameter fungsi scr nilai */

#include <stdio.h>

void cetak_tanggal(int mm, int dd, int yy);

main(){

struct date { /* definisi lokal dari tipe date */int month;int day;int year;

} today;

printf("Enter the current date (mm-dd-yyyy): ");scanf("%d-%d-%d", &today.month, &today.day, &today.year);

cetak_tanggal(today.month, today.day, today.year);}

void cetak_tanggal(int mm, int dd, int yy){

static char *nama_bulan[] = {"Wrong month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"

};

printf("Todays date is %s %d, %d\n\n", nama_bulan[mm],dd,yy);

}Contoh eksekusi :Enter the current date (mm-dd-yyyy): 5-29-2001Todays date is May 29, 2001

Tampak bahwa elemen dari struktur dilewatkan ke fungsi memakai bentuk pengaksesan elemen struktur, berupa :

cetak_tanggal(today.month, today.day, today.year);

Apabila nilai suatu elemen struktur diharapkan akan diubah oleh fungsi, maka yang

dilewatkan haruslah berupa alamat dari elemen struktur (pass by reference). Untuk keperluan ini,

operator alamat ditempatkan di depan nama variabel struktur (bukan di depan nama elemen struktur).

/* File program : posisi1.c Melewatkan elemen struktur sbg parameter fungsi scr acuan */

#include <stdio.h>

void tukar_xy(int *a, int *b);

main(){

Page 129: Pemograman Bahasa C

struct koordinat { int x;int y;

} posisi;

printf("Masukkan koordinat posisi (x, y) : ");scanf("%d, %d", &posisi.x, &posisi.y);

printf("x, y semula = %d, %d\n", posisi.x, posisi.y);

tukar_xy(&posisi.x, &posisi.y);

printf("x, y sekarang = %d, %d\n", posisi.x, posisi.y);}

void tukar_xy(int *a, int *b){

int z;

z = *a;*a = *b;*b = z;

}Contoh eksekusi :Masukkan koordinat posisi (x, y) : 34, 21x, y semula = 34, 21x, y sekarang = 21, 34

9.5.2 Melewatkan Struktur dalam Fungsi

Pada program cetak1.c di atas misalnya, semua elemen dari struktur dikirimkan ke fungsi

cetak_tanggal(), dengan maksud nilai elemen dari struktur akan ditampilkan di layar. Untuk

keadaan seperti ini, lebih baik kalau parameter fungsi diubah menjadi bentuk struktur, sehingga

parameter fungsi tidak lagi sebanyak tiga buah, melainkan hanya satu. Selengkapnya, perhatikan

program di bawah ini.

/* File program : cetak2.c Melewatkan struktur sebagai parameter fungsi */

#include <stdio.h>

struct date { /* definisi global dari tipe date */int month;int day;int year;

};

void cetak_tanggal(struct date now);

main(){

struct date today;

Page 130: Pemograman Bahasa C

printf("Enter the current date (mm-dd-yyyy): ");scanf("%d-%d-%d", &today.month, &today.day, &today.year);

cetak_tanggal(today);}

void cetak_tanggal(struct date now){

static char *nama_bulan[] = {"Wrong month", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"

};

printf("Todays date is %s %d, %d\n\n", nama_bulan[now.month], now.day, now.year);

}Contoh eksekusi :Enter the current date (mm-dd-yyyy): 5-29-2001Todays date is May 29, 2001

9.6 Struktur dan Pointer (Pointer ke Struktur)

Jika sebuah struktur mengandung banyak field dan diputuskan bahwa keseluruhan field-nya akan diubah oleh fungsi, maka cara yang efisien adalah dengan melewatkan (passing) alamat dari struktur. Dengan demikian pada pendefinisian fungsi, parameter formalnya berupa pointer yang menunjuk ke struktur.

Masalah pointer ke struktur dapat diterapkan dalam program posisi1.c. Argumen dari fungsi tukar_xy() dapat disederhanakan menjadi satu argumen saja, yakni sebagai berikut :

void tukar_xy(struct koordinat *pos_xy){

int z;

z = (*pos_xy).x;(*pos_xy).x = (*pos_xy).y;(*pos_xy).y = z;

}Pada definisi fungsi di atas,

struct koordinat *pos_xy

menyatakan bahwa pos_xy adalah pointer yang menunjuk ke obyek bertipe struktur koordinat.

Adapun penulisan :

(*pos_xy).x

menyatakan : elemen bernama x yang ditunjuk oleh pointer pos_xy

Perlu diperhatikan bahwa penulisan tanda kurung seperti pada contoh (*pos_xy).x

merupakan suatu keharusan. Sebab

*pos_xy.x

mempunyai makna yang berbeda dengan

Page 131: Pemograman Bahasa C

(*pos_xy).x

Ungkapan *pos_xy.x mempunyai makna yaitu : "yang ditunjuk oleh pos_xy.x " (sebab operator titik

mempunyai prioritas yang lebih tinggi daripada operator *).

/* File program : posisi2.c Fungsi parameternya berupa pointer yg menunjuk ke struktur */

#include <stdio.h>

struct koordinat{ int x;int y;};

void tukar_xy(struct koordinat *pos_xy);

main(){

struct koordinat posisi;

printf("Masukkan koordinat posisi (x, y) : ");scanf("%d, %d", &posisi.x, &posisi.y); printf("x, y semula = %d, %d\n", posisi.x, posisi.y);

tukar_xy(&posisi);

printf("x, y sekarang = %d, %d\n", posisi.x, posisi.y);}

void tukar_xy(struct koordinat *pos_xy){

int z;

z = (*pos_xy).x;(*pos_xy).x = (*pos_xy).y;(*pos_xy).y = z;

}Contoh eksekusi :Masukkan koordinat posisi (x, y) : 34, 21x, y semula = 34, 21x, y sekarang = 21, 34

Bentuk semacam :

*pos_xy).x

dapat ditulis dengan bentuk lain menjadi

pos_xy->x

Dalam C operator -> (berupa tanda minus - diikuti dengan tanda lebih dari >) disebut sebagai

operator panah. Dengan menggunakan operator panah, maka fungsi tukar_xy() dalam program

posisi2.c dapat ditulis menjadi

Page 132: Pemograman Bahasa C

void tukar_xy(struct koordinat *pos_xy){

int z;

z = pos_xy->x; pos_xy->x = pos_xy->y; pos_xy->y = z;

}

Kesimpulan :

Struktur adalah pengelompokan variabel-variabel yang bernaung dalam satu nama yang sama.

Variabel-variabel yang membentuk suatu struktur, selanjutnya disebut sebagai elemen dari

struktur atau field.

Suatu struktur didefinisikan dengan menggunakan kata kunci struct.

Elemen dari suatu variabel struktur dapat diakses dengan menyebutkan nama variabel struktur

diikuti dengan operator titik (‘.’) dan nama dari elemen strukturnya.

Sebuah struktur juga bisa diinisialisasi pada saat dideklarasikan. Hal ini serupa dengan

inisialisasi array, yaitu elemen-elemennya dituliskan di dalam sepasang kurung kurawal (‘{ }‘)

dengan masing-masing dipisahkan dengan koma.

Elemen-elemen dari suatu array juga dapat berbentuk sebuah struktur (array of struct).

Melewatkan sebuah struktur untuk menjadi parameter sebuah fungsi dapat dilakukan sama

dengan pengiriman parameter berupa variabel biasa. Fungsi yang mendapat kiriman parameter

tersebut juga bisa mengirimkan hasil baliknya yang juga berupa sebuah struktur (pass by

reference).

Jika sebuah struktur mengandung banyak field dan diputuskan bahwa keseluruhan field-nya akan

diubah oleh fungsi, maka cara yang efisien adalah dengan melewatkan (passing) alamat dari

struktur. Dengan demikian pada pendefinisian fungsi, parameter formalnya berupa pointer yang

menunjuk ke struktur (pointer to struct).

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Definisikan sebuah struktur (misalkan namanya = record) yang memiliki 3 buah field berupa

sebuah integer (misalkan namanya = loop), sebuah array karakter dengan 5 elemen (misalkan

namanya = word) dan sebuah float (misalkan namanya = sum).

2. Deklarasikan sebuah variabel struktur (misalkan namanya = sample) yang didefinisikan

memiliki tipe struktur record.

3. Masukkan nilai 10 kepada field loop dari struktur sample yang bertipe struktur record tsb.

Page 133: Pemograman Bahasa C

4. Tampilkan ke layar (menggunakan fungsi printf()) string yang tersimpan dalam array word

dari struktur sample.

5. Definisikan sebuah struktur (misalkan namanya = date) yang memiliki 3 field bertipe int

(misalkan namanya = day, month dan year). Kemudian tuliskan potongan program untuk

memasukkan 5 buah tanggal yang disimpan dalam sebuah array struktur yang bertipe date.

BAB XDATA TINGKAT LANJUT

Tujuan :

1 Menjelaskan tentang tipe data union

2. Menjelaskan penggunaan bitfield

3. Menjelaskan tentang tipe data enumerasi

4. Menjelaskan penggunaan typedef

5. Menjelaskan penggunaan ternary operator

6. Menjelaskan tentang konversi tipe data (type casting)

10.1 Union

Pada C, union memungkinkan suatu lokasi memori ditempati oleh dua atau lebih variabel

yang bisa saja tipenya berlainan. Di bawah ini diberikan contoh pendefinisian tipe union yang

dinamakan sebagai bil_bulat, yang digunakan untuk menyatakan data bertipe karakter atau integer.

Page 134: Pemograman Bahasa C

union bil_bulat {unsigned int di;unsigned char dc[2];

};

Berikutnya, pendeklarasian suatu variabel union bernama bil_x yang bertipe bil_bulat dilakukan

dengan cara penulisan sebagai berikut

union bil_bulat bil_x;

Catatan : Cara lain untuk mendefinisikan atau mendeklarasikan union adalah seperti pada struktur.

Gambar 10.1 memperlihatkan di dan dc berbagi tempat pada lokasi yang sama (di dan dc[0]

mempunyai alamat yang sama)

dc[0]

dc[1]

Gambar 10.1 Variabel union dalam memori

Dalam hal ini, kompiler dengan bijaksana akan menyediakan ruangan yang cukup untuk

menampung field atau elemen pada union yang membutuhkan memori paling besar. Pada

pendeklarasian variabel bil_x misalnya, memori yang ditempati variabel ini adalah 2 byte (yaitu

ukuran dari tipe int). Seandainya tipe elemen dalam union berupa float, int dan char, memori yang

dibutuhkan adalah sebesar ukuran float.

Elemen dari sebuah union dapat diakses dalam bentuk sebagai berikut :

misal : bil_x.di = 321;

adalah contoh untuk mengisikan 321 ke elemen union bernama di. Dengan pengisian nilai ini, maka

dc[0] akan bernilai byte ke-0 dari di, sedangkan dc[1] bernilai byte ke-1 dari di.

/* File program : union1.cContoh pendeklarasian dan pengaksesan variabel union */

#include <stdio.h>

main(){

union {

unsigned int di;unsigned char dc[2];

} bil_x; /* variabel union */

variabel_union.nama_elemen

di

Page 135: Pemograman Bahasa C

bil_x.di = 321;

printf("di = %d dc[0] = %d dc[1] = %d\n", bil_x.di, bil_x.dc[0], bil_x.dc[1]);}Contoh eksekusi :di = 321 dc[0] = 65 dc[1] = 1Program di atas menjelaskan cara ntuk mengakses byte ke-0 atau byte ke-1 dari di, dc[0] atau dc[1]

yang digunakan.

Nilai 321 dalam kesatuan unsigned int

Nilai 321 jika dinyatakan dalam dua buah unsigned char

Byte rendah (byte ke-0)

Byte rendah (byte ke-0)Seperti halnya pada struktur, suatu variabel union dapat dilewatkan ke dalam suatu fungsi

sebagai parameter. Di bawah ini contoh program yang memberikan gambaran tentang cara

mengubah isi suatu variabel union melalui pemanggilan suatu fungsi. Dalam hal ini, yang

dilewatkan ke dalam fungsi berupa alamat dari variabel union.

/* File program : union2.cContoh untuk mengubah nilai variabel union melalui fungsi */

#include <stdio.h>

union bil_bulat{

unsigned int di;unsigned char dc[2]; /* definisi tipe union */

};

void beri_nilai(union bil_bulat *x); /*deklarasi fungsi */

main(){

union bil_bulat bil_x; /* deklarasi var union */

/* melewatkan alamat union */beri_nilai(&bil_x);printf("di = %d dc[0] = %d dc[1] = %d \n",

bil_x.di, bil_x.dc[0], bil_x.dc[1]);}

void beri_nilai(union bil_bulat *x){

x -> di = 321; /* elemen di yang ditunjuk */} /* oleh x diberi nilai 321 */Contoh eksekusi :

321

1 65

Page 136: Pemograman Bahasa C

di = 321 dc[0] = 65 dc[1] = 1

10.2 Bitfield

Suatu bit atau beberapa bit dalam sebuah data berukuran satu byte atau dua byte dapat

diakses dengan mudah melalui bitfield. Dengan cara ini, suatu bit atau beberapa bit dapat diakses

tanpa melibatkan operator pemanipulasi bit (seperti &, |). Selain itu, satu atau dua byte memori

dapat dipakai untuk menyimpan sejumlah informasi.

Sebagai contoh, untuk memperoleh informasi masing-masing bit dari suatu data satu byte,

penulisan medan bit berupa

struct info_byte{ unsigned bit0:1;

unsigned bit1:1;unsigned bit2:1;unsigned bit3:1;unsigned bit4:1;unsigned bit5:1;unsigned bit6:1;unsigned bit7:1;

};Jika disajikan dalam bentuk gambar, gambaran suatu struktur yang memiliki tipe seperti di atas

adalah sebagai berikut :

7 6 5 4 3 2 1 0 bit

b b b b b b b bi i i i i i i it t t t t t t t7 6 5 4 3 2 1 0

Gambar 10.2 Susunan bit dari memori sebuah data bertipe info_byte

Pada pendefinisian struktur info_byte di atas,

Nilai 1 setelah tanda titik-dua (:) menyatakan panjang dari bitfield

unsigned menyatakan bahwa bitfield dinyatakan dalam keadaan tak-bertanda (untuk contoh

berikutnya, nantinya setiap bitfield memiliki kemungkinan nilai berkisar 1 atau 0).

nama tipe struktur yang terdiri atas sejumlah bitfield

struct info_byte{ unsigned bit0:1;

unsigned bit1:1;unsigned bit2:1;unsigned bit3:1;unsigned bit4:1;unsigned bit5:1;unsigned bit6:1;unsigned bit7:1;

Page 137: Pemograman Bahasa C

};panjang/jumlah bitnama variabel bitfield

Catatan : sebuah variabel bitfield haruslah dideklarasikan berupa salah satu di antara int, unsigned

dan signed.

Contoh berikut memberikan gambaran tentang cara memberikan nilai kepada variabel

struktur yang mengandung elemen berupa bitfield, dan cara mengakses setiap nilai dari bitfield.

/* File program : bitf1.cBitfield utk menampilkan bentuk biner dr karakter masukan */

#include <stdio.h>

main(){

struct info_byte /* definisi tipe bitfield */{

unsigned bit0:1; /* bit ke-0 */unsigned bit1:1; /* bit ke-1 */unsigned bit2:1; /* bit ke-2 */unsigned bit3:1; /* bit ke-3 */unsigned bit4:1; /* bit ke-4 */unsigned bit5:1; /* bit ke-5 */unsigned bit6:1; /* bit ke-6 */unsigned bit7:1; /* bit ke-7 */

};

/* deklarasi variabel union dan elemen bitfield */union {

unsigned char karakter;struct info_byte byte;

} ascii;

printf(“Masukkan sebuah karakter : ”);scanf(“%c”, &ascii.karakter);

printf(“\nKode ASCII dari karakter %c adalah %d\n”, ascii.karakter, ascii.karakter);

printf("Bentuk biner dari nilai %d adalah ", ascii.karakter);

printf("%d%d%d%d%d%d%d%d\n",ascii.byte.bit7,ascii.byte.bit6, ascii.byte.bit5, ascii.byte.bit4, ascii.byte.bit3, ascii.byte.bit2, ascii.byte.bit1, ascii.byte.bit0);

}Contoh eksekusi :Masukkan sebuah karakter : AKode ASCII karakter A adalah 65Bentuk biner dari nilai 65 adalah 01000001Pada program di atas, setelah pernyataan :

scanf(“%c”, &ascii.karakter);

Page 138: Pemograman Bahasa C

dan user memasukkan karakter : ‘A’ , berarti nilai ascii.karakter = ‘A’. Maka hal itu memberikan

efek elemen byte juga akan bernilai seperti karakter, sebab byte dan karakter berbagi data pada

memori yang sama. Namun, walaupun adanya sifat demikian, pernyataan :

ascii.byte = 'A';

akan dianggap salah (saat kompilasi), sebab suatu variabel struktur yang mengandung elemen

bitfield memang tidak diijinkan untuk diberi nilai secara langsung. Pengaksesan nilai dapat

dilakukan melalui variabel bitfield, misalnya :

printf("%d", ascii.byte.bit7);

untuk mengambil nilai dari bitfield bit 7. Contoh lain

ascii.byte.bit7 = 0;

untuk mengubah bit7 agar bernilai 0.

Kalau di depan sudah dibicarakan bitfield dengan panjang 1 bit, contoh berikut akan

memberikan gambaran tentang bitfield dengan panjang 2 bit.

struct data_gambar{

unsigned piksel1:2;unsigned piksel2:2;unsigned piksel3:2;unsigned piksel4:2;

} koord;Pada contoh di atas, variabel koord yang bertipe data_gambar akan menempati memori 1 byte (8 bit)

dengan 4 informasi terkandung di dalamnya (masing-masing 2 bit), atau memegang nilai bulat antara

0 sampai dengan 3 (22 – 1).

Untuk memberikan nilai kepada piksel1 misalnya, bisa digunakan pernyataan sebagai

berikut : koord.piksel1 = 3;

yang mengisikan 3 ke dalam bitfield tersebut.

Bitfield biasanya dipakai untuk menghemat memori. Misalnya ada dua informasi dengan

keterangan sebagai berikut :

informasi pertama (info_x) memiliki kemungkinan nilai bilangan bulat antara 0 sampai dengan 3,

dan

informasi kedua (info_y) memiliki kemungkinan nilai bilangan bulat 0 atau 1 saja.

Seandainya kedua informasi itu disimpan dalam memori (secara terpisah) sebagai tipe char, maka

akan diperlukan total memori sebesar 2 byte. Namun jika disajikan dalam bentuk bitfield, memori

yang dibutuhkan cukup 1 byte. Dalam hal ini info_x akan dinyatakan dalam 2 bit dan info_y

dinyatakan dalam 1 bit. Penuangan deklarasinya adalah sebagai berikut :

struct info{

unsigned info_x:2;unsigned info_y:1;

} status;

Page 139: Pemograman Bahasa C

atau

struct info{

unsigned info_x:2;unsigned info_y:1;unsigned :5;

} status;

Pada pendeklarasian terakhir :

unsigned :5;

fungsinya hanya untuk memperjelas bahwa total bit dari bitfield adalah 8 bit (1 byte). Perhatikan,

bahwa karena 5 bit terakhir tidak diperlukan, maka nama bitfield boleh tidak disertakan. Kalaupun

mau diberi nama (misalnya : kosong), maka bentuk deklarasinya adalah :

struct info{

unsigned info_x:2;unsigned info_y:1;unsigned kosong:5;

} status;

/* File program : BITF2.C */#include <stdio.h>

main(){

/* definisi tipe bitfield */struct info{

unsigned info_x:2;unsigned info_y:1;unsigned kosong:5; /* bisa dihilangkan */

} status;

status.info_x = 3;status.info_y = 1;

printf("info_x = %d\n", status.info_x);printf("info_y = %d\n", status.info_y);

}Contoh eksekusi :

info_x = 3info_y = 1

10.3 Enumerasi

Page 140: Pemograman Bahasa C

Tipe enumerasi merupakan himpunan dari konstanta integer yang diberi nama. Contoh

enumerasi yaitu berupa jenis kelamin manusia yang berupa

pria, wanita

Dalam C, suatu tipe data enumerasi dideklarasikan dengan bentuk :

Sedangkan contoh deklarasi variabel enumerasi :

enum manusia jns_kelamin;

Pada contoh di atas, jns_kelamin adalah variabel enumerasi yang bertipe manusia. Selanjutnya

variabel jns_kelamin dapat diisi dengan konstanta pria dan wanita.

/* File program : enum1.cContoh penggunaan enumerasi */

#include <stdio.h>

main(){

enum manusia { /* definsi tipe */pria, wanita};

enum manusia jns_kelamin; /* deklarasi var */

jns_kelamin = pria; /* diisi dgn pria */printf("Isi jns_kelamin = %d\n", jns_kelamin);

jns_kelamin = wanita; /* diisi dgn wanita */printf("Isi jns_kelamin = %d\n", jns_kelamin);

}Contoh eksekusi :Isi jns_kelamin = 0Isi jns_kelamin = 1Dengan adanya pendefinisan seperti :

enum manusia {pria, wanita};

degnan sendirinya pria merupakan konstanta dengan nilai sama dengan 0, sedangkan wanita bernilai

1. Sehingga pernyataan

jns_kelamin = pria;

merupakan pernyataan untuk mengisikan konstanta pria (atau nilai 0) ke variabel jns_kelamin.

Contoh lain, yaitu ;

enum data_hari {senin, selasa, rabu, kamis, jumat, sabtu, minggu};

Pada pendefinisian di atas,

senin menyatakan nilai 0

enum nama_tipe_enumerasi {

konstanta_1, konstanta_2,…

} variabel_1, …, variabel_n;

Page 141: Pemograman Bahasa C

selasa menyatakan nilai 1

rabu menyatakan nilai 3

kamis menyatakan nilai 4

jumat menyatakan nilai 5

sabtu menyatakan nilai 6

minggu menyatakan nilai 7

Pemakaian enumerasi biasanya untuk memperjelas dokumentasi program C, seperti yang

ditunjukkan dalam contoh program di bawah ini.

/* File program : enum2.cContoh pemakaian enumerasi */

#include <stdio.h>

main(){

/* definisi tipe data enumerasi */enum data_hari {senin, selasa, rabu, kamis, jumat,

sabtu, minggu};

/* keterangan nama hari */static char str[][7] = {"SENIN", "SELASA", "RABU",

"KAMIS", "JUMAT", "SABTU", "MINGGU"};

/* deklarasi variabel enumerasi */enum data_hari hari_kerja;

int jam_kerja;int total_jam = 0;

/* cetak nama hari dari senin s/d jumat */for(hari_kerja=senin; hari_kerja<=jumat; hari_kerja++){

printf ("Jumlah jam kerja hari ");printf("%-6s (jam) : ", str[hari_kerja]);scanf("%d", &jam_kerja);total_jam = total_jam + jam_kerja;

}printf("\nTotal jam kerja = %d\n", total_jam);

}Contoh eksekusi :Jumlah jam kerja hari SENIN (jam) : 8Jumlah jam kerja hari SELASA (jam) : 8Jumlah jam kerja hari RABU (jam) : 8Jumlah jam kerja hari KAMIS (jam) : 8Jumlah jam kerja hari JUMAT (jam) : 6

Total jam kerja = 38Penggalan pernyataan berikut

for(hari_kerja=senin; hari_kerja<=jumat; hari_kerja++);

Page 142: Pemograman Bahasa C

lebih memberi kejelasan daripada penulisan :

for(hari_kerja=0; hari_kerja<=5; hari_kerja++);

Jika dikehendaki, nilai urutan sebuah enumerasi juga bisa dirubah (yang secara default akan dimulai

dari 0 dan naik satu demi satu berdasarkan urutan konstanta dalam pendefinisian). Sehingga dengan

mendefinisikan seperti berikut :

enum {staff = 4, manajer, direktur

} jenjang_jab;maka staff tidak lagi berupa nilai 0, melainkan berupa nilai 4. Dengan sendirinya, manajer bernilai

5 dan direktur bernilai 6.

/* File program : enum3.cContoh mengubah nilai default dari suatu tipe enumerasi */

#include <stdio.h>

main(){

/* definisi tipe data enumerasi */enum {

staff = 4, manajer, direktur} jenjang_jab;

for(jenjang_jab = staff; jenjang_jab <= direktur; jenjang_jab++)

printf("%d\n", jenjang_jab);}Contoh eksekusi :

456

10.4 Typedef

Untuk kepentingan memperjelas dokumentasi program C, user bisa menamakan suatu tipe

data dengan pengenal (identifier) yang lebih memberi arti atau mudah diingat. Caranya adalah

dengan memakai typedef. Sebagai contoh pengenal BYTE dapat digunakan untuk menyatakan

unsigned char.

Bentuk umum pernamaan suatu tipe data menggunakan typedef :

Contoh :

typedef unsigned char BYTE;

Contoh tsb menyatakan bahwa BYTE identik dengan unsigned char. Sesudah pendefinisian

tersebut, BYTE dapat digunakan untuk mendeklarasikan variabel atau jenis parameter fungsi, bahkan

juga keluaran fungsi. Misalnya :

typedef tipe_data nama_baru;

Page 143: Pemograman Bahasa C

BYTE kode;

untuk mendeklarasikan variabel kode agar bertipe BYTE (atau unsigned char) . Contoh lain :

BYTE beri_nilai_awal(void);

Menyatakan bahwa keluaran fungsi beri_nilai _awal() bertipe BYTE.

/* File program : typedef.cContoh penggunaan typedef */

#include <stdio.h>

/* BYTE merupakan nama baru dari unsigned char */typedef unsigned char BYTE;

BYTE beri_nilai_awal(void); /* deklarasi fungsi */

main(){

BYTE kode; /* deklarasi variabel karakter */

kode = beri_nilai_awal();printf("Isi kode = %u\n", kode);

}

BYTE beri_nilai_awal(void){

return(143);}Contoh eksekusi :Isi kode = 143Contoh lain penamaan tipe dengan typedef :

typedef char *STRING;

menyatakan bahwa tipe STRING adalah tipe pointer yang menunjuk data char (pointer to har).

typedef struct data_karakter { unsigned char ascii;unsigned char atribut;

} karakter_layar;

Pada contoh ini, karakter_layar adalah nama lain dari

struct data_karakter { unsigned char ascii;unsigned char atribut;

};

10.5 Ternary Operator

C menyediakan sebuah operator yang tergolong sebagai operator ternary, yakni operator yang

memiliki tiga buah operand. Operator tersebut dinamakan sebagai operator kondisi. Bentuk

ungkapan yang menggunakan operator ini :

Page 144: Pemograman Bahasa C

Maksud dari ungkapan kondisi :

Jika kondisi bernilai benar, maka nilai ungkapan kondisi berupa ungkapan1

Jika kondisi bernilai salah, maka nilai ungkapan kondisi berupa ungkapan2

Contoh penggunaan misalnya untuk memperoleh nilai terbesar di antara dua buah bilangan

(berupa nila1 dan nilai2). Misalkan nilai terbesar tersebut diberikan (di-assign) ke variabel max.

Penggunaannya :

max = (nilai1 > nilai2) ? nilai1 : nilai2;

Pada contoh di atas, kalau kondisi (nilai1 < nilai2) bernilai benar, maka max akan bernilai nilai1,

dan keadaan sebaliknya akan bernilai nilai2.

Catatan : penulisan kondisi (nilai1 < nilai2) sebenarnya bisa ditulis menjadi nilai1 < nilai2 tanpa

menyertakan kurung, disebabkan operator > memiliki prioritas lebih tinggi daripada

operator kondisi (?). Pemberian tanda kurung hanya untuk menambah kejelasan.

Pernyataan :

max = (nilai1 > nilai2) ? nilai1 : nilai2;

kalau ditulis dengan menggunakan if-else adalah sebagai berikut :

if (nilai1 > nilai2) max = nilai1;

else max = nilai2;

Sebagai contoh perhatikan program di bawah ini

/* File program : max.cMenentukan nilai terbesar dengan ternary operator */

#include <stdio.h>

main(){

float nilai1, nilai2, max;

printf("Masukkan dua buah nilai : ");scanf("%f %f", &nilai1, &nilai2);

max = (nilai1 > nilai2) ? nilai1 : nilai2;

kondisi1 ? ungkapan1 : ungkapan2;

salahbenar

max = (nilai1 > nilai2) ? nilai1 : nilai2;

Page 145: Pemograman Bahasa C

printf("Nilai terbesar = %g\n", max);}Contoh eksekusi :

Masukkan dua buah nilai : 9 10.5Nilai terbesar = 10.5

10.6 Type Cast

Type cast merupakan upaya untuk mengkonversikan suatu tipe data menjadi tipe yang lain.

Bentuk umum type cast adalah :

dengan tipe dapat berupa pengenal tipe char, int.

Misalnya, jika x dideklarasikan bertipe int. Bila dikehendaki agar ungkapan : x/2

menghasilkan nilai pecahan (float), maka ungkapan x/2 perlu ditulis menjadi :

(float) x/2;

Perbedaan penggunaan type cast dengan yang tidak menggunakannya dapat dilihat pada

contoh program di bawah ini.

/* File program : typecast.cMelihat efek cast dalam konversi tipe */#include <stdio.h>

main(){

int x = 21;float y;

y = x/2;printf("y = x/2 = %f\n", y);

y = (float) x/2;printf("y = (float) x/2 = %f\n", y);

y = (float) (x/2);printf("y = (float) (x/2) = %f\n", y);

}Contoh eksekusi :y = x/2 = 10.000000y = (float) x/2 = 10.500000y = (float) (x/2) = 10.000000

Tampak bahwa jika ungkapan y = x/2 tidak menggunakan type cast, maka variabel y akan

bernilai 10.000000 untuk x = 21, tetapi jika ditulis y = (float) x/2, maka didapat nilai y =

10.500000.

(tipe) ungkapan

Page 146: Pemograman Bahasa C

Adanya (float) x/2 mengakibatkan x bertipe float. Berdasarkan sifat konversi, jika salah satu

operand bertipe real, dengan sendirinya yang lain juga akan bertipe real. Oleh karena itu

ungkapan (float) x/2 menghasilkan pembagian real.

Pada ungkapan y = x/2, baik x maupun 2 bertipe integer, maka yang terjadi adalah operasi

pembagian bulat, baru kemudian hasil pembagiannya dikonversikan secara otomatis (karena

adanya tanda assignment '=') dengan tipe data dari y, sehingga y = 10.000000.

Penulisan (float) x/2 berbeda dengan (float) (x/2). Pada (float) (x/2), yang dikonversikan ke

float adalah hasil dari x/2, sedangkan operasi pembagian x/2 sendiri dianggap sebagai operasi

pembagian bulat.

10.7 Penggolongan Variabel berdasarkan kelas Penyimpanan

Suatu variabel, di samping dapat digolongkan berdasarkan jenis/tipe data juga dapat diklasifikasikan berdasarkan kelas penyimpanan (storage class). Penggolongan berdasarkan kelas penyimpanan berupa :

variabel lokal

variabel eksternal

variabel statis

variabel register

10.7.1 Variabel Lokal

Variabel lokal adalah variabel yang dideklarasikan dalam fungsi, dengan sifat :

secara otomatis diciptakan ketika fungsi dipanggil dan akan sirna (lenyap) ketika eksekusi

terhadap fungsi berakhir.

Hanya dikenal oleh fungsi tempat variabel tersebut dideklarasikan

Tidak ada inisialisasi secara otomatis (saat variabel diciptakan, nilainya tak menentu).

Dalam banyak literatur, variabel lokal disebut juga dengan variabel otomatis. Variabel yang

termasuk dalam golongan ini bisa dideklarasikan dengan menambahkan kata kuci auto di depan tipe-

data variabel. Kata kunci ini bersifat opsional, biasanya disertakan sebagai penjelas saja. Contoh

variabel lokal ditunjukkan pada gambar 5.8.

void fung_x(void)

{

int x;

x adalah variabel lokal bagi fungsi fung_x()

Page 147: Pemograman Bahasa C

Gambar 10.3 Variabel lokal

Pada fung_x(), deklarasi

int x;

dapat ditulis menjadi

auto int x;

Penerapan variabel lokal yaitu bila variabel hanya dipakai oleh suatu fungsi (tidak

dimaksudkan untuk dipakai oleh fungsi yang lain). Pada contoh berikut, antara variabel i dalam

fungsi main() dan fung_1() tidak ada kaitannya, sebab masing-masing merupakan variabel lokal.

/* File program : lokal.c */

#include <stdio.h>

void fung_1(void);

main()

{

int i = 20;

fung_1();

printf("nilai i di dalam main() = %d\n", i);

}

void fung_1(void)

{

int i = 11;

printf("nilai i di dalam fung_1() = %d\n", i);

Page 148: Pemograman Bahasa C

}

Contoh eksekusi :nilai i di dalam fung_1() = 11nilai i di dalam main() = 20

10.7.2 Variabel Eksternal

Variabel eksternal merupakan variabel yang dideklarasikan di luar fungsi, dengan sifat :

dapat diakses oleh semua fungsi

kalau tak diberi nilai, secara otomatis diinisialisasi dengan nilai sama dengan nol.

Contoh variabel eksternal ada pda program ekstern1.c yaitu berupa variabel i. Pada

pendeklarasian

int i = 273;menyatakan bahwa i merupakan variabel eksternal dan diberi nilai awal sama denan 273. Nilai dari

variabel i selanjutnya dapat diubah oleh fungsi tambah() maupun main(). Setiap fungsi tambah()

dipanggil maka nilai i akan bertambah satu.

/* File program : ekstern1.cContoh program dengan variabel eksternal */#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

i++;}Contoh eksekusi :Nilai awal i = 273Nilai i kini = 280Nilai i kini = 281Nilai i kini = 282

Pada contoh di atas, terlihat bahwa i hanya dideklarasikan di bagian atas program, dan tak

dideklarasikan lagi dalam fungsi main() maupun tambah(). Oleh karena i merupakan variabel

Page 149: Pemograman Bahasa C

eksternal maka dapat digunakan oleh kedua fungsi tsb. Namun ada satu hal yang perlu diketahui,

variabel eksternal haruslah dideklarasikan sebelum definisi fungsi yang akan mempergunakannya.

Untuk memperjelas bahwa suatu variabel dalam fungsi merupakan variabel eksternal, di

dalam fungsi yang menggunakannya dapat mendeklarasikan variabel itu kembali dengan

menambahkan kata kunci extern di depan tipe data variabel. Sebagai contoh, program ekstern1.c

ditulis kembali menjadi seperti pada ekstern2.c.

/* File program : ekstern2.cContoh program yang menggunakan variabel eksternal dan memakai kata kunci extern */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

extern int i; /* variabel eksternal */

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

extern int i; /* variabel eksternal */

i++;}Contoh eksekusi :Nilai awal i = 273Nilai i kini = 280Nilai i kini = 281Nilai i kini = 282

Kalau dalam suatu program terdapat suatu variabel eksternal, suatu fungsi bisa saja

menggunakan nama variabel yang sama dengan variabel eksternal, namun diperlakukan sebagai

variabel lokal. Untuk lebih jelasnya perhatikan contoh program di bawah ini.

/* File program : ekstern3.cContoh program yang menggunakan variabel eksternal dan variabel lokal dengan nama yang sama */

#include <stdio.h>

Page 150: Pemograman Bahasa C

int i = 273; /* variabel eksternal */

void tambah(void);

main(){

extern int i; /* variabel eksternal */

printf("Nilai awal i = %d\n", i);i += 7;printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);tambah();printf("Nilai i kini = %d\n", i);

}

void tambah(void){

int i; /* variabel lokal */

i++;}Contoh eksekusi :Nilai awal i = 273Nilai i kini = 280Nilai i kini = 280Nilai i kini = 280

Pada program di atas, bagi fungsi main() i adalah variabel eksternal. Namun bagi fungsi

tambah(), i merupakan variabel lokal, sebab pada fungsi ini i dideklarasikan tanpa kata kunci

extern. Hal ini terlihat jelas dengan mengamati hasil eksekusi program. Pernyataan:

i++;Pada fungsi tambah() tidak mempengaruhi nilai i yang ditampilkan pada fungsi main() (bandingkan

dengan hasil eksekusi pada ekstern2.c).

10.7.3 Variabel Statis

Variabel statis dapat berupa variabel internal (didefinisikan di dalam fungsi) maupun variabel

eksternal. Sifat variabel ini :

Kalau variabel statis bersifat internal, maka variabel hanya dikenal oleh fungsi tempat variabel

dideklarasikan

Kalau variabel statis bersifat eksternal, maka variabel dapat dipergunakan oleh semua fungsi

yang terletak pada file yang sama, tempat variabel statis dideklarasikan

Berbeda dengan variabel lokal, variabel statis tidak akan hilang sekeluarnya dari fungsi (nilai

pada variabel akan tetap diingat).

Inisialisasi akan dilakukan hanya sekali, yaitu saat fungsi dipanggil yang pertama kali. Kalau tak

ada inisialisasi oleh pemrogram secara otomatis akan diberi nilai awal nol

Page 151: Pemograman Bahasa C

Variabel statis diperoleh dengan menambahkan kata kunci static di depan tipe data variabel.

Sebagai contoh perhatikan program di bawah ini.

/* File program : statis.c

Contoh variabel statis */

#include <stdio.h>

void fung_y(void);

main()

{

int y = 20;

fung_y();

fung_y();

printf("Nilai y dalam main() = %d\n", y);

}

void fung_y(void)

{

static int y;

Page 152: Pemograman Bahasa C

y++;

printf("Nilai y dalam fung_y() = %d\n", y);

}

Contoh eksekusi :Nilai y dalam fung_y() = 1Nilai y dalam fung_y() = 2Nilai y dalam main() = 20

10.7.4 Variabel Register

Variabel register adalah variabel yang nilainya disimpan dalam register dan bukan dalam

memori RAM. Variabel yang seperti ini hanya bisa diterapkan pada variabel yang lokal atau

parameter formal, yang bertipe char atau int. Variabel register biasa diterapkan pada variabel yang

digunakan sebagai pengendali loop. Tujuannya untuk mempercepat proses dalam loop. Sebab

variabel yang dioperasikan pada register memiliki kecepatan yang jauh lebih tinggi daripada variabel

yang diletakkan pada RAM. Contoh pemakaiannya bisa dilihat pada program di bawah ini.

/* File program : var_reg.c

Contoh variabel register */

#include <stdio.h>

main()

{

register int i; /* variabel register */

int jumlah = 0;

for(i = 1; i <= 100; i++)

jumlah = jumlah + i;

Page 153: Pemograman Bahasa C

printf("1 + 2 + 3 + ... + 100 = %d\n", jumlah);

}

Contoh eksekusi :

1 + 2 + 3 + ... + 100 = 5050

Kesimpulan :

Union memungkinkan suatu lokasi memori dapat ditempati oleh dua atau lebih variabel yang

bisa saja tipenya berlainan.

Seperti halnya pada struktur, suatu variabel union dapat dilewatkan ke dalam suatu fungsi

sebagai parameter.

Suatu bit atau beberapa bit dalam sebuah data berukuran satu byte atau dua byte dapat diakses

dengan mudah melalui bitfield. Dengan cara ini, suatu bit atau beberapa bit dapat diakses

tanpa melibatkan operator pemanipulasi bit (seperti &, |). Selain itu, satu atau dua byte

memori dapat dipakai untuk menyimpan sejumlah informasi.

Tipe enumerasi merupakan himpunan dari konstanta integer yang diberi nama.

Untuk kepentingan memperjelas dokumentasi program C, user bisa menamakan suatu tipe

data dengan pengenal (identifier) yang lebih memberi arti atau mudah diingat dengan

memakai typedef.

C menyediakan sebuah operator yang tergolong sebagai operator ternary, yakni operator yang

memiliki tiga buah operand. Operator tersebut dinamakan sebagai operator kondisi, yang

merupakan cara lain dari if-else untuk penyeleksian kondisi.

Type cast merupakan upaya untuk mengkonversikan suatu tipe data menjadi tipe yang lain.

Latihan :

Modifikasilah potongan program di bawah ini dengan menggunakan ternary operator

if(total_pembelian >= 100.000) discount = 0.05 * total_pembelian;

elsediscount = 0;

BAB XIOPERASI FILE

Page 154: Pemograman Bahasa C

Tujuan :

7. Menjelaskan tentang struktur file

8. Menjelaskan tentang tahap-tahap operasi pada file

9. Menjelaskan tentang fungsi untuk penyimpanan dan pembacaan file per-karakter

10. Menjelaskan tentang file biner dan file teks

11. Menjelaskan tentang operasi penyimpanan dan pembacaan file per-int

12. Menjelaskan tentang operasi penyimpanan dan pembacaan file per-blok

13. Menjelaskan cara membaca dan menyimpan data string pada file

14. Menjelaskan cara mengakses file biner secara acak

15. Menjelaskan cara menghapus file

16. Menjelaskan cara mengganti nama file

11.11 Struktur File

Kebanyakan program melibatkan media disk sebagai tempat untuk membaca atau merekam

data. Data sendiri disimpan dalam disk dalam bentuk suatu kesatuan yang disebut file. Suatu file

merupakan organisasi dari sejumlah record. Masing-masing record dapat terdiri atas satu atau

beberapa field dan setiap field terdiri atas satu atau beberapa byte. Adapun byte merupakan susunan

dari 8 bit. Untuk lebih jelasnya, perhatikan gambar 11.1 di bawah ini.

Catatan : record adalah nama lain dari struktur (struct).

Gambar 11.1 Struktur-data dari file

11.12 Tahapan Operasi File

Operasi pada file pada dasarnya meliputi tiga tahapan, yaitu :

1. Membuka/mengaktifkan file

2. Melaksanakan proses file

3. Menutup file

11.12.1 Membuka / Mengaktifkan File

Sebelum file dapat diakses (dibaca atau ditulisi), mula-mula file haruslah diaktifkan terlebih

dahulu. Untuk keperluan ini fungsi yang digunakan yaitu fopen(). Bentuk deklarasinya adalah

sebagai berikut :

FILE *fopen(char namafile, char mode);

FILE

RECORD RECORD

FIELD FIELD FIELD

BYTE(8 BIT)

BYTE…

Page 155: Pemograman Bahasa C

dengan :

namafile berupa nama dari file yang akan diaktifkan

mode berupa jenis operasi yang akan dilakukan terhadap file

prototipe ada pada file stdio.h

Jenis operasi file dapat berupa salah satu di antara mode berikut :

r menyatakan file hanya akan dibaca.

Dalam hal ini, file yang akan diproses haruslah sudah ada dalam disk.

w menyatakan bahwa file baru diciptakan. Selanjutnya operasi yang akan dilakukan terhadap

file adalah operasi perekaman data. Seandainya file tersebut sudah ada dalam disk, isinya

yang lama akan terhapus.

a untuk membuka file yang sudah ada dalam disk, dan operasi yang akan dilakukan adalah

penambahan data pada file. Data baru akan ditempatkan di bagian belakang dari file.

Seandainya file belum ada, secara otomatis file akan diciptakan terlebih dahulu.

r+ untuk membuka file yang sudah ada, dan operasi yang akan dilakukan berupa pembacaan

serta penulisan.

w+ untuk membuka file dengan tujuan untuk pembacaan atau penulisan. Jika file sudah ada,

isinya akan dihapus.

a+ untuk membuka file, dengan operasi yang dapat dilakukan berupa perekaman maupun

pembacaan. Jika file sudah ada, isinya tak akan dihapus.

Keluaran fungsi fopen() berupa pointer yang menunjuk ke tipe FILE, yaitu tipe struktur

yang definisinya ada pada stdio.h (oleh karena itu program yang menggunakan fopen() harus

melibatkan file stdio.h).

Berhasil tidaknya operasi pengaktifan file dapat dilihat pada keluaran fungsi fopen(). Jika

keluaran fungsi berupa NULL (suatu makro yang didefinisikan pada file stdio.h), berarti operasi

pengaktifan file gagal. Kejadian seperti ini bisa terjadi misalnya saat membuka file dengan mode

“r” ternyata file yang dibuka tidak ada dalam disk.

Contoh pemakaian fungsi fopen() :

pf = fopen(“COBA.TXT”, “w”);

dengan variabel pf dideklarasikan sebagai berikut :

FILE *pf;

Maksud dari pernyataan pf = fopen(“COBA.TXT”, “w”); adalah

menciptakan dan mengaktifkan file bernama “COBA.TXT”

dengan mode yaitu “w” (mode penulisan ke file)

dan menempatkan pointer-ke-FILE ke variabel pointer pf

Dengan instruksi di atas, seandainya file “COBA.TXT” sudah ada dalam disk, maka isi file

tersebut akan menjadi hilang (data lama akan terhapus).

Page 156: Pemograman Bahasa C

Informasi filepf COBA.TXT

pointer-ke-FILEstruct FILE

Gambar 11.2 Pointer-ke-FILE pf menunjuk ke file COBA.TXT

Bentuk yang biasa dipakai untuk mengaktifkan file beserta pemeriksaan keberhasilannya

adalah semacam berikut :

if (pf = fopen(“COBA.TXT”, “w”) == NULL){

printf(“File tidak dapat diciptakan !\n”);exit(1); /* keluar dari program */

}Mula-mula pf diisi dengan keluaran dari fungsi fopen(). Seandainya nilainya adalah NULL (berarti

operasi pengaktifan gagal), maka

pada layar ditampilkan tulisan : File tidak dapat diciptakan !

program dihentikan (selesai).

11.12.2 Menutup File

Apabila suatu file sudah tidak diproses lagi, maka file tersebut perlu ditutup. Hal seperti ini

sangat penting terutama jika melakukan pemrosesan file yang jumlahnya lebih dari satu. Alasannya

di antaranya adalah karena adanya keterbatasan jumlah file yang dapat dibuka secara serentak. Untuk

menutup file, fungsi yang digunakan adalah fclose(), dengan bentuk deklarasi sebagai berikut :

int fclose(FILE *pf);

dengan prototipe ada pada stdio.h.

Pada waktu pemanggilan fungsi ini, pf haruslah berupa variabel pointer bertipe FILE yang

digunakan dalam pengaktifan file. Fungsi fclose() menghasilkan keluaran berupa nol jika operasi

penutupan berhasil dilakukan.

Di samping fclose(), terdapat pula fungsi bernama fcloseall() yang digunakan untuk

menutup semua file yang sedang terbuka. Bentuk deklarasinya :

int fcloseall(void);

Fungsi ini menghasilkan nilai EOF (EOF didefinisikan pada stdio.h, yaitu bernilai –1) jika terjadi

kegagalan. Sedangkan bila berhasil, keluaran fungsi berupa jumlah file yang ditutup.

11.13Operasi Penyimpanan dan Pembacaan File Per Karakter

11.3.1 Fungsi fputc()

Sebuah karakter dapat disimpan dalam file dengan menggunakan fungsi fputc(). Bentuk

deklarasi dari fungsi ini :

int fputc(int kar, FILE *ptr_file);

Page 157: Pemograman Bahasa C

dengan ptr_file adalah pointer-ke-FILE yang berisi keluaran dari fopen(), dan kar berupa karakter

yang akan disimpan dalam file. Sekalipun kar bertipe int (2 byte), sebenarnya hanya byte terendah

dari kar yang akan disimpan ke dalam file. Byte tertinggi tak ikut disimpan.

Seandainya operasi fputc() berjalan dengan sempurna, keluaran fungsi sama dengan nilai kar.

Bila tak berhasil melaksanakan penyimpanan, keluaran fungsi berupa EOF (-1). Contoh program

untuk menciptakan file dan digunakan untuk menyimpan sejumlah karakter :

/* File program: fputc.c Menciptakan & mengisi file dgn data karakter dr keyboard */

#include <stdio.h>#include <stdlib.h>

main(){

FILE *pf; /* Pointer-ke-FILE */char kar;

/* Ciptakan file */if ((pf = fopen("COBA.TXT","w")) == NULL) {

printf("file tak dapat diciptakan!\r\n"); exit(1); /* selesai */

}

printf("Ketikkan apa saja, akhiri dengan ENTER.\n");printf("Program akan membaca perkarakter");printf(" dan menyimpannya dalam file COBA.TXT\n\n");

while((kar=getchar()) != '\n') /*baca kar dr keyboard*/fputc(kar, pf); /*tulis ke file per karakter*/

fclose(pf); /* tutup file */}Contoh eksekusi :Ketikkan apa saja, akhiri dengan ENTER.Program akan membaca perkarakter dan menyimpannya dalam file COBA.TXTMencoba menulis ke file COBA.TXT

Program mula-mula menciptakan dan membuka file melalui pemanggilan fungsi fopen(), dengan

mode file “w”. Kalau keluaran fungsi bernilai NULL, program dihentikan melalui exit( ). Kalau file

COBA.TXT berhasil dibuka, maka pernyataan

while((kar=getchar()) != ‘\n’)fputc(kar, pf);

akan dijalankan, yang memungkinkan untuk memasukkan sejumlah karakter, sampai tombol ENTER

ditekan (ENTER tidak ikut disimpan dalam file). Jika tombol ENTER ditekan, file akan ditutup dan

eksekusi program selesai. Sedangkan file COBA.TXT yang dihasilkan oleh program di atas

Page 158: Pemograman Bahasa C

merupakan file teks, sehingga isinya bisa dilihat dengan menggunakan bantuan sebuah teks editor

misalnya Notepad.

11.3.2 Fungsi fgetc()

Untuk melihat isi file hasil program di atas, bisa juga melalui program dengan memakai

fungsi fgetc(), yang digunakan untuk pembacaan per karakter dari isi file. Prototipe dari fungsi ini

ada di stdio.h. Bentuk deklarasi fgetc() :

int fgetc(FILE *ptr_file);

Keluaran fungsi berupa nilai bertipe int dari sebuah karakter yang dibaca dari file. Jika akhir file

ditemukan atau terjadi kegagalan membaca, keluaran fungsi berupa EOF.

Program berikut digunakan untuk membaca isi file COBA.TXT dengan langkah-langkah

sebagai berikut :

1. Buka file COBA.TXT dengan mode “r”

Jika tidak berhasil dibuka maka

- beri keterangan pada layar bahwa file tak ada

- selesai

2. Baca sebuah karakter dari file

Jika karakter sama dengan EOF (tanda akhir file) maka ke langkah 4

3. Tampilkan karakter ke layar dan kembali ke langkah 2

4. Tutup file

5. Selesai

/* File program: fgetc.c contoh membaca isi file per karakter */

#include <stdio.h>#include <stdlib.h>

main(){

FILE *pf;char kar;

if((pf=fopen("COBA.TXT","r")) == NULL ) /* buka file */{

printf("file tak dapat dibuka !\r\n"); exit(1); /* selesai */

}

while((kar=fgetc(pf)) != EOF) /* baca kar dari file */putchar(kar); /* tampilkan ke layar*/

printf("\n");fclose(pf); /* tutup file */

}

Page 159: Pemograman Bahasa C

Contoh eksekusi : Mencoba menulis ke file COBA.TXT

11.4 File Biner dan File Teks

Pada saat file dibuka, file bisa diperlakukan sebagai file biner atau file teks. File biner adalah

file yang pola penyimpanan di dalam disk berbentuk biner, yaitu seperti bentuk pada memori RAM

(komputer). Misalnya data bertipe int selalu akan menempati ruang 2 byte, berapapun harganya.

Sedangkan file teks merupakan file yang pola penyimpanan datanya dalam bentuk karakter.

Bilangan bertipe int misalnya, bisa saja menempati ruang 1 byte, 2 byte atau lebih bergantung

kepada nilai dari bilangannya. Sebagai contoh, bilangan 54 akan disimpan dalam 2 byte (berupa

karakter 5 dan 4), tetapi bilangan 123 akan disimpan dalam 3 byte. File seperti ini bisa dilihat

langsung dengan perintah TYPE melalui prompt DOS atau memakai editor teks (seperti Notepad).

File teks biasanya dipakai untuk menyimpan data bertipe karakter atau string. Sedangkan file

biner dipakai untuk menyimpan data bilangan atau data kompleks, seperti struktur (struct).

Penambahan yang perlu dilakukan untuk menentukan mode teks atau mode biner berupa :

t untuk mode teks

b untuk mode biner

Contoh :

"rt" Berarti mode file adalah teks dan file hendak dibaca

"rt+" Berarti mode file adalah teks dan file bisa dibaca dan ditulisi.

Bentuk penulisan yang lain (tetapi maknanya sama) : "r+t"

"rb" Berarti mode file adalah biner dan file hendak dibaca.

Catatan :

Jika pada mode file tidak terdapat karakter t atau b, mode file akan ditentukan oleh variabel

global bernama _fmode (deklarasinya ada pada file fcntl.h). Jika _fmode tidak dilibatkan dalam

program, maka mode file yang tak mengandung t atau b akan diperlakukan sebagai file teks

(secara default).

Variabel _fmode bisa diisi dengan O_BINARY untuk menyatakan file biner, atau O_TEXT

untuk menyatakan file teks. Contoh :

_fmode = O_BINARY;

pf = fopen("TEST1", "r");

Berarti bahwa "TEST1" adalah file biner dan hendak dibaca.

O_TEXT ataupun O_BINARY didefinisikan pada file fcntl.h

11.5 Operasi Penyimpanan dan Pembacaan File Per Int

Untuk keperluan menyimpan atau membaca membaca file bertipe int, C menyediakan fungsi

_putw() dan _getw(). Betuk deklarasinya :

int _putw(int nilai, FILE *ptr_file);int _getw(FILE *ptr_file);

Page 160: Pemograman Bahasa C

Dengan prototipe ada pada stdio.h. Kegunaan masing-masing adalah :

_getw() untuk membaca sebuah data bertipe int dari file

_putw() untuk menyimpan sebuah data (yang disimpan dalam variabel nilai) yang bertipe int ke

file.

Contoh berikut merupakan program untuk menyimpan sejumlah data bertipe int ke dalam file bertipe

biner bernama BILANGAN.DAT. Dalam hal ini, file BILANGAN.DAT akan diperlakukan sebagai

file biner.

/* File program: _putw.ccontoh menyimpan data bertipe int menggunakan putw() */#include <stdio.h>#include <stdlib.h>

main( ){

FILE *pf; /* ptr-ke-FILE */int nilai, sudah_benar;char jawab;

if((pf=fopen("BILANGAN.DAT", "wb")) == NULL ) /* ciptakan file*/

{ printf("file gagal diciptakan!\n");exit(1);

}

printf("MENYIMPAN DATA INTEGER KE FILE\n");do {

printf("\nBilangan yang akan disimpan: ");scanf("%d", &nilai); /* baca nilai dr keyboard */_putw(nilai, pf); /* baca bilangan ke file */printf("memasukkan data lagi (Y/T)? ");

do{

jawab = getchar(); /* baca jawaban dr keyboard */sudah_benar = ((jawab == 'Y') || (jawab == 'y')

|| (jawab == 'T') || (jawab == 't'));} while(! sudah_benar);

}while (jawab == 'y'|| jawab == 'Y');

printf("\nOke. Data sudah disimpan dalam file.\n");fclose(pf); /* menutup file */

}Contoh eksekusi :Program untuk menyimpan data integer ke file

Bilangan yang akan disimpan: 60Memasukkan data lagi (Y/T)? y

Bilangan yang akan disimpan: 998

Page 161: Pemograman Bahasa C

Memasukkan data lagi (Y/T)? y

Bilangan yang akan disimpan: -75Memasukkan data lagi (Y/T)? tOke. Data sudah disimpan dalam file.

Program yang digunakan untuk menampilkan isi file BILANGAN.DAT pada dasarnya sama

dengan program fgetc.c yang menampilkan isi file teks COBA.TXT di atas. Hanya saja, untuk

mendeteksi akhir dari file, diperlukan makro bernama feof(), yang memiliki bentuk deklarasi

int feof(FILE *ptr_file);

dengan prototipe dan definisinya ada pada file stdio.h

Keluaran feof() berupa nilai nol (NULL) jika operasi pembacaan yang terakhir membaca

tanda akhir file. Sebagai contohnya, perhatikan implementasi pada program di bawah ini.

/* File program : _getw.cContoh membaca isi file biner menggunakan getw() */#include <stdio.h>#include <stdlib.h>

main(){

FILE *pf; /* ptr ke file */int nilai, nomor = 0;/* Buka file biner untuk dibaca */if((pf=fopen("BILANGAN.DAT","rb")) == NULL){

printf("File gagal dibuka.\n");exit(1);

}

printf("Isi file BILANGAN.DAT : \n");

while(1) /* file berhasil dibuka */{

nilai = _getw(pf); /* Baca sebuah int dr file */if (feof(pf) != 0) /*Jika akhir file, keluar loop*/

break;/* Tampilkan ke layar */

printf("%2d. %d \n", ++nomor, nilai);}

fclose(pf); /* Tutup file */}Contoh eksekusi :Isi file BILANGAN.DAT :1. 602. 9983. –7511.6 Operasi Penyimpanan dan Pembacaan File Per Blok

Page 162: Pemograman Bahasa C

Ada dua fungsi yang memungkinkan untuk menyimpan atau membaca data file dalam

bentuk kesatuan blok (sejumlah byte), misalnya untuk menyimpan data bertipe float atau data bertipe

struct. Kedua fungsi tersebut adalah fread() dan fwrite(), yang memiliki bentuk deklarasi sbb :

int fread(void *buffer, int n, FILE *ptr_file);int fwrite(void *buffer, int jum_byte, int n,

FILE *ptr_file);

dengan :

buffer adalah

- pointer yang menunjuk ke daerah memori yang akan ditempati data dari file disk (untuk

fread()), atau

- pointer yang menunjuk ke daerah memori yang akan berisi data yang akan disimpan ke file

disk (untuk fwrite()).

jum_byte menyatakan jumlah byte yang akan dibaca atau disimpan.

n menentukan banyaknya blok data berukuran jum_byte yang akan ditulis atau dibaca.

ptr_file berupa pointer-ke-FILE yang berisi nilai keluaran dari fopen().

Program berikut ini memberikan contoh penyimpanan data bertipe struktur ke dalam file disk

bernama DAFBUKU.DAT.

/* File program : fwrite.cMenyimpan data bertipe struktur ke file memakai fwrite() */

#include <stdio.h>#include <stdlib.h>

main(){

FILE *f_struktur;char jawaban;int sudah_benar;

struct { char judul[26];char pengarang[20];int jumlah;

} buku; /* variabel buku bertipe struktur */

/* Buka file */if((f_struktur = fopen("DAFBUKU.DAT", "wb")) == NULL){

printf("File tidak dapat diciptakan !\n");exit(1);

}

do {fflush(stdin); /* Hapus isi penampung keyboard */printf("Judul buku : ");gets(buku.judul);printf("Nama pengarang : ");

Page 163: Pemograman Bahasa C

gets(buku.pengarang);printf("Jumlah buku : ");scanf("%d", &buku.jumlah);fflush(stdin); /* Hapus isi penampung keyboard */

/* Rekam sebuah data bertipe struktur */fwrite(&buku, sizeof(buku), 1, f_struktur);

printf("\nMau merekam data lagi [Y/T] ?");

do {jawaban = getchar();sudah_benar = ((jawaban == 'Y') || (jawaban ==

'y')||(jawaban == 'T') || (jawaban == 't'));} while(!sudah_benar);

printf("\n");

} while(jawaban == 'Y' || jawaban == 'y');

fclose(f_struktur); /* Tutup file */}Contoh eksekusi :Judul buku : Relational Database DesignNama pengarang : Igor T. HawryszkiewyczJumlah : 1Mau merekam data lagi [Y/T] ? YJudul buku : C Programming FAQsNama pengarang : Steve SummitJumlah : 4Mau merekam data lagi [Y/T] ? Y

Judul buku : The C Programming LanguageNama pengarang : Brian WK & Dennis MRJumlah : 2Mau merekam data lagi [Y/T] ? TPada program di atas, instruksi untuk menyimpan sebuah data bertipe struct ke file adalah

fwrite(&buku, sizeof(buku), 1, f_struktur);

yang menyatakan data sebanyak 1 x ukuran variabel struct buku (dalam satuan byte) dari lokasi buku

(dinyatakan dengan &buku) disimpan dalam file f_struktur (nama filenya adalah

DAFBUKU.DAT). Untuk membaca data yang ada pada file DAFBUKU.DAT, programnya adalah

sbb :

/* File program : fread.cMembaca data bertipe struktur ke file menggunakan fread() */

#include <stdio.h>#include <stdlib.h>

main()

Page 164: Pemograman Bahasa C

{FILE *f_struktur;int i=1;

struct { char judul[30];char pengarang[30];int jumlah;

} buku; /* variabel buku bertipe struktur */

/* Buka file */if((f_struktur = fopen("DAFBUKU.DAT", "rb")) == NULL){

printf("File tidak dapat dibuka !\n");exit(1);

}

printf("%2s. %-30s %-30s %s\n\n", "No", "Judul Buku", "Nama Pengarang", "Jumlah");

/* diulang selama masih ada record yg terbaca dlm file */while(fread(&buku, sizeof(buku), 1, f_struktur) == 1)

printf("%2d. %-30s %-30s %4d\n", i++, buku.judul, buku.pengarang, buku.jumlah);

printf("\n");fclose(f_struktur); /* Tutup file */

}Contoh eksekusi :No Judul Buku Nama Pengarang Jumlah1. Relational Database Design Igor T. Hawryszkiewycz 12. C Programming FAQs Steve Summit 43. The C Programming Language Brian WK & Dennis MR 211.7 Menyimpan dan Membaca Data String pada File

Dua fungsi yang dipakai untuk membaca data string pada file yaitu fgets() dan fputs().

Bentuk deklarasinya :

int fputs(char *str, FILE *ptr_file);char fgets(char *str, int n, FILE *ptr_file);

dengan prototipe pada file stdio.h

Kegunaannya :

fputs() untuk menyimpan string str ke dalam file.

fgets() untuk membaca string dari file sampai ditemukannya karakter baris baru '\n' atau setelah

(n-1) karakter, dengan n adalah panjang maksimal string yang dibaca per waktu-baca.

Keluaran fungsi :

untuk fputs(): - Jika penyimpanan berhasil dilaksanakan, hasilnya berupa karakter yang terakhir

ditulis ke file.

- Jika gagal, hasilnya berupa EOF.

Page 165: Pemograman Bahasa C

untuk fgets() : - Jika pembacaan berhasil dilaksanakan, hasilnya berupa pointer yang menunjuk

string yang ditunjuk oleh str.

- Jika gagal, hasilnya berupa NULL.

Catatan :

Pada saat menyimpan string ke file, fputs() tidak menambahkan karakter baris-baru ('\n') dengan

sendirinya, dan karakter null tidak ikut disimpan.

Pada saat pembacaan dengan fgets(), jika string yang dibaca mengandung karakter baris baru

(CR/LF), hanya karakter LF yang akan disertakan pada string. Secara otomatis string akan

diakhiri dengan karakter null

Baik fgets() maupun fputs() digunakan untuk file teks.

Perhatikan program-program di bawah ini :

/* File program : fgets.cMembaca isi file teks */

#include <stdio.h>#include <stdlib.h>

#define PANJANG 256

main(){

FILE *f_teks;char string[PANJANG];char namafile[65];

printf("PROGRAM UNTUK MELIHAT ISI FILE TEKS\n\n");printf("Masukkan nama file : ");gets(namafile);

printf("\nIsi file %s adalah sbb :\n", namafile);if((f_teks=fopen(namafile,"rt")) == NULL){

printf("File gagal dibuka\n");exit(1);

}

while(fgets(string, sizeof string, f_teks)!= NULL);printf("%s\n\n", string);

fclose(f_teks);}Contoh eksekusi :PROGRAM UNTUK MELIHAT ISI FILE TEKSMasukkan nama file : coba.txtIsi file %s adalah sbb :Mencoba menulis ke file COBA.TXT

Page 166: Pemograman Bahasa C

/* File program : fputs.cMembaca kemudian menyalin isi file teks */

#include <stdio.h>#include <stdlib.h>#include <string.h>

#define PANJANG 256

main(){

FILE *pf_input, *pf_output;char string[PANJANG];char namafile_inp[65], namafile_out[65];

printf("PROGRAM UNTUK MENYALIN ISI FILE TEKS\n\n");printf("Masukkan nama file input : ");gets(namafile_inp);printf("Masukkan nama file output: ");gets(namafile_out);

/* Buka file input */if((pf_input=fopen(namafile_inp,"r+")) == NULL){

printf("File input gagal dibuka\n");exit(1);

}/* Buka file output */if((pf_output=fopen(namafile_out,"w+")) == NULL){

printf("File output gagal dibuka\n");exit(1);

}

/* menampilkan isi file input, merubahnya ke huruf besar & menyalinnya ke file output */while(fgets(string, sizeof string, pf_input) != NULL){

printf("\nIsi file %s adalah :\n",namafile_inp);printf("%s\n", string);strupr(string); /* ubah menjadi huruf besar */fputs(string, pf_output); /*menyalin ke file output*/

}

fcloseall();

/* Buka file output */if((pf_output=fopen(namafile_out,"r+")) == NULL){

printf("File output gagal dibuka\n");exit(1);

}

Page 167: Pemograman Bahasa C

/* tampilkan isi file output */printf("\nIsi dari file %s adalah : \n",namafile_out);while(fgets(string, sizeof string, pf_output) != NULL)

printf("%s\n\n",string);

fclose(pf_output);}Contoh eksekusi :PROGRAM UNTUK MENYALIN ISI FILE TEKSMasukkan nama file input : coba.txtMasukkan nama file output: out.txt

Isi file coba.txt adalah :Mencoba menulis ke file COBA.TXT

Isi file out.txt adalah :MENCOBA MENULIS KE FILE COBA.TXT

11.8 Mengakses File Biner secara Acak

C juga menyediakan fasilitas yang memungkinkan pembacaan file secara random (acak).

Dengan adanya fasilitas ini, seandainya diinginkan untuk membaca data yang berada di tengah file,

tidaklah perlu untuk membaca record demi record dimulai dari awal file. Oleh karenanya

pengaksesan suatu data dapat dilaksanakan dengan cepat.

Untuk keperluan pengaksesan secara random, fungsi yang digunakan adalah fseek(). Bentuk

deklarasinya :

int fseek(FILE *ptr_file, long int offset, int posisi);dengan :

ptr_file adalah pointer yang berasal dari keluaran fopen()

offset menyatakan jumlah byte terhadap posisi

posisi dapat diisi dengan salah satu nilai yang tertera pada tabel 11.1

Kegunaan fungsi fseek() yaitu untuk menempatkan penunjuk file ke suatu lokasi dalam file,

berdasarkan offset dan posisi.

Tabel 11.1 Konstanta untuk menentukan posisi pada pengaksesan file secara acak

Catatan :

Konstanta simbolis SEEK_SET, SEEK_CUR dan SEEK_END didefinisikan pada file stdio.h

Prototipe fseek() ada pada stdio.h

Beberapa contoh :

Konstanta Nilai Lokasi file

SEEK_SET 0 Awal file

SEEK_CUR 1 Posisi penunjuk file saat ini

SEEK_END 2 Akhir file

Page 168: Pemograman Bahasa C

(1) fseek(pf, 3, SEEK_SET);

Pernyataan seperti ini akan menempatkan penunjuk file ke posisi 3 byte sesudah awal file

(SEEK_SET).

Gambar 11.3 Ilustrasi penggunaan SEEK_SET

(2) fseek(pf, 3, SEEK_END);

Pernyataan seperti ini akan menempatkan penunjuk file ke posisi 3 byte sebelum akhir file

(SEEK_END).

Gambar 11.4 Ilustrasi penggunaan SEEK_END

(3) fseek(pf, 3, SEEK_CUR);

Pernyataan seperti ini akan menempatkan penunjuk file ke posisi 3 byte sesudah posisi penunjuk file

sedang berada saat ini.

Gambar 11.5 Ilustrasi penggunaan SEEK_CUR

/* File program : baca_acak.cMembaca isi file secara random */

#include <stdio.h>#include <stdlib.h>

main(){

struct {

3 byte dari posisi semulaawal file penunjuk file

awal file posisi kini penunjuk file

posisi semula 3 byte daripenunjuk file akhir file

posisi kini penunjuk file akhir file

posisi semula penunjuk file posisi kini penunjuk file

3 byte terhadapposisi semula

Page 169: Pemograman Bahasa C

char judul[30];char pengarang[30];int jumlah;

} buku; /* variabel buku bertipe struktur */

FILE *pf;char jawab;int i, no_record, sudah_benar;long int offset_byte;

/* Buka file */if((pf = fopen("DAFBUKU.DAT", "rb")) == NULL){

printf("File tidak dapat dibuka !\n");exit(1);

}

do {

i = 1;printf("Nomor record dr data yg mau ditampilkan : ");scanf("%d", &no_record);

offset_byte = (no_record-1) * sizeof(buku);fseek(pf, offset_byte, SEEK_SET);

if(fread(&buku, sizeof(buku), 1, pf) == 0)printf("Nomor record tdk dikenali!\n");

else{

printf("\n%2s. %-30s %-30s %s\n\n", "No", "Judul Buku", "Nama Pengarang", "Jumlah");

printf("%2d. %-30s %-30s %4d\n", i++, buku.judul, buku.pengarang, buku.jumlah);

}printf("\nMau mencoba lagi (Y/T)? ");do{

jawab = getchar(); /*baca jawaban dr keyboard */sudah_benar = ((jawab == 'Y') || (jawab == 'y')

||(jawab == 'T') || (jawab == 't'));} while(! sudah_benar);

} while (jawab == 'y' || jawab == 'Y');

printf("\n");fclose(pf); /* Tutup file */

}Contoh eksekusi :Nomor record dr data yg mau ditampilkan : 1

No. Judul Buku Nama Pengarang Jumlah1. Relational Database Design Igor T. Hawryszkiewycz 1

Page 170: Pemograman Bahasa C

Mau mencoba lagi (Y/T)? YNomor record dari data yg mau ditampilkan : 3

No. Judul Buku Nama Pengarang Jumlah1. The C Programming Language Brian WK & Dennis MR 2

Mau mencoba lagi (Y/T)? YNomor record dari data yg mau ditampilkan : 7Nomor record tidak dikenali!

Mau mencoba lagi (Y/T)? T

Mula-mula program menanyakan nomor record dari data yang ingin ditampilkan. Selanjutnya

penunjuk file ditempatkan pada posisi data yang akan ditampilkan, melalui instruksi

offset_byte = (no_record-1) * sizeof(buku);fseek(pf, offset_byte, SEEK_SET);

Langkah berikutnya, membaca data file dengan menggunakan fread(). Kalau keluaran fread()

bernilai 0, maka di layar akan dimunculkan pesan : "Nomor record tidak dikenali!"

Kegunaan fseek() selain untuk membaca data secara random, juga memungkinkan untuk

mengubah data secara acak, seperti pada program di bawah ini.

/* File program : gantirec.cMengganti isi suatu record secara random */

#include <stdio.h>#include <stdlib.h>

#define SATU_RECORD 1

main()

{struct {

char judul[30];char pengarang[30];int jumlah;

} buku; /* variabel buku bertipe struktur */

FILE *pf; /* pointer ke FILE */char jawab;int no_record, sudah_benar, hasil_baca;long int offset_byte;

/* Buka file yg berisi data buku */if((pf = fopen("DAFBUKU.DAT", "rb+")) == NULL){

printf("File tidak dapat dibuka !\n");exit(1);

}

Page 171: Pemograman Bahasa C

/* Baca record secara random */do {

printf("Nomor record dari data yg mau diubah : ");scanf("%d", &no_record);

/* atur penunjuk posisi-file ke record tsb */offset_byte = (no_record-1) * sizeof(buku);fseek(pf, offset_byte, SEEK_SET);

/*Baca record yg ditunjuk oleh penunjuk posisi_file*/hasil_baca = fread(&buku, sizeof(buku), SATU_RECORD,

pf);

if(hasil_baca == 0)printf("Nomor record tdk dikenali!\n");

else{

printf("\n%-30s %-30s %s\n\n","Judul Buku", "Nama Pengarang", "Jumlah");

printf("%-30s %-30s %4d\n\n", buku.judul, buku.pengarang, buku.jumlah);

printf("Jumlah buku tsb kini = ");scanf("%d", &buku.jumlah);

/*Atur penunjuk posisi-file ke posisi seblmnya */fseek(pf, offset_byte, SEEK_SET);

/* Rekam ulang */fwrite(&buku, sizeof(buku), SATU_RECORD, pf);

}

printf("\nMau mengubah lagi (Y/T)? ");do{

jawab = getchar(); /*baca jawaban dr keyboard */sudah_benar = ((jawab == 'Y') || (jawab == 'y')

||(jawab == 'T') || (jawab == 't'));} while(! sudah_benar);

} while (jawab == 'y' || jawab == 'Y');

printf("\n");fclose(pf); /* Tutup file */

}Contoh eksekusi :Nomor record dari data yg mau diubah : 2Judul Buku Nama Pengarang JumlahC Programming FAQs Steven Summit 4Jumlah buku tsb kini = 5Mau mengubah lagi (Y/T) ? T

Page 172: Pemograman Bahasa C

Proses penggantian data record dilakukan dengan mula-mula menempatkan penunjuk file pada posisi

dari data yang akan diganti. Selanjutnya data dibaca (dengan fread()), dan akan ditampilkan di layar.

Setelah data jumlah buku yang baru dimasukkan dari keyboard, penunjuk file ditempatkan kembali

ke posisi tempat data yang dibaca tadi. Kemudian data baru (satu record) direkam ulang dengan

fwrite().

11.9 Menghapus File

C menyediakan fungsi yang berguna untuk menghapus file yaitu remove(). Bentuk

deklarasinya :

int remove (char *namafile);

dengan namafile adalah pointer yang menunjuk ke nama file yang akan dihapus.

Fungsi ini menghasilkan keluaran berupa nilai nol bila operasi penghapusan file berhasil

dilaksanakan. Kalu terjadi kegagalan, keluaran fungsi berupa selain nol. Prototipe dari fungsi ini

ada pada stdio.h

/* File program : hapusfile.cContoh program untuk menghapus file */

#include <stdio.h>#include <stdlib.h>

#define PJG 65

main(){

int kode;char namafile[PJG];

printf("Nama file yang akan dihapus : ");gets(namafile);

kode = remove(namafile);if(kode == 0)

printf("File sudah dihapus\n");

elseprintf("Gagal dalam menghapus file\n");

}Contoh eksekusi :Nama file yang akan dihapus : bilangan.datFile sudah dihapus

11.10 Mengganti Nama File

Untuk mengganti nama file, fungsi yang digunakan yaitu rename(). Bentuk deklarasinya :

int rename(char *namafilelama, char *namafilebaru);

Page 173: Pemograman Bahasa C

Jika operasi penggantian nama file lama menjadi nama file baru ini berhasil, maka keluaran fungsi

berupa nol. Jika terjadi kegagalan, keluaran fungsi berupa selain nol. Prototipe dari fungsi ini ada

pada file stdio.h

/* File program : gantinama.cContoh program untuk mengganti nama file */

#include <stdio.h>#include <stdlib.h>

#define PJG 65

main(){

int kode;char namafilelama[PJG], namafilebaru[PJG];

printf("Nama file yang akan diganti : ");gets(namafilelama);printf("Nama file yang baru : ");gets(namafilebaru);

kode = rename(namafilelama, namafilebaru);if(kode == 0)

printf("Nama file sudah diganti\n");else

printf("Gagal dalam mengganti nama\n");}Contoh eksekusi :Nama file yang akan diganti : bilangan.datNama file yang baru : bilangan1.datNama file sudah digantiKesimpulan :

File merupakan organisasi dari sejumlah record. Masing-masing record dapat terdiri atas satu

atau beberapa field dan setiap field terdiri atas satu atau beberapa byte. Adapun byte

merupakan susunan dari 8 bit.

Operasi pada file pada dasarnya meliputi tiga tahapan, yaitu :

a. Membuka/mengaktifkan file

b. Melaksanakan proses file

c. Menutup file

Sebelum file dapat diakses (dibaca atau ditulisi), mula-mula file haruslah diaktifkan terlebih

dahulu dengan menggunakan fungsi fopen().

Untuk menutup file, fungsi yang digunakan adalah fclose().

Sebuah karakter dapat disimpan dalam file dengan menggunakan fungsi fputc().

Untuk melihat isi file digunakan fungsi fgetc(), yang digunakan untuk pembacaan per karakter

dari isi file.

Page 174: Pemograman Bahasa C

File biner adalah file yang pola penyimpanan di dalam disk berbentuk biner, yaitu seperti

bentuk pada memori RAM (komputer). Sedangkan file teks merupakan file yang pola

penyimpanan datanya dalam bentuk karakter.

Untuk keperluan menyimpan atau membaca membaca file bertipe int, digunakan fungsi

_putw() dan _getw().

Fungsi yang digunakan untuk menyimpan atau membaca data file dalam bentuk kesatuan blok

(sejumlah byte), misalnya untuk menyimpan data bertipe float atau data bertipe struct adalah

fread() dan fwrite().

Dua fungsi yang dipakai untuk membaca data string pada file yaitu fgets() dan fputs().

Untuk keperluan pengaksesan secara random, fungsi yang digunakan adalah fseek().

Fungsi yang berguna untuk menghapus file yaitu remove().

Untuk mengganti nama file, fungsi yang digunakan yaitu rename().

Latihan :

Buatlah potongan program untuk soal-soal di bawah ini

1. Deklarasikan sebuah variabel untuk menangani pemasukan data ke file (misalkan nama

variabelnya = input_file) yang merupakan sebuah pointer ke sebuah FILE (pointer to a type

FILE)

2. Dengan menggunakan input_file, tuliskan pernyataan untuk membuka sebuah file (misalkan

nama filenya = result.dat) dengan mode baca (read)

3. Tuliskan pernyataan-pernyataan dalam program C untuk mengecek apakah input_file berhasil

membuka file result.dat dengan sukses. Jika tidak, tampilkan pesan kesalahannya dan keluar

dari program (exit)

4. Tuliskan potongan program dalam bahasa C untuk membaca satu baris karakter (yang

diakhiri dengan \n) dari input_file ke dalam array of character (misalkan nama array-nya =

buffer). Array buffer diakhiri dengan NULL setelah mencapai akhir baris (membaca karakter

\n). Terlebih dahulu deklarasikan semua variabel yang dipakai.

5. Tuliskan pernyataan untuk menutup file (result.dat) yang terasosiasi dengan input_ file.