Anda di halaman 1dari 217

Pemrograman 2

Oleh:

Iwan Syarif
Riyanto Sigit
Afrida Helen
Umi Sa’adah
Toru MUSO (JICA Expert)

POLITEKNIK ELEKTRONIKA NEGERI SURABAYA


INSTITUT TEKNOLOGI SEPULUH NOPEMBER
2001
KATA PENGANTAR

Alhamdulillah, puji syukur ke hadirat Allah SWT, atas limpahan karuniaNya-lah


kami dapat menyelesaikan Diktat Pemrograman 2 (Pemrograman C). Diharapkan dengan
adanya diktat ini, mahasiswa dapat belajar secara mandiri dan lebih memahami mata kuliah
Pemrograman 2.

Terima kasih kami sampaikan kepada berbagai pihak yang telah memberikan
kontribusi dalam penyelesaian buku ini, yaitu:
° Toru Muso, Longterm JICA Expert Program Studi Teknologi Informasi
° Ir. Elly Purwantini
° Dosen dan staf di Program Studi Teknologi Informasi

Tak ada gading yang tak retak, begitu kata pepatah. Demikian juga dengan kami,
sekalipun buku ini telah selesai melalui proses dan review yang cukup lama, namun masih
terbuka kemungkinan adanya beberapa kekurangan di dalamnya. Oleh karena itu, masukan,
kritik dan saran sangat kami harapkan untuk lebih menyempurnakan diktat ini pada
kesempatan mendatang.

Mudah-mudahan sedikit yang kami bisa sumbangkan ini, akan dicatat oleh Allah
SWT sebagai bagian dari amal sholeh kami dan akan menjadi ilmu yang bermanfaat, yang
senantiasa akan mengalirkan pahala bagi orang-orang yang mengajarkannya. Amin….

Surabaya, Akhir Tahun 2001

PENYUSUN

i
BAB I
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 PrenticeHall 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

1
2

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.


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
3

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 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
4

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.

EDITOR EDITOR

FILE INCLUDE FILE PROGRAM


(FILE JUDUL) SUMBER
xxx.h yyy.c

KOMPILER

FILE PUSTAKA FILE OBYEK FILE OBYEK


(library file) LAIN

LINKER

FILE
EXECUTABLE

Gambar 1.1 Proses Kompilasi-Linking dari program C

Keterangan Gambar :
5

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


dalam file yang disebut file program sumber (dengan ciri utama memiliki ekstensi .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
6

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

Bahasa C dikatakan sebagai bahasa pemrograman terstruktur karena strukturnya


menggunakan fungsi-fungsi sebagai program-program bagiannya (subroutine).
Fungsifungsi 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.
7

b. Fungsi printf().
Fungsi printf() merupakan fungsi yang umum dipakai untuk menampilkan suatu keluaran
pada layar peraga. Untuk menampilkan tulisan

Selamat belajar bahasa C

misalnya, 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

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
8

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().
9

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


tidak masuk dalam eksekusi program
*/

#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.
10

• #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 */.
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).
11

8. Gunakan pernyataan scanf() untuk membaca masukan sebuah karakter dari keyboard
dan memasukkannya ke sebuah variabel karakter (misalkan namanya = opr).
BAB II
DASAR-DASAR PEMROGRAMAN C

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:
 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


Tipe Total bit Kawasan Keterangan

char 8 -128 s/d 127 karakter


int 32 -2147483648 s/d 2147483647 bilangan integer
float 32 1.7E-38 s/d 3.4E+38 bilangan real presisi-tunggal
double 64 2.2E-308 s/d 1.7E+308 bilangan real presisi-ganda

11
12

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

Tipe Total bit Kawasan Keterangan


short int 16 -32768 s/d 32767 short
integer long int 32 -2147483648 s/d 2147483647
long integer
signed int 32 -2147483648 s/d 2147483647 biasa disingkat dengan int
unsigned int 32 0 s/d 4294967295 bilangan int tak bertanda

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.

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:


13

tipe daftar-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 :

nama_variabel = nilai;

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).
14

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 ‘@’.
 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 operandnya
(yaitu a dan b). Karena operator penjumlahan melibatkan dua operator ini tergolong sebagai
operator binary.

-c

Simbol - (minus) juga merupakan operator. Simbol ini termasuk sebagai operator unary,
yaitu operator yang hanya memiliki sebuah operand (yaitu c pada contoh ini).
15

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()
{
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)
16

• 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--;

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).
17

/* File program : pre_post.c


Contoh 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 = 1
loop = 1, count = 2

2.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

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

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

+ dan binary -
18

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;

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;

menjadi

x += 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
19

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;

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()


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 :
20

%c untuk menampilkan sebuah karakter


%s untuk menampilkan sebuah string

Untuk menampilkan data bilangan, penentu format yang dipakai berupa salah satu
dari bentuk dalam Tabel 2.5.

Tabel 2.5 Penentu format pada printf()


%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

untuk menampilkan bilangan real dalam bentuk notasi seperti %f,%E atau %F
%E
%g
%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.

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

/*File program : form_efg.c


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

#include <stdio.h>

main()
{
float x = 251000.0f;
21

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.000000
Format 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);

A b a d 2 0

 Untuk data yang berupa bilangan real, spesifikasi medannya berupa

m.n 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
22

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.00
7500.25

 Untuk data yang berupa string, contoh :

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

maka akan ditampilkan sebagai berikut


B a h a s a C

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 :
B a h a s a C

/* File program : formatpjg.c


Contoh penggunaan format panjang medan data */

#include <stdio.h>

main()
{
int nilai1 = 20;
float nilai2 = 500.0f;
23

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
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);
24

Selengkapnya, terlihat dalam contoh program di bawah ini.

