Bahasa C

  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Bahasa C as PDF for free.

More details

  • Words: 8,376
  • Pages: 41
Bahasa Pemrograman C & C++

Daftar Isi Daftar Isi

i

1 Pengenalan C & C++

1

1.1

Sejarah Singkat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.2

Struktur Bahasa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1.3

Variabel dan Konstanta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.4

Statement - Ekspresi - Operator

. . . . . . . . . . . . . . . . . . . . . . . . .

3

1.4.1

Operator aritmatika . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

1.4.2

Operator relasional dan logika

4

1.4.3

Operator increment dan decrement . . . . . . . . . . . . . . . . . . . .

4

1.4.4

Operator bitwise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.4.5

Operator dan ekspresi assignment . . . . . . . . . . . . . . . . . . . .

4

1.4.6

Ekspresi kondisional . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

1.4.7 1.5

. . . . . . . . . . . . . . . . . . . . . .

Precedence dan urutan evaluasi . . . . . . . . . . . . . . . . . . . . . .

5

Input dan Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7

1.5.1 1.5.2

2 Control Flow 2.1 2.2

9

Compound Statement dan blok . . . . . . . . . . . . . . . . . . . . . . . . . .

9

Decision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

2.2.1 2.2.2 2.3

7

Loop 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5

if . . . . . . . . . . switch...case . . . . . . . . . . . . . . . . for . . . . . . . . . while . . . . . . . . do...while . . . . . goto label . . . . . break dan continue

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Array

17

4 Structure

21

i

DAFTAR ISI

DAFTAR ISI

5 Fungsi

23

5.1

Pengiriman argumen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

5.2

Fungsi Rekursi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

6 Pointer

27

7 File

31

7.1

Membuka dan menutup le . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

7.2

Menulis dan membaca data le . . . . . . . . . . . . . . . . . . . . . . . . . . 32

8 Grak

36

ii

Bab 1

Pengenalan C & C++ 1.1

Sejarah Singkat

Bahasa pemrograman C diciptakan oleh Dennis Ritchie dan Brian Kernighan pada tahun 1970-an. C merupakan pengembangan dari bahasa B, yang dikembangkan dari BCPL (Basic Common Programming Language). Kemudian C dikembangkan lagi dengan menambahkan konsep object oriented programming oleh Dr. Bjarne Stroustoup pada tahun 1985, 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 (pernyataan) yang menentukan operasi yang akan dilaksanakan, dan variabel berfungsi untuk menyimpan nilai-nilai yang digunakan pada saat komputasi. Fungsi pada C sama dengan fungsi atau prosedur pada Pascal. Anda diberi kebebasan untuk memberikan nama fungsi dalam C. Tetapi ada satu nama fungsi khusus yaitu  main  program C dimulai dari fungsi  main ini, dengan kata lain setiap program C harus memiliki fungsi  main. Penamaan fungsi atau variabel (disebut juga dengan identier ) harus memenuhi beberapa aturan, yaitu sebagai berikut: 1. Nama fungsi maupun variabel bersifat case sensitive. 2. Nama fungsi dan variabel harus unik.

1

BAB 1. PENGENALAN C & C++ 3. Nama fungsi dan variabel tidak boleh dimulai dengan angka dan tidak boleh mengandung 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 pada layar monitor:

Hello World! Setiap karakter yang diawali dengan tanda \ merupakan escape code /character. Pada contoh 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 suatu

preprocessor directive, merupakan perintah yang dilaksanakan oleh preprocessor C. Pada contoh ini,  #include <stdio.h> memerintahkan preprocessor untuk memasukkan header le stdio.h yang berisikan informasi fungsi pustaka untuk fungsi input dan output. Dan teks yang terdapat di dalam tanda  /* dan  */ merupakan komentar, berfungsi sebagai penjelasan untuk kode program, tidak diproses oleh compiler.

1.3

Variabel dan Konstanta

