bahasa c

51

Transcript of bahasa c

Page 1: bahasa c

Bahasa PemrogramanC & C++

Page 2: bahasa c

Daftar Isi

Daftar Isi i

1 Pengenalan C & C++ 11.1 Sejarah Singkat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Struktur Bahasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.3 Variabel dan Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Statement - Ekspresi - Operator . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.4.1 Operator aritmatika . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.4.2 Operator relasional dan logika . . . . . . . . . . . . . . . . . . . . . . 41.4.3 Operator increment dan decrement . . . . . . . . . . . . . . . . . . . . 41.4.4 Operator bitwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4.5 Operator dan ekspresi assignment . . . . . . . . . . . . . . . . . . . . 41.4.6 Ekspresi kondisional . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4.7 Precedence dan urutan evaluasi . . . . . . . . . . . . . . . . . . . . . . 5

1.5 Input dan Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.5.1 printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.5.2 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Control Flow 92.1 Compound Statement dan blok . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2 Decision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.2.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.2 switch...case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.3 Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3.1 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3.2 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.3.3 do...while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.3.4 goto label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.3.5 break dan continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Array 17

4 Structure 21

i

Page 3: bahasa c

DAFTAR ISI DAFTAR ISI

5 Fungsi 235.1 Pengiriman argumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245.2 Fungsi Rekursi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6 Pointer 27

7 File 317.1 Membuka dan menutup �le . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317.2 Menulis dan membaca data �le . . . . . . . . . . . . . . . . . . . . . . . . . . 32

8 Gra�k 36

9 Object Oriented Programming 399.1 Class dan Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419.2 Input dan Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429.3 Operator Overloading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439.4 Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 459.5 Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

ii

Page 4: bahasa c

Bab 1

Pengenalan C & C++

1.1 Sejarah SingkatBahasa pemrograman C diciptakan oleh Dennis Ritchie dan Brian Kernighan pada ta-

hun 1970-an. C merupakan pengembangan dari bahasa B, yang dikembangkan dari BCPL(Basic Common Programming Language). Kemudian C dikembangkan lagi denganmenambahkan konsep object oriented programming oleh Dr. Bjarne Stroustoup pada tahun1985, bahasa C dengan kemampuan object ini dinamakan bahasa pemrograman C++.

1.2 Struktur Bahasa[preprocessor directive][deklarasi variable/konstanta global][prototype fungsi]main (){

isi program utama;...

}

Program dalam bahasa C terdiri dari fungsi dan variabel. Fungsi berisi statement (per-nyataan) yang menentukan operasi yang akan dilaksanakan, dan variabel berfungsi untukmenyimpan nilai-nilai yang digunakan pada saat komputasi. Fungsi pada C sama denganfungsi atau prosedur pada Pascal.

Anda diberi kebebasan untuk memberikan nama fungsi dalam C. Tetapi ada satu namafungsi khusus yaitu �main� � program C dimulai dari fungsi �main� ini, dengan kata lainsetiap program C harus memiliki fungsi �main�.

Penamaan fungsi atau variabel (disebut juga dengan identi�er) harus memenuhi bebe-rapa aturan, yaitu sebagai berikut:

1. Nama fungsi maupun variabel bersifat case sensitive.

2. Nama fungsi dan variabel harus unik.

1

Page 5: bahasa c

BAB 1. PENGENALAN C & C++

3. Nama fungsi dan variabel tidak boleh dimulai dengan angka dan tidak boleh mengan-dung karakter-karakter khusus kecuali �_�.

4. Tidak boleh menggunakan kata kunci yang telah dicadangkan penggunaannya oleh C.

Berikut contoh program C untuk menampilkan string ke layar monitor:

#include <stdio.h>main (){

/* say hello to the world */printf("Hello World!\n");

}

Jika source code di-compile dan dieksekusi, akan menghasilkan tampilan berikut ini padalayar monitor:

Hello World!

Setiap karakter yang diawali dengan tanda �\� merupakan escape code/character. Padacontoh di atas, �\n� merupakan escape code untuk newline yang menghasilkan baris baru.

Pada contoh program di atas, tanda �{� merupakan awal dari isi fungsi �main� dan�}� merupakan akhir dari fungsi tersebut. Setiap statement harus diakhiri dengan tanda�;� untuk menyatakan akhir statement. Tanda �#� pada kolom pertama menyatakan suatupreprocessor directive, merupakan perintah yang dilaksanakan oleh preprocessor C. Padacontoh ini, �#include <stdio.h>� memerintahkan preprocessor untuk memasukkan header�le stdio.h yang berisikan informasi fungsi pustaka untuk fungsi input dan output. Danteks yang terdapat di dalam tanda �/*� dan �*/� merupakan komentar, berfungsi sebagaipenjelasan untuk kode program, tidak diproses oleh compiler.

1.3 Variabel dan KonstantaVariabel dan konstanta digunakan untuk menyimpan nilai yang digunakan pada proses

komputasi. Pada C setiap variabel ataupun konstanta yang digunakan harus dideklarasikanterlebih dahulu.Cara mendeklarasikan variabel adalah sebagai berikut:

tipe_data identifier_variabel;

Untuk mendeklarasikan konstanta:

const identifier_konstanta = nilai;

Penamaan variabel maupun konstanta sebaiknya berhubungan dengan tujuan penggunaanvariabel atau konstanta tersebut. Disarankan untuk menggunakan nama yang singkat apa-bila variabel tersebut bersifat lokal di dalam fungsi dan nama yang lebih panjang untukvariabel eksternal dan global.

Tabel 1.1 menampilkan daftar tipe data, ukuran dan jangkauan nilainya pada C. Tipedata char digunakan untuk menampung data karakter, int untuk menampung bilanganbulat, float dan double untuk menampung bilangan desimal.

2

Page 6: bahasa c

BAB 1. PENGENALAN C & C++

Tabel 1.1: Tipe data, ukuran, dan jangkauanTipe Ukuran Jangkauan

unsigned char 1 0 . . . 255[signed] char 1 −128 . . . 127

unsigned short [int] 2 0 . . . 65.535[signed] short [int] 2 −32.768 . . . 32.767

unsigned int 2 0 . . . 65.535[signed] int 2 −32.768 . . . 32.7867

unsigned long [int] 4 0 . . . 4.294.967.295[signed] long [int] 4 −2.147.483.648 . . . 2.147.483.647

float 4 3, 4× 10−38 . . . 3, 4× 1038

double 8 1, 7× 10−308 . . . 1, 7× 10308

long double 10 3, 4× 10−4932 . . . 3, 4× 104932

Tipe data char dan int dapat dideklarasikan sebagai tipe data bertanda (signed) atautidak bertanda (unsigned). unsigned menampung nilai positif, sedangkan signed menam-pung nilai positif maupun negatif.Pada C tipe data string dideklarasikan sebagai array dari karakter:

char identifier[jumlah_karakter];

atau dideklarasikan sebagai pointer ke karakter:

char *identifier;

1.4 Statement, Ekspresi dan OperatorStatement (pernyataan) adalah unit perintah terkecil bahasa pemrograman. Statement

tidak mengembalikan suatu nilai dan dieksekusi untuk menghasilkan suatu efek samping.Ekspresi merupakan kombinasi variabel dan konstanta dengan operator untuk menghasilkannilai yang baru.

Operator bisa bersifat binary atau unary. Pada C operator juga bisa bersifat ternary.Operator binary dioperasikan pada dua operan, unary pada satu operan dan ternary padatiga operan.

1.4.1 Operator aritmatika

Tabel 1.2: Operator aritmatikaOperator Keterangan

* perkalian/ pembagian% modulus/sisa bagi+ penjumlahan- pengurangan

Tabel 1.2 menampilkan operator aritmatika yang terdapat pada C. Operator �%� hanyadapat dilakukan pada tipe data char dan int.

3

Page 7: bahasa c

BAB 1. PENGENALAN C & C++

1.4.2 Operator relasional dan logika

Tabel 1.3: Operator relasionalOperator Keterangan

> lebih besar>= lebih besar dan sama dengan<= lebih kecil dan sama dengan< lebih kecil== sama dengan!= tidak sama dengan

Tabel 1.4: Operator logikaOperator Keterangan

&& operator logika AND|| operator logika OR! operator logika NOT

Tabel 1.3 dan 1.4 menampilkan operator relasional dan logika yang terdapat pada C.Hasil evaluasi ekpresi yang menggunakan operator logika bernilai 1 (satu) apabila hasilevaluasi true dan 0 (nol) apabila hasil evaluasi false.

1.4.3 Operator increment dan decrementC menyediakan operator increment dan decrement. Operator increment ++ menam-

bahkan 1 ke operan, sedangkan operator decrement -- mengurang 1. Operator incrementdan decrement hanya membutuhkan satu operan yaitu variabel yang akan ditambah ataudikurang sebanyak 1. Operator ini dapat dituliskan sebagai pre�x maupun sebagai post�x.

1.4.4 Operator bitwise

Tabel 1.5: Operator bitwiseOperator Keterangan