/* File program : lingkaran.c


Menghitung 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);
}

Contoh eksekusi :

Masukkan jari-jari lingkaran = 5

Data lingkaran
Jari-jari = 5.00
Keliling = 31.40
Luas = 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
25

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()

%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 bertanda
l 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

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)”.

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.
26

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);
}
27

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


0,3xz
(b) y = 2a

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

Tujuan :
1. Menjelaskan tentang operator kondisi (operator relasi dan logika)
2. Menjelaskan penggunaan pernyataan if
3. Menjelaskan penggunaan pernyataan if-else
4. Menjelaskan penggunaan pernyataan if dalam if
5. Menjelaskan penggunaan pernyataan else-if
6. Menjelaskan penggunaan pernyataan switch

3.1 Operator Kondisi


Banyak persoalan yang diperlukan untuk membuat keputusan. Contoh yang
sederhana berupa cara mengatur agar komputer bisa menyimpulkan bahwa suatu bilangan
merupakan bilangan genap atau bilangan ganjil. Untuk keperluan pengambilan keputusan
semacam itu, C menyediakan beberapa jenis pernyataan, berupa
 Pernyataan if
 Pernyataan if-else, dan
 Pernyataan switch

Pernyataan-pernyataan tersebut memerlukan suatu kondisi, sebagai basis dalam


pengambilan keputusan. Kondisi umum yang dipakai berupa keadaan benar dan salah. Oleh
karena itu pembahasan pada bab ini akan diawali dengan pengenalan operator yang
membentuk kondisi benar dan salah.
Operator yang digunakan untuk menghasilkan kondisi benar dan salah, bisa berupa operator
relasi dan bisa juga berupa operator logika. Berikut ini dibahas masing-masing jenis operator
serta tabel prioritas masing-masing operator.
29

28
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


Operator Makna
> Lebih dari
>= Lebih dari atau sama dengan
< Kurang dari
<= Kurang dari atau sama dengan
== Sama 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
'A' < 'B' Benar, karena kode ASCII untuk karakter ‘A’
kurang dari kode ASCII untuk karakter ‘B’ *)
kar == Benar, jika kar berisi 'Y'
'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


30

Operator Makna
&& dan (AND)
|| atau (OR)
! tidak (NOT)

Bentuk pemakaian operator && dan || adalah

operand1 operator operand2

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 ||


Operand1 Operand2 Hasil
|| &&
Salah Salah 0 0
Salah Benar 1 0
Benar Salah 1 0
Benar Benar 1 1

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'

Sedangkan bentuk pemakaian operator logika ! adalah :

!operand
31

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


Tertinggi : ! <=
> >= <
= = !=
&&
Terendah: ||

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
32

Pernyataan if mempunyai bentuk umum :

if (kondisi ) pernyataan;

Bentuk ini menyatakan :


 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

salah
kondisi

benar
pernyataan

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.c


Contoh penggunaan if untuk menghitung nilai discount */

#include <stdio.h>

main()
{
double total_pembelian, discount = 0; /*
discount diinisialisasi dengan nilai 0 */
33

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);
}

Contoh eksekusi :

Total pembelian = Rp 200000


Besarnya 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 :
if (kondisi)
pernyataan-1;
else
pernyataan-2;
Diagram alir dapat
dilihat seperti
gambar 3.2.
34

salah
kondisi

benar
pernyataan-1 pernyataan-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.
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.c


Pemakaian 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);
else
printf("\n%g dibagi dengan %g = %g\n", a, b, a/b);
}
35

Contoh eksekusi :

Masukkan nilai a : 5
Masukkan nilai b : 0
5 dibagi dengan nol = TAK BERHINGGA

3.4. Pernyataan if di dalam if


Di dalam suatu pernyataan if (atau if-else) bisa saja terdapat pernyataan if (atau
ifelse) 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;
else
pernyataan;
.
.

else pernyataan;
else
pernyataan;

 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 kondisin,
jika kondisi-kondisi sebelumnya bernilai benar.

/* File program : determinan1.c


36

Program 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);
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=0


Masukkan nilai a : 3
Masukkan nilai b : 6
Masukkan nilai c : 2
37

Dua akar real berlainan yaitu :


X1 = -0.42265
X2 = -1.57735

3.5 Pernyataan else-if


Contoh implementasi nested if ini misalnya pembuatan sebuah program kalkulator
sederhana. User memberikan masukan dengan format :

operand1 operator operand2

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
38

%c %f", &number1, &operator,


&number2);

if(operator == '*') result =


number1 * number2; else
if(operator == '/') result =
number1 / number2; else
if(operator == '+') 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 ); else
printf("Invalid operator!\n");
}

Contoh eksekusi :

Masukkan 2 buah bilangan dan sebuah operator


dengan format : number1 operator number2

23.2 + 12
23.2 + 12 is 35.2

3.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 :

switch (ekspresi)
39

{
case konstanta-1:
pernyataan-1;
......
break;
case konstanta-2:
.
.
.
case konstanta-n:
pernyataan-n;
.......
break;
default:
.......
.......
break;
}

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 :
 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.c


Contoh penggunaan pernyataan switch untuk mengimplementasikan
kalkulator sederhana */
40

#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); else
printf("Invalid operator!\n");
}

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

23.2 = 12 invalid
operator !

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 :
if (kondisi )
pernyataan;
41

b. Pernyataan if-else, bentuk umumnya :

if (kondisi) pernyataan-1;
else pernyataan-2;
c. Pernyataan if di dalam if, bentuk umumnya : if
(kondisi-1)
if (kondisi-2)
.
.
if(kondisi-n)
pernyataan; else
pernyataan;

.
.
else
pernyataan;
else
pernyataan;

d. Pernyataan else-if, bentuk umumnya :

if (kondisi-1)
pernyataan-1; else
if (kondisi-2)
pernyataan-2;
.
.
else if(kondisi-n)
pernyataan-n; else
pernyataan-(n+1);

e. Pernyataan switch, bentuk umumnya :


