55472_materialpemrograman

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

Upload: nhicykzz-anomi-ahn

Post on 09-Dec-2015

222 views

Category:

Documents


6 download

DESCRIPTION

dpk

TRANSCRIPT

Page 1: 55472_MaterialPemrograman

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.

Page 2: 55472_MaterialPemrograman

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

Page 3: 55472_MaterialPemrograman

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

Page 4: 55472_MaterialPemrograman

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

Page 5: 55472_MaterialPemrograman

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

Page 6: 55472_MaterialPemrograman

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

Page 7: 55472_MaterialPemrograman

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

Page 8: 55472_MaterialPemrograman

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

Page 9: 55472_MaterialPemrograman

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.

Page 10: 55472_MaterialPemrograman

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 :

Page 11: 55472_MaterialPemrograman

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

Page 12: 55472_MaterialPemrograman

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

Page 13: 55472_MaterialPemrograman

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,

Page 14: 55472_MaterialPemrograman

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

Page 15: 55472_MaterialPemrograman

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.

Page 16: 55472_MaterialPemrograman

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.

Page 17: 55472_MaterialPemrograman

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

Page 18: 55472_MaterialPemrograman

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

Page 19: 55472_MaterialPemrograman

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

}

Page 20: 55472_MaterialPemrograman

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

Page 21: 55472_MaterialPemrograman

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

}

Page 22: 55472_MaterialPemrograman

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

Page 23: 55472_MaterialPemrograman

{

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

Page 24: 55472_MaterialPemrograman

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)

Page 25: 55472_MaterialPemrograman

{

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

Page 26: 55472_MaterialPemrograman

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;

Page 27: 55472_MaterialPemrograman

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

Page 28: 55472_MaterialPemrograman

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

{

Page 29: 55472_MaterialPemrograman

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

Page 30: 55472_MaterialPemrograman

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)

Page 31: 55472_MaterialPemrograman

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

Page 32: 55472_MaterialPemrograman

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

Page 33: 55472_MaterialPemrograman

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)

{

Page 34: 55472_MaterialPemrograman

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

{

Page 35: 55472_MaterialPemrograman

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;

Page 36: 55472_MaterialPemrograman

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

Page 37: 55472_MaterialPemrograman

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;

}

Page 38: 55472_MaterialPemrograman

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

Page 39: 55472_MaterialPemrograman

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)

{

Page 40: 55472_MaterialPemrograman

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

Page 41: 55472_MaterialPemrograman

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)

Page 42: 55472_MaterialPemrograman

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

Page 43: 55472_MaterialPemrograman

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

Page 44: 55472_MaterialPemrograman

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

Page 45: 55472_MaterialPemrograman

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]

Page 46: 55472_MaterialPemrograman

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

Page 47: 55472_MaterialPemrograman

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

Page 48: 55472_MaterialPemrograman

{

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;

Page 49: 55472_MaterialPemrograman

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

Page 50: 55472_MaterialPemrograman

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

Page 51: 55472_MaterialPemrograman

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;

Page 52: 55472_MaterialPemrograman

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.

Page 53: 55472_MaterialPemrograman

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

Page 54: 55472_MaterialPemrograman

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

Page 55: 55472_MaterialPemrograman

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

Page 56: 55472_MaterialPemrograman

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

Page 57: 55472_MaterialPemrograman

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

Page 58: 55472_MaterialPemrograman

printf(“Nama Barang : ”);

gets(barang.nama);

printf(“Harga barang : ”)

scanf(“%d”,&(barang.harga));

fwrite(&barang,sizeof(barang),1,fptr);

}

}