Variabel dan konstanta digunakan untuk menyimpan nilai yang digunakan pada proses komputasi. Pada C setiap variabel ataupun konstanta yang digunakan harus dideklarasikan terlebih 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 penggunaan variabel atau konstanta tersebut. Disarankan untuk menggunakan nama yang singkat apabila variabel tersebut bersifat lokal di dalam fungsi dan nama yang lebih panjang untuk variabel eksternal dan global. Tabel 1.1 menampilkan daftar tipe data, ukuran dan jangkauan nilainya pada C. Tipe data char digunakan untuk menampung data karakter, int untuk menampung bilangan bulat, float dan double untuk menampung bilangan desimal. 2

BAB 1. PENGENALAN C & C++

Tabel 1.1: Tipe data, ukuran, dan jangkauan Tipe 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) atau tidak bertanda (unsigned). unsigned menampung nilai positif, sedangkan signed menampung 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 Operator

Statement (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 menghasilkan nilai 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 pada tiga operan.

1.4.1

Operator aritmatika Tabel 1.2: Operator aritmatika Operator Keterangan * perkalian / pembagian % modulus/sisa bagi + penjumlahan pengurangan

Tabel 1.2 menampilkan operator aritmatika yang terdapat pada C. Operator  % hanya dapat dilakukan pada tipe data char dan int. 3

BAB 1. PENGENALAN C & C++

1.4.2

Operator relasional dan logika Tabel 1.3: Operator relasional Operator Keterangan > lebih besar >= lebih besar dan sama dengan <= lebih kecil dan sama dengan < lebih kecil == sama dengan != tidak sama dengan

Tabel 1.4: Operator logika Operator 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 hasil evaluasi true dan 0 (nol) apabila hasil evaluasi false.

1.4.3

Operator increment dan decrement

C menyediakan operator increment dan decrement. Operator increment ++ menambahkan 1 ke operan, sedangkan operator decrement -- mengurang 1. Operator increment dan decrement hanya membutuhkan satu operan yaitu variabel yang akan ditambah atau dikurang sebanyak 1. Operator ini dapat dituliskan sebagai prex maupun sebagai postx.

1.4.4

Operator bitwise Tabel 1.5: Operator bitwise Operator 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 untuk memanipulasi nilai pada tingkatan bit. Operator bitwise hanya dapat digunakan pada operan yang bertipe char atau int.

1.4.5

Operator dan ekspresi assignment

Sebuah ekspresi seperti

4

BAB 1. PENGENALAN C & C++

i = i + 5 dimana variabel yang terdapat disebelah kiri diulang lagi disebelah kanan, dapat disingkat menjadi

i += 5 Operator += pada ekspresi di atas disebut dengan operator assignment. Operator ini dapat digunakan pada operator binari

+

1.4.6

- *

/

%

<< >>

&

^

|

Ekspresi kondisional

Statement

if (a > b) z = a; else z = 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 evaluasi Operator () [] -> . ! ~ ++ -- + - *(tipe) sizeof * / % + << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= &= ^= |= < <= > >= , Operator unary +, -, & dan * memiliki precedence lebih tinggi dibanding operator binary -nya. 5

:.

BAB 1. PENGENALAN C & C++ Tabel 1.6 menampilkan precedence dan urutan evaluasi untuk seluruh operator, termasuk operator yang belum kita bahas. Operator yang berada pada baris yang sama memiliki tingkat precedence yang sama. Urutan evaluasi dimulai dari baris teratas yang memiliki

precedence yang paling tinggi ke baris paling bawah yang memiliki precedence yang paling rendah. Operator  () merupakan pemanggilan fungsi. Operator  -> dan  . digunakan untuk mengakses anggota struktur yang akan kita bahas nanti (bersama dengan operator  &,  * dan  sizeof).

1.5

Input dan Output

Program biasanya membutuhkan masukan (input) dan juga menghasilkan keluaran (output). 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 merupakan header le standar untuk menyediakan akses terhadap fungsi pustaka input dan output. Nama header le tersebut  stdio.h diapit dengan tanda  < dan  > untuk memasukkan header le yang terdapat pada lokasi standar. Untuk memasukkan header le yang tidak terletak pada lokasi standar, maka nama le header le diapit menggunakan tanda  ". Berikut kita akan melihat sebuah contoh program sederhana penggunaan fungsi input dan output pada C. Program berikut akan meminta input nilai panjang dan lebar dan akan menampilkan 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 ke fungsi input dan output.

int p,l,luas;

mendeklarasikan tiga variabel int. p untuk menampung nilai panjang, l menampung nilai lebar dan luas menampung nilai luas.

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

BAB 1. PENGENALAN C & C++

scanf("%d", &p);

membaca input data int dari keyboard dan disimpan pada variabel p.

printf("Luas : %d\n", luas); menampilkan string  Luas : diikuti dengan nilai yang terdapat 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 (biasanya layar monitor) sesuai dengan format. Fungsi ini mengembalikan jumlah karakter yang dicetak. 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 pada arg1, arg2, ..., gunakan tanda  % diikuti dengan karakter format sesuai dengan tipe data yang akan dicetak. Tabel 1.7 menampilkan format string untuk masing-masing tipe data. Tabel 1.8 menampilkan escape code /character yang terdapat pada C.

karakter d,i o,u,x,X e,E f,F c s

Tabel 1.7: Format string tipe data [signed] int [unsigned] int float, double (menggunakan notasi E) float, double char char [], char * (string )

Tabel 1.8: Escape code /character Escape 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

scanf membaca karakter dari standar input (biasanya keyboard ) sesuai dengan spesikasi pada format dan menyimpan hasilnya ke argumennya. Fungsi ini mengembalikan banyak nilai yang disimpan ke dalam variabel argumen scanf. int scanf(char *format, ...); 7

BAB 1. PENGENALAN C & C++ Argumen format pada scanf sama dengan argumen format pada fungsi printf. Argumen setelah format merupakan alamat memori variabel yang akan menyimpan input yang dibaca oleh scanf. Pointer atau alamat memori variabel didapatkan dengan menggunakan operator  & didepan variabel yang bersangkutan.

8

Bab 2

Control Flow Control Flow (aliran kontrol) berguna untuk menentukan urutan komputasi yang dilaksanakan. Dalam bahasa pemrograman terdapat dua control ow yang dapat digunakan, yaitu decision (pengambilan keputusan) dan loop (pengulangan). Decision akan menentukan 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 blok

Sebuah 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 pada blok tersebut secara syntax dianggap sama dengan satu statement. Compound statement digunakan 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; else statement2;

9

BAB 2. CONTROL FLOW Penggunaan else pada if bersifat optional, boleh ditulis atau tidak tergantung pada kebutuhan. expression akan dievaluasi; apabila hasil evaluasi expression bernilai true (bernilai selain 0) maka statement1 akan dieksekusi. Dan apabila hasil evaluasi expression bernilai

false (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 setelah

if akan dieksekusi, yaitu menampilkan string  Bilangan ganjil.. Sedangkan apabila hasilnya bernilai false, maka statement setelah else yang akan dieksekusi, yaitu menampilkan string  Bilangan genap.. Apabila terdapat lebih dari dua kemungkinan jalur eksekusi yang harus dipilih, kita dapat 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 kemungkinan jalur eksekusi. Evaluasi ekpresi dilakukan berurutan dari atas. expression1 akan dievaluasi pertama kali, apabila bernilai true, statement1 akan dieksekusi dan menghentikan evaluasi expression selanjutnya. statement5 pada else terakhir akan dieksekusi apabila tidak ada expression yang bernilai true. Penggunaan if ini disebut dengan nested

if. Contoh:

#include <stdio.h> 10

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 nilai angka (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 integer dan 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 evaluasi

expression sesuai dengan salah satu nilai pada constant maka statement pada case tersebut akan dieksekusi sampai ditemukannya kata kunci break. Apabila tidak terdapat 11

BAB 2. CONTROL FLOW

constant yang sesuai dengan hasil evaluasi expression dan terdapat kata kunci default di 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 adalah  == (sama dengan). Tipe data yang digunakan untuk expression pada switch atau

constant 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 sebagai test kondisi apakah perulangan akan diteruskan atau dihentikan, sedangkan expr3 mengubah nilai counter pada setiap kali loop dilaksanakan. Perulangan for akan terus dilakukan apabila nilai dari expr2 true. Apabila expr2 tidak dituliskan, maka expr2 akan dianggap true. Loop berikut akan menghasilkan perulangan yang tidak pernah berhenti (innite loop ): 12

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 pada perulangan for untuk menghitung jumlah perulangan yang telah dilakukan dan untuk menentukan kapan perulangan tersebut berhenti. Perulangan di atas diulangi sebanyak 10 kali yaitu dari 1 sampai dengan 10, dengan setiap kali perulangan counter di-increment. Perulangan dapat bersifat nested (perulangan di dalam perulangan). Loop yang paling dalam 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. Apabila pada awal perulangan expression bernilai false, maka perulangan while tersebut tidak akan 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 variabel i masih lebih kecil dan sama dengan 10. Perulangan while di atas mungkin tidak dilaksanakan sama sekali apabila nilai i pada saat sebelum masuk ke dalam perulangan lebih besar dari 10 (misalnya 11).

2.3.3

do...while

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

BAB 2. CONTROL FLOW perulangan sama sekali. Apabila diinginkan minimal terjadi satu kali perulangan sebelum diteruskan dengan perulangan selanjutnya, maka test tersebut diletakkan di bagian bawah perulangan.

do statement; while (expression); statement dieksekusi terlebih dahulu sebelum expression dievaluasi untuk menentukan apakah perulangan akan diteruskan atau dihentikan. Bentuk perulangan ini menjamin statement 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 tergantung pada nilai i sebelum perulangannya dimulai.

2.3.4

goto label

Bentuk perulangan yang lain adalah dengan menggunakan statement goto. Statement

goto akan mengubah jalur eksekusi program ke lokasi yang ditunjuk tanpa harus memenuhi suatu kondisi. goto label; Penggunaan goto harus bersama-sama dengan label. label menandakan suatu lokasi di dalam source code. Perulangan dengan menggunakan goto sangat tidak dianjurkan, karena akan menyulitkan pada saat pemeliharaan program, dan juga akan menyulitkan untuk memahami aliran eksekusi program (program ow ). Biasanya penggunaan goto dapat digantikan dengan loop

for, while ataupun do...while. Contoh: #include <stdio.h> main () { int i; i = 1; 14

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 perulangan. Ketika kondisional if bernilai true, maka nilai variabel i di-increment dan perintah

goto ulang; akan mengubah aliran eksekusi program ke lokasi yang ditunjuk oleh label ulang.

2.3.5

break dan continue

Kadang perulangan perlu dihentikan ditengah-tengah perulangan bukan pada awal ataupun akhir perulangan tersebut. Untuk menghentikan loop for, while dan do...while sebelum mencapai awal atau akhir perulangan, kita dapat menggunakan statement break. break akan 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 saat

counter (i) mencapai nilai 5, maka perulangan di atas akan dihentikan dengan menggunakan statement break. Penggunaan continue hampir sama dengan break. Apabila break menghentikan loop, continue digunakan untuk melewatkan seluruh statement di bawahnya dan kembali ke awal perulangan. Contoh:

#include <stdio.h> main () { int i; for (i = 1; i <= 10; i++) { if (i == 5) continue; 15

BAB 2. CONTROL FLOW

printf("%d\n", i); } } Contoh di atas akan menampilkan bilangan 1 sampai dengan 4 kemudian 6 sampai dengan 10. Pada saat counter (i) bernilai 5, continue menyebabkan perintah selanjutnya tidak dilaksanakan, dan kembali ke awal loop, sehingga pada saat i=5 nilai i tidak ditampilkan.

16

Bab 3

Array Array adalah suatu kumpulan variabel dengan tipe data yang sama. Masing-masing elemen di dalam array diakses dengan menggunakan nomor indexnya. Di dalam C index selalu 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

BAB 3. ARRAY

int n[5][3]; Contoh:

#include #define #define #define #define #define main () { long

<stdio.h> GP 0 UL 1 A 0 B 1 C 2

tabel_gaji[3][2] = {{2000000, {1000000, { 800000, char gol; int jk; long gt, gp, ul; printf("Gol: "); gol = getchar(); printf("Jam Kerja: "); scanf("%d", 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;

20000}, 10000}, 8000}};

&jk);

} Array bersifat statis artinya apabila suatu array telah dideklarasikan dengan jumlah elemen tertentu, maka jumlah elemen array tersebut tidak dapat ditambah atau dikurang selama eksekusi 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