switch (ekspresi)
{
case konstanta-1:
pernyataan-1;
......
break;
case konstanta-2:
.
.
42

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

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;
else
43

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


BAB IV
PENGULANGAN PROSES

Tujuan :
1. Menjelaskan proses pengulangan menggunakan pernyataan for
2. Menjelaskan proses pengulangan menggunakan pernyataan while
3. Menjelaskan proses pengulangan menggunakan pernyataan do-while
4. Menjelaskan penggunaan pernyataan break
5. Menjelaskan penggunaan pernyataan continue
6. Menjelaskan penggunaan pernyataan goto
7. Menjelaskan loop di dalam loop (nested loop) dan contoh kasusnya
8. 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 :

for (ungkapan1; ungkapan2; ungkapan3) pernyataan;

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

44
45

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;
pernyataan;
.
.
.
}

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 :


46

bilangan = 20

salah
bilangan <=100

benar

Cetak bilangan

bilangan =
bilangan + 10

Keluar loop

Gambar 4.1. Diagram alir for

/* File program : for1.c


Contoh pemakaian for untuk membentuk deret naik */

#include <stdio.h>

main()
{
int bilangan;

for(bilangan = 20; bilangan <= 100; bilangan += 10)


printf("%d\n", bilangan);
}
47

Contoh eksekusi :

20
30
40
50
60
70
80
90
100

Pada 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 :

60
50
40
30
20
10

Untuk itu selengkapnya program yang dibutuhkan adalah sebagai berikut :

/* File program : for2.c


Contoh pemakaian for untuk membentuk deret turun */

#include <stdio.h>

