Anda di halaman 1dari 158

3.3.

Pernyataan if-else
Pernyataan if-else memiliki bentuk :

if (kondisi)
pernyataan-1;
else
pernyataan-2;

Diagram alir dapat dilihat seperti gambar 3.2.

Kondisi Salah

Benar

Pernyataan-1 Pernyataan-2

Gambar 3.2 Diagram alir if-else

Arti dari pernyataan if-else :


 Jika kondisi benar, maka pernyataan-1 dijalankan.
 Sedangkan bila kondisi bernilai salah, maka pernyataaan-2 yang dijalankan.
Masing-masing pernyataan-1 dan pernyataan-2 dapat berupa sebuah pernyataan
tunggal, pernyataan majemuk ataupun pernyataan kosong.
Contoh penggunaan pernyataan if-else adalah untuk menyeleksi nilai suatu
bilangan pembagi. Jika nilai bilangan pembagi adalah nol, maka hasil pembagian dengan
nilai nol akan mendapatkan hasil tak berhingga. Jika ditemui nilai pembaginya nol, maka
proses pembagian tidak akan dilakukan.

33
/* File program : bagi.c
Pemakaian if-else untuk menyeleksi bilangan pembagi */

#include <stdio.h>

main()
{
float a, b;

printf("Masukkan nilai a : ");


scanf("%f", &a);
printf("Masukkan nilai b : ");
scanf("%f", &b);

if (b == 0)
printf("\n%g dibagi dengan nol = TAK BERHINGGA\n", a);
else
printf("\n%g dibagi dengan %g = %g\n", a, b, a/b);
}

Contoh eksekusi :
Masukkan nilai a : 5
Masukkan nilai b : 0
5 dibagi dengan nol = TAK BERHINGGA

3.4. Pernyataan if di dalam if


Di dalam suatu pernyataan if (atau if-else) bisa saja terdapat pernyataan if (atau if-
else) yang lain. Bentuk seperti ini dinamakan sebagai nested if. Secara umum, bentuk dari
pernyataan ini adalah sebagai berikut :

if (kondisi-1)
if (kondisi-2)
.
.
if(kondisi-n)
pernyataan;
else
pernyataan;
.
.
else
pernyataan;
else
pernyataan;

34
 Kondisi yang akan diseleksi pertama kali adalah kondisi yang terluar (kondisi-1). Jika
kondisi-1 bernilai salah, maka statemen else yang terluar (pasangan if yang
bersangkutan) yang akan diproses. Jika else (pasangannya tsb) tidak ditulis, maka
penyeleksian kondisi akan dihentikan.
 Jika kondisi-1 bernilai benar, maka kondisi berikutnya yang lebih dalam (kondisi-2)
akan diseleksi. Jika kondisi-2 bernilai salah, maka statemen else pasangan dari if yang
bersangkutan yang akan diproses. Jika else (untuk kondisi-2) tidak ditulis, maka
penyeleksian kondisi akan dihentikan.
 Dengan cara yang sama, penyeleksian kondisi akan dilakukan sampai dengan
kondisi-n, jika kondisi-kondisi sebelumnya bernilai benar.
/* File program : determinan1.c
Program untuk menghitung determinan dan akar-akar persamaan
kuadrat menggunakan if bersarang */

#include <stdio.h>
#include <math.h>

main()
{
float a, b, c, d = 0;
double x1, x2, imaginair;

printf("MENCARI AKAR-AKAR PERSAMAAN KUADRAT a+bx+c=0\n");


printf("\nMasukkan nilai a : ");
scanf("%f", &a);
printf("Masukkan nilai b : ");
scanf("%f", &b);
printf("Masukkan nilai c : ");
scanf("%f", &c);

d = b*b-4*a*c; /* menghitung determinan */

if (d >= 0)
if (d == 0)
{
x1 = -b / (2 * a);
printf("\nDua akar real kembar yaitu : \n");
printf("x1 = x2 = %g\n", x1);
}
else
{
x1 = (-b + sqrt(d))/(2*a);
x2 = (-b - sqrt(d))/(2*a);
printf("\nDua akar real berlainan yaitu :\n");
printf("x1 = %g\n", x1);

35
printf("x2 = %g\n", x2);
}
else
{
imaginair = (sqrt(-d)/(2*a));
x1 = -b/(2*a);
printf("\nDua akar imaginair berlainan yaitu : \n");
printf("x1 = %g + %gi\n", x1, imaginair);
printf("x2 = %g - %gi\n", x1, imaginair);
}
}

Contoh eksekusi :
MENCARI AKAR-AKAR PERSAMAAN KUADRAT a+bx+c=0
Masukkan nilai a : 3
Masukkan nilai b : 6
Masukkan nilai c : 2

Dua akar real berlainan yaitu :


X1 = -0.42265
X2 = -1.57735

3.5. Pernyataan else-if


Contoh implementasi nested if ini misalnya pembuatan sebuah program
kalkulator sederhana. User memberikan masukan dengan format :

operand1 operator operand2

Jenis operasi yang dikenakan bergantung pada jenis operator ang dimasukkan oleh user.
Oleh karena itu program akan mengecek apakah operator berupa tanda ‘*’, ‘/’, ‘+’,
ataukah tanda ‘-‘ .
 Jika operator berupa tanda ‘*’ maka operand1 akan dikalikan dengan operand2.
 Jika operator berupa tanda ‘/’ maka operand1 akan dibagi dengan operand2.
 Jika operator berupa tanda ‘+’ maka operand1 akan dijumlahkan dengan operand2.
 Jika operator berupa tanda ‘-’ maka operand1 akan dikurangi dengan operand2.
 Kalau operator yang dimasukkan bukan merupakan salah satu dari jenis operator di
atas, maka ekspresi tersebut tidak akan diproses, dan user akan mendapatkan pesan
berupa : “Invalid operator !”

/* File program : kalkulator1.c

36
Contoh penggunaan else if untuk mengimplementasikan program
kalkulator sederhana */

#include <stdio.h>

main()
{
int valid_operator = 1;
/* valid_operator diinisialisasi dengan logika 1 */
char operator;
float number1, number2, result;
printf("Masukkan 2 buah bilangan dan sebuah operator\n");
printf("dengan format : number1 operator number2\n\n");
scanf("%f %c %f", &number1, &operator, &number2);

if(operator == '*')
result = number1 * number2;
else if(operator == '/')
result = number1 / number2;
else if(operator == '+')
result = number1 + number2;
else if(operator == '-')
result = number1 - number2;
else
valid_operator = 0;

if(valid_operator)
printf("\n%g %c %g is %g\n", number1, operator, number2,
result );
else
printf("Invalid operator!\n");
}

Contoh eksekusi :
Masukkan 2 buah bilangan dan sebuah operator
dengan format : number1 operator number2

23.2 + 12
23.2 + 12 is 35.2

3.6. Pernyataan switch


Pernyataan switch merupakan pernyataan yang dirancang khusus untuk
menangani pengambilan keputusan yang melibatkan sejumlah alternatif, misalnya untuk
menggantikan pernyataan if bertingkat.
Bentuk umum pernyataan switch adalah :

37
switch (ekspresi)
{
case konstanta-1:
pernyataan-1;
......
break;
case konstanta-2:
.
.
.
case konstanta-n:
pernyataan-n;
.......
break;
default:
.......
.......
break;
}

dengan ekspresi dapat berupa ekspresi bertipe integer atau bertipe karakter. Demikian
juga konstanta-1, konstanta-2, …, konstanta-n dapat berupa konstanta integer atau
karakter. Setiap pernyataan-i (pernyataan-1, … , pernyataan-n) dapat berupa
pernyataan tunggal ataupun pernyataan jamak. Dalam hal ini urutan penulisan
pernyataan case tidak berpengaruh. Proses penyeleksian berlangsung sebagai berikut :
 Pengujian pada switch akan dimulai dari konstanta-1. Kalau nilai konstanta-1 cocok
dengan ekspresi maka pernyataan-1 dijalankan. Kata kunci break harus disertakan
di bagian akhir setiap pernyataan case, yang akan mengarahkan eksekusi ke akhir
switch.
 Kalau ternyata pernyataan-1 tidak sama dengan nilai ekspresi, pengujian
dilanjutkan pada konstanta-2, dan berikutnya serupa dengan pengujian pada
konstanta-1.
 Jika sampai pada pengujian case yang terakhir ternyata tidak ada kecocokan, maka
pernyataan yang mengikuti kata kunci default yang akan dieksekusi. Kata kunci
default ini bersifat opsional.
 Tanda kurung kurawal tutup (}) menandakan akhir dari proses penyeleksian kondisi
case.
Di bawah ini contoh program pemakaian pernyataan switch untuk menggantikan if-else
bertingkat pada program kalkulator1.c di atas.

38
/* File program : kalkulator2.c
Contoh penggunaan pernyataan switch untuk mengimplementasikan
kalkulator sederhana */

#include <stdio.h>

main()
{
int valid_operator = 1;
char operator;
float number1, number2, result;

printf("Masukkan 2 buah bilangan dan sebuah operator\n");


printf("dengan format : number1 operator number2\n\n");
scanf("%f %c %f", &number1, &operator, &number2);

switch(operator) {
case '*' : result = number1 * number2; break;
case '/' : result = number1 / number2; break;
case '+' : result = number1 + number2; break;
case '-' : result = number1 - number2; break;
default : valid_operator = 0;
}

if(valid_operator)
printf("%g %c %g is %g\n", number1, operator,
number2,result);
else
printf("Invalid operator!\n");
}

Contoh eksekusi :
Masukkan 2 buah bilangan dan sebuah operator
Dengan format : number1 operator number2

23.2 = 12
invalid operator !

Kesimpulan :
 Operator kondisi adalah operator yang digunakan untuk menghasilkan kondisi benar
(true) dan salah (false), yang terdiri atas operator relasi dan operator logika.
 Operator relasi biasa dipakai untuk membandingkan dua buah nilai.
 Operator logika biasa dipakai untuk menghubungkan ekspresi relasi.

39
 Untuk penyeleksian kondisi dalam rangka pengambilan keputusan bisa digunakan
salah satu dari pernyataan berikut ini :
a. Pernyataan if, bentuk umumnya :

if (kondisi )
pernyataan;

b. Pernyataan if-else, bentuk umumnya :

if (kondisi)
pernyataan-1;
else
pernyataan-2;
c. Pernyataan if di dalam if, bentuk umumnya :

if (kondisi-1)
if (kondisi-2)
.
.
if(kondisi-n)
pernyataan;
else
pernyataan;
.
.
else
pernyataan;
else
pernyataan;

d. Pernyataan else-if, bentuk umumnya :

if (kondisi-1)
pernyataan-1;
else if (kondisi-2)
pernyataan-2;
.
.
else if(kondisi-n)
pernyataan-n;
else
pernyataan-(n+1);

40
e. Pernyataan switch, bentuk umumnya :

switch (ekspresi)
{
case konstanta-1:
pernyataan-1;
......
break;
case konstanta-2:
.
.
.
case konstanta-n:
pernyataan-n;
.......
break;
default:
.......
.......
break;
}

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Gunakan statemen if untuk membandingkan nilai dari sebuah variabel integer (sum)
dengan nilai 65. Jika lebih kecil, maka tampilkan pesan : “Maaf, Anda harus
mencoba lagi!”.

2. Jika variabel total sama dengan variabel tebak, cetaklah nilai dari total, jika tidak
sama, maka cetaklah nilai dari tebak.

3. Jika variabel sum sama dengan 10 dan variabel total kurang dari 20, maka tampilkan
pesan : “Tidak sesuai!”

4. Jika variabel flag sama dengan 1 atau variabel letter bukan ‘X’, maka assign nilai 0
kepada variabel exit_flag, jika tidak, maka set exit_flag sama dengan 1.

5. Tulislah kembali pernyataan-pernyataan di bawah ini dengan menggunakan


pernyataan switch

if( letter == 'X' )

41
sum = 0;
else if ( letter == 'Z' )
valid_flag = 1;
else if( letter == 'A' )
sum = 1;
else
printf("Unknown letter -->%c\n", letter );

BAB IV
PENGULANGAN PROSES

4.1. Pernyataan for


Mengulang suatu proses merupakan tindakan yang banyak dijumpai dalam
pemrograman. Pada semua bahasa pemrograman, pengulangan proses ditangani dengan
suatu mekanisme yang disebut loop. Dengan menggunakan loop, suatu proses yang
berulang misalnya menampilkan tulisan yang sama seratus kali pada layar dapat
diimpelementasikan dengan kode program yang pendek.
Pernyataan pertama yang digunakan untuk keperluan pengulangan proses adalah
pernyataan for. Bentuk pernyataan ini :

for (ungkapan1; ungkapan2; ungkapan3)


pernyataan;

Kegunaan dari masing-masing ungkapan pada pernyataan for.


 Ungkapan1 : digunakan untuk memberikan inisialisasi terhadap variabel pengendali
loop.
 Ungkapan2 : dipakai sebagai kondisi untuk keluar dari loop.
 Ungkapan3 : dipakai sebagai pengatur kenaikan nilai variabel pengendali loop.
Ketiga ungkapan dalam for tersebut harus dipisahkan dengan tanda titik koma (;). Dalam
hal ini pernyatan bisa berupa pernyataan tunggal maupun jamak. Jika pernyataannya

42
berbentuk jamak, maka pernyataan-pernyataan tersebut harus diletakkan di antara
kurung kurawal buka ({) dan kurung kurawal tutup (}), sehingga formatnya menjadi :

for (ungkapan1; ungkapan2; ungkapan3)


{
pernyataan;
pernyataan;
.
.
.
}

Contoh penggunaan for, misalnya untuk menampilkan deretan angka sebagai berikut :
20
30
40
50
.
.
.
100

Untuk keperluan ini, pernyataan for yang digunakan berupa :

for (bilangan = 20; bilangan <= 100; bilangan += 10)


printf("%d\n", bilangan);

Kalau digambarkan dalam bentuk diagram alir, akan terlihat sbb :

Pernyataan

bilangan Salah
<=100

Benar

Cek bilangan

43
bilangan =

bilangan+10

Keluar loop

Gambar 4.1 Diagram alir for

/* File program : for1.c


Contoh pemakaian for untuk membentuk deret naik */

#include <stdio.h>