BAB 3. ARRAY

array == &array[0];

String Di 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. Sebuah konstanta char diapit dengan tanda kutip tunggal  ', sedangkan konstanta string diapit dengan 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 dideklarasikan sebagai pointer bersifat dinamis. String yang dideklarasikan sebagai pointer harus memesan ruang memori yang akan digunakan. Pemesanan ruang memori dapat dilakukan dengan menggunakan fungsi malloc, dan harus dibebaskan apabila sudah tidak dipakai dengan menggunakan fungsi free. Fungsi-fungsi ini dideklarasikan pada header le  stdlib.h. Operasi yang dilakukan pada string harus menggunakan fungsi khusus. Fungsi-fungsi yang 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) ke akhir string dest (string tujuan). String dest harus memiliki cukup ruang untuk menampung 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 yang dikembalikan adalah integer lebih kecil, sama dengan, atau lebih besar dari nol apabila

s1 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 harus memiliki cukup ruang untuk menampung string hasil penyalinan. Fungsi ini mengembalikan pointer ke string dest. 4. char *strdup(const char *s); Menduplikat sebuah string. Fungsi ini mengembalikan pointer ke string baru yang merupakan duplikat dari string s, atau NULL apabila jumlah memori tidak mencukupi. 19

BAB 3. ARRAY 5. size_t strlen(const char *s); Menghitung panjang string s, tidak termasuk terminator karakter  \0. Fungsi ini mengembalikan 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 posisi karakter c pertama yang ditemukan di dalam string s. Jika c tidak ditemukan nilai yang 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 string