main()
{
int bilangan;

for (bilangan = 60; bilangan >= 10; bilangan -= 10)


printf("%d\n", bilangan);
48

Contoh eksekusi :

60
50
40
30
20
10

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
49

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.

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 :

while (kondisi) pernyataan;

dengan pernyataan dapat berupa pernyataan tunggal, pernyataan majemuk ataupun


pernyataan kosong. Proses pengulangan terhadap pernyataan dijelaskan pada gambar
berikut :

salah
kondisi

benar

pernyataan

keluar loop

Gambar 4.2. Diagram alir while


50

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.c


Untuk 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(!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 :
51

Pilihlah Y atau T
Pilihan anda adalah Y

Inisialisasi 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++;

/* File program : jumkar.c


Menghitung jumlah kata dan karakter dalam suatu kalimat */

#include <stdio.h>
52

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 menyenangkan

Jumlah karakter = 36
Jumlah SPASI = 4

4.3 Pernyataan do-while


Bentuk pernyataan do-while
do
pernyataan;
while (kondisi)

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
53

dijalankan lagi. Untuk lebih jelasnya dapat dilihat pada Gambar 4.3. Berdasarkan Gambar
4.3 terlihat bahwa tubuh loop minimal akan dijalankan sekali.

Tubuh loop pernyataan

benar
kondisi

salah

keluar loop

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
54

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.c


Untuk membaca tombol Y atau T */

#include <stdio.h>
main()
{
char pilihan;
int sudah_benar;

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 T
Pilihan 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
55

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.

for ( ; ; )
{
.
.
if ( …… )
break;
.
.
} /* akhir tubuh loop for */

puts(“\nSelesai…”);

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.c


56

Pemakaian 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


Selesai

Jika 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.
57

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.c


menampilkan 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");
}

Contoh eksekusi :

7 9 11 13 17 19 21 23 25

Pada program di atas, untuk menghindari agar nilai 15 tidak ditampilkan ke layar, pernyataan
yang digunakan berupa
58

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 <= 25

Pada 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
59

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 :

/* 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 :


60

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”.

Pernyataan goto

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.
61

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.c


Pemakaian exit() untuk menghentikan eksekusi program */

#include <stdio.h>
#include <stdlib.h>
main() {
char kar;

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.
62

• Pernyataan-pernyataan yang bisa digunaan untuk keperluan pengulangan proses


(looping) adalah :
(a) Pernyataan for, dengan bentuk umum sebagai berikut:
for (ungkapan1; ungkapan2; ungkapan3)
pernyataan;

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:

while (kondisi)
pernyataan;

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


do
pernyataan; while
(kondisi)

• 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.

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.
63

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
BAB V
FUNGSI

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 fungsifungsi 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

64
65

fungsi sering digambarkan sebagai "kotak gelap" seperti ditunjukkan pada gambar di bawah
ini.

Parameter Keluaran
Fungsi
FUNGSI

Gambar 5.1 Fungsi sebagai sebuah kotak gelap

Penggambaran 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.
Bentuk umum dari definisi sebuah fungsi adalah sebagai berikut ;
tipe-keluaran-fungsi nama-fungsi (deklarasi argumen)
{
tubuh fungsi }

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
66

 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.

Nama fungsi
Sepasang tanda kurung, tanpa argumen
inisialisasi() Tak ada tanda titik koma
{ Awal fungsi
return(0); Tubuh fungsi
} Akhir fungsi

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

return(0);

merupakan pernyataan untuk memberikan nilai keluaran fungsi berupa nol. Selengkapnya
perhatikan program di bawah ini

/* File program : inisial.c


Contoh 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);
67

}
int inisialisasi()
{
return(0);
}

Contoh eksekusi :
x =
0 y
= 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.

main() int inisialisasi()


{ {
int x, y; return(0);
}
x = inisialisasi();
printf("x = %d\n", x);
y = inisialisasi(); definisi fungsi
printf("y = %d\n", y);
}
pemanggilan fungsi

Gambar 5.3 Proses pemanggilan fungsi

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.
68

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); else

return(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); else

return(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);
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);
}
69

int minimum(int x, int y)


{
if (x < y)
return(x); else

return(y);
}

Contoh eksekusi :

Masukkan nilai a = 4
Masukkan nilai b = 2

Bilangan terkecil antara 4 dan 2 adalah 2

5.3 Fungsi Dengan Keluaran 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()
{
70

float a, b, kecil;

printf("Masukkan nilai a : ");


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

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); else

return(y);
}

Contoh eksekusi :

Masukkan nilai a = 5.5


Masukkan 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.c


Contoh 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 ");
71

puts("Tanggal : 12 Juni 2001 ");


puts(" ");
puts("Selamat menggunakannya....... ");
puts("==================================");
}

Contoh eksekusi :

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

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

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 :


72

Nama fungsi
float jumlah (float, float);
Diakhiri dengan titik koma
Tipe parameter kedua
Tipe parameter pertama
Tipe keluaran fungsi
Gambar 5.4 Prototipe fungsi

Perhatikan contoh program di bawah ini.

/* File program : jumlah.c contoh


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);

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.5


Masukkan 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);
73

menyatakan bahwa info_program() tidak memiliki


parameter

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.

main() float jumlah(float x, float y)


{ {
... return(x + y);
c = jumlah(a, b); }
...
}

parameter parameter
aktual
formal

Gambar 5.5 Paramater formal dan parameter aktual

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
74

konstanta. Bahkan bisa juga parameter aktual berupa ungkapan yang melibatkan operator,
misalnya :

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

ungkapan

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.c


Untuk 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)
75

{
int z;

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 fungsi


a = 88 b = 77

Nilai di akhir fungsi tukar()


x = 77 y = 88

Nilai setelah pemanggilan fungsi


a = 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.

x y z x y z

88 77 ? 88 77 88
76

mula-mula sesudah : z = x

x y z x y z

77 77 88 77 88 88

sesudah : x = y sesudah : y = z

Gambar 5.6 Proses penukaran nilai

Gambar 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

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.
77

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.

px py
alamat a alamat b

a b

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

/* File program : tukar2.c


Untuk 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;

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;
78

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 fungsi


a = 88 b = 77

Nilai di akhir fungsi tukar()


x = 77 y = 88

Nilai setelah pemanggilan fungsi


a = 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.

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
79

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.

void fung_x(void)
{
int x;
.
.
. x adalah variabel lokal bagi
} fungsi fung_x()
Gambar 5.8 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.
80

/* 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() = 11


nilai 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.

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.
81

/* File program : ekstern1.c


Contoh 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 = 273


Nilai i kini = 280
Nilai i kini = 281
Nilai 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
82

menambahkan kata kunci extern di depan tipe data variabel. Sebagai contoh, program
ekstern1.c ditulis kembali menjadi seperti pada ekstern2.c.

/* File program : ekstern2.c


Contoh 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 = 273


Nilai i kini = 280
Nilai i kini = 281
Nilai i kini = 282
83

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.c


Contoh program yang menggunakan variabel eksternal dan
variabel lokal dengan nama yang sama */
84

#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)
{
int i; /* variabel lokal */

i++;
}

Contoh eksekusi :

Nilai awal i = 273


Nilai i kini = 280
Nilai i kini = 280
Nilai 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).
85

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.

/* 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);
}
86

Contoh eksekusi :

Nilai y dalam fung_y() = 1


Nilai y dalam fung_y() = 2
Nilai y dalam main() = 20

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


87

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().

fungsi_a() fungsi_b()

fungsi_c()

Gambar 5.9 Komunikasi antar fungsi dalam C

/* File program : kom_fung.c


contoh 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");
}
88

Contoh eksekusi :

fungsi 1 dijalankan
fungsi 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.

23 = 2 * 22 22 = 2 * 21 21 = 2

8 4 2

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);
89

printf("Faktorial dari %d = %d\n", x, faktorial(x));


}
int faktorial(int m)
{
if(m == 1)
return(1);
else
return(m * faktorial(m-1));
}

Contoh eksekusi :

MENCARI FAKTORIAL DARI X!


Masukkan nilai x (bulat positif) : 4
Faktorial dari 4 = 24

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
90

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.

fungsi utama
main()

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.
91

• 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.

6. Tulislah prototipe fungsi untuk fungsi pada soal nomor 5 di atas.


BAB VI
ARRAY

Tujuan :
1. Menjelaskan tentang array berdimensi satu
2. Menjelaskan tentang array berdimensi dua
3. Menjelaskan tentang array berdimensi banyak
4. Menjelaskan tentang inisialisasi array tak berukuran.
5. 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 (twodimensional
array) mewakili bentuk dari suatu matriks atau table
. Array berdimensi tiga (three-dimensional array) mewakili bentuk suatu ruang.

6.1 Array Berdimensi Satu


6.1.1 Mendeklarasikan Array Berdimensi Satu
Suatu array berdimensi satu dideklarasikan dalam bentuk umum berupa :

tipe_data nama_var[ukuran];
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.

91
Contoh pendeklarasian array :
93

float nilai_tes[5];

menyatakan bahwa array nilai_tes mengandung 5 elemen bertipe float.

6.1.2 Mengakses Elemen Array Berdimensi Satu


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.

nilai_tes[0] tipe float

nilai_tes[1]
total 5 elemen
nilai_tes[2]

nilai_tes[3]

nilai_tes[4]

float nilai_tes[5]

Gambar 6.1 Array berdimensi satu

Bentuk umum pengaksesan array adalah sbb :


nama_var[indeks]

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.
94

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 */

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.5


Nilai tes ke-2 : 67.75
Nilai tes ke-3 : 80
Nilai tes ke-4 : 77
Nilai 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 */


95

#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)
jhari = 29;
else
jhari = 28; else
jhari = jum_hari[bulan-1];
printf("\nJumlah hari dalam bulan %d tahun %d
adalah %d hari\n", bulan, tahun, jhari);
}

Contoh eksekusi :

MEMPEROLEH JUMLAH HARI


PADA SUATU BULAN DAN SUATU TAHUN
--------------------------------
Masukkan bulan (1..12) : 2
Masukkan 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 */


96

#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 1
values[1] is 2
values[2] is 3
values[3] is 4
values[4] is 5
values[5] is 6
values[6] is 7
values[7] is 8
values[8] is 9
word[0] is
H word[1]
is e
word[2] is
l word[3]
is l
word[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.
97

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
Program
1. (INTRO) 80 540 1032
2. (BASIC) 15 83 301
3. (PASCAL) 8 12 15
4. (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.

0 1 2indeks kedua (tahun)


80 540 1032
98

0 15 83 301
1 8 12 15
2 10 129 257
3
indeks pertama
(program kursus) 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 Berdimensi Dua 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.
99

0 1 2
0 540
1
2
3

data_lulus[0][1] = 540;

Gambar 6.4. Pemberian nilai ke array berdimensi dua

Perhatikan contoh program di bawah ini.

/* File program : lulus.c


Contoh pemakaian array berdimensi dua */

#include <stdio.h>
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;
100

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) :


2000
Masukkan 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
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

Gambar 6.5 Representasi inisialisasi array berdimensi dua


101

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.c


Contoh 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 } ,
{ 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
102

{ 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.


103

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 } ,
{ 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
};
104

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 },
{ 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 */
}
}
105

Contoh Eksekusi :

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
106

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.c


contoh inisialisasi array tak berukuran */

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

#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',
107

'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);
}
printf("\n\n");
}

