55472_materialpemrograman
DESCRIPTION
dpkTRANSCRIPT
BAB I. Pengenalan SIstem Komputer
I.1. Sistem Komputer
Komputer adalah perangkat elektronika dapat diprogram yang
ditujukan untuk mengolah data. Dengan kemampuan dapat
diprogram komputer dapat melaksanakan tugas-tugas yang
berbeda-beda mulai dari tugas-tugas sederhana hingga tugas-tugas
yang sangat kompleks.
Komputer adalah perangkat elektronik yang digunakan untuk
melakukan tugas-tugas sebagai berikut :
Menerima masukan berupa data
Mengolah data masukan sesuai dengan program
Menyimpan masukan dan hasil pengolahan data
Memberikan keluaran hasil pengolahan
Komputer yang kegunaan umum digunakan secara individual
mungkin digunakan untuk mengetik sebuah dokumen atau mengolah
data-data keuangan pada tabel atau bahkan membuat sebuah
program sambil terhubung ke server aplikasi media sosial. Selain
komputer kegunaan umum terdapat juga jenis komputer kegunaan
khusus. Misalnya sebuah komputer sederhana misalnya mungkin
digunakan untuk mengatur perangkat rumah tangga seperti mesin
cuci, oven microwave atau televise pintar. Terdapat pula komputer
yang khusus yang digunakan pada perangkat konsol permaianan
playstation, x-box wii dan lain sebagainya. Komputer juga telah
digunakan pada perangkat telekomunikasi nirkabel.
Sistem komputer dapat pula terdiri dari beberapa komputer yang
saling terhubung pada jaringan membentuk sebuah sistem komputer
yang lebih besar yang disebut cluster. Komputer jenis ini digunakan
tidak untuk aplikasi umum yang sering dijumpai pada penerapan
bisnis melainkan digunakan pada penelitian banyak bidang.
I.2. Perangkat Keras Komputer
Sebagai sebuah sistem komputer terdiri dari beberapa subsistem
yang saling terhubung untuk mencapai tujuan pengolahan data.
Secara garis besar subsistem-subsistem pada sistem komputer
terdiri dari subsistem unit pemroses, subsistem input dan output
serta subsistem memori dan penyimpanan. Subsistem-subsistem
tersebut terhubung satu sama lain melalui bus alamat, bus data,
bus kontrol dan antarmuka.
Unit Pemroses
Unit pemroses pusat berasal dari kata bahasa Inggris Central
Processing Unit. Unit pemroses pusat ini disingkat sebagai unit
pemroses. Unit pemroses dikenal juga secara popular dengan nama
prosesor. Pada sistem komputer unit pemroses ini berfungsi sebagai
berikut :
1. Mengambil intruksi-intruksi program dari memori.
2. Mengambil data dari memori
3. Mengeksekusi instruksi untuk memproses data
4. Mengendalikan alur program
Unit pemroses sangat menentukan program-program yang bisa
dijalankan. Hal ini mengandung pemahaman bahwa program yang
dapat berjalan pada sebuah jenis prosesor belum tentu dapat
berjalan pada jenis prosesor yang lain. Sebabnya adalah oleh karena
program asli (native) yang dapat dijalankan adalah merupakan
sederetan kode-kode biner yang hanya dipahami oleh prosesor-
proses tertentu. Kompiler telah membuat program-program tersebut
menjadi kode biner secara spesifik untuk arsitektur prosesor target
tertentu. Misalnya program yang telah terpasang pada komputer
dengan prosesor buatan perusahaan Intel tidak dapat berjalan pada
komputer dengan prosesor buatan Sun microsystems dan lain
sebagainya. Hal tersebut disebabkan oleh karena prosesor-prosesor
buatan pabrik yang berbeda memiliki set intruksi yang berbeda-beda.
Instruksi-instruksi yang dapat dieksekusi oleh prosesor buatan Intel
adalah instruksi-instruksi yang tidak dapat dieksekusi oleh prosesor-
prosesor buatan sun microsystem. Demikian pula sebaliknya.
Untuk dapat menjalankan sebuah program, prosesor-prosesor tidak
harus dibuat oleh perusahaan yang sama. Salah satu syarat agar
prosesor-prosesor yang berbeda dapat menjalankan program yang
sama adalah prosesor-prosesor tersebut harus memiliki kesamaan
arsitektur set instruksi (instructions set architecture). Misalnya
perusahaan pembuat chip-chip prosesor Intel dan AMD. Meskipun
mereka adalah pembuat chip prosesor yang berbeda, namun
keduanya membuat prosesor-prosesor yang kompatibel dengan
arsitektur x86.
Unit pemroses mempunyai beberapa komponen utama. Komponen
utama tersebut yaitu
unit control,
arithmetics logic unit dan
register files.
Unit kontrol berfungsi mengambil intruksi dari memori, mendekode
instruksi dan mengeksekusi instruksi. Arithmetics logic unit berfungsi
untuk melakukan operasi aritmetika dan logika berdasarkan instruksi
mikro yang merupakan hasil dekode instruksi oleh unit kontrol.
Disebut sebagai register files disebabkan bagian ini terdiri dari
sejumlah register. Register-register yang umum dijumpai pada
banyak unit pemroses adalah instruction pointer, stack pointer,
instruction register, memory address register memory data register
dan register-register kegunaan umum.
Memori
Memori merupakan komponen yang pasti ada pada setiap komputer
digital. Pada memori program dan data berada. Unit pemroses
menjalankan program yang tersimpan pada memori untuk mengolah
data yang juga berada pada memori. Jadi jika komputer tidak
memiliki memori maka komputer tersebut tidak dapat bekerja.
Untuk komputer digital memori adalah sejenis memori semikonduktor.
Umumnya memori semikonduktor yang digunakan pada komputer
digital adalah RAM. Pada era tahun 1980-1900 ROM masih
digunakan untuk menyimpan program-program dan data-data
konfigurasi komputer pribadi secara permanen. Kini penggunaan
ROM telah digantikan dengan memori flash.
Baik jenis RAM, ROM maupun flash, memori merupakan
sekumpulan lokasi-lokasi penyimpanan yang memiliki alamat.
Lokasi-lokasi memori terbagi atas beberapa kelompok segmen.
Segmen-segmen tersebut yaitu :
Segmen kode (text)
Segmen data
Segmen stack
Heap
Gambar. Layout memori untuk program C
Segmen kode adalah lokasi-lokasi dimana kode-kode instruksi
berada.Setiap instrkuksi tersimpan pada lokasi-lokasi tersebut
sesuai dengan format instruksi-instruksi tersebut. Format instruksi
menentukan elemen-elemen instruksi yang meliputi kode operasi
dan operan (data).
Segmen data adalah satu bagian ruang alamat virtual dari program
yang berisi variabel global, variabel statis. Segmen ini terbagi atas
dua yaitu segmen data terinisialisasi dan segmen data tidak
terinisialisasi. Segmen data terinisialisasi digunakan oleh variabel
global dan statis yang terinisialisasi.
Segmen stack adalah sebuah bagian ruang alamat virtual dari
program yang digunakan oleh program untuk mengirim parameter
ke sub-program (prosedur/fungsi). Ketika sebuah fungsi dipanggil
dapat saja parameter-parameter fungsi dikirimkan. Parameter-
parameter tersebut dikirimkan dengan cara pemanggil melakukan
operasi push terhadap masing-masing parameter ke atas stack.
Operasi-operasi push ini mengakibatkan stack bertumbuh dengan
arah menuju ke lokasi yang rendah (beralamat lebih kecil). Selain
untuk mengirim parameter ke prosedur atau fungsi, stack
digunakan oleh program untuk menyimpan variabel lokal. Setiap
variabel lokal dialokasikan maka stack juga bertumbuh sebanyak
sesuai dengan ukuran dari variabel lokal tersebut. Gambar 1
memperlihatkan arah pertumbuhan stack yang bias mencapai atau
bahkan melewati perbatasan dengan daerah heap. Jika
pertumbuhan stack ini melampaui batas ini maka stack overflow
terjadi.
Heap adalah sebuah bagian ruang alamat virtual dari program yang
digunakan oleh program untuk mengalokasikan memori dinamis.
Segmen heap mulai setelah segmen data tak terinisialisasi berakhir.
Bersamaan dengan bertambahnya jumlah alokasi memori dinamis
yang dilakukan heap bertumbuh dengan arah ke daerah yang lebih
tinggi (beralamat lebih besar).
Perangkat Input dan Output
Unit pemroses menjalankan program untuk mengolah data. Data
bersumber dari kejadian yang terjadi diluar sistem komputer. Tanpa
adanya perangkat input data tidak dapat masuk ke dalam sistem
komputer. Perangkat input memberikan jalan masuk bagi data ke
dalam sistem komputer. Bahkan ketika media penyimpanan hardisk
tidak tersedia, program pengguna tersimpan pada media eksternal.
Agar program pengguna dapat dijalankan, program pengguna
harus dimasukkan terlebih dahulu melalaui perangkat input. Tanpa
adanya perangkat input, maka komputer akan berhenti bekerja.
Data yang diolah oleh unit pemroses adalah informasi yang
tersimpan dalam sistem komputer. Informasi tersebut dibutuhkan
oleh pengguna. Agar pengguna dapat memperoleh informasi hasil
pengolahan data, sistem komputer harus dapat mengeluarkan
informasi tersebut untuk pengguna. Untuk itu perangkat output
diperlukan agar sistem komputer dapat menyajikan informasi
kepada pengguna. Tanpa perangkat output komputer adalah
perangkat yang tidak memiliki kegunaan sama sekali bagi
penggunanya.
Perangkat input yang paling popular adalah keyboard. Pengguna
menggunakan keyboard untuk memasukkan perintah dan data
kepada komputer. Pengguna memasukkan perintah atau data
dengan cara mengetikkan perintah atau data tersebut pada
keyboard. Perangkat input yang lainnya yaitu mouse yang
digunakan pada sistem operasi dan program aplikasi yang berbasis
grafis.
Pada era tahun 80-an dan awal 90-an terdapat sebuah perangkat
input yang kurang dikenal oleh pengguna. Perangkat ini digunakan
untuk memasukkan baik data atau program dari media
penyimpanan eksternal seperti floppy disk dan compact disc.
Perangkat ini dikenal sebagai penggerak floppy disk atau compact
disc. Perangkat-perangkat tersebut merupakan kombinasi dari
perangkat mekanis yang berfungsi untuk memutar media dan
elektronis yang mengambil data elektronis dari media.
Perangkat output yang popular adalah layar display. Layar ini
menampilkan data dan informasi secara visual kepada pengguna.
Informasi dan data yang ditampilkan dapat dalam moda teks
ataupun moda grafis.
Pada moda teks, perintah atau data yang diketikkan oleh pengguna
secara langsung ditampilkan secara tekstual perbaris pada layar
display. Mekanisme seperti demikian memberikan antarmuka
antara pengguna dan komputer yang disebut antarmuka baris
perintah (command line interface).
I.3. Perangkat Lunak Komputer
Komputer adalah kesatuan yang tidak dapat dipisahkan antara
perangkat lunak dan perangkat keras. Tanpa perangkat lunak,
perangkat keras komputer adalah sebuah barang yang tidak
berguna. Demikian pula sebaliknya perangkat lunak tidak dapat
dieksekusi tanpa perangkat keras. Bahkan perangkat lunak tidak
mungkin ada tanpa perangkat keras karena perangkat lunak butuh
media yang merupakan perangkat keras.
Perangkat lunak diwujudkan sebagai sederetan kode-kode biner
yang dimengerti oleh unit pemroses. Kode-kode biner ini tersimpan
pada berbagai jenis media. Hakikat dari wujud perangkat lunak
tergantung pada media di mana ia tersimpan. Pada media piringan
lentur (floppy disc), perangkat lunak tersimpan sebagai sekumpulan
medan-medan magnetik. Sedangkan pada memori utama
perangkat lunak tersimpan sebagai muatan-muatan listrik yang
tersimpan pada kapasitor-kapasitor. Ketika perangkat lunak dimuat
dari media piringan lentur ke memori utama, medan-medan
magnetic diubah menjadi isyarat-isyarat listrik digital dan kemudian
menjadi muatan-muatan listrik.
Perangkat lunak komputer terbagi atas dua kategori yaitu :
Perangkat lunak sistem
Perangkat lunak pengguna
Perangkat lunak sistem adalah perangkat lunak yang berjalan
sebagai sistem pada sistem komputer. Perangkat lunak sistem ini
dibuat agar sistem dan subsistem-subsistem komputer dapat
bekerja. Misalnya perangkat lunak protokol stack tcp/ip yang
memungkinkan subsistem jaringan memberikan layanan kepada
program pengguna dan pengguna itu sendiri sehingga kita dapat
terhubung ke Internet dan menggunakan layanan-layanan Internet.
Selain itu terdapat sekumpulan perangkat lunak sistem yang
disebut Sistem Operasi. Sistem operasi adalah perangkat lunak
sistem yang memberikan layanan kepada perangkat lunak aplikasi
dan juga kepada pengguna. Dengan adanya layanan yang
diberikan kepada perangkat lunak aplikasi, pengembang aplikasi
tidak perlu mengetahui secara detail bagaimana kode mengakses
ke perangkat keras dituliskan. Pengembang aplikasi cukup harus
tahu bagaimana cara menulis kode meminta layanan akses ke
perangkat keras ke sistem operasi. Bagian dari sistem operasilah
yang akan melakukan akses ke perangkat keras secara langsung
untuk memberikan layanan kepada program aplikasi. Layanan
yang diberikan sistem operasi kepada program aplikasi disebut
Application Program Interface (API). Dalam rangka pelayanan
tersebut sistem operasi menangani tugas-tugas sebagai berikut
Pengelolaan prosesor dan proses-proses yang berjalan
padanya
Pengelolaan memori
Pengelolaan perangkat I/O
Pengelolaan media penyimpanan (storage)
Pengelolaan berkas-berkas (files)
Pelayanan antarmuka pemakai (user interface)
Perangkat lunak aplikasi adalah perangkat lunak yang
dikembangkan untuk pengguna. Pengguna menggunakan program
aplikasi untuk bermacam macam tujuan. Ada perangkat lunak
aplikasi yang pengguna gunakan untuk membantu pekerjaan
mengetik, membuat tabel laporan keuangan dan ada pula aplikasi
yang digunakan hiburan. Selain itu ada program aplikasi yang
digunakan untuk mengembangkan program aplikasi lain. Umumnya
perangkat lunak pengembang ini terdiri dari beberapa perangkat
lunak yang mengintegrasikan penyunting kode, kompiler dan
perangkat pelacak kesalahan (debugger).
BAB II.
Teori Dasar Pemrograman Komputer
Tujuan
Mahasiswa ,memahami yang dimakasud dengan pemrograman
komputer,bahasa pemrograman komputer dan dasar teknik-teknik
pemrograman komputer.
II.1. Pengertian
Pemrograman komputer merupakan kegiatan menuliskan kode
program komputer menggunakan aturan-aturan penulisan
instruksi-instruksi komputer. Aturan penulisan program ini meliputi
himpunan perbendaharaan kata dan himpunan aturan grammatical.
Dengan himpunan perbendaharaan kata menulis program komputer
bermakna menyusun kata-kata dari suatu bahasa yang merupakan
instruksi bagi komputer untuk menjalankan tugas tertentu. Dan
dengan himpunan aturan gramatikal menulis program mengikuti
aturan-aturan struktur baku bahasa tertentu. Dalam hal ini yang
dimaksud bahasa adalah bahasa pemrograman.
II.2. Bahasa Pemrogram Tingkat Rendah dan Tinggi
Bahasa Mesin
Pada hakikatnya mesin komputer hanya bisa menerima
instruksi-instruksi dalam bahasa mesin. Instruksi-instruksi mesin ini
merupakan kode-kode biner untuk sebuah target unit pemroses
spesifik. Instruksi-instruksi merupakan kata-kata yang terangkum
dalam set instruksi-intruksi unit pemroses. Bersamaan dengan aturan
gramatikalnya, set instruksi-instruksi membentuk bahasa mesin suatu
komputer spesifik. Secara ringkas dikatakan bahasa mesin
merupakan bahasa pemrograman yang spesifik arsitektur prosesor.
Ini berarti bahasa mesin tidak portable dari suatu arsitektur prosesor
ke arsitektur prosesor yang lain.
Menuliskan program menggunakan bahasa mesin dilakukan dalam
representasi kode biner ataupun hexadecimal. Penulisan program
dalam representasi kode hexadecimal harus melalui proses translasi
dari kode hexa menjadi kode biner. Proses translasi tersebut sangat
mudah dikarenakan fakta bahwa setiap digit hexadecimal adalah 4
digit biner. Dengan demikian menuliskan program dengan kode
hexadecimal lebih ringkas dibandingkan menuliskan kode biner.
Bahasa Rakitan
Meskipun menuliskan kode hexadecimal lebih ringkas daripada
menulis kode biner, namun karena instruksi-instruksi masih
direpresentasikan berupa bilangan-bilangan, menulis program
dengan bahasa mesin seperti ini masih sangat sulit. Pemrogram
masih menghadapi kesulitan untuk selalu menghapalkan
instruksi-instruksi dalam kode hexa. Untuk itu untuk setiap instruksi
kode bahasa mesin dibuatkan kode mnemonic yang pembuat
program mudah mengingat. Kode mnemonic sebenarnya merupakan
kata dalam bahasa inggris yang disingkat penulisannya dan
menunjukkan operasi yang harus dilakukan oleh prosesor. Karena
mnemonic lebih mudah diingat daripada kode hexa atau biner,
menulis program dengan mnemonic lebih mudah dibandingkan
dengan menggunakan kode hexadecimal ataupun biner. Penggunaan
mnemonic dalam pemrograman komputer memunculkan bahasa
pemrograman yang disebut dengan bahasa rakitan (assembly).
Program yang ditulis dalam bahasa rakitan menggunakan editor teks
disebut kode sumber. Kode sumber ini tidak dapat langsung
dijalankan pada sebuah komputer tapi ia harus ditranslasikan menjadi
kode biner yang disebut kode obyek. Perangkat lunak yang
digunakan untuk translasi ini disebut assembler. Meskipun bahasa
rakitan ini menggunakan mnemonic yang menyerupai kata bahasa
alami,namun karena setiap mnemonic merepresentasikan setiap
instruksi bahasa mesin bahasa rakitan ini dikategorikan sebagai
bahasa pemrograman tingkat rendah.
Menulis program dengan bahasa rakitan merupakan pekerjaan yang
sangat sulit untuk dilakukan. Kelemahan menulis program dengan
bahasa rakitan yaitu jumlah kode yang dibuat sangat panjang dan
mudah terjadi kesalahan. Pembuat program harus menuliskan kode
sumber sebanyak ribuan baris untuk sebuah program yang tidak
besar. Dengan bertambahnya jumlah baris kode yang dibuat semakin
besar pula peluang terjadinya kesalahan penulisan dan logika
program dan semakin sulit pula untuk dilacak kesalahannya.
Namun demikian keuntungan yang diperoleh menggunakan bahasa
rakitan adalah kode obyek berukuran kecil dan dieksekusi lebih
cepat.
Bahasa Tingkat Tinggi
Seiring dengan meningkatnya kompleksitas permasalahan yang
dihadapi kompleksitas perangkat lunak beserta algoritmanya semakin
meningkat pula. Produktifitas dalam mengembangkan perangkat
lunak dibatasi oleh waktu dan kompleksitas permasalahan serta
bahasa pemrograman yang digunakan. Membuat program yang
kompleks dengan menggunakan bahasa pemrograman tingkat
rendah sangat tidak produktif. Hanya sedikit kode yang bisa
dihasilkan dalam batasan waktu yang ditentukan. Oleh karenanya
bahasa pemrograman tingkat tinggi diperlukan.
Bahasa pemrograman tingkat tinggi adalah juga merupakan bahasa
yang digunakan untuk menulis program komputer. Dengan bahasa
pemrograman jenis ini penulis program tidak perlu mengetahui detail
dari perangkat keras. Keuntungannya bahasa jenis ini
menghilangkan kerumitan yang penulis program biasa hadapi
dengan bahasa tingkat rendah. Bahasa jenis ini meringkas kode yang
dalam bahasa tingkat tinggi sangat panjang menjadi kode yang
pendek. Penulis tidak perlu memberi intruksi menyalin suatu nilai dari
memori ke register, tidak perlu memberi instruksi perkalian dan
menyimpan kembali hasilnya ke memori hanya untuk melakukan
perkalian. Dengan bahasa tingkat tinggi penulis hanya perlu
menuliskan operator perkalian terhadap dua buah variabel.
Bahasa ini sangat mudah dimengerti dan digunakan oleh manusia
karena himpunan kosakata bahasa tingkat tinggi ini menggunakan
kosakata yang biasa digunakan dalam komunikasi formal sehari-hari.
Bahasa pemrograman tingkat tinggi yang popular digunakan oleh
para penulis program diantaranya
Bahasa Basic
Bahasa Fortran
Bahasa Pascal
Bahasa C
Bahasa C++
Bahasa C#
Bahasa Java
II.3. Teknik Interpretasi dan Translasi Program
Program yang ditulis dengan bahasa tinggkat tinggi disebut
dengan program sumber. Komputer sebagai mesin tidak dapat
langsung menjalankan program sumber tersebut. Program sumber
harus diubah menjadi program yang berisi kode-kode mesin yang
dipahami oleh mesin atau program target. Proses pengubahan
dari program sumber menjadi program target dapat dilakukan
dengan teknik interpretasi ataupun translasi.
Teknik interpretasi melakukan penerjemahan setiap kode dari
program sumber menjadi sejumlah kode bahasa mesin yang
langsung dieksekusi. Proses interpretasi membutuhkan perangkat
lunak interpreter yang mengubah program sumber menjadi
kode-kode biner yang dapat dieksekusi. Setiap program akan
dijalankan interpreter dipanggil. Kemudian interpreter membuka
file program sumber dan menerjemahkan dan mengeksekusi
baris-per baris kode program sumber. Jika ada kode program
sumber yang salah maka proses interpretasi berhenti. Penulis
program kemudian dapat memperbaiki kesalahan kode kemudian
melanjutkan proses menjalankan program dari awal lagi. Proses
interpretasi program tidak menghasilkan file program target tapi
hanya kode-kode biner pada memori yang dieksekusi langsung.
Keberadaan kode-kode biner ini bersifat sementara sehingga
program sumber selalu dibutuhkan.
Teknik translasi melakukan penerjemahan program sumber
menjadi program target yang dapat dieksekusi langsung oleh
mesin. Untuk melakukan proses translasi penulis program
membutuhkan perangkat lunak yang disebut compiler. Proses
translasi menerima input program sumber yang tersusun dari
kode-kode bahasa tingkat tinggi dan menghasilkan program target
yang tersusun dari kode-kode bahasa mesin.
A.
BAB III.
Pemrograman Bahasa C
III.1. Pengenalan
Bahasa C adalah bahasa pemrograman yang dikembangkan oleh
Dennis M. Ritchie pada tahun 1972. Bahasa ini dikembangkan dari
bahasa B yang dibuat oleh Ken Thompson. Hingga kini bahasa C
tetap bertahan digunakan secara luas.
Bahasa C adalah merupakan bahasa dan bukan merek dagang
ataupun nama sebuah produk. Karena bahasa C bukan
merupakan nama produk banyak pihak yang membuat perangkat
compiler bahasa C. Banyaknya pihak yang berkontribusi dalam
pengembangan compiler bahasa C menjadikan bahasa C sangat
popular. Beberapa contoh produk-produk compiler C yaitu sebagai
berikut
Ansi C
Tiny C
SDCC (Small Device C Compiler)
Turbo C
MS C
GCC CC
Selain popular, bahasa C mempunyai kelebihan dalam hal
portabilitas. Kode-kode yang dibuat dengan bahasa C dengan
mudah dikompilasi untuk banyak target arsitektur komputer yang
berbeda-beda. Program C yang ditulis untuk komputer dengan
prosesor UltraSpark dengan sedikit modifikasi dapat dikompilasi
untuk komputer dengan prosesor Intel.
Kelebihan lain bahasa C yaitu mendukung pemrograman
terstruktur. Program C adalah program yang terdiri modul-modul
yang disebut dengan nama fungsi. Sifat program yang modular
memudahkan dalam pembuatan program, perbaikan dan
perawatan. Selain itu modularitas membuat kode-kode dapat
digunakan kembali untuk proyek program yang lain dalam bentuk
fungsi-fungsi pustaka.
III.2. Elemen Elemen Bahasa Pemrograman C
1. Simbol-simbol penyusun program C
Program ditulis dengan bahasa C menggunakan beberapa
karakter ASCII diantaranya yaitu :
Alphabet lower case
Alphabet upper case
Angka
Karakter-karakter khusus
! * + ¥ “ <
# ( = | { >
% ) ~ ; } /
^ - [ : , ?
& _ ] ‘ . space
Dengan berbagai symbol-simbol yang dijinkan dalam bahasa
C terbentuk elemen-elemen leksikal program C yang terdiri
atas beberapa kelas diantaranya :
Keyword atau kata kunci : for , do, while
Pengenal atau identifier : x, maks
Konstan : 3.14
Operator : := , +
Punctuation : ;
Parentheses : ()
Bracket : { }
2. Program Utama C
Program C mempunyai program utama yang dituliskan
sebagai fungsi bernama main. Fungsi main ini adalah yang
pertama kali dijalankan. Tanpa fungsi main program C tidak
dapat dijalankan. Dengan demikian sebuah program C yang
paling sederhana adalah program yang paling tidak memiliki
sebuah fungsi main seperti berikut :
void main()
{
}
Program tersebut meskipun tidak melakukan apa-apa namun
ia sudah dapat dieksekusi. Program tersebut tersusun dari
elemen leksikal void, identifier fungsi main, parentheses () dan
sepasang bracket {}. Parentheses digunakan untuk
mendefinisikan parameter formal fungsi. Braket diletakkan
setelah parameter formal. Sepasang braket menandai awal
dan akhir blok fungsi main. Sepasang braket sebenarnya tidak
hanya untuk menandai awal dan akhir sebuah fungsi namun
juga menandai awal dan akhir blok kode. Berikut ini adalah
contoh program utama C dengan parameter.
void main(int argc, char * argv[])
{
Int argument = atoi(argv[0]);
printf(“Hi, parameter fungsi main adalah :
%d¥n”,argument);
}
3. Identifier
Berbagai elemen program seperti variabel, fungsi tipe data dan
lain-lain diberi nama. Nama berbagai elemen-elemen program
itu disebut identifier. Pemberian identifier untuk elemen-elemen
program tersebut harus diawali dengan huruf atau garis bawah
dan kemudian diikuti huruf, garis bawah atau angka. Huruf
uppercase dianggap berbeda dengan huruf lowercase.
Panjang identifier tidak dibatasi namun hanya 32 karakter
pertama yang digunakan. Identifier sebaiknya mencermin
tujuannya, misalnya sebuah identifier untuk sebuah variabel
dapat memberi petunjuk tujuan variabel tersebut. Sebuah
identifier tidak dapat dipisah oleh spasi. Jika identifier
memerlukan lebih dari satu kata, kata-kata tersebut tidak dapat
dipisah oleh spasi. Kata-kata tersebut dapat diberi garis bawah
atau memberikan huruf uppercase untuk setiap awal huruf
kata.
Pada bahasa C identifier bersifat case sensitive dalam artian
bahwa identifier-identifier adalah berbeda jika meskipun ditulis
dengan huruf yang sama namun berbeda huruf besar-kecilnya.
Pasangan identifier berikut ini adalah berbeda.
jumlah dengan Jumlah
printf dan Printf
4. Kata kunci bahasa C
Keyword atau kata kunci adalah identifier yang telah
digunakan oleh bahasa C sehingga tidak boleh digunakan
untuk keperluan lain. Kata kunci atau keyword merupakan
salah satu dari kelas elemen-elemen leksikal bahasa C.
Bahasa C memiliki kata kunci kurang lebih 52 buah. Jumlah ini
tergantung dari versinya. Bahasa C versi C89 mempunya 32
buah kata kunci yang kemudian ditambahkan menjadi 37 dan
44 pada versi C99 dan C11 secara berturut-turut. Kata-kata
kunci itulah yang digunakan saat membuat program dengan
bahasa C. Adapun kata kunci bahasa C adalah sebagai berikut
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while
5. Tipe data dasar
Terdapat beberapa jenis data yang digunakan dalam bahasa C.
Jenis-jenis data tersebut berbeda satu sama lainnya sehingga
tipe data berbeda-beda pula. Adapun tipe data dasar dan
ukurannya yang digunakan dalam bahasa C diperlihatkan
pada tabel 3.1
.:
Tabel 3.1. Tipe data dasar Bahasa C
Jenis Tipe Ukuran memori (byte)
Karakter unsigned char 1
Char 1
Bilangan bulat unsigned int 2
Int 2
short 2
unsigned long 4
Long 4
Bilangan
pecahan
Float 4
Double 8
long double 8
6. Variabel
Disebut variabel dikarenakan nilai yang disimpannya dapat
diubah selama program berjalan. Variabel sebenarnya adalah
memori untuk menyimpan obyek. Daripada menggunakan
alamat memori untuk mengacu sebuah obyek lebih baik
menggunakan identifier atau nama variabel tersebut. Obyek
yang disimpan pada variabel bisa berupa data bahkan dapat
berupa pointer (alamat) ke obyek lain.
Terdapat dua jenis variabel. Variabel jenis pertama adalah
jenis variabel tipe data dasar. Variabel ini menyimpan nilai-nilai
dari data tipe dasar. Variabel jenis kedua adalah jenis
referensial. Variabel jenis ini tidak menyimpan nilai tapi
menyimpan alamat memori data. Termasuk tipe variabel ini
adalah pointer dengan berbagai varian tipe data dan termasuk
berbagai jenis array
Variabel harus dideklarasikan sebelum dapat digunakan.
Deklarasi menentukan tipe dan identifier dari variabel tersebut.
Saat deklarasi variabel dapat pula diberi nilai awal atau
inisialisasi. Cara penulisan deklarasi variabel secara umum
dilakukan sebagai berikut
tipe nama;
tipe nama = nilai;
contoh :
char achar = ‘c’;
int jumlah = 100;
long int;
float phi = 3.14;
double luas;
7. Literal
Literal sering disebut juga sebagai konstan. Konstan disini
tidak berarti sebagai jenis yang menempati memori bernilai
tidak dapat diubah selama program berjalan. Namun literal ini
bermakna sebagai simbol nilai yang tetap. Dalam statemen
penugasan program literal selalu dituliskan pada sisi sebelah
kanan dan tidak pernah dituliskan pada sisi kiri yang
merupakan tempat variabel. Berdasarkan tipe datanya,
terdapat sejumlah tipe literal yaitu :
Literal integer
Literal floating point
Literal string
Literal karakter
Literal karakter yaitu karakter tunggal yang diapit diantara
tanda petik tunggal. Literal karakter ini seluruhnya terdapat
dalam tabel karakter ASCII.
Literal integer dapat berupa integer, long integer dan unsigned
integer. Literal integer dapat dituliskan dengan notasi decimal,
octal, atau hexadecimal. Notasi oktal ditandai dengan angka 0
didepan literal sedangkan notasi hexadecimal ditandai dengan
0x.
Contoh
void main()
{
int x,y,z;
unsigned int ux;
x = 25; y = 047; z = 0xFF;
ux = 123456U;
}
Literal floating-point merupakan nilai numerik yang dapat
mengandung nilai pecahan.
Contoh
float r, luas;
luas = 3.14 * r * r;
Literal String merupakan sebuah untaian nilai karakter. Untaian
karakter ini ditulis dengan cara diapit oleh dua buah tanda petik
ganda.
Contoh berikut ini adalah contoh sebuah literal string.
Contoh :
void main()
{
char literal[15];
judul = “Literal String”;
printf(“Jenis literal adalah %s ¥n”,literal);
}
Pada contoh tersebut terdapat dua buah literal string yaitu
“Literal String” dan “Jenis literal adalah %s ¥n”.
8. Operator
Operator adalah instruksi bahasa tingkat tinggi yang berikan
kepada untuk melakukan operasi yang spesifik. Berdasarkan
jumlah data operand, operator dikelompokkan dalam dua
kategori. Kategori pertama adalah operator unary. Operator
unary yaitu operator yang bekerja terhadap sebuah data.
Operator kedua adalah operator binary. Operator binary yaitu
operator yang bekerja pada dua buah operand. Berdasarkan
jenis operasinya operator-operator bahasa C dapat
dikelompokkan ke dalam kelompok-kelompok sebagai berikut :
Operator penugasan
Operator arithmetika
Operator inkremen dan dekremen
Operator bitwise
Operator relasi
Operator logika
Operator alamat
Operator Penugasan
Operator penugasan adalah instruksi bahasa tingkat tinggi
yang diberikan untuk melakukan operasi pemberian nilai dari
hasil evaluasi terhadap ekspresi terhadap suatu variabel.
Variabel terdapat pada sisi kiri, ekspresi pada sisi kanan dan
operator diantaranya membentuk sebuah statemen
penugasan. Statemen penugasan merupakan sebuah ekspresi.
Adapun simbol yang digunakan untuk operator sama dengan
adalah symbol sama dengan =.
Contoh :
phi = 3.14;
luas = phi * r * r;
Operator Arithmetika
Bahasa C menyediakan beberapa operator arithmatika.
Operator ini meliputi operator perkalian, pembagian, modulus
atau sisa pembagian, penjumlahan, dan pengurangan. Adapun
symbol-simbol untuk masing-masing operator tersebut
diberikan pada tabel 3.3.
Tabel III.3 Operator Arithmetika
Simbol Operator
* Operator perkalian
/ Operator pembagian
% Operator modulus
+ Operator penjumlahan
- Operator pengurangan
Contoh
void main()
{
int p,q,r,s;
float x;
p = 10;
q = p + 5;
r = q – 5;
s = q * r;
x = q/s;
}
Operator Inkremen dan Dekremen
Dua operator ini adalah operator unary yang beroperasi
terhadap sebuah data tunggal. Operand dari operator ini
berasal dari jenis data numeric integer dan juga pointer.
Terhadap data numeric integer operator inkremen menambah
nilai 1 terhadap data operand. Sedangkan operator dekremen
mengurangkan nilai 1 dari data operand. Berbeda dengan
pada data numerik, operator-operator ini menambah atau
mengurangi pointer sedemikian sehingga pointer menunjuk
data pada lokasi selanjutnya atau sebelumnya.
Simbol untuk operator incremental adalah ++. Adapun simbol
untuk untuk operand dekremen adalah --.Berikut ini diberikan
contoh penggunaan kedua operator.
void main()
{
int x,y,z; a[10];
x = 3;
y = 0;
z = 0;
y = ++x;
z = x++;
printf(“y = %d¥n”,y);
printf(“z = %d¥n”,z);
}
Simbol operator-operator ini dapat ditempatkan baik di depan
maupun di belakang nama variabel. Penempatan
operator-operator di belakang ataupun di depan nama variabel
mempunyai semantic yang berbeda. Contoh berikut
memperlihatkan perbedaan ini.
void main()
{
int v,x;
v = 5;
x = 5;
printf(“v++ = %d¥n”,v++);
printf(“++x = %d¥n”,++v);
}
Pada program tersebut operator inkremen diberikan kepada
dua buah variabel yang mempunyai nilai awal yang sama. Nilai
akhir dua variabel tersebut sama yaitu 6 namun yang tampil
pada output layar berbeda. Pemanggilan fungsi printf yang
pertama nilai x yaitu 5 di masukkan sebagai parameter
kemudian operator inkremen menambah 1 ke variabel v
menjadi 6 sehingga nilai parameter yang diterima oleh fungsi
printf adalah tetap nilai 5. Akhirnya yang tercetak adalah 5.
Sedangkan pada pemanggilan fungsi printf yang kedua
operator inkremen menambah 1 ke variabel x terlebih dahulu
menjadi 6 sehingga nilai parameter yang diterima oleh fungsi
printf adalah nilai 6. Akhirnya yang tercetak pada output layar
adalah 6.
Operator bitwise
Operator bitwise bekerja dengan menganggap data-data
adalah data biner dan memperlakukan data tersebut secara bit
demi bit. Operator bitwise
Operator Logika
Operator logika mengambil dua ekspresi Boolean dan
menghubungkan kedua ekspresi boolean tersebut dan
menghasilkan nilai boolean. Tabel III.4 meringkas
operator-operator logika tersebut. Tabel III.5-III.7 memberikan
tabel kebenaran untuk masing-masing operator AND, OR dan
NOT
Tabel III.4. Operator-Operator Logika
Operator Operasi
&& AND
|| OR
! NOT
Tabel III.5. Tabel kebenaran operator && (AND)
Op1 Op2 Op1 && op2
0 0 0
0 1 0
1 0 0
1 1 1
Operator relasi
Operator relasi membandingkan dua operand dan
menghasilkan nilai Boolean tergantung nilai kebenaran suatu
relasi. Beberapa operator relasi diberikan pada tabel III.
Operator relasi ini tidak dapat berdiri sendiri sebagai sebuah
statemen. Biasanya digunakan pada berbagai struktur kendali
percabangan dan perulangan.
Tabel III.5 Operator Relasi
Operator Operasi
== sama dengan, menghasilkan 1 jika dua operand
bernilai sama
> Lebih besar menghasilkan 1 jika operand pertama
bernilai lebih besar dari operand kedua
< Lebih kecil menghasilkan 1 jika operand pertama
bernilai lebih kecil dari operand ke dua
>= Lebih besar sama dengan menghasilkan 1 jika
operand pertama lebih besar atau sama dengan
operand kedua
<= Lebih kecil sama dengan menghasilkan 1 jika
operand pertama lebih kecil atau sama dengan
operand kedua
!= Tidak sama dengan menghasilkan 1 jika operand
pertama tidak sama dengan operand kedua
9. Brackets
Pada pemrograman bahasa C sepasang braket digunakan
untuk membentuk blok kode. Sepasang braket ini adah simbol
{ dan }. Braket { digunakan untuk mengawali blok sedangkan
braket } digunakan untuk mengakhiri blok.
Dengan struktur-struktur kendali alur program, blok
menentukan cakupan dari semantik struktur-struktur tersebut.
Contoh :
void main()
{
int x;
scanf(“%d”,&x);
}
Blok juga menentukan cakupan variabel. Variable yang
dideklarasikan dalam sebuah blok cakupannya hanya berlaku
dalam blok tersebut. Variabel yang cakupannya hanya berlaku
dalam sebuah blok disebut dengan variabel lokal.
Blok dapat pula bersarang dalam blok yang lain. Misalnya blok
percabangan if di dalam blok fungsi main seperti contoh
berikut.
void main()
{
int i = 5;
if (i>4)
{
printf(“i = %d lebih besar dari 5”,i);
}
}
10. File-file program
File C
File H
File o
III.3. Struktur dan Penulisan Program C
Struktur program C ditulis sebagai sebuah atau sekumpulan fungsi.
Fungsi adalah sebuah struktur yang tersusun dari sekumpulan
instruksi untuk mengerjakan sebuah tugas tertentu. Program C
harus memiliki sebuah fungsi utama yang bernama main(). Fungsi
main merupakan sebuah fungsi yang pertama kali di eksekusi oleh
program C. Fungsi main telah ditunjukkan contohnya sebelumnya.
Jika program mempunyai fungsi-fungsi selain main(), satu atau
lebih dari fungsi-fungsi tersebut pasti dipanggil dari fungsi main().
Struktur sebuah fungsi mendefinisikan sebuah penanda
(signature). Sebuah fungsi akan berbeda dengan fungsi yang lain
jika dan hanya jika penandanya berbeda. Penanda fungsi ini
meliputi tipe, nama dan daftar argument fungsi tersebut. Sehingga
penulisan fungsi dalam bahasa C mengikuti bentuk umum berikut :
tipe nama(daftar argument) {
deklarasi-deklarasi variabel lokal;
instruksi-instruksi
return(retval);
}
Penanda fungsi yang pertama adalah tipe fungsi. Tipe
mendefinisikan tipe data yang akan dikembalikan fungsi. Tipe ini
dapat berupa tipe nilai ataupun tipe referensial dan dapat pula
tidak mempunya tipe kembalian atau disebut void. Jika tipe
referensial dikembalikan oleh fungsi, ia tidak boleh merujuk ke
variabel lokal dalam fungsi tersebut.
Penanda fungsi yang kedua adalah nama. Nama adalah identifier
fungsi dan mematuhi aturan baku penamaan identifier. Nama ini
merupakan salah satu elemen penanda fungsi sehingga jika dua
fungsi bernama berbeda maka fungsi tersebut adalah dua fungsi
yang berbeda.
Penanda fungsi yang terakhir adalah daftar argument. Jika daftar
argumen dua fungsi berbeda maka mereka adalah fungsi-fungsi
yang berbeda. Argumen adalah sekumpulan variabel sementara
yang digunakan untuk menampung data masukan fungsi. Lokasi
memori untuk daftar parameter ini adalah stack. Meskipun
merupakan penanda, daftar argument merupakan opsional.
Contoh
int max(int a, int b)
{
If (a>=b)
return a;
else
return b;
}
void main(int argc, char * argv[])
{
int x,y;
x = atoi(argv[0]);
y = atoi(argv[1]);
printf(“nilai terbesar : %d¥n”,max(x,y));
}
BAB IV
Instruksi Keluaran dan Masukan
VI.1. Instruksi-Instruksi Keluaran
Instruksi-instruksi keluaran adalah sejumlah fungsi pustaka
standar C yang digunakan untuk menyajikan data pada
perangkat luaran. Perangkat keluaran ini dapat berupa layar
tampilan, pencetak atau file. Fungsi-fungsi berikut merupakan
fungsi untuk menyajikan data.
1 int putch(int c);
2 int putchar(int c);
3 int puts(const char *s);
4 int printf(const char *f, arg);
Fungsi putch() menyajikan karakter dengan kode ASCII c ke
layar tampilan dengan tidak berakibat berpindahnya kursor ke
baris berikutnya.
Fungsi putchar() seperti halnya fungsi putch() menyajikan
karakter dengan kode ASCII c ke layar tampilan. Fungsi ini juga
tidak mengakibatkan berpindahnya kursor ke baris berikutnya.
void main()
{
int kodeASCII = 65;
char huruf = ‘A’;
putch(65);
putchar(huruf);
}
Fungsi puts() menyajikan sederetan karakter (disebut string) ke
perangkat keluaran layar tampilan dan kemudian memindahkan
kursor ke baris di bawahnya.
Contoh
void main()
{
char kata[30];
kata = “Pemrograman Komputer”;
puts(kata);
}
Fungsi printf() menyajikan sejumlah data argument dengan format
yang dispesifikan oleh literal string *f. Masing-masing data
argument dicetak sesuai dengan format yang dispesifikasikan oleh
format specifier dalam literal string *f. Format specifier untuk
argument mempunyai bentuk umum :
Bentuk umum format :
%[flags][width][.prec][type]
flags kumpulan karakter flag { - , + , }
width lebar karakter tampilan
.prec presisi yang menyatakan jumlah digit setelah titik/koma
Tipe tipe data yang ditampilkan seperti pada tabel
berikut
Tabel 4.1. Karakter format specifier
Karakter Jenis Keluaran
D Decimal integer bertanda
I Decimal integer bertanda
O Octal integer tak bertanda
U Decimal integer tak bertanda
X Hexadecimal integer tak bertanda
F Bilangan floating point bertanda
E Bilangan floating point bertanda
C Karakter
S String
Contoh
void main(int argc, char * argv[])
{
int x,y;
x = atoi(argv[0]);
y = atoi(argv[1]);
printf(“x = %d”,x);
printf(“y = %d”,y);
printf(“%d dikali %d = %d”,x,y,x*y);
}
IV.2. Instruksi Masukan
Instruksi-Instruksi masukan adalah sejumlah fungsi pustaka C
yang digunakan untuk menerima data dari perangkat masukan.
Perangkat masukan dapat berupa keyboard atau file.
Fungsi-fungsi masukan ini yaitu :
1. int getchar(void);
2. int getch(void);
3. int getche();
4. void gets(char *s);
5. int scanf(const char *f, (alamat,…));
Fungsi getchar() adalah fungsi yang mengembalikan sebuah
nilai bertipe int, yaitu kode ASCII karakter yang diinput.
#include <stdio.h>
void main()
{
char c;
printf(“Input sebuah karakter : ”);
c = getchar();
printf(“Kode ASCII masukan : %d¥n”,c);
printf(“Karakter ASCII masukan : %c¥n”,c);
}
Fungsi getch() adalah fungsi yang mengembalikan sebuah nilai
bertipe int, yaitu kode ASCII dari karakter yang diterima dari
perangkat input. Karakter yang diinput tidak ditampilkan pada layar
komputer.
#include <stdio.h>
void main()
{
char c;
printf(“input sebuah karakter ASCII : ”);
c = getch();
printf(“Kode ASCII masukan : %d¥n”,c);
printf(“Karakter ASCII masukan : %c¥n”,c);
}
Fungsi getche() adalah fungsi yang mengembalikan sebuah nilai
bertipe int. Nilai yang dikembalikan adalah kode ASCII dari
karakter yang diterima dari perangkat input. Fungsi ini
menampilkan karakter yang diterima.
#include <stdio.h>
void main()
{
char c;
printf(“input sebuah karakter ASCII : ”);
c = getche();
printf(“Kode ASCII masukan : %d¥n”,c);
printf(“Karakter ASCII masukan : %c¥n”,c);
}
Fungi gets() adalah fungsi yang bertipe void. Fungsi ini
mempunyai sebuah argument berupa alamat dari karakter pertama
yang diterima dari perangkat input.
#include <stdio.h>
void main()
{
char frase[50];
printf(“Masukan sebuah frase : ”);
gets(frase);
printf(“Frase input : %s¥n”,frase)
}
Fungsi scanf()merupakan fungsi input yang fleksibel. Fungsi ini
dapat menerima sejumlah masukan dengan tipe yang
berbeda-beda. Seperti halnya fungsi printf(), fungsi ini
menerima masukan-masukan ditentukan oleh format specifier
yang disertakan pada argument literal string.
#include <stdio.h>
void main()
{
float alas, tinggi, luas;
printf(“Program menghitung luas segitiga¥n”);
printf(“Masukan alas dan tinggi segitiga : ”);
scanf(“%f %f”,&alas,&tinggi);
printf(“Luas segitiga = %7.3f”,alas*tinggi);
}
Pada contoh program diatas data masukan dapat diberikan melalui
papan ketik (keyboard) dan dapat pula melalui sebuah file teks.
Untuk program menghitung luas segitiga tersebut, data masukan
dapat dibuat dengan cara mengetikkan perintah dan data-data
berikut :
d:¥copy con data.in
4.0 5.0
^z
Kemudian jalankan program dengan mengetikan nama file
program (misal setiga.exe) diikuti oleh input redirection seperti
contoh berikut
d:¥segitiga.exe < data.in
BAB V
Kendali Alur Program
Sebuah program merupakan sebuah implementasi satu atau lebih
algoritma. Algoritma sendiri merupakan langkah-langkah logis untuk
memecahkan masalah. Langkah-langkah ini dapat dikategorikan menjadi
1. urutan langkah-langkah sekuensial
2. Langkah-langkah percabangan
3. Langkah-langkah perulangan
4. Langkah-langkah paralel
5. Sinkronisasi
Bahasa C yang asli memiliki struktur sintaks untuk mengendalikan alur
langkah-langkah program untuk kategori kedua dan ketiga. Walaupun
standar bahasa C adalah pemrograman sekuensial beberapa compiler dan
unit pemroses modern tidak menjamin urutan program sesuai dengan apa
yang dituliskan. Namun demikian unit pemroses modern seperti prosesor
superscalar menjamin urutan sekuensial dari instruksi-instruksi yang
memiliki ketergantungan (dependency). Bab ini membahas kendali alur
langkah program untuk langkah percabangan dan perulangan. Kendali alur
program kategori keempat dan kelima disediakan dalam bentuk fungsi
pustaka seperti Posix Threads atau disediakan oleh perluasan bahasa
pemrograman C atau directive-directive seperti pada standar OpenMP.
V.1 Percabangan
Percabangan hampir pasti terdapat pada program. Percabangan
ada disebabkan program memiliki beberapa alternatif alur eksekusi.
Alur program yang dieksekusi tergantung pada kondisi-kondisi
yang terjadi selama eksekusi.Kondisi–kondisi
Bahasa C menyediakan beberapa struktur sintaksis untuk
membuat percabangan. Struktur sintaksis ini berupa
statemen-statemen
1. if else
Statemen if menentukan alur program berdasarkan evaluasi
kondisi Boolean. Hasil evaluasi terhadap kondisi Boolean
menghasilkan nilai 1 (true) atau 0 (false). Adapun
bentuk-bentuk dari percabangan ini diberikan sebagai berikut
if (kondisi)
statemen;
statemen_lanjutan;
contoh
#include <stdio.h>
void main(int argc, char * argv[])
{
int nilai;
printf(“Masukkan sebuah bilangan
bulat : ”);
scanf(“%d”,&nilai);
if (nilai > 0)
printf(“Nilai lebih besar 0”);
}
Bentuk percabangan ini akan memilih untuk mengeksekusi
statemen hanya jika evaluasi terhadap variabel kondisi
menghasilkan 1 (true). Jika sebaliknya statemen tidak akan
dieksekusi. Eksekusi terhadap statemen_lanjutan
dilakukan baik evaluasi kondisi bernilai 1 atau 0.
Jika diinginkan lebih dari sebuah statemen dieksekusi saat
evaluasi kondisi bernilai 1 maka digunakan blok statemen
seperti sebagai berikut :
if(kondisi)
{
Blok statemen-statemen;
}
Contoh
#include <stdio.h>
void main()
{
int num,denum,hasil;
printf(“Masukkan num dan denum : ”);
scanf(“%d %d”,&num,&denum);
if(denum == 0)
{
printf(“error ¥n”);
printf(“denumerator tidak boleh
nol¥n”);
exit(0);
}
hasil = num/denum;
printf(“hasil pembagian = %d¥n”,hasil);
}
Pada contoh-contoh sebelumnya percabangan if hanya
menentukan eksekusi yang dilakukan jika kondisi terpenuhi
namun tidak menentukan eksekusi yang dilakukan jika kondisi
tidak terpenuhi. Untuk keperluan ini percabangan dilengkapi
dengan klausa else. Klause else secara tegas menentukan
eksekusi yang harus dilakukan jika kondisi tidak terpenuhi.
Bentuk umum percabangan dengan klausa else adalah
sebagai berikut :
if (kondisi)
{
Blok statemen kondisi terpenuhi
}
else
{
Blok statemen kondisi tidak terpenuhi
}
Contoh
#include <stdio.h>
void main()
{
float num,denum,hasil;
printf(“Masukkan num dan denum : ”);
scanf(“%f %f”,&num,&denum);
if(denum == 0.0)
printf(“error, denum tidak boleh
nol¥n”);
else
{
hasil = num/den;
printf(“Hasil pembagian
= %5.3f”,hasil);
}
}
Pada contoh program tersebut di atas, klausa if berakhir
dengan sebuah statemen printf pada baris 8. Kemudian diikuti
oleh klausa else. Jika diantara klausa if dan klausa else
terdapat beberapa baris statemen namun tidak dalam sebuah
blok, sintaks percabangan menjadi salah. Kesalahannya yaitu
setelah klausa if berakhir diikuti oleh sebuah baris statemen
yang seharusnya diikuti oleh klausa else. Berikut ini adalah
contoh program yang salah
#include <stdio.h>
void main()
{
int nilai;
printf(“masukkan nilai : ”);
scanf(“%d”&nilai);
if(nilai <= 45)
printf(“Anda tidak
lulus¥n”);//akhir klausa if
printf(“Nilai E¥n”); // salah
else if(nilai >45 && nilai <=50 )
printf(“anda lulus dengan nilai D¥n”);
…
}
Akhir dari klausa if harus diubah dengan cara menyatukan dua
statemen menjadi sebuah blok sebagaimana dalam program
berikut
#include <stdio.h>
void main()
{
int nilai;
printf(“masukkan sebuah nilai :”);
scanf(“%d”,&nilai);
if(nilai <= 45)
{
printf(“anda tidak lulus ¥n”);
printf(“nilai E¥n”);
} //akhir klausa if di sini
else if(nilai > 45 && nilai<=50)
printf(“anda lulus dengan nilai D¥n”);
else if(nilai >50 && nilai<=65)
printf(“anda lulus dengan nilai C¥n”);
else if(nilai >60 && nilai<=75)
printf(“anda lulus dengan nilai B”);
}
2. switch
Statemen switch memilih case-case yang dipilih untuk
eksekusi berdasarkan hasil dari evaluasi dari ekspresi
kondisinya. Bentuk umum dari struktur ini yaitu
switch(ekspresi) {
case kasus_1 : statemen_1;
break;
case kasus_2 : statemen_2;
break;
…
case kasus_n : statemen_n;
break;
default : default_statemen;
break;
}
switch akan mengeksekusi statemen pada sebuah case yang
sesuai dengan hasil evaluasi ekspresi. Jika tidak ada case
yang sesuai dengan hasil evaluasi ekspresi maka statemen
pada pilihan default akan dieksekusi. Berikut sebagai contoh
program
#include <stdio.h>
void main()
{
int angka;
printf(“masukkan sebuah nilai angka 0-4¥n”);
scanf(“%d”,&angka);
switch(angka) {
case 0: printf(“Nilai E¥n”);
printf(“Tidak lulus¥n”);
break
case 1: printf(“Nilai D, anda lulus¥n”);
break;
case 2: printf(“Nilai C, anda lulus¥n”);
break;
case 3: printf(“Nilai B, anda lulus”¥n);
break;
case 4: printf(“Nilai A, anda lulus¥n”);
break;
default: printf(“Tidak ada nilai yang
sesuai¥”);
break;
}
Jika ekspresi angka sama dengan 0 maka case 0 yang
dieksekusi, jika ekspresi angka sama dengan 1 maka case 1
yang dieksekusi dan seterusnya. Jika tidak ada yang sesuai
maka statemen pada default terpilih untuk dieksekusi.
Pada program tersebut terlihat pula setelah sebuah statemen
terdapat statemen break. Break ini mencegah case berikutnya
diperiksa jika case yang sesuai sudah ditemukan. Namun ada
suatu kondisi di mana break tidak diperlukan pada contoh
berikut ini.
#include <stdio.h>
void main()
{
int nilai;
printf(“masukkan nilai matakuliah : ”);
scanf(“%d”,&nilai);
switch(nilai) {
case 4:
case 3:
case 2:
case 1: printf(“Anda lulus matakuliah
ini¥n”);
break;
case 0: printf(“Anda tidak lulus matakuliah
ini¥n”);
break;
default: printf(“Input salah¥n”);
}
V.2 Perulangan
Bagian ini membahas bagaimana sintaks program agar alur
program menjadi sebuah siklus perulangan. Perulangan
memungkinkan eksekusi program mengulang-ulang
instruksi-instruksi yang dikerjakan. Jumlah perulangan harus
terbatas atau ia harus dapat dihentikan saat eksekusi. Pada
bahasa C terdapat bentuk perulangan yaitu dengan instruksi for,
while dan do while.
1. Perulangan for
Perulangan for ditujukan untuk melakukan perulangan
instruksi dengan jumlah perulangan statemen yang telah
diketahui sebelum waktu eksekusi. Penulisan instruksi for
seperti menuliskan sebuah fungsi yaitu kata kunci for yang
diikuti tiga buah ekspresi dalam tanda-kurung.
for(ekspresi1,ekspresi2, ekspresi3)
statemen;
Ekspresi1 mendefinisikan keadaan inisial perulangan.
Biasanya berupa ekspresi penugasan ke sebuah variabel atau
lebih.
Ekspresi2 mendefinisikan kondisi di mana perulangan masih
dilakukan. Biasanya berupa ekspresi relasi yang menghasil
nilai 1 atau 0. Jika ekspresi ini menghasilkan 1 maka
perulangan masih tetap dilaksanakan, jika 0 maka perulangan
telah selesai.
Ekspresi3 mendefinisikan bagaimana perubahan-perubahaan
keadaan perulangan. Perubahan keadaan awal hingga
keadaan akhir ditentukan oleh ekspresi ini. Ekspresi ini
biasanya berupa ekspresi inkrement atau dekremen terhadap
sebuah variabel atau lebih.
Contoh
#include<stdio.h>
void main()
{
int i;
for(i=0;i<10;i++)
printf(“%d * 2 = %d¥n”,i,i*2);
}
Pada contoh program di atas statemen sebuah printf()
diulang sebanyak 10 kali. Tiga ekspresi pada struktur
perulangan adalah opsional. Namun jika salah satu dari dua
eskpresi terakhir dihilangkan perulangan akan dilakukan tanpa
batas. Jika diinginkan untuk mengulang beberapa instruksi
sekaligus maka gunakan blok statemen seperti pada contoh
berikut.
Contoh
#include <stdio.h>
void main()
{
int i;
for(i=0;i<100;i++)
{
if(!(i%2))
printf(“%d ”,i);
printf(“*”);
}
}
Perulangan dapat dibuat bersarang (nested) di dalam
perulangan lainnya. Struktur perulangan bersarang ini
biasanya digunakan untuk mengolah array berdimensi dua
atau lebih. Berikut sebuah contoh sederhana perulangan yang
bersarang di dalam perulangan lainnya.
#include <stdio.h>
void main()
{
int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<i;j++)
printf(“#”);
printf(“%d¥n”,i);
}
}
2. Perulangan while
Perulangan while tidak seperti perulangan for. Dengan
perulangan for, jumlah iterasi telah diketahui sebelum waktu
eksekusi program. Dengan perulangan while jumlah iterasi
umunya belum diketahui hingga perulangan telah selesai
dilaksanakan.
Bentuk umum
while(eks)
statemen;
atau
while(eks)
{
Blok statemen;
}
Perulangan while melaksanakan statemen atau blok statemen
secara berulang selama evaluasi terhadap ekspresi eks
bernilai 1.
Contoh
#include <stdio.h>
void main()
{
int i=0;
while(i<10)
{
printf(“%d ”,i);
i++;
}
}
Perulangan while tidak mengeksekusi statemen satu kalipun
jika evaluasi ekspresi eks telah bernilai 0 sejak awal.
3. Perulangan do while
Perulangan do while juga melaksanakan sebuah statemen
atau blok statemen secara berulang-ulang selama kondisi
syaratnya dipenuhi. Seperti halnya perulangan while, jumlah
perulangan yang dilakukan oleh do while umumnya belum
dapat ditentukan sebelumnya hingga perulangan telah selesai.
Namun demikian perulangan do while berbeda dimana
perulangan ini melaksanakan statemen paling sedikit satu kali
walaupun kondisi telah tidak dipenuhi sebelumnya. Sebabnya
adalah karena ekspresi eks di evaluasi setelah statemen
dilaksanakan.
Bentuk umum :
do
Statemen; while(eks);
Atau
do
{
Blok statemen;
} while(eks)
Contoh
#include <stdio.h>
void main()
{
int i = 0;
do
{
printf(“%d ”,i);
} while(i<10)
}
4. Perulangan Tak Berhingga
Perulangan tak berhingga yaitu perulangan yang dieksekusi
terus menerus tanpa henti selama tidak menemukan statemen
break.
Perulangan for dapat dibuat menjadi tak berhingga dengan
menghilangkan salah satu dari dua ekspresi terakhir. Jika
ekspresi kedua yang dihilangkan atau diberi nilai literal 1,
perulangan tidak mempunyai kondisi dimana harus berhenti.
Sedangkan jika ekspresi ketiga yang dihilangkan maka kondisi
perulangan tidak pernah berubah dari keadaan awalnya
sehingga jika sekali perulangan seperti ini dikerjakan tanpa
ada statemen break, maka dapat dikerjakan terus menerus.
for(eks1; ; eks3) statemen ;
for(eks1; 1 ; eks3) statemen;
for(eks1; eks2 ; ) statemen;
Perulangan while dan do while juga dapat menjadi
perulangan yang tak berhingga dengan cara memberikan
bilangan bulat positf (misal 1) ke ekspresi kondisi perulangan
seperti bentuk-bentuk umum sebagai berikut
while(1)
{
statemen;
}
do
{
statmen;
} while(1);
5. break dan continue
Instruksi break telah diperlihatkan contoh penggunaanya pada
percabangan switch sebelumnya. Instruksi break dapat juga
digunakan pada perulangan. Kegunaan dari instruksi break
pada perulangan adalah untuk menghentikan perulangan
walaupun evaluasi ekspresi kondisi perulangan masih
terpenuhi. Berikut diperlihatkan contoh penggunaan instruksi
break dalam loop tak berhingga.
Contoh
#include <stdio.h>
void main()
{
int i = 0
while(1) {
if(++i>100) break;
}
printf(“%d”,i);
}
Instruksi continue tidak menghentikan perulangan tapi
melangkahi instruksi yang berada dibawahnya untuk lanjut
mengeksekusi perulangan berikutnya. Contoh berikut
menampilkan bilangan-bilangan yang tidak habis dibagi 2 dan
lebih kecil dari 10.
#include <stdio.h>
void main()
{
int i=0;
while(1)
{
if(i>9) break;
if(++i%2 == 0) continue;
printf("%d ",i);
}
}
V.3
BAB VI
FUNGSI
Bahasa C adalah bahasa pemrograman berorientasi prosedur yang mana
program yang dikembangkan menggunakan bahasa ini tersusun dari
fungsi-fungsi. Pemrograman yang menggunaan pendekatan seperti ini
disebut pemrograman berorientasi prosedur. Selain itu juga sering dikenal
sebagai pemrograman terstruktur.
Program C memiliki fungsi utama main. Fungsi main merupakan fungsi
yang pertama kali dipanggil. Pada fungsi main kode-kode yang pemrogram
tulis dieksekusi. Dari fungsi main, pemrogram menyusun instruksi-instruksi,
memanggil fungsi-fungsi sendiri atau fungsi-fungsi pustaka dan lain
sebagainya. Perhatikan program C sederhana berikut dan translasinya
dalam bahasa rakitan (assembly)
#include <stdio.h>
void main()
{
}
Translasinya pada baris 15 program berikut fungsi main dipanggil:
.file "main.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
call ___main
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE6:
1 Struktur Fungsi
Sebuah fungsi tersusun atas penanda fungsi dan badan fungsi.
Penanda fungsi yaitu bagian dari fungsi yang membedakan sebuah
fungsi dengan fungsi yang lainnya agar compiler dapat
membedakannya. Badan fungsi yaitu sebuah blok yang berisi
kode-kode yang dituliskan.
tipe nama(daftar parameter)
{
//di sini badan fungsi
}
Penanda fungsi bahasa C terdiri dari 3 bagian yaitu tipe fungsi, nama
fungsi dan daftar parameter fungsi. Penanda fungsi ini sering
dideklarasikan secara terpisah dengan badan fungsi dikenal sebagai
prototype fungsi seperti berikut
tipe nama(daftar_parameter);
Tipe fungsi mendefinisikan tipe data yang dikembalikan oleh fungsi
tersebut. Tipe ini dapat berupa tipe data dasar atau tipe data referensial.
Tipe data dasar yaitu tipe data yang mana sebuah variabel berisi
sebuah nilai sedangkan tipe data referensial yaitu dimana sebuah
variabel tidak berisi nilai tapi alamat sebuah atau beberapa elemen
data.
Nama fungsi memberikan simbol referensial saat pemanggilan fungsi.
Hal ini berarti suatu fungsi harus dapat diacu menggunakan nama pada
sudut pandang bahasa pemrograman tingkat tinggi, atau menggunakan
alamat pada sudut pandang bahasa pemrograman tingkat rendah.
Daftar parameter mendefinisikan data-data yang digunakan oleh fungsi
dalam komputasinya. Daftar parameter ini dikenal sebagai parameter
formal dan bahasa C standar menentukan bahwa parameter formal ini
dialokasikan pada stack. standar Data-data ini dapat berupa nilai
(value) atau berupa alamat referensial.
Contoh
double luasSegiTiga(double alas, double tinggi)
{ // badan fungsi mulai dari sini
double luas;
luas = alas * tinggi/2;
return luas;
}
Pada contoh fungsi di atas tipe dari fungsi adalah tipe double precision
floating point. Pada baris akhir badan fungsi, terdapat instruksi return
yang mengembalikan sebuah nilai bertipe double. Nama fungsi
tersebut adalah luasSegitiga dan memiliki dua parameter formal alas
dan tinggi bertipe double precision floating point..
2 Pemanggilan Fungsi
Untuk menjalankan sebuah fungsi, program atau bagian program yang
disebut pemanggil (caller) harus memanggil fungsi yang akan
dieksekusi. Jika fungsi yang dipanggil (callee) memiliki parameter
maka pemanggil harus mengirimkan parameter sebelum fungsi
benar-benar dipanggil. Parameter yang dikirim oleh caller disebut
parameter actual. Saat pemanggilan ini parameter actual disalin ke
parameter formal. Contoh berikut ini memperlihatkankan fungsi main
memanggil fungsi luasSegiTiga() pada contoh sebelumnya.
#include <stdio.h>
double luasSegiTiga(double alas, double tinggi);
void main()
{
double luas, alas, tinggi;
printf(“Masukkan alas segitiga : ”);
scanf(“%lf”,&alas);
printf(“Masukkan tinggi segitiga : ”);
scanf(“%lf,&tinggi”);
luas = luasSegiTiga(alas,tinggi);
printf(“luas Segitiga = ”);
printf(“%6.3lf”,luas);
}
2.1 Frame Stack
Setiap kali sebuah fungsi dipanggil, sebuah frame stack baru
dialokasikan untuk fungsi tersebut. Pada saat pemanggilan fungsi
isi dari stack pointer yang menunjukkan lokasi paling atas frame
disalin ke register frame pointer sehingga membentuk frame yang
baru. Lokasi yang ditunjukkan frame pointer inilah yang menjadi
basis (lokasi terbawah) sebuah frame. Sedangkan stack pointer
menunjuk ke lokasi paling atas. Isi dari frame pointer yang lama
disimpan ke stack.
Stack frame baru diperlukan oleh fungsi untuk mengalokasikan
variabel auto atau variabel lokal. Misalnya pada contoh program
sebelumnya fungsi main memiliki tiga buah variabel lokal double
luas, alas dan tinggi. Ketiga variabel lokal ini ada pada frame
stack fungsi main. Frame pointer menunjuk ke basis frame
stack stack pointer menunjuk ke lokasi paling atas stack.
Gambar. Frame stack fungsi main
Setelah fungsi main memanggil fungsi luasSegiTiga() sebuah
frame baru untuk fungsi luasSegiTiga dibuat di atas frame fungsi
main(). Pada frame fungsi luasSegiTiga() terdapat sebuah
variabel lokal luas yang berlokasi paling bawah frame dan
ditunjuk oleh frame pointer sedangkan stack pointer menunjuk ke
lokasi di atas lokasi variabel ini.
Gambar frame fungsi luasSegiTiga di atas frame main
Sesaat sebelum fungsi dipanggil dengan instruksi call,
parameter-parameter di push ke stack mengakibatkan stack
bertumbuh. Pemanggil harus mengetahui ukuran-ukuran
parameter yang dipush ke stack sehingga caller dapat
memulihkan stack pointer ke keadaan semula. Setelah fungsi
luasSegiTiga() selesai, maka frame dan stack pointer dipulihkan
double luas, alas, tinggi
Frame pointer
Stack pointer
Frame pointer
Stack pointer
double luas, alas, tinggi
double luas;
menunjuk ke lokasi-lokasi sebelum fungsi ini dipanggil.
2.2 Pass By Value
Setelah sedikit memahami frame-frame stack pada pemanggilkan
fungsi, bagian ini membahas bagaimana parameter-parameter
fungsi dikirimkan. Disini dibahas pengiriman parameter dengan
cara pass by value. Pass by value yaitu parameter fungsi yang
dikirimkan adalah berbentuk nilai dari parameter itu sendiri. Nilai
parameter dikirimkan dengan cara menyalin nilai ke parameter
formal di frame stack. Misalnya variabel alas dan tinggi telah
diinput dengan nilai-nilai 5.0 dan 4.0 secara berurutan, kemudian
pemanggilan fungsi berikut dilakukan
// input alas = 5.0;
// input tinggi 4.0;
luas = luasSegiTiga(alas,tinggi);
Pemanggilan fungsi luasSegiTiga() di atas nilai parameter tinggi
terlebih dahulu disalin ke stack baru kemudian nilai variabel alas.
Kemudian instruksi call digunakan untuk memanggil fungsi
luasSegiTiga(), sehingga frame-frame (penyederhanaan) caller
dan callee seperti sebagai berikut
Gambar . Pass by value mengirimkan nilai parameter melalui
stack
double luas, alas=5.0, tinggi=4.0
double luas;
Stack pointer
frame pointer alas = 5.0
tinggi = 4.0
Nilai variabel lokasl tinggi dan alas yaitu 4.0 dan 5.0 di push ke
stack secara berurutan. Urutannya mulai dari urutan terbelakang
dari daftar parameter. Nilai-nilai dari parameter alas dan tinggi
yang dikirim ke melalui stack dapat diakses oleh callee
(luasSegiTiga()) menggunakan frame pointer. Dengan
menggunakan frame pointer untuk mengakses
parameter-parameter alas dan tinggi dari stack, callee dapat
menghitung luas = alas x tinggi.
Karena nilai dari variabel lokal yang disalin ke stack, maka
variabel lokal tidak dapat dimodifikasi oleh callee. Program hanya
dapat memodifikasi lokasi alas dan tinggi yang merupakan
parameter, bukannya alas dan tinggi yang merupakan variabel
lokal dari caller.
Contoh
#include <stdio>
void uji(int x)
{
printf(“dalam fungsi uji() ”)
printf(“Nilai parameter x : %d ¥n”,x);
}
void main()
{
int x = 5;
printf(“Dalam fungsi main() nilai x = %d”,x);
uji(nilai);
printf(“dalam fungsi main() nilai x = %d¥n”,x);
}
Fungsi uji() memodifikasi variabel x yang merupakan sebuah
parameter. Walaupun parameter ini bernama sama dengan
variabel lokal x pada fungsi main, namun alamat dari keduanya
adalah berbeda. Karena mempunyai alamat yang berbeda fungsi
uji tidak memodifikasi variabel lokal x yang dideklarasikan pada
fungsi main().
2.3 Pass By Reference
Setelah memahami pengiriman parameter fungsi dengan metode
pass by value, bagian ini membahas pengiriman parameter
fungsi dengan metode pass by reference.
Pengiriman pass by reference mengirimkan parameter ke fungsi
bukan nilai melainkan melainkan alamat dari variabel. Dengan
demikian parameter fungsi harus dideklarasikan sebagai variabel
referensial yang berisi alamat data. Variabel referensial ini dikenal
dengan nama pointer. Deklarasi parameter dengan tipe
referensial harus menggunakan operator referensial *. Operator
referensial ini memberikan nilai dari sebuah lokasi yang ditunjuk
oleh pointer.
Contoh
#include <stdio.h>
int add(int *pointer_x, int *pointer_y)
{
int z;
z = *pointer_x + *pointer_y;
return z;
}
Fungsi main() berikut memanggil fungsi add() dengan
mengirimkan alamat variabel a dan b sebagai parameter.
void main()
{
int a = 5;
int b = 7;
int c;
printf(“Nilai a + b = %d¥n“, add(&a,&b));
}
Karena pengiriman parameter pass by reference, data yang
dikirim sebagai parameter dapat dimodifikasi isinya oleh callee
seperti pada contoh berikut.
contoh
void uji( int *x)
{
printf(“parameter Sebelum diubah %d”,*x);
*x = 1;
}
void main()
{
int x = 0;
printf(“nilai x setelah diubah %d”,uji(&x));
}
2.4 Variabel lokal
Program C dibentuk oleh sebuah fungsi atau lebih. Dalam fungsi
variabel di deklarasikan. Ketika sebuah fungsi dipanggil, variabel
tadi dialokasikan pada frame stack fungsi tersebut. Ini berarti
bahwa sebelum dipanggil dan sesudah dipanggil variabel yang
dideklrasikan dalam fungsi tidak ada. Variabel ini hanya ada
ketika fungsi yang mendeklarasikannya dalam frame sedang aktif.
Karena keberadaan variabel seperti ini bersifat lokal pada sebuah
fungsi, maka ia disebut variabel lokal. Jika fungsi induk g()
sedang memanggil fungsi anak h(), maka frame-frame
fungsi-fungsi tersebut ada pada stack. Cakupan variabel-variabel
lokal fungsi induk menjangkau fungsi anak sehingga fungsi anak
g() dapat mengakses variabel lokal induk h() jika fungsi anak
dipanggil dengan mengirimkan alamat variabel lokal induk (g()
dipanggil dengan parameter pass by reference).
Sebuah variabel lokal sebaiknya diinisialisasi dengan sebuah
nilai. Hal ini perlu dilakukan agar variabel lokal selalu bernilai
yang ditetapkan diawal. Jika tidak demikian, pada saat fungsi
dipanggil yang kedua kalinya, nilai variabel lokal pada
pemanggilan fungsi pertama masih tetap ada. Pada contoh
berikut nilai variabel c pada pemanggilan fungsi uji() yang kedua
kalinya bernilai yang berbeda.
#include<stdio>
void ujiStack()
{
int c;
printf(“c = %d¥n”,c); //tergantung c sebelumnya
c++;
}
void main()
{
ujiStack();
ujiStack();
}
Untuk menghindari masalah yang tidak terduga, variabel lokal
perlu diinisialisasi seperti pada contoh berikut
void ujiStack2()
{
int c = 0;
printf(“c = %d¥n”,c); // c = 0
c++;
}
2.5 Variabel statis
Variabel statis berbeda dengan variabel auto (variabel lokal).
Variabel lokal alokasinya mengikuti pemanggilan fungsi sedangkan
variabel statis tidak. Variabel statis sekali dialokasikan maka ia
tetap aka nada sepanjang siklus program sehingga tidak perlu
dialokasikan ulang. Jikapun variabel statis dideklarasikan dalam
cakupan sebuah fungsi, maka alokasinya tidak mengikuti
keberadaan fungsi tersebut. Meskipun sebuah fungsi telah kembali
ke caller, variabel statis tetap ada dan nilainya pun tetap terjaga
seperti sebelumya.
Contoh
#include <stdio.h>
void inc();
void main()
{
int x=10,i;
for(i=0;i<10;i++) inc();
printf(“nilai x local fungsi main %d¥n”,x);
}
void inc()
{
static int x = 0;
printf(“nilai x = %d¥n”,x);
x++;
}
Pemanggilan fungsi inc() oleh fungsi main() akan meningkatkan
nilai x dari 0 hingga 9. Semantik yang berbeda pada fungsi inc()
berikut menghasilkan nilai yang berbeda
void inc()
{
static int x; // tanpa inisialisasi
x = 1; //penugasan tapi bukan inisialisasi
printf(“nilai x = %d¥n”,x);
x++;
}
3 Rekursi
Rekursi adalah suatu kejadian x yang didalamnya terdapat kejadian x.
Fungsi yang mempunyai sifat seperti ini disebut fungsi rekursif. Fungsi
rekursif yaitu sebuah fungsi x yang didalamnya terjadi pemanggilan
fungsi x itu sendiri.
Sebuah contoh fungsi rekursif yaitu fungsi menghitung factorial seperti
pada contoh berikut :
int fact(int n)
{
if (n <= 1)
return 1;
else
return n * fact(n-1);
}
4 Fungsi Pustaka Numerik
Fungsi pustaka numeric C merupakan sekumpulan fungsi-fungsi
numeric yang disediakan oleh banyak perangkat compiler C. Prototipe
dari fungsi ini terdapat pada file math.h. File header math.h ini harus
disertakan dengan program sumber menggunakan directive include.
Fungsi sqrt()
Fungsi ini menghitung akar positif dari bilangan floating point double
precision. Fungsi ini menerima parameter input x (by value) bertipe
double precision dan mengembalikan nilai akar positif dari x. Jika x
adalah bilangan negative fungsi ini mengembalikan 0. Prototipe dari
fungsi ini yaitu :
double sqrt(double x);
Contoh
#include <stdio.h>
void main()
{
double r,s;
printf(“Masukkan sebuah bilangan positif : ”);
scanf(“%lf,&r”);
s = sqrt(r);
printf(“Akar dari %5.2lf = %5.2lf¥n”,r,s);
}
Fungsi pow()
Fungsi pow() menerima dua parameter input x dan y bertipe double
precision integer kemudian fungsi ini menghitung xy. Prototipe fungsi
ini terdapat pada file math.h seperti sebagai berikut
double pow(double x, double y);
contoh
#include <math.h>
void main()
{
double r,x,y;
printf(“Masukkan x : ”);
scanf(“%lf”,&x);
printf(“Masukkan y : ”);
scanf(“%lf”,&y);
r = pow(x,y);
printf(“%5.2lf ^ %5.2lf = %5.2lf”,r);
}
Fungsi exp()
Fungsi exp() menerima sebuah parameter input (by value) x dan
menghasilkan nilai e pangkat x. Tipe parameter input dan nilai
kembalian adalah double precision floating point. Prototipe fungsi ini
terdapat pada file header math.h seperti sebagai berikut
double exp(double x);
Fungsi div()
Fungsi div() menerima dua parameter input (by value) x dan y bertipe
integer kemudian fungsi ini menghitung hasil pembagian dan sisa
pembagian. Fungsi ini mengembalikan tipe struct div_t yang berisi
hasil bagi dan sisa bagi Tipe struct div_t dan prototype fungsi pow() di
dalam file header stdlib.h adalah sebagai berikut
typedef struct
{
int quot; // quotient
int rem; // remainder
}.
div_t div(int x, int y);
Contoh
#include <stdlib.h>
void main()
{
int n,d;
div_t r;
printf(“Masukkan sebuah integer : ”);
scanf(“%d”,&n);
printf(“Masukkan sebuah integer pembagi : ”);
scanf(“%d”,&d);
r = div(n,d);
printf(“%d div %d = %d sisa %d¥n”,n,d,r.quot,r.rem);
}
Fungsi ceil()
Fungsi ceil() menerima sebuah parameter x bertipe double precision
(by value). Fungsi ini menghitung bilangan bulat double precision
terkecil yang lebih besar atau sama dengan x. Prototipe fungsi dalam
math.h yaitu :
double ceil(double x)
Contoh
#include <math.h>
void main()
{
double x,r;
printf(“Masukkan bilangan yang akan dibulatkan
keatas : ”);
scanf(“%lf”,&x);
r = ceil(x);
printf(“Bilangan bulat terkecil “
printf(“yang lebih besar dari %5.2 lf : %5.2lf”,r);
}
Fungsi floor()
Fungsi floor() menerima sebuah parameter x (by val) bertipe double
precision floating point. Kemudian fungsi ini mengembalikan nilai
bilangan bulat terbesar yang lebih kecil dari x. Prototipe fungsi floor()
dalam file header math.h adalah sebagai berikut
double floor(double x);
Contoh
#include <math.h>
void main()
{
double x,r;
printf(“Masukkan sebuah bilangan real : ”);
scanf(“%lf”,&x);
r = floor(x);
printf(“Bilangan bulat terbesar lebih kecil dari ”);
printf(“%5.2lf = %5.2lf”,r);
}
Fungsi-Fungsi Trigonometri
5
BAB VII
TIPE DATA TERSTRUKTUR
Pada bagian pengenalan, telah diperkenalkan tipe data dasar atau
elementer. Bab ini membahas tipe data terstruktur. Tipe data
terstruktur yaitu sejenis tipe data yang terdiri terdiri dari beberapa
elemen. Dengan tipe data terstruktur sebuah variabel dapat
digunakan untuk mengacu beberapa data yang berkaitan
VII.1. Array
Array adalah sejenis tipe data yang terdiri dari sejumlah elemen data
yang bertipe sama. Array menggunakan dua identifier. Identifier yang
pertama berupa nama variabel dan identifier yang kedua adalah
indeks. Array diproses dengan cara perelemen. Semua elemen array
mempunyai nama yang sama namun memiliki indeks yang berbeda.
Berdasarkan jumlah indeks array ada array berdimensi satu dan
berdimensi banyak (multi-dimensi). Indeks array dapat berupa literal
integer atau variabel integer. Berdasarkan jenis data elementer
pembentuk array, array dibagi menjadi beberapa kelompok yaitu :
Array karakter (array of char)
Array integer (array of integer)
Array floating point (array of float/double)
Array Berdimensi Satu
Array berdimensi satu yaitu array yang memiliki hanya sebuah indeks.
Deklarasi array berdimensi satu meliputi tipe, nama dan jumlah
elemen array
tipe nama[jumlah_elemen];
Contoh :
char nama[30];
int nilai[100];
float signal[1024];
double temp[2048];
Contoh tersebut masing-masing mendeklarasikan array karakter
dengan jumlah elemen 30 karakter, array int dengan jumlah elemen
100 int, array float dengan jumlah elemen 1024 float dan array double
dengan jumlah elemen 2048. Total memori yang yang digunakan
masing-masing array adalah ukuran tipe dikali jumlah elemen.
Contoh
char nama[30]; menggunakan memori sebanyak 1 byte x 30 = 30
byte.
int nilai[100]; menggunakan memori sebanyak 2 byte x 100 =
200 byte
Array diproses perelemen menggunakan indeksnya seperti yang
diperlihatkan pada contoh berikut
#include <stdio.h>
void main()
{
int i, j[10];
for(i=0;i<10;i++)
j[i] = 10-i;
for(i=9;i>=0;i--)
printf(“%d ”,j[i]);
}
Bahasa C menyusun array dengan indeks dimulai dengan nol (0) dan
berakhir dengan indeks N-1 dimana N adalah jumlah elemen array.
Elemen-elemen array berdimensi satu yang berurutan menempati
memori pada lokasi memori yang juga berurutan. Misalnya elemen
j[0] menempati lokasi sebelum j[1] sebelum j[2] dan seterusnya.
Bahasa C memperlakukan nama array tanpa indeks sebagai variabel
yang berisi alamat elemen pertama, yaitu j adalah variabel yang
berisi alamat dari elemen j[0]. Jika dituliskan dengan operator
alamat dituliskan j = &j[0]. Jika j adalah bertipe integer berukuran
dua byte, maka elemen berikutnya, yaitu j[1] ada pada alamat j + 2
dan seterusnya elemen j[i] ada pada alamat j + i*2. Hal ini
berlaku untuk berbagai tipe data tergantung ukuran tipe data
tersebut.
Gambar. VII.1. J adalah variabel yang berisi alamat elemen j[0]
Array Multidimensi
Array multidimensi yaitu array yang memiliki lebih dari satu indeks.
j[0]
j[1]
j[2]
j[3]
&j[0] j
Array multidimensi yang paling kecil adalah array berdimensi dua
yang memiliki dua buah indeks.
Array dua dimensi termasuk array multidimensi dengan dua indeks.
Array dua dimensi ini membentuk matriks dengan jumlah baris dan
kolom yang ditentukan oleh ukuran indeks-indeks array. Indeks
pertama menunjukkan nomor baris sedangkan indeks kedua
menunjukkan nomor kolom. Deklarasi array dua dimensi sama
dengan deklarasi array berdimensi satu kecuali mempunyai dua
indeks seperti berikut
tipe nama[baris][kolom];
contoh
float A[100][100];
double C[200][200];
Contoh pertama mendeklarasikan array A bertipe float dengan 100
baris dan 100 kolom. Jumlah elemen array A adalah 10000 float.
Contoh kedua mendeklarasikan array C bertipe double dengan 200
baris dan 200 kolom. Jumlah elemen array B adalah 40000 double.
Mengakses array berdimensi dua seperti halnya mengakses array
berdimensi satu dilakukan perelemen. Namun karena terdapat dua
indeks, maka akses elemen-elemen dapat dilakukan dengan cara
kolom atau baris. Yang dimaksud dengan cara kolom yaitu,
elemen-elemen array diakses secara berurutan dari kolom awal
hingga kolom akhir pada baris yang sama, kemudian berpindah pada
baris berikutnya. Yang dimaksud dengan cara baris yaitu
elemen-elemen array diakses secara berurutan dari baris awal
hingga baris akhir pada kolom yang sama, kemudian pindah ke kolom
berikutnya. Kode-kode berikut menunjukkan cara kolom dan cara
baris secara berurutan
Cara kolom
int baris,kolom;
char a[M][N];
for(baris=0;baris<M;baris++)
for(kolom=0;kolom<N;kolom++)
a[baris][kolom] = getch();
Cara baris
int baris,kolom;
char [M][N];
for(kolom=0;kolom<N;kolom++)
for(baris=0;baris<M;baris++)
a[baris][kolom] = getch();
Bahasa C menempatkan elemen-elemen pada baris yang sama pada
lokasi memori yang berdekatan dan menempatkan elemen-elemen
pada kolom yang sama pada lokasi memori yang berjauhan.
Contoh
char c[3][3];
Gambar VII.2 Layout array berdimensi dua pada memori
Berdasarkan layout memori array berdimensi dua pada gambar VII.2,
array berdimensi dua dapat dijadikan sebagai array berdimensi satu
Jika sebuah array A berdimensi M x N dengan indek baris i dan indeks
kolom j, elemen array A[i][j] dapat diakses perelemen sebagai
array berdimensi berdimensi satu pada elemen A[ixN+j]
Contoh
#include <stdio.h>
void main()
{
int A[5][10];
int i;
for(i=0;i<5;i++)
for(j=0;j<10;j++)
A[i*10+j] = i*10+j;
for(i=0;i<5;i++)
{
for(j=0;j<10;j++);
printf(“%d ”,A[i][j]);
C[0][0]
C[0][1]
C[0][2]
C[1][0]
C[1][1]
C[1][2]
C[2][0]
C[2][1]
C[2][2]
printf(“¥n”);
}
}
Melewatkan Array Berdimensi Satu Sebagai Parameter Fungsi
Untuk melewatkan array berdimensi satu ke sebuah fungsi dimungkin
hanya melewatkan alamatnya. Selain mengirimkan alamat array ke
sebuah fungsi diperlukan juga mengirimkan ukuran array tersebut.
Namun jika fungsi yang dibuat memproses array-array yang
berukuran sama dan statis maka ukuran array tidak perlu dikirimkan
ke fungsi.
Fungsi berikut menjumlahkan elemen-elemen array A dan B
berdimensi 1x10 ke array C berukuran 1x10. Karena pemanggilan
fungsi dengan cara pass by reference maka fungsi berikut dapat
langsung mengperbaharui nilai-nilai array c.
#define size 10
void jumlah(double *c , double *a double *b)
{
int i;
for(i=0;i<size;i++)
c[i] = a[i] + b[i];
}
Melewatkan Array Berdimensi Dua Sebagai Parameter Fungsi
Mengirimkan array berdimensi dua sebagai parameter fungsi tidak
sama dengan array berdimensi satu. Untuk mengirimkan array
berdimensi dua ke fungsi harus dikirimkan pointer array yang
ukurannya sama dengan ukuran kolom. Faktanya adalah array
berdimensi dua adalah pointer ke pointer. Inilah sebabnya harus
mengirimkan pointer array.
Program berikut menjumlahkan array A dan B berdimensi 10x10 ke
array C berdimensi 10x10;
#include <stdio.h>
void addM(double a[][10], double b[][10], c[][10])
{
int i,j;
for(i=0;i<10;i++)
for(j=0;j<10;j++)
c[i][j] = a[i][j];
}
void main()
{
int i,j;
double A[10][10], B[10][10], C[10][10];
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
a[i][j] = 2.5;
b[i][j] = 2.5;
}
addM(A,B,C,10);
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
printf(“%4.2f ”,C[i][j]);
printf(“¥n”);
}
}
VII.2. Struct
Struct merupakan sebuah tipe data komposit yang tidak homogen.
Tipe data komposit tidak homogeny ini berarti bahwa ia tersusun
atas beberapa elemen-elemen berbagai jenis tipe yang berbeda
disebut field. Misalnya elemen data nama matakuliah, kode
matakuliah dan sks dari sebuah matakuliah. Ketiga elemen data
tersebut masing-masing mempunyai tipe data yang berbeda namun
berhubungan. Elemen dari struct tidak hanya berasal dari tipe data
dasar saja, namun ia dapat tersusun dari jenis tipe struct, pointer ke
berbagai tipe data. Pointer ini bahkan dapat merupakan pointer ke
dirinya sendiri dan juga ke sebuah fungsi.
struct nama_tipe
{
tipe nama_variable (, nama_variable,…);
(tipe nama_variable (, nama_variable,…);
} nama_struct;
Contoh
struct t_matakuliah
{
char kode_mk[10], nama_mk[50];
int sks;
};
Kode di atas merupakan sebuah definisi sebuah tipe data struct
dengan nama tipe t_matakuliah tipe ini mempunyai tiga elemen data
yaitu kode_mk dan nama_mk bertipe string dan sebuah integer
bernama sks. Untuk mendeklarasikan sebuah variabel dengan tipe
data struct ini dituliskan pada program
struct t_matakuliah matakuliahku;
Jika seorang mahasiswa memogramkan delapan mata kuliah maka
struct t_matakuliah daftar_mk[8];
Tipe struct dapat pula dibuat dan sekaligus dideklarasikan nama
variabelnya seperti contoh berikut
struct t_matakuliah
{
char kode_mk[10], nama_mk[50];
int sks;
} mata_kuliah;
Kemudian dapat pula membuat nama tipe yang baru untuk tipe data
struct tersebut dengan dengan cara sebagai berikut
typedef struct t_matakuliah t_mata_kuliah;
Kemudian dalam program dapat mendeklarasikan dan
menginisialisasi variabel struct sebagai berikut
void main()
{
t_mata_kuliah mk_mhs1;
t_mata_kuliah mk_mhs2 = {“474D442”,“Arithmetika
Komputer” , 2};
…
}
Setiap elemen dari struct dapat diakses secara individual
menggunakan operator titik (dot operator). Operator ini diletakkan
setelah nama variabel struct dan sebelum nama field.
Contoh
mk_mhs2.kode_mk = “132D442”;
mk_mhs2.nama_mk= “Algoritma dan Pemrograman”;
mk_mhs2.sks = 2;
Jika menggunakan pointer sebagai pengganti variabel struct bukan
operator titik digunakan tetapi menggunakan operator referensial
Contoh
t_mata_kuliah *p_mk = mk_mhs2;
p_mk->kode_mk = “132D442”;
p_mk->nama_mk = “Algoritma dan Pemrograman”;
p_mk->sks = 2;
Alokasi Memori Dinamis
Alokasi memori dinamis adalah mekanisme yang dilakukan oleh
progam untuk mendapatkan blok memori dari heap. Memori dapat
dapat digunakan untuk menyimpan data tipe apapun seperti integer,
char, array char, struct dan lain sebagainya.
Untuk melakukan alokasi memori dinamis program harus
memanggil fungsi pustaka malloc (malloc.h). Fungsi ini menerima
parameter jumlah memori ke lokasi tersebut.
ptr = (ptr ) malloc(size);
contoh
struct t_matakuliah
{
char kode_mk[10], nama_mk[50];
int sks;
};
void main()
{
struct t_matakuliah *p_mk;
p_mk = (struct t_matakuliah *)
malloc(sizeof(struct t_matakuliah));
p_mk->kode_mk = “132D442”;
p_mk->nama_mk = “Algoritma Dan Pemrograman”
p_mk->sks = 2;
free(p_mk);
}
Contoh program di atas mengalokasikan memori untuk struct.
Memori yang diperoleh lokasinya disimpan oleh sebuah variabel tipe
pointer. Jika setelah struct diproses dan tidak diperlukan lagi maka
memori untuk struct dapat dibebaskan dengan mengirimkan alamat
struct (pointernya) ke fungsi free().
VII.3. Linked List
Linked list atau senarai berantai adalah sekumpulan simpul-simpul
struktur data yang saling terkait. Setiap simpul dari senarai adalah
sebuah struct yang memiliki sebuah pointer sebagai fieldnya.
Pointer ini menunjuk ke simpul berikutnya atau sebelumnya. Pointer
inilah yang membentuk untaian node yang saling terhubung.
Simpul Linked List
Sebuah simpul adalah sebuah struct yang memiliki pointer ke simpul
berikutnya. Pola struct adalah sebagai berikut
struct tipe_node
{
tipe nama_variable;
struct tipe_node *nextPointer;
}
Contoh
struct list_mk
{
char kode_mk[9], nama_mk[50];
int sks;
struct list_mk *next, *previous;
}
Head dan Tail
Sebuah senarai umumnya mempunyai sebuah node ujung yang
dapat langsung digapai. Node ujung ini dapat berupa head (kepala)
atau tail (ekor). Head adalah ujung senarai yang merupakan simpul
yang paling lama berada pada senarai sedangkan tail adalah ujung
yang merupakan simpul yang paling baru pada senarai. Sering pula
dijumpai pada program senarai yang memiliki dua ujung simpul
head dan tail.
Head dan tail adalah sebuah pointer yang menunjuk kedua simpul
ujung senarai. Selain itu diperlukan pointer lain yang menunjuk ke
sebuah simpul yang baru atau simpul yang kini sedang diproses..
struct list_mk *head;
struct list_mk *tail;
struct list_mk *kini;
Sebuah senarai pada awalnya tidak memiliki satu simpulpun
sehingga head atau tail tidak menunjuk apa-apa.
#define NULL 0x00;
head = NULL;
tail = NULL;
Membuat Simpul Baru
Simpul baru senarai dibuat dengan cara alokasi dinamis. Pointer
baru digunakan untuk mendapatkan alamat memori yang
dialokasikan menggunakan fungsi malloc().
baru = (struct list_mk *) malloc(sizeof(struct
list_mk));
baru->next = NULL;
Menyisipkan Simpul Ke Linked List
Pada linked list yang kosong baik head maupun tail tidak menunjuk
apa-apa. Sebaliknya jika tidak head atau tail menunjuk ke kepala
atau ekor linked list. Jika senarai kosong maka simpul baru yang
dibuat dapat disisipkan pada head atau tail.
if(head == NULL)
head = baru;
if(tail == NULL)
tail = baru;
Jika senarai telah mempunyai elemen maka simpul baru dapat
langsung disisipkan pada tail namun tidak dapat langsung di
sisipkan pada head.
baru->previous = tail;
tail = baru;
kini = head;
while(kini->next != NULL) kini = kini->next;
kini->next = baru;
kini = baru;
BAB VIII
FILE
File atau berkas adalah termasuk sebagai kategori perangkat lunak
yang tersimpan pada media penyimpanan permanen seperti hardisk
dan yang sejenis. File menyediakan cara data pada memori dapat
disimpan ke media dan kemudian dimuat kembali pada saat
dibutuhkan. Tanpa adanya file data-data yang telah diolah oleh
komputer tidak dapat tersimpan permanen pada RAM.
VIII.1. File Teks dan File Biner
File teks adalah file yang disimpan dalam format teks. Yang
dimaksud dengan format teks yaitu menggunakan kode ASCII
sehingga file teks dikenal juga sebagai file ASCII. File teks
berisi karakter-karakter ASCII yang berasal dari input seperti
keyboard atau hasil pengolahan program komputer. Apa yang
tersimpan pada file teks dengan mudah ditampilkan pada layar
komputer.
File biner adalah file yang tersimpan sebagai sekumpulan
kode-kode biner.
VIII.2. Operasi File
Bahasa C menyediakan fungsi pustaka untuk membuka,
membaca, menulis dan menutup file. Operasi membuka file
mengembalikan sebuah pointer ke sebuah tipe struct File.
typedef struct {
int level;
unsigned flags;
char fd;
unsigned char hold;
int bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
} FILE;
Untuk mengolah file, program harus mempunyai pointer ke
tipe struct FILE
FILE *fptr;
Membuka dan Menutup File
Sebelum sebuah file dapat diproses, file harus dibuka terlebih
dahulu. Fungsi pustaka standar bahasa C menyediakan
fungsi untuk membuka file fopen(). Fungsi fopen()
mempunyai dua parameter formal. Parameter yang pertama
adalah nama file dan yang kedua adalah modus file.Fungsi
fopen() memetakan nama file fisik pada dengan lokasi buffer.
Fungsi ini mengembalikan pointer ke tipe struct FILE.
FILE * fopen(const char *namafile, const char
*modus);
Modus file mendefinisikan bagaimana status file dibuka.
Modus-modus file ditunjukkan pada tabel VIII.1
Untuk menutup file yang tidak digunakan lagi bahasa C
menyediakan fungsi pustaka fclose().
int fclose(FILE *fstream);
Tabel VIII.1 Modus-Modus File
Modus Keterangan
R modus baca
W Modus tulis
A Modus tambah
r+ Modus baca dan tulis
w+ Modus baca dan tulis
a+ Modus baca dan tambah
Menulis Ke File
Bahasa C menyediakan beberapa fungsi untuk menulis ke
file. Berikut ini adalah fungsi-fungsi yang dapat digunakan
untuk menulis ke file
int putc(int c, FILE *stream);
Fungsi putc() ini memiliki dua parameter. Parameter pertama
adalah kode ASCII karakter yang hendak ditulis ke file
stream. Fungsi ini mengembalikan karakter c apabila
penulisan file berhasil dilakukan. Sebaliknya jika penulisan ke
file tidak berhasil maka fungsi ini mengembalikan EOF.
int fputc(int c, FILE *stream)
Fungsi fputc() seperti fungsi putc() menulis karakter c ke file
stream. Fungsi ini menerima sebuah int kode ASCI karakter c
dan menerima pointer FILE stream dimana file akan ditulisi.
Fungsi mengembalikan kode ASCII karakter yang ditulis jika
penulisan ke file berhasil. Sebaliknya jika tidak berhasil fungsi
ini mengembalikan EOF.
int putw(int w, FILE *stream)
Fungsi putw() menulis data integer ke file. Fungsi ini
menerima dua parameter. Parameter pertama adalah data
integer w yang akan ditulis ke file. Parameter kedua adalah
pointer file stream kemana data akan tuliskan. Fungsi ini
mengembalikan nilai w apabila penulisan ke file berhasil.
Sebaliknya jika penulisan file tidak berhasil, fungsi ini
mengembalikan EOF.
int fputs(conts char *c, FILE *stream);
Fungsi fputs() menulis string c[] ke file. Meskipun string c
harus berakhir karakter NULL, karakter NULL tidak ikut ditulis
ke file. Fungsi ini menerima dua parameter. Parameter
pertama adalah string c yang ditulis ke file. Parameter yang
kedua adalah pointer file stream.
int fprintf(FILE *fptr, const char
*format(,args,…));
Fungsi ini menulis data dengan beragam format ke file.
Fungsi ini menerima parameter pointer ke file, literal string
format dan daftar data yang akan ditulis ke file. Fungsi ini
mengembalikan jumlah byte yang ditulis ke file jika penulisan
file berhasil. Sebaliknya fungsi ini mengembalikan EOF jika
penulisan tidak berhasil.
Membaca Dari File
Bahasa C menyediakan fungs-fungsi pustaka untuk
membaca data dari file. Fungsi-fungsi pustaka ini yaitu
int getc(FILE *stream);
Fungsi getc() menerima sebuah parameter berupa pointer ke
file stream. Fungsi getc() membaca sebuah karakter dari file
stream. Setelah membaca sebuah karakter, fungsi ini
memindahkan pointer posisi pembacaan untuk karakter
selanjutnya. Fungsi ini mengembalikan kode ASCII karakter
yang dibaca jika pembacaan berhasil. Jika pembacaan
karakter darifile tidak berhasil, fungsi ini mengembalikan EOF.
int fgetc(FILE *stream);
Fungsi fgetc() menerima sebuah parameter berupa pointer
file stream. Fungsi ini membaca sebuah karakter dari file
stream. Fungsi ini mengembalikan kode ASCII karakter yang
terbaca jika pembacaan berhasil. EOF.
int getw(int w, FILE *stream);
Fungsi getw() menerima dua parameter berupa bilangan
bulat w dan pointer file stream.
char *fgets(char *s, int n, FILE *stream);
Fungsi fgets() menerima tiga parameter berupa string s,
integer n dan pointer file stream. Fungsi ini membaca
sejumlah n karakter dari file stream yang menyimpan
karakter-karakter yang telah dibaca pada string s. Proses
pembacaan karakter dilakukan karakter-demi-karakter hingga
n karakter diperoleh atau diperoleh karakter newline.
int fscanf(FILE *stream, const char *format
(,args,…));
Fungsi fscanf() fungsi yang mirip dengan fungsi scanf().
Fungsi fscanf() menerima sejumlah parameter. Parameter
pertama adalah pointer file yang dibaca. Parameter kedua
adalah format data yang dibaca dan yang ketiga adalah
daftar alamat variabel yang akan berisi data yang dibaca.
Fungsi ini mengembalikan jumlah field yang dibaca jika
pembacaan berhasil dilakukan. Sebaliknya mengembalikan
nol jika tidak ada field yang berhasil dibaca, fungsi ini
mengembalikan karakter EOF jika mencapai akhir dari file.
Fungsi-Fungsi Lain
Bahasa C menyediakan fungsi-fungsi bantuan lainnya untuk
operasi file.
int feof(FILE *stream);
Fungsi feof() digunakan untuk menguji akhir sebuah file
stream. Fungsi ini mengembalikan bilangan selain nol jika
ditemukan akhir sebuah file. Jika tidak sedang menemukan
eof fungsi ini mengembalikan bilangan nol.
int fsetpos(FILE *stream, const fpos_t *pos);
Fungsi fsetpos() memindahkan pointer posisi file ke posisi
pos. Posisi pos ini dapat diperoleh dengan memanggil fungsi
fgetpos().
Contoh
#include <stdio.h>
void main()
{
FILE *fptr;
int j,j,k;
fptr = fopen(“data.dat”, “w”);
printf(“k ? ”);
scanf(“%d”,&k);
while(!feof(stdin)) {
for(i=0;i<k;i++) {
for(j=0;j<=i;j++) putc(65+j,fptr);
putc(‘¥n’,fptr);
}
putc(‘¥n’,fptr);
printf(“k ? ”); scanf(“%d”,&k);
}
Fclose(fptr);
}
Menulis dan MembacaBlok
Fungsi-fungsi operasi file yang telah dibahas sebelumnya
digunakan untuk membaca dan menulis sebuah data tunggal.
Bagian ini membahas fungsi-fungsi operasi file untuk data
yang berbentuk blok.
Menulis blok Data
unsigned fwrite(void *b, int n_byte, int c, FILE
*fptr);
Fungsi fwrite() menulis sejumlah c blok berukuran
n_byte data yang pointer b menunjukkan lokasinya ke
sebuah file yang ditunjuk oleh pointer fptr.
Contoh
int main()
{
FILE *fptr;
float A[20];
int i;
if(fptr=fopen(argv[1], “wb”)) == NULL)
{
printf(“File tidak dapat dibuka¥n”);
exit(0);
}
for(i=0;i<20;i++) A[i] = (float ) i;
if(write(A,20*sizeof(A),1,fptr) != 1)
printf(“File error”);
fclose(fptr);
return 0;
}
Membaca blok
unsigned fread(void *b, int nbyte, int c, FILE
*fptr);
Fungsi fread() membaca sebuah sejumlah c blok data
berukuran nbyte dari file yang ditunjuk oleh sebuah pointer
file fptr. Data yang berhasil dibaca ditampung pada lokasi
memori yang ditunjuk oleh pointer b.
void main(int c, char *argv[])
{
FILE *fptr;
int i;
float a[20];
char *namafile = argv[1];
if((fptr=fopen(namafile,"rb"))==NULL)
{
printf("file tidak dapat dibuka¥n");
exit(1);
}
if(fread(a,20*sizeof(a),1,fptr) !=1)
printf("file error¥n");
for(i=0;i<20;i++)
printf("%5.3f ",a[i]);
}
FILE *fptr;
void baca_data()
{
}
struct t_barang
{
char kode[9];
char nama[40];
int harga;
int stok;
} barang;
FILE *fptr;
void stok_barang(int stok)
{
If (stok == 0);
else
{
clrscr();
barang.stok = stok;
printf(“Kode barang : ”);
gets(barang.kode);
printf(“Nama Barang : ”);
gets(barang.nama);
printf(“Harga barang : ”)
scanf(“%d”,&(barang.harga));
fwrite(&barang,sizeof(barang),1,fptr);
}
}