Pernyataan if-else
Pernyataan if-else memiliki bentuk :
if (kondisi)
pernyataan-1;
else
pernyataan-2;
Kondisi Salah
Benar
Pernyataan-1 Pernyataan-2
33
/* File program : bagi.c
Pemakaian if-else untuk menyeleksi bilangan pembagi */
#include <stdio.h>
main()
{
float a, 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
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;
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
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 !”
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
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;
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;
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;
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.
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
42
berbentuk jamak, maka pernyataan-pernyataan tersebut harus diletakkan di antara
kurung kurawal buka ({) dan kurung kurawal tutup (}), sehingga formatnya menjadi :
Contoh penggunaan for, misalnya untuk menampilkan deretan angka sebagai berikut :
20
30
40
50
.
.
.
100
Pernyataan
bilangan Salah
<=100
Benar
Cek bilangan
43
bilangan =
bilangan+10
Keluar loop
#include <stdio.h>
main()
{
int 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
44
bilangan = bilangan + 10
#include <stdio.h>
main()
{
int bilangan;
Contoh eksekusi :
60
50
40
30
20
10
45
dapat ditulis menjadi :
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.
46
while (kondisi)
pernyataan;
Kondisi Salah
Benar
Pernyataan
Keluar loop
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 :
47
#include <stdio.h>
main()
{
char pilihan;
/* diberi nilai salah lebih dahulu */
int sudah_benar = 0;
while(!sudah_benar)
{
pilihan = getchar(); /* baca tombol */
sudah_benar = (pilihan == 'Y') || (pilihan == 'y')||
(pilihan == 'T') || (pilihan == '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');
}
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 :
#include <stdio.h>
main()
{
char kar;
int jumkar = 0, jumspasi = 0;
49
Contoh eksekusi :
Masukkan sebuah kalimat, akhiri dgn ENTER.
Saya akan menghitung jumlah karakter pada kalimat tersebut.
Jumlah karakter = 36
Jumlah SPASI = 4
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.
Benar Kondisi
Salah
Keluar loop
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");
#include <stdio.h>
main()
{
char pilihan;
int sudah_benar;
51
puts("\nPilihan anda adalah T");
}
}
Contoh eksekusi :
Pilihlah Y atau T
Pilihan anda adalah T
for ( ; ; )
{
.
.
if ( …… )
break;
.
.
} /* akhir tubuh loop for */
puts(“\nSelesai…”);
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.
#include <stdio.h>
main()
{
char kar;
for ( ; ; )
{
kar = getchar();
if(kar == '\n')
break;
}
printf("Selesai\n");
}
Contoh eksekusi :
Ketik sembarang kalimat dan akhiri dengan ENTER :
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.
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)
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.
#include <stdio.h>
main()
{
int x;
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;
printf(“%d”,x);
x += 2
x <= 25
55
if (x != 15)
printf(“%4d”, x);
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
#include <stdio.h>
#define MAKS 8
main()
{
int baris, kolom, hasil_kali;
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
digunakan untuk mencetak suatu deret hasil perkalian dalam satu baris. Untuk berpindah
ke baris berikutnya, pernyataan yang digunakan yaitu
printf(“\n”);
Pernyataan di atas mempunyai arti “dari baris ke-1 sampai dengan baris ke-MAKS”.
57
goto cetak;
cetak :
Pernyataan
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.
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
#include <stdio.h>
#include <stdlib.h>
58
main()
{
char kar;
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 :
while (kondisi)
pernyataan;
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.
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
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
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);
}
Nama fungsi
Sepasang tanda kurung, tanpa argumen
inisialisasi() Tidak ada tanda koma
{ Awal fungsi
return(0); Tubuh fungsi
} Akhir fungsi
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);
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
x = inisialisasi();
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.
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.
#include <stdio.h>
main()
{
int a, b, kecil;
Contoh eksekusi :
Masukkan nilai a = 4
Masukkan nilai b = 2
66
Bilangan terkecil antara 4 dan 2 adalah 2
#include <stdio.h>
main()
{
float a, b, kecil;
67
return(y);
}
Contoh eksekusi :
Masukkan nilai a = 5.5
Masukkan nilai b = 6.23
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.
#include <stdio.h>
main()
{
info_program(); /* pemanggilan fungsi */
}
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.
atau
Nama fungsi
float jumlah (float, float); Diakhiri dengan titik koma
Tipe parameter kedua
Tipe parameter pertama
Tipe keluaran fungsi
#include <stdio.h>
69
main()
{
float a, b,c;
c = jumlah(a, b);
printf("\nHasil penjumlahan a + b = %g\n", c);
}
Contoh eksekusi :
Masukkan nilai a : 4.5
Masukkan nilai b : 7.65
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.
70
dan y dinamakan sebagai parameter formal. Adapun parameter aktual adalah parameter
(tidak selalu berupa variabel) yang dipakai dalam pemanggilan fungsi.
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 :
ungkapan
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>
main()
{
int a,b;
a = 88;
b = 77;
tukar(a,b);
z = x;
x = y;
y = z;
Contoh eksekusi :
Nilai sebelum 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)
z = x;
x = y;
y = z;
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 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;
px py
alamat a alamat b
a b
Gambar 5.7
Variabel pointer px menunjuk variabel a dan variabel pointer py menunjuk variabel b
74
Untuk melihat pengaruh pemanggilan nilai pada fungsi untuk
penukaran dua data */
#include <stdio.h>
main()
{
int a,b;
a = 88;
b = 77;
z = *px;
*px = *py;
*py = z;
Contoh eksekusi :
Nilai sebelum pemanggilan fungsi
a = 88 b = 77
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.
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
int x;
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;
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.
#include <stdio.h>
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
#include <stdio.h>
void tambah(void);
main()
{
extern int i; /* variabel eksternal */
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.
#include <stdio.h>
void tambah(void);
main()
{
extern int i; /* variabel eksternal */
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).
Variabel statis diperoleh dengan menambahkan kata kunci static di depan tipe
data variabel. Sebagai contoh perhatikan program di bawah ini.
#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
#include <stdio.h>
main()
{
register int i; /* variabel register */
int jumlah = 0;
82
}
Contoh eksekusi :
1 + 2 + 3 + ... + 100 = 5050
fungsi_a() fungsi_b()
fungsi_c()
#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
#include <stdio.h>
84
int faktorial(int);
main()
{
int 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
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).
fungsi utama
main()
fungsi_a() … fungsi_n()
fungsi_a1() … fungsi_am()
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.
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).
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.
BAB VI
ARRAY
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.
float nilai_tes[5];
nilai_tes[1]
nilai_tes[3]
nilai_tes[4]
float nilai_tes[5]
89
nama_var[indeks]
&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
#include <stdio.h>
#define MAKS 5
main()
{
int i;
float total = 0, rata;
float nilai_tes[MAKS]; /* deklarasi array */
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
#include <stdio.h>
main()
{
int bulan, tahun, jhari;
int jum_hari[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
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
int jum_hari[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
#include <stdio.h>
main()
{
int i;
int values[] = {1,2,3,4,5,6,7,8,9};
char word[] = {'H','e','l','l','o'};
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.
2. (BASIC) 15 83 301
93
3. (PASCAL) 8 12 15
int data_lulus[4][3];
0 1 2 Indek kedua
(tahun)
0 80 540 1032
1 15 83 301
2 8 12 15
3 10 129 257
Sama halnya pada array berdimensi satu, data array aka ditempatkan pada memori yang
berurutan. Perhatikan Gambar 6.3.
94
6.2.2. Mengakses Elemen Array Berdimensi Dua
Array seperti data_lulus dapat diakses dalam bentuk
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;
#include <stdio.h>
95
main( )
{
int tahun, kode_program;
int data_lulus[4][3] ;
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;
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
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
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 }
};
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.
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 }
};
sebagai contoh :
98
int data_huruf[2][8][8];
99
Program berikut merupakan pengembangan dari Program 8 – 4, digunakan untuk
menampilkan dua buah huruf dengan ukuran besar.
# 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 }
}
};
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’,
};
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;
Contoh Eksekusi :
Masukkan sebuah kalimat dan akhiri dengan ENTER
Kemudian kalimat tsb akan saya sandikan
Kalimat : Saya belajar
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.
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=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
Gambar 6.6 Proses pengurutan data secara ascending dengan metode Buble Sort
#include <stdio.h>
#define MAKS 20
main()
105
{
float data[MAKS];
int jum_data;
pemasukan_data(data, &jum_data);
pengurutan_data(data, jum_data);
penampilan_data(data, jum_data);
}
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
Pada fungsi untuk pemasukan data, pengurutan data maupun penampilan data,
data[i]
107
Beberapa hal tambahan yang perlu diketahui :
Untuk menyatakan alamat dari suatu elemen array, bentuk umumnya adalah
&nama_array[indeks]
Misalnya,
&data[1]
&data[0]
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
110
“ABCDE”
Nilai string ini disimpan dalam memori secara berurutan dengan komposisi sebagai
berikut:
memori rendah memori tingi
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.
char name[15];
111
yang menyatakan bahwa name adalah variabel string dengan nilai awal berupa string :
“RINI” . Bentuk inisialisasi yang lebih singkat :
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.
#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];
Contoh eksekusi :
Masukkan nama Anda : YUDI
Halo, YUDI. Selamat belajar string.
name :
name : Y U D I \0
karakter NULL
byte sisa tak dipakai
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.
#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
#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++
115
/* File Program : hitkar.c
Contoh untuk menghitung banyaknya karakter dari suatu string
yang dimasukkan melalui keyboard */
#include <stdio.h>
main()
{
int i, jumkar = 0;
char teks[MAKS];
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
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.
#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.
#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";
Contoh eksekusi :
String pertama adalah : ABCDE
String kedua adalah : ABCDE
#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.
#include <stdio.h>
#include <string.h>
main()
{
119
char salam[] = "Halo";
Contoh eksekusi :
Panjang string = 4 karakter
#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.
#include <stdio.h>
#include <string.h>
#define PJG 15
main()
{
char str1[PJG], str2[PJG];
Contoh eksekusi :
str1 → salatiga str2 → tiga
120
Dalam hal ini str1 (“sala”) digabungkan dengan str2 (“tiga”) dengan hasilnya berada di
str1 (“salatiga”).
#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.
#include <stdio.h>
#include <string.h>
main()
{
char str1[]="HALO”;
char str2[]="Halo";
char str3[]="HALO”;
121
printf(“Hasil pembandingan %s dengan %s --> %d\n”,
str2, str1, strcmp(str2, str1));
Contoh eksekusi :
Hasil pembandingan HALO dengan Halo --> -1
Hasil pembandingan Halo dengan HALO --> 1
Hasil pembandingan HALO dengan HALO --> 0
#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.
#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 */
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 :
Sedangkan pencarian karakter ‘X’ memberikan hasil null karena karakter tersebut tidak
ditemukan dalam string ‘ABcde”, sehingga didapatkan keluaran :
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.
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.
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
px
zzzz 1000
Address
125
1000 ?
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 :
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
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.
*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 */
Contoh eksekusi :
Alamat x = 0012FF78
Isi px = 0012FF78
Isi x = 87
Nilai yang ditunjuk oleh px = 87
Nilai y = 87
px = &x;
y = *px;
y = x;
px = &x;
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;
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
d = 54.5;
pd = &d;
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;
pd = &d;
maka pernyataan
130
tidaklah sama dengan
d = d + 10;
/* Program : ptr3.c */
#include <stdio.h>
main()
{
float d = 54.5f, *pd;
pd = &d;
*pd += 10;
Contoh eksekusi :
Isi d mula-mula = 54.5
Isi d sekarang = 64.5
dan
int *ptgl;
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;
/* Program : ptr4.c */
#include <stdio.h>
main()
{
/* pkota menunjuk konstanta string “CIMAHI” */
char *pkota = “CIMAHI”;
133
}
Contoh eksekusi :
String yang ditunjuk oleh pkota = 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
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>
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
}
char *namahari[10];
?
?
?
?
?
namahari
136
Suatu pointer bisa saja menunjuk ke pointer lain. Gambar berikut memberikan
contoh mengenai pointer menunjuk pointer.
Untuk membentuk rantai pointer seperti pada gambar di atas, pendeklarasian yang
diperlukan berupa
int var_x;
int *ptr1;
int **ptr2;
ptr1 = &var_x;
ptr2 = &ptr1;
Contoh berikut memberikan gambaran cara pengaksesan nilai pada var_x melalui
pointer ptr2 dan ptr1.
#include <stdio.h>
main()
137
{
int var_x = 273;
int *ptr1;
int **ptr2;
ptr1 = &var_x;
ptr2 = &ptr1;
Contoh eksekusi :
Nilai var_x = 273
Nilai var_x = 273
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>
main()
{
int a = 3, b = 7;
naikkan_nilai(&a, &b);
printf("KINI : a = %d b = %d\n", a, b);
}
Contoh eksekusi :
Semula : a = 3 b = 7
Kini : a = 5 b = 9
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] );
}
139
char *nama_bulan()
#include <stdio.h>
main()
{
int bl;
char *pch;
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;
141
}
#include <stdio.h>
main()
{
char c = 'Q';
char *char_pointer = &c;
“Selamat Pagi“
BAB IX
STRUKTUR
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
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
struct date
mengawali dan { int month; masing-masing
mengakhiri int day; disebut field atau
elemen-elemen int year; elemen struktur
struktur };
Untuk mendeklarasikan sebuah variabel today yang bertipe struktur date pernyataan
yang diperlukan adalah sebagai berikut:
143
nama tipe struktur variabel struktur
struct date {
int month, day, year;
};
struct person {
char name[30];
struct date birthday;
};
name
student month
birthday day
year
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 :
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.
#include <stdio.h>
#include <string.h>
145
};
Contoh eksekusi :
Name : YUDI HERDIANSAH
Birthday : 6-14-1981
#include <stdio.h>
main()
{
struct zodiak {
char nama[11];
int tgl_awal;
int bln_awal;
int tgl_akhir;
int bln_akhir;
146
};
Contoh eksekusi :
Masukkan tgl lahir Anda (XX-XX-XXXX): 23–11-1972
Bintang Anda adalah Sagitarius
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
18
19
Elemen-elemen dari array stuktur tersebut bisa diakses dengan cara sebagai berikut :
#include <stdio.h>
#define MAKS 20
148
struct date { /* definisi global dr tipe date */
int month;
int day;
int year;
};
main()
{
int i=0, sudah_benar, jml;
char lagi;
/* memasukkan data */
do
{
printf("Name : ");
fgets(student[i].name, sizeof student[i].name, stdin);
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);
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
Name : Wildan
Birthday (mm-dd-yyyy) : 4-16-1974
DATA SISWA
1. Name : Salsabila
Birthday : 10-25-1979
2. Name : Wildan
Birthday : 4-16-1974
struct date {
int month, day, year;
} today, tomorrow;
struct person {
char name[30];
struct date birthday;
} student[MAKS];
150
struct date {
int month, day, year;
} today = {5,14,2001};
#include <stdio.h>
main()
{
struct date { /* definisi lokal dari tipe date */
int month;
int day;
int year;
} today;
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 :
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).
#include <stdio.h>
main()
{
struct koordinat {
int x;
int y;
} posisi;
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
#include <stdio.h>
main()
{
struct date today;
cetak_tanggal(today);
}
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
z = (*pos_xy).x;
(*pos_xy).x = (*pos_xy).y;
(*pos_xy).y = z;
}
menyatakan bahwa pos_xy adalah pointer yang menunjuk ke obyek bertipe struktur
koordinat. Adapun penulisan :
(*pos_xy).x
154
*pos_xy.x
(*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 *).
#include <stdio.h>
struct koordinat
{ int x;
int y;
};
main()
{
struct koordinat posisi;
tukar_xy(&posisi);
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
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
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).
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