& bitwise AND| bitwise OR^ bitwise XOR (Exclusive OR)< < geser ke kiri (shift left)> > geser ke kanan (shift right)~ one's complement (unary)

Tabel 1.5 menampilkan operator bitwise pada C. Operator bitwise digunakan untukmemanipulasi nilai pada tingkatan bit. Operator bitwise hanya dapat digunakan pada operanyang bertipe char atau int.

1.4.5 Operator dan ekspresi assignmentSebuah ekspresi seperti

4

Page 8: bahasa c

BAB 1. PENGENALAN C & C++

i = i + 5

dimana variabel yang terdapat disebelah kiri diulang lagi disebelah kanan, dapat disingkatmenjadi

i += 5

Operator += pada ekspresi di atas disebut dengan operator assignment. Operator ini dapatdigunakan pada operator binari

+ - * / % < < > > & ^ |

1.4.6 Ekspresi kondisionalStatement

if (a > b)z = a;

elsez = b;

dapat ditulis dalam bentuk ekspresi kondisional, menggunakan operator ternary �? :�.Bentuk penulisan ekpresi kondisional adalah

expr1 ? expr2 : expr3

Penulisan statement di atas dalam bentuk ekspresi kondisional adalah

a > b ? z = a : z = b;

1.4.7 Precedence dan urutan evaluasi

Tabel 1.6: Precedence dan urutan evaluasiOperator

() [] -> .! ~ ++ -- + - *(tipe) sizeof

* / %+ -

< < > >< <= > >=

== !=&^|&&||?:

= += -= *= /= %= &= ^= |= < <= > >=,

Operator unary +, -, & dan * memiliki precedence lebih tinggi dibanding operatorbinary-nya.

5

Page 9: bahasa c

BAB 1. PENGENALAN C & C++

Tabel 1.6 menampilkan precedence dan urutan evaluasi untuk seluruh operator, termasukoperator yang belum kita bahas. Operator yang berada pada baris yang sama memilikitingkat precedence yang sama. Urutan evaluasi dimulai dari baris teratas yang memilikiprecedence yang paling tinggi ke baris paling bawah yang memiliki precedence yang palingrendah. Operator �()� merupakan pemanggilan fungsi. Operator �->� dan �.� digunakanuntuk mengakses anggota struktur yang akan kita bahas nanti (bersama dengan operator�&�, �*� dan �sizeof�).

1.5 Input dan OutputProgram biasanya membutuhkan masukan (input) dan juga menghasilkan keluaran (ou-

tput). Pada C fasilitas input dan output ini disediakan melalui fungsi pustaka.Setiap program C yang akan menggunakan fungsi input dan output harus memasukkan

header �le fungsi pustaka input dan output.

#include <stdio.h>

Preprocessor directive di atas akan memasukkan header �le �stdio.h� yang merupakanheader �le standar untuk menyediakan akses terhadap fungsi pustaka input dan output.

Nama header �le tersebut �stdio.h� diapit dengan tanda �<� dan �>� untuk memasukkanheader �le yang terdapat pada lokasi standar. Untuk memasukkan header �le yang tidakterletak pada lokasi standar, maka nama �le header �le diapit menggunakan tanda �"�.

Berikut kita akan melihat sebuah contoh program sederhana penggunaan fungsi inputdan output pada C. Program berikut akan meminta input nilai panjang dan lebar dan akanmenampilkan hasil perhitungan luas persegi panjang:

#include <stdio.h>main (){

int p,l,luas;/* input panjang dan lebar */printf("Panjang: "); scanf("%d", &p);printf("Lebar : "); scanf("%d", &l);/* hitung luas */luas = p * l;/* tampilkan hasil perhitungan */printf("Luas : %d\n", luas);

}

#include <stdio.h> memasukkan header �le �stdio.h� yang menyediakan akses kefungsi input dan output.

int p,l,luas; mendeklarasikan tiga variabel int. p untuk menampung nilaipanjang, l menampung nilai lebar dan luas menampung nilailuas.

printf("Panjang: "); mencetak string �Panjang: � pada layar monitor.

6

Page 10: bahasa c

BAB 1. PENGENALAN C & C++

scanf("%d", &p); membaca input data int dari keyboard dan disimpan pada varia-bel p.

printf("Luas : %d\n", luas); menampilkan string �Luas :� diikuti dengan nilai yangterdapat pada variabel luas.

Fungsi scanf dan printf pada contoh program di atas merupakan fungsi input dan output.

1.5.1 printf

printf mengkonversi, memformat, dan mencetak argumennya ke standar ouput (biasa-nya layar monitor) sesuai dengan format. Fungsi ini mengembalikan jumlah karakter yangdicetak.

int printf(char *format, arg1, arg2, ...);arg1, arg2, ... merupakan ekpresi yang nilainya akan dicetak oleh printf. format

berisikan format string tampilan output. Untuk menampilkan nilai yang terdapat padaarg1, arg2, ..., gunakan tanda �%� diikuti dengan karakter format sesuai dengan tipedata yang akan dicetak. Tabel 1.7 menampilkan format string untuk masing-masing tipedata. Tabel 1.8 menampilkan escape code/character yang terdapat pada C.

Tabel 1.7: Format stringkarakter tipe datad,i [signed] int

o,u,x,X [unsigned] inte,E float, double (menggunakan notasi E)f,F float, doublec chars char [], char * (string)

Tabel 1.8: Escape code/characterEscape character Keterangan

\" kutip ganda\NNN karakter dengan oktal NNN\\ backslash\n new line\r carriage return\t horizontal tab\v vertical tab

\xNN karakter dengan hexadesimal NN%% %

1.5.2 scanf

scanfmembaca karakter dari standar input (biasanya keyboard) sesuai dengan spesi�kasipada format dan menyimpan hasilnya ke argumennya. Fungsi ini mengembalikan banyaknilai yang disimpan ke dalam variabel argumen scanf.

int scanf(char *format, ...);

7

Page 11: bahasa c

BAB 1. PENGENALAN C & C++

Argumen format pada scanf sama dengan argumen format pada fungsi printf. Argu-men setelah format merupakan alamat memori variabel yang akan menyimpan input yangdibaca oleh scanf. Pointer atau alamat memori variabel didapatkan dengan menggunakanoperator �&� didepan variabel yang bersangkutan.

8

Page 12: bahasa c

Bab 2

Control Flow

Control Flow (aliran kontrol) berguna untuk menentukan urutan komputasi yang dilak-sanakan. Dalam bahasa pemrograman terdapat dua control �ow yang dapat digunakan,yaitu decision (pengambilan keputusan) dan loop (pengulangan). Decision akan menentuk-an proses selanjutnya yang akan dilaksanakan berdasarkan suatu kondisi yang ditentukan,dan loop akan mengulang suatu proses sampai suatu kondisi dipenuhi.

2.1 Compound Statement dan blokSebuah ekpresi seperti x = 10 atau printf(...) menjadi statement apabila diukiti

dengan �;�. Contohnya

x = 10;printf(...);

Pada C, tanda �;� berfungsi sebagai akhir dari suatu statement.Tanda kurung kurawal �{� dan �}� berfungsi untuk mengelompokkan statement sehingga

menjadi compound statementc atau blok, sehingga statement-statement yang berada padablok tersebut secara syntax dianggap sama dengan satu statement. Compound statementdigunakan untuk mengelompokkan statement setelah penggunaan if, else, while, for,switch dan sebagainya. Pada akhir suatu blok statement tidak perlu digunakan tanda �;�untuk mengakhiri blok tersebut.

2.2 Decision

2.2.1 if

Syntax statement if adalah sebagai berikut:

if (expression)statement1;

elsestatement2;

9

Page 13: bahasa c

BAB 2. CONTROL FLOW

Penggunaan else pada if bersifat optional, boleh ditulis atau tidak tergantung pada kebu-tuhan. expression akan dievaluasi; apabila hasil evaluasi expression bernilai true (bernilaiselain 0) maka statement1 akan dieksekusi. Dan apabila hasil evaluasi expression bernilaifalse (bernilai 0) dan terdapat statement else, statement2 akan dieksekusi.Contoh:

#include <stdio.h>main (){

int n;printf("Masukkan n: "); scanf("%d", &n);if (n % 2 != 0)

printf("Bilangan ganjil.\n");else

printf("Bilangan genap.\n");}

Program di atas akan menampilkan string �Bilangan ganjil.� atau �Bilangan genap.�sesuai dengan input yang diberikan. Statement if (n % 2 != 0) menguji apakah sisa bagi(modulus) n dan 2 tidak sama dengan 0. Jika hasilnya bernilai true, maka statement setelahif akan dieksekusi, yaitu menampilkan string �Bilangan ganjil.�. Sedangkan apabila ha-silnya bernilai false, maka statement setelah else yang akan dieksekusi, yaitu menampilkanstring �Bilangan genap.�.

Apabila terdapat lebih dari dua kemungkinan jalur eksekusi yang harus dipilih, kitadapat menggunakan lebih dari satu statement if

if (expression1)statement1;

else if (expression2)statement2;

else if (expression3)statement3;

else if (expression4)statement4;

...else

statement5;