Contoh Eksekusi :

Masukkan sebuah kalimat dan akhiri dengan ENTER


Kemudian kalimat tsb akan saya sandikan
Kalimat : Saya belajar
108

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.
109

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].
Penjelasan proses pengurutan terhadap 5 buah data ditunjukkan pada gambar 6.6.

Data semula (sebelum pengurutan) adalah


110

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

i=0 j=1 j=2 j=3 j=4

50.5 30.3
0
1 30.3 50.5
2
3
20.2 20.2
4
25.2 25.2

i= 1 j
=2 j 31.3 31.3 31.3 31.3 = 3
j=4

0 20.2 20.2
1 50.5 30.3
2
3
4 30.3 50.5
25.2 25.2

31.3 31.3 31.3

i=2 j=3 j=4

0 20.2 20.2
1 2
25.2 25.2 3 4

50.5 30.3

30.3 50.5
i =3 j=4 Hasil akhir
31.3 31.3
111

20.2

25.2

30.3

50.5
30.3
31.3
31.3

50.5

0
1
2
3
4

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(
) {
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);
112

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
Data ke-1 : 50.5
Data ke-2 : 30.3
Data ke-3 : 20.2
Data ke-4 : 25.2
Data ke-5 : 31.3
Data setelah diurutkan

Data ke-1 : 20.2


Data ke-2 : 25.2
Data ke-3 : 30.3
Data ke-4 : 31.3
Data ke-5 : 50.5
113

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 elemen indeks ke-0 dari array tsb”.
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

&nama_array[indeks]

Misalnya,

&data[1]

menyatakan alamt dari elemen ke-1. Adapun

&data[0]

sama saja dengan:


114

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

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.
115

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 VII
STRING

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.

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

A B C D E \0

Gambar 7.1 Komposisi penyimpanan string dalam memori

113
114

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”;

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.
115

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.c


Contoh 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);


}

Contoh eksekusi :

Masukkan nama Anda : SAIFUDDIN


Halo, SAIFUDDIN. Selamat belajar string.
116

Ruang yang disediakan setelah deklarasi: char name[15];

name :

Setelah data yang dimasukkan berupa : SAIFUDDIN

name : S A I F U D D I N \0

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.
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 118.

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 :
117

#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();
}
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);
}
118

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.c


Contoh 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); //masukan dr keyboard
for(i=0; teks[i]; i++)
jumkar++;

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


}

Contoh eksekusi :

Masukkan satu kalimat (maks 255 karakter).


Saya akan menghitung jumlah karakternya.

SAYA SUKA BELAJAR BAHASA C


119

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 ke0)
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.
120

/* File program : salinstr.c


Contoh menyalin suatu string */

#include <stdio.h>

#define MAKS 30

main()
{ int i;
char asal[] = “Saya menyukai bahasa C”;
char hasil[MAKS];

i=0;
while (asal[i] != ‘\0’)
{
hasil[i] = asal[i]; i++;
} hasil[i] = ‘\0’; /* beri karakter
NULL */
printf(“Isi hasil : %s\n”, hasil);
}

Contoh eksekusi :

Isi hasil : 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;
121

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)

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()
{
122

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 : ABCDE


String kedua adalah : ABCDE

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.c


Contoh memperoleh panjang suatu string */

#include <stdio.h>
#include <string.h>

main()
{
char salam[] = "Halo";

printf("Panjang string = %d karakter\n", strlen(salam));


}

Contoh eksekusi :
Panjang string = 4 karakter
123

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

Dalam hal ini str1 (“sala”) digabungkan dengan str2 (“tiga”) dengan hasilnya berada di str1
(“salatiga”).
124

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));
}
125

Contoh eksekusi :

Hasil pembandingan HALO dengan Halo --> -1


Hasil pembandingan Halo dengan HALO --> 1
Hasil 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 :
126

Dari string ABcde


Mencari karakter B = Bcde
Mencari 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 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 VIII.

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
prototypeprototype-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
127

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.

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
128

Catatan : disebut palindrom adalah bila urutan kalimat dibalik akan menghasilkan
kalimat yang sama. Gunakan berbagai fungsi berkaitan dengan string yang
sudah dijelaskan di atas.
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

px
zzzz 1000

Address

?
1000
x

Gambar 8.1 Variabel pointer px menunjuk ke variabel x


129

8.2 Mendeklarasikan Variabel Pointer


Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :
tipe *nama_variabel

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.

menyatakan variabel
pointer

char *pch1, *pch2; tanda akhir pernyataan deklarasi

nama variabel pointer


tipe data yang ditunjuk
oleh variabel pointer
Gambar 8.2 Ilustrasi pendeklarasian variabel pointer

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

&x

berarti “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 :
px = &x;
130

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 :

*px

yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px” . Sebagai
contoh jika y bertipe int, maka sesudah dua pernyataan berikut

px = &x;
y = *px;

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 */

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);
131

printf("Nilai yang ditunjuk oleh px = %d\n", *px);


printf("Nilai y = %d\n", y);
}

Contoh eksekusi :

Alamat x = 0012FF78
Isi px = 0012FF78
Isi x = 87
Nilai yang ditunjuk oleh px = 87
Nilai y = 87

Pada program di atas, dua pernyataan

px = &x;
y = *px;

sebenarnya dapat digantikan dengan sebuah pernyataan berupa

y = x;