n pertama yang ditemukan di dalam string h. Jika n tidak ditemukan, nilai yang dikembalikan 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

Bab 4

Structure Stucture merupakan kumpulan variabel-variabel ke dalam suatu identier. Variabel ini yang terdapat di dalam suatu structure bisa memiliki tipe data yang berbeda-beda. Biasanya digunakan untuk mengelompokkan informasi yang berkaitan.

struct [struct_template] { tipe var1; tipe var2; . . . } [var_struct]; struct_template merupakan identier pola structure yang akan digunakan untuk mendeklarasi variabel structure. Untuk mengakses anggota dari suatu structure digunakan operator ".". 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 didenisikan suatu tipe data buatan (user dened data type ) dengan menggunakan statement typedef. 21

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

Bab 5

Fungsi Pada seluruh pemrograman terdapat apa yang disebut dengan subrutin. Subrutin merupakan suatu program yang dapat digunakan pada program yang lainnya. Pada beberapa bahasa dibedakan antara subrutin yang mengembalikan nilai dan subrutin yang tidak mengembalikan nilai. Pada bahasa tersebut subrutin yang mengembalikan nilai disebut dengan

function (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 (baik ukuran maupun kompleksitasnya) menjadi program-program kecil yang relatif lebih mudah untuk ditangani. Keuntungan lain dari subprogram adalah reuseability yaitu subprogram yang memiliki fungsi umum dapat digunakan pada program yang lain tanpa harus dibuat ulang 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. Disini dituliskan tipe data, nama fungsi dan daftar argumen yang dibutuhkan oleh fungsi. Argumen dituliskan dapat kurung beserta dengan tipe datanya dan dipisahkan dengan ,. Isi fungsi diletakkan di dalam kurung kurawal. Seluruh variabel dan konstanta yang dideklarasikan di dalam fungsi bersifat lokal terhadap fungsi tersebut. return hasil statement ini merupakan akhir dari suatu fungsi dan eksekusi dikembalikan ke program pemanggil. hasil merupakan variabel yang dikembalikan oleh fungsi ini ke program pemanggil. 23

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 didenisikan dengan tipe data void. Tipe data ini adalah tipe data khusus untuk mendenisikan data tidak bertipe. Pada fungsi di atas tidak digunakan statement

return untuk mengembalikan nilai dan menghentikan fungsi. Walaupun statement return dimasukkan pada fungsi yang tidak mengembalikan nilai, maka statement return tersebut hanya berfungsi untuk keluar dari fungsi dan kembali ke program pemanggil. Statement return pada fungsi ini tidak boleh diikuti dengan suatu ekspresi. Pemanggilan fungsi ini pada program yang lain adalah: hello("Budi"); Jika suatu fungsi didenisikan tanpa menuliskan tipe datanya, maka fungsi tersebut dianggap mengembalikan tipe data int. Deklarasi fungsi sebelum penulisan fungsi sebenarnya disebut dengan prototype fungsi. Tujuannya adalah untuk mengenalkan fungsi tersebut kepada program.

5.1

Pengiriman argumen

Komunikasi antara fungsi dilakukan dengan mengirimkan data-data yang dibutuhkan oleh fungsi tersebut. Data-data yang dikirimkan atau dilewatkan ke dalam suatu fungsi disebut dengan argumen. Ada dua cara pengiriman argumen yaitu pass by value (pengiriman nilai) dan pass by reference (pengiriman pointer /alamat memori).

Pass by value Yang dimaksud dengan pass by value adalah yang dilewatkan ke dalam fungsi adalah nilainya saja. Nilai dari parameter (argumen) aktual (yang dilewatkan ke fungsi) akan disalin ke parameter formal (yang digunakan di dalam fungsi). Oleh karena itu, parameter aktual dan parameter formal merupakan dua variabel yang berbeda, sehingga apabila terjadi perubahan nilai parameter formal, perubahan tersebut tidak mempengaruhi nilai parameter aktual.

Pass by reference Pass by reference adalah melewatkan alamat memori dari parameter aktual ke parameter formal. Dengan demikian, parameter aktual dan formal merupakan variabel yang sama,

24

BAB 5. FUNGSI atau bisa dikatakan parameter formal merupakan alias dari parameter aktual. Hal ini menyebabkan setiap perubahan nilai pada parameter formal akan merubah nilai dari parameter aktual. Pada C, pass by reference dilakukan dengan mendenisikan argumen sebagai tipe data pointer. Contoh:

#include <stdio.h> void tukar (int *a, { int t; t = *a; *a = *b; *b = t; } main () { int a, b; a = 10; b = 34; printf("a: %d", printf("b: %d", tukar(a, b); printf("a: %d", printf("b: %d", return 0; }

5.2

int *b)