penulisan statement if di atas biasanya digunakan apabila terdapat lebih dari dua kemung-kinan jalur eksekusi. Evaluasi ekpresi dilakukan berurutan dari atas. expression1 akandievaluasi pertama kali, apabila bernilai true, statement1 akan dieksekusi dan menghen-tikan evaluasi expression selanjutnya. statement5 pada else terakhir akan dieksekusiapabila tidak ada expression yang bernilai true. Penggunaan if ini disebut dengan nestedif.Contoh:

#include <stdio.h>

10

Page 14: bahasa c

BAB 2. CONTROL FLOW

main (){

int na;char nh;/* input nilai angka */printf("Nilai Angka: "); scanf("%d", &na);/* tentukan nilai huruf */if (na >= 80)

nh = 'A';else if (na >= 70)

nh = 'B';else if (na >= 60)

nh = 'C';else if (na >= 50)

nh = 'D';else

nh = 'E';/* tampilkan nilai huruf */printf("Nilai Huruf: %c\n", nh);

}

Contoh di atas akan menentukan nilai huruf sesuai dengan nilai angka yang diinput. State-ment if digunakan untuk memilih nilai huruf sesuai dengan nilai angka. Misalkan jika nilaiangka (na) yang diinput adalah 65, maka nilai huruf yang ditampilkan adalah C.

2.2.2 switch...case

Statement switch digunakan untuk decision yang memiliki lebih dari dua kemungkinan.switch akan membandingkan hasil evaluasi expression dengan suatu nilai konstanta integerdan mengeksekusi statement sesuai dengan hasil perbandingan tersebut.

switch (expression) {case constant1:

statement1;[break;]

case constant2:statement2;[break;]

...[default:

statement_default;]}

Kata kunci case pada syntax di atas merupakan percabangan pilihan. Jika hasil evaluasiexpression sesuai dengan salah satu nilai pada constant maka statement pada casetersebut akan dieksekusi sampai ditemukannya kata kunci break. Apabila tidak terdapat

11

Page 15: bahasa c

BAB 2. CONTROL FLOW

constant yang sesuai dengan hasil evaluasi expression dan terdapat kata kunci defaultdi dalam blok switch tersebut, statement_default akan dieksekusi.Contoh:

#include <stdio.h>main (){

int n;char *pesan;printf("Masukkan pilihan Anda[1..4]: "); scanf("%u", &n);switch (n) {

case 1:pesan = "Anda memilih pilihan pertama.";break;

case 2:pesan = "Anda memilih pilihan kedua.";break;

case 3:pesan = "Anda memilih pilihan ketiga.";break;

case 4:pesan = "Anda memilih pilihan keempat.";break;

default:pesan = "Ooops, pilihan Anda tidak tersedia.";

}printf("%s\n", pesan);

}

Pada statement switch...case, operator relasional yang secara implisit digunakan ada-lah �==� (sama dengan). Tipe data yang digunakan untuk expression pada switch atauconstant pada case harus bertipe int atau char.

2.3 Loop

2.3.1 for

for (expr1; expr2; expr3)statement;

Pada perulangan for, expr1 digunakan sebagai inisialiasi counter, expr2 digunakan sebagaitest kondisi apakah perulangan akan diteruskan atau dihentikan, sedangkan expr3mengubahnilai counter pada setiap kali loop dilaksanakan.

Perulangan for akan terus dilakukan apabila nilai dari expr2 true. Apabila expr2 tidakdituliskan, maka expr2 akan dianggap true. Loop berikut akan menghasilkan perulanganyang tidak pernah berhenti (in�nite loop):

12

Page 16: bahasa c

BAB 2. CONTROL FLOW

for (;;);

Contoh:

#include <stdio.h>main (){

int i;for (i = 1; i <= 10; i++)

printf("%d\n", i);}

Pada contoh program di atas, variabel i adalah merupakan counter yang digunakan padaperulangan for untuk menghitung jumlah perulangan yang telah dilakukan dan untuk me-nentukan kapan perulangan tersebut berhenti. Perulangan di atas diulangi sebanyak 10 kaliyaitu dari 1 sampai dengan 10, dengan setiap kali perulangan counter di-increment.

Perulangan dapat bersifat nested (perulangan di dalam perulangan). Loop yang palingdalam akan diselesaikan terlebih dahulu, baru diikuti dengan loop diluarnya.

2.3.2 while

while (expression)statement;

while akan mengulang statement apabila nilai evaluasi expression bernilai true. Apabilapada awal perulangan expression bernilai false, maka perulangan while tersebut tidakakan dilaksanakan, dilanjutkan ke statement selanjutnya setelah perulangan.Contoh:

#include <stdio.h>main (){

int i;i = 1;while (i <= 10) {

printf("%d\n", i);i++;

}}

Pada contoh perulangan while di atas, perulangan akan terus dilakukan apabila nilai va-riabel i masih lebih kecil dan sama dengan 10. Perulangan while di atas mungkin tidakdilaksanakan sama sekali apabila nilai i pada saat sebelum masuk ke dalam perulanganlebih besar dari 10 (misalnya 11).

2.3.3 do...while

Pada perulangan for dan while, test apakah perulangan akan dilaksakan atau diteruskanterletak pada awal perulangan. Oleh karena itu, pada for dan while bisa saja tidak terjadi

13

Page 17: bahasa c

BAB 2. CONTROL FLOW

perulangan sama sekali. Apabila diinginkan minimal terjadi satu kali perulangan sebelumditeruskan dengan perulangan selanjutnya, maka test tersebut diletakkan di bagian bawahperulangan.

dostatement;

while (expression);

statement dieksekusi terlebih dahulu sebelum expression dievaluasi untuk menentukanapakah perulangan akan diteruskan atau dihentikan. Bentuk perulangan ini menjaminstatement akan dieksekusi minimal satu kali sebelum berhenti.Contoh:

#include <stdio.h>main (){

int i;i = 1;do {

printf("%d\n", i);i++;

} while (i <= 10);}

Perulangan do...while di atas akan tetap dilaksanakan (minimal satu kali), tidak tergan-tung pada nilai i sebelum perulangannya dimulai.

2.3.4 goto label

Bentuk perulangan yang lain adalah dengan menggunakan statement goto. Statementgoto akan mengubah jalur eksekusi program ke lokasi yang ditunjuk tanpa harus memenuhisuatu kondisi.

goto label;

Penggunaan goto harus bersama-sama dengan label. label menandakan suatu lokasi didalam source code.

Perulangan dengan menggunakan goto sangat tidak dianjurkan, karena akan menyulitk-an pada saat pemeliharaan program, dan juga akan menyulitkan untuk memahami aliraneksekusi program (program �ow). Biasanya penggunaan goto dapat digantikan dengan loopfor, while ataupun do...while.Contoh:

#include <stdio.h>main (){

int i;i = 1;

14

Page 18: bahasa c

BAB 2. CONTROL FLOW

ulang:printf("%d\n", i);if (i < 10) {

i++;goto ulang;

}}

Pada contoh program di atas ulang: merupakan label untuk menandakan awal dari peru-langan. Ketika kondisional if bernilai true, maka nilai variabel i di-increment dan perintahgoto ulang; akan mengubah aliran eksekusi program ke lokasi yang ditunjuk oleh labelulang.

2.3.5 break dan continue

Kadang perulangan perlu dihentikan ditengah-tengah perulangan bukan pada awal atau-pun akhir perulangan tersebut. Untuk menghentikan loop for, while dan do...while sebe-lum mencapai awal atau akhir perulangan, kita dapat menggunakan statement break. breakakan langsung menghentikan iterasi dan keluar dari blok loop dimana break diletakkan.Contoh:

#include <stdio.h>main (){

int i;for (i = 1; i <= 10; i++) {

if (i == 5)break;

printf("%d\n", i);}

}

Contoh program di atas akan menampilkan bilangan dari 1 sampai dengan 4. Pada saatcounter (i) mencapai nilai 5, maka perulangan di atas akan dihentikan dengan menggunakanstatement break.

Penggunaan continue hampir sama dengan break. Apabila break menghentikan loop,continue digunakan untuk melewatkan seluruh statement di bawahnya dan kembali ke awalperulangan.Contoh:

#include <stdio.h>main (){

int i;for (i = 1; i <= 10; i++) {

if (i == 5)continue;

15

Page 19: bahasa c

BAB 2. CONTROL FLOW

printf("%d\n", i);}

}

Contoh di atas akan menampilkan bilangan 1 sampai dengan 4 kemudian 6 sampai dengan10. Pada saat counter (i) bernilai 5, continue menyebabkan perintah selanjutnya tidakdilaksanakan, dan kembali ke awal loop, sehingga pada saat i=5 nilai i tidak ditampilkan.

16

Page 20: bahasa c

Bab 3

Array

Array adalah suatu kumpulan variabel dengan tipe data yang sama. Masing-masingelemen di dalam array diakses dengan menggunakan nomor indexnya. Di dalam C indexselalu dimulai dari nol (0) dan ditulis dalam kurung siku (�[� dan �]�).Berikut adalah syntax untuk mendeklarasikan array satu dimensi:

