You are on page 1of 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 Precedence dan urutan evaluasi . . . . . . . . . . . . . . . . . . . . . . 5
1.5 Input dan Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.5.1 printf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5.2 scanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2 Control Flow 9
2.1 Compound Statement dan blok . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2 Decision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1 if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.2 switch...case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3 Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1 for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.2 while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.3 do...while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.4 goto label . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.5 break dan continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 ta-
hun 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 (per-
nyataan) 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 bebe-
rapa 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 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 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 apa-
bila 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 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 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 ++ menam-
bahkan 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 (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 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 varia-
bel 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 (biasa-
nya 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.

Tabel 1.7: Format string


karakter tipe data
d,i [signed] int
o,u,x,X [unsigned] int
e,E float, double (menggunakan notasi E)
f,F float, double
c char
s 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. Argu-
men 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 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 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 kebu-
tuhan. 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 ha-
silnya 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 kemung-
kinan jalur eksekusi. Evaluasi ekpresi dilakukan berurutan dari atas. expression1 akan
dievaluasi pertama kali, apabila bernilai true, statement1 akan dieksekusi dan menghen-
tikan 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 ada-
lah  == (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 me-
nentukan 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 va-
riabel 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 tergan-
tung 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 menyulitk-
an 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 peru-
langan. 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 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. 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 <stdio.h>
#define GP 0
#define UL 1
#define A 0
#define B 1
#define C 2
main ()
{
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 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 mengem-
balikan 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 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 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 me-
rupakan suatu program yang dapat digunakan pada program yang lainnya. Pada beberapa
bahasa dibedakan antara subrutin yang mengembalikan nilai dan subrutin yang tidak meng-
embalikan 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 parame-
ter 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 me-
nyebabkan 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 *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 Rekursi


Fungsi rekursi adalah fungsi yang memanggil dirinya sendiri baik secara langsung ma-
upun tidak langsung. Fungsi rekursi digunakan untuk menyelesaikan masalah yang dapat
didenisikan secara rekursi, yaitu masalah yang dapat didenisikan dengan masalah seje-
nis 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 n−1
X
i= i+n
i=1 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 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 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 meru-
pakan simpul/node dari linked list ) terdiri dari dua bagian. Bagian yang pertama digunakan
untuk menyimpan data, dan bagian yang kedua digunakan untuk mengkaitkan simpul ter-
sebut 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 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 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 NULL

NEW HEAD NEW HEAD NEW


(a) (b) HEAD (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 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

7.1 Membuka dan menutup le


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

Tabel 7.1: Nilai mode untuk fungsi fopen()


Mode Keterangan
r Membuka le untuk dibaca. Jika le tidak ada, fopen() mengembalikan nilai NULL
w 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
BAB 7. FILE

int fclose(FILE *fp);

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

7.2 Menulis dan membaca data le


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: nilai origin untuk fungsi fseek()


Konstanta Nilai Keterangan
SEEK_SET 0 Berpindah dari posisi awal le
SEEK_CUR 1 Berpindah dari posisi sekarang di dalam le
SEEK_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
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 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 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 permu-
laan 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 <graphics.h>
#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

You might also like