Seandainya pada program di atas tidak terdapat pernyataan

px = &x;

namun terdapat pernyataan

y = *px;

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.
132

/* 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.

double *pu;
float nu; data yang int u; u ditunjuk oleh pu
--------
pu = &u;bukan bagian dari
u

Gambar 8.3 Ilustrasi kesalahan yang terjadi karena tipe tidak sejenis
133

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

*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;
134

/* 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.5


Isi d sekarang = 64.5

8.5 Pointer dan Array (pointer to 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
135

static int tgl_lahir[3] = { 01, 09, 64 };

dan
int
*ptgl;

Kemudian diberikan instruksi

ptgl = &tgl_lahir[0]; //pointer to array of integer

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 */

#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 :
136

Nilai yang ditunjuk oleh ptgl = 16


Nilai 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 = 16


Nilai dari tgl_lahir[0] = 16
Nilai dari tgl_lahir[1] = 4
Nilai 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++)
137

printf("Nilai dari tgl_lahir[i] = %d\n", *ptgl++);


}

Keterangan : tgl_lahir[i] = *(ptgl+i) = *ptgl++

8.6 Pointer dan String (pointer to 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 oleh pkota = ”);


puts(pkota); // printf(“%s\n”, 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”.

pkota Lokasi awal string “SEMARANG”

S E M A R A N G \0

Gambar 8.4 Pointer menunjuk data


138

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

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>
139

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 (Array of 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. xxx ? ?
?

?
?
namahari

Gambar 8.5 Array pointer


 Array pointer bisa diinisialisasi sewaktu pendeklarasian. Sebagai contoh:

static char *namahari[] =


{“Senin”,
140

“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 (Pointer to Pointer)


Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan contoh
mengenai pointer menunjuk pointer.
Pointer Pointer Variabel
ptr2 ptr1 var_x

alamat alamat
nilai
ptr1 ptr1

Gambar 8.6 Pointer yang 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

ptr1 = &var_x;
141

 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.c


Contoh 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 = 273
Nilai var_x = 273

8.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)


{
142

*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.c
Fungsi dengan argumen berupa pointer */

#include <stdio.h>

void naikkan_nilai(int *, int *);

main()
{
int a = 3, 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)
143

{
*x = *x + 2;
*y = *y + 2;
}

Contoh eksekusi :
Semula : a = 3 b = 7
Kini : 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] );
}
144

 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.

/* File program : pbulan.c


Fungsi dengan keluaran berupa pointer yang menunjuk string */

#include <stdio.h>

char *nama_bulan(int n); //prototype function

main()
{
int bl;
char *pch;
145

printf("Masukkan Bulan 1..12 :


"); scanf("%d", &bl); pch =
nama_bulan(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.
146

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini

1.Berapa nilai dari z dan s pada output program dibawah ini.

#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 ?

#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);
}
147

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 IX
STRUKTUR

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

Struktur adalah pengelompokan variabel-variabel yang bernaung dalam satu nama yang
sama. Berbeda dengan 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

145
146

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;
};

struct date {
int month, day, year;
};

yang mendefinisikan sebuah tipe data struktur bernama date yang memiliki tiga buah elemen
(field) berupa : - day
- month - year

kata kunci nama tipe struktur

struct date
mengawali dan { int month; masing-masing
mengakhiriint day; disebut field atau elemen-elemen
int year; elemen struktur
struktu };
r
Gambar 9.1 Pendefinisian tipe struktur

Untuk mendeklarasikan sebuah variabel today yang bertipe struktur date pernyataan
yang diperlukan adalah sebagai berikut:

struct date today;


nama tipe strukturvariabel struktur

Gambar 9.2 Pendeklarasian variabel bertipe struktur

Pernyataan di atas menyatakan bahwa variabel today bertipe struktur date.

Dalam mendefinisikan sebuah struktur, elemen yang terkandung di dalamnya bisa


juga berupa sebuah struktur, contoh :
147

struct date {
int month, day, year;
};

struct person {
char name[30];
struct date birthday;
};

struct person student; //deklarasi var student

Diagram struktur data dari variabel student dapat digambarkan sbb :


name

student month

birthdayday

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

variabel_struktur.nama_field

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;
148

 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. Mulamula field dari
struktur diisi dengan suatu data, kemudian isinya ditampilkan.

/* File program : student1.c


Mengisi 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 IHSAN


Birthday : 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
149

static struct zodiak bintang =


{"Sagitarius", 22, 11, 21, 12};

Selengkapnya perhatikan contoh program di bawah ini.

/* File program : zodiak.c


Menentukan zodiak berdasarkan data tanggal lahir masukan */

#include <stdio.h>

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); else
printf("Bintang Anda bukan %s\n", bintang.nama);
}

Contoh eksekusi :

Masukkan tgl lahir Anda (XX-XX-XXXX): 23–11-1972


Bintang 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 :
150

#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;
};

/* 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.

birthday

name month day year

0
1

18
19

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);
151

};

Selengkapnya perhatikan contoh program di bawah ini.

/* File program : student2.c


Array struktur untuk menyimpan data-data student */

#include <stdio.h>

#define MAKS 20

struct date { /* definisi global dr tipe date */


int month; 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");
152

} 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 );
};
}

Contoh eksekusi :

Name : Salsabila
Birthday (mm-dd-yyyy) : 10-25-1979

Mau memasukkan data lagi [Y/T] ? y

Name : Wildan
Birthday (mm-dd-yyyy) : 4-16-1974

Mau memasukkan data lagi [Y/T] ? t

DATA SISWA
1. Name : Salsabila
Birthday : 10-25-1979

2. Name : Wildan
Birthday : 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];
153

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).

/* File program : cetak1.c


Melewatkan elemen struktur sbg parameter fungsi scr nilai */

#include <stdio.h>

void cetak_tanggal(int, int, int);


154

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-2001


Todays 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 *, int *);


155

main()
{
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, 21


x, y semula = 34, 21
x, y sekarang = 21, 34

9.5.2 Melewatkan Struktur ke 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);
156