tipe_data variabel_array[jumlah_elemen];

Contoh:

#include <stdio.h>main (){

int n[10];long int total;int i;/* input list n */for (i = 0; i < 10; i++) {

printf("n[%d] : "); scanf("%d", &n[i]);fflush(stdin);

}/* hitung total */total = 0;for (i = 0; i < 10; i++)

total += n[i];/* tampilkan total */printf("Total: %ld\n", total);

}

Array dapat berdimensi lebih dari satu, cara pendeklarasiannya adalah:

tipe_data variabel_array[elemen1][elemen2][elemen3];

Misalkan untuk mendeklarasikan array integer dua dimensi dengan jumlah baris lima (5)dan jumlah kolom tiga (3):

17

Page 21: bahasa c

BAB 3. ARRAY

int n[5][3];

Contoh:

#include <stdio.h>#define GP 0#define UL 1#define A 0#define B 1#define C 2main (){

long tabel_gaji[3][2] = {{2000000, 20000},{1000000, 10000},{ 800000, 8000}};

char gol;int jk;long gt, gp, ul;printf("Gol: ");gol = getchar();printf("Jam Kerja: "); scanf("%d", &jk);switch (gol) {

case 'A':gp = tabel_gaji[A][GP];ul = tabel_gaji[A][UL];break;

case 'B':gp = tabel_gaji[B][GP];ul = tabel_gaji[B][UL];break;

case 'C':gp = tabel_gaji[C][GP];ul = tabel_gaji[C][UL];break;

}gt = gp;if (jk > 160)

gt += (jk - 160) * ul;printf("Gaji Total: %ld\n", gt);return 0;

}

Array bersifat statis artinya apabila suatu array telah dideklarasikan dengan jumlah elementertentu, maka jumlah elemen array tersebut tidak dapat ditambah atau dikurang selamaeksekusi program.

Suatu array di dalam ekspresi apabila tidak dituliskan nomor index dari array tersebut,maka yang dimaksud adalah alamat memori dari elemen pertama array tersebut.

18

Page 22: bahasa c

BAB 3. ARRAY

array == &array[0];

StringDi dalam C, string adalah array dari char atau pointer ke char. Setiap string diakhiri

dengan sebuah karakter khusus NULL (�\0�).

B a h a s a C \0

Masing-masing elemen di dalam array atau pointer menampung satu karakter. Sebuahkonstanta char diapit dengan tanda kutip tunggal �� ', sedangkan konstanta string diapitdengan tanda kutip ganda �"�.String dideklarasikan sebagai array dari char:

char var[jumlah_karakter];char var[] = "konstanta string";

String dideklarasikan sebagai pointer ke char:

char *var;char *var = "konstanta string";

String yang dideklarasikan sebagai array bersifat statis, dan string yang dideklarasikansebagai pointer bersifat dinamis. String yang dideklarasikan sebagai pointer harus memesanruang memori yang akan digunakan. Pemesanan ruang memori dapat dilakukan denganmenggunakan fungsi malloc, dan harus dibebaskan apabila sudah tidak dipakai denganmenggunakan fungsi free. Fungsi-fungsi ini dideklarasikan pada header �le �stdlib.h�.

Operasi yang dilakukan pada string harus menggunakan fungsi khusus. Fungsi-fungsiyang dapat digunakan untuk manipulasi string dideklarasikan di dalam header �le �string.h�.Berikut beberapa fungsi string yang sering digunakan:

1. char *strcat(char *dest, const char *src);

Menyambung dua string. Fungsi ini menambahkan string src (string sumber) keakhir string dest (string tujuan). String dest harus memiliki cukup ruang untukmenampung string hasil. Fungsi ini mengembalikan pointer ke string dest.

2. int strcmp(const char *s1, const char *s2);

Membandingkan dua string. Fungsi ini membandingkan string s1 dan s2. Hasil yangdikembalikan adalah integer lebih kecil, sama dengan, atau lebih besar dari nol apabilas1 lebih kecil, sama dengan, lebih besar dari s2.

3. char *strcpy(char *dest, const char *src);

Menyalin string. Fungsi ini menyalin string src ke string dest. String dest harusmemiliki cukup ruang untuk menampung string hasil penyalinan. Fungsi ini mengem-balikan pointer ke string dest.

4. char *strdup(const char *s);

Menduplikat sebuah string. Fungsi ini mengembalikan pointer ke string baru yangmerupakan duplikat dari string s, atau NULL apabila jumlah memori tidak mencukupi.

19

Page 23: bahasa c

BAB 3. ARRAY

5. size_t strlen(const char *s);

Menghitung panjang string s, tidak termasuk terminator karakter �\0�. Fungsi inimengembalikan jumlah karakter di dalam string s.

6. char *strchr(const char *s, char c);

Mencari karakter c di dalam string s. Fungsi ini mengembalikan pointer ke posisikarakter c pertama yang ditemukan di dalam string s. Jika c tidak ditemukan nilaiyang dikembalikan adalah NULL.

7. char *strstr(const char *h, const char *n);

Mencari string n di dalam string h. Fungsi ini mengembalikan pointer ke posisi stringn pertama yang ditemukan di dalam string h. Jika n tidak ditemukan, nilai yangdikembalikan adalah NULL.

Contoh:

#include <stdlib.h>#include <stdio.h>#include <string.h>main (){

char s1[] = "Bahasa ",s2[] = "Pemrograman C",*s3, s4[21] = "", *s5;

strcat (s4, s1);printf("%s\n", s4);strcat (s4, s2);printf("%s\n", s4);s3 = strdup (s4);printf("%s\n", s3);printf("%d\n", strlen(s3));s5 = (char *) malloc(sizeof(char) * strlen(s3));if (s5 != NULL)

strcpy (s5, s3);printf("%s\n", s5);printf("%d\n", strcmp(s1, s2));printf("%d\n", strcmp(s2, s1));printf("%d\n", strcmp(s3, s4));printf("%s\n", strchr(s3, 'o'));printf("%s\n", strstr(s3, "gra"));return 0;

}

20

Page 24: bahasa c

Bab 4

Structure

Stucture merupakan kumpulan variabel-variabel ke dalam suatu identi�er. Variabel iniyang terdapat di dalam suatu structure bisa memiliki tipe data yang berbeda-beda. Biasanyadigunakan untuk mengelompokkan informasi yang berkaitan.

struct [struct_template] {tipe var1;tipe var2;...

} [var_struct];

struct_template merupakan identi�er pola structure yang akan digunakan untuk mende-klarasi variabel structure. Untuk mengakses anggota dari suatu structure digunakan opera-tor ".".Contoh:

#include <stdio.h>struct mhs_t {

char nim[10];char nama[20];char gender;

};main (){

struct mhs_t mhs;printf("NIM: "); scanf("%s", mhs.nim);printf("Nama: "); fgets(mhs.nama, 20, stdin);printf("Jenis Kelamin (P/W): "); scanf("%c", &mhs.gender);return 0;

}

Statement struct mhs_t mhs pada contoh di atas merupakan deklarasi variabel structure.Untuk menyingkat penulisan deklarasi variabel structure, dapat dide�nisikan suatu tipe databuatan (user de�ned data type) dengan menggunakan statement typedef.

21

Page 25: bahasa c

BAB 4. STRUCTURE

typedef tipe_data/structure tipe_data_buatan;

Contoh:

#include <stdio.h>struct mhs_t {

char nim[10];char nama[20];char gender;

};typedef mhs_t mhs_rec;main (){

mhs_rec mhs;printf("NIM: "); scanf("%s", mhs.nim);printf("Nama: "); fgets(mhs.nama, 20, stdin);printf("Jenis Kelamin (P/W): "); scanf("%c", &mhs.gender);return 0;

}

22

Page 26: bahasa c

Bab 5

Fungsi

Pada seluruh pemrograman terdapat apa yang disebut dengan subrutin. Subrutin me-rupakan suatu program yang dapat digunakan pada program yang lainnya. Pada beberapabahasa dibedakan antara subrutin yang mengembalikan nilai dan subrutin yang tidak meng-embalikan nilai. Pada bahasa tersebut subrutin yang mengembalikan nilai disebut denganfunction (fungsi) dan subrutin yang tidak mengembalikan nilai disebut dengan procedure(prosedur). Pada C, kedua subprogram ini adalah sama dan disebut dengan function.

Biasanya subprogram digunakan untuk memecahkan suatu program yang besar (baikukuran maupun kompleksitasnya) menjadi program-program kecil yang relatif lebih mudahuntuk ditangani. Keuntungan lain dari subprogram adalah reuseability yaitu subprogramyang memiliki fungsi umum dapat digunakan pada program yang lain tanpa harus dibuatulang lagi.

Berikut contoh fungsi untuk menghitung hasil operasi pangkat.

double power(double n, unsigned pow){

double hasil = 1.0;unsigned int i;for (i = 0; i < pow; i++)

hasil *= n;return hasil;

}

Berikut penjelasan mengenai fungsi di atas.