a); b); a); b);

Fungsi Rekursi

Fungsi rekursi adalah fungsi yang memanggil dirinya sendiri baik secara langsung maupun tidak langsung. Fungsi rekursi digunakan untuk menyelesaikan masalah yang dapat didenisikan secara rekursi, yaitu masalah yang dapat didenisikan dengan masalah sejenis yang bentuknya lebih sederhana. Setiap fungsi rekursi harus memiliki kondisi dimana rekursi tersebut berhenti dan solusi permasalahan ditemukan. Berikut contoh fungsi rekursi untuk menghitung sigma dan faktorial. Sigma dapat didenisikan secara rekusi: n X i=1

i=

n−1 X

i+n

i=1

Dan faktorial juga dapat didenisikan secara rekursi:

n! = n − 1! × n

25

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; else return 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; else return 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. Jika argumen yang dilewatkan bernilai lebih besar dari 1 maka akan dilakukan rekursi dengan argumen yang nilainya lebih kecil.

26

Bab 6

Pointer Memori komputer terdiri dari lokasi penyimpanan yang saling berdampingan. Ketika Anda mendeklarasikan suatu variabel, maka komputer akan memesan lokasi memori tertentu yang kemudian diasosiasikan dengan nama variabel yang dideklarasikan. Jadi ketika Anda menggunakan 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 menyimpan alamat memori variabel lain merupakan alias dari variabel tersebut. Langkah pertama yang harus dilakukan untuk menggunakan pointer adalah mendeklarasikan variabel pointer.