main()
{
struct date today;

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-2001


Todays 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,


157

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

(*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 *);

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;
158

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}

Contoh eksekusi :

Masukkan koordinat posisi (x, y) : 34,


21 x, y semula = 34, 21 x, 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

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, namun tipe datanya tidak harus sama.
159

• 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.

4. Tampilkan ke layar (menggunakan fungsi printf()) string yang tersimpan dalam array
word dari struktur sample.
160

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 X
DATA 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.

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.
162

161
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] di

Gambar 10.1 Variabel bil_x yang bertipe union bil_bulat 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 4
byte (yaitu ukuran dari tipe int).
Elemen dari sebuah union dapat diakses dalam bentuk sebagai berikut :

variabel_union.nama_elemen

misal : bil_x.di = 321; adalah contoh untuk mengisikan 321 ke elemen union bernama
di. Kalau dituliskan angka biner dari 321 = 101000001. 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.c


Contoh pendeklarasian dan pengaksesan variabel union */

#include <stdio.h>

main()
{
union
{
unsigned int di;
unsigned char dc[2];
} bil_x; /* variabel union */

bil_x.di = 321;

printf("di = %d\n”, bil_x.di); printf(“dc[0]


= %d dc[1] = %d\n", bil_x.dc[0],
bil_x.dc[1]);
163

}
Contoh eksekusi :

di = 321
dc[0] = 65 dc[1] = 1

Program di atas menjelaskan cara ntuk mengakses byte ke-0 atau byte ke-1 dari di, dc[0]
atau dc[1] yang digunakan.

321 Nilai 321 dalam kesatuan unsigned int

1 65

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.c


Contoh 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); /*prototype fungsi */
main() {
union bil_bulat bil_x; /* deklarasi var union */

/* melewatkan alamat union */


beri_nilai(&bil_x); printf("di =
%d\n”, bil_x.di); printf(“dc[0] = %d dc[1] = %d
\n",bil_x.dc[0], bil_x.dc[1]);
164

void beri_nilai(union bil_bulat *x)


{
x -> di = 321; /* elemen di yang ditunjuk */
} /* oleh x diberi nilai 321 */

Contoh eksekusi :
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 :
bit 7 6 5 4 3 2 1 0

bbbbbbbb iiiiiiii
165

tttttttt 76543210

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;
};
panjang/jumlah bit
nama 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.c


Bitfield utk menampilkan bentuk biner dr karakter masukan */

#include <stdio.h>

main()
{
struct info_byte /* definisi tipe bitfield */
{
166

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 : A


Kode ASCII karakter A adalah 65 Bentuk
biner dari nilai 65 adalah 01000001

Pada program di atas, setelah pernyataan :

scanf(“%c”, &ascii.karakter);

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';
167

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
168

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;

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 */
169

} 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 = 3
info_y = 1

10.3 Enumerasi
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 :

enum nama_tipe_enumerasi {

konstanta_1, konstanta_2,…

} variabel_1, …, variabel_n;

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.c


Contoh penggunaan enumerasi */

#include <stdio.h>

main()
{
enum manusia { /* definsi tipe */
pria, wanita
170

};
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 = 0
Isi jns_kelamin = 1

Dengan 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
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.
171

/* File program : enum2.c


Contoh 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) : 8


Jumlah jam kerja hari SELASA (jam) : 8
Jumlah jam kerja hari RABU (jam) : 8
Jumlah jam kerja hari KAMIS (jam) : 8
Jumlah jam kerja hari JUMAT (jam) : 6

Total jam kerja = 38

Penggalan pernyataan berikut

for(hari_kerja=senin; hari_kerja<=jumat; hari_kerja++);

lebih memberi kejelasan daripada penulisan :


172

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.c


Contoh 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 :
4
5
6

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.
173

Bentuk umum pernamaan suatu tipe data menggunakan typedef :


typedef tipe_data nama_baru;

Contoh :

typedef unsigned char BYTE;


typedef char karakter;

karakter a;

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 :

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.c


Contoh 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);
174

Contoh eksekusi :

Isi kode = 143

Contoh lain penamaan tipe dengan typedef :


 typedef char *STRING;
menyatakan bahwa tipe STRING adalah tipe pointer yang menunjuk data char
(pointer to char).
 typedef struct { 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 :
kondisi1 ? ungkapan1 : ungkapan2;

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.
175

salah
benar

max = (nilai1 > nilai2) ? nilai1 : 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.c


Menentukan nilai terbesar dengan ternary operator */

#include <stdio.h>

main()
{
float nilai1, nilai2, max;
176

printf("Masukkan dua buah nilai : ");


scanf("%f %f", &nilai1, &nilai2);

max = (nilai1 > nilai2) ? nilai1 : nilai2;


printf("Nilai terbesar = %g\n", max);
}

Contoh eksekusi :
Masukkan dua buah nilai : 9 10.5
Nilai 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 :

(tipe) ungkapan

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.c


Melihat efek cast dalam konversi tipe */

#include <stdio.h>

main()
{
int x = 21;
float y;
177

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.000000
y = (float) x/2 = 10.500000
y = (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.
 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.

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
178

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;
else
discount = 0;
BAB XI
OPERASI FILE

Tujuan :
1. Menjelaskan tentang struktur file
2. Menjelaskan tentang tahap-tahap operasi pada file
3. Menjelaskan tentang fungsi untuk penyimpanan dan pembacaan file per-karakter
4. Menjelaskan tentang file biner dan file teks
5. Menjelaskan tentang operasi penyimpanan dan pembacaan file per-int
6. Menjelaskan tentang operasi penyimpanan dan pembacaan file per-blok
7. Menjelaskan cara membaca dan menyimpan data string pada file
8. Menjelaskan cara mengakses file biner secara acak
9. Menjelaskan cara menghapus file
10. Menjelaskan cara mengganti nama file

11.1 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).

FILE

RECORD … RECORD

FIELD FIELD FIELD

BYTE … BYTE
)
(8 BIT

Gambar 11.1 Struktur-data dari file


180

179
11.2 Tahapan Operasi File
Operasi pada file pada dasarnya meliputi tiga tahapan, yaitu :
1. Membuka/mengaktifkan file
2. Melaksanakan proses file
3. Menutup file

11.2.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);

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 pada current
directory.
 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.
181

Keluaran fungsi fopen() berupa pointer yang menunjuk ke tipe FILE (pointer to 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).

Informasi file pf
COBA.TXT

pointer-ke-FILE
struct 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”);
182

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.2.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.3 Operasi Penyimpanan dan Pembacaan File Per Karakter


11.3.1 Fungsi fputc()
Sebuah karakter dapat disimpan/dituliskan ke dalam file dengan menggunakan fungsi
fputc(). Bentuk deklarasi dari fungsi ini :
183

int fputc(char kar, FILE *ptr_file);

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\n");
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.TXT
184

Mencoba 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 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
185

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 */
}

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 4
byte (pada mesin 32 bit), berapapun harganya.
186

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 :
187

int _putw(int nilai, FILE *ptr_file);


int _getw(FILE *ptr_file);
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.c


contoh 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');
188

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: 60


Memasukkan data lagi (Y/T)? y

Bilangan yang akan disimpan: 998


Memasukkan data lagi (Y/T)? y

Bilangan yang akan disimpan: -75


Memasukkan data lagi (Y/T)? t Oke.
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.c


Contoh 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);
}
189

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. 60
2. 998
3. –75