double power (double n, unsigned pow) merupakan definisi dari fungsi. Disinidituliskan tipe data, nama fungsi dan daftar argumen yang dibutuhkan olehfungsi. Argumen dituliskan dapat kurung beserta dengan tipe datanya dandipisahkan dengan �,�.Isi fungsi diletakkan di dalam kurung kurawal. Seluruh variabel dan konstanta yangdideklarasikan di dalam fungsi bersifat lokal terhadap fungsi tersebut.

return hasil statement ini merupakan akhir dari suatu fungsi dan eksekusi dikembalikanke program pemanggil. hasil merupakan variabel yang dikembalikan oleh fungsi inike program pemanggil.

23

Page 27: bahasa c

BAB 5. FUNGSI

Fungsi ini dapat dipanggil oleh fungsi yang lain, misalkan dengan statement berikut ini.

pangkat = power(2, 10);

Berikut contoh fungsi yang tidak mengembalikan nilai.

void hello(char *s){

printf("Hello %s!\n", s);printf("It's nice to meet you!");

}

Fungsi diatas dide�nisikan dengan tipe data void. Tipe data ini adalah tipe data khususuntuk mende�nisikan data tidak bertipe. Pada fungsi di atas tidak digunakan statementreturn untuk mengembalikan nilai dan menghentikan fungsi. Walaupun statement returndimasukkan pada fungsi yang tidak mengembalikan nilai, maka statement return tersebuthanya berfungsi untuk keluar dari fungsi dan kembali ke program pemanggil. Statementreturn pada fungsi ini tidak boleh diikuti dengan suatu ekspresi.

Pemanggilan fungsi ini pada program yang lain adalah:

hello("Budi");

Jika suatu fungsi dide�nisikan tanpa menuliskan tipe datanya, maka fungsi tersebut dianggapmengembalikan tipe data int. Deklarasi fungsi sebelum penulisan fungsi sebenarnya disebutdengan prototype fungsi. Tujuannya adalah untuk mengenalkan fungsi tersebut kepadaprogram.

5.1 Pengiriman argumenKomunikasi antara fungsi dilakukan dengan mengirimkan data-data yang dibutuhkan

oleh fungsi tersebut. Data-data yang dikirimkan atau dilewatkan ke dalam suatu fungsidisebut dengan argumen. Ada dua cara pengiriman argumen yaitu pass by value (pengirimannilai) dan pass by reference (pengiriman pointer/alamat memori).

Pass by valueYang dimaksud dengan pass by value adalah yang dilewatkan ke dalam fungsi adalah

nilainya saja. Nilai dari parameter (argumen) aktual (yang dilewatkan ke fungsi) akandisalin ke parameter formal (yang digunakan di dalam fungsi). Oleh karena itu, parameteraktual dan parameter formal merupakan dua variabel yang berbeda, sehingga apabila terjadiperubahan nilai parameter formal, perubahan tersebut tidak mempengaruhi nilai parameteraktual.

Pass by referencePass by reference adalah melewatkan alamat memori dari parameter aktual ke parame-

ter formal. Dengan demikian, parameter aktual dan formal merupakan variabel yang sama,

24

Page 28: bahasa c

BAB 5. FUNGSI

atau bisa dikatakan parameter formal merupakan alias dari parameter aktual. Hal ini me-nyebabkan setiap perubahan nilai pada parameter formal akan merubah nilai dari parameteraktual. Pada C, pass by reference dilakukan dengan mende�nisikan argumen sebagai tipedata pointer.Contoh:

#include <stdio.h>void tukar (int *a, int *b){

int t;t = *a;*a = *b;*b = t;

}main (){

int a, b;a = 10;b = 34;printf("a: %d", a);printf("b: %d", b);tukar(a, b);printf("a: %d", a);printf("b: %d", b);return 0;

}

5.2 Fungsi RekursiFungsi rekursi adalah fungsi yang memanggil dirinya sendiri baik secara langsung ma-

upun tidak langsung. Fungsi rekursi digunakan untuk menyelesaikan masalah yang dapatdide�nisikan secara rekursi, yaitu masalah yang dapat dide�nisikan dengan masalah seje-nis yang bentuknya lebih sederhana. Setiap fungsi rekursi harus memiliki kondisi dimanarekursi tersebut berhenti dan solusi permasalahan ditemukan.Berikut contoh fungsi rekursi untuk menghitung sigma dan faktorial.Sigma dapat dide�nisikan secara rekusi:

n∑

i=1

i =n−1∑

i=1

i + n

Dan faktorial juga dapat dide�nisikan secara rekursi:

n! = n− 1!× n

25

Page 29: bahasa c

BAB 5. FUNGSI

Program C untuk menghitung sigma secara rekursi:

#include <stdio.h>int sigma(int n){

if (n > 1)return sigma(n-1) + n;

elsereturn 1;

}main (){

int sum;sum = sigma(5);printf("Sigma(1,5) = %d\n", sum);return 0;

}

Program C untuk menghitung faktorial secara rekursi:

#include <stdio.h>int faktorial(int n){

if (n > 1)return faktorial(n-1) * n;

elsereturn 1;

}main (){

int f;f = faktorial(5);printf("Faktorial(5) = %d\n", f);return 0;

}

Pada kedua contoh di atas, rekursi dihentikan apabila argumen yang dikirim adalah 1. Jikaargumen yang dilewatkan bernilai lebih besar dari 1 maka akan dilakukan rekursi denganargumen yang nilainya lebih kecil.

26

Page 30: bahasa c

Bab 6

Pointer

Memori komputer terdiri dari lokasi penyimpanan yang saling berdampingan. KetikaAnda mendeklarasikan suatu variabel, maka komputer akan memesan lokasi memori tertentuyang kemudian diasosiasikan dengan nama variabel yang dideklarasikan. Jadi ketika Andamenggunakan variabel sebenarnya yang diakses adalah alamat memori komputer.

Alamat memori dapat disimpan ke dalam suatu variabel khusus yang disebut pointer.Variabel pointer adalah variabel yang menampung alamat memori. Pointer yang me-nyimpan alamat memori variabel lain merupakan alias dari variabel tersebut.

Langkah pertama yang harus dilakukan untuk menggunakan pointer adalah mendekla-rasikan variabel pointer.

tipe_data *var_pointer;

Operator �*� pada syntax diatas menunjukkan bahwa var_pointer merupakan variabelpointer. Selanjutnya adalah menyimpan alamat memori variabel ke dalam variabel pointer.Operator �&� pada syntax dibawah merupakan operator address of untuk mengambil alamatmemori dari var.

var_pointer = &var;

Contoh:

#include <stdio.h>int main(){

int a; /* deklarasi variabel integer */int *ptr; /* deklarasi pointer ke integer */a = 1;/* pointer ptr menunjuk ke alamat memori a */ptr = &a;/* tampilkan nilai a dan nilai yang ditunjukkan pointer ptr */printf("a: %d\n", a);printf("ptr: %d\n", *ptr);/* tampilkan alamat a dan alamat yang ditunjuk pointer ptr */printf("alamat a: %lu\n", (unsigned long)&a);

27

Page 31: bahasa c

BAB 6. POINTER

printf("alamat yang ditunjuk ptr: %lu\n", (unsigned long)ptr):return 0;

}

Linked ListLinked list adalah merupakan suatu data storage. Data storage yang diimplementasikan

menggunakan linked list bersifat dinamis. Implementasi linked list terdiri dari single linkedlist dan double linked list. Pada dasarnya linked list adalah merupakan suatu struktur yangdikaitkan dengan struktur lainnya. Gambar 6.1 menampilkan bentuk single linked list.

26 301710 NULL

Gambar 6.1: Single-Linked-List

Pada Gambar 6.1 dapat dilihat bahwa setiap simpul (setiap kotak pada gambar meru-pakan simpul/node dari linked list) terdiri dari dua bagian. Bagian yang pertama digunakanuntuk menyimpan data, dan bagian yang kedua digunakan untuk mengkaitkan simpul ter-sebut dengan simpul berikutnya di dalam linked list. Akhir dari linked list ditunjukkan olehnilai NULL. Double-linked list juga memiliki tampilan yang mirip, dengan tambahan di depanmasing-masing simpul, terdapat satu bagian lagi untuk mengkaitkan simpul dengan simpulsebelumnya.

Pada C, simpul di dalam linked list merupakan struct yang menyimpan data dan pointerke struct berikutnya dengan tipe struct yang sama. Struktur data untuk linked-list padaGambar 6.1 dide�nisikan sebagai berikut:

struct node_t {int n;struct node_t *next;

};

Struktur diatas terdiri dari dua anggota, yaitu n dan next. n digunakan untuk menyimpannilai atau data untuk setiap simpul dalam linked list dan next merupakan pointer ke simpulberikutnya di dalam linked list.

Untuk menentukan letak awal linked list, kita akan menggunakan pointer yang menunjukke awal linked list. Pointer ini kita namakan dengan head. head selalu menunjuk ke awallinked list. Pada saat pertama kali linked list dibentuk, linked list belum memiliki simpuldi dalamnya, pointer head menunjuk ke nilai NULL. Gambar menampilkan single linked listpada keadaan kosong.