tipe_data *var_pointer; Operator  * pada syntax diatas menunjukkan bahwa var_pointer merupakan variabel

pointer. Selanjutnya adalah menyimpan alamat memori variabel ke dalam variabel pointer. Operator  & pada syntax dibawah merupakan operator address of untuk mengambil alamat memori 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

BAB 6. POINTER

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

Linked List Linked list adalah merupakan suatu data storage. Data storage yang diimplementasikan menggunakan linked list bersifat dinamis. Implementasi linked list terdiri dari single linked list dan double linked list. Pada dasarnya linked list adalah merupakan suatu struktur yang dikaitkan dengan struktur lainnya. Gambar 6.1 menampilkan bentuk single linked list.

10

17

26

30

NULL

Gambar 6.1: Single-Linked-List Pada Gambar 6.1 dapat dilihat bahwa setiap simpul (setiap kotak pada gambar merupakan simpul/node dari linked list ) terdiri dari dua bagian. Bagian yang pertama digunakan untuk menyimpan data, dan bagian yang kedua digunakan untuk mengkaitkan simpul tersebut dengan simpul berikutnya di dalam linked list. Akhir dari linked list ditunjukkan oleh nilai NULL. Double-linked list juga memiliki tampilan yang mirip, dengan tambahan di depan masing-masing simpul, terdapat satu bagian lagi untuk mengkaitkan simpul dengan simpul sebelumnya. Pada C, simpul di dalam linked list merupakan struct yang menyimpan data dan pointer ke struct berikutnya dengan tipe struct yang sama. Struktur data untuk linked-list pada Gambar 6.1 didenisikan sebagai berikut:

struct node_t { int n; struct node_t *next; }; Struktur diatas terdiri dari dua anggota, yaitu n dan next. n digunakan untuk menyimpan nilai atau data untuk setiap simpul dalam linked list dan next merupakan pointer ke simpul berikutnya di dalam linked list. Untuk menentukan letak awal linked list, kita akan menggunakan pointer yang menunjuk ke awal linked list. Pointer ini kita namakan dengan head. head selalu menunjuk ke awal

linked list. Pada saat pertama kali linked list dibentuk, linked list belum memiliki simpul di dalamnya, pointer head menunjuk ke nilai NULL. Gambar menampilkan single linked list pada keadaan kosong.

NULL HEAD Gambar 6.2: single linked list pada keadaan kosong Kode program dalam bahasa C untuk mendenisikan linked list yang masih kosong: 28

BAB 6. POINTER

struct node_t *head; head = NULL; Operasi penambahan simpul ke dalam linked list dapat dilakukan melalui tiga cara, yaitu penambahan di depan, tengah dan belakang linked list. Berikut ini kita bahas langkahlangkah penambahan simpul ke dalam linked list menggunakan ketiga cara tersebut. 1. Penambahan depan Penambahan ke depan linked list dilakukan dengan menghubungkan simpul yang baru dengan 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 pointer

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

10

NULL

10

NULL

10

NEW

HEAD

NEW

HEAD

NEW HEAD (c)

(a)

(b)

NULL

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 linked