main()
{
int bilangan;

for(bilangan = 20; bilangan <= 100; bilangan += 10)


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

Contoh eksekusi :
20
30
40
50
60
70
80
90
100

Pada program di atas, kenaikan terhadap variabel pengendali loop sebesar 10 (positif),
yang dinyatakan dengan ungkapan

bilangan += 10

yang sama artinya dengan

44
bilangan = bilangan + 10

Pada contoh yang melibatkan pernyataan for di atas, kenaikan variabel


pengendali loop berupa nilai positif. Sebenarnya kenaikan terhadap variabel pengendali
loop bisa diatur bernilai negatif. Cara ini dapat digunakan untuk memperoleh deret
sebagai berikut :
60
50
40
30
20
10

Untuk itu selengkapnya program yang dibutuhkan adalah sebagai berikut :

/* File program : for2.c


Contoh pemakaian for untuk membentuk deret turun */

#include <stdio.h>

main()
{
int bilangan;

for (bilangan = 60; bilangan >= 10; bilangan -= 10)


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

Contoh eksekusi :
60
50
40
30
20
10

Kadang-kadang dijumpai adanya pernyataan for yang tidak mengandung bagian


ungkapan yang lengkap (beberapa ungkapan dikosongkan). Dengan cara ini, pernyataan

for (bilangan = 20; bilangan <= 100; bilangan += 10)


printf(“%d\n”, bilangan);

45
dapat ditulis menjadi :

bilangan = 20; /* inisialisasi di luar for */


for ( ; bilangan <= 100; )

ungkapan
kosong

{
printf(“%d\n”, bilangan);
bilangan += 10;
}

Tampak bahwa ungkapan yang biasa dipakai untuk inisialisasi variabel pengendali loop
tak ada. Sebagai gantinya pengendalian loop diatur sebelum pernyataan for, berupa
bilangan = 20;

Pengosongan ini juga dilakukan pada ungkapan yang biasa dipakai untuk menaikkan nilai
variabel pengendali loop. Sebagai gantinya, di dalam tubuh loop diberikan pernyataan
untuk menaikkan nilai variabel pengendali loop, yaitu berupa

bilangan += 10;

Ungkapan yang tidak dihilangkan berupa bilangan <=100. Ungkapan ini tetap disertakan
karena dipakai sebagai kondisi untuk keluar dari loop.
Sesungguhnya ungkapan yang dipakai sebagai kondisi keluar dari loop juga bisa
dihilangkan, sehingga bentuknya menjadi

for (;;)
pernyataan

Suatu pertanyaan mungkin timbul “Lalu bagaimana caranya kalau ingin keluar dari loop
pada bentuk di atas?”. Caranya adalah dengan menggunakan pernyataan yang dirancang
khusus untuk keluar dari loop. Mengenai hal ini akan dibahas pada sub bab yang lain.

4.2. Pernyataan while


Pada pernyataan while, pengecekan terhadap loop dilakukan di bagian awal
(sebelum tubuh loop). Lebih jelasnya, bentuk pernyataan while adalah sebagai berikut :

46
while (kondisi)
pernyataan;

dengan pernyataan dapat berupa pernyataan tunggal, pernyataan majemuk ataupun


pernyataan kosong. Proses pengulangan terhadap pernyataan dijelaskan pada gambar
berikut :

Kondisi Salah

Benar

Pernyataan

Keluar loop

Gambar 4.2 Diagram alir while

Dengan melihat gambar 4.2, tampak bahwa ada kemungkinan pernyataan yang
merupakan tubuh loop tidak dijalankan sama sekali, yaitu kalau hasil pengujian kondisi
while yang pertama kali ternyata bernilai salah.
Contoh pemakaian while misalnya untuk mengatur agar tombol yang ditekan oleh
pemakai program berupa salah satu diantara 'Y','y', 'T' atau 't'. Impelementasinya :

/*File program : pilihan.c


Untuk membaca tombol Y atau T */

47
#include <stdio.h>

main()
{
char pilihan;
/* diberi nilai salah lebih dahulu */
int sudah_benar = 0;

printf("Pilihlah Y atau T.\n");

/* program dilanjutkan jika tombol Y,y,T atau t ditekan */

while(!sudah_benar)
{
pilihan = getchar(); /* baca tombol */
sudah_benar = (pilihan == 'Y') || (pilihan == 'y')||
(pilihan == 'T') || (pilihan == 't');
}

/* memberi keterangan tentang pilihan */


switch(pilihan)
{
case 'Y':
case 'y':
puts("\nPilihan anda adalah Y");
break;
case 'T':
case 't':
puts("\nPilihan anda adalah T");
}
}

Contoh eksekusi :
Pilihlah Y atau T
Pilihan anda adalah Y

Inisialisasi terhadap variabel sudah_benar yang akan dijalankan pada kondisi while
dengan memberi nilai awal bernilai false (sudah_benar = 0) dimaksudkan agar tubuh
loop

{
pilihan = getchar( ); /* baca tombol */
sudah_benar = (pilihan == 'Y') || (pilihan== 'y')||
(pilihan == 'T') || (pilihan == 't');
}

dijalankan minimal sekali.

48
Contoh lain pemakaian while dapat dilihat pada program yang digunakan untuk
menghitung banyaknya karakter dari kalimat yang dimasukkan melalui keyboard
(termasuk karakter spasi). Untuk mengakhiri pemasukan kalimat, tombol ENTER (‘\n’)
harus ditekan. Karena itu, tombol ENTER inilah yang dijadikan kondisi penghitungan
jumlah spasi maupun karakter seluruhnya. Lengkapnya, kondisi yang dipakai dalam
while berupa :

while((kar = getchar()) != '\n')

Ungkapan di atas mempunyai arti :


 Bacalah sebuah karakter dan berikan ke variabel kar
 Kemudian bandingkan apakah karakter tersebut = ‘\n’ (ENTER)
Ungkapan menghasilkan nilai benar jika tombol yang ditekan bukan ENTER. Pada
program kalau tombol yang ditekan bukan ENTER , maka :
 Jumlah karakter dinaikkan sebesar satu melalui pernyataan : jumkar++;
 Kalau karakter berupa SPASI, maka jumlah spasi dinaikkan sebesar satu, melalui
pernyataan : if (kar == ‘ ‘) jumspasi++;

/* File program : jumkar.c


Menghitung jumlah kata dan karakter dalam suatu kalimat */

#include <stdio.h>

main()
{
char kar;
int jumkar = 0, jumspasi = 0;

puts("Masukkan sebuah kalimat dan akhiri dgn ENTER.\n");


puts("Saya akan menghitung jumlah karakter ");
puts("pada kalimat tersebut.\n");

while((kar = getchar()) != '\n')


{
jumkar++;
if (kar == ' ') jumspasi++;
}

printf("\nJumlah karakter = %d", jumkar);


printf("\nJumlah SPASI = %d\n\n", jumspasi);
}

49
Contoh eksekusi :
Masukkan sebuah kalimat, akhiri dgn ENTER.
Saya akan menghitung jumlah karakter pada kalimat tersebut.

Belajar bahasa C sangat menyenangkan

Jumlah karakter = 36
Jumlah SPASI = 4

4.3. Pernyataan do-while


Bentuk pernyataan do-while

do
pernyataan;
Pada pernyataan
while do-while, tubuh loop berupa pernyataan,dengan pernyataan bisa
(kondisi)
berupa pernyataan tunggal, pernyataan majemuk ataupun pernyataan kosong. Pada
pernyataan do, mula-mula pernyataan dijalankan. Selanjutnya, kondisi diuji. Sendainya
kondisi bernilai benar, maka pernyataan dijalankan lagi, kemudian kondisi diperiksa
kembali, dan seterusnya. Kalau kondisi bernilai salah pada saat dites, maka pernyataan
tidak dijalankan lagi. Untuk lebih jelasnya dapat dilihat pada Gambar 4.3. Berdasarkan
Gambar 4.3 terlihat bahwa tubuh loop minimal akan dijalankan sekali.

Pernyataan Tubuh loop

Benar Kondisi

Salah

Keluar loop

Gambar 4.3 Diagram alir do-while

Program berikut memberikan contoh pemakaian do-while untuk mengatur


penampilan tulisan "BAHASA C" sebanyak sepuluh kali. Contoh:

50
i = 0;
do
{
puts("BAHASA C");
i++;
} while(i<10);

Pada program di atas, variabel pencacah dipakai untuk menghitung jumlah tulisan yang
sudah ditampilkan pada layar. Selama nilai pencacah kurang dari 10, maka perintah

puts("BAHASA C");

akan dilaksanakan kembali


Penanganan pembacaan tombol pada contoh program pilihan.c yang memakai
while di atas, kalau diimplementasikan dengan memakai do-while adalah sebagai berikut

/* File program : pilihan2.c


Untuk membaca tombol Y atau T */

#include <stdio.h>

main()
{
char pilihan;
int sudah_benar;

printf("Pilihlah Y atau T.\n");

/* program dilanjutkan kalau tombol Y,y,T atau t ditekan */


do
{
pilihan = getchar( ); /* baca tombol */
sudah_benar = (pilihan == 'Y') || (pilihan== 'y')||
(pilihan == 'T') || (pilihan == 't');
} while(! sudah_benar);

/* memberi keterangan tentang pilihan */


switch(pilihan)
{
case 'Y':
case 'y':
puts("\nPilihan anda adalah Y");
break;
case 'T':
case 't':

51
puts("\nPilihan anda adalah T");
}
}

Contoh eksekusi :
Pilihlah Y atau T
Pilihan anda adalah T

Mula-mula tombol dibaca dengan menggunakan getchar() dan kemudian diberikan ke


variabel pilihan. Sesudah itu, variabel sudah_benar akan diisi dengan nilai benar (1) atau
salah (0) tergantung dari nilai pilihan. Kalau pilihan berisi salah satu diantara ‘Y’,‘y’, ‘T’
atau ‘t’, maka sudah berisi salah satu diantara ‘Y’, ‘y’, ‘T’ atau ‘t’, maka sudah_benar
akan berisi benar. Nilai pada vaiabel sudah_benar ini selanjutnya dijadikan sebagai
kondisi do-while. Pengulangan terhadap pembacaan tombol akan dilakukan kembali
selama sudah_benar benilai salah.

4.4. Pernyataan break.


Pernyataan break sesungguhnya telah diperkenalkan pada pernyataan switch.
Pernyataan ini berfungsi untuk keluar dari loop for, do-while dan while. Sedangkan pada
switch yaitu untuk menuju ke akhir (keluar dari) struktur switch. Sebagai contoh dapat
dilihat pada gambar 4.4. Kalau pernyataan break dijalankan maka eksekusi akan
dilanjutkan ke pernyataan yang terletak sesudah akhir tubuh loop for.

for ( ; ; )
{
.
.

if ( …… )
break;
.
.
} /* akhir tubuh loop for */

puts(“\nSelesai…”);

Gambar 4.4 Ilustrasi pengaruh break

52
Pada contoh potongan program berikut, pembacaan dan penampilan terhadap
tombol yang ditekan akan berakhir kalau tombol yang ditekan adalah ENTER (‘\n’).
Pernyataan yang digunakan untuk keperluan ini :

if (kar == ‘\n’)
break; /* keluar dari loop for */

Yang menyatakan “Jika tombol yang ditekan berupa ENTER, maka keluarlah dari loop
for”. Untuk lebih jelasnya, perhatikan program di bawah ini.

/* File program : tamat.c


Pemakaian break untuk keluar dari looping */

#include <stdio.h>

main()
{
char kar;

printf("Ketik sembarang kalimat");


printf(" dan akhiri dengan ENTER\n\n");

for ( ; ; )
{
kar = getchar();
if(kar == '\n')
break;
}
printf("Selesai\n");
}

Contoh eksekusi :
Ketik sembarang kalimat dan akhiri dengan ENTER :

Menulis apa saja


Selesai

Jika pernyataan break berada dalam loop yang bertingkat (nested loop), maka pernyataan
break hanya akan membuat proses keluar dari loop yang bersangkutan (tempat break
dituliskan), bukan keluar dari semua loop.

4.5. Pernyataan Continue

53
Pernyataan continue digunakan untuk mengarahkan eksekusi ke iterasi (proses)
berikutnya pada loop yang sama. Pada do-while dan while, pernyataan continue
menyebabkan eksekusi menuju ke kondisi pengujian pengulangan, seperti yang
dilukiskan pada Gambar 4.5. Pada loop for, pernyataan contunue menyebabkan bagian
penaik variabel pengendali loop dikerjakan (ungkapan3 pada struktur for) dan kondisi
untuk keluar dari loop for (ungkapan2 pada struktur for) diuji kembali.
Program ini digunakan untuk memasukkan data harus diulangi dan hal ini
dikendalikan dengan continue. Untuk mengakhiri pemasukan data, data yang dimasukkan
harus bernilai kurang dari 0. Perlu diketahui kondisi bernilai 1.

while (kondisi) do
{ {
continue; continue;
} } while (kondisi)

Gambar 4.5 Pengaruh continue pada while dan do-while

Menyatakan bahwa kondisi selalu dianggap benar. Untuk keluar dari loop, pernyataan
yang digunakan berupa break.
Pengaruh continue pada loop for diperlihatkan pada dibawah ini. Program ini
dipakai untuk menampilkan bilangan ganjil yang terletak antara 7 sampai dengan 25,
kecuali 15.

/* File program : ganjil.c


menampilkan bilangan ganjil antara 7 - 25 kecuali 15 */

#include <stdio.h>

main()
{
int x;

for (x = 7; x <= 25; x += 2)


{

54
if (x == 15)
continue;
printf("%4d", x);
}
printf("\n");
}

Contoh eksekusi :
7 9 11 13 17 19 21 23 25

Pada program di atas, untuk menghindari agar nilai 15 tidak ditampilkan ke layar,
pernyataan yang digunakan berupa

if ( x == 15)
continue;

Artinya, jika kondisi x == 15 bernilai benar, pernyataan continue menyebabkan


pernyataan sisanya yaitu

printf(“%d”,x);

diabaikan dan eksekusi diarahkan kepada ungkapan :

x += 2

dan kemudian menguji kondisi :

x <= 25

Pada program di atas, pernyataan :

for (x = 7; x <= 25; x += 2)


{
if (x == 15)
continue;
printf("%4d", x);
}

dapat ditulis dalam bentuk lain sebagai berikut :

for (x = 7; x <= 25; x += 2)

55
if (x != 15)
printf(“%4d”, x);

4.6. Loop Di Dalam Loop


Dalam suatu loop bisa terkandung loop yang lain. Loop yang terletak di dalam loop
biasa disebut dengan loop di dalam loop (nested loop). Salah satu contoh nested loop
misalnya pada permasalahan untuk membuat tabel perkalian:

1 2 3 4 5 6 7 8
1 1 2 3 4 5 6 7 8
2 2 4 6 8 10 12 14 16
3 3 6 9 12 15 18 21 24
4 4 8 12 16 20 24 28 32
5 5 10 15 20 25 30 35 40
6 6 12 18 24 30 36 42 48
7 7 14 21 28 35 42 49 56
8 8 16 24 32 40 48 56 64

Implementasi dalam program selengkapnya adalah sebagai berikut :

/* File program : tblkali.c


Loop for bersarang untuk membuat tabel perkalian */

#include <stdio.h>
#define MAKS 8

main()
{
int baris, kolom, hasil_kali;

for (baris = 1; baris <= MAKS; baris++)


{

56
for (kolom = 1; kolom <= MAKS; kolom++)
{
hasil_kali = baris * kolom;
printf ("%2d", hasil_kali);
}
printf("\n"); /* pindah baris */
}
}

Bagian yang terletak dalam bingkai di depan dapat dapat diperoleh melalui

for (baris = 1; baris <= MAKS; baris++)


{
hasil_kali = baris * kolom;
printf (“%2d”, hasil_kali);
}

dengan MAKS didefinisikan bernilai 8. Bagian loop yang terdalam :


for (kolom = 1; kolom <= MAKS; kolom++)
{
hasil_kali = baris * kolom;
printf (“%2d”, hasil_kali);
}

digunakan untuk mencetak suatu deret hasil perkalian dalam satu baris. Untuk berpindah
ke baris berikutnya, pernyataan yang digunakan yaitu

printf(“\n”);

Adapun pencetakan untuk semua baris dikendalikan melalui

for (baris = 1; baris <= MAKS; baris++)

Pernyataan di atas mempunyai arti “dari baris ke-1 sampai dengan baris ke-MAKS”.

4.7. Pernyataan goto


Pernyataan goto merupakan intruksi untuk mengarahkan eksekusi ke pernyataan
yang diawali dengan suatu label. Label sendiri berupa suatu pengenal (identifier) yang
diikuti dengan tanda titik dua (:)
Contoh pemakaian goto ditujukan pada program dibawah ini :
Pernyataan

57
goto cetak;

Mengisyaratkan agar eksekusi dilanjutkan ke pernyataan yang diawali dengan label

cetak :

Pernyataan

if (++pencacah <= 10)


goto cetak;

Mempunyai arti :
 Naikkan nilai pencacah sebesar 1
 Kemudian, jika pencacah kurang dari atau sama dengan 10 maka eksekusi menuju ke
label cetak.
Penerapan goto biasanya dilakukan pada loop di dalam loop (nested loop), dengan
tujuan memudahkan untuk keluar dari loop terdalam menuju ke pernyataan yang
terletak di luar loop terluar.

4.8. Menggunakan exit ( ) Untuk Menghentikan Eksekusi Program.


Suatu eksekusi program dapat dihentikan (secara normal) melalui pemanggilan
fungsi exit( ). Hal ini biasa dilakukan, jika di dalam suatu eksekusi terdapat suatu kondisi
yang tak dikehendaki. Prototipe dari fungsi exit() didefinisikan pada file stdlib.h, yang
memiliki deklarasi sebagai berikut :

void exit(int status);

Menurut kebiasaan, nilai nol diberikan pada argumen exit() untuk menunjukkan
penghentian program yang normal. Sedangkan untuk menunjukkan kesalahan, nilai yang
diberikan pada argumen fungsi diisi dengan nilai bukan-nol. Pada contoh program
berikut, eksekusi program akan dihentikan hanya jika tombol ‘X’ ditekan

/* File program : keluar.c


Pemakaian exit() untuk menghentikan eksekusi program */

#include <stdio.h>
#include <stdlib.h>

58
main()
{
char kar;

printf("Tekanlah X untuk menghentikan program.\n");

for ( ; ;)
{
while ((kar = getchar()) == 'X')
exit(0);
}
}

Kesimpulan :
 Pada semua bahasa pemrograman, pengulangan proses ditangani dengan suatu
mekanisme yang disebut loop.
 Pernyataan-pernyataan yang bisa digunaan untuk keperluan pengulangan proses
(looping) adalah :
a. Pernyataan for, dengan bentuk umum sebagai berikut :

for (ungkapan1; ungkapan2; ungkapan3)


pernyataan;

Jika pernyataannya berbentuk jamak, maka pernyataan-pernyataan tersebut


harus diletakkan di antara kurung kurawal buka ({) dan kurung kurawal tutup
(})
b. Pernyataan while, dengan bentuk umum sebagai berikut :

while (kondisi)
pernyataan;

c. Pernyataan do-while, dengan bentuk umum sebagai berikut :

do
pernyataan;
while (kondisi)

59
 Pernyataan break berfungsi untuk keluar dari loop for, do-while dan while.
 Pernyataan continue digunakan untuk mengarahkan eksekusi ke iterasi (proses)
berikutnya pada loop yang sama.
 Dalam suatu loop bisa terkandung loop yang lain (nested loop).
 Pernyataan goto merupakan intruksi untuk mengarahkan eksekusi ke pernyataan
yang diawali dengan suatu label. Label sendiri berupa suatu pengenal (identifier)
yang diikuti dengan tanda titik dua (:)
 Suatu eksekusi program dapat dihentikan (secara normal) melalui pemanggilan
fungsi exit( ). Hal ini biasa dilakukan, jika di dalam suatu eksekusi terdapat suatu
kondisi yang tak dikehendaki.

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Gunakan loop for untuk menampilkan nilai 1 sampai dengan 10 dalam baris-baris
yang terpisah.

2. Gunakan loop for untuk mendapatkan tampilan sbb :

1
22
333
4444
55555

3. Gunakan loop for untuk menjumlahkan seluruh bilangan antara 10 sampai dengan
100 ke dalam sebuah variabel total. Asumsikan bahwa variabel total tidak
diinisialisasi terlebih dahulu dengan nilai nol.

4. Gunakan loop for untuk menampilkan seluruh karaker dari A sampai dengan Z dalam
baris-baris yang terpisah.

5. Hitunglah bilangan triangular dari masukan pengguna, yang dibaca dari keyboard
dengan menggunakan scanf(). Bilangan triangular adalah penjumlahan dari bilangan

60
masukan dengan seluruh bilangan sebelumnya, sehingga bilangan triangular dari 7
adalah : 7 + 6 + 5 + 4 + 3 + 2 + 1

6. Gunakan loop while untuk menampilkan bilangan integer antara 1 sampai dengan 10
di layar sbb : 123456768910

7. Gunakan nested while loop untuk mendapatkan keluran sbb :

1
22
333
4444
55555

BAB V
FUNGSI

Fungsi adalah suatu bagian dari program yang dirancang untuk melaksanakan
tugas tertentu dan letaknya dipisahkan dari program yang menggunakannya. Elemen
utama dari program bahasa C berupa fungsi-fungsi, dalam hal ini program dari bahasa C
dibentuk dari kumpulan fungsi pustaka (standar) dan fungsi yang dibuat sendiri oleh
pemrogram. Fungsi banyak digunakan pada program C dengan tujuan :
a. Program menjadi terstruktur, sehingga mudah dipahami dan mudah dikembangkan.
Dengan memisahkan langkah-langkah detail ke satu atau lebih fungsi-fungsi, maka
fungsi utama (main()) menjadi lebih pendek, jelas dan mudah dimengerti.
b. Dapat mengurangi pengulangan (duplikasi) kode. Langkah-langkah program yang
sama dan dipakai berulang-ulang di program dapat dituliskan sekali saja secara
terpisah dalam bentuk fungsi-fungsi. Selanjutnya bagian program yang membutuhkan
langkah-langkah ini tidak perlu selalu menuliskannya, tetapi cukup memanggil
fungsi-fungsi tersebut.

61
5.1. Dasar Fungsi
Fungsi standar C yang mengemban tugas khusus contohnya adalah ;
 printf() , yaitu untuk menampilkan informasi atau data ke layar.
 scanf() , yaitu untuk membaca kode tombol yang diinputkan.

Pada umumnya fungsi memerlukan nilai masukan atau parameter yang disebut
sebagai argumen. Nilai masukan ini akan diolah oleh fungsi. Hasil akhir fungsi berupa
sebuah nilai (disebut sebagai return value atau nilai keluaran fungsi). Oleh karena itu
fungsi sering digambarkan sebagai "kotak gelap" seperti ditunjukkan pada gambar di
bawah ini.

Parameter Keluaran
Fungsi
FUNGSI

Gambar 5.1 Fungsi sebagai sebuah kotak gelap

Penggambaran sebagai kotak gelap di antaranya menjelaskan bahwa bagian


dalam fungsi bersifat pribadi bagi fungsi. Tak ada suatu pernyataan di luar fungsi yang
bisa mengakses bagian dalam fungsi, selain melalui parameter (atau variabel eksternal
yang akan dibahas belakangan). Misalnya melakukan goto dari pernyataan di luar fungsi
ke pernyataan dalam fungsi adalah tidak diperkenankan.
Bentuk umum dari definisi sebuah fungsi adalah sebagai berikut ;

tipe-keluaran-fungsi nama-fungsi (deklarasi argumen)


{
tubuh fungsi
}

62
Keterangan :
 tipe-keluaran-fungsi, dapat berupa salah satu tipe data C, misalnya char atau int.
Kalau penentu tipe tidak disebutkan maka dianggap bertipe int (secara default).
 tubuh fungsi berisi deklarasi variabel (kalau ada) dan statemen-statemen yang akan
melakukan tugas yang akan diberikan kepada fungsi yang bersangkutan. Tubuh
fungsi ini ditulis di dalam tanda kurung kurawal buka dan kurung kurawal tutup.

Sebuah fungsi yang sederhana bisa saja tidak mengandung parameter sama sekali
dan tentu saja untuk keadaan ini deklarasi parameter juga tidak ada. Contoh ;

inisialisasi()
{
return(0);
}

Pada fungsi di atas :


 tipe keluaran fungsi tidak disebutkan, berarti keluaran fungsi ber tipe int.
 inisialisasi adalah nama fungsi
 Tanda () sesudah nama fungsi menyatakan bahwa fungsi tak memiliki parameter.
 Tanda { dan } adalah awal dan akhir fungsi
 return(0) merupakan sebuah pernyataan dalam tubuh fungsi.

Nama fungsi
Sepasang tanda kurung, tanpa argumen
inisialisasi() Tidak ada tanda koma
{ Awal fungsi
return(0); Tubuh fungsi
} Akhir fungsi

Gambar 5.2 Penjelasan definisi sebuah fungsi

5.2. Memberikan Nilai Keluaran Fungsi


Suatu fungsi dibuat untuk maksud menyelesaikan tugas tertentu. Suatu fungsi
dapat hanya melakukan suatu tugas saja tanpa memberikan suatu hasil keluaran atau
melakukan suatu tugas dan kemudian memberikan hasil keluaran. Fungsi yang hanya

63
melakukan suatu tugas saja tanpa memberikan hasil keluaran misalnya adalah fungsi
untuk menampilkan hasil di layar.
Dalam tubuh fungsi, pernyataan yang digunakan untuk memberikan nilai
keluaran fungsi berupa return. Sebagai contoh, pada fungsi inisialisasi() di atas terdapat
pernyataan

return(0);

merupakan pernyataan untuk memberikan nilai keluaran fungsi berupa nol.


Selengkapnya perhatikan program di bawah ini

/* File program : inisial.c


Contoh pembuatan fungsi */

int inisialisasi();

#include <stdio.h>

main()
{
int x, y;
x = inisialisasi();
printf("x = %d\n", x);
y = inisialisasi();
printf("y = %d\n", y);
}

int inisialisasi()
{
return(0);
}

Contoh eksekusi :
x = 0
y = 0

Program di atas sekaligus menjelaskan bahwa suatu fungsi cukup didefinisikan satu kali
tetapi bisa digunakan beberapa kali. Pada keadaan semacam ini seandainya tubuh fungsi
mengandung banyak pernyataan, maka pemakaian fungsi dapat menghindari duplikasi
kode dan tentu saja menghemat penulisan program maupun kode dalam memori.

64
main() int inisialisasi()
{ {
int x, y; return(0);
}
x = inisialisasi();
printf("x = %d\n", x);
y = inisialisasi(); definisi fungsi
printf("y = %d\n", y);
} pemanggilan fungsi

Gambar 5.3 Proses pemanggilan fungsi

Misalnya pada saat pernyataan

x = inisialisasi();

dijalankan, mula-mula eksekusi akan diarahkan ke fungsi inisialisasi(), selanjutnya


suatu nilai keluaran (hasil fungsi) akhir fungsi diberikan ke x. Proses yang serupa,
dilakukan untuk pernyataan

y = inisialisasi();

Bagi suatu fungsi, jika suatu pernyataan return dieksekusi, maka eksekusi
terhadap fungsi akan berakhir dan nilai pada parameter return akan menjadi keluaran
fungsi. Untuk fungsi yang tidak memiliki pernyataan return, tanda } pada bagian akhir
fungsi akan menyatakan akhir eksekusi fungsi.
Di bawah ini diberikan contoh sebuah fungsi yang mengandung dua buah
pernyataan return. Fungsi digunakan untuk memperoleh nilai minimum di antara 2 buah
nilai yang menjadi parameternya.

int minimum(int x, int y)


{
if (x < y)
return(x);
else
return(y);
}

Pada fungsi di atas terdapat dua buah parameter berupa x dan y. Oleh karena itu fungsi
juga mengandung bagian untuk mendeklarasikan parameter, yang menyatakan x dan y

65
bertipe int. Adapun penentuan nilai keluaran fungsi dilakukan pada tubuh fungsi, berupa
pernyataan

if (x < y)
return(x);
else
return(y);

yang menyatakan :
 jika x < y maka nilai keluaran fungsi adalah sebesar nilai x.
 untuk keadaan lainnya (x >= y) maka keluaran fungsi adalah sebesar y.

Selengkapnya perhatikan program di bawah ini.

/* File program : minimum1.c */

#include <stdio.h>

int minimum (int, int);

main()
{
int a, b, kecil;

printf("Masukkan nilai a : ");


scanf("%d", &a);
printf("Masukkan nilai b : ");
scanf("%d", &b);

kecil = minimum(a, b);


printf("\nBilangan terkecil antara %d dan %d adalah
%d\n\n", a, b, kecil);
}

int minimum(int x, int y)


{
if (x < y)
return(x);
else
return(y);
}

Contoh eksekusi :
Masukkan nilai a = 4
Masukkan nilai b = 2

66
Bilangan terkecil antara 4 dan 2 adalah 2

5.3. Fungsi Dengan Keluaran Bukan Integer


Untuk fungsi yang mempunyai keluaran bertipe bukan integer, maka fungsi
haruslah didefiniskan dengan diawali tipe keluaran fungsinya (ditulis di depan nama
fungsi). Sebagai contoh untuk menghasilkan nilai terkecil di antara dua buah nilai real,
maka definisinya berupa :

float minimum(float x, float y)


{
if (x < y)
return(x);
else
return(y);
}
Perhatikan, di depan nama minimum diberikan tipe keluaran fungsi berupa float.
Seluruh parameter sendiri juga didefinisikan dengan tipe float. Selengkapnya adalah
sebagai berikut :

/* File program : minimum2.c */

#include <stdio.h>

float minimum (float, float);

main()
{
float a, b, kecil;

printf("Masukkan nilai a : ");


scanf("%f", &a);
printf("Masukkan nilai b : ");
scanf("%f", &b);

kecil = minimum(a, b);


printf("\nBilangan terkecil antara %g dan %g adalah
%g\n\n", a, b, kecil);
}

float minimum(float x, float y)


{
if (x < y)
return(x);
else

67
return(y);
}

Contoh eksekusi :
Masukkan nilai a = 5.5
Masukkan nilai b = 6.23

Bilangan terkecil antara 5 dan 6.23 adalah 5.5

Khusus untuk fungsi yang dirancang tanpa memberikan nilai keluaran (melainkan
hanya menjalankan suatu tugas khusus) biasa didefinisikan dengan diawali kata kunci
void (di depan nama fungsi). Sebagai contoh perhatikan program di bawah ini.

/* File program : void.c


Contoh fungsi tanpa nilai keluaran (pamakaian void) */

#include <stdio.h>

void info_program(); /* deklarasi fungsi */

main()
{
info_program(); /* pemanggilan fungsi */
}

void info_program() /* definisi fungsi */


{
puts("==================================");
puts("Progam dibuat oleh Moh. Izzuddin ");
puts("Tanggal : 12 Juni 2001 ");
puts(" ");
puts("Selamat menggunakannya....... ");
puts("==================================");
}

Contoh eksekusi :
==================================
Progam dibuat oleh Moh. Izzuddin
Tanggal : 12 Juni 2001
Selamat menggunakannya.......
==================================

68
5.4. Prototipe Fungsi
Prototipe fungsi digunakan untuk menjelaskan kepada kompiler mengenai :
 tipe keluaran fungsi
 jumlah parameter
 tipe dari masing-masing parameter.

Bagi kompiler, informasi dalam prototipe akan dipakai untuk memeriksa


keabsahan (validitas) parameter dalam pemanggilan fungsi. Salah satu keuntungannya
adalah, kompiler akan melakukan konversi seandainya antara tipe parameter dalam
fungsi dan parameter saat pemanggilan fungsi tidak sama, atau akan menunjukan
kesalahan bila jumlah parameter dalam definisi dan saat pemanggilan berbeda.
Contoh prototipe fungsi;

float jumlah (float x, float y);

atau

float jumlah (float, float);

Penjelasannya adalah sbb :

Nama fungsi
float jumlah (float, float); Diakhiri dengan titik koma
Tipe parameter kedua
Tipe parameter pertama
Tipe keluaran fungsi

Gambar 5.4 Prototipe fungsi

Perhatikan contoh program di bawah ini.

/* File program : jumlah.c


contoh pemakaian prototipe fungsi */

#include <stdio.h>

float jumlah(float, float); /* prototipe fungsi */

69
main()
{
float a, b,c;

printf("Masukkan nilai a : ");


scanf("%f", &a);
printf("Masukkan nilai b : ");
scanf("%f", &b);

c = jumlah(a, b);
printf("\nHasil penjumlahan a + b = %g\n", c);
}

float jumlah(float x, float y) /* definisi fungsi */


{
return(x + y);
}

Contoh eksekusi :
Masukkan nilai a : 4.5
Masukkan nilai b : 7.65

Hasil penjumlahan a + b = 12.15

Untuk fungsi yang tidak memiliki argumen (contoh program void.c), maka deklarasinya
adalah

void info_program(void);
menyatakan bahwa info_program()
tidak memiliki parameter
Catatan :
 Untuk fungsi-fungsi pustaka, prototipe dari fungsi-fungsi berada di file-file judulnya
(header file). Misalnya fungsi pustaka printf() dan scanf() prototipenya berada pada
file dengan nama stdio.h
 Untuk fungsi pustaka pencantuman pada prototipe fungsi dapat dilakukan dengan
menggunakan preprocessor directive #include.

5.5. Parameter Formal dan Parameter Aktual


Parameter formal adalah variabel yang ada pada daftar parameter dalam definisi
fungsi. Pada contoh program di atas misalnya, maka dalam fungsi jumlah() variabel x

70
dan y dinamakan sebagai parameter formal. Adapun parameter aktual adalah parameter
(tidak selalu berupa variabel) yang dipakai dalam pemanggilan fungsi.

main() float jumlah(float x, float y)


{ {
... return(x + y);
c = jumlah(a, b); }
...
}
parameter
formal
parameter
aktual
Gambar 5.5 Paramater formal dan parameter aktual

Pada pernyataan :
x = jumlah(a, b);
y = jumlah(20.1, 45.6);
a dan b merupakan parameter aktual dari fungsi jumlah() dalam hal ini parameter
berupa variabel. Demikian juga 20.1 dan 45.6 adalah parameter aktual, dalam hal ini
berupa konstanta. Bahkan bisa juga parameter aktual berupa ungkapan yang melibatkan
operator, misalnya :

printf("%g\n", jumlah(2+3, 3+6));

ungkapan

5.6. Cara Melewatkan Parameter


Ada dua cara untuk melewatkan parameter kedalam fungsi, yaitu berupa ;
 Pemanggilan dengan nilai (call by value)
 Pemanggilan dengan referensi (call by reference)

Pemanggilan dengan nilai merupakan cara yang dipakai untuk seluruh fungsi
buatan yang telah dibahas didepan. Pada pemanggilan dengan nilai, nilai dari parameter
aktual akan disalin ke parameter formal. Dengan cara ini nilai parameter aktual tidak bisa
dirubah sekalipun nilai parameter formal berubah. Untuk lebih jelasnya lihat pada fungsi
tukar() pada contoh berikut ini.

71
/* File program : tukar1.c
Untuk melihat pengaruh pemanggilan nilai pada fungsi untuk
penukaran dua data */

#include <stdio.h>

void tukar (int, int);

main()
{
int a,b;

a = 88;
b = 77;

printf("Nilai sebelum pemanggilan fungsi\n");


printf("a = %d b = %d\n", a, b);

tukar(a,b);

printf("\nNilai setelah pemanggilan fungsi\n");


printf("a = %d b = %d\n", a, b);
}

void tukar(int x, int y)


{
int z;

z = x;
x = y;
y = z;

printf("\nNilai di akhir fungsi tukar()\n");


printf("x = %d y = %d\n", x, y);
}

Contoh eksekusi :
Nilai sebelum pemanggilan fungsi
a = 88 b = 77

Nilai di akhir fungsi tukar()


x = 77 y = 88

Nilai setelah pemanggilan fungsi


a = 88 b = 77

72
Tampak bahwa sekeluarnya dari pemanggilan fungsi tukar(), variabel a dan b (yang
dilewatkan ke fungsi tukar() tidak berubah, walaupun pada fungsi tukar() telah terjadi
penukaran antara parameter x dan y . Mengapa hal ini bisa terjadi ? Sebab x hanyalah
salinan dari a dan y adalah salinan dari b (Lihat gambar 5.6 di bawah ini). Pada saat
pemanggilan fungsi, maka :
 x bernilai 88 (nilai a)
 y bernilai 77 (nilai b)

Sesudah pernyataan-pernyataan berikut dijalankan, maka :

z = x;
x = y;
y = z;

x akan bernilai 77 dan y bernilai 88.

x y z x y z
88 77 ? 88 77 88
mula-mula sesudah : z = x

x y z x y z
77 77 88 77 88 88
sesudah : x = y sesudah : y = z

Gambar 5.6 Proses penukaran nilai

Gambar 5.6 menjelaskan bahwa a dan b tidak berubah. Yang berubah hanyalah
parameter x dan y.
Pemanggilan dengan referensi (call by reference) merupakan upaya untuk
melewatkan alamat dari suatu variabel ke dalam fungsi. Cara ini dapat dipakai untuk
mengubah isi suatu variabel di luar fungsi dengan pelaksanaan pengubahan dilakukan di
dalam fungsi. Sebagai contoh perhatikan program tukar2.c yang merupakan modifikasi
dari tukar1.c. Perubahan yang pertama terletak dalam definisi fungsi, yang kini berupa

73
void tukar(int *px, int *py)
{
int z;

z = *px;
*px = *py;
*py = z;

printf("\nNilai di akhir fungsi tukar()\n");


printf("x = %d y = %d\n", *px, *py);
}

Adapun perubahan dalam parameter aktualnya menjadi :

tukar(&a,&b); /* alamat a dan alamat b */

Dalam deklarasi parameter

int *px, int *py


menyatakan bahwa px dan py adalah suatu variabel pointer. Yang dimaksudkan sebagai
variabel pointer adalah suatu variabel yang menunjuk ke variabel lain. Lebih jelasnya,
variabel pointer berisi alamat dari variabel lain.
Adapun pada pemanggilan fungsi, &a dan &b masing-masing berarti "alamat a"
dan "alamat b". Dengan pemanggilan seperti ini, hubungan antara variabel pointer px dan
py dengan variabel a dan b adalah seperti ditunjukkan pada gambar 5.7. Dalam hal ini, px
dikatakan menunjuk variabel a dan py menunjuk variabel b.

px py
alamat a alamat b

a b

Gambar 5.7
Variabel pointer px menunjuk variabel a dan variabel pointer py menunjuk variabel b

/* File program : tukar2.c

74
Untuk melihat pengaruh pemanggilan nilai pada fungsi untuk
penukaran dua data */

#include <stdio.h>

void tukar (int *px, int *py); /* prototype fungsi */

main()
{
int a,b;

a = 88;
b = 77;

printf("Nilai sebelum pemanggilan fungsi\n");


printf("a = %d b = %d\n", a, b);

tukar(&a,&b); /* alamat a dan alamat b */

printf("\nNilai setelah pemanggilan fungsi\n");


printf("a = %d b = %d\n", a, b);
}

void tukar(int *px, int *py)


{
int z;

z = *px;
*px = *py;
*py = z;

printf("\nNilai di akhir fungsi tukar()\n");


printf("x = %d y = %d\n", *px, *py);
}

Contoh eksekusi :
Nilai sebelum pemanggilan fungsi
a = 88 b = 77

Nilai di akhir fungsi tukar()


x = 77 y = 88

Nilai setelah pemanggilan fungsi


a = 77 b = 88

Setelah px menunjuk a dan py menunjuk b, proses penukaran isi a dan b dilakukan


dengan cara sebagai berikut :

75
z = *px; /* 1 */
*px = *py; /* 2 */
*py = z; /* 3 */

Pertama variabel z diisi dengan nilai yang ditunjuk oleh px. Kedua, yang ditunjuk oleh px
diisi dengan yang ditunjuk oleh py (berarti a diisi dengan b). Ketiga, yang ditunjuk oleh
py diberi nilai z. Dengan melalui tiga pernyataan di atas, nilai a dab b dapat diubah di
dalam fungsi.
Catatan : Pembahasan lebih lanjut mengenai pointer dapat dilihat pada bab VIII.

5.7. Penggolongan Variabel berdasarkan Kelas Penyimpanan


Suatu variabel, di samping dapat digolongkan berdasarkan jenis/tipe data juga
dapat diklasifikasikan berdasarkan kelas penyimpanan (storage class). Penggolongan
berdasarkan kelas penyimpanan berupa :
 variabel lokal
 variabel eksternal
 variabel statis
 variabel register

5.7.1. Variabel Lokal


Variabel lokal adalah variabel yang dideklarasikan dalam fungsi, dengan sifat :
 Secara otomatis diciptakan ketika fungsi dipanggil dan akan sirna (lenyap) ketika
eksekusi terhadap fungsi berakhir.
 Hanya dikenal oleh fungsi tempat variabel tersebut dideklarasikan
 Tidak ada inisialisasi secara otomatis (saat variabel diciptakan, nilainya tak
menentu).

Dalam banyak literatur, variabel lokal disebut juga dengan variabel otomatis.
Variabel yang termasuk dalam golongan ini bisa dideklarasikan dengan menambahkan
kata kuci auto di depan tipe-data variabel. Kata kunci ini bersifat opsional, biasanya
disertakan sebagai penjelas saja. Contoh variabel lokal ditunjukkan pada gambar 5.8.

void fung_x(void)
{
int x;

76
. x adalah variabel lokal bagi
. fungsi fung_x()
.
}
Gambar 5.8 Variabel lokal

Pada fung_x(), deklarasi

int x;

dapat ditulis menjadi

auto int x;

Penerapan variabel lokal yaitu bila variabel hanya dipakai oleh suatu fungsi (tidak
dimaksudkan untuk dipakai oleh fungsi yang lain). Pada contoh berikut, antara variabel i
dalam fungsi main() dan fung_1() tidak ada kaitannya, sebab masing-masing merupakan
variabel lokal.
/* File program : lokal.c */

#include <stdio.h>

void fung_1(void);

main()
{
int i = 20;

fung_1();
printf("nilai i di dalam main() = %d\n", i);
}

void fung_1(void)
{
int i = 11;

printf("nilai i di dalam fung_1() = %d\n", i);


}

Contoh eksekusi :
nilai i di dalam fung_1() = 11
nilai i di dalam main() = 20

77
5.7.2. Variabel Eksternal
Variabel eksternal merupakan variabel yang dideklarasikan di luar fungsi, dengan
sifat :
 dapat diakses oleh semua fungsi
 kalau tak diberi nilai, secara otomatis diinisialisasi dengan nilai sama dengan nol.

Contoh variabel eksternal ada pda program ekstern1.c yaitu berupa variabel i.
Pada pendeklarasian

int i = 273;

menyatakan bahwa i merupakan variabel eksternal dan diberi nilai awal sama denan
273. Nilai dari variabel i selanjutnya dapat diubah oleh fungsi tambah() maupun main().
Setiap fungsi tambah() dipanggil maka nilai i akan bertambah satu.

/* File program : ekstern1.c


Contoh program dengan variabel eksternal */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main()
{
printf("Nilai awal i = %d\n", i);
i += 7;
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
}

void tambah(void)
{
i++;
}

Contoh eksekusi :

78
Nilai awal i = 273
Nilai i kini = 280
Nilai i kini = 281
Nilai i kini = 282

Pada contoh di atas, terlihat bahwa i hanya dideklarasikan di bagian atas


program, dan tak dideklarasikan lagi dalam fungsi main() maupun tambah(). Oleh
karena i merupakan variabel eksternal maka dapat digunakan oleh kedua fungsi tsb.
Namun ada satu hal yang perlu diketahui, variabel eksternal haruslah dideklarasikan
sebelum definisi fungsi yang akan mempergunakannya.
Untuk memperjelas bahwa suatu variabel dalam fungsi merupakan variabel
eksternal, di dalam fungsi yang menggunakannya dapat mendeklarasikan variabel itu
kembali dengan menambahkan kata kunci extern di depan tipe data variabel. Sebagai
contoh, program ekstern1.c ditulis kembali menjadi seperti pada ekstern2.c.

/* File program : ekstern2.c


Contoh program yang menggunakan variabel eksternal dan memakai
kata kunci extern */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main()
{
extern int i; /* variabel eksternal */

printf("Nilai awal i = %d\n", i);


i += 7;
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
}

void tambah(void)
{
extern int i; /* variabel eksternal */

79
i++;
}

Contoh eksekusi :
Nilai awal i = 273
Nilai i kini = 280
Nilai i kini = 281
Nilai i kini = 282

Kalau dalam suatu program terdapat suatu variabel eksternal, suatu fungsi bisa
saja menggunakan nama variabel yang sama dengan variabel eksternal, namun
diperlakukan sebagai variabel lokal. Untuk lebih jelasnya perhatikan contoh program di
bawah ini.

/* File program : ekstern3.c


Contoh program yang menggunakan variabel eksternal dan variabel
lokal dengan nama yang sama */

#include <stdio.h>

int i = 273; /* variabel eksternal */

void tambah(void);

main()
{
extern int i; /* variabel eksternal */

printf("Nilai awal i = %d\n", i);


i += 7;
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
tambah();
printf("Nilai i kini = %d\n", i);
}

void tambah(void)
{
int i; /* variabel lokal */

i++;
}

Contoh eksekusi :

80
Nilai awal i = 273
Nilai i kini = 280
Nilai i kini = 280
Nilai i kini = 280

Pada program di atas, bagi fungsi main() i adalah variabel eksternal. Namun bagi fungsi
tambah(), i merupakan variabel lokal, sebab pada fungsi ini i dideklarasikan tanpa kata
kunci extern. Hal ini terlihat jelas dengan mengamati hasil eksekusi program. Pernyataan:

i++;

Pada fungsi tambah() tidak mempengaruhi nilai i yang ditampilkan pada fungsi main()
(bandingkan dengan hasil eksekusi pada ekstern2.c).

5.7.3. Variabel Statis


Variabel statis dapat berupa variabel internal (didefinisikan di dalam fungsi)
maupun variabel eksternal. Sifat variabel ini :
 Kalau variabel statis bersifat internal, maka variabel hanya dikenal oleh fungsi tempat
variabel dideklarasikan
 Kalau variabel statis bersifat eksternal, maka variabel dapat dipergunakan oleh
semua fungsi yang terletak pada file yang sama, tempat variabel statis dideklarasikan
 Berbeda dengan variabel lokal, variabel statis tidak akan hilang sekeluarnya dari
fungsi (nilai pada variabel akan tetap diingat).
 Inisialisasi akan dilakukan hanya sekali, yaitu saat fungsi dipanggil yang pertama kali.
Kalau tak ada inisialisasi oleh pemrogram secara otomatis akan diberi nilai awal nol

Variabel statis diperoleh dengan menambahkan kata kunci static di depan tipe
data variabel. Sebagai contoh perhatikan program di bawah ini.

/* File program : statis.c


Contoh variabel statis */

#include <stdio.h>

void fung_y(void);

main()
{

81
int y = 20;

fung_y();
fung_y();
printf("Nilai y dalam main() = %d\n", y);
}

void fung_y(void)
{
static int y;

y++;
printf("Nilai y dalam fung_y() = %d\n", y);
}

Contoh eksekusi :
Nilai y dalam fung_y() = 1
Nilai y dalam fung_y() = 2
Nilai y dalam main() = 20

5.7.4. Variabel Register


Variabel register adalah variabel yang nilainya disimpan dalam register dan
bukan dalam memori RAM. Variabel yang seperti ini hanya bisa diterapkan pada variabel
yang lokal atau parameter formal, yang bertipe char atau int. Variabel register biasa
diterapkan pada variabel yang digunakan sebagai pengendali loop. Tujuannya untuk
mempercepat proses dalam loop. Sebab variabel yang dioperasikan pada register
memiliki kecepatan yang jauh lebih tinggi daripada variabel yang diletakkan pada RAM.
Contoh pemakaiannya bisa dilihat pada program di bawah ini.

/* File program : var_reg.c


Contoh variabel register */

#include <stdio.h>

main()
{
register int i; /* variabel register */
int jumlah = 0;

for(i = 1; i <= 100; i++)


jumlah = jumlah + i;

printf("1 + 2 + 3 + ... + 100 = %d\n", jumlah);

82
}

Contoh eksekusi :
1 + 2 + 3 + ... + 100 = 5050

5.8. Menciptakan Sejumlah Fungsi


Pada C, semua fungsi bersifat sederajat. Suatu fungsi tidak dapat didefinisikan di
dalam fungsi yang lain. Akan tetapi suatu fungsi diperbolehkan memanggil fungsi yang
lain, dan tidak tergantung kepada peletakan definisi fungsi pada program. Komunikasi
antara fungsi dalam C ditunjukkan dalam gambar 5.9. Gambar tersebut menjelaskan
kalau suatu fungsi katakanlah fungsi_a() memanggil fungsi_b(), maka bisa saja
fungsi_b() memanggil fungsi_a(). Contoh program yang melibatkan fungsi yang
memanggil fungsi yang lain ada pada program kom_fung.c, yaitu fungsi_1() dipanggil
dalam main(), sedangkan fungsi_2() dipanggil oleh fungsi_1().

fungsi_a() fungsi_b()

fungsi_c()

Gambar 5.9 Komunikasi antar fungsi dalam C

/* File program : kom_fung.c


contoh fungsi yang memanggil fungsi yang lain */

#include <stdio.h>

void fungsi_1(void);
void fungsi_2(void);

main()
{
fungsi_1();
}

void fungsi_1()
{
puts("fungsi 1 dijalankan");

83
fungsi_2();
}

void fungsi_2()
{
puts("fungsi 2 dijalankan");
}

Contoh eksekusi :
fungsi 1 dijalankan
fungsi 2 dijalankan

5.9. Rekursi
Fungsi dalam C dapat dipakai secara rekursi, dalam artian suatu fungsi dapat
memanggil dirinya sendiri. Sebagai contoh penerapan fungsi rekursi yaitu untuk
menghitung nilai

n
x
dengan n berupa bilagnan bulat positif. Solusi dari persoalan ini dapat berupa :
n
 Jika n = 1, maka x = x
n n-1
 Selain itu maka x = x * x
Misalnya x = 2 dan n = 3, proses pemecahannya seperti diuraikan pada gambar 5.10.

23 = 2 * 22 22 = 2 * 21 21 = 2

8 4 2

Gambar 5.10 Pemecahan secara rekursi

Penuangan dalam bentuk program

/* File program : faktor.c


Contoh penerapan rekursi untuk memperoleh nilai factorial */

#include <stdio.h>

84
int faktorial(int);

main()
{
int x;

puts("MENCARI FAKTORIAL DARI X!");


printf("Masukkan nilai x (bulat positif) : ");
scanf("%d", &x);

printf("Faktorial dari %d = %d\n", x, faktorial(x));


}

int faktorial(int m)
{
if(m == 1)
return(1);
else
return(m * faktorial(m-1));
}

Contoh eksekusi :
MENCARI FAKTORIAL DARI X!
Masukkan nilai x (bulat positif) : 4
Faktorial dari 4 = 24

Rekursi jarang dipakai, di antaranya disebabkan :


 Biasanya rekursi akan menjadikan fungsi sulit dimengerti. Hanya cocok untuk
persoalan tertentu saja (misalnya pada binary tree atau pohon biner). Untuk fungsi
rekursi pada program faktor.c di atas misalnya, akan lebih mudah dipahami kalau
ditulis menjadi :

int faktorial(int m)
{
int i, fak;

fak = 1;
for(i = 1; i <= m; i++)
fak = fak * i;
return(fak);
}

85
 Memerlukan stack dengan ukuran yang lebih besar. Sebab setiap kali fungsi dipanggil,
variabel lokal dan parameter formal akan ditempatkan ke stack dan adakalanya akan
menyebabkan stack tak cukup lagi (stack overflow).

5.10. Pengenalan Konsep Pemrograman Terstruktur


Fungsi sangat bermanfaat untuk membuat program yang terstruktur. Suatu
program yang terstruktur dikembangkan dengan menggunakan “top-down design”
(rancang atas bawah). Pada C suatu program disusun dari sejumlah fungsi dengan tugas
tertentu. Selanjutnya masing masing fungsi dipecah-pecah lagi menjadi fungsi yang lebih
kecil. Pembuatan program dengan cara ini akan memudahkan dalam pencarian kesalahan
ataupun dalam hal pengembangan dan tentu saja mudah dipahami/ dipelajari.
Dalam bentuk diagram, model suatu program C yang terstruktur adalah seperti
yang tertera pada bagan berikut ini. Namun sekali lagi perlu diketahui, bahwa pada C
semua fungsi sebenarnya berkedudukan sederajat.
Fungsi main() terdiri dari fungsi_a() sampai dengan fungsi_n(), menegaskan
bahwa dalam program fungsi main() akan memanggil fungsi_a() sampai dengan
fungsi_n(). Adapun fungsi-fungsi yang dipanggil oleh fungsi main() juga bisa memanggil
fungsi-fungsi yang lain.

fungsi utama
main()

fungsi_a() … fungsi_n()

fungsi_a1() … fungsi_am()

Gambar 5.11 Model terstruktur Program C

Kesimpulan

86
 Fungsi digunakan untuk memecah program yang besar menjadi program-program
kecil sesuai dengan fungsi masing-masing.
 Fungsi bisa memberikan nilai balik dan bisa tanpa memberikan nilai balik kepada
fungsi yang memanggilnya.
 Fungsi yang memberikan nilai balik harus memiliki tipe dan ditulis didepan nama
fungsi.
 Bila fungsi tidak memberikan nilai balik maka fungsi tersebut bertipe “void “ dan
ditulis didepan nama fungsi.

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Buatlah sebuah fungsi yang berfungsi untuk menampilkan sebuah string (di layar) =
“Pilihan Menu” (misalkan nama fungsinya = menu). Fungsi tersebut tidak
memiliki nilai kembalian (return value) dan juga tidak menerima parameter masukan
apapun.

2. Tulislah prototipe fungsi untuk fungsi pada soal nomor 1 di atas.

3. Buatlah sebuah fungsi (misalkan nama fungsinya = cetak) yang berfungsi untuk
menampilkan sebuah string (di layar). Fungsi tersebut tidak memiliki nilai kembalian
(return value), tetapi menerima parameter masukan berupa string yang akan dicetak
(catatan : string merupakan array karakter).

4. Tulislah prototipe fungsi untuk fungsi pada soal nomor 3 di atas.

5. Buatlah sebuah fungsi (misalkan nama fungsinya = total) yang berfungsi untuk
menjumlah total nilai dari array integer yang dikirim sebagai parameter masukan
fungsi tsb. Fungsi tersebut memberikan nilai kembalian (return value) bertipe integer

87
yang berisi total hasil perhitungannya. Dalam hal ini fungsi tsb memiliki 2 parameter
masukan berupa array integer dan sebuah variabel integer yang menunjukkan jumlah
elemen dari array tsb.

6. Tulislah prototipe fungsi untuk fungsi pada soal nomor 5 di atas.

BAB VI
ARRAY

Dalam beberapa literatur, array sering disebut (diterjemahkan) sebagai larik.


Array adalah kumpulan dari nilai-nilai data bertipe sama dalam urutan tertentu yang
menggunakan sebuah nama yang sama. Nilai-nilai data di suatu array disebut dengan
elemen-elemen array. Letak urutan dari elemen-elemen array ditunjukkan oleh suatu
subscript atau indeks.
Array bisa berupa array berdimensi satu, dua, tiga atau lebih. Array berdimensi
satu (one-dimensional array) mewakili bentuk suatu vektor. Array berdimensi dua (two-
dimensional array) mewakili bentuk dari suatu matriks atau table. Array berdimensi tiga
(three-dimensional array) mewakili bentuk suatu ruang.

6.1. Array Berdimensi Satu


6.1.1. Mendeklarasikan Array Berdimensi Satu

88
Suatu array berdimensi satu dideklarasikan dalam bentuk umum berupa :

tipe_data nama_var[ukuran];

dengan :
 tipe_data : untuk menyatakan tipe dari elemen array, misalnya int, char, float.
 nama_var : nama variabel array
 ukuran : untuk menyatakan jumlah maksimal elemen array.

Contoh pendeklarasian array :

float nilai_tes[5];

menyatakan bahwa array nilai_tes mengandung 5 elemen bertipe float.

6.1.2. Mengakses Elemen Array Berdimensi Satu


Pada C, data array akan disimpan dalam memori yang berurutan. Elemen pertama
mempunyai indeks bernilai 0. Jika variabel nilai_tes dideklarasikan sebagai array dengan
5 elemen, maka elemen pertama memiliki indeks sama dengan 0, dan elemen terakhir
memiliki indeks 4. Gambar 6.1 di bawah ini menjelaskan urutan komponen dalam array.

nilai_tes[0] tipe float

nilai_tes[1]

nilai_tes[2] total 5 elemen

nilai_tes[3]

nilai_tes[4]

float nilai_tes[5]

Gambar 6.1 Array berdimensi satu

Bentuk umum pengaksesan array adalah sbb :

89
nama_var[indeks]

sehingga, untuk array nilai_tes, maka :


nilai_tes[0] → elemen pertama dari nilai_tes
nilai_tes[4] → elemen ke-5 dari nilai_tes
Contoh :

nilai_tes[0] = 70; /* contoh 1 */


scanf(“%f”, &nilai_tes[2]); /* contoh 2 */

Contoh pertama merupakan pemberian nilai 70 ke nilai_tes[0]. Sedangkan contoh 2


merupakan perintah untuk membaca data bilangan dari keyboard dan diberikan ke
nilai_tes[2]. Pada contoh 2 ini

&nilai_tes[2]

berarti “alamat dari nilai_tes[2]”. Perlu diingat bahwa scanf() memerlukan argumen
berupa alamat dari variabel yang digunakan untuk menyimpan nilai masukan.
Selengkapnya perhatikan contoh program di bawah ini

/* File program : nilai_tes.c


Pemakaian array utk menyimpan sejumlah nilai tes */

#include <stdio.h>
#define MAKS 5

main()
{
int i;
float total = 0, rata;
float nilai_tes[MAKS]; /* deklarasi array */

for(i=0; i < MAKS; i++) /* pemasukan data nilai_tes */


{
printf("Nilai tes ke-%d : ", i+1);
scanf("%f", &nilai_tes[i]);
/* menghitung jumlah seluruh nilai */
total = total + nilai_tes[i];
}
rata = total / MAKS; /* hitung nilai rata-rata */

/* cetak nilai rata-rata */

90
printf("\nNilai rata-rata = %g\n", rata);
}

Contoh eksekusi :
Nilai tes ke-1 : 56.5
Nilai tes ke-2 : 67.75
Nilai tes ke-3 : 80
Nilai tes ke-4 : 77
Nilai tes ke-5 : 78.5

Nilai rata-rata = 71.95

6.1.3. Inisialisasi Array Berdimensi Satu


Sebuah array dapat diinisialisasi sekaligus pada saat dideklarasikan. Untuk
mendeklarasikan array, nilai-nilai yang diinisialisasikan dituliskan di antara kurung
kurawal ({}) yang dipisahkan dengan koma.

/* File program : jhari.c */

#include <stdio.h>

main()
{
int bulan, tahun, jhari;
int jum_hari[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

puts("MEMPEROLEH JUMLAH HARI");


puts("PADA SUATU BULAN DAN SUATU TAHUN");
puts("--------------------------------");
printf("Masukkan bulan (1..12) : ");
scanf("%d", &bulan);
printf("Masukkan tahunnya : ");
scanf("%d", &tahun);

if(bulan == 2)
if(tahun % 4 == 0)
jhari = 29;
else
jhari = 28;
else
jhari = jum_hari[bulan-1];

91
printf("\nJumlah hari dalam bulan %d tahun %d adalah %d
hari\n", bulan, tahun, jhari);
}

Contoh eksekusi :
MEMPEROLEH JUMLAH HARI
PADA SUATU BULAN DAN SUATU TAHUN
--------------------------------
Masukkan bulan (1..12) : 2
Masukkan tahunnya : 1988

Jumlah hari dalam bulan 2 tahun 1988 adalah 29 hari

Pada program jhari.c di atas

int jum_hari[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

merupakan instruksi untuk mendeklarasikan array jum_hari yang memiliki 12 elemen


yang bersifat statis dan sekaligus melakukan inisialisasi terhadap masing-masing elemen
array.
/* File program : inisial.c */

#include <stdio.h>

main()
{
int i;
int values[] = {1,2,3,4,5,6,7,8,9};
char word[] = {'H','e','l','l','o'};

for(i = 0; i < 9; ++i )


printf("values[%d] is %d\n", i, values[i]);

printf("\n");
for(i = 0; i < 6; ++i )
printf("word[%d] is %c\n", i, word[i]);
}

Contoh eksekusi :
values[0] is 1
values[1] is 2
values[2] is 3
values[3] is 4
values[4] is 5

92
values[5] is 6
values[6] is 7
values[7] is 8
values[8] is 9

word[0] is H
word[1] is e
word[2] is l
word[3] is l
word[4] is o

Perhatikan, pada contoh inisial.c di atas, pendeklarasian nama variabel array tidak
disertai ukuran yang mengindikasikan besarnya array. Dalam kondisi seperti ini, C akan
menginisialisasi ukuran array tersebut sejumlah elemen yang diberikan di dalam kurung
kurawal pada saat proses inisialisasi. Sehingga array values terdiri atas 9 elemen dan
array word memiliki 5 elemen.

6.1.4. Beberapa Variasi dalam Mendeklarasikan Array


Ada beberapa variasi cara mendeklarasikan sebuah array (dalam hal ini yang
berdimensi satu), di antaranya adalah sebagai berikut :
 int numbers[10];
 int numbers[10] = { 34, 27, 16 };
 int numbers[] = { 2, -3, 45, 79, -14, 5, 9, 28, -1, 0 };
 char text[] = "Welcome to New Zealand.";
 float radix[12] = { 134.362, 1913.248 };
 double radians[1000];

6.2. Array Berdimensi Dua


Data seperti yang disajikan pada Tabel 6.1, dapat disimpan pada sebuah array
berdimensi dua. Dimensi pertama dari array digunakan untuk menyatakan kode program
kursus dan dimensi kedua untuk menyatakan tahun kursus.

Tabel 6.1. Data Kelulusan Siswa Pada Sebuah Kursus Komputer


Tahun
Program
1998 1999 2000
1. (INTRO) 80 540 1032

2. (BASIC) 15 83 301

93
3. (PASCAL) 8 12 15

4. (C) 10 129 257

6.2.1. Mendeklarasikan Array Berdimensi Dua


Pendeklarasian yang diperlukan untuk menyimpan data kelulusan siswa pada
Tabel 6-1 adalah:

int data_lulus[4][3];

Nilai 3 untuk menyatakan banyaknya tahun dan 4 menyatakan banyaknya program


kursus. Gambar 6.2 memberikan ilustrasi untuk memudahkan pemahaman tentang array
berdimensi dua.

0 1 2 Indek kedua
(tahun)
0 80 540 1032
1 15 83 301
2 8 12 15
3 10 129 257

Indek pertama int data_lulus[4][3]


(program khusus)

Gambar 6.2 Array berdimensi dua

Sama halnya pada array berdimensi satu, data array aka ditempatkan pada memori yang
berurutan. Perhatikan Gambar 6.3.

80 540 1032 15 83 301 80

Gambar 6.3 Model penyimpanan array dimensi dua pada memori

94
6.2.2. Mengakses Elemen Array Berdimensi Dua
Array seperti data_lulus dapat diakses dalam bentuk

data_lulus[indeks pertama, indeks kedua]

Contoh :
1. data_lulus[0][1] = 540;
merupakan instruksi untuk memberikan nilai 540 ke array data_lulus untuk indeks
pertama = 0 dan indeks kedua bernilai 1.
2. printf(“%d”,data_lulus[2][0]);
merupakan perintah untuk menampilkan elemen yang memiliki indeks pertama = 2
dan indeks kedua = 0.

0 1 2
0 540
1
2
3

data_lulus[0][1] = 540;

Gambar 6.4. Pemberian nilai ke array berdimensi dua

Perhatikan contoh program di bawah ini.

/* File program : lulus.c


Contoh pemakaian array berdimensi dua */

#include <stdio.h>

95
main( )
{
int tahun, kode_program;
int data_lulus[4][3] ;

/* Memberikan data ke array */


data_lulus[0][0] = 80;
data_lulus[0][1] = 540;
data_lulus[0][2] = 1032;

data_lulus[1][0] = 15;
data_lulus[1][1] = 83;
data_lulus[1][2] = 301;

data_lulus[2][0] = 8;
data_lulus[2][1] = 12;
data_lulus[2][2] = 15;

data_lulus[3][0] = 10;
data_lulus[3][1] = 129;
data_lulus[3][2] = 257;

/* proses utk memperoleh informasi jml siswa yg lulus */


printf("Masukkan tahun dr data yg ingin anda ketahui ");
printf("(1998..2000) : ");
scanf("%d", &tahun);
printf("Masukkan kode program kursus yang ingin anda
ketahui");
printf("(1 = INTRO, 2 = BASIC, 3 = PASCAL, 4 = C) : ");
scanf("%d", &kode_program);
printf("\nTotal kelulusan program tsb = %d\n",
data_lulus[kode_program - 1][tahun - 1998] );
}

Contoh eksekusi :
Masukkan tahun dr data yg ingin anda ketahui (1998…2000) : 2000
Masukkan kode program kursus dari data yang ingin anda ketahui
(1 = INTRO, 2 = BASIC, 3 = PASCAL, 4 = C) : 3

Total kelulusan program tsb = 15

6.2.3. Inisialisasi Array Berdimensi Dua


Gambar berikut memberikan penjelasan tentang inisialisasi yang dilakukan
terhadap array berdimensi dua :

0 1 1 1 1 1 0 0

96
0 1 0 0 0 1 0 0
0 1 0 0 0 1 0 0
1 1 1 1 1 1 1 0
1 1 0 0 0 0 1 0
1 1 0 0 0 0 1 0
1 1 0 0 0 0 1 0
0 0 0 0 0 0 0 0

Gambar 6.5 Representasi inisialisasi array berdimensi dua

Untuk itu, deklarasi dan inisialisasi yang dilakukan berupa :

int huruf_A[8][8] = {
{ 0, 1, 1, 1, 1, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 0, 0, 0, 0, 0, 0, 0, 0 }
};

atau bisa juga ditulis sebagai berikut :

int huruf_A[8][8] =
{ 0, 1, 1, 1, 1, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0
};

Contoh program berikut memenfaatkan data yang ada pada array huruf_A untuk
membentuk karakter A dengan ukuran besar. Setiap nilai satu pada array akan diganti
dengan karakter ber-ASCII 219 (DBh) dan nilai 0 akan diganti dengan karakter spasi.

/* File program : hurufA.c


Contoh inisialisasi array dimensi dua */

97
#include <stdio.h>

main()
{
int i,j;
int huruf_A[8][8] = {
{ 0, 1, 1, 1, 1, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 0, 0, 0, 0, 0, 0, 0, 0 }
};

for(i = 0; i < 8; i++)


{
for(j = 0; j < 8; j++)
if(huruf_A[i][j] !=0 )
putchar('\xDB\n');
else
putchar (' '); /* spasi */
putchar('\n');
}
}
Contoh eksekusi :

6.3. Array Berdimensi Banyak.


C memungkinkan untuk membuat array yang dimensinya lebih dari dua. Bentuk
umum pendeklarasian array berdimensi banyak :

tipe nama_var[ukuran 1][ukuran2}…[ukuranN];

sebagai contoh :

98
int data_huruf[2][8][8];

merupakan pendeklarasian array data_huruf sebagai array berdimensi tiga.


Sama halnya dengan array berdimensi satu atau dua, array berdimensi banyak
juga bisa diinisialisasi. Contoh inisialisasi array berdimensi tiga :

int data_huruf [2][8][8] =


{ { { 0, 1, 1, 1, 1, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 0, 1, 0, 0, 0, 1, 0, 0 } ,
{ 1, 1, 1, 1, 1, 1, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 1, 1, 0, 0, 0, 0, 1, 0 } ,
{ 0, 0, 0, 0, 0, 0, 0, 0 }
},
{ {1, 1, 1, 1, 1, 1, 0, 0 } ,
{1, 0, 0, 0, 0, 1, 0, 0 } ,
{1, 0, 0, 0, 0, 1, 0, 0 } ,
{1, 1, 1, 1, 1, 1, 1, 0 } ,
{1, 1, 0, 0, 0, 0, 1, 0 } ,
{1, 1, 0, 0, 0, 0, 1, 0 } ,
{1, 1, 1, 1, 1, 1, 1, 0 } ,
{0, 0, 0, 0, 0, 0, 0, 0 }
} };

atau bisa juga ditulis menjadi


int data_huruf [2][8][8] =
0, 1, 1, 1, 1, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
0, 1, 0, 0, 0, 1, 0, 0,
1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 0, 0,
1, 0, 0, 0, 0, 1, 0, 0,
1, 0, 0, 0, 0, 1, 0, 0,
1, 1, 1, 1, 1, 1, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 1, 0,
1, 1, 1, 1, 1, 1, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0
};

99
Program berikut merupakan pengembangan dari Program 8 – 4, digunakan untuk
menampilkan dua buah huruf dengan ukuran besar.

/* File program: data_huruf.c


Contoh inisialisasi array dimensi tiga */

# include <stdio.h>

main()
{
int i, j, k;
int data_huruf[2][8][8] = {
{{ 0, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0 },
{ 0, 1, 0, 0, 0, 1, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 0 },
{ 1, 1, 0, 0, 0, 0, 1, 0 },
{ 1, 1, 0, 0, 0, 0, 1, 0 },
{ 1, 1, 0, 0, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0 }
},
{{1, 1, 1, 1, 1, 1, 0, 0 },
{1, 0, 0, 0, 0, 1, 0, 0 },
{1, 0, 0, 0, 0, 1, 0, 0 },
{1, 1, 1, 1, 1, 1, 1, 0 },
{1, 1, 0, 0, 0, 0, 1, 0 },
{1, 1, 0, 0, 0, 0, 1, 0 },
{1, 1, 1, 1, 1, 1, 1, 0 },
{0, 0, 0, 0, 0, 0, 0, 0 }
}
};

for(i = 0; i < 2; i++) /* Tampilkan huruf */


{
for(j = 0; j < 8; j++)
{
for(k = 0; k < 8; k++)
if(data_huruf[i][j][k] != 0)
putchar('\xDB');
else
putchar(' '); /* spasi */
printf("\n"); /* pindah baris */
}
printf("\n"); /* pindah baris */
}
}

Contoh Eksekusi :

100
6.4. Inisialisasi Array Tak Berukuran
Inisialisasi array yang tak berukuran dapat dilakukan untuk array berdimensi
satu atau lebih. Untuk array berrdimensi lebih dari satu, dimensi terkirilah yang boleh
tak berukuran. Dengan cara ini tabel dalam array dapat diperluas atau dikurangi tanpa
mengubah ukuran array. Sebagai contoh :
tak berukuran
int skala[] =
{ 1, 2, 4, 6, 8 };

merupakan pendeklarasian array berdimensi satu yang tak berukuran. Secara otomatis
skala[ 0 ] bernilai 1
skala[ 1 ] bernilai 2
skala[ 2 ] bernilai 4
skala[ 3 ] bernilai 6
skala[ 4 ] bernilai 8

101
Contoh lain :

char konversi[][2] =
{ ’A’, ’T’,
’E’, ’M’,
’I’, ’V’,
’O’, ’S’,
’U’, ’J’,
};

Pada contoh ini,

konversi[0][0] bernilai ’A’


konversi[0][1] bernilai ’T’
konversi[1][0] bernilai ’E’
konversi[1][1] bernilai ’M’
……..

Contoh berikut akan menyandikan suatu kalimat yang dimasukkan melalui keyboard
dengan menggunakan data yang ada pada tabel konversi. Misal, huruf A akan diganti
menjadi T, huruf T akan diganti menjadi A.
/* File program : sandi.c
contoh inisialisasi array tak berukuran */

#include <stdio.h>
#include <stdlib.h>

#define JUM_KOLOM 2
#define MAX_KAR 256

main()
{
char konversi[][JUM_KOLOM] = {
'A', 'T',
'a', 't',
'E', 'M',
'e', 'm',
'I', 'V',
'i', 'v',
'O', 'S',
'o', 's',
'U', 'J',
'u', 'j'
};

102
char kalimat[MAX_KAR], karakter;
int i = 0, j, jum_kar, jum_penyandi;

printf("Masukkan sebuah kalimat dan akhiri dengan


ENTER\n");
printf("Kemudian kalimat tsb akan saya sandikan\n");
printf("Kalimat: ");

/* Memasukkan data karakter ke array kalimat */


while((kalimat[i] = getchar()) != '\n')
i++;
jum_kar = i ;

/* sandikan dan menampilkan ke layar */


printf("\nHasil setelah disandikan: ");
jum_penyandi = sizeof(konversi) / JUM_KOLOM;

for(i = 0; i < jum_kar; i++)


{
karakter = kalimat [i];
for(j = 0; j < jum_penyandi; j++)
{
if(karakter == konversi[j][0])
{
karakter = konversi[j][1];
break; /* keluar dari for terdalam */
}
if(karakter == konversi[j][1])
{
karakter = konversi[j][0];
break; /* keluar dari for terdalam */
}
}
putchar (karakter);
}
printf("\n\n");
}

Contoh Eksekusi :
Masukkan sebuah kalimat dan akhiri dengan ENTER
Kemudian kalimat tsb akan saya sandikan
Kalimat : Saya belajar

Hasil setelah disandikan: Otyt bmltutr

Pada program diatas ,

sizeof(konversi)/JUM_KOLOM)

103
merupakan ungkapan untuk memperoleh banyaknya baris (ukuran dari dimensi
pertama) dalam array konversi. Dengan cara ini tabel konversi dapat diperluas tanpa
perlu memberitahu banyaknya jumlah dimensi pertama secara ekplisit.

6.5. Array Sebagai Parameter


Array juga dapat dilewatkan sebagai parameter fungsi. Sebagai contoh ditujukan
pada program sorting.c. Program digunakan untuk memasukkan sejumlah data,
kemudian data tersebut diurutkan naik (ascending) dan dicetak ke layar.
Untuk melakukan sorting (proses pengurutan data), cara yang dipakai yaitu
metode buble sort (suatu metode pengurutan yang paling sederhana, dan memiliki
kecepatan pengurutan yang sangat lambat).
Algoritma pada metode pengurutan ini adalah sebagai berikut :
1. Atur i bernilai 0
2. Bandingkan x[i] dengan x[j], dengan j berjalan dari i + 1 sampai dengan n-1.
3. Pada setiap pembandingan, jika x[i] > x[j], maka isi x[i] dan x[j] ditukarkan
4. Bila i < (n – 1), ulangi mulai langkah 2.

Catatan: i = indeks array


x = nama array untuk menyimpan data
n = jumlah data

Algoritma diatas berlaku untuk pengurutan menaik (ascending). Untuk


pengurutan menurun (descending), penukaran dilakukan jika x[i] < x[j].
Penjelasan proses pengurutan terhadap 5 buah data ditunjukkan pada gambar
6.6.
Data semula (sebelum pengurutan) adalah

50,5 30,3 20,2 25,2 31,3

Setelah pengurutan menaik (secara ascending), hasil yang diharapkan berupa

20,2 25,2 30,3 31,3 50,5

104
i=0→j=1 j=2 j=3 j=4
0 50.5 30.3 20.2 20.2
1 30.3 50.5 50.5 50.5
2 20.2 20.2 30.3 30.3
3 25.2 25.2 25.2 25.2
4 31.3 31.3 31.3 31.3

i=0→j=2 j=3 j=4


0 20.2 20.2 20.2
1 50.5 50.5 50.5
2 30.3 30.3 30.3
3 25.2 25.2 25.2
4 31.3 31.3 31.3

i=0→j=3 j=4
0 20.2 20.2
1 25.2 25.2
2 50.5 50.5
3 30.3 30.3
4 31.3 31.3

i=0→j=4 Hasil Akhir


0 20.2 20.2
1 25.2 25.2
2 30.3 30.3
3 50.5 31.3
4 31.3 50.5

Gambar 6.6 Proses pengurutan data secara ascending dengan metode Buble Sort

/* File program : sorting.c */

#include <stdio.h>

#define MAKS 20

void pemasukan_data(float [], int *);


void pengurutan_data(float [], int);
void penampilan_data(float [], int);

main()

105
{
float data[MAKS];
int jum_data;

pemasukan_data(data, &jum_data);
pengurutan_data(data, jum_data);
penampilan_data(data, jum_data);
}

void pemasukan_data(float x[], int *pjumlah)


{
int jum, i;

printf("Jumlah data = ");


scanf("%d", &jum);

for(i=0; i<jum; i++)


{
printf("Data ke-%d : ", i+1);
scanf("%f", &x[i]);
}
*pjumlah = jum;
}

void pengurutan_data(float x[], int jumlah)


{
int i, j;
float smtr;

for(i=0; i<jumlah-1; i++)


for(j=i+1; j<jumlah; j++)
if(x[i] > x[j]) /* penukaran data */
{
smtr = x[i];
x[i] = x[j];
x[j] = smtr;
}
}

void penampilan_data(float x[], int jumlah)


{
int i;

printf("\nData setelah diurutkan :\n\n");


for (i=0; i<jumlah; i++)
printf("Data ke-%d : %g\n", i+1, x[i]);
}

Contoh Eksekusi :
Jumlah data = 5

106
Data ke-1 : 50.5
Data ke-2 : 30.3
Data ke-3 : 20.2
Data ke-4 : 25.2
Data ke-5 : 31.3
Data setelah diurutkan

Data ke-1 : 20.2


Data ke-2 : 25.2
Data ke-3 : 30.3
Data ke-4 : 31.3
Data ke-5 : 50.5

Pada fungsi main( );


 float data[MAKS];
merupakan instruksi untuk mendeklarasikan array data dengan elemen bertipe float
dan jumlahnya sebanyak MAKS elemen.
 pemasukan_data(data, &jum_data);
merupakan instruksi untuk memanggil fungsi pemasukan_data ( ). Pada
pemanggilan fungsi, data merupakan array. Yang perlu diperhatikan, parameter array
ditulis tanpa diawali dengan &, sekalipun tujuan dari pemanggilan fungsi yaitu untuk
mengisikan data ke array. Sebab nama array tanpa kurung siku dalam parameter
fungsi berarti ”alamat dari elemen indeks ke-0 dari array tsb”.
Sedangkan &jum_data berarti ”alamat dari jum_data”. Tanda & harus disertakan
sebab variabel jum_data akan diisi oleh fungsi pemasukan_data ().
 pengurutan_data(data, jum_data);
Merupakan instruksi untuk menjalankan fungsi pengurutan _data (), dalam hal ini
data dilewatkan ke fungsi dengan referensi (memberikan alamat array), karena
memang hal ini merupakan cara satu-satunya untuk melewatkan array. Sedangkan
jumlah data dilewatkan ke fungsi dalam bentuk nilai (pemanggilan dengan nilai).
 penampilan_data(data,jum_data);
Merupakan instruksi untuk memanggil fungsi penampilan_data().

Pada fungsi untuk pemasukan data, pengurutan data maupun penampilan data,

data[i]

menyatakan elemen data ke-i.

107
Beberapa hal tambahan yang perlu diketahui :
 Untuk menyatakan alamat dari suatu elemen array, bentuk umumnya adalah

&nama_array[indeks]

Misalnya,

&data[1]

menyatakan alamt dari elemen ke-1. Adapun

&data[0]

sama saja dengan:

data

 Suatu array berdimensi satu dalam parameter formal dideklarasikan dengan bentuk
tipe nama_array[]

dengan di dalam tanda kurung siku tak disebutkan mengenai jumlah elemen. Jumlah
elemen dinyatakan dalam parameter tersendiri (atau dinyatakan dalam bentuk variabel
eksternal). Untuk array berdimensi lebih dari satu, kurung siku terkirilah yang kosong.

Kesimpulan :
 Array adalah kumpulan dari nilai-nilai data bertipe sama dalam urutan tertentu yang
menggunakan sebuah nama yang sama.
 Nilai-nilai data di suatu array disebut dengan elemen-elemen array.
 Letak urutan dari elemen-elemen array ditunjukkan oleh suatu subscript atau indeks.
 Array bisa berupa array berdimensi satu, dua, tiga atau lebih.
 Data array akan disimpan dalam memori yang berurutan, dengan elemen pertama
mempunyai indeks yang bernilai 0.

108
 Sebuah array dapat diinisialisasi sekaligus pada saat dideklarasikan, caranya saat
mendeklarasikan array, nilai-nilai yang diinisialisasikan dituliskan di antara kurung
kurawal ({}) yang dipisahkan dengan koma.
 Array juga dapat dilewatkan sebagai parameter fungsi.

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Deklarasikan sebuah variabel array (misalkan nama variabelnya = letters) yang
mengalokasikan untuk 10 elemen bertipe char.

2. Masukkan karakter ‘Z’ pada elemen yang ke-empat dari array letters.

3. Gunakan loop for untuk menghitung nilai akumulasi (total) dari seluruh isi sebuah
array integer (array of int, misalkan namanya = numbers) yang memliki 5 elemen.

4. Deklarasikan sebuah array multidimensi yang elemennya bertipe float (array of float,
misalkan namanya = balances) yang memiliki 3 baris dan 5 kolom.

5. Gunakan loop for untuk menghitung nilai total dari seluruh isi array balances di atas.

6. Deklarasikan sebuah array karakter (array of char, mislakan namanya = words) dan
sekaligus inisialisasikan dengan nilai string = “Hello”

7. Deklarasikan sebuah array karakter (array of char, mislakan namanya = stuff) dengan
alokasi 50 elemen. Selanjutnya isikan dengan nilai string = “Welcome” pada body
programnya (bukan pada saat deklarasi)

8. Gunakan statemen printf() untuk menampilkan (di layar) isi elemen ke-tiga dari
sebuah array integer (array of int, misalkan namanya = totals)

9. Gunakan statemen printf() untuk menampilkan (di layar) string yang merupakan isi
dari sebuah array karakter (array of char, misalkan namanya = words)

10. Gunakan statemen scanf() untuk membaca string masukan dari keyboard dan
memasukkannya ke array words.

109
11. Tuliskan loop for untuk membaca 5 karakter (gunakan statemen scanf()) dan
memasukkannya ke dalam array words, mulai dari indeks 0.

BAB VII
STRING

7.1. Konstanta dan Variabel String


String merupakan bentuk data yang biasa dipakai dalam bahasa pemrograman
untuk keperluan menampung dan memanipulasi data teks, misalnya untuk menampung
(menyimpan) suatu kalimat. Pada bahasa C, string bukanlah merupakan tipe data
tersendiri, melainkan hanyalah kumpulan dari nilai-nilai karakter yang berurutan dalam
bentuk array berdimensi satu.

7.1.1. Konstanta String


Suatu konstanta string ditulis dengan diawali dan diakhiri tanda petik ganda,
misalnya:

110
“ABCDE”

Nilai string ini disimpan dalam memori secara berurutan dengan komposisi sebagai
berikut:
memori rendah memori tingi

memori rendah memori tinggi


A B C D E \0

Gambar 7.1 Komposisi penyimpanan string dalam memori

Setiap karakter akan menempati memori sebesar 1 byte. Byte terakhir otomatis
akan berisi karakter NULL (\0). Dengan mengetahui bahwa suatu string diakhiri nilai
NULL, maka akhir dari nilai suatu string akan dapat dideteksi. Sebagai sebuah array
karakter, karakter pertama dari nilai string mempunyai indeks ke-0, karakter kedua
mempunyai indeks ke-1, dan seterusnya.

7.1.2. Variabel String


Variabel string adalah variabel yang dipakai utuk menyimpan nilai string.
Misalnya :

char name[15];

merupakan instruksi untuk mendeklarasikan variabel string dengan panjang maksimal


15 karakter (termasuk karakter NULL). Deklarasi tersebut sebenarnya tidak lain
merupakan deklarasi array bertipe char.

7.2. Inisialisasi String


Suatu variabel string dapat diinisialisasi seperti halnya array yang lain. Namun
tentu saja elemen terakhirnya haruslah berupa karakter NULL. Sebagai contoh :

char name[] = {'R','I','N', 'I',’\0’};

111
yang menyatakan bahwa name adalah variabel string dengan nilai awal berupa string :
“RINI” . Bentuk inisialisasi yang lebih singkat :

char name[] = “RINI”;

Pada bentuk ini, karakter NULL tidak perlu ditulis. Secara implisit akan disisipkan oleh
kompiler. Perlu diperhatikan, bila name dideklarasikan sebagai string, penugasan
(assignment) suatu string ke variabel string sepert

name = “RINI”;

adalah tidak diperkenankan. Pengisian string ke variabel string akan dibahas pada sub
bab berikutnya.

7.3. Input Output Data String


7.3.1. Memasukkan Data String
Pemasukan data string ke dalam suatu variabel biasa dilakukan dengan fungsi
gets() atau scanf(). Bentuk umum pemakaiannya adalah sebagai berikut :

#include <stdio.h>
gets(nama_array);
atau

#include <stdio.h>
scanf(“%s”, nama_array);

Perhatikan :
 nama_array adalah variabel bertipe array of char yang akan digunakan untuk
menyimpan string masukan.
 Di depan nama_array tidak perlu ada operator & (operator alamat), karena
nama_array tanpa kurung siku sudah menyatakan alamat yang ditempati oleh
elemen pertama dari array tsb.
 Kalau memakai scanf(), data string masukan tidak boleh mengandung spasi.

Di bawah ini diberikan contoh program untuk memasukkan data nama seseorang ke
dalam array bernama name.

112
/* File program : yourname.c
Contoh memasukkan data string dari keyboard */

#include <stdio.h>

main()
{
char name[15];

printf("Masukkan nama Anda : ");


gets(name);

printf("\nHalo, %s. Selamat belajar string.\n", name);


}

Contoh eksekusi :
Masukkan nama Anda : YUDI
Halo, YUDI. Selamat belajar string.

Ruang yang disediakan setelah deklarasi: char name[15];

name :

Setelah data yang dimasukkan berupa : YUDI

name : Y U D I \0
karakter NULL
byte sisa tak dipakai

Gambar 7.2 Variabel string dan data string

Pada gambar di atas nama array tanpa kurung siku (name) menyatakan alamat dari
lokasi data string. Dan dengan pemasukan data seperti di atas, lokasi memori yang
terletak sesudah lokasi yang berisi ‘N’ akan secara otomatis terisi karakter NULL (lihat
gambar 7.2)
Perlu diketahui, fungsi gets() akan membaca seluruh karakter yang diketik
melalui keyboard sampai tombol ENTER ditekan. Dalam hal ini tidak ada pengecekan

113
terhadap batasan panjang array yang merupakan argumennya. Jika string yang
dimasukkan melebihi ukuran array, maka sisa string (panjang string masukan dikurangi
ukuran array plus karakter NULL) akan ditempatkan di lokasi sesudah bagian akhir dari
array tersebut. Tentu saja kejadian seperti ini bisa menimbulkan hal yang tidak
diinginkan, misalnya berubahnya isi variabel yang dideklarasikan sesudah array tersebut
karena tertumpuki oleh string yang dimasukkan (overwrite), atau perilaku program yang
sama sekali berbeda dengan kemauan user yang dalam hal ini pelacakan kesalahannya
(debugging) sangat sulit dilakukan, atau bahkan terjadi penghentian program secara
tidak normal.
Untuk mengatasi hal itu, disarankan untuk menggunakan fungsi fgets() untuk
menggantikan fungsi gets() dalam memasukkan data string.
Bentuk umum pemakaian fgets() adalah :

#include <stdio.h>
fgets(nama_array, sizeof nama_array, stdin);

Untuk lebih jelasnya, perhatikan contoh penggunaan fungsi fgets() ini pada contoh
program untuk menghitung karakter masukan (hitkar.c) di halaman 115.

7.3.2. Menampilkan Isi Variabel String


Untuk menampilkan isi variabel string, fungsi yang digunakan adalah puts() atau
printf(). Bentuk umum pemakaiannya adalah sebagai berikut :

#include <stdio.h>
puts(var_string);

atau

printf("%s",var_string);

Dalam hal ini var_string adalah sebuah variabel yang berupa sebuah array of char.
Fungsi puts() akan menampilkan isi dari var_string dan secara otomatis menambahkan
karakter '\n' di akhir string. Sedangkan fungsi printf() akan menampilkan isi variabel
string tanpa memberikan tambahan '\n'. Sehingga, agar kedua pernyataan di atas
memberikan keluaran yang sama, maka pada pernyataan printf() dirubah menjadi :

114
printf("%s\n", var_string);

Contoh program berikut akan menampilkan isi variabel kompiler_c, berdasarkan dua
bentuk inisialisasi string yang dibahas pada sub bab 7.3

/* File program : initstr.c


Contoh inisialisasi string */

#include <stdio.h>

void bentuk1(void);
void bentuk2(void);

main()
{
bentuk1();
bentuk2();
}

void bentuk1(void)
{
char kompiler_c[] =
{'V','i','s','u','a','l',' ','C','+','+','\0'};

puts(kompiler_c);
}

void bentuk2(void)
{
char kompiler_c[] = "Visual C++";
printf("%s\n", kompiler_c);
}

Contoh eksekusi :
Visual C++
Visual C++

7.4. Mengakses Elemen String


Variabel string merupakan bentuk khusus dari array bertipe char. Oleh karena itu,
elemen dari variabel string dapat diakses seperti halnya pengaksesan elemen pada array.
Program berikut menunjukkan cara mengakses elemen array untuk menghitung total
karakter dari string yang dimasukkan melalui keyboard.

115
/* File Program : hitkar.c
Contoh untuk menghitung banyaknya karakter dari suatu string
yang dimasukkan melalui keyboard */

#include <stdio.h>

#define MAKS 256

main()
{
int i, jumkar = 0;
char teks[MAKS];

puts("Masukkan suatu kalimat (maks 255 karakter).");


puts("Saya akan menghitung jumlah karakternya.\n");
fgets(teks, sizeof teks, stdin); //masukan dr keyboard
for(i=0; teks[i]; i++)
jumkar++;

printf("\nJumlah karakter = %d\n", jumkar);


}

Contoh eksekusi :
Masukkan satu kalimat (maks 255 karakter).
Saya akan menghitung jumlah karakternya.
SAYA SUKA BELAJAR BAHASA C

Jumlah karakter = 26

Perhitungan jumlah karakter dari string teks dapat dilakukan dengan memeriksa elemen
dari string dimulai dari posisi yang pertama (indeks ke-0) sampai ditemukannya
karakter NULL. Elemen yang ke-i dari teks dinyatakan dengan

teks[i]

Pemeriksaan terhadap teks[i] selama tidak berupa karakter NULL (dimulai dari indeks
ke-0) dilakukan dengan instruksi

for(i=0; teks[i]; i++)


jumkar++;

116
Kondisi teks[i] pada for mempunyai makna yang secara implisit berupa

teks[i] != ‘\0’;

atau “karakter yang ke-i dari teks tidak sama dengan karakter NULL”
Contoh berikut ini akan memberikan gambaran mengenai cara menyalin nilai ke suatu
variabel string.

/* File program : salinstr.c


Contoh menyalin suatu string */

#include <stdio.h>

#define MAKS 30

main()
{
int i;
char asal[] = “Saya menyukai bahasa C”;
char hasil[MAKS];

i=0;
while (asal[i] != ‘\0’)
{
hasil[i] = asal[i];
i++;
}
hasil[i] = ‘\0’; /* beri karakter NULL */
printf(“Isi hasil : %s\n”, hasil);
}

Contoh eksekusi :
Isi hasil : Saya menyukai bahasa C

Untuk menyalin isi variabel string keterangan ke kalimat, pernyataan yang digunakan
berupa

i=0;
while (asal[i] != ‘\0’)
{
hasil[i] = asal[i];
i++;
}

117
Selama keterangan[i] tidaklah berupa karakter NULL, maka keterangan[i] disalin ke
kalimat[i]. Jelas bahwa di dalam loop while tidak terdapat penyalinan karakter NULL
dari keterangan ke kalimat. Oleh karena itu sekeluarnya dari loop while, pemberian
karakter NULL ke kalimat perlu dilakukan. Pernyataan yang digunakan berupa

kalimat[i] = ‘\0’;

Bentuk yang lebih singkat untuk melakukan penyalinan dari keterangan ke kalimat
berupa

i=0;
while (kalimat[i] = keterangan[i])
i++;

Dengan penulisan seperti di atas, penyalinan karakter NULL juga akan dilakukan secara
otomatis. Setelah menyalin karakter NULL (karena kondisi bernilai NULL) maka eksekusi
terhadap loop akan dihentikan. Dengan demikian sekeluarnya dari loop tidak perlu lagi
ada pernyataan.

kalimat[i] = ‘\0’;
7.5. Fungsi-Fungsi Mengenai String
Berikut ini akan dibahas beberapa fungsi pustaka yang umumnya disediakan oleh
kompiler C untuk mengoperasikan suatu nilai string. Fungsi-fungsi pustaka untuk operasi
string, prototype-prototype nya berada di file judul string.h. Beberapa di antara fungsi
pustaka untuk operasi string akan dibahas di bawah ini.

7.5.1. Fungsi strcpy() untuk Menyalin Nilai String


Bentuk pemakaian :

#include <string.h>
strcpy(tujuan, asal)

Fungsi ini dipakai untuk menyalin string asal ke variabel string tujuan termasuk
karakter '\0'. Keluaran dari fungsi ini (return value) adalah string tujuan. Dalam hal ini,
variabel tujuan haruslah mempunyai ukuran yang dapat digunakan untuk menampung
seluruh karakter dari string asal. Contoh implementasinya bisa dilihat pada program
salinstr2.c di bawah ini.

118
/* File program :salinstr2.c
Contoh menyalin isi str2 ke str1 */

#include <stdio.h>
#include <string.h>

#define MAKS 80

main()
{
char str1[MAKS];
char str2[]="ABCDE";

strcpy(str1, str2); /* menyalin isi str2 ke str1 */


printf("String pertama adalah : %s\n", str1);
printf("String kedua adalah : %s\n", str2);
}

Contoh eksekusi :
String pertama adalah : ABCDE
String kedua adalah : ABCDE

7.5.2. Fungsi strlen() untuk Mengetahui Panjang Nilai String


Bentuk pemakaian :

#include <string.h>
strlen(var_string);

Fungsi ini digunakan untuk memperoleh banyaknya karakter di dalam string yang
menjadi argumennya (var_string). Keluaran dari fungsi ini adalah panjang dari
var_string. Karakter NULL tidak ikut dihitung. Contoh implementasinya bisa dilihat pada
program panjangstr.c di bawah ini.

/* File program : panjangstr.c


Contoh memperoleh panjang suatu string */

#include <stdio.h>
#include <string.h>

main()
{

119
char salam[] = "Halo";

printf("Panjang string = %d karakter\n", strlen(salam));


}

Contoh eksekusi :
Panjang string = 4 karakter

7.5.3. Fungsi strcat() untuk Menggabung Nilai String


Bentuk pemakaian :

#include <string.h>
strcat(tujuan, sumber);

Menggabungkan dua buah nilai string tidak dapat dilakukan dengan operator ‘+’,
karena operator ini bukan operator untuk operasi string. Penggabungan dua buah nilai
string dapat dilakukan dengan fungsi pustaka strcat() dengan menambahkan string
sumber ke bagian akhir dari string tujuan. Keluaran dari fungsi ini adalah string tujuan.
Contoh implementasinya bisa dilihat pada program gabungstr.c di bawah ini.

/* File program :gabungstr.c


Contoh menggabungkan isi string1 dengan string2 */

#include <stdio.h>
#include <string.h>

#define PJG 15

main()
{
char str1[PJG], str2[PJG];

strcpy(str1, “sala”); /* str1 diisi “sala” */


strcpy(str2, “tiga”); /* str2 diisi “tiga” */

strcat(str1, str2); /* tambahkan str2 ke akhir str1 */

printf(“str1 → %s str2 → %s\n”, str1, str2);


}

Contoh eksekusi :
str1 → salatiga str2 → tiga

120
Dalam hal ini str1 (“sala”) digabungkan dengan str2 (“tiga”) dengan hasilnya berada di
str1 (“salatiga”).

7.5.4. Fungsi strcmp() untuk Membandingkan Dua Nilai String


Membandingkan dua nilai string juga tidak dapat digunakan dengan operator
hubungan, karena operator tersebut tidak untuk operasi string. Membandingkan dua
buah nilai string dapat dilakukan dengan fungsi pustaka strcmp().
Contoh bentuk pemakaian fungsi :

#include <string.h>
strcmp(str1, str2);

Fungsi ini dipakai untuk membandingkan string str1 dengan string str2. Keluaran
dari fungsi ini bertipe int yang berupa nilai :
 -1, jika str1 kurang dari str2
 0, jika str1 sama dengan str2
 1, jika str1 lebih dari str2

Pembandingan dilakukan untuk karakter pada posisi yang sama dari str1 dan
str2, dimulai dari karakter terkiri. Acuan pembandingan dari dua buah karakter
didasarkan oleh nilai ASCII-nya. Misal, karakter ‘A’ lebih kecil daripada ‘B’ dan karakter ‘B
lebih kecil daripada ‘C’. Contoh implementasinya bisa dilihat pada program bandingstr.c
di bawah ini.

/* File program :bandingstr.c


Contoh membandingkan isi dua buah string */

#include <stdio.h>
#include <string.h>

main()
{
char str1[]="HALO”;
char str2[]="Halo";
char str3[]="HALO”;

printf(“Hasil pembandingan %s dengan %s --> %d\n”,


str1, str2, strcmp(str1, str2));

121
printf(“Hasil pembandingan %s dengan %s --> %d\n”,
str2, str1, strcmp(str2, str1));

printf(“Hasil pembandingan %s dengan %s --> %d\n”,


str1, str3, strcmp(str1, str3));
}

Contoh eksekusi :
Hasil pembandingan HALO dengan Halo --> -1
Hasil pembandingan Halo dengan HALO --> 1
Hasil pembandingan HALO dengan HALO --> 0

7.5.5. Fungsi strchr() untuk Mencari Nilai Karakter dalam String


Bentuk pemakaian :

#include <string.h>
strchr(var_string, kar);

Fungsi ini dapat digunakan untuk mencari suatu nilai karakter yang berada dalam
suatu nilai string. Dalam hal ini adalah mencari karakter kar dalam string var_string.
Keluaran dari fungsi ini adalah alamat posisi dari karakter pertama pada nilai string, yang
sama dengan karakter yang dicari. Jika karakter yang dicari tidak ada dalam nilai string,
maka fungsi ini akan memberikan hasil nilai pointer kosong (null). Contoh
implementasinya bisa dilihat pada program carikar.c di bawah ini.

/* File program : carikar.c


Contoh mencari karakter dalam sebuah string */

#include <stdio.h>
#include <string.h>

main()
{
char str[]="ABcde”; /* inisialisasi string */
char *hasil1,*hasil2;
/* var bertipe pointer to char, agar bisa ditampilkan isi
dari alamat yang ditunjuk oleh hasil1 & hasil2 */

hasil1 = strchr(str, ‘B’);


hasil2 = strchr(str, ‘X’);

printf(“Dari string ABcde\n”);


printf(“Mencari karakter B = %s\n”, hasil1);

122
printf(“Mencari karakter X = %s\n”, hasil2);
}

Contoh eksekusi :
Dari string ABcde
Mencari karakter B = Bcde
Mencari karakter X = (null)

Contoh di atas menunjukkan penggunaan fungsi strchr() untuk mencari nilai karakter ‘B’
dan karakter ‘X’ dalam string ‘ABcde’. Karakter ‘B’ ada dalam nilai string yang dicari,
sehingga fungsi strchr() memberikan hasil alamat dari karakter B tersebut yang
kemudian alamat ini disimpan dalam variabel pointer hasil1. Jika variabel pointer hasil1
ini ditampilkan dengan menggunakan kode format untuk nilai string (%s), maka mulai
dari alamat tersebut sampai dengan akhir dari nilai string yang bersangkutan akan
ditampilkan, sehingga didapatkan keluaran :

Mencari karakter B = Bcde

Sedangkan pencarian karakter ‘X’ memberikan hasil null karena karakter tersebut tidak
ditemukan dalam string ‘ABcde”, sehingga didapatkan keluaran :

Mencari karakter X = (null)

Keterangan lebih lanjut tentang pointer ini, akan dibahas pada bab VIII.

Kesimpulan :
 String merupakan bentuk data yang biasa dipakai dalam bahasa pemrograman untuk
keperluan menampung dan memanipulasi data teks.
 Pada bahasa C, string bukanlah merupakan tipe data tersendiri, melainkan hanyalah
kumpulan dari nilai-nilai karakter yang berurutan dalam bentuk array berdimensi
satu
 Suatu konstanta string ditulis dengan diawali dan diakhiri tanda petik ganda
 Pemasukan data string ke dalam suatu variabel biasa dilakukan dengan fungsi gets()
atau scanf().

123
 Untuk menampilkan isi variabel string, fungsi yang digunakan adalah puts() atau
printf().
 Untuk mengoperasikan suatu nilai string ada beberapa fungsi pustaka yang
prototype-prototype-nya berada di file judul string.h, sehingga dalam suatu program
yang di dalamnya terdapat manipulasi string, haruslan ditambah : #include <string.h>.
 Beberapa fungsi untuk manipulasi string adalah sbb :
a. Fungsi strcpy() untuk menyalin nilai string
b. Fungsi strlen() untuk mengetahui panjang nilai string
c. Fungsi strcat() untuk menggabung nilai string
d. Fungsi strcmp() untuk membandingkan dua nilai string
e. Fungsi strchr() untuk mencari nilai karakter dalam string

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Ketikkan sebuah kalimat melalui keyboard dengan menggunakan gets() (atau fgets())
kemudian didapatkan keluaran berupa laporan tentang jumlah huruf kecil dan huruf
kapital dalam kalimat tsb.

2. Masukkan nama Anda, rubah ke dalam huruf besar semua, balikkan urutan hurufnya,
selanjutnya tampilkan hasilnya di layar.

3. Ketikkan sebuah kalimat, hitung dan tampilkan jumlah spasinya.

4. Ketikkan sebuah kalimat, kemudian tampilkan kalimat tsb satu kata perbaris.
Asumsikan ada satu spasi yang memisahkan setiap kata dan kalimat diakhiri dengan
sebuah tanda titik.

5. Ketikkan sebuah kalimat melalui keyboard kemudian didapatkan keluaran berupa


laporan apakah kalimat tsb palindrom ataukah bukan. Misal :

Kalimat : KASUR RUSAK


Termasuk PALINDROM

Kalimat : MAKAN MALAM


Bukan PALINDROM

124
Catatan : disebut palindrom adalah bila urutan kalimat dibalik akan menghasilkan
kalimat yang sama. Gunakan berbagai fungsi berkaitan dengan string yang sudah
dijelaskan di atas.

BAB VIII
POINTER

8.1. Konsep Dasar Pointer


Variabel pointer sering dikatakan sebagai variabel yang menunjuk ke obyek lain.
Pada kenyataan yang sebenarnya, variabel pointer berisi alamat dari suatu obyek lain
(yaitu obyek yang dikatakan ditunjuk oleh pointer). Sebagai contoh, px adalah variabel
pointer dan x adalah variabel yang ditunjuk oleh px. Kalau x berada pada alamat memori
(alamat awal) 1000, maka px akan berisi 1000. Sebagaimana diilustrasikan pada gambar
8.1 di bawah ini

px
zzzz 1000

Address

125
1000 ?

Gambar 8.1 Variabel pointer px menunjuk ke variabel x

8.2. Mendeklarasikan Variabel Pointer


Suatu variabel pointer dideklarasikan dengan bentuk sebagai berikut :

tipe *nama_variabel

dengan tipe dapat berupa sembarang tipe yang sudah dibahas pada bab-bab sebelumnya,
maupun bab-bab berikutnya. Adapun nama_variabel adalah nama dari variabel pointer.
Sebagai contoh :

int *px; / *contoh 1 */


char *pch1, *pch2; / *contoh 2 */

Contoh pertama menyatakan bahwa px adalah variabel pointer yang menunjuk ke suatu
data bertipe int, sedangkan contoh kedua masing pch1 dan pch2 adalah variabel pointer
yang menunjuk ke data bertipe char.

menyatakan variabel
pointer
char *pch1, *pch2; tanda akhir pernyataan deklarasi
nama variabel pointer

tipe data yang ditunjuk


oleh variabel pointer

Gambar 8.2 Ilustrasi pendeklarasian variabel pointer

8.3. Mengatur Pointer agar Menunjuk ke Variabel Lain


Agar suatu pointer menunjuk ke variabel lain, mula-mula pointer harus diisi
dengan alamat dari variabel yang akan ditunjuk. Untuk menyatakan alamat dari suatu

126
variabel, operator & (operator alamat, bersifat unary) bisa dipergunakan, dengan
menempatkannya di depan nama variabel. Sebagai contoh, bila x dideklarasikan sebagai
variabel bertipe int, maka

&x

berarti “alamat dari variabel x”. Adapun contoh pemberian alamat x ke suatu variabel
pointer px (yang dideklarasikan sebagai pointer yang menunjuk ke data bertipe int)
yaitu:

px = &x;

Pernyataan di atas berarti bahwa px diberi nilai berupa alamat dari variabel x. Setelah
pernyataan tersebut dieksekusi barulah dapat dikatakan bahwa px menunjuk ke variabel
x.

8.4. Mengakses Isi Suatu Variabel Melalui Pointer


Jika suatu variabel sudah ditunjuk oleh pointer, variabel yang ditunjuk oleh
pointer tersebut dapat diakses melalui variabel itu sendiri (pengaksesan langsung)
ataupun melalui pointer (pengaksesan tak langsung). Pengaksesan tak langsung
dilakukan dengan menggunakan operator indirection (tak langsung) berupa simbol *
(bersifat unary). Contoh penerapan operator * yaitu :

*px

yang menyatakan “isi atau nilai variabel/data yang ditunjuk oleh pointer px” . Sebagai
contoh jika y bertipe int, maka sesudah dua pernyataan berikut

px = &x;
y = *px;

y akan berisi nilai yang sama dengan nilai x. Untuk lebih jelasnya perhatikan contoh
program ptr1.c

/* Program : ptr1.c */

#include <stdio.h>

127
main()
{
int y, x = 87; /* x & y bertipe int */
int *px;
/* var pointer yang menunjuk ke data yang bertipe int */

px = &x; /* px diisi dengan alamat dari variabel x */


y = *px; /* y diisi dengan nilai yg ditunjuk oleh px */

printf("Alamat x = %p\n", &x);


printf("Isi px = %p\n", px);
printf("Isi x = %d\n", x);
printf("Nilai yang ditunjuk oleh px = %d\n", *px);
printf("Nilai y = %d\n", y);
}

Contoh eksekusi :
Alamat x = 0012FF78
Isi px = 0012FF78
Isi x = 87
Nilai yang ditunjuk oleh px = 87
Nilai y = 87

Pada program di atas, dua pernyataan

px = &x;
y = *px;

sebenarnya dapat digantikan dengan sebuah pernyataan berupa

y = x;

Seandainya pada program di atas tidak terdapat pernyataan

px = &x;

namun terdapat pernyataan

y = *px;

128
maka y tidaklah berisi nilai x, sebab px belum diatur agar menunjuk ke variabel x. Hal
seperti ini harap diperhatikan. Kalau program melibatkan pointer, dan pointer belum
diinisialisasi, ada kemungkinan akan terjadi masalah yang dinamakan “bug” yang bisa
mengakibatkan komputer tidak dapat dikendalikan (hang).
Selain itu tipe variabel pointer dan tipe data yang ditunjuk harus sejenis. Bila
tidak sejenis maka akan terjadi hasil yang tidak diinginkan. Lebih jelasnya perhatikan
contoh program ptr2.c.

/* Program : ptr1.c */

#include <stdio.h>

main()
{
int *pu;
int nu;
int u = 1234;

pu = &u;
nu = *pu;

printf("Alamat dari u = %p\n", &u);


printf("Isi pu = %p\n", pu);
printf("Isi u = %d\n", u);
printf("Nilai yang ditunjuk oleh pu = %d\n", *pu);
printf("Nilai nu = %d\n", nu);
}

Pada contoh di atas, saat penugasan

pu = &u;

maka pu akan menunjuk data berukuran 4 byte (tipe float) sekalipun u berukuran 2 byte
(tipe int). Oleh karena itu, pernyataan

nu = *pu;

tidak akan membuat nu berisi nilai u. untuk lebih jelasnya lihat gambar berikut.

double *pu;
float nu;
int u; data yang
-------- u ditunjuk oleh pu
pu = &u;
129
bukan bagian
dari u

Gambar 8.3 Ilustrasi kesalahan yang terjadi karena tipe tidak sejenis

8.5. Mengakses dan Mengubah isi Suatu Variabel Pointer


Contoh berikut memberikan gambaran tentang pengubahan isi suatu variabel
secara tak langsung (yaitu melalui pointer). Mula-mula pd dideklarasikan sebagai pointer
yang menunjuk ke suatu data bertipe float dan d sebagai variabel bertipe float.
Selanjutnya

d = 54.5;

digunakan untuk mengisikan nilai 54,5 secara langsung ke variabel d. Adapun

pd = &d;

digunakan untuk memberikan alamat dari d ke pd. Dengan demikian pd menunjuk ke


variabel d. Sedangkan pernyataan berikutnya

*pd = *pd + 10; (atau: *pd += 10; )

merupakan instruksi untuk mengubah nilai variabel d secara tak langsung. Perintah di
atas berarti “jumlahkan yang ditunjuk pd dengan 10 kemudian berikan ke yang ditunjuk
oleh pd”, atau identik dengan pernyataan

d = d + 10;

Akan tetapi, seandainya tidak ada instruksi

pd = &d;

maka pernyataan

*pd = *pd + 10;

130
tidaklah sama dengan

d = d + 10;

/* Program : ptr3.c */

#include <stdio.h>

main()
{
float d = 54.5f, *pd;

printf("Isi d mula-mula = %g\n", d);

pd = &d;
*pd += 10;

printf("Isi d sekarang = %g\n", d);


}

Contoh eksekusi :
Isi d mula-mula = 54.5
Isi d sekarang = 64.5

8.6. Pointer dan Array (pointer to array)


Hubungan antara pointer dan array pada C sangatlah erat. Sebab sesungguhnya
array secara internal akan diterjemahkan dalam bentuk pointer. Pembahasan berikut
akan memberikan gambaran hubungan antara pointer dan array. Misalnya
dideklarasikan di dalam suatu fungsi

static int tgl_lahir[3] = { 01, 09, 64 };

dan

int *ptgl;

Kemudian diberikan instruksi

ptgl = &tgl_lahir[0]; //pointer to array of integer

131
maka ptgl akan berisi alamat dari elemen array tgl_lahir yang berindeks nol. Instruksi di
atas bisa juga ditulis menjadi

ptgl = tgl_lahir;

sebab nama array tanpa tanda kurung menyatakan alamat awal dari array. Sesudah
penugasan seperti di atas,

*ptgl

dengan sendirinya menyatakan elemen pertama (berindeks sama dengan nol) dari array
tgl_lahir. Hal ini bisa dilihat melalui pembuktian program berikut.

/* Program : ptr4.c */

#include <stdio.h>

main()
{
static int tgl_lahir[] = {14, 6, 1981};
int *ptgl;

ptgl = tgl_lahir;
printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);
printf("Nilai dari tgl_lahir[0] = %d\n", tgl_lahir[0]);
}

Contoh eksekusi :
Nilai yang ditunjuk oleh ptgl = 14
Nilai dari tgl_lahir[0] = 14

/* Program : ptr5.c */

#include <stdio.h>

main()
{
static int tgl_lahir[] = {14, 6, 1981};
int *ptgl, i;

ptgl = tgl_lahir;

132
printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);
for (i=0; i<3; i++)
printf("Nilai dari tgl_lahir[i] = %d\n",
*(ptgl+i));
}

Contoh eksekusi:
Nilai yang ditunjuk oleh ptgl = 14
Nilai dari tgl_lahir[0] = 14
Nilai dari tgl_lahir[1] = 6
Nilai dari tgl_lahir[2] = 1981

/* Program : ptr6.c */

#include <stdio.h>

main()
{
static int tgl_lahir[] = {14, 6, 1981};
int i;
int *ptgl;

ptgl = tgl_lahir;

printf("Nilai yang ditunjuk oleh ptgl = %d\n", *ptgl);


for (i=0; i<3; i++)
printf("Nilai dari tgl_lahir[i] = %d\n", *ptgl++);
}

Keterangan : tgl_lahir[i] = *(ptgl+i) = *ptgl++

8.7. Pointer dan String (pointer to string)


Contoh hubungan pointer dan string ditunjukkan pada program berikut.

/* Program : ptr4.c */

#include <stdio.h>

main()
{
/* pkota menunjuk konstanta string “CIMAHI” */
char *pkota = “CIMAHI”;

printf(“String yang ditunjuk oleh pkota = ”);


puts(pkota); // printf(“%s\n”, pkota);

133
}

Contoh eksekusi :
String yang ditunjuk oleh pkota = CIMAHI

Pada program di atas,

char *pkota = “CIMAHI”;

akan menyebabkan kompiler


 mengalokasikan variabel pkota sebagai variabel pointer yang menunjuk ke obyek
bertipe char dan menempatkan konstanta “CIMAHI” dalam suatu memori
 kemudian pointer pkota akan menunjuk ke lokasi string “CIMAHI”.

Lokasi awal string “CIMAHI”


pkota
C I M A H I \0

Gambar 8.4 Pointer menunjuk data

Pernyataan di atas menyerupai pernyataan

char kota[] = “CIMAHI”;

tetapi sebenarnya kedua pernyataan inisialisasi di depan tidaklah tepat sama. Sebab
pkota adalah pointer (menyatakan alamat) yang dengan mudah dapat diatur agar
menunjuk ke string lain (bukan string “CIMAHI”), sedangkan kota adalah array (array
menyatakan alamat yang konstan, tak dapat diubah). Perhatikan dua program di bawah
ini

/* Program : arrnama.c
Menukarkan isi 2 string tanpa pemakaian pointer */

#include <stdio.h>
#include <string.h>

134
#define PANJANG 20

char nama1[PANJANG] = "JAMES BOND";


char nama2[PANJANG] = "HERCULE POIROT";

main()
{
char namax[PANJANG];

puts("SEMULA : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);

strcpy(namax, nama1);
strcpy(nama1, nama2);
strcpy(nama2, namax);

puts("KINI : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);
}

/* Program : ptrnama.c
Menukarkan isi 2 string dengan fasilitas pointer */

#include <stdio.h>
#include <string.h>

char *nama1 = "JAMES BOND";


char *nama2 = "HERCULE POIROT";

main()
{
char *namax;

puts("SEMULA : ");
printf("nama1 --> %s\n", nama1);
/* nama1:pointer yg menunjuk ke string JAMES BOND */
printf("nama2 --> %s\n", nama2);
/* nama2:pointer yg menunjuk ke string HERCULE POIROT */

namax = nama1;
nama1 = nama2;
nama2 = namax;

puts("KINI : ");
printf("nama1 --> %s\n", nama1);
printf("nama2 --> %s\n", nama2);

135
}

8.8. Array dari Pointer (Array of Pointer)


 Suatu array bisa digunakan untuk menyimpan sejumlah pointer. Sebagai contoh:

char *namahari[10];

merupakan pernyataan untuk mendeklarasikan array pointer. Array namahari


terdiri dari 10 elemen berupa pointer yang menunjuk ke data bertipe char.

?
?
?
?
?

namahari

Gambar 8.5 Array pointer

 Array pointer bisa diinisialisasi sewaktu pendeklarasian. Sebagai contoh:

static char *namahari[] =


{“Senin”,
“Selasa”,
“Rabu”,
“Kamis”,
“Jumat”,
“Sabtu”,
“Minggu”};

Pada contoh ini,


namahari[0] berisi alamat yang menunjuk ke string “Senin”.
namahari[1] berisi alamat yang menunjuk ke string “Selasa”.
namahari[2] berisi alamat yang menunjuk ke string “Rabu”.
dan sebagainya.

8.9. Pointer menunjuk Pointer (Pointer to Pointer)

136
Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan
contoh mengenai pointer menunjuk pointer.

Pointer Pointer Variabel


ptr1 ptr1 var_x
alamat alamat
nilai
ptr1 ptr2

Gambar 8.6 Pointer yang menunjuk pointer

 Untuk membentuk rantai pointer seperti pada gambar di atas, pendeklarasian yang
diperlukan berupa

int var_x;
int *ptr1;
int **ptr2;

Perhatikan pada deklarasi di depan:


 var_x adalah variabel bertipe int.
 ptr1 adalah variabel pointer yang menunjuk ke data bertipe int.
 ptr2 adalah variabel pointer yang menunjuk ke pointer int.
(itulah sebabnya deklarasinya berupa int **ptr2; )
 Agar ptr1 menunjuk ke variabel var_x, perintah yang diperlukan berupa

ptr1 = &var_x;

 Sedangkan supaya ptr2 menunjuk ke ptr1, instruksi yang diperlukan adalah

ptr2 = &ptr1;

 Contoh berikut memberikan gambaran cara pengaksesan nilai pada var_x melalui
pointer ptr2 dan ptr1.

/* File program : ppointer.c


Contoh program untuk pointer yang menunjuk pointer */

#include <stdio.h>

main()

137
{
int var_x = 273;
int *ptr1;
int **ptr2;

ptr1 = &var_x;
ptr2 = &ptr1;

printf("Nilai var_x = %d\n", *ptr1);


printf("Nilai var_x = %d\n", **ptr2);
}

Contoh eksekusi :
Nilai var_x = 273
Nilai var_x = 273

8.10. Pointer dalam Fungsi


Pointer dan kaitannya dengan fungsi yang akan dibahas berikut meliputi :
 Pointer sebagai parameter fungsi
 Pointer sebagai keluaran fungsi

8.10.1.Pointer Sebagai Parameter Fungsi


 Penerapan pointer sebagai parameter yaitu jika diinginkan agar nilai suatu variabel
internal dapat diubah oleh fungsi yang dipanggil.
 Sebagai contoh dapat dilihat pada fungsi berikut.
void naikkan_nilai (int *x, int *y)
{
*x = *x + 2;
*y = *y + 2;
}

 Fungsi di atas dimaksudkan agar kalau dipanggil, variabel yang berkenaan dengan
parameter aktual dapat diubah nilainya, masing-masing dinaikkan sebesar 2. Contoh
pemanggilan :

naikkan_nilai(&a, &b);

 Perhatikan, dalam hal ini variabel a dan b harus ditulis diawali operator alamat (&)
yang berarti menyatakan alamat variabel, sebab parameter fungsi dalam
pendefinisian berupa pointer.

138
/* Program : argptr.c
Fungsi dengan argumen berupa pointer */

#include <stdio.h>

void naikkan_nilai(int *, int *);

main()
{
int a = 3, b = 7;

printf("SEMULA : a = %d b = %d\n", a, b);

naikkan_nilai(&a, &b);
printf("KINI : a = %d b = %d\n", a, b);
}

void naikkan_nilai(int *x, int *y)


{
*x = *x + 2;
*y = *y + 2;
}

Contoh eksekusi :
Semula : a = 3 b = 7
Kini : a = 5 b = 9

8.10.2.Pointer Sebagai Keluaran Fungsi (return value)


 Suatu fungsi dapat dibuat agar keluarannya berupa pointer. Misalnya, suatu fungsi
menghasilkan keluaran berupa pointer yang menunjuk ke string nama_bulan, seperti
pada contoh berikut.

char *nama_bulan(int n)
{
static char *bulan[]=
{“Kode bulan salah”, “Januari”, “Februari”, Maret”,
“April”, “Mei”, “Juni”, “Juli”, "Agustus”,
“September”, “Oktober”, “Nopember”,“Desember”
};
return ( (n<1 | | n>12) ? bulan[0] : bulan[n] );
}

 Pada definisi fungsi di atas,

139
char *nama_bulan()

menyatakan bahwa keluaran fungsi nama_bulan() berupa pointer yang menunjuk ke


obyek char (atau string).

 Dalam fungsi nama_bulan(), mula-mula array bernama bulan dideklarasikan dan


sekaligus diinisialisasi agar menunjuk sejumlah string yang menyatakan nama bulan.
Di bagian akhir fungsi, pernyataan

return ( (n<1 || n>12) ? bulan[0] : bulan[n] );

menyatakan bahwa hasil fungsi berupa pointer yang menunjuk ke


o string “Kode bulan salah” (bulan[0]) jika masukan fungsi n<1 atau n>12
o bulan[n] untuk n yang terletak antara 1 sampai dengan 12.

/* File program : pbulan.c


Fungsi dengan keluaran berupa pointer yang menunjuk string */

#include <stdio.h>

char *nama_bulan(int n); //prototype function

main()
{
int bl;
char *pch;

printf("Masukkan Bulan 1..12 : ");


scanf("%d", &bl);
pch = nama_bulan(bl);
printf("Bulan ke-%d adalah %s\n", bl, nama_bulan(bl));
}

char *nama_bulan(int n)
{
static char *bulan[] = {
"Kode bulan salah",
"Januari",
"Februari",
"Maret",
"April",
"Mei",
"Juni",
"Juli",

140
"Agustus",
"September",
"Oktober",
"November",
"Desember"
};
return ((n<1||n>12) ? bulan[0] : bulan[n]);
}

Kesimpulan
 Tipe variabel pointer adalah tipe variabel yang berisi alamat dari variabel yang
sebenarnya.
 Tipe variabel pointer harus sama dengan tipe varibel yang ditunjuk.
 Hubungan antara pointer dan array pada C sangatlah erat, sebab sesungguhnya array
secara internal akan diterjemahkan dalam bentuk pointer
 Varibel pointer bisa berupa string, array atau tipe variabel yang lainnya.
 Suatu pointer bisa saja menunjuk ke pointer lain (pointer to pointer)
 Variabel pointer bisa digunakan sebagai parameter dalam sebuah fungsi,
sebagaimana juga bisa dijadikan sebagai nilai balik (return value) dari sebuah fungsi.

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Berapa nilai dari z dan s pada output program dibawah ini.

#include <stdio.h>

main()
{
int z = 20, s = 30;
int *pz, *ps;

pz = &z;
ps = &s;

*pz += *ps;

printf("z = %d\n", z);


printf("s = %d\n", s);

141
}

2. Bagaimana bentuk output dari program dibawah ini ?

#include <stdio.h>

main()
{
char c = 'Q';
char *char_pointer = &c;

printf("%c %c\n", c, *char_pointer);


c = '/';
printf("%c %c\n", c, *char_pointer);
*char_pointer = '(';
printf("%c %c\n", c, *char_pointer);
}

3. Buat program untuk menampilkan sebaris string seperti contoh berikut ;

“Selamat Pagi“

menggunakan variable pointer (pointer to string).

4. Buat potongan program untuk mencetak huruf ketiga ( A) dari kata : “U N J A N I “


dengan menggunakan variabel pointer .

BAB IX
STRUKTUR

Struktur adalah pengelompokan variabel-variabel yang bernaung dalam satu


nama yang sama. Berbeda dengan array yang berisi kumpulan variabel-variabel yang
bertipe sama dalam satu nama, maka suatu struktur dapat terdiri atas variabel-variabel
yang berbeda tipenya dalam satu nama struktur. Struktur biasa dipakai untuk
mengelompokkan beberapa informasi yang berkaitan menjadi sebuah kesatuan (dalam
bahasa PASCAL, struktur disebut dengan record).
Variabel-variabel yang membentuk suatu struktur, selanjutnya disebut sebagai
elemen dari struktur atau field. Dengan demikian dimungkinkan suatu struktur dapat

142
berisi elemen-elemen data berbeda tipe seperti char, int, float, double, dan lain-lain.
Contoh sebuah struktur adalah informasi data tanggal (date) yang berisi :
 day
 month, dan
 year

9.1. Mendefinisikan & Mendeklarasikan Struktur


Suatu struktur didefinisikan dengan menggunakan kata kunci struct. Contoh
pendefinisian sebuah tipe data struktur :

struct date {
int month;
int day;
int year;
};

struct date {
int month, day, year;
};

yang mendefinisikan sebuah tipe data struktur bernama date yang memiliki tiga buah
elemen (field) berupa : - day
- month
- year

kata kunci nama tipe struktur

struct date
mengawali dan { int month; masing-masing
mengakhiri int day; disebut field atau
elemen-elemen int year; elemen struktur
struktur };

Gambar 9.1 Pendefinisian tipe struktur

Untuk mendeklarasikan sebuah variabel today yang bertipe struktur date pernyataan
yang diperlukan adalah sebagai berikut:

struct date today;

143
nama tipe struktur variabel struktur

Gambar 9.2 Pendeklarasian variabel bertipe struktur

Pernyataan di atas menyatakan bahwa variabel today bertipe struktur date.

Dalam mendefinisikan sebuah struktur, elemen yang terkandung di dalamnya bisa


juga berupa sebuah struktur, contoh :

struct date {
int month, day, year;
};

struct person {
char name[30];
struct date birthday;
};

struct person student; //deklarasi var student

Diagram struktur data dari variabel student dapat digambarkan sbb :

name

student month

birthday day

year

Gambar 9.3. Struktur data dari variabel student

9.2. Mengakses Elemen Struktur

144
Elemen dari suatu variabel struktur dapat diakses dengan menyebutkan nama
variabel struktur diikuti dengan operator titik (‘.’) dan nama dari elemen strukturnya.
Cara penulisannya sebagai berikut

variabel_struktur.nama_field

Untuk memberikan data nama ke field name dari variabel student di atas, maka
pernyataan yang diperlukan misalnya adalah :

strcpy(student.name, "MUHAMMAD IHSAN");

Pada pernyataan di atas, student.name dapat dibaca sebagai "field name dari student".
Contoh berikut merupakan instruksi untuk mengisikan data pada field birthday :

student.birthday.day = 10;

Sedangkan untuk mendapatkan isi suatu field dari variabel struktur, contohnya :
 tgl = student.birthday.day;
 puts(student.name);

Contoh pertama merupakan instruksi untuk memberikan isi dari field day ke variabel tgl.
Sedangkan contoh kedua merupakan instruksi untuk menampilkan isi dari field name.
Program berikut merupakan contoh yang melibatkan variabel struktur. Mula-
mula field dari struktur diisi dengan suatu data, kemudian isinya ditampilkan.

/* File program : student1.c


Mengisi field dr variabel struktur kemudian menampilkannya */

#include <stdio.h>
#include <string.h>

struct date { /* definisi global dari tipe date */


int month;
int day;
int year;
};

struct person { /* definisi global dari tipe person */


char name[30];
struct date birthday;

145
};

/* deklarasi global dari variabel student*/


struct person student;
main()
{
/* memberikan nilai kepada field dari struktur student */
strcpy(student.name, "YUDI HERDIANSAH");
student.birthday.month = 6;
student.birthday.day = 14;
student.birthday.year = 1981;

/* menampilkan isi semua field dari struktur student */


printf("Name : %s\n", student.name);
printf("Birthday : %d-%d-%d\n",student.birthday.month,
student.birthday.day, student.birthday.year);
}

Contoh eksekusi :
Name : YUDI HERDIANSAH
Birthday : 6-14-1981

9.3. Menginisialisasi Struktur


Sebuah struktur juga bisa diinisialisasi pada saat dideklarasikan. Hal ini serupa
dengan inisialisasi array, yaitu elemen-elemennya dituliskan di dalam sepasang kurung
kurawal (‘{ }‘) dengan masing-masing dipisahkan dengan koma. Deklarasi struktur
didahului dengan kata kunci static, contoh
static struct zodiak bintang =
{"Sagitarius", 22, 11, 21, 12};

Selengkapnya perhatikan contoh program di bawah ini.

/* File program : zodiak.c


Menentukan zodiak berdasarkan data tanggal lahir masukan */

#include <stdio.h>

main()
{
struct zodiak {
char nama[11];
int tgl_awal;
int bln_awal;
int tgl_akhir;
int bln_akhir;

146
};

static struct zodiak bintang =


{"Sagitarius", 22, 11, 21, 12};
int tgl_lhr, bln_lhr, thn_lhr;

printf("Masukkan tgl lahir Anda (XX-XX-XXXX): ");


scanf("%d-%d-%d",&tgl_lhr, &bln_lhr, &thn_lhr);

if((tgl_lhr >= bintang.tgl_awal && bln_lhr ==


bintang.bln_awal) || (tgl_lhr <= bintang.tgl_akhir &&
bln_lhr == bintang.bln_akhir))
printf("Bintang Anda adalah %s\n", bintang.nama);
else
printf("Bintang Anda bukan %s\n", bintang.nama);
}

Contoh eksekusi :
Masukkan tgl lahir Anda (XX-XX-XXXX): 23–11-1972
Bintang Anda adalah Sagitarius

9.4. Array dan Struktur


Elemen-elemen dari suatu array juga dapat berbentuk sebuah struktur. Misalnya
array yang dipakai untuk menyimpan sejumlah data siswa (struct student). Array
struktur berdimensi satu ini membentuk suatu tabel, dengan barisnya menunjukkan
elemen dari array-nya dan kolomnya menunjukkan elemen dari struktur. Dalam hal ini
maka deklarasi yang dibutuhkan adalah sebagai berikut :
#define MAKS 20
.
.
.
struct date { /* definisi dari tipe date */
int month;
int day;
int year;
};

struct person { /* definisi dari tipe person */


char name[30];
struct date birthday;
};

/* deklarasi dari variabel array student */


struct person student[MAKS];

147
yang artinya, mendeklarasikan array student yang memiliki elemen yang bertipe struct
person sebanyak MAKS. Setelah array student dideklarasikan, maka ruang yang
disediakan ditunjukkan dalam gambar 9.4 di bawah ini.

birthday

name month day year


0
1

18
19

Gambar 9.4 Array dari struktur

Elemen-elemen dari array stuktur tersebut bisa diakses dengan cara sebagai berikut :

for (i=0; i<MAKS; i++)


{
printf("Name : ");
fgets(student[i].name, sizeof student[i].name, stdin);
printf("Birthday (mm-dd-yyyy): ");
scanf("%d-%d-%d", &student[i].birthday.month,
&student[i].birthday.day,
&student[i].birthday.year);
printf("\n");

/* hapus sisa data dalam penampung keyboard */


fflush(stdin);
};

Selengkapnya perhatikan contoh program di bawah ini.

/* File program : student2.c


Array struktur untuk menyimpan data-data student */

#include <stdio.h>

#define MAKS 20

148
struct date { /* definisi global dr tipe date */
int month;
int day;
int year;
};

struct person { /* definisi global dr tipe person */


char name[30];
struct date birthday;
};

/* deklarasi global dari variabel student */


struct person student[MAKS];

main()
{
int i=0, sudah_benar, jml;
char lagi;

/* memasukkan data */
do
{
printf("Name : ");
fgets(student[i].name, sizeof student[i].name, stdin);

printf("Birthday (mm-dd-yyyy): ");


scanf("%d-%d-%d", &student[i].birthday.month,
&student[i].birthday.day,
&student[i].birthday.year);
printf("\n");

i++;
printf("Mau memasukkan data lagi [Y/T] ? ");
do
{
lagi = getchar( ); /* baca tombol */
sudah_benar = (lagi == 'Y') || (lagi== 'y')||
(lagi == 'T') || (lagi == 't');
} while(! sudah_benar);

/* hapus sisa data dalam penampung keyboard */


fflush(stdin);
printf("\n");
} while(lagi == 'Y' || lagi == 'y');

jml = i;

/* menampilkan data */
printf("DATA SISWA\n");
for (i=0; i<jml; i++)

149
{
printf("%d. Name : %s", i+1, student[i].name);
printf(" Birthday : %d-%d-%d\n\n",
student[i].birthday.month,
student[i].birthday.day,
student[i].birthday.year );
};
}

Contoh eksekusi :
Name : Salsabila
Birthday (mm-dd-yyyy) : 10-25-1979

Mau memasukkan data lagi [Y/T] ? y

Name : Wildan
Birthday (mm-dd-yyyy) : 4-16-1974

Mau memasukkan data lagi [Y/T] ? t

DATA SISWA
1. Name : Salsabila
Birthday : 10-25-1979

2. Name : Wildan
Birthday : 4-16-1974

Di samping cara pendeklarasian di atas, struktur juga dapat dideklarasikan dalam


berbagai bentuk yang lain, di antaranya sbb :

struct date {
int month, day, year;
} today, tomorrow;

struct person {
char name[30];
struct date birthday;
} student[MAKS];

yaitu mendefinisikan struktur date, sekaligus mendeklarasikan variabel today dan


tomorrow dengan tipe struktur date. Demikian juga mendefinisikan struktur person,
sekaligus mendeklarasikan variabel array student sebanyak MAKS elemen dengan tipe
struktur person. Atau cara lainnya mendefinisikan, mendeklarasikan sekaligus
menginisialisasi struktur, sebagai berikut :

150
struct date {
int month, day, year;
} today = {5,14,2001};

9.5. Struktur dan Fungsi


Melewatkan sebuah struktur untuk menjadi parameter sebuah fungsi dapat
dilakukan sama dengan pengiriman parameter berupa variabel biasa. Fungsi yang
mendapat kiriman parameter tersebut juga bisa mengirimkan hasil baliknya yang juga
berupa sebuah struktur (pass by reference)

9.5.1. Melewatkan Elemen Struktur ke dalam Fungsi


Melewatkan parameter berupa elemen struktur dapat dilakukan sebagaimana
pengiriman parameter berupa variabel biasa, dapat dilakukan baik secara nilai (pass by
value) maupun secara acuan (pass by reference).

/* File program : cetak1.c


Melewatkan elemen struktur sbg parameter fungsi scr nilai */

#include <stdio.h>

void cetak_tanggal(int, int, int);

main()
{
struct date { /* definisi lokal dari tipe date */
int month;
int day;
int year;
} today;

printf("Enter the current date (mm-dd-yyyy): ");


scanf("%d-%d-%d", &today.month, &today.day, &today.year);

cetak_tanggal(today.month, today.day, today.year);


}

void cetak_tanggal(int mm, int dd, int yy)


{
static char *nama_bulan[] = {
"Wrong month", "January", "February", "March",
"April", "May", "June", "July", "August",
"September", "October", "November", "December"
};

151
printf("Todays date is %s %d, %d\n\n",
nama_bulan[mm],dd,yy);
}

Contoh eksekusi :
Enter the current date (mm-dd-yyyy): 5-29-2001
Todays date is May 29, 2001

Tampak bahwa elemen dari struktur dilewatkan ke fungsi memakai bentuk pengaksesan
elemen struktur, berupa :

cetak_tanggal(today.month, today.day, today.year);

Apabila nilai suatu elemen struktur diharapkan akan diubah oleh fungsi, maka
yang dilewatkan haruslah berupa alamat dari elemen struktur (pass by reference). Untuk
keperluan ini, operator alamat ditempatkan di depan nama variabel struktur (bukan di
depan nama elemen struktur).

/* File program : posisi1.c


Melewatkan elemen struktur sbg parameter fungsi scr acuan */

#include <stdio.h>

void tukar_xy(int *, int *);

main()
{
struct koordinat {
int x;
int y;
} posisi;

printf("Masukkan koordinat posisi (x, y) : ");


scanf("%d, %d", &posisi.x, &posisi.y);

printf("x, y semula = %d, %d\n", posisi.x, posisi.y);


tukar_xy(&posisi.x, &posisi.y);
printf("x, y sekarang = %d, %d\n", posisi.x, posisi.y);
}

void tukar_xy(int *a, int *b)


{
int z;

z = *a;

152
*a = *b;
*b = z;
}

Contoh eksekusi :
Masukkan koordinat posisi (x, y) : 34, 21
x, y semula = 34, 21
x, y sekarang = 21, 34

9.5.2. Melewatkan Struktur ke dalam Fungsi


Pada program cetak1.c di atas misalnya, semua elemen dari struktur dikirimkan
ke fungsi cetak_tanggal(), dengan maksud nilai elemen dari struktur akan ditampilkan di
layar. Untuk keadaan seperti ini, lebih baik kalau parameter fungsi diubah menjadi
bentuk struktur, sehingga parameter fungsi tidak lagi sebanyak tiga buah, melainkan
hanya satu. Selengkapnya, perhatikan program di bawah ini.

/* File program : cetak2.c


Melewatkan struktur sebagai parameter fungsi */

#include <stdio.h>

struct date { /* definisi global dari tipe date */


int month;
int day;
int year;
};

void cetak_tanggal(struct date);

main()
{
struct date today;

printf("Enter the current date (mm-dd-yyyy): ");


scanf("%d-%d-%d", &today.month, &today.day, &today.year);

cetak_tanggal(today);
}

void cetak_tanggal(struct date now)


{
static char *nama_bulan[] = {
"Wrong month", "January", "February", "March",
"April", "May", "June", "July", "August",
"September", "October", "November", "December"

153
};
printf("Todays date is %s %d, %d\n\n",
nama_bulan[now.month], now.day, now.year);
}

Contoh eksekusi :
Enter the current date (mm-dd-yyyy): 5-29-2001
Todays date is May 29, 2001

9.6. Struktur dan Pointer (Pointer ke Struktur)


Jika sebuah struktur mengandung banyak field dan diputuskan bahwa
keseluruhan field-nya akan diubah oleh fungsi, maka cara yang efisien adalah dengan
melewatkan (passing) alamat dari struktur. Dengan demikian pada pendefinisian fungsi,
parameter formalnya berupa pointer yang menunjuk ke struktur.
Masalah pointer ke struktur dapat diterapkan dalam program posisi1.c. Argumen
dari fungsi tukar_xy() dapat disederhanakan menjadi satu argumen saja, yakni sebagai
berikut :

void tukar_xy(struct koordinat *pos_xy)


{
int z;

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}

Pada definisi fungsi di atas,

struct koordinat *pos_xy

menyatakan bahwa pos_xy adalah pointer yang menunjuk ke obyek bertipe struktur
koordinat. Adapun penulisan :

(*pos_xy).x

menyatakan : elemen bernama x yang ditunjuk oleh pointer pos_xy


Perlu diperhatikan bahwa penulisan tanda kurung seperti pada contoh
(*pos_xy).x merupakan suatu keharusan. Sebab

154
*pos_xy.x

mempunyai makna yang berbeda dengan

(*pos_xy).x

Ungkapan *pos_xy.x mempunyai makna yaitu : "yang ditunjuk oleh pos_xy.x " (sebab
operator titik mempunyai prioritas yang lebih tinggi daripada operator *).

/* File program : posisi2.c


Fungsi parameternya berupa pointer yg menunjuk ke struktur */

#include <stdio.h>

struct koordinat
{ int x;
int y;
};

void tukar_xy(struct koordinat *);

main()
{
struct koordinat posisi;

printf("Masukkan koordinat posisi (x, y) : ");


scanf("%d, %d", &posisi.x, &posisi.y);
printf("x, y semula = %d, %d\n", posisi.x, posisi.y);

tukar_xy(&posisi);

printf("x, y sekarang = %d, %d\n", posisi.x, posisi.y);


}

void tukar_xy(struct koordinat *pos_xy)


{
int z;

z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}

Contoh eksekusi :
Masukkan koordinat posisi (x, y) : 34, 21

155
x, y semula = 34, 21
x, y sekarang = 21, 34

Bentuk semacam :

(*pos_xy).x

dapat ditulis dengan bentuk lain menjadi

pos_xy->x

Dalam C operator → (berupa tanda minus - diikuti dengan tanda lebih dari >) disebut
sebagai operator panah. Dengan menggunakan operator panah, maka fungsi tukar_xy()
dalam program posisi2.c dapat ditulis menjadi

void tukar_xy(struct koordinat *pos_xy)


{
int z;

z = pos_xy->x;
pos_xy->x = pos_xy->y;
pos_xy->y = z;
}

Kesimpulan :
 Struktur adalah pengelompokan variabel-variabel yang bernaung dalam satu nama
yang sama, namun tipe datanya tidak harus sama.
 Variabel-variabel yang membentuk suatu struktur, selanjutnya disebut sebagai
elemen dari struktur atau field.
 Suatu struktur didefinisikan dengan menggunakan kata kunci struct.
 Elemen dari suatu variabel struktur dapat diakses dengan menyebutkan nama
variabel struktur diikuti dengan operator titik (‘.’) dan nama dari elemen
strukturnya.

156
 Sebuah struktur juga bisa diinisialisasi pada saat dideklarasikan. Hal ini serupa
dengan inisialisasi array, yaitu elemen-elemennya dituliskan di dalam sepasang
kurung kurawal (‘{ }‘) dengan masing-masing dipisahkan dengan koma.
 Elemen-elemen dari suatu array juga dapat berbentuk sebuah struktur (array of
struct).
 Melewatkan sebuah struktur untuk menjadi parameter sebuah fungsi dapat
dilakukan sama dengan pengiriman parameter berupa variabel biasa. Fungsi yang
mendapat kiriman parameter tersebut juga bisa mengirimkan hasil baliknya yang
juga berupa sebuah struktur (pass by reference).
 Jika sebuah struktur mengandung banyak field dan diputuskan bahwa keseluruhan
field-nya akan diubah oleh fungsi, maka cara yang efisien adalah dengan melewatkan
(passing) alamat dari struktur. Dengan demikian pada pendefinisian fungsi,
parameter formalnya berupa pointer yang menunjuk ke struktur (pointer to struct).

Latihan :
Buatlah potongan program untuk soal-soal di bawah ini
1. Definisikan sebuah struktur (misalkan namanya = record) yang memiliki 3 buah field
berupa sebuah integer (misalkan namanya = loop), sebuah array karakter dengan 5
elemen (misalkan namanya = word) dan sebuah float (misalkan namanya = sum).

2. Deklarasikan sebuah variabel struktur (misalkan namanya = sample) yang


didefinisikan memiliki tipe struktur record.

3. Masukkan nilai 10 kepada field loop dari struktur sample yang bertipe struktur
record tsb.

4. Tampilkan ke layar (menggunakan fungsi printf()) string yang tersimpan dalam array
word dari struktur sample.

5. Definisikan sebuah struktur (misalkan namanya = date) yang memiliki 3 field bertipe
int (misalkan namanya = day, month dan year). Kemudian tuliskan potongan
program untuk memasukkan 5 buah tanggal yang disimpan dalam sebuah array
struktur yang bertipe date.

157
158

Anda mungkin juga menyukai