NULL

HEAD

Gambar 6.2: single linked list pada keadaan kosong

Kode program dalam bahasa C untuk mende�nisikan linked list yang masih kosong:

28

Page 32: bahasa c

BAB 6. POINTER

struct node_t *head;head = NULL;

Operasi penambahan simpul ke dalam linked list dapat dilakukan melalui tiga cara, yaitupenambahan di depan, tengah dan belakang linked list. Berikut ini kita bahas langkah-langkah penambahan simpul ke dalam linked list menggunakan ketiga cara tersebut.

1. Penambahan depan

Penambahan ke depan linked list dilakukan dengan menghubungkan simpul yang barudengan head dari linked list.

(a) Buat simpul baru (kita beri nama new) dan isi dengan nilai,

(b) pointer next dari simpul yang baru (kita beri nama new) diisikan dengan pointerhead dari linked list,

(c) dan kemudian pointer head menunjuk ke posisi awal yang baru dari linked listyaitu new.

NULL

HEAD

10

NEW

(a)

NULL

HEAD

10

NEW

(b)

NULL10

NEWHEAD (c)

Gambar 6.3: Tambah depan

Kode proram dalam bahasa C:

/* membuat simpul baru */struct node_t *new;new = (struct node_t *) malloc(sizeof(struct node_t));new->n = 10;/* sambung simpul baru ke dalam linked list */new->next = head;/* tentukan simpul head yang baru */head = new;

2. Penambahan belakang

Penambahan ke belakang linked list dilakukan dengan menghubungkan akhir linkedlist (simpul yang menunjuk ke NULL) dengan simpul baru.

(a) Buat simpul baru (new) dan isi dengan nilai,

(b) cari simpul terakhir pada linked list, kita menggunakan pointer pembantu (kitanamakan cur) untuk menelusuri simpul di dalam linked list untuk mencari simpulyang terakhir,

(c) hubungkan simpul terakhir (cur) dengan simpul baru (new),

(d) dan hubungkan pointer next pada simpul new dengan NULL untuk menandakanakhir linked list yang baru.

29

Page 33: bahasa c

BAB 6. POINTER

Kode program dalam bahasa C:

/* deklarasi simpul cur untuk menelusuri linked list */struct node_t *cur;/* cari lokasi simpul terakhir */cur = head;while (cur->next)

cur = cur->next;/* hubungkan simpul terakhir dengan simpul baru */cur->next = new;/* hubungkan simpul baru dengan NULL */new->next = NULL;

3. Penambahan tengah

Penambahan ke tengah linked list merupakan operasi yang paling sering dilakukanpada linked list. Hal yang perlu dilakukan akan mencari lokasi dimana simpul yangbaru akan disisipkan ke dalam linked list. Langkah untuk mencari lokasi penyisipantergantung pada kebutuhan. Misalkan contoh berikut akan menyisipkan simpul baruke linked list sedemikian rupa sehingga linked list terurut secara ascending.

(a) Buat simpul baru (new) dan isi dengan nilai,

(b) cari lokasi penyisipan di dalam linked list,

(c) hubungkan simpul baru dengan simpul berikutnya pada lokasi penyisipan,

(d) hubungkan simpul pada lokasi penyisipan dengan simpul baru.

Kode program dalam bahasa C:

/* cari lokasi penyisipan */cur = head;while (cur->n <= new->n && cur->next->n <= new-> && cur->next)

cur = cur->next;/* hubungkan simpul baru dengan simpul berikutnyapada lokasi penyisipan */new->next = cur->next;/* hubungkan simpul pada lokasi penyisipan dengan simpul baru */cur->next = new;

30

Page 34: bahasa c

Bab 7

File

Untuk melakukan operasi terhadap �le pada C, kita harus memasukkan �le header�stdio.h�. Langkah-langkah yang dilakukan untuk melakukan operasi terhadap �le adalahsebagai berikut:

1. Buka �le

2. Lakukan operasi terhadap �le (baca atau tulis)

3. Tutup �le

7.1 Membuka dan menutup �leMembuka �le dilakukan dengan menggunakan fungsi fopen(). Prototype fungsi fopen()

adalah sebagai berikut:

FILE *fopen(const char *filename, const char *mode );

Fungsi ini mengembalikan pointer ke FILE. Apabila fungsi ini tidak berhasil membuka �le,maka nilai yang dikembalikan adalah NULL. Parameter pertama adalah string yang menya-takan nama �le yang akan dibuka. Parameter kedua merupakan string yang menyatakanmodus pembukaan �le.

Tabel 7.1: Nilai mode untuk fungsi fopen()Mode Keteranganr Membuka �le untuk dibaca. Jika �le tidak ada, fopen() mengembalikan nilai NULLw Membuka �le untuk ditulis. Jika �le belum ada, akan dibuat �le baru.

Jika �le telah ada, isinya akan ditimpa dengan �le yang baru.a Membuka �le untuk menambah isi. Jika �le belum ada, akan dibuat �le baru.

Jika �le telah ada, data baru akan ditambahkan ke akhir �le.+ Digunakan bersama dengan r, w, a. File akan dibuka untuk modus pembacaan

dan penulisan.t Tipe �le yang dibuka adalah �le text.b Tipe �le yang dibuka adalah �le binary.

File yang dibuka harus ditutup apabila telah selesai digunakan. Fungsi fclose() digu-nakan untuk menutup �le yang sedang terbuka.

31

Page 35: bahasa c

BAB 7. FILE

int fclose(FILE *fp);

Fungsi fclose() mengembalikan nilai 0 jika �le berhasil ditutup dan -1 jika �le tidakberhasil ditutup.

7.2 Menulis dan membaca data �le

File TextPenulisan ke �le text dilakukan dengan menggunakan fungsi fprintf().

int fprintf(FILE *fp, char *fmt, );

Parameter pertama merupakan pointer ke FILE yang merupakan �le yang akan ditulisi.Penggunaan fungsi fprintf() ini sama dengan fungsi printf().

Pembacaan dari �le text dilakukan menggunakan fungsi fscanf().

int fscanf(FILE *fp, char *fmt, );

Contoh:

#include <stdio.h>main(){

FILE *f;char nama[20];int nilai;f = fopen("mhs.txt", "wt");if (f == NULL) {

printf("File tidak dapat dibuka\n");return 1;

}printf("Nama : "); scanf("%s", nama);printf("Nilai: "): scanf("%d", &nilai);fprintf(f, "%s\n%d\n", nama, nilai);fclose(f);return 0;

}

Contoh diatas menunjukkan cara penulisan ke dalam �le text. Berikut ini contoh untukmembaca dari �le text.

Contoh:

#include <stdio.h>main(){

FILE *f;char nama[20];

32

Page 36: bahasa c

BAB 7. FILE

int nilai;f = fopen("mhs.txt", "rt");if (f == NULL) {

printf("File tidak dapat dibuka\n");return 1;

}fprintf(f, "%s\n%d\n", nama, nilai);printf("Nama : %s\n", nama);printf("Nilai: %d\n", &nilai);fclose(f);return 0;

}

File BinerPenulisan ke dalam �le biner dilakukan dengan menggunakan fungsi fwrite() dan untuk

membaca data dari �le biner dilakukan dengan menggunakan fungsi fread(). Prototypefungsi fwrite() adalah sebagai berikut:

int fwrite(void *buf, int size, int count, FILE *fp );

buf merupakan pointer ke memori yang menyimpan data yang akan ditulis ke �le.

size merupakan ukuran memori dalam satuan byte untuk setiap item data yang akanditulis ke �le. Ukuran size dapat dihitung menggunakan operator sizeof().

count merupakan jumlah item yang akan ditulis ke �le.

fp merupakan pointer ke FILE yang akan menampung data.

Prototype fungsi fread() adalah sebagai berikut:

int fread(void *buf, int size, int count, FILE *fp );

buf merupakan pointer ke memori yang akan menampung data yang dibaca dari �le.

size merupakan ukuran memori dalam satuan byte untuk setiap item data yang akandibaca dari �le. Ukuran size dapat dihitung menggunakan operator sizeof().

count merupakan jumlah item yang akan dibaca dari �le.

fp merupakan pointer ke FILE yang menampung data yang akan dibaca.

Contoh:

#include <stdio.h>struct mhs_t {

char nama[20];int nilai;

};main()

33

Page 37: bahasa c

BAB 7. FILE

{FILE *f;struct mhs_t mhs;f = fopen("mhs.dat", "wb");if (f == NULL) {

printf("File tidak dapat dibuka\n");return 1;

}printf("Nama : "); scanf("%s", mhs.nama);printf("Nilai: "): scanf("%d", &mhs.nilai);fwrite(&mhs, sizeof(struct mhs_t), 1, f);fclose(f);return 0;

}

Contoh diatas menunjukkan cara penulisan ke dalam �le biner. Berikut ini contoh untukmembaca dari �le biner.

Contoh:

#include <stdio.h>struct mhs_t {