11.6 Operasi Penyimpanan dan Pembacaan File Per Blok


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.
190

 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.c


Menyimpan 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 : ");


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 {
191

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 Design


Nama pengarang : Igor T. Hawryszkiewycz
Jumlah : 1
Mau merekam data lagi [Y/T] ? Y
Judul buku : C Programming FAQs
Nama pengarang : Steve Summit
Jumlah : 4
Mau merekam data lagi [Y/T] ? Y

Judul buku : The C Programming Language


Nama pengarang : Brian WK & Dennis MR
Jumlah : 2
Mau merekam data lagi [Y/T] ? T

Pada 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.c


Membaca data bertipe struktur ke file menggunakan fread() */

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

main()
{
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 Jumlah


1. Relational Database Design Igor T. Hawryszkiewycz 1
2. C Programming FAQs Steve Summit 4
3. The C Programming Language Brian WK & Dennis MR 2
193

11.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.
 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.c


Membaca isi file teks */

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

#define PANJANG 256


194

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 TEKS

Masukkan nama file : coba.txt


Isi file %s adalah sbb :
Mencoba menulis ke file COBA.TXT

/* File program : fputs.c


Membaca 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];
195

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);
}

/* 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 TEKS

Masukkan nama file input : coba.txt


Masukkan nama file output: out.txt

Isi file coba.txt adalah :


196

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

Konstanta Nilai Lokasi file

SEEK_SET 0 Awal file


SEEK_CUR 1 Posisi penunjuk file saat ini

SEEK_END 2 Akhir file

Catatan :
 Konstanta simbolis SEEK_SET, SEEK_CUR dan SEEK_END didefinisikan pada file
stdio.h
 Prototipe fseek() ada pada stdio.h

Beberapa contoh :
(1) fseek(pf, 3, SEEK_SET);
197

Pernyataan seperti ini akan menempatkan penunjuk file ke posisi 3 byte sesudah awal file
(SEEK_SET).

3 byte dari posisi semula


awal file penunjuk file

awal file posisi kini penunjuk file

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).

posisi semula 3 byte dari penunjuk


file akhir file
posisi kini penunjuk file akhir file

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.

posisi semula
penunjuk file posisi kini penunjuk file

3 byte terhadap
posisi semula

Gambar 11.5 Ilustrasi penggunaan SEEK_CUR


198

/* File program : baca_acak.c


Membaca isi file secara random */

#include <stdio.h>
#include <stdlib.h>
main()
{
struct { 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')
199

||(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 Jumlah


1. Relational Database Design Igor T. Hawryszkiewycz 1

Mau mencoba lagi (Y/T)? Y


Nomor record dari data yg mau ditampilkan : 3

No. Judul Buku Nama Pengarang Jumlah


1. The C Programming Language Brian WK & Dennis MR 2

Mau mencoba lagi (Y/T)? Y


Nomor record dari data yg mau ditampilkan : 7
Nomor record tidak dikenali!

Mau mencoba lagi (Y/T)? T

Mula-mula program menanyakan nomor record dari data yang ingin ditampilkan. Selanjutnya
enunjuk 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.c


Mengganti isi suatu record secara random */

#include <stdio.h>
200

#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);
}

/* 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);
201

/*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 : 2

Judul Buku Nama Pengarang Jumlah

C Programming FAQs Steven Summit 4

Jumlah buku tsb kini = 5

Mau mengubah lagi (Y/T) ? T

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 :
202

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.c


Contoh 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");

else
printf("Gagal dalam menghapus file\n");
}

Contoh eksekusi :

Nama file yang akan dihapus : bilangan.dat


File sudah dihapus

11.10 Mengganti Nama File


Untuk mengganti nama file, fungsi yang digunakan yaitu rename(). Bentuk deklarasinya :
int rename(char *namafilelama, char *namafilebaru);
203

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.c


Contoh 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.dat


Nama file yang baru : bilangan1.dat

Nama file sudah diganti

Kesimpulan :
• 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().
204

• 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.
• 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().

atihan :
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 char (misalkan nama
205

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.
DAFTAR PUSTAKA

Kadir, Abdul, Pemrograman Dasar Turbo C, Andi Offset, Yogyakarta, 1991

Kerninghan, Brian W., dan Ritchie, Dennis M., The C Programming Language, Prentice
Hall, Englewood Cliffs, New Jersey, 1988

Summit, Steve, C Programming FAQs, Addison-Wesley Publishing Company, Inc., 1996

Van Der Linden, Peter, Expert C Programming Deep C Secrets, Prentice Hall, Englewood
Cliffs, New Jersey,1994
vi

Anda mungkin juga menyukai