list (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 (kita namakan cur) untuk menelusuri simpul di dalam linked list untuk mencari simpul yang terakhir, (c) hubungkan simpul terakhir (cur) dengan simpul baru (new), (d) dan hubungkan pointer next pada simpul new dengan NULL untuk menandakan akhir linked list yang baru. 29

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 dilakukan pada linked list. Hal yang perlu dilakukan akan mencari lokasi dimana simpul yang baru akan disisipkan ke dalam linked list. Langkah untuk mencari lokasi penyisipan tergantung pada kebutuhan. Misalkan contoh berikut akan menyisipkan simpul baru ke 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 berikutnya pada lokasi penyisipan */ new->next = cur->next; /* hubungkan simpul pada lokasi penyisipan dengan simpul baru */ cur->next = new;

30

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 adalah sebagai berikut: 1. Buka le 2. Lakukan operasi terhadap le (baca atau tulis) 3. Tutup le

Membuka dan menutup le

7.1

Membuka 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 menyatakan nama le yang akan dibuka. Parameter kedua merupakan string yang menyatakan modus pembukaan le.

Mode r w a + t b

Tabel 7.1: Nilai mode untuk fungsi fopen() Keterangan Membuka le untuk dibaca. Jika le tidak ada, fopen() mengembalikan nilai NULL Membuka le untuk ditulis. Jika le belum ada, akan dibuat le baru. Jika le telah ada, isinya akan ditimpa dengan le yang baru. 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. Tipe le yang dibuka adalah le text. Tipe le yang dibuka adalah le binary.

File yang dibuka harus ditutup apabila telah selesai digunakan. Fungsi fclose() digunakan untuk menutup le yang sedang terbuka. 31

BAB 7. FILE

int fclose(FILE *fp); Fungsi fclose() mengembalikan nilai 0 jika le berhasil ditutup dan -1 jika le tidak berhasil ditutup.

Menulis dan membaca data le

7.2

File Text Penulisan 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 untuk membaca dari le text. Contoh:

#include <stdio.h> main() { FILE *f; char nama[20]; 32

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 Biner Penulisan ke dalam le biner dilakukan dengan menggunakan fungsi fwrite() dan untuk membaca data dari le biner dilakukan dengan menggunakan fungsi fread(). Prototype fungsi 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 akan ditulis 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 akan dibaca 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

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

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 pada parameter ini dapat dilihat pada Tabel 7.2. Tabel 7.2: Konstanta Nilai SEEK_SET 0 SEEK_CUR 1 SEEK_END 2

nilai origin untuk fungsi fseek() Keterangan Berpindah dari posisi awal le Berpindah dari posisi sekarang di dalam le 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

Bab 8

Grak Ada dua lingkungan dimana program berjalan berdasarkan tampilannya. Yang pertama program berjalan pada modus tampilan teks dan yang kedua adalah program berjalan pada tampilan grak. Pada Borland Turbo C, fungsi dan struktur data untuk melakukan operasi pada lingkungan grak didenisikan pada le header  graphics.h. Fungsi untuk melakukan inisialisasi modus grak adalah initgraph(). Berikut ini pro-

totype fungsi initgraph():

initgraph(int *driver, int *mode, const char *path); driver pointer ke int yang menyimpan kode driver grak yang akan digunakan. mode pointer ke int yang menyimpan kode modus grak yang akan digunakan. path string ke le driver grak yang akan digunakan. Kode driver dan mode grak yang dapat digunakan dapat dilihat pada Tabel. Tabel 8.1: Kode driver dan mode grak driver mode CGA CGAC0 CGAC1 CGAC2 CGAC3 CGAHI EGA EGALO EGAHI EGALO VGA VGALO VGAMED VGAHI Kode driver dapat diisikan dengan konstanta DETECT untuk mendeteksi driver yang akan digunakan secara otomatis. Untuk menutup modus grak dan kembali ke modus teks, digunakan fungsi closegraph(). Berikut prototype -nya:

closegraph(); 36

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 koordinat 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 jarijarinya sepanjang r. 8. bar(int x1, int y1, int x2, int y2); Menggambar grak batang. 9. bar3d(int x1, int y1, int x2, int y2, int tbl_samping, int tbl_atas); Menggambar grak batang 3 dimensi. tbl_samping dan tbl_atas merupakan nilai untuk efek 3 dimensi pada samping dan atas grak batang. 10. pieslice(int x, int y, int sudut_awal, int sudut_akhir, int r); Menggambar grak pie. sudut_awal dan sudut_akhir merupakan nilai sudut permulaan dan akhir lingkaran 11. outtextxy(int x, int y, const char *s); Menampilkan text pada modus grak. 12. settextstyle(int font, int direction, int size); Menggubah setting tulisan yang akan ditampilkan. Contoh:

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

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

Related Documents