char nama[20];int nilai;

};main(){

FILE *f;struct mhs_t mhs;f = fopen("mhs.dat", "rb");if (f == NULL) {

printf("File tidak dapat dibuka\n");return 1;

}fread(&mhs, sizeof(struct mhs_t), 1, f);printf("Nama : %s\n", mhs.nama);printf("Nilai: %d\n", &mhs.nilai);fclose(f);return 0;

}

Fungsi-fungsi lainnya yang digunakan untuk operasi �le adalah sebagai berikut:

1. long ftell(FILE *fp );

Menentukan posisi di dalam �le. Fungsi ini mengembalikan posisi sekarang dari awal�le dalam satuan byte. Jika terjadi error, fungsi ini mengembalikan nilai -1L.

2. void rewind(FILE *fp );

34

Page 38: bahasa c

BAB 7. FILE

Kembali ke awal �le.

3. int fseek(FILE *fp , long offset , int origin );

Memindahkan posisi di dalam �le. offset merupakan jumlah byte perpindahan.origin merupakan posisi relatif perpindahan, konstanta yang dapat digunakan padaparameter ini dapat dilihat pada Tabel 7.2.

Tabel 7.2: nilai origin untuk fungsi fseek()Konstanta Nilai KeteranganSEEK_SET 0 Berpindah dari posisi awal �leSEEK_CUR 1 Berpindah dari posisi sekarang di dalam �leSEEK_END 2 Berpindah dari posisi akhir �le

4. int feof(FILE *fp );

Menentukan akhir �le. Fungsi ini mengembalikan nilai 0 apabila belum mencapai akhir�le dan 1 jika telah mencapai akhir �le.

35

Page 39: bahasa c

Bab 8

Gra�k

Ada dua lingkungan dimana program berjalan berdasarkan tampilannya. Yang pertamaprogram berjalan pada modus tampilan teks dan yang kedua adalah program berjalan padatampilan gra�k. Pada Borland Turbo C, fungsi dan struktur data untuk melakukan operasipada lingkungan gra�k dide�nisikan pada �le header �graphics.h�.

Fungsi untuk melakukan inisialisasi modus gra�k adalah initgraph(). Berikut ini pro-totype fungsi initgraph():

initgraph(int *driver, int *mode, const char *path);

driver pointer ke int yang menyimpan kode driver gra�k yang akan digunakan.

mode pointer ke int yang menyimpan kode modus gra�k yang akan digunakan.

path string ke �le driver gra�k yang akan digunakan.

Kode driver dan mode gra�k yang dapat digunakan dapat dilihat pada Tabel.

Tabel 8.1: Kode driver dan mode gra�kdriver modeCGA CGAC0

CGAC1CGAC2CGAC3CGAHI

EGA EGALOEGAHIEGALO

VGA VGALOVGAMEDVGAHI

Kode driver dapat diisikan dengan konstanta DETECT untuk mendeteksi driver yang akandigunakan secara otomatis.

Untuk menutup modus gra�k dan kembali ke modus teks, digunakan fungsi closegraph().Berikut prototype-nya:

closegraph();

36

Page 40: bahasa c

BAB 8. GRAFIK

Beberapa fungsi yang terdapat pada graphics.h:

1. setcolor(int warna);

Mengubah warna foreground.

2. setbkground(int warna);

Mengubah warna background.

3. line(int x1, int y1, int x2, int y2);

Menggambar garis dari koordinat x1, y1 sampai koordinat x2, y2.

4. linerel(int x, int y);

Menggambar garis secara relatif dari posisi kursor sekarang.

5. lineto(int x, int y);

Menggambar garis dari posisi kursor sekarang ke koordinat x, y.

6. rectangle(int x1, int y1, int x1, int y2);

Menggambar kotak dengan sudut kiri atasnya berada pada koordinat x1, y1 dan koo-rdinat sudut kanan bawahnya pada koordinat x2, y2.

7. circle(int x, int y, int r);

Menggambar lingkaran dengan titik pusat lingkaran pada koordinat x, y dan jari-jarinya sepanjang r.

8. bar(int x1, int y1, int x2, int y2);

Menggambar gra�k batang.

9. bar3d(int x1, int y1, int x2, int y2, int tbl_samping, int tbl_atas);

Menggambar gra�k batang 3 dimensi. tbl_samping dan tbl_atas merupakan nilaiuntuk efek 3 dimensi pada samping dan atas gra�k batang.

10. pieslice(int x, int y, int sudut_awal, int sudut_akhir, int r);

Menggambar gra�k pie. sudut_awal dan sudut_akhir merupakan nilai sudut permu-laan dan akhir lingkaran

11. outtextxy(int x, int y, const char *s);

Menampilkan text pada modus gra�k.

12. settextstyle(int font, int direction, int size);

Menggubah setting tulisan yang akan ditampilkan.

Contoh:

#include <graphics.h>#include <stdio.h>main (){

37

Page 41: bahasa c

BAB 8. GRAFIK

int driver, mode;int x, y;driver = DETECT;initgraph(&driver, &mode, "");if (graphresult() != 0) {

printf("Grafik tidak dapat diinisialisasi\n");return 1;

}x = getmaxx();y = getmaxy();outtextxy(0, y/2, "Modus grafik");getchar();line(0,0,x,y);circle(x/2, y/2, y/3);fflush(stdin);getchar();closegraph();return 0;

}

38

Page 42: bahasa c

Bab 9

Object Oriented Programming

Object Oriented Programming merupakan suatu paradigma bahasa pemrograman. Ideyang melatar belakangi object oriented programming adalah program komputer terdiri darisekumpulan unit, atau objek, yang berinteraksi antara satu dan lainnya. Setiap objek me-miliki kemampuan untuk menerima pesan, memproses data dan mengirim pesan ke objeklainnya.Konsep yang mendasari object oriented programming adalah sebagai berikut:

Class de�nisi data dan fungsi dari suatu hal (benda, konsep, dll).

Object instan (perwujudan) dari class. Dalam bahasa C++, konsep class dan object miripdengan structure.

Encapsulation penggabungan antara data dan fungsi ke dalam suatu class. Encapsulation�membungkus� objek, sehingga setiap perubahan terhadap suatu objek harus meng-gunakan metode yang terdapat pada objek tersebut.

Inheritance mekanisme untuk membuat subclass. Inheritance mewariskan atau menurunk-an data ataupun fungsi dari suatu class ke subclass.

Abstraction kemampuan untuk mengabaikan detail dari suatu objek, untuk mengaksesatau memanipulasi suatu objek, digunakan fungsi interface dari objek tersebut.

Polymorphism kemampuan untuk menggunakan fungsi interface yang berbeda sesuai de-ngan operasi yang dilakukan.

C++ merupakan bahasa yang dikembangkan dari bahasa C dengan menambahkan kemam-puan object oriented programming. Seluruh kata kunci, aturan penulis, tipe data pada Cberlaku juga pada C++.Contoh:

#include <iostream.h>class persegi {

private:int p, l;public:persegi();

39

Page 43: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

persegi(int, int);int panjang();void panjang(int);int lebar();void lebar(int);int luas();int keliling();~persegi();

};persegi::persegi(){

p= 0;l= 0;

}persegi::persegi(int p, int l){

persegi::p= p;persegi::l= l;

}int persegi::panjang(){

return p;}void persegi::panjang(int p){

persegi::p = p;}int persegi::lebar(){

return l;}void persegi::lebar(int l){

persegi::l = l;}int persegi::luas(){

return p* l;}int persegi::keliling(){

return 2 * (p+ l);}persegi::~persegi(){

40

Page 44: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

p= 0;l= 0;

}main (){

class persegi a(10,2);cout < < "Panjang : " < < a.panjang() < < endl;cout < < "Lebar : " < < a.lebar() < < endl;cout < < "Luas : " < < a.luas() < < endl;cout < < "Keliling: " < < a.keliling() < < endl;cout < < "Panjang dan lebar diubah menjadi 5 dan 4" < < endl;a.panjang(5); a.lebar(4);cout < < "Panjang : " < < a.panjang() < < endl;cout < < "Lebar : " < < a.lebar() < < endl;cout < < "Luas : " < < a.luas() < < endl;cout < < "Keliling: " < < a.keliling() < < endl;return 0;

}

9.1 Class dan ObjectClass merupakan de�nisi mengenai suatu hal, bisa berupa benda ataupun berupa konsep.

Pada class kita mende�nisikan karakteristik dan juga aksi mengenai benda atau konsep.Karakteristik mengenai suatu hal disebut dengan atribut dan aksi yang dapat digunakandisebut dengan method. Misalkan pada contoh sebelumnya, class persegi memiliki duaatribut yaitu panjang dan lebar. Class tersebut juga memiliki beberapa method yang dapatdigunakan.

Atribut dan method dari suatu class dapat dide�nisikan sebagai private atau public.Atribut dan method yang dide�nisikan sebagai private hanya dapat diakses oleh class itusendiri. Sedangkan atribut dan method yang dide�nisikan sebagai public dapat digunak-an atau dipanggil dari mana saja. Method yang dide�nisikan sebagai public merupakaninterface dari class yang bersangkutan. Ada satu lagi de�nisi atribut dan method yaituprotected, protected akan kita bahas pada inheritance.

