Professional Documents
Culture Documents
C & C++
Daftar Isi
Daftar Isi i
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
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
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.
#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.
tipe_data identifier_variabel;
2
BAB 1. PENGENALAN C & C++
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];
char *identifier;
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++
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.
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.
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
if (a > b)
z = a;
else
z = b;
dapat ditulis dalam bentuk ekspresi kondisional, menggunakan operator ternary ? :.
Bentuk penulisan ekpresi kondisional adalah
a > b ? z = a : z = b;
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).
#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);
}
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.
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.
x = 10;
printf(...);
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);
#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.
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.
#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);
}
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";
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:
19
BAB 3. ARRAY
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
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
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) 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.
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.
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;
}
n
X n−1
X
i= i+n
i=1 i=1
n! = n − 1! × n
25
BAB 5. FUNGSI
#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;
}
#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;
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
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
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
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.
2. Penambahan belakang
Penambahan ke belakang linked list dilakukan dengan menghubungkan akhir linked
list (simpul yang menunjuk ke NULL) dengan simpul baru.
29
BAB 6. POINTER
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.
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
3. Tutup le
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.
File yang dibuka harus ditutup apabila telah selesai digunakan. Fungsi fclose() digu-
nakan untuk menutup le yang sedang terbuka.
31
BAB 7. FILE
Fungsi fclose() mengembalikan nilai 0 jika le berhasil ditutup dan -1 jika le tidak
berhasil ditutup.
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().
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:
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().
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().
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:
34
BAB 7. FILE
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():
driver pointer ke int yang menyimpan kode driver grak yang akan digunakan.
mode pointer ke int yang menyimpan kode modus grak yang akan digunakan.
Kode driver dan mode grak yang dapat digunakan dapat dilihat pada Tabel.
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
1. setcolor(int warna);
Mengubah warna foreground.
2. setbkground(int warna);
Mengubah warna background.
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.
Contoh:
#include <graphics.h>
#include <stdio.h>
main ()
{
37
BAB 8. GRAFIK
38