Untuk mengakses anggota dari suatu class (atribut maupunmethod), digunakan operator�::�. Dan untuk mengakses atribut ataupun method dari suatu objek digunakan operator�.�.

Constructor dan DestructorPada setiap class terdapat duamethod khusus yang harus dide�nisikan, yaitu constructor

dan destructor. Constructor merupakan method yang dipanggil pada saat suatu objek darisuatu class dideklarasikan. Destructor dipanggil pada saat objek tersebut tidak digunakanlagi.

Fungsi constructor biasanya adalah melakukan inisialisasi terhadap class yang bersang-kutan, misalnya memberikan nilai awal pada setiap atribut dan memanggil method untuk

41

Page 45: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

mempersiapkan objek sehingga dapat digunakan. Fungsi destructor biasanya digunakan un-tuk melakukan proses �pembersihan� dari objek yang tidak digunakan lagi, misalnya mem-bebaskan memori yang dipesan pada saat objek tersebut digunakan.

Pada contoh sebelumnya mengenai class dan objek, class persegi memiliki dua buahconstructor yaitu persegi() dan persegi(int, int) dan sebuah destructor yaitu ~persegi().Nama method untuk constructor harus sama dengan nama class dan nama method untukdestructor adalah nama class dengan ditambahkan tanda �~� di depannya.

9.2 Input dan OutputFile header �iostream.h� mende�nisikan fungsi dan objek yang berhubungan dengan

fungsi input dan ouput pada bahasa C++. Pada contoh sebelumnya kita telah melihatobjek output yaitu cout. Pada bagian ini kita akan membahas lebih lanjut mengenai fungsiinput dan output pada C++.

Pada C++ operasi input dan output dilakukan terhadap objek cin (objek input) dancout (objek output). Pada objek cin operator untuk meminta input adalah dengan meng-gunakan operator �> >� dan pada objek cout operator untuk menampilkan output adalahoperator �< <�.

Contoh:

#include <iostream.h>main (){

int a;cout < < "Input nilai integer: " < < endl;cin > > a;cout < < "Nilai yang Anda input adalah " < < a < < endl;

}

Contoh program diatas menampilkan penggunaan objek cin dan cout untuk melakukaninput dan output. endl merupakan konstanta untuk menyatakan end of line atau samadengan karakter �\n� pada bahasa C.

Pengaturan output dilakukan dengan menggunakan fungsi yang terdapat pada �le header�iomanip.h�. Beberapa fungsi yang terdapat pada �le header ini:

• setw(int w);

Mengubah lebar ouput. Fungsi ini memerlukan satu parameter w, lebar ouput.

• setprecision(int p);

Mengubah tingkat presisi bilangan desimal (float, double). Parameter p merupakanjumlah digit yang akan ditampilkan.

Contoh:

#include <iostream.h>#include <iomanip.h>main ()

42

Page 46: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

{cout < < setw(6) < < 10 < < endl;cout < < setprecision(4) < < 2.134 < < endl;return 0;

}

9.3 Operator OverloadingC++ memiliki kemampuan untuk melakukan operator overloading. Tujuan dari operator

overloading adalah untuk mengubah proses dari operator yang telah dikenal (sepertinya +,-, *, /) sehingga sesuai dengan class yang kita gunakan.

Contoh:

#include <iostream.h>class Integer {

private:int x, y;public:Integer();Integer(int, int);void setX(int);void setY(int);int X();int Y();Integer operator + (int);~Integer();

};Integer::Integer(){

x = 0;y = 0;

}Integer::Integer(int x, int y){

Integer::x = x;Integer::y = y;

}void Integer::setX(int x){

Integer::x = x;}void Integer::setY(int y){

Integer::y = y;}

43

Page 47: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

int Integer::X(){

return x;}int Integer::Y(){

return y;}Integer::~Integer(){

x = 0;y = 0;

}Integer Integer::operator + (int n){

int x, y;x = Integer::x + n;y = Integer::y + n;return (Integer(x,y));

}main (){

Integer a, b;a.setX(10); a.setY(15);cout < < a.X() < < " " < < a.Y() < < endl;b = a + 5;cout < < b.X() < < " " < < b.Y() < < endl;return 0;

}

Pada contoh diatas, kita menggunakan operator �+� pada class Integer. Operator overloa-ding �+� digunakan pada ekspresi:

b = a + 5;

b dan a pada ekspresi tersebut merupakan objek dari class Integer dan nilai 5 adalah int.Ekspresi tersebut dapat dijabarkan menjadi:

b = a.operator + (5);

Operator �+� diatas membutuhkan dua operan, operan pertama merupakan class Integerdan operan kedua merupakan int. Operator ini menghasilkan class Integer. Dari ekspresitersebut, dapat dituliskan operator overloading �+� pada class Integer yang menjumlahkanatribut x dan y -nya dengan int.

Integer Integer::operator + (int n){

44

Page 48: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

int x,y;x = Integer::x + x;y = Integer::y + y;return (Integer(x,y));

}

Ekpresi penjumlahan dua buah objek Integer, misalnya seperti c = a + b; dimana cmerupakan objek Integer dapat dijabarkan sebagai berikut:

c = a.operator + (b);

Operator overloading-nya adalah sebagai berikut:

Integer Integer::operator + (Integer a){

int x, y;x = Integer::x + a.x;y = Integer::y + a.x;return (Integer(x, y));

}

Tetapi, ekspresi c = a + b; juga dapat dijabarkan menjadi:

c = operator + (a, b);

Pada ekspresi ini, operator �+� bukanlah merupakan bagian dari class Integer. Operatoroverloading-nya adalah:

Integer operator + (Integer a, Integer b){

int x, y;x = a.X() + b.X();y = a.Y() + b.Y();return (Integer(x,y));

}

9.4 InheritanceInheritance merupakan mekanisme untuk menurunkan atribut ataupun method dari su-

atu class ke class lainnya. Class yang menurunkan atribut atau method tersebut disebutsuperclass dan class yang diturunkan disebut dengan subclass.

Contoh:

class bujur_sangkar : public persegi {public:bujur_sangkar();void sisi(int);int sisi();

45

Page 49: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

int luas();int keliling();~bujur_sangkar();

};

Pada contoh diatas, class bujur_sangkar merupakan turunan dari class persegi. Katakunci public didepan nama superclass menentukan tipe inheritance. Tabel 9.1 menampilkantipe inheritance.

Tabel 9.1: Tipe inheritanceprivate public

private private privateprotected private protectedpublic private public

Kolom pada Tabel 9.1, merupakan tipe inheritance ke subclass, baris merupakan bagiande�nisi atribut atau method pada superclass dan isi tabel menunjukkan hasil turunan padasubclass.

Berikut ini de�nisi method pada class bujur_sangkar. Oleh karena tipe turunannyaadalah private, method panjang(), lebar(), luas() dan keliling() menjadi private.Dan atribut private pada persegi yaitu p dan l, tidak dapat diakses secara langsung olehclass persegi.

bujur_sangkar::bujur_sangkar(){

panjang(0);lebar(0);

}void bujur_sangkar::sisi(int s){

panjang(s);lebar(s);

}int bujur_sangkar::sisi(){

return panjang();}int bujur_sangkar::luas(){

return persegi::luas();}int bujur_sangkar::keliling(){

return persegi::keliling();}bujur_sangkar::~bujur_sangkar(){

46

Page 50: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

panjang(0);lebar(0);

}

Atribut dan method yang dide�nisikan sebagai protected dapat diakses oleh subclass tetapitidak dapat diakses dari luar class.

9.5 PolymorphismPolymorphism memungkinkan menggunakan identi�er yang sama untuk merujuk pada

method yang berbeda sesuai dengan objek yang mengirim pesan (memanggil method).Contoh:

#include <iostream.h>#include <string.h>class person {

char nama[20];public:person();void set(const char *);virtual void print();~person();

};person::person(){

nama[0] = '\0';}void person::set(const char *s){

if (s)strncpy(nama, s, 10);

}void person::print(){

cout < < "Nama: " < < nama < < endl;}person::~person(){

nama[0] = '\0';}class mhs : public person{

char nim[10];public:mhs();void setNIM(const char *);void print();

47

Page 51: bahasa c

BAB 9. OBJECT ORIENTED PROGRAMMING

~mhs();};mhs::mhs(){

nim[0] = '\0';}void mhs::setNIM(const char *s){

strncpy(nim, s, 10);}void mhs::print(){

cout < < "NIM: " < < nim < < endl;person::print();

}mhs::~mhs(){

nim[0] = '\0';}void display(person &obj){

obj.print();}main (){

mhs a;person b;a.setNIM("00111406");a.set ("david");b.set("budi");display(a);display(b);return 0;

}

Method print() pada class person dideklarasikan sebagai fungsi virtual, sehingga padasaat pemanggilan fungsi display() dengan objek dari class yang berbeda akan mengirimpesan ke class yang bersangkutan tidak tergantung pada class yang dideklarasikan sebagaitipe parameter fungsi display().

48