Anda di halaman 1dari 107

1

DIKTAT MATA PELAJARAN


PENGANTAR PEMROGRAMAN C++
2

DAFTAR ISI

Halaman

KATA PENGANTAR …………………………………………………………


DAFTAR ISI …………………………………………………………………..
I. PENDAHULUAN …………………………………………………………...
1.1 Operator Keluaran ………………………………………………………….
1.2 Karakter & String Literal ............................................................................
1.3 Panjang String ...............................................................................................
1.4 Komentar (tidak pernah di compile oleh compiler) ......................................
1.5 Variabel, Obyek dan Deklarasinya ………………………………………...
1.6 Keyword dan Identifier …………………………………………………….
1.7 Inisialisasi dalam Deklarasi ………………………………………………..
1.8 Penugasan Berantai (Chained Assignment) ………………………………..
1.9 Tanda Semicolon (;) ………………………………………………………..
1.10 Bentuk Program …………………………………………………………..
1.11 Tipe Integer .................................................................................................
1.12 Operator Aritmatik ......................................................................................
1.13 Operator Naik dan Operator Turun (Increment dan Decrement) …………
1.14 Ekspresi Penugasan Campuran …………………………………………...
1.15 Integer Overflow dan Underflow ………………………………………….
1.16 Tipe Karakter ……………………………………………………………..
II. PERNYATAAN KONDISI DAN TIPE INTEGER ………………………..
2.1 Pernyataan Masukan ……………………………………………………….
2.2 Pernyataan Kondisional IF …………………………………………………
2.3 Pernyataan Kondisional IF … ELSE ............................................................
2.4 Operator-Operator Relasi ..............................................................................
2.5 Pernyataan Campuran ……………………………………………………...
2.6 Kata-Kata Kunci (Keywords) ........................................................................
2.7 Kondisi-Kondisi Campuran ………………………………………………..
2.8 Pernyataan Kondisional Bersarang (Nested Conditionals) ………………...

Halaman

2.9 Pernyataan SWITCH .....................................................................................


2.10 Operator Ekspresi Kondisional …………………………………………...
2.11 Jangkauan (Scope) ……………………………………………………….
3

2.12 Tipe-Tipe Enumeration …………………………………………………...


2.13 Konversi Tipe Integer .................................................................................
III. ITERASI DAN TIPE FLOATING ................................................................
3.1 Pernyataan WHILE ………………………………………………………...
3.2 Pernyataan DO … WHILE ...........................................................................
3.3 Pernyataan FOR ……………………………………………………………
3.4 Pernyataan BREAK ………………………………………………………..
3.5 Pernyataan CONTINUE …………………………………………………...
3.6 Pernyataan GOTO ………………………………………………………….
3.7 Tipe-tipe Bilangan Riel …………………………………………………….
3.8 Tipe-Tipe Konversi ………………………………………………………...
3.9 Kesalahan Pembulatan (Roundoff Error) ………………………………….
3.10 Format E Untuk Nilai_nilai Floating Point ………………………………
3.11 Konstanta, Variabel dan Obyek …………………………………………..
IV. FUNGSI-FUNGSI …………………………………………………………
4.1 Fungsi-Fungsi Pustaka Standard C ..............................................................
4.2 Fungsi-Fungsi yang didefinisikan oleh User ................................................
4.3 Deklarasi Fungsi dan Definisi Fungsi ...........................................................
4.4 Kompilasi Terpisah ………………………………………………………...
4.5 Variabel Lokal dan Fungsi Lokal .................................................................
4.6 Fungsi Void ………………………………………………………………..
4.7 Fungsi-Fungsi Boolean .................................................................................
4.8 Melalukan dengan Referensi ……………………………………………….
4.9 Melalukan dengan Referensi Konstanta …………………………………...
4.10 Fungsi Scope ……………………………………………………………...
4.11 Overloading ………………………………………………………………

Halaman

4.12 Fungsi main () dan Fungsi exit () ................................................................


4.13 Argumen-Argumen Default ........................................................................
V. DERET (ARRAYS) .........................................................................................
5.1 Inisialisasi Sebuah Deret ...............................................................................
5.2 Melalukan Sebuah Deret ke Suatu Fungsi …………………………………
5.3 C++ Tidak Men-cek Jangkauan dari suatu Indeks Deret …………………
5.4 Algoritma Mencari Secara Linier (Linear Search) .......................................
5.5 Algoritma Bubble Sort ……………………………………………………..
4

5.6 Algoritma Mencari Secara Biner (Binary Search) ........................................


5.7 Menggunakan Deret dengan Tipe-Tipe Enumeration ……………………..
5.8 Deret Multidimensional ……………………………………………………
DAFTAR PUSTAKA .........................................................................................
5

I. PENDAHULUAN

Contoh :

#include <iostream.h>
// Program ini menuliskan “Selamat Pagi.”
main()
{
cout << “Selamat Pagi.\n”;
return 0;
}

#include  agar program menghasilkan keluaran. Dalam hal ini


menunjuk ke file eksternal bernama iostream.h, dimana informasi tentang
obyek cout berada.
< >  file standard C++.

//  menyatakan komentar, tidak pernah di compile oleh compiler.

main()  selalu ada dalam program C++ (dibutuhkan), yang menyatakan awal
dari program.

{ dan }  program C++ berada diantara kedua kurung kurawal ini.

cout << “Selamat Pagi.\n”;  pesan yang dikirimkan ke obyek cout

(keluaran melalui console).

Obyeknya adalah standard output stream, yang


biasanya merepresentasikan keluaran melalui layar
monitor.

Keluaran dari contoh program di atas adalah

Selamat Pagi.

\n  keluaran yang berikutnya muncul pada baris yang baru (bukan


disebelahnya) atau ganti baris.

return 0  mengakhiri eksekusi program dan kembali ke kontrol sistem operasi.

Pernyataan return 0 tidak selalu dibutuhkan oleh kebanyakan compiler.


6

1.2 Operator Keluaran

Simbol << disebut insertion operator atau output operator (operator keluaran).

Contoh :

Pernyataan cout << 999 akan menampilkan bilangan 999 di layar monitor.
cout disebut juga sebagai suatu stream, yang mengeluarkan keluaran seperti suatu
aliran (stream).

Contoh :

#include <iostream.h>
// Program berikut menggambarkan keluaran sekuensial dari beberapa string.
main()
{
cout << “Sela” << “mat “ << “Pagi.\n”;
return 0;
}

Bentuk umum :

cout << ekspresi << ekspresi << … << ekspresi

1.2 Karakter & String Literal

“Selamat”  literal string


“S”  karakter

1.3 Panjang String

strlen()  nama fungsi untuk mendefinisikan panjang string.

Fungsi strlen() dideklarasikan dalam file terpisah string.h.


Bila program memerlukan memakai fungsi strlen(), maka harus memasukkannya
dalam

#include <string.h>
7

di atas main().

Contoh :

#include <iostream.h>
#include <string.h>
// Program berikut memeriksa fungsi strlen().
main()
{
cout << strlen(“Selamat Pagi.\n”) << ‘\n’;
cout << strlen(“Selamat Pagi.”) << ‘\n’;
cout << strlen(“Selamat”) << ‘\n’;
cout << strlen(“S”) << ‘\n’;
cout << strlen(“”) << ‘\n’;
return 0;
}

Keluarannya :

14
13
7
1
0

1.4 Komentar (tidak pernah di compile oleh compiler)

Terdapat 2 jenis seperti berikut.

Jenis 1 : /* Komentarnya */  merupakan standard C.

Jenis 2 : // Komentarnya  Lebih banyak dipakai.

1.7 Variabel, Obyek dan Deklarasinya

Variabel adalah simbol dari suatu besaran yang merepresentasikan suatu


lokasi di dalam memori komputer.
Informasi yang tersimpan di dalam lokasi tersebut disebut nilai variabel (value of the
variable).
Untuk memperoleh nilai dari suatu variabel dengan menggunakan pernyataan
penugasan (assignment statement), yang mempunyai sintaks seperti berikut

variabel = ekspresi;
8

Yang akan diolah lebih dulu adalah ekspresi, baru hasilnya merupakan nilai dari
variabel.
Tanda “=” adalah operator penugasan (assignment operator).

Contoh :

#include <iostream.h>
// Sebuah contoh sederhana untuk menggambarkan penugasan.
main()
{
int n;
n = 66;
cout << n << endl;
return 0;
}

Keluarannya adalah

66

Konstanta simbolik endl mempunyai arti yang sama dengan endline character ‘\
n’ dan akan membersihkan buffer keluaran.

Suatu deklarasi dari suatu variabel adalah sebuah pernyataan yang memberikan
informasi tentang variabel kepada compiler C++. Sintaksnya adalah

type variable;

dengan type adalah nama dari beberapa tipe C++.

Contoh : deklarasi

int n;

menyatakan 2 (dua) hal kepada compiler :

1. nama variabel adalah n


2. variabel mempunyai tipe int (integer).

Setiap variabel harus mempunyai sebuah tipe. Tipe memberitahu kepada compiler
bagaimana nilai-nilai variabel disimpan dan digunakan.
Pada beberapa komputer, tipe int terdiri dari semua nilai integer yang berada dalam
jangkauan (range) dari -32.768 sampai dengan 32.767.
9

C++ adalah suatu bahasa pemrograman yang berorientasi obyek (object oriented
programming language). Yang antara lain berarti bahasa yang baik digunakan pada
sistem-sistem simulasi, yang memuat interaksi objek, seperti suatu sistem kendali di
bandara. Sebagai suatu simulasi, objek dari sistem (pesawat, orang, bagasi dan lain-
lain) dalam program komputer dinyatakan oleh variabel-variabel.

Contoh :

#include <iostream.h>
// Program berikut menggambarkan deklarasi variabel.
main()
{
int x, y1; // deklarasi variabel x dan y1
x = 50;
y1 = 12;
int y2 = 55; // deklarasi variabel y2, dengan nilai awal 55
cout << x << “, “ << y1 << “, “ << y2 << endl;
return 0;
}

Keluarannya adalah :

50, 12, 55

Deklarasi variabel juga dapat dilakukan untuk lebih dari satu variabel. Pernyataan

int x, y1;

mendeklarasikan x dan y1 sebagai variabel integer.


Bentuk umum :

tipe var1, var2, …, varN;

1.8 Keyword dan Identifier

Dalam bahasa pemrograman, suatu program dibuat dari elemen-elemen


sintaks individual, yang disebut token, yang memuat nama variabel,
konstanta, keyword (kata kunci), operator dan tanda baca.

Contoh :
10

#include <iostream.h>
// Sebuah program sederhana untuk menggambarkan token.
main()
{
int n = 99;
cout << n << endl;
return 0;
}

Keluarannya adalah

99

Program di atas memperlihatkan sebayak 15 token, yaitu main, (, ), {, int, n, =, 99, ;,


cout, <<, endl, return, 0 dan }.
Token n adalah suatu variabel.
Token 99, 0 dan endl adalah konstanta.
Token int dan return adalah keyword.
Token = dan << adalah operator.
Token (, ), {, ;, dan } adalah tanda baca.
Dua baris yang pertama dalam contoh di atas berisi suatu preprocessor directive dan
sebuah komentar, yang bukan bagian sebenarnya dari program.

Keyword disebut juga sebagai reserved word, karena memang telah disediakan
oleh bahasa pemrograman yang bersangkutan untuk digunakan dan tidak perlu
mendefinisikannya kembali. Adapun cara penulisannya harus seperti yang telah
ditetapkan.

Identifier adalah suatu string dari karakter alphanumerik yang selalu


diawali dengan suatu karakter alphabetis. Ada 53 karakter alphabetis,
yang terdiri dari 52 huruf dan karakter underscore _. Ada 63 karakter
alphanumerik, yang terdiri dari 52 karakter alphabetis dan 10 digit
angka (0, 1, 2, …, 9).

Jadi main(), int, n, cout dan endl adalah identifier.

1.7 Inisialisasi dalam Deklarasi

Dalam deklarasi, sebuah variabel diinisialisasi oleh penunjukan suatu


nilai.

Contoh :
11

#include <iostream.h>
// Program berikut memperlihatkan inisialisasi sebuah variabel.
main()
{
int amir = 40;
int mirna = 30;
int sum = amir + mirna;
cout << amir << “ + “ << mirna << “ = “ << sum << endl;
return 0;
}

Keluarannya adalah

40 + 30 = 70

Sebuah inisialisasi hampir sama dengan sebuah penugasan (assignment), dimana


keduanya menggunakan tanda “=” yang diikuti oleh sebuah ekspresi.

Secara umum, akan lebih baik untuk menginisialisasi variabel pada saat variabel
tersebut dideklarasikan.

Contoh :

#include <iostream.h>
// Program berikut memperlihatkan inisialisasi sebuah variabel.
main()
{
int n1, n2 = 50, n3, n4, n5 = 40, n6;
cout << n2 << “, “ << n5 << endl;
return 0;
}

Keluarannya adalah

50, 40

Enam variabel n1 sampai dengan n6 dideklarasikan mempunyai tipe int,


tetapi hanya dua variabel n2 dan n5 yang diinisialisasi.
12

Beberapa compiler (seperti Borland C++) akan memberi peringatan jika ada variabel
tidak diinisialisasikan.

1.8 Penugasan Berantai (Chained Assignment)

Sebuah penugasan adalah sebuah ekspresi dengan suatu nilai. Nilai dari ekspresi

x = 25;

adalah 25. Dan seperti nilai yang lain, nilai dari sebuah penugasan dapat digunakan
dalam penugasan lainnya, seperti

y = (x = 25);

Bentuk seperti di atas disebut sebagai penugasan berantai (chained assignment).


Pertama penugasannya adalah 25 untuk x, kemudian penugasan selanjutnya 25
untuk y. Penugasan campuran biasanya dituliskan tanpa tanda kurung

y = x = 25;

Contoh : penugasan embedded

#include <iostream.h>
// Program berikut memperlihatkan bahwa sebuah penugasan merupakan
bagian
// dari suatu ekspresi yang lebih besar.
main()
{
int m, n;
m = (n = 65) + 10; // (n = 65) adalah suatu ekspresi penugasan
cout << m << “, “ << n << endl;
return 0;
}

Keluarannya adalah

75, 65

Penugasan-penugasan embedded biasanya dapat dihindari. Contohnya, dua baris


pertama dari contoh di atas akan lebih baik dituliskan sebagai

int n = 65;
int m = n + 10;

Hal ini juga memperlihatkan lebih praktis untuk mendeklarasikan variabel


sebelumnya.
13

Dalam beberapa situasi penugasan embedded membuat program lebih enak dibaca.
Sebagai contoh, pernyataan tunggal berikut lebih baik dibandingkan bila
menggunakan 8 pernyataan yang terpisah

n1 = n2 = n3 = n4 = n5 = n6 = n7 = n8 = 65535;

Sebuah penugasan berantai tidak dapat digunakan sebagai inisialisasi dalam suatu
deklarasi.

int x = y = 20; // SALAH

Bentuk di atas salah, dimana inisialisasi bukanlah penugasan. Keduanya mempunyai


bentuk yang sama, tetapi compiler akan menanganinya secara berbeda. Yang benar
adalah

int x = 20, y = 20; // BENAR

1.9 Tanda Semicolon (;)

Tanda semicolon (;) digunakan untuk mengakhiri sebuah pernyataan.


Setiap pernyataan harus diakhiri dengan sebuah tanda semicolon (;).
Baris yang diawali oleh tanda #, seperti

#include <iostream.h>

tidak diakhiri dengan tanda semicolon, karena bentuk tersebut bukanlah suatu
pernyataan, tetapi merupakan preprocessing directive.

1.10 Bentuk Program

Bahasa pemrograman C++ adalah suatu bahasa yang bebas bentuknya, dimana
penempatan elemen programnya dalam baris atau pada halamannya bebas.
Akibatnya pemrogram mempunyai kebebasan yang penuh dalam membentuk
programnya. Meskipun demikian sangat dianjurkan menyusun program dengan
bentuk yang beraturan. Berikut adalah anjuran bagaimana sebuah program C++
disusun.

 Letakkan semua bentuk #include pada bagian awal (paling atas) dari file.
 Letakkan setiap pernyataan pada suatu baris baru.
 Masukkan semua pernyataan dalam suatu blok.
 Berikan sebuah spasi diantara operator, seperti : n = 5.
14

1.11 Tipe Integer

Bilangan integer adalah semua bilangan (positif dan negatif) yang tidak memuat
tanda titik desimal. Unsigned integer adalah bilangan integer yang non-negatif.
C++ mempunyai sembilan tipe integer, yaitu

char short int unsigned short int


signed char int unsigned int
unsigned char long int unsigned long int

Perbedaaan dari ke sembilan tipe ini terletak pada jangkauan nilai yang diijinkan
untuknya. Jangkauan ini juga ditentukan oleh sistem komputer yang digunakan.
Sebagai contoh dalam PC DOS, jangkauan int berkisar antara - 32.768 sampai
dengan 32.767, sementara dalam workstation UNIX jangkauannya dapat mencapai
-2.147.483.648 sampai dengan 2.147.483.647.

Contoh program berikut memperlihatkan jangkauan dari semua tipe integar pada
mesin. Nama-nama SCHAR_MIN, LONG_MAX dan sebagainya adalah konstanta
yang disimpan dalam file <limits.h>, sehingga preprocessor directive nya adalah

#include <limits.h>

Contoh :

#include <iostream.h>
#include <limits.h>
// Mencetak konstanta-konstanta yang tersimpan dalam limits.h.
main()
{
cout << “minimum char = “ << CHAR_MIN << endl;
cout << “maximum char = “ << CHAR_MAX << endl;
cout << “minimum short = “ << SHRT_MIN << endl;
cout << “maximum short = “ << SHRT_MAX << endl;
cout << “minimum int = “ << INT_MIN << endl;
cout << “maximum int = “ << INT_MAX << endl;
cout << “minimum long = “ << LONG_MIN << endl;
cout << “maximum long = “ << LONG_MAX << endl;
cout << “minimum signed char = “ << SCHAR_MIN << endl;
cout << “maximum signed char = “ << SCHAR_MAX << endl;
cout << “maximum unsigned char = “ << UCHAR_MAX << endl;
cout << “maximum unsigned short = “ << USHRT_MAX << endl;
cout << “maximum unsigned = “ << UINT_MAX << endl;
15

cout << “maximum unsigned long = “ << ULONG_MAX << endl;


return 0;
}

Keluarannya adalah

minimum char = -128


maximum char = 127
minimum short = -32768
maximum short = 32767
minimum int = -2147483648
maximum int = 2147483647
minimum long = -2147483648
maximum long = 2147483647
minimum signed char = -128
maximum signed char = 127
maximum unsigned char = 255
maximum unsigned short = 65535
maximum unsigned = 4294967295
maximum unsigned long = 4294967295

Keluaran di atas adalah dari workstation UNIX. Terlihat hanya terdapat enam
macam integer yang berbeda, yaitu

char jangkauan –128 s.d. 127 (1 byte)


short jangkauan –32.768 s.d. 32.767 (2 byte)
int jangkauan –2.147.483.648 s.d 2.147.483.647 (4
byte)
unsigned char jangkauan 0 s.d. 255 (1 byte)
unsigned short jangkauan 0 s.d. 65.535 (2 byte)
unsigned jangkauan 0 s.d. 4.294.967.295 (4 byte)

Penjelasan : short integer memerlukan lokasi memori sebanyak 2 byte (16 bit) dalam
mesin, karena jangkauannya adalah –32.768 s.d. 32.767 meliputi 65.536 = 216
kemungkinan nilai.

Pada PC yang bekerja dalam Borland C++, semua prosedur di atas mempunyai
jangkauan yang sama kecuali int dan unsigned, yaitu

int jangkauan –32.768 s.d. 32.767 (2 byte)


unsigned jangkauan 0 s.d. 65.535 (2 byte)
16

1.12 Operator Aritmatik

Operator Deskripsi Contoh


+ Penjumlahan (Add) m+n
- Pengurangan (Substract) m–n
- Negasi (Negate) -n
* Perkalian (Multiply) m*n
/ Pembagian (Divide) m/n
% Sisa pembagian integer (Reminder) m%n

Contoh :

#include <iostream.h>
// Mencoba operator aritmatik.
main()
{
int m = 38, n = 5;
cout << m << “ + “ << n << “ = “ << (m + n) << endl;
cout << m << “ - “ << n << “ = “ << (m - n) << endl;
cout << “ - “ << n << “ = “ << (- n) << endl;
cout << m << “ * “ << n << “ = “ << (m * n) << endl;
cout << m << “ / “ << n << “ = “ << (m / n) << endl;
cout << m << “ % “ << n << “ = “ << (m % n) << endl;
return 0;
}

Keluarannya adalah

38+ 5 = 43
38– 5 = 33
–5=–5
38 * 5 =190
38 / 5 = 7
38 % 5 = 3
17

Contoh lain :

#include <iostream.h>
// Mencoba operator aritmatik.
main()
{
int m = -14, n = 5, q = m/n, r = m%n;
cout << “ m = “ << m << endl;
cout << “ n = “ << n << endl;
cout << “q = “ << q << endl;
cout << “ r = “ << r << endl;
cout << “q*n + r = “ << “(“ << q << “)*( “ << n << “) + “
<< r << “ = “ << q*n + r << “ = “ << m << endl;
return 0;
}

Keluarannya adalah

m = -14
n=5
q = -2
r = -4
q*n + r = (-2)*(5) + -4 = -14 = -14

1.13 Operator Naik dan Operator Turun (Increment dan Decrement)

Operator naik (increment)  ++


Operator turun (decrement)  --

Contoh :

#include <iostream.h>
// Mencoba operator naik dan turun.
main()
{
int m = 44, n = 66;
cout << “m = “ << m << “, n = “ << n << endl;
++m;
--n;
cout << “m = “ << m << “, n = “ << n << endl;
m++;
n--;
cout << “m = “ << m << “, n = “ << n << endl;
18

return 0;
}
Keluarannya adalah

m = 44, n = 66
m = 45, n = 65
m = 46, n = 64

Terlihat bahwa operator pre-increment ++m dan post-increment m++


mempunyai akibat yang sama, yaitu menambah nilai 1 pada m. Hal yang
sama juga terjadi pada operator pre-decrement --n dan post-decrement
n-- yang memberikan akibat yang sama, yaitu mengurangi nilai 1 dari n.

Bila digunakan dalam pernyataan yang berdiri sendiri, ++m dan m++ keduanya
ekivalen dengan penugasan

m = m +1;

Sama halnya untuk --n dan n-- ekivalen dengan penugasan

n = n – 1;

Tetapi bila digunakan sebagai sub-ekspresi (ekspresi dalam ekspresi), operasi pre-
increment ++m berbeda dengan operasi post-increment m++. Pre-increment akan
menaikkan dulu nilai variabel sebelum menggunakannya dalam ekspresi yang lebih
besar (lebih luas, diluarnya), dimana post-increment menaikkan nilai variabel hanya
setelah menggunakan nilai variabel yang berlaku saat itu dari variabel dalam
ekspresi yang lebih besar (lebih luas, diluarnya).

Contoh :

#include <iostream.h>
// Mencoba operator naik dan turun.
main()
{
int m = 66, n;
n = ++m;
cout << “m = “ << m << “, n = “ << n << endl;
n = m++;
cout << “m = “ << m << “, n = “ << n << endl;
cout << “m = “ << m++ << endl;
cout << “m = “ << m << endl;
cout << “m = “ << ++m << endl;
return 0;
}
19

Kelurannya adalah

m = 67, n = 67
m = 68, n = 67
m = 68
m = 69
m = 70

Dalam penugasan pertama, m adalah pre-increment, menaikkan nilainya


menjadi 67, yang selanjutnya dimasukkan ke n. Dalam penugasan
kedua, m adalah post-increment, sehingga 67 dimasukkan ke n
kemudian m dinaikkan menjadi 68. Dalam pernyataan keluaran
(pernyataan ketiga), m adalah post-increment sehingga nilai m pada saat
itu (68) di drop ke aliran keluaran, kemudian m dinaikkan menjadi 69.
Pada pernyataan keluaran yang terakhir, m adalah pre-increment,
sehingga m mula-mula dinaikkan menjadi 70 kemudian nilai tersebut di
drop ke aliran (stream) keluaran.

Contoh :

#include <iostream.h>
main()
{
int n = 5, x;
x = ++n * --n;
cout << “n = “ << n << “,x = “ << x << endl;
cout << ++n << “ “ << ++n << “ “ << ++n << endl;
return 0;
}

Keluarannya adalah

n = 5, x = 25
876

Dalam penugasan di atas untuk n, pertama adalah menaikkannya menjadi 6,


kemudian menurunkannya kembali menjadi 5 sebelum dievaluasi operator
perkalian , yaitu menghitung 5*5. Pada baris terakhir, ketiga sub-ekspresi dievaluasi
dari kanan ke kiri.

1.14 Ekspresi Penugasan Campuran


20

Operator naik dan turun menyingkat bentuk-bentuk penugasan tertentu.


C++ juga mengijinkan bentuk penugasan untuk dikombinasikan dengan
operator yang lain. Bentuk umum penugasan kombinasi ini adalah

variabel op= ekspresi

dengan op adalah suatu operator biner. Akibat dari penugasan kombinasi ini sama
dengan

variabel = variabel op ekspresi

Contoh penugasan kombinasi

n += 8;

Mempunyai akibat yang sama dengan penugasan

n = n + 8;

Contoh :

#include <iostream.h>
// Mencoba operator kombinasi.
main()
{
int n = 44;
n += 9;
cout << n << endl;
n -= 5;
cout << n << endl;
n *= 2;
cout << n << endl;
return;
}

Keluarannya adalah

53
48
96

Pernyataan n += 9 menambah 9 ke n, pernyataan n -= 5 mengurangi 5 dari n, dan


pernyataan n *= 2 mengalikan n dengan 2.
21

1.15 Integer Overflow dan Underflow

Contoh :

#include <iostream.h>
#include <limits.h>
// Test overflow untuk tipe short integer.
main()
{
short n = SHRT_MAX –1;
cout << n++ << endl;
cout << n++ << endl;
cout << n++ << endl;
cout << n++ << endl;
return 0;
}

Keluarannya adalah

32766
32767
-32768
-32767

Kebanyakan komputer menangani keadaan overflow dengan cara berikut. Nilai yang
ada dibalikkan kembali, dimana bilangan yang datang di atas nilai maksimumnya
adalah nilai yang minimum. Jadi hal ini merupakan suatu kesalahan.
Overflow maupun underflow adalah salah satu bentuk dari kesalahan pada saat run-
time (run-time error). Bentuk kesalahan sejenis adalah pembagian dengan bilangan
nol.

1.16 Tipe Karakter

Dalam C++ tipe karakter char adalah salah satu bentuk dari tipe integer.
Hal ini berarti sebuah variable dari tipe char dapat digunakan dalam
ekspresi integer seperti integer-integer yang lain. Contoh berikut
memperlihatkan operator aritmatik integer diterapkan ke dalam variabel
char,
22

char c = 54;
char d = 2*c – 7;
c += d%3;

Nama char digunakan karena bila variabel dari tipe ini merupakan masukan atau
keluaran, akan diintepretasikan sebagai karakter. Tetapi bila sebuah karakter
sebagai masukan, sistem secara otomatis menyimpannya dalam kode ASCII sebagai
nilai dari integer tipe char. Dan bila sebuah variabel tipe char adalah keluaran,
sistem secara otomatis akan mengirimkan karakter yang bersangkutan ke aliran
keluaran.
C++ mendefinisikan tiga buah tipe integer 8 bit, yaitu char, signed char dan
unsigned char. Tetapi hanya dua yang jelas. Tipe char dari signed char ataupun
unsigned char tergantung dari jenis komputernya. Penggunaan tipe char untuk
karakter biasa. Penggunaan tipe unsigned char untuk bentuk string yang sangat
pendek. Sedangkan signed char tidak secara eksplisit sering digunakan.

Contoh :

#include <iostream.h>
// Test keluaran dari tipe char
main()
{
char c = 64;
cout << c++ << “ “; // mencetak ’@’ dan menaikkan c ke 65
cout << c++ << “ “; // mencetak ‘A’ dan menaikkan c ke 66
cout << c++ << “ “; // mencetak ‘B’ dan menaikkan c ke 67
cout << c++ << endl; // mencetak ‘C’ dan menaikkan c ke 68
c = 96;
cout << c++ << “ “; // mencetak ‘’’ dan menaikkan c ke 97
cout << c++ << “ “; // mencetak ‘a’ dan menaikkan c ke 98
cout << c++ << “ “; // mencetak ‘b’ dan menaikkan c ke 99
cout << c++ << endl; // mencetak ‘c’ dan menaikkan c ke 100
return 0;
}

Keluarannya adalah
@ABC
‘abc

Pernyataan keluaran yang pertama menyisipkan variable karakter c ke


dalam sistem keluaran. Karena nilai integer 64, maka keluarannya
adalah karakter @ (Kode ASCII untuk symbol “at” adalah 64).
Kemudian nilai c segera dinaikkan ke 65 yang akan menyebabkan
23

karakter A merupakan keluaran yang berikutnya. (Kode ASCII untuk


huruf A adalah 65).

Contoh :

# include <iostream.h>
// Test keluaran tipe char
main()
{
char x = ‘A’;
cout << x++ << “ “ << int(x) << endl; // mencetak ‘A’ dan 65
cout << x++ << “ “ << int(x) << endl; // mencetak ‘B’ dan 66
cout << x++ << “ “ << int(x) << endl; // mencetak ‘C’ dan 67
return 0;
}

Keluarannya adalah

A 65
B 66
C 67
24

II. PERNYATAAN KONDISI DAN TIPE INTEGER

Macam pernyataan kondisi adalah pernyataan IF, pernyataan IF … ELSE dan


pernyataan SWITCH.

2.1 Pernyataan Masukan

Dalam C++ masukan analog dengan keluaran. Hanya berbeda dalam aliran datanya,
dimana dalam pernyataan keluaran cout, aliran data keluar; sedangkan dalam
pernyataan masukan cin, aliran data masuk. Cin merupakan perintah untuk
memasukkan data secara interaktif (melalui console/monitor).

Contoh masukan integer.

#include <iostream.h>
// Memasukkan bilangan melalui keyboard
main()
{
int umur;
cout << “Berapakah umur anda ? “;
cin >> umur;
cout << “Dalam 10 tahun, umur anda akan menjadi “ << umur + 10 <<
“.\n”;
return 0;
}

Keluarannya :

Berapakah umur anda ? 25


Dalam 10 tahun, umur anda akan menjadi 35.

Ketikan yang berada dalam arsir kelabu merupakan masukan yang


diketikkan oleh user secara interaktif.
Simbol >> merupakan operator ekstraksi (extraction operator), yang disebut juga
sebagai operator masukan. Bentuk ini biasa digunakan dengan aliran masukan cin,
yaitu masukan dari user melalui keyboard.

Contoh lain :
25

#include <iostream.h>
main()
{
char pertama, kedua;
cout << “Masukkan inisial anda : \n”;
cout << “\tInisial nama pertama : “;
cin >> pertama;
cout << “\tInisial nama kedua : “;
cin >> kedua;
cout << “Apa kabar “ << pertama << “. “ << kedua << “?\n”;
return 0;
}

Keluarannya adalah

Masukkan inisial anda :


Inisial nama pertama : A
Inisial nama kedua : D
Apa kabar A. D ?

Catatan : \t merupakan prompt tabulasi. Dengan menghilangkan karakter


baris baru (newline) \n, maka kedudukan cursor akan berada pada baris
yang sama (dengan keluaran sebelumnya).

Contoh lain :

#include <iostream.h>
main()
{
char pertama, kedua;
cout << “Masukkan inisial pertama dan kedua anda : ”;
cin >> pertama >> kedua;
cout << “Apa kabar “ << pertama << “. “ << kedua << “?\n”;
return 0;
}

Keluarannya adalah

Masukkan inisial pertama dan kedua anda : AD


Apa kabar A. D ?

Contoh lain :
26

#include <iostream.h>
main()
{
char pertama, kedua;
cout << “Masukkan inisial pertama dan kedua anda : ”;
cin >> pertama >> kedua;
cout << “Apa kabar “ << pertama << “. “ << kedua << “?\n”;
return 0;
}

Keluarannya adalah

Masukkan inisial pertama dan kedua anda : A D


Apa kabar A. D ?

Catatan : Bila tipe char adalah integer, cin akan mengabaikan semua bentuk spasi
(contohnya blank, tab dan baris baru), bila membaca masukan.

2.2 Pernyataan Kondisional IF

Bentuk umumnya :

if (kondisi) pernyataan;

dengan kondisi adalah sebuah ekspresi integer dan pernyataan adalah


sebuah pernyataan yang dapat dilaksanakan (executable). Pernyataan
akan dilaksanakan hanya jika kondisi mempunyai nilai yang tidak nol
(nonzero = dapat berarti benar).

Contoh :

#include <iostream.h>
main()
{
int n, d;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> n >> d;
if (n%d == 0) cout << n << “ habis dibagi oleh “ << d << endl;
return 0;
}
27

Keluarannya adalah

Masukkan dua buah bilangan integer : 25 5


25 habis dibagi oleh 5

Program di atas akan mendapat masalah bila terdapat sisa pembagian.


Oleh karena itu, haruslah digunakan bentuk pernyataan lainnya, yaitu if
… else.

2.3 Pernyataan Kondisional IF … ELSE

Bentuk umumnya :

if (kondisi) pernyataan1;
else pernyataan2;

dengan kondisi adalah sebuah ekspresi integer, pernyataan1 dan pernyataan2


adalah pernyataan yang dapat dilaksanakan. Pernyataan1 akan dilaksanakan jika
kondisi mempunyai nilai nonzero (benar), dan pernyataan2 dilaksanakan jika
kondisi mempunyai nilai zero (salah).

Contoh :

#include <iostream.h>
main()
{
int n, d;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> n >> d;
if (n%d == 0) cout << n << “ habis dibagi oleh “ << d << endl;
else cout << n << “ tidak habis dibagi oleh “ << d << endl;
return 0;
}

Keluarannya adalah

Masukkan dua buah bilangan integer : 26 5


26 tidak habis dibagi oleh 5
28

Contoh lain :

#include <iostream.h>
main()
{
int n, d;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> n >> d;
if (n%d) cout << n << “ tidak habis dibagi oleh “ << d << endl;
else cout << n << “ tidak habis dibagi oleh “ << d << endl;
return 0;
}

Keluarannya adalah

Masukkan dua buah bilangan integer : 26 5


26 tidak habis dibagi oleh 5

2.4 Operator-Operator Relasi

Terdapat 6 (enam) macam operator relasi, yaitu

< artinya lebih kecil dari


<= artinya lebih kecil atau sama dengan
== artinya sama dengan
> artinya lebih besar dari
>= artinya lebih besar atau sama dengan
!= artinya tidak sama dengan

Contoh :

#include <iostream.h>
// Menentukan bilangan yang lebih besar
main()
{
int m, n;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> m >> n;
if (m > n) cout << m << endl;
else cout << n << endl;
return 0;
}
29

Keluarannya adalah

Masukkan dua buah bilangan integer : 10 35


35

Contoh lain :

#include <iostream.h>
// Menentukan bilangan terbesar dari tiga buah bilangan integer
main()
{
int n1, n2, n3;
cout << “Masukkan tiga buah bilangan integer : ”;
cin >> n1 >> n2 >> n3;
int max = n1;
if (n2 > max) max = n2;
if (n3 > max) max = n3;
cout << “Bilangan terbesar adalah “ << max << endl;
return 0;
}

Keluarannya adalah

Masukkan tiga buah bilangan integer : 25 8 180


Bilangan terbesar adalah 180

2.5 Pernyataan Campuran

Pernyataan campuran adalah sebuah urutan pernyataan yang diperlakukan sebagai


suatu pernyataan tunggal. C++ mengidentifikasikan suatu pernyataan campuran
dengan melingkupi urutan pernyataan tersebut dalam tanda kurung kurawal (sebagai
suatu blok).

Contoh : penggalan pernyataan yang merupakan pernyataan campuran.

{
int temp = x;
x = y;
y = temp;
}

#include <iostream.h>
30

// Mengurutkan bilangan secara ascending (dari dua buah bilangan integer)


main()
{
int x, y;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> x >> y;
if (x > y) {
int temp = x;
x = y;
y = temp;
}
cout << “Bilangan terurut adalah “ << x << y << endl;
return 0;
}

Keluarannya adalah

Masukkan dua buah bilngan integer : 25 8


Bilangan terurut adalah 8 25

Contoh di atas bukanlah suatu program yang efisien, mengingat datanya


hanya dua buah bilangan (untuk yang jumlah bilangannya banyak,
bentuk di atas adalah baik). Untuk kasus yang sama, bentuk program
yang lebih baik adalah sebagai berikut.

#include <iostream.h>
// Mengurutkan bilangan secara ascending (dari dua buah bilangan integer)
main()
{
int x, y;
cout << “Masukkan dua buah bilangan integer : ”;
cin >> x >> y;
if (x < y) cout << “Bilangan terurut adalah “ << x << “ “ << y << endl;
else cout << “Bilangan terurut adalah “ << y << “ “ << x << endl;
return 0;
}

Keluarannya adalah

Masukkan dua buah bilangan integer : 25 8


Bilangan terurut adalah 8 25
31

2.6 Kata-Kata Kunci (Keywords)

Kata kunci (keyword) dalam suatu pemrograman adalah suatu kata yang telah
didefinisikan dan tersedia untuk suatu penggunaaan khusus. Cara penulisannya tidak
dapat diubah, ditambah atau dikurangi.

C++ mempunyai 48 buah kata kunci, yaitu

asm continue float new signed try


auto default for operator sizeof typedef
break delete friend private static union
case do goto protected struct unsigned
catch double if public switch virtual
char else inline register template
void
class enum int return this volatile
const extern long short throw while

Dalam bahasa pemrograman lainnya sering disebut sebagai reserved words, dan
nama-nama yang mendahuluinya disebut standard identifiers.

2.7 Kondisi-Kondisi Campuran

Kondisi-kondisi seperti n % d dan x > y dapat dikombinasikan dalam bentuk kondisi


campuran. Operator logika yang digunakan untuk bentuk yang demikian adalah &&
(dan), || (atau) dan ! (negasi atau menyangkal).

&& p && q dievaluasi sama dengan 1  kedua nilai p dan q sama dengan 1.
|| p || q dievaluasi sama dengan 1, jika salah satu nilai p atau q sama dengan 1.
! !p dievaluasi sama dengan 1, jika nilai p sama dengan 0.

Contoh :

#include <iostream.h>
// Menentukan bilangan terbesar dari tiga buah bilangan integer
main()
{
int a, b, c;
cout << “Masukkan tiga buah bilangan integer : ”;
cin >> a >> b >> c;
if (a >= b && a >= c) cout << “Bilangan terbesar adalah “ << a << endl;
if (b >= a && b >= c) cout << “Bilangan terbesar adalah “ << b << endl;
if (c >= a && c >= b) cout << “Bilangan terbesar adalah “ << c << endl;
return 0;
}
32

Keluarannya adalah

Masukkan tiga buah bilangan integer : 25 8 180


Bilangan terbesar adalah 180

Contoh lain :

#include <iostream.h>
// Menentukan apakah seseorang itu terdaftar atau tidak.
// Diijinkan untuk menjawab ya atau tidak dengan Y/y atau T/t.
main()
{
char jawaban;
cout << “Apakah anda terdaftar (y/t) : ”;
cin >> jawaban;
if (jawaban == ‘Y’ || jawaban == ‘y’) cout << “Anda terdaftar.\n”;
else cout << “ Anda tidak terdaftar.\n”;
return 0;
}

Keluarannya adalah

Apakah anda terdaftar (y/t) : T


Anda tidak terdaftar.

Contoh lain :

#include <iostream.h>
// Program menentukan apakah sebuah bilangan habis membagi bilangan
lainnya.
main()
{
int n, d;
cout << “Masukkan dua buah bilangan integer positif : ”;
cin >> n >> d;
if (d > 0 && n%d == 0) cout << d << “ habis membagi “ << n << endl;
else cout << d << “ tidak habis membagi “ << n << endl;
return 0;
}

Keluarannya adalah

Masukkan dua buah bilangan integer positif : 250 5


5 habis membagi 250
33

Kalau dimasukkan data lainnya, seperti

Masukkan dua buah bilangan integer positif : 250 6


6 tidak habis membagi 250

Kalau dimasukkan data lainnya, seperti

Masukkan dua buah bilangan integer positif : 250 0


0 tidak habis membagi 250

2.8 Pernyataan Kondisional Bersarang (Nested Conditionals)

Seperti halnya pernyataan-pernyataan campuran, pernyataan kondisional dapat


digunakan bersama dengan pernyataan lain. Sebuah pernyataan kondisional dapat
digunakan dalam pernyataan kondisional lainnya. Hal yang demikian biasa disebut
sebagai pernyataan kondisional bersarang.

Contoh-contoh penggalan program yang menggunakan pernyataan kondisional


bersarang :

if (d > 0)
if (n%d == 0)
cout << d << “ habis membagi “ << n << endl;
else
cout << d << “ tidak habis membagi “ << n << endl;
else
cout << d << “ tidak habis membagi “ << n << endl;

Penggalan program :

if (a > 0) if (b > 0) ++a; else if (c > 0)


if (a < 4) ++b; else if (b < 4) ++ c; else --a;
else if (c < 4) --b; else --c; else a = 0;

akan lebih baik jika ditulis seperti berikut :


34

if (a > 0)
if ( b > 0) ++a;
else
if (c > 0)
if (a < 4) ++b;
else
if (b < 4) ++c;
else --a;
else
if (c < 4) --b;
else --c;
else
a = 0;

atau seperti berikut

if (a > 0)
if (b > 0) ++a;
else if (c > 0)
if (a < 4) ++ b;
else if (b < 4) ++c;
else --a;
else if (c < 4) --b;
else--c;
else
a = 0;

#include <iostream.h>
// Menentukan bilangan terbesar dari tiga buah bilangan integer
main()
{
int a, b, c, max;
cout << “Masukkan tiga buah bilangan integer : ”;
cin >> a >> b >> c;
if (a > b)
if (a > c) max = a; // a > b dan a > c
else max = c; // c>= a > b
else
if (b > c) max = b; // b >= a dan b > c
else max = c; // c >= b >= a
cout << “Bilangan terbesar adalah “ << max << endl;
return 0;
}

Keluarannya adalah
35

Masukkan tiga buah bilangan integer : 25 8 180


Bilangan terbesar adalah 180

Contoh lain :

#include <iostream.h>
// Mengkonversikan nilai test dalam bentuk indeks A, B, C, D atau E
main()
{
int nilai;
cout << “Masukkan nilai test : ”;
cin >> nilai;
if (nilai > 100) cout << “Salah !! Nilai diluar jangkauan. “;
else if (nilai >= 90) cout << “Nilai indeks = “ << ‘A’ ;
else if (nilai >= 80) cout << “Nilai indeks = “ << ‘B’ ;
else if (nilai >= 70) cout << “Nilai indeks = “ << ‘C’ ;
else if (nilai >= 60) cout << “Nilai indeks = “ << ‘D’ ;
else if (nilai >= 0) cout << “Nilai indeks = “ << ‘E’ ;
else cout << Salah !! Nilai diluar jangkauan. “;
return 0;
}

Keluarannya adalah

Masukkan nilai test : 87


Nilai indeks = B

Bila dimasukkan data lainnya seperti :

Masukkan nilai test : 34


Nilai indeks = E

2.9 Pernyataan SWITCH

Pernyataan else if jamak dapat dibangun dengan menggunakan


pernyataan switch.
36

Bentuk umumnya adalah

switch (ekspresi) {
case konstanta1 : listpernyataan1;
case konstanta2 : listpernyataan2;
:
:
case konstantaN : listpernyataanN;
default : listpernyataan;
}

Pernyataan switch mengevaluasi ekspresi dan mencari nilainya diantara konstanta


case. Jika nilai diketemukan diantara list konstanta, maka pernyataan yang terdapat
pada listpernyataan yang bersangkutan akan dieksekusi. Sebaliknya jika hal tersebut
adalah default (bersifat opsional), maka program akan melanjutkan ke
listpernyataan. Perhatikan bahwa ekspresi harus dievaluasi sebagai tipe integer dan
konstanta haruslah konstanta integer (termasuk char).

Contoh :

#include <iostream.h>
// Program berikut memberikan akibat yang sama dengan program
sebelumnya.
main()
{
int nilai;
cout << “Masukkan nilai test : ”; cin >> nilai;
if (nilai > 100) cout << “Salah !! Nilai diluar jangkauan. \n “;
switch (nilai/10) {
case 10 :
case 9 : cout << ‘A’ << endl; break;
case 8 : cout << ‘B’ << endl; break;
case 7 : cout << ‘C’ << endl; break;
case 6 : cout << ‘D’ << endl; break;
case 5 :
case 4 :
case 3 :
case 2 :
case 1 :
case 0 : cout << ‘E’ << endl; break;
default : cout << Salah !! Nilai diluar jangkauan. \n“;
}
return 0;
}
37

Pertama-tama program akan membagi nilai dengan 10. Bila dimasukkan nilai = 48,
ekspresi nilai/10 mengevaluasi menjadi 4. Selanjutnya nilai ini ditempatkan dalam
list case, dan setiap pernyataan sampai break akan dieksekusi. Rentang semua case
menurun sampai case 0 dan pernyataan break akan dieksekusi. Fenomena seperti ini
dikenal sebagai jatuh terus (fall through).

2.10 Operator Ekspresi Kondisional

C++ mengijinkan bentuk penyingkatan suatu kasus khusus dari pernyataan if … else,
yang disebut operator ekspresi kondisional dan menggunakan simbol ? dan : dalam
bentuk

kondisi ? ekspresi1 : ekspresi2

Seperti operator lainnya, kombinasi ini memberikan ekspresi untuk menghasilkan


suatu nilai. Nilai yang dihasilkan adalah nilai dari ekspresi1 atau ekspresi2,
tergantung kepada kondisinya, apakah benar atau salah.
Sebagai contoh, pernyataan penugasan

min = x < y ? x : y;

akan menunjuk nilai x ke min jika x < y, sebaliknya akan menunjuk nilai y ke min.

Operator ekspresi kondisional pada umumnya hanya digunakan bila kondisi dan
kedua ekspresinya sangat sederhana.

2.11 Jangkauan (Scope)

Jangkauan dari sebuah identifier adalah bagian dari program yang dapat
digunakan. Contohnya, variabel tidak dapat digunakan sebelum
dideklarasikan dulu, sehingga jangkauannya dimulai dari saat
dideklarasikan.

Perhatikan contoh berikut.


38

#include <iostream.h>
// Jangkauan variabel
main()
{
x = 11; // Salah !! Ini tidak dalam jangkauan x
int x;
{
x = 22; // Benar !! Ini dalam jangkauan x
y = 33; // Salah !! Ini tidak dalam jangkauan y.
int y;
x = 44; // Benar !! Ini dalam jangkauan x.
y = 55; // Benar !! Ini dalam jangkauan y.
}
x = 66; // Benar !! Ini dalam jangkauan x.
y = 77; // Salah !! Ini tidak dalam jangkauan y.
return 0;
}

Contoh jangkauan bersarang dan jangkauan paralel.

#include <iostream.h>
int x = 11; // x ini bersifat global
main()
{ // mulai jangkauan dari main()
int x = 22;
{ // mulai jangkauan dari blok internal
int x = 33;
cout <<”Dalam blok bagian dalam main() : x = “ << x << endl;
} //akhir jangkauan dari blok internal
cout << “Dalam main() : x = “ << x << endl;
cout << “Dalam main() : ::x = “ << ::x << endl;
return 0;
} // akhir jangkauan dari main()

Keluarannya adalah

Dalam blok bagian dalam main() : x = 33


Dalam main() : x = 22
Dalam main() : ::x = 11

Terdapat 3 obyek x yang berbeda dalam program di atas. x yang


diinisialisasikan dengan nilai 11 adalah suatu variabel global, sehingga
jangkauannya meliputi seluruh file. x yang diinisialisasikan dengan nilai
22 mempunyai jangkauan yang terbatas terhadap main(). Karena ini
bersarang dalam jangkauan dari x yang pertama, ini akan
39

menyembunyikan x pertama dalam main(). x yang diinisialisasi dengan


nilai 33 mempunyai jangkauan yang terbatas hanya dalam blok internal
main(), sehingga menyembunyikan x pertama dan x kedua dalam blok
tersebut.
Baris terakhir dalam program menggunakan operator resolusi jangkauan :: untuk
mengakses x global yang tersembunyi dalam main().

2.12 Tipe-Tipe Enumeration

Selain dari tipe-tipe data yang telah didefinisikan sebelumnya, seperti int dan char,
C++ juga mengijinkan pemrogram untuk mendefinisikan tipe datanya sendiri. Hal
ini dapat dikerjakan melalui beberapa cara, dan yang paling canggih adalah
menggunakan kelas-kelas (classes) (yang akan dibahas dibagian belakang). Dalam
bagian ini akan dibahas tipe data yang didefinisikan oleh user, dalam bentuk yang
lebih sederhana.

Suatu tipe enumeration adalah suatu tipe integral yang didefinisikan oleh user,
dengan bentuk umum seperti berikut

enum namatipe { enumeratorlist };

Dengan enum adalah kata kunci dalam C++, namatipe berarti sebuah identifier
yang nama tipenya didefinisikan, dan enumeratorlist berarti sebuah list identifier
yang mendefinisikan konstanta integer.

Contoh berikut mendefinisikan tipe enumeration Semester, yang terdiri dari tiga
kemungkinan nilai, yaitu sebuah variabel yang tipenya dapat

enum Semester {ganjil, genap, pendek};

Selanjutnya dapat dideklarasikan variabel-variabel untuk tipe ini, yaitu

Semester s1, s2;

Dan dapat menggunakan variabel-variabel tersebut dan nilai tipe tersebut sebagai
tipe-tipe yang didefinisikan sebelumnya

s1 = genap;
s2 = ganjil;
if (s1 == s2) cout << “Semester yang sama. \n”;
40

Nilai aktual yang didefinisikan dalam enumeratorlist disebut enumerators. Pada


kenyataannya biasanya bernilai integer. Nilai ganjil, genap dan pendek yang
didefinisikan untuk tipe Semester di atas dapat didefinisikan seperti berikut :

const int ganjil = 0;


const int genap = 1;
const int pendek = 2;

Nilai-nilai 0,1, 2, … menunjuk secara otomatis ketika tipe didefinisikan. Nilai-nilai


yang di default dapat dikesampingkan dalam enumeratorlist :

enum koin {duapuluhlimaan = 25, limapuluhan = 50, seratusan = 100, limaratusan


=500};

Jika nilai integer ditunjuk hanya untuk beberapa enumerator, maka nilai-nilai yang
lain akan merupakan nilai yang berurutan, seperti

enum bulan {jan =1, feb, maret, april, mei, juni, juli, agust, sept, okt, nov,
des};

akan menunjuk angka 1 sampai dengan 12 untuk ke-12 bulan di atas.

Enumerator adalah konstanta integer yang sederhana, maka sah saja untuk
mempunyai beberapa enumerator yang berbeda dengan nilai yang sama, seperti

enum Jawab {tidak = 0, salah = 0, ya = 1, benar = 1, oke = 1};

Tipe enumeration biasa digunakan untuk membuat kode, agar mudah untuk
dipahami.
Contohnya :

enum Boolean {salah, benar};


enum JenisKelamin {wanita, pria};
enum Hari {senin, selasa, rabu, kamis, jum’at, sabtu, minggu};
enum BilanganDasar {biner = 2, octal = 8, desimal = 10, heksadesimal =16};
enum Warna {merah, jingga, kuning, hijau, biru, ungu};
enum AngkaRomawi {I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000};

2.13 Konversi Tipe Integer

Dalam beberapa kasus, C++ mengijinkan obyek dari satu tipe digunakan dalam tipe
lain yang diharapkan. Hal ini dikenal sebagai konversi tipe. Contoh konversi tipe
41

yang paling umum adalah dari sebuah tipe integer ke tipe integer yang lain, dan
konversi dari tipe integer ke tipe floating point.
Secara umum sebuah tipe integer dapat digunakan oleh tipe integer lain yang
diharapkan jika tipe yang diharapkan mempunyai peringkat yang lebih tinggi.
Sebagai contoh, suatu char dapat digunakan oleh tipe int yang diinginkan karena
tipe int mempunyai peringkat yang lebih tinggi dibandingkan dengan tipe char.

Contoh :

#include <iostream.h>
main()
{
char c = ‘A’;
short m = 22;
int n = c + m;
cout << “n = “ << n << endl;
return 0;
}

Keluarannya adalah

n = 87

Contoh lain :

#include <iostream.h>
enum Warna {merah, jingga, kuning, hijau, biru, ungu};
main()
{
Warna x = biru;
Cout << “x = “ << x << endl;
return 0;
}

Keluarannya adalah

x=4
42

III. ITERASI DAN TIPE FLOATING

Iterasi adalah pengulangan dari sebuah pernyataan atau blok pernyataan dalam suatu
program. C++ mempunyai tiga pernyataan iterasi, yaitu pernyataan while,
pernyataan do … while dan pernyataan for. Pernyataan-pernyataan iterasi biasa juga
disebut dengan istilah lup (loop).

3.1 Pernyataan WHILE

Bentuk umumnya adalah

while (kondisi) pernyataan;

Pertama-tama kondisi dievaluasi. Jika kondisi tidak sama dengan nol (benar),
pernyataan dieksekusi dan kondisi dievaluasi lagi. Kedua langkah ini diulangi
sampai hasil evaluasi dari kondisi adalah nol (salah).

Contoh :

#include <iostream.h>
// Program mencari nilai pangkat tiga dari suatu bilangan
// Program berhenti bila data bilangannya bernilai 0.
main()
{
int n;
cout << “Masukkan bilangan integer positif. Berakhir bila bilangan = 0.\
n\t: “;
cin >> n;
while (n > 0) {
cout << n << “ pangkat tiganya adalah “ << n*n*n << “\n\t: “;
cin >> n;
}
return 0;
}

Keluarannya adalah
43

Masukkan bilangan integer positif. Berakhir bila bilangan = 0.


:2
2 pangkat tiganya adalah 8
:6
6 pangkat tiganya adalah 216
: 25
25 pangkat tiganya adalah 15625
:0

Contoh lain : menghitung nilai berikut.


n
∑ i2 =12 +22 + 32 +⋯+n 2
i =1

#include <iostream.h>
// Program mencari jumlah kuadrat dari 1 sampai n
main()
{
int i=1, n, sum = 0;
cout << “Masukkan sebuah bilangan integer : “; cin >> n;
while (i <= n) {
sum += i * i;
i ++;
}
cout << “Penjumlahan kuadrat dari pertama sampai ke “ << n << “
adalah “
<< sum << endl;
return 0;
}

Keluarannya adalah

Masukkan sebuah bilangan integer : 4


Penjumlahan kuadrat dari pertama sampai ke 4 adalah 30

Bila dimasukkan nilai n yang lain seperti berikut :

Masukkan sebuah bilangan integer : 6


Penjumlahan kuadrat dari pertama sampai ke 6 adalah 91

3.2 Pernyataan DO … WHILE


44

Pernyataan do … while hampir sama dengan pernyataan while. Bentuk umumnya


adalah

do pernyataan while (kondisi);

Bedanya adalah, dalam do … while yang pertama kali dieksekusi adalah


pernyataanya, kemudian baru kondisinya. Kedua langkah diulangi sampai kondisi
dievaluasi sama dengan nol (salah). Sebuah lup do … while akan selalu melakukan
iterasi sedikitnya satu kali, tanpa menghiraukan kondisi, karena pernyataan
mengevaluasi sebelum kondisi dievaluasi.

Contoh :

#include <iostream.h>
// Program menghitung fungsi faktorial : n! = (n)(n-1)…(3)(2)(1).
main()
{
int n, f = 1;
cout << “Masukkan sebuah bilangan integer : “; cin >> n;
cout << n << “ faktorial adalah “;
do {
f *= n;
n --;
} while (n > 1);
cout << f << endl;
return 0;
}

Keluarannya adalah

Masukkan sebuah bilangan integer : 5


5 faktorial adalah 120

Masukkan sebuah bilangan integer : 8


8 faktorial adalah -25216

Tetapi bila programnya seperti berikut, maka keluarannya akan benar.

#include <iostream.h>
// Program menghitung fungsi faktorial : n! = (n)(n-1)…(3)(2)(1).
45

main()
{
int n;
unsigned f = 1; // unsigned f atau unsigned short f.
cout << “Masukkan sebuah bilangan integer : “; cin >> n;
cout << n << “ faktorial adalah “;
do {
f *= n;
n --;
} while (n > 1);
cout << f << endl;
return 0;
}

Keluarannya adalah

Masukkan sebuah bilangan integer : 5


5 faktorial adalah 120

Masukkan sebuah bilangan integer : 8


8 faktorial adalah 40320

3.3 Pernyataan FOR

Sebuah lup dikontrol oleh tiga bagian, yaitu sebuah inisialisasi, sebuah kondisi
kontinuitas dan perubahannya. Dalam contoh sebelumnya terlihat bahwa variabel
kontrol lupnya adalah n, yang merupakan nilai inisialisasi yaitu cin >> n, kondisi
kontinuitasnya adalah n > 1, dan perubahannya adalah n--. Bila ketiga bagian ini
sederhana saja, maka lup dapat di set sebagai suatu lup for, yang biasanya lebih
sederhana dari pada lup while atau lup do … while.
Inisialisasi, kondisi kontinuitas atau perubahannya dapat kosong.

Bentuk umumnya adalah

for (inisialisasi, kondisi kontinuitas, perubahan) pernyataan;

#include <iostream.h>
// Program mencari jumlah kuadrat dari 1 sampai n
main()
46

{
int n, sum = 0;
cout << “Masukkan sebuah bilangan integer : “; cin >> n;
for (int i = 1; i <= n; i++)
sum += i * i;
cout << “Penjumlahan kuadrat dari pertama sampai ke “ << n << “
adalah “
<< sum << endl;
return 0;
}

Keluarannya adalah

Masukkan sebuah bilangan integer : 4


Penjumlahan kuadrat dari pertama sampai ke 4 adalah 30

Bila dimasukkan nilai n yang lain seperti berikut :

Masukkan sebuah bilangan integer : 6


Penjumlahan kuadrat dari pertama sampai ke 6 adalah 91

Contoh lainnya :

#include <iostream.h>
// Program menghitung fungsi faktorial : n! = (n)(n-1)…(3)(2)(1).
main()
{
int n, unsigned f = 1; // unsigned f atau unsigned short f.
cout << “Masukkan sebuah bilangan integer : “; cin >> n;
for (int i = 2; i <= n; i++)
f *= i;
cout << n << “ faktorial adalah “ << f << endl;
return 0;
}

Keluarannya adalah

Masukkan sebuah bilangan integer : 5


5 faktorial adalah 120
47

Masukkan sebuah bilangan integer : 8


8 faktorial adalah 40320

Contoh yang lain :

#include <iostream.h>
// Program membaca deretan bilangan positif, diakhiri bilangan integer 0.
// Juga menentukan bilangan maksimum dan minimumnya.
main()
{
int n, min, max;
cout << “Masukkan bilangan integer. Akhiri dengan 0 :\n”;
cin >> n;
for (min = max = n; n > 0; ) {
if (n < min) min = n; // min dan max adalah terkecil dan
terbe
else if (n > max) max = n; // sar dari seluruh bilangan yang
dibaca.
cin >> n;
}
cout << “min = “ << min << “ dan max = “ << max << endl;
return 0;
}

Keluarannya adalah

Masukkan bilangan integer. Akhiri dengan 0 :


55
22
88
66
0
min = 22 dan max = 88

Sebuah sentinel adalah sebuah nilai khusus dari suatu variabel yang digunakan untuk
mengakhiri masukan lup. Pada contoh di atas, nilai 0 digunakan sebagai sebuah
sentinel.

Contoh lain lagi :


#include <iostream.h>
// Program yang memiliki lebih dari sebuah variabel kontrol.
main()
48

{
for (int m = 1, n = 8; m < n; m++, n--)
cout << “m = “ << m << “,n = “ << n << endl;
return 0;
}
Keluarannya adalah
m = 1, n = 8
m = 2, n = 7
m = 3, n = 6
m = 4, n = 5

Bagian inisialisasi lup for mendeklarasikan dua variabel kontrol, yaitu m dan n.
Inisialisasi m adalah 1 dan n adalah 8. Bagian perubahan menggunakan operator
koma untuk memasukkan kedua ekspresi perubahan, yaitu m++ dan n--. Lup akan
berlanjut sepanjang nilai m < n.

3.4 Pernyataan BREAK

Pernyataan break akan selalu terlihat digunakan bila menggunakan pernyataan


switch. Pernyataan ini juga digunakan dalam lup. Bila pernyataan ini dieksekusi,
maka akan mengakhiri lup, dan akan menghentikan iterasi pada saat tersebut.

Contoh :

#include <iostream.h>
main()
{
while (1) {
if (i > n) break; // lup berhenti disini bila i > n
sum += i * i;
i ++;
return 0;
}

Sepanjang (i <= n), lup akan kontinyu. Begitu (i > n), pernyataan break
mengeksekusi dan lup segera berhenti.

Contoh lain :

#include <iostream.h>
// Program membaca sederetan bilangan integer positif, mengakhiri dengan 0
dan
// mencetak nilai rata-ratanya.
49

main()
{
int n, count = 0, sum = 0;
cout << “ Masukkan bilangan integer positif. Akhiri dengan 0 :\n”;
for ( ; ; ) {
cout << “\t” << count + 1 << “: “;
cin >> n;
if (n == 0) break;
++count;
sum += n;
}
cout << “Nilai rata-rata dari “ << count << “ buah bilangan adalah “
<< float (sum) / count << endl;
return 0;
}

Keluarannya adalah

Masukkan bilangan integer positif. Akhiri dengan 0 :


1:7
2:4
3:5
4:2
5:0
Nilai rata-rata dari 4 buah bilangan adalah 4.5

Catatan : bila tidak terdapat break, maka akan merupakan lup yang tak
hingga, karena pernyataan for nya berbentuk for ( ; ; ).

3.5 Pernyataan CONTINUE

Pernyataan break akan melompati semua pernyataan dalam blok lup dan
akan melanjutkan pernyataan berikutnya setelah lup. Pernyataan
continue mirip dengan itu, kecuali dia tidak mengakhiri lup, melainkan
pergi ke bagian awal dari blok lup untuk memulai iterasi berikutnya.

Contoh :

#include <iostream.h>
50

main()
{
int n;
for ( ; ; ) {
cout << “Masukkan bilangan integer : “; cin >> n;
if (n%2 == 0) continue;
else if (n%3 == 0) break;
cout << “\tLanjutkan lup berikutnya.\n”
}
cout << “\tAkhiri lup.\n”;
return 0;
}

Keluarannya adalah

Masukkan bilangan integer : 7


Lanjutkan lup berikutnya.
Masukkan bilangan integer : 4
Masukkan bilangan integer : 9
Akhiri lup.

3.6 Pernyataan GOTO

Pernyataan break, pernyataan continue dan pernyataan switch


menyebabkan pengendalian program ke cabang menuju ke lokasi lain
dari pada yang normal. Tujuan dari cabang ditentukan oleh konteksnya,
yaitu untuk break akan menuju ke pernyataan di luar lup, untuk continue
akan melanjutkan kondisi lup, dan untuk switch akan pergi ke konstanta
case yang benar. Ketiga pernyataan tersebut disebut sebagai pernyataan-
pernyataan lompatan (jump statements), karena menyebabkan
pengendalian program untuk melompati pernyataan lainnya.

Pernyataan goto adalah jenis lain dari pernyataan lompatan. Tujuannya


ditentukan oleh suatu label di dalam pernyataan.
Label adalah suatu identifier sederhana yang diikuti dengan sebuah
tanda colon (:), yang terletak di awal suatu pernyataan. Label bekerja
seperti pernyataan case di dalam pernyataan switch, yaitu merinci tujuan
lompatan.
51

Perhatikan contoh program berikut.

#include <iostream.h>
main()
{
int a, b, c;
cin >> a>> b >> c;
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++)
for (int k = 0; k < c; k++)
if (i*j*k > 100) goto esc;
else cout << i*j*k << “ “;
esc : cout << endl;
}
return 0;
}

Bila pernyataan goto yang terletak di lup yang paling dalam dicapai,
maka program akan keluar ke pernyataan keluaran pada bagian
terbawah dari lup yang paling luar.
Ada cara lain untuk keluar dari lup ini, yaitu dengan me-reset variabel
kendali lup dengan mengganti pernyataan if di dalam lup-k dengan

if (i*j*k > 100) j = k = b + c;


else cout << i*j*k << “ “;

Hal ini akan menyebabkan lup-j dan lup-k berakhir, karena kondisi
kontinyu j < b dan k < c akan salah. Ini adalah metoda hacker’s, karena
nilai-nilai set artifisial dari variabel kendali j dan k untuk mencapai
keluaran yang diinginkan adalah sebagai efek sampingan saja.

Pendekatan lainnya adalah dengan menggunakan suatu bendera done


dalam kondisi kontinyu untuk lup-lup, seperti

int done = 0;
for (int i = 0; i < a && !done; i++) {
52

for (int j = 0; j < b && !done; j++)


for (int k = 0; k < c && !done; k++)
if (i*j*k > 100) done = 1;
else cout << i*j*k << “ “;

Tetapi cara ini tidak praktis, masih lebih baik menggunakan pernyataan
goto untuk mengakhiri lup bersarang ini.

3.7 Tipe-tipe Bilangan Riel

Dalam C++ terdapat tiga macam tipe bilangan riel, yaitu float, double
dan long double. Pada kebanyakan sistem, double menggunakan jumlah
byte dua kali dari float. Float menggunakan 4 byte, double
menggunakan 8 byte dan long double menggunakan 8, 10, 12, atau 16
byte.

Tipe yang digunakan dalam bilangan riel disebut tipe floating point,
karena cara penyimpanannya dalam internal komputer. Pada
kebanyakan sistem, sebuah bilangan seperti 123.45 akan dikonversikan
ke bentuk biner

123.45 = 1111011.011100112

kemudian tanda titik desimalnya di-float sehingga semua bit terletak di


kanan tanda titik desimal. Dalam contoh ini, bentuk floating point
diperoleh dengan mem-float 7 bit disebelah kiri (titik desimal), sehingga
menghasilkan sebuah mantisa 27 kali lebih kecil.

Dengan demikian bilangannnya menjadi

123.45 = 0.1111011011100112 x 27

Dalam internal memori, mantisa 0.111101101110011 dan pangkat


(eksponen) 7 disimpan secara terpisah. Untuk tipe float 32 bit, mantisa
disimpan dalam suatu segmen 23 bit dan eksponen disimpan dalam
segmen 8 bit, satu bit sisanya untuk menyimpan tanda bilangan (bit 0,
bila tanda bilangan positif; dan bit 1, bila tanda bilangan negatif).
53

Untuk tipe double 64 bit, mantisa disimpan dalam segmen 52 bit dan
eksponen dalam segmen 11 bit.

Contoh berikut memperlihatkan penggunaan tempat penyimpanan data


bilangan yang ditentukan oleh tipenya masing-masing. Program
menggunakan operator sizeof yang akan mengembalikan ukuran byte
dari tipe yang ditentukan.

#include <iostream.h>
main()
{
cout << “Jumlah byte yang digunakan : \n”;
cout << “\t char : “ << sizeof (char) << endl;
cout << “\t short : “ << sizeof (short) << endl;
cout << “\t int : “ << sizeof (int) << endl;
cout << “\t long : “ << sizeof (long) << endl;
cout << “\t unsigned char : “ << sizeof (unsigned char) << endl;
cout << “\tunsigned short : “ << sizeof (unsigned short) << endl;
cout << “\t unsigned int : “ << sizeof (unsigned int) << endl;
cout << “\t unsigned long : “ << sizeof (unsigned long) << endl;
cout << “\t signed char : “ << sizeof (signed char) << endl;
cout << “\t float : “ << sizeof (float) << endl;
cout << “\t double : “ << sizeof (double) << endl;
cout << “\t long double : “ << sizeof (long double) << endl;
}

Keluaran berikut adalah untuk jenis workstation UNIX. Pada mesin ini,
int dan long adalah ekivalen; unsigned int dan unsigned long adalah
ekivalen; double dan long double juga ekivalen. Dengan kata lain, kata
“long” sama saja artinya dengan yang reguler.
54

Jumlah byte yang digunakan :


char : 1
short : 2
int : 4
long : 4
unsigned char : 1
unsigned short : 2
unsigned int : 4
unsigned long : 4
signed char : 1
float : 4
double: 8
long double : 8

Contoh program selanjutnya dapat digunakan untuk memeriksa tipe


floating point pada sistem komputer, yaitu dengan membaca nilai-nilai
konstanta yang bervariasi dari judul file float.h. Untuk mengakses hal
ini, program harus memasukkan preprocessor directive

#include <float.h>
#include <iostream.h>
#include <float.h>
main()
{
int fbit = 8*sizeof (float); // setiap byte terdiri dari 8 bit.
cout << “float menggunakan : \t” << fbit << “ bit : \n\t\t “
<< FLT_MANT_DIG – 1 << “ bit untuk mantisa \n\t\t”
<< fbit – FLT_MANT_DIG << “ bit untuk eksponen \n\t\t

<< 1 << “ bit untuk tanda bilangan
\n”
<< “untuk mendapatkan :“ << FLT_DIG << “ digit berarti\
n”
<< “dengan nilai minimum : “ << FLT_MIN << endl;
<< “dan nilai maksimum : “ << FLT_MAX << endl;
return 0;
}

Keluaranya adalah
55

float menggunakan : 32 bit :


23 bit untuk mantisa
8 bit untuk eksponen
1 bit untuk tanda bilangan
untuk mendapatkan : 6 digit berarti
dengan nilai minimum : 1.17549e-38
dan nilai maksimum : 3.40282+e38

Konstanta FLT_MANT_DIG, FLT_DIG, FLT_MIN dan FLT_MAX didefinisikan


dalam file judul float.h.

Keluaran di atas dari sebuah workstation UNIX. Terlihat bahwa 32 bit


digunakan untuk menyimpan suatu tipe float terdiri dari 3 bagian, yaitu
23 bit untuk mantisa, 8 bit untuk eksponen dan 1 bit untuk tanda
bilangan. 23 bit mantisa menghasilkan sebuah nilai floating point
dengan 6 digit yang berarti (significant digits), dan 8 bit eksponen
menghasilkan suatu jangkauan magnitude dari kira-kira 10 -38 sampai 3 x
1038.
Semua operasi aritmatik floating point dikerjakan dalam presisi ganda
(double precision).

3.8 Tipe-Tipe Konversi

C++ dapat juga mengkonversikan tipe-tipe integral ke dalam tipe


floating point. Sebagai contoh

#include <iostream.h>
main()
{
int n = 32;
float x = 3.14159;
x += n; // nilai 32 secara otomatis diubah menjadi
32.0
56

cout << x – 2 << endl; // nilai 2 otomatis dikonversikan menjadi 2.0


return 0;
}

Konversi dari integer ke float seperti di atas selalu dilakukan secara


otomatis dan dapat dijamin. Tetapi konversi dari suatu bentuk floating
point ke suatu bentuk integral tidak secara otomatis.

Secara umum, jika T adalah sebuah tipe dan v adalah suatu nilai dari
tipe lainnya, maka ekspresi

T(v)

mengkonversikan v ke tipe T. Hal ini disebut “type casting”. Sebagai


contoh, jika eksp adalah suatu ekspresi floating point dan n adalah suatu
tipe variabel int, maka

n = int (eksp);

mengubah nilai eksp ke tipe int dan menunjuknya ke n. Akibat dari


penggantian suatu nilai riel menjadi integer adalah semua digit
dibelakang tanda titik desimal akan hilang. Contoh, bila bilangan
2.71598 dikonversikan, akan dihasilkan bilangan 2. Terjadi suatu
peristiwa truncating, bukan rounding.

#include <iostream.h>
// Program mengkonversikan sebuah double ke sebuah int.
main()
{
double v = 1234.56789;
int n = int (v);
cout << “v = “ << v << “, n = “ << n << endl;
57

return 0;
}

Keluarannya adalah

v = 1234.57, n = 1234

Jika sebuah tipe dikonversikan ke tipe yang lebih tinggi, operator tipe
case tidak diperlukan. Perhatikan contoh berikut.

#include <iostream.h>
main()
{
char c = ‘A’; cout << “ char c = “ << c << endl;
short k = c; cout << “ short k = “ << k << endl;
int m = k; cout << “ int m = “ << m << endl;
long n = m; cout << “ long n = “ << n << endl;
float x = n; cout << “ float x = “ << x << endl;
double y = x; cout << “ double y = “ << y << endl;
return 0;
}

Keluarannya adalah

char c = A
short k = 65
int m = 65
long n = 65
float x = 65
double y = 65

Nilai integer karakter ‘A’ dalam kode ASCII adalah 65. Nilai ini
disimpan sebagai suatu char dalam c, sebagai suatu short dalam k,
sebagai suatu int dalam m, dan sebagai suatu long dalam n. Nilai ini
selanjutnya dikonversikan ke nilai floating point 65.0 dan disimpan
sebagai suatu float dalam x dan sebagai suatu double dalam y.
Perhatikan bahwa pencetakan nilai integer c sebagai suatu karakter, dan
selanjutnya pencetakan bilangan riel x dan y sebagai integer karena
bagian pecahannya adalah 0.
58

Karena sangat mudah untuk mengkonversikan tipe integer dan tipe riel
dalam C++, maka sangatlah mudah juga untuk membedakan keduanya.
Secara umum, integer digunakan untuk menghitung segala sesuatu yang
diskrit, sedangkan riel digunakan untuk mengukur skala yang kontinyu.
Hal ini berarti nilai-nilai integer adalah eksak, sementara nilai-nilai riel
adalah aproksimasi.

Dalam bahasa pemrograman C, bentuk v sebagai tipe T adalah (T) v


(sedangkan dalam C++ T(v). C++ juga mengerti bentuk ini, sehingga
dikerjakan sebagai

n = int (v) sebagai n = (int) v

3.9 Kesalahan Pembulatan (Roundoff Error)

Dalam suatu komputer, nilai-nilai floating point cenderung menjadi


tidak presisi. Ketidak presisian ini disebut sebagai kesalahan pembulatan
(roundoff error).

Perhatikan contoh berikut.

#include <iostream.h>
main()
{
double x = 1000/3.0; cout << “x = “ << x << endl;
double y = x – 333.0; cout << “y = “ << y << endl;
double z = 3*y – 1.0; cout << “z = “ << z << endl;
if ( z == 0) cout << “z == 0. \n”;
else cout << “z tidak sama dengan 0. \n”;
return 0;
}

Keluarannya adalah

x = 333.333
y = 0.333333
z = -5.68434e-14
z tidak sama dengan 0.
59

1
Secara aritmatik yang pasti, variabel akan mempunyai nilai x = 333 3 , y
1 1
= 3 dan z = 0. Tetapi 3 tidak dapat direpresentasikan secara pasti
sebagai suatu nilai floating point. Ketidak telitian ini direfleksikan
dalam bentuk nilai residu untuk z.
Contoh ini juga menggambarkan suatu masalah yang melekat pada
penggunaan tipe floating point dalam memeriksa persamaan
kondisional. Kondisi (z == 0) akan gugur bila z nilainya mendekati nol.

3.10 Format E Untuk Nilai_nilai Floating Point

Sebagai masukan dan keluaran, nilai-nilai floating point dapat


dinyatakan dalam 2 format, yaitu fixed point dan scientific. Contoh
format fixed point adalah 333.333 dan format scientific adalah -
5.68434e-14.

Dalam format scientific, huruf e berarti “10 pangkat”. Sehingga -


5.68434e-14 berarti –5.68434 x 10 -14, yang sama dengan –
0.0000000000000568434. Dengan demikian format scientific akan lebih
efisien untuk bilangan yang kecil sekali atau besar sekali nilainya.

Nilai-nilai floating point dengan magnitude dalam jangkauan 0.1 sampai


dengan 999,999 secara normal akan dicetak dalam format fixed point;
selain itu akan dicetak dalam format scientific.

Contoh : format scientific.

#include <iostream.h>
main()
{
double x;
cout << “Masukkan float : “; cin >> x;
cout << “Kebalikannya adalah “ << 1/x << endl;
return 0;
}

Keluarannya adalah

Masukkan float : 234.567e89


Kebalikannya adalah 4.26317e-92

Catatan : pada pemasukkan data dapat digunakan e atau E.


60

3.11 Konstanta, Variabel dan Obyek

Suatu obyek adalah suatu daerah yang berbatasan dalam memori yang
mempunyai suatu alamat, suatu ukuran, suatu tipe dan suatu nilai.
Alamat dari suatu obyek adalah alamat memori dari byte pertama.
Ukuran dari suatu obyek adalah suatu jumlah byte yang ditempatinya
dalam memori. Nilai dari suatu obyek adalah konstanta yang
menentukan secara aktual bit yang disimpan dalam lokasi memori; dan
tipe obyek menggambarkan bagaimana bit diintepretasikan.

Sebagai contoh :

Dengan GNU C++ pada suatu workstation UNIX, obyek n didefinisikan


sebagai

int n = 22;

mempunyai alamat memori 0x3fffcd6, ukuran 4, tipe int dan nilai 22.
(Alamat memori adalah suatu bilangan heksadesimal).

Tipe suatu obyek ditentukan oleh pemrogram. Nilai suatu obyek juga
dapat ditentukan oleh pemrogram pada saat compile, atau ditentukan
pada saat run. Ukuran obyek ditentukan oleh compiler. Sebagai contoh,
dalam GNU C++ suatu int mempunyai ukuran 4, sementara dalam
Borland C++ mempunyai ukuran 2. Alamat suatu obyek ditentukan oleh
sistem operasi komputer pada saat run.

Suatu variabel adalah suatu obyek yang mempunyai sebuah nama.


Obyek yang didefinisikan di atas adalah suatu variabel dengan nama ‘n’.
Kata “variabel” dapat digunakan untuk menduga nilai obyek yang akan
diubah. Suatu obyek yang nilainya tidak dapat diubah disebut suatu
konstanta. Konstanta dideklarasikan dengan merinci tipenya dengan
kata kunci const, seperti

const int n = 22;

Konstanta harus diinisialisasi jika dideklarasikan.


61

Contoh :

#include <iostream.h>
main()
{
const char BEEP = ‘\b’;
const int MAXINT = 2147483647;
int n = MAXINT/2;
const float KM_PER_MI = 1.60934;
const double PI = 3.14159265358979323846;
return 0;
}

Konstanta biasanya didefinisikan untuk nilai-nilai seperti , yang akan


digunakan selanjutnya, lebih dari satu kali dalam sebuah program tanpa
mengalami perubahan.
62

IV. FUNGSI-FUNGSI

Agar suatu program yang besar dapat ditata dengan baik, pemrogram
dapat membuatnya dalam bentuk subprogram-subprogram.
Subprogram-subprogram ini biasa disebut sebagai fungsi. Fungsi-fungsi
ini dapat dicoba dan di compile secara terpisah dan dapat digunakan
dalam program-program yang bebeda.

1. Fungsi-Fungsi Pustaka Standard C

Pustaka Standard C adalah suatu kumpulan dari fungsi-fungsi yang telah


didefinisikan (pre-defined) dan elemen-elemen programnya dapat diakses melalui
file header. Sebagai contoh, konstanta INT_MAX didefinisikan dalam <limits.h>;
fungsi rand () didefinisikan dalam <stdlib.h>; dan fungsi time () didefinisikan dalam
<time.h>. Fungsi-fungsi matematis biasanya didefinisikan dalam file header
<math.h>.

Perhatikan contoh berikut :

#include <iostream.h>
#include <math.h>
// Mencoba untuk menggunakan fungsi akar pangkat dua (sqrt).
main()
{
for (int i = 0; i < 6; i++)
cout << “\t” << i << “\t” << sqrt (i) << endl;
return 0;
}

Keluarannya adalah

0 0
1 1
2 1.41421
3 1.73205
4 2
5 2.23607

Contoh lain :

#include <iostream.h>
#include <math.h>
// Menghitung nilai trigonometri sin2x = 2 sin x cos x.
main()
{
for (float x = 0; x < 2; x += 0.2)
63

cout << “\t” << x << “\t” << sin (2*x) << “\t” << 2*sin(x)*cos(x) <<
endl;
return 0;
}

Keluarannya adalah

0 0 0
0.2 0.389418 0.389418
0.4 0.717356 0.717356
0.6 0.932039 0.932039
0.8 0.999574 0.999574
1 0.909297 0.909297
1.2 0.675463 0.675463
1.4 0.334988 0.334988
1.6 -0.0583744 -0.0583744
1.8 -0.442521 -0.442521

Tabel 1. Beberapa Fungsi <math.h>

FUNGSI DESKRIPSI CONTOH


acos (x) Inverse cosinus dari x (dalam radian) acos (0.2) adalah 1.36944
asin (x) Invers sinus dari x (dalam radian) asin (0.2) adalah 0.201358
atan (x) Invers tangens dari x (dalam radian) atan (0.2) adalah 0.197396
ceil (x) Pembulatan ke atas dari x (rounds up) ceil (3.141593) adalah 4.0
cos (x) Cosinus dari x (dalam radian) cos (2) adalah –0.416147
exp (x) Eksponensial dari x (berdasarkan e) exp (2) adalah 7.38906
fabs (x) Harga mutlak dari x fabs (-2) adalah 2.0
floor (x) Pembulatan ke bawah dari x (rounds floor (3.141593) adalah 3.0
down)
log (x) Logaritma naturalis dari x (berdasarkan log (2) adalah 0.693147
e)
log10 (x) Logaritma dari x (berdasarkan 10) log10 (2) adalah 0.30103
pow (x,p) Pangkat p dari x pow (2,3) adalah 8
sin (x) Sinus dari x (dalam radian) sin (2) adalah 0.909297
sqrt (x) Akar pangkat dua dari x sqrt (2) adalah 1.41421
tan (x) Tangens dari x (dalam radian) tan (2) adalah –2.18504

Tabel 2. Beberapa file header dalam pustaka Standard C

FILE HEADER DESKRIPSI


<assert.h> Mendeklarasikan fungsi assert ()
<ctype.h> Mendeklarasikan fungsi untuk mentest karakter
<float.h> Mendeklarasikan konstanta riel
<limits.h> Mendefinisikan batas nilai integer pada sistem local
64

<math.h> Mendeklarasikan fungsi matematis


<stdio.h> Mendeklarasikan fungsi untuk standard masukan dan
keluaran
<stdlib.h> Mendeklarasikan fungsi utilitas
<string.h> Mendeklarasikan fungsi untuk pemrosesan string
<time.h> Mendeklarasikan fungsi waktu

Dalam C++ terdapat file header lain, yaitu <iostream.h> dan <fstream.h>.

2. Fungsi-Fungsi yang didefinisikan oleh User

Pemrogram dapat juga membuat fungsi yang didefinisikan sendiri olehnya.

Perhatikan contoh berikut.

// Fungsi pangkat tiga dari bilangan integer.


// Didefinisikan sendiri oleh pemrogram.
int PangkatTiga (int x)
{
return x*x*x;
}

Fungsi yang didefinisikan oleh pemrogram terdiri dari 2 bagian, yaitu judul (header)
dan isinya (body).
Judul dari sebuah fungsi terdiri dari tipe return, nama dan list parameter. Untuk
contoh di atas, tipe return adalah int, nama adalah PangkatTiga, dan list
parameternya adalah int x. Jadi judul untuk fungsi pangkat tiga adalah

int PangkatTiga (int x)

Isi dari sebuah fungsi adalah blok kode yang mengikuti judulnya. Berisi kode yang
menjalankan aksi dari fungsi, termasuk pernyataan return yang memuat nilai fungsi
yang akan dikembalikan ke yang memanggilnya. Isi dari fungsi PangkatTiga adalah

{
return x*x*x;
}

Biasanya isi dari fungsi cukup besar. Meskipun demikian, judulnya tetap
hanya berada dalam satu baris.

Pernyataan return dari sebuah fungsi mempunyai dua manfaat, yaitu akan
mengakhiri fungsi dan mengembalikan nilainya ke program pemanggil.

Bentuk umum pernyataan return adalah


65

return ekspresi;

dengan ekspresi adalah sebuah ekspresi yang nilainya dinyatakan untuk sebuah
variabel yang tipenya sama seperti tipe fungsi return.

Perhatikan contoh berikut.

#include <iostream.h>
// Fungsi pangkat x tiga dari bilangan integer.
int PangkatTiga (int x)
{
return x*x*x;
}
// Mencoba fungsi PangkatTiga :
main()
{
int n = 1;
while (n != 0) {
cin >> n;
cout << PangkatTiga (n) << endl;
}
return 0;
}

Keluarannya adalah

5
125
-6
-216
0
0

Perhatikan bahwa fungsi PangkatTiga() didefinisikan di atas fungsi main(). Hal ini
disebabkan compiler C++ harus tahu tentang fungsi PangkatTiga() sebelum dia
digunakan dalam main().

Contoh berikut memperlihatkan sebuah fungsi yang mempunyai dua parameter.


Fungsi akan menghasilkan nilai yang lebih besar dari dua buah bilangan yang
diolahnya.
66

#include <iostream.h>
// Fungsi menentukan nilai yang lebih besar dari dua bilangan integer.
int max (int x, int y)
{
if ( x < y) return y;
else return x;
}

main()
{
int m, n;
do {
cin >> m >> n;
cout << max (m, n) << endl;
} while (m != 0);
return 0;
}
4. Deklarasi Fungsi dan Definisi Fungsi

Pengertian deklarasi fungsi berbeda dengan definisi fungsi. Suatu deklarasi fungsi
adalah judul fungsi yang sederhana yang diikuti oleh tanda semicolon (;). Sedangkan
suatu definisi fungsi adalah fungsi yang lengkap, terdiri dari judul dan isinya. Suatu
deklarasi fungsi disebut juga sebagai suatu prototipe fungsi.
Suatu deklarasi fungsi seperti layaknya suatu deklarasi variabel, yang memberitahu
compiler semua informasi yang dibutuhkan untuk meng-compile file. Compiler
tidak perlu mengetahui bagaimana fungsi bekerja (isinya). Dia hanya perlu tahu
nama fungsi, jumlah dan tipe parameternya, dan tipe return-nya. Hal ini merupakan
informasi yang dimuat secara lengkap dalam judul fungsi.
Juga seperti sebuah deklarasi variabel, suatu deklarasi fungsi harus muncul di atas
semua nama fungsi yang digunakannya. Berbeda dengan definisi fungsi, yang dapat
diletakkan terpisah dari deklarasinya, dan dapat muncul dimana saja diluar fungsi
main() dan biasanya dituliskan setelah fungsi tersebut atau dalam file yang terpisah.
Variabel-variabel yang di list dalam list parameter fungsi disebut
parameter-parameter formal atau argumen-argumen formal. Variabel-
variabel lokal seperti ini hanya ada selama eksekusi fungsi yang
bersangkutan. Dalam contoh di atas, parameter-parameter formalnya
adalah x dan y.
Variabel-variabel yang di list dalam pemanggilan fungsi disebut parameter-
parameter aktual atau argumen-argumen aktual. Sama seperti variabel lainnya dalam
program utama (main program), variabel-variabel tersebut harus dideklarasikan
sebelum digunakan dalam pemanggilan. Dalam contoh di atas, parameter-parameter
aktualnya adalah m dan n.

Contoh program berikut sama dengan program yang sebelumnya, hanya deklarasi
fungsi muncul di atas program utama dan definisi fungsinya seperti berikut.

#include <iostream.h>
67

int max (int, int);


// Mencoba fungsi max.
main()
{
int m, n;
do {
cin >> m >> n;
cout << max (m, n) << endl;
} while (m != 0);
return 0;
}

// Menentukan nilai yang lebih besar dari dua bilangan integer.


int max (int x, int y)
{
if ( x < y) return y;
else return x;
}

Perhatikan bahwa parameter formal x dan y di list dalam judul pada definisi (seperti
biasanya), tetapi bukan definisi.
Terlihat bahwa perbedaan antara suatu deklarasi fungsi dan suatu deklarasi variabel
tidaklah banyak, khususnya jika fungsi tidak mempunyai parameter. Sebagai contoh,
dalam suatu program yang mengolah string, diperlukan sebuah variabel yang
disebut length untuk menyimpan panjang string.Tetapi sebuah alternatif yang layak
akan dimiliki sebuah fungsi yang menghitung string, berapapun yang diperlukan
untuk menyimpan atau mengubah nilai.
Fungsi akan dideklarasikan sebagai

int length ();

dimana variabelnya akan dideklarasikan sebagai


int length;

Bedanya bahwa deklarasi fungsi memasukkan tanda (). Dalam


kenyataannya kedua alternatif tersebut berbeda, tetapi secara sintaks
keduanya hampir sama penggunaannya.

5. Kompilasi Terpisah

Definisi-definisi fungsi sering di-compile secara bebas dalam file-file yang terpisah.
Sebagai contoh, semua fungsi yang dideklarasikan dalam Pustaka Standard C di-
compile secara terpisah. Salah satu alasan untuk memisahkan kompilasi adalah
untuk menyembunyikan informasi, yaitu informasi yang penting melengkapi
kompilasi program tetapi tidak penting untuk dimengerti oleh pemrogram (dari
program yang tersembunyi).
68

Contoh berikut memperlihatkan fungsi max() di-compile secara terpisah. Test


driver-nya (program utamanya) diberi nama file test_max.c dan fungsinya diberi
nama max.c.

File test_max.c

#include <iostream.h>
int max (int, int);
// Test driver untuk fungsi max.
main()
{
int m, n;
do {
cin >> m >> n;
cout << max (m, n) << endl;
} while (m != 0);
}

File max.c

// Menentukan nilai yang lebih besar dari dua bilangan integer.


int max (int x, int y)
{
if ( x < y) return y;
else return x;
}

Perintah aktual yang digunakan untuk meng-compile file di atas tergantung pada
sistemnya masing-masing.
Perintah pertama adalah meng-compile fungsi max. Perintah kedua meng-compile
test driver secara terpisah. Perintah ketiga me-link keduanya untuk menghasilkan
modul test_max yang dapat dilaksanakan (executable module), yang akan di-run
dengan perintah ke-empat.
Salah satu manfaat dari kompilasi secara terpisah adalah program dapat di-test
secara terpisah sebelum program pemanggilnya dituliskan.

6. Variabel Lokal dan Fungsi Lokal

Suatu variabel lokal adalah suatu variabel yang dideklarasikan di dalam


suatu blok. Variabel jenis ini hanya dapat diakses dari dalam blok yang
bersangkutan. Karena isi dari suatu fungsi adalah sebuah blok, maka
variabel yang dideklarasikan dalam suatu fungsi adalah lokal untuk
fungsi tersebut; yang hanya akan ada selama eksekusi dari fungsinya.
69

Contoh berikut adalah fungsi menghitung nilai faktorial dari n buah bilangan.

int faktorial (int n)


{
if (n < 0) return 0;
int f = 1;
while (n > 1)
f *= n--;
return f;
}

Fungsi di atas mempunyai dua lokal variabel, yaitu n dan f. Parameter n lokal karena
dideklarasikan dalam list parameter fungsi. Variabel f lokal karena dideklarasikan
dalam bagian isi dari fungsi.
Program utamanya seperti berikut.

#include <iostream.h>
int faktorial (int);

main()
{
for (int i = -1; i < 6; i++)
cout << “ “ << faktorial (i);
cout << endl;
return 0;
}

Keluarannya adalah

0 1 1 2 6 24 120

Contoh Fungsi permutasi.


Fungsi permutasi P ( n ,k ) memberikan jumlah permutasi yang berbeda dari k item
yang diambil dari suatu set n item. Salah satu cara untuk menghitung fungsi
permutasi ini dengan menggunakan rumus

n!
P ( n,k )=
( n−k ) !

Sebagai contoh,

5! 5! 120
P (5,2 ) = = = =20
( 5−2 ) ! 3! 6
70

terdapat 20 permutasi yang berbeda dari 2 item yang diambil dari sebuah set yang
berisi 5 item.

// Fungsi permutasi P(n,k), banyaknya permutasi k dari n.


int perm (int n, int k)
{
if (n < 0 || k < 0 || k > n) return 0;
return faktorial (n) / faktorial (n-k);
}

Program utamanya

#include <iostream.h>
int perm (int, int);

main()
{
for (int i = -1; i < 8; i++) {
for (int j = -1; j <= i+1; j++)
cout << “ “ << perm (i, j);
cout << endl;
}
return 0;
}

Keluarannya adalah

00
010
0110
01220
013660
0 1 4 12 24 24 0
0 1 5 20 60 120 120 0
0 1 6 30 120 360 720 720 0
0 1 7 42 210 840 2520 5040 5040 0

6. Fungsi void

Dalam bahasa pemrograman lainnya, suatu fungsi disebut sebagai suatu prosedur
atau suatu subrutin. Fungsi seperti ini tidak perlu harus mengembalikan
(menghasilkan) suatu nilai (tetapi dapat hanya mengeluarkan judul saja).
Suatu tipe merinci suatu set dari nilai-nilai. Sebagai contoh, tipe short merinci set
bilangan integer dari –32.768 sampai dengan 32.767.
Tipe void merinci set kosong. Akibatnya tidak ada variabel yang dapat
dideklarasikan dengan tipe void. Suatu fungsi void tidak mengembalikan nilai
apapun.
71

Contoh berikut mencetak fungsi hari dalam bentuk literal, masukannya adalah bulan,
hari dan tahun dalam bentuk numerik.

#include <iostream.h>
void cetakHari (int, int, int);

main()
{
int bulan, hari, tahun;
do {
cin >> bulan >> hari >> tahun;
cetakHari (bulan, hari, tahun);
} while (bulan > 0);
}

void cetakHari (int b, int h, int t)


{
if (b < 1 || b > 12 || h < 1 || h >> 31 || t < 0) {
cout << “Salah : parameter di luar jangkauan.\n”;
return;
}
switch (b) {
case 1 : cout << “Januari “; break;
case 2 : cout << “Februari “; break;
case 3 : cout << “Maret “; break;
case 4 : cout << “April “; break;
case 5 : cout << “Mei “; break;
case 6 : cout << “Juni “; break;
case 7 : cout << “Juli “; break;
case 8 : cout << “Agustus “; break;
case 9 : cout << “September “; break;
case 10 : cout << “Oktober “; break;
case 11 : cout << “November “; break;
case 12 : cout << “Desember “; break;
}
cout << h << “, “ << t << endl;
}

Keluarannya adalah

5 28 1959
Mei 28, 1959

12 29 1989
Desember 29, 1989

000
72

Salah : parameter di luar jangkauan.

Fungsi cetakHari () tidak mengembalikan nilai apapun. Fungsi ini hanya


untuk mencetak hari. Dengan demikian maka tipe return-nya adalah
void.

7. Fungsi-Fungsi Boolean

Dalam beberapa situasi, penggunaan sebuah fungsi diperlukan untuk mengevaluasi


suatu kondisi, khususnya dalam pernyataan if atau pernyataan while. Fungsi-fungsi
ini disebut sebagai fungsi Boolean.

Perhatikan contoh program berikut yang mengklasifikasikan karakter


ASCII sebanyak 128 buah.

#include <iostream.h>
#include <ctype.h>

// Mencetak kategori yang dimiliki oleh karakter.


void printKategoriKarakter(char c)
{
cout << “Karakter [“ << k << “] adalah sebuah “;
if (isdigit (k)) cout << “digit.\n”;
else if (islower (k)) cout << “huruf kecil.\n”;
else if (isupper (k)) cout << “huruf besar.\n”;
else if (isspace (k)) cout << “karakter spasi.\n”;
else if (iscntrl (k)) cout << “karakter kontrol.\n”;
else if (ispunct (k)) cout << tanda baca.\n”;
else cout << “Salah.\n”; return;
}

main()
{
for (int k = 0; k < 128; k++)
printKategoriKarakter (k);
}

Fungsi void printKategoriKarakter memanggil 6 (enam) fungsi Boolean, yaitu


isdigit(), islower(), isupper(), isspace(), iscntrl() dan ispunct(). Setiap fungsi telah
didefinisikan dalam file header <ctype.h>. Fungsi-fungsi tersebut digunakan untuk
men-test tipe karakter, yaitu “c type”.
Sebagian dari keluarannya adalah seperti berikut.

Karakter [] adalah sebuah karakter kontrol.


Karakter [ ] adalah sebuah karakter spasi.
Karakter [;] adalah sebuah tanda baca.
73

Karakter [*] adalah sebuah tanda baca.


Karakter [#] adalah sebuah tanda baca.

Dan seterusnya, sampai 128 buah karakter dalam 128 baris.

Contoh di atas menggambar beberapa ide baru. Ide utamanya adalah penggunaan
fungsi Boolean isdigit(), islower(), isupper(), isspace(), iscntrl() dan ispunct().
Sebagai contoh, pemanggilan isspace (k) mentest karakter k untuk menentukan yang
mana yang merupakan karakter spasi. (Terdapat enam buah karakter spasi, yaitu
karakter tab horizontal \t, karakter baris baru \n, karakter tab vertical \v, karakter
form feed \f, karakter carriage return \r dan karakter spasi). Jika k adalah salah satu
dari ke-enam karakter ini, maka fungsi mengembalikan (return) nilai “1” untuk
“benar”; sebaliknya akan mengembalikan nilai “0” untuk “salah”.

Contoh lain, fungsi Boolean digunakan untuk men-test bilangan integer yang
merupakan bilangan prima.

// Return 1, jika n adalah prima, 0 jika sebaliknya.


int isPrime (int n)
{
float sqrtp = sqrt (p);
if (p < 2) return 0; // 2 adalah bilangan prima yang pertama.
if (p == 2) return 1;
if (p % 2 == 0) return 0; // 2 adalah bilangan prima yang genap.
for (int d = 3; d <= sqrtp; d += 2)
if (p % d == 0) return 0;
return 1;
}

Program utamanya (test driver) seperti berikut.

#include <iostream.h>
int isPrime (int);

main()
{
for (int n = 1; n < 50; n++)
if (isPrime (n)) cout << n << “ “;
cout << endl;
}

Keluarannya adalah

2 3 5 7 11 13 17 19 23 31 37 41 43 47
Contoh lain, yaitu tahun kabisat. Tahun kabisat adalah tahun yang habis dibagi oleh
4 dan bulan Februari mempunyai hari sebanyak 29. Selain dari pada itu, tahun
74

dengan kelipatan 100 (contohnya tahun 1800 dan tahun 1900) bukanlah suatu tahun
kabisat, kecuali tahun dengan kelipatan 400 (tahun 2000).

// Return 1, jika y adalah tahun kabisat, 0 jika sebaliknya.


int isTahunKabisat (int y)
{
return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}

Kondisi gabungan y % 4 == 0 && y % 100 != 0 || y % 400 == 0 akan benar jika y


habis dibagi 4 dan y tidak habis dibagi 100, atau y habis dibagi 400. Dalam kasus ini
fungsi akan menghasilkan return 1; dalam keadaan lain akan memberikan return 0.

Program utamanya adalah

#include <iostream.h>
int isTahunKabisat (int);
{
int n;
do {
cin >> n;
if (isTahunKabisat (n)) cout << n << “ adalah suatu tahun kabisat. \n”;
else cout << n << “ adalah bukan suatu tahun kabisat.\n”;
} while (n > 1);
return 0;
}

Keluarannya adalah

1995
1995 adalah bukan suatu tahun kabisat.

1996
1996 adalah suatu tahun kabisat.

1990
1990 adalah bukan suatu tahun kabisat.

2000
2000 adalah tahun kabisat.

0
0 adalah suatu tahun kabisat.
75

8. Melalukan dengan Referensi

Sampai saat ini, semua parameter yang telah disampaikan terlihat dalam
fungsi-fungsi yang dilalukan dengan nilai. Hal ini berarti bahwa
ekspresi yang digunakan dalam pemanggilan fungsi dievaluasi pertama
kali kemudian nilai yang dihasilkan dinyatakan ke paramater yang
dimaksud dalam fungsi list parameter sebelum fungsi mulai dieksekusi.
Sebagai contoh, dalam pemanggilan PangkatTiga (x), jika x mempunyai
nilai 4, maka nilai 4 adalah yang dilalukan ke variabel lokal n sebelum
fungsi mulai mengeksekusi pernyataan-pernyataannya. Karena nilai 4
hanya dipakai secara lokal dalam fungsi, variabel x tidak dipengaruhi
oleh fungsi. Jadi variabel x adalah sebuah parameter yang “read only”.

Mekanisme melalukan dengan nilai mengijinkan ekspresi yang lebih


umum digunakan dalam parameter aktual, di dalam fungsi pemanggil.
Sebagai contoh, fungsi PangkatTiga dapat juga disebut sebagai
PangkatTiga (3), atau sebagai PangkatTiga (2*x-3) atau sebagai
PangkatTiga (2*sqrt (x) –PangkatTiga (3)). Dalam setiap kasus, ekspresi
dalam tanda kurung dievaluasi sebagai sebuah nilai tunggal, kemudian
nilai tersebut dilalukan ke fungsi.

Metoda komunikasi melalukan dengan nilai secara “read only” biasanya


merupakan hal diinginkan untuk fungsi. Hal ini membuat fungsi lebih
berisi, terlindung dari efek samping yang mencelakakan. Meskipun
demikian, terdapat beberapa situasi dimana suatu fungsi memerlukan
mengubah nilai dari parameter yang melaluinya. Hal ini dapat dilakukan
dengan melalukannya melalui referensi.

Untuk melalukan sebuah parameter dengan referensi, cukup dengan


menambahkan tanda & ke tipe yang dirinci dalam list parameter fungsi.
Hal ini membuat variabel lokal suatu referensi menjadi parameter
aktual. Dengan demikian, parameter aktual adalah parameter yang
“read-write”, bukan sekedar “read only”.
Perubahan terhadap variabel lokal di dalam fungsi akan menyebabkan
perubahan yang sama terhadap parameter aktual yang dilalukannya.

Contoh, fungsi “swap” adalah suatu fungsi yang biasa digunakan dalam
pengurutan data.

// Swap (tukarkan) isi x dan y.


void swap (float& x, float& y)
76

{
float temp = x;
x = y;
y = temp;
}

Penyelesaian dengan mendeklarasikan parameter formal x dan y sebagai


variabel-variabel referensi float& x dan float& y. Operator referensi &
membuat x dan y sinonim untuk parameter aktual yang dilalukan ke
fungsi.

Program utamanya seperti berikut.

#include <iostream.h>
void swap (float&, float&);

// Program utama untuk fungsi swap.


main()
{
float a = 25, b = -5.252;
cout << a << “ “ << b << endl;
swap (a, b);
cout << a << “ “ << b << endl;
}

Keluarannya adalah

25 –5.252
-5.252 25

Ketika pemanggilan swap (a, b) dilaksanakan, fungsi menciptakan


referensi lokalnya x dan y, sehingga x adalah nama fungsi lokal untuk a,
dan y adalah nama fungsi lokal untuk b. Kemudian variabel lokal temp
dideklarasikan dan diinisialisasi dengan nilai dari a; a diisi dengan nilai
b dan b diisi dengan nilai dari temp. Akibatnya nilai a menjadi –5.252
dan nilai b menjadi 25.0.
77

Deklarasi fungsi
void swap (float&, float&);
memuat operator referensi & untuk tiap parameter referensi, sekalipun
parameternya sendiri diabaikan.

Beberapa pemrogram C++ menuliskan operator referensi & didepan


parameternya (mendahului), seperti
void swap (float &x, float &y)
berbeda dengan penulisan sebelumnya. Compiler tetap akan menerima
cara penulisan seperti float& x atau float &x atau float & x atau
float&x.

Contoh berikut adalah perbedaan program melalukan dengan nilai dan


melalukan dengan referensi.

#include <iostream.h>
void f(int x, int& y) { x = 88; y = 99; }

main()
{
int a = 22, b = 33;
cout << “a = “ << a << “, b = “ << b << endl;
f (a, b);
cout << “a = “ << a << “, b = “ << b << endl;
}

Keluarannya adalah

a = 22, b = 33
a = 22, b = 99

Pemanggilan f(a, b) melalukan a dengan nilai ke x dan b dengan


referensi ke y. Jadi x adalah suatu variabel lokal yang menunjuk nilai a
= 22, sementara y adalah suatu alias untuk variabel b yang bernilai 33.
Fungsi menunjuk 88 ke x, tetapi hal ini tidak mempengaruhi a. Tetapi
ketika nilai 99 ditunjuk ke y, hal ini langsung berlaku untuk b. Jadi
ketika fungsi berhenti, a masih mempunyai nilai 22, sementara b
memiliki nilai baru, yaitu 99. Parameter aktual a adalah “read only”,
sedangkan parameter aktual b adalah “read write”.
78

Tabel 3. Perbedaan antara melalukan dengan nilai dan melalukan


dengan referensi.

Melalukan dengan nilai Melalukan dengan variabel

int x; int& x;
Parameter formal x adalah suatu Parameter formal x adalah suatu
variabel lokal. referensi lokal.
Merupakan duplikat dari parameter Merupakan sinonim untuk
aktual. parameter aktual.
Tidak dapat mengubah parameter Dapat mengubah parameter aktual.
aktual.
Parameter aktual dapat berupa Parameter aktual harus berupa
sebuah konstanta, variabel atau sebuah variabel.
ekspresi.
Parameter aktual adalah “read Parameter aktual adalah “read
only”. write”

Contoh berikut adalah fungsi yang mengembalikan dua nilai parameter


referensi, yaitu luas dan keliling dari suatu lingkaran yang jari-jarinya
adalah r.

void MenghitungLingkaran (double& luas, double& keliling,


double r)
{
const double pi = 3.141592653589793;
luas = pi * r * r;
keliling = 2 * pi * r;
}

Program utamnya adalah

#include <iostream.h>
void MenghitungLingkaran (double&, double&, double);
main()
{
double r, a, c;
cout << “Masukkan jari-jarinya : “;
cin >> r;
MenghitungLingkaran (a, c, r);
79

cout << “Luas = “ << a << “, keliling = “ << c << endl;


}

Keluarannya adalah

Masukkan jari-jarinya : 100


Luas = 31415.9, keliling = 628.319

9. Melalukan dengan Referensi Konstanta

Melalukan dengan referensi konstanta sama saja dengan melalukan


dengan referensi, kecuali bahwa tidak dapat mengubah nilai parameter
yang digunakan. Suatu parameter yang dilalukan dengan nilai disebut
“read only” karena tidak dapat menulisi (mengubah) isi parameter.

Perhatikan contoh berikut.

void f (int x, int& y, const int& z)


{
x += z;
y += z;
cout << “x = “ << x << “, y = “ << y << “, z = “ << z << endl;
}

Parameter pertama a dilalukan dengan nilai, parameter kedua b


dilalukan dengan referensi dan parameter ketiga c dilalukan dengan
referensi konstanta, seperti berikut.

#include <iostream.h>
void f (int, int&, const int&)

main()
{
int a = 22, b = 33, c = 44;
cout << “a = “ << a << “, b = “ << b << “, c = “ << c << endl;
f (a, b, c);
cout << “a = “ << a << “, b = “ << b << “, c = “ << c << endl;
}

Keluarannya adalah
80

a = 22, b = 33, c = 44
x = 66, y = 77, z = 44
a = 22, b = 77, c = 44

Fungsi mengubah parameter formal x dan y, tetapi tidak akan mengubah


z. Perubahan fungsi x tidak berpengaruh pada parameter aktual a, karena
dilalukan sebagai nilai. Perubahan fungsi y mempunyai akibat yang
sama terhadap parameter aktual b, karena dilalukan sebagai referensi.
Parameter-parameter yang dilalukan dengan referensi konstanta banyak
digunakan dalam fungsi-fungsi pada pemrosesan obyek yang besar,
seperti deret (array) dan kelas. Obyek-obyek dari tipe-tipe dasar (seperti
integer, float dan sebagainya) biasanya dilalukan baik secara nilai
maupun dengan referensi.
10. Fungsi Scope

Contoh berikut memperlihatkan bahwa f () dan g () adalah fungsi global,


dan x pertama adalah suatu variabel global. Sehingga jangkauannya
meliputi seluruh file. Hal ini disebut jangkauan file (file scope). x kedua
dideklarasikan di dalam main (), sehingga merupakan jangkauan lokal,
dimana dapat diakses hanya dari dalam main (). x ketiga dideklarasikan
di dalam blok internal, sehingga jangkauannya dibatasi hanya dalam
blok internal tersebut.

void f (); // f () adalah global


void g (); // g () adalah global
int x = 11; // x ini adalah global

main()
{ // awal jangkauan main()
int x = 22;
{ // awal jangkauan dari blok internal
int x = 33;
cout << “Dalam blok di dalam main() : x = “ << x <<
endl;
} // akhir dari jangkauan blok internal
cout << “Dalam main() : x = “ << x << endl;
cout << “Dalam main() : ::x = “ << ::x << endl; // mengakses
x global
f ();
g ();
81

} // akhir jangkauan dari main()

void f ()
{ // awal jangkauan dari f ()
int x = 44;
cout << “Dalam f () : x = “ << x << endl;
} // akhir dari jangkauan f ()

void g ()
{ // awal jangkauan g ()
cout << “Dalam g () : x = “ << x << endl;
} // akhir jangkaun g ()

Keluarannya adalah

Dalam blok di dalam main() : x = 33


Dalam main() : x = 22
Dalam main() : ::x = 11
Dalam f () : x = 44
Dalam g () : x = 11

11. Overloading

C++ mengijinkan penggunaan nama yang sama untuk fungsi-fungsi


yang berbeda, sepanjang adanya perbedaan dalam list tipe
parameternya, sehingga compiler akan menganggapnya sebagai fungsi
yang berbeda. Untuk membedakannya, list parameter harus memuat
sebuah argumen yang berbeda atau sedikitnya sebuah posisi dalam list
parameter tipenya berbeda.

Perhatikan contoh berikut.

int max (int, int);

int max (int, int, int);

double max (double, double);

main()
{
82

cout << max (99, 77) << “ “ << max (55, 66, 33) << “ “ << max
(3.4, 7.2) << endl;
}

int max (int x, int y)


{
return (x > y ? x : y);
}

// Kembalikan nilai maksimum dari 3 buah bilangan integer.


int max (int x, int y, int z)
{
int m = (x > y ? x : y);
return (z > m ? z : m);
}

// Kembalikan nilai maksimum dari dua buah bilangan riel.


double max (double x, double y)
{
return (x > y ? x : y);
}

Keluarannya adalah

99 66 7.2

Tiga fungsi yang berbeda semuanya mempunyai nama fungsi max.


Compiler akan memeriksa list parameter untuk menentukan yang mana
yang akan digunakan pada saat pemanggilan fungsi yang bersangkutan.

Fungsi-fungsi yang overloaded banyak digunakan dalam C++. Nilainya


akan semakin nyata dengan pemakaiannya dalam kelas (akan dijelaskan
berikutnya).

12. Fungsi main () dan Fungsi exit ()


83

Setiap program C++ memerlukan sebuah fungsi yang disebut main().


Program dimulai dengan memanggil main().
Hampir semua compiler C++ mengharapkan fungsi main() mempunyai
nilai tipe integer yang dikembalikannya (return). Dengan demikian
biasanya hanya dituliskan sebagai
main()
bukan
int main()

Dalam kasus lain, hampir semua compiler mengijinkan pernyataan


return untuk diabaikan (dihapuskan), meskipun beberapa akan
memberikan peringatan jika hal ini diabaikan. Jika hal ini disertakan,
akan mengembalikan nilai integer.

Untuk mengakhiri program dari dalam suatu fungsi selain fungsi main(),
tidak dapat digunakan pernyataan return. Pernyataan return hanya akan
mengakhiri fungsi yang ada pada saat itu (current) dan mengembalikan
kendali ke fungsi permintaan. Cara lain untuk mengakhiri program dan
dapat digunakan dimanapun serta dalam fungsi apapun adalah dengan
fungsi exit(), yang didefinisikan dalam file header <stdlib.h>.

Perhatikan contoh berikut.

#include <iostream.h>
#include <stdlib.h>

double kebalikandari (double x)


{
if (x == 0) exit (1);
return 1.0/x;
}

main()
{
double x;
cin >> x;
cout << kebalikandari (x);
}
84

Jika user memasukkan 0 untuk x, program akan berakhir dari dalam


fungsi kebalikandari() tanpa mencoba untuk melaksanakan proses
pembagian.

13. Argumen-Argumen Default

C++ mengijinkan suatu fungsi untuk mempunyai sebuah variabel


bilangan dari argumen-argumen. Hal ini dikerjakan asalkan nilai-nilai di
default untuk argumen-argumen pilihan.

Contoh berikut memperlihatkan fungsi mengevaluasi polinomial


2 3
berderajat tiga a0 +a1 x +a 2 x +a3 x . Evaluasi aktual adalah dengan
algoritma Horner, yaitu dengan mengelompokkan perhitungan sebagai
a0 + ( a1 + ( a2 + a3 x ) x ) x
untuk memperbesar efisiensi.

double p (double, double, double = 0, double = 0, double = 0);

main()
{
double x = 2.0003;
cout << “p(x, 7) = “ << p (x, 7) << endl;
cout << “p(x, 7, 6) = “ << p (x, 7, 6) << endl;
cout << “p(x, 7, 6, 5) = “ << p (x, 7, 6, 5) << endl;
cout << “p (x, 7, 6, 5, 4) = “ << p (x, 7, 6, 5, 4) << endl;
}

double p (double x, double a0, double a1, double a2, double a3)
{
return a0 + (a1 + (a2 + a3*x)*x)*x;
}

Pemanggilan p(x, a0, a1, a2, a3) mengevaluasi polinomial berderajat


2 3
tiga a0 +a1 x +a 2 x +a3 x . Tetapi karena a1, a2 dan a3 semuanya
mempunyai nilai 0, fungsi dapat juga disebut dengan p(x, a0) untuk
3
mengevaluasi konstanta polynomial a0 , atau p(x, a0, a1) untuk
mengevaluasi polinomial berderajat satu a0 +a1 x , atau p(x, a0, a1, a2)
2
untuk mengevaluasi polinomial berderajat dua a0 +a1 x +a 2 x .
85

Adapun keluarannya sebagai berikut.

p(x, 7) = 7
p(x, 7, 6) = 19.0018
p(x, 7, 6, 5) = 39.0078
p (x, 7, 6, 5, 4) = 71.0222

Pemanggilan p(x, 7, 6, 5) ekivalen dengan pemanggilan p(x, 7, 6, 5, 0),


2
mengevaluasi polinomial berderajat dua 7+6 x+5 x .

Jika suatu fungsi mempunyai nilai-nilai parameter default, maka list


fungsi parameter harus memperlihatkan parameter-parameter dengan
nilai-nilai default di kanan semua parameter yang tidak memiliki nilai
default, seperti contoh berikut.

void f ( int a, int b, int c = 4, int d = 7, int e = 3); // benar

void g (int a, int b = 2, int c = 4, int d, int e = 3); // salah


86

V. DERET (ARRAYS)

Deret (arrays) adalah suatu deretan obyek-obyek dengan tipe yang


sama. Obyek-obyek tersebut biasa disebut sebagai elemen-elemen dari
deret dan diberi nomor berurutan 0, 1, 2, 3, … . Nomor-nomor ini biasa
disebut sebagai indeks atau subsricpt dari deret. Sebutan subscript
digunakan karena deret dituliskan seperti sebuah deretan matematis :
a0 , a1 ,a2 ,⋯ . Indeks menunjukkan lokasi elemen-elemen sehingga dapat
langsung diakses.

Jika nama deret adalah a, maka a[0] adalah nama elemen yang berada
pada posisi 0; a[1] adalah nama elemen yang berada pada posisi 1, dan
seterusnya. Secara umum, elemen ke- i berada pada posisi ke i−1.
Sehingga bila sebuah deret mempunyai n elemen, nama-nama mereka
adalah a[0], a[1], a[2], …, a[n-1].

Gambar imajinasi sebuah deret.

Gambar di atas memperlihatkan sebuah deret dengan 5 elemen : a[0]


berisi 11.11, a[1] berisi 22.22, a[2] berisi 33.33, a[3] berisi 44.44 dan
a[4] berisi 55.55. Penggambaran sebenarnya sebuah deret di dalam
memori komputer juga seperti gambar di atas, karena sebuah deret
selalu disimpan dengan cara demikian dimana elemen-elemennya
berdereten.

Metoda penomoran elemen ke-i dengan indeks i-1 disebut zero-based


indexing. Hal ini berakibat bahwa indeks dari sebuah elemen deret
selalu sama dengan nomor langkah dari elemen awal a[0] ke elemen
tersebut. Sebagai contoh, elemen a[3] adalah 3 langkah dari elemen a[0].

Deret sangat bermanfaat karena mengijinkan penggunaan sebuah nama


dengan sebuah variabel indeks untuk digunakan dalam beberapa tempat
dengan nama yang berbeda. Hal ini memudahkan untuk melakukan
berbagai proses.
Perhatikan contoh berikut.

#include <iostream.h>
87

// Program membaca 4 buah bilangan dan mencetaknya dalam urutan


berkebalikan.
main()
{
double a[4];
cout << “Masukkan 4 buah bilangan riel :\n “;
for (int i = 1; i <= 4; i++) {
cout << i << “ : “;
cin >> a[i-1];
}
cout << “Berikut keluarannya dalam format berkebalikan :\n”;
for (i = 3; i >= 0; i--)
cout << “\ta[“ << i << “] = ” << a[i] << endl;
return 0;
}
Keluarannya adalah

Masukkan 4 buah bilangan riel :


1 : 1.234
2 : 2.345
3 : 3.456
4 : 4.567
Berikut keluarannya dalam format berkebalikan :
a[3] = 4.567
a[2] = 3.456
a[1] = 2.345
a[0] = 1.234

Contoh lain :

#include <iostream.h>
// Program menggunakan konstanta simbolik untuk mendeklarasikan
// dan memroses deret.
main()
{
const int ukuran = 4;
double a[ukuran];
cout << “Masukkan “ << ukuran << “ buah bilangan riel :\n “;
for (int i = 1; i <= ukuran; i++) {
cout << i << “ : “;
cin >> a[i-1];
}
cout << “Berikut keluarannya dalam format berkebalikan :\n”;
for (i = ukuran - 1; i >= 0; i--)
cout << “\ta[“ << i << “] = ” << a[i] << endl;
return 0;
88

Akan menghasilkan keluaran yang sama. Dalam hal ini ukuran


diinisialisasi dengan nilai 4. Selanjutnya digunakan untuk
mendeklarasikan deret a.

Bentuk umum deklarasi deret adalah

tipe nama-deret[ukuran-deret];

dengan tipe adalah tipe elemen deret dan ukuran-deret adalah


banyaknya elemen (jumlah elemen).
Deklarasi dalam contoh di atas, yaitu

double a[ukuran];

mendeklarasikan a adalah suatu deret dengan 100 elemen, dimana setiap


elemen bertipe double. Standard C++ memerlukan ukuran-deret yang
berupa sebuah konstanta integer positif. Bentuk tersebut dapat saja
dituliskan sebagai
const int ukuran = 100;
1. Inisialisasi Sebuah Deret

Dalam C++, sebuah deret dapat diinisialisasi dengan sebuah list


inisialisasi tunggal, seperti

float a[4] = {22.2, 44.4, 66.6, 88.8};

Nilai-nilai dalam list menunjuk ke elemen-elemen dari deret dalam


urutan seperti yang terdapat dalam list tersebut.

Contoh program.

#include<iostream.h>
main()
{
double a[4] = {22.2, 44.4, 66.6, 88.8};
for (int i = 0; i < 4; i++)
cout << “a[“ << i << “] = “ << a[i] << endl;
}
89

Bentuk keluarannya adalah

a[0] = 22.2
a[1] = 44.4
a[2] = 66.6
a[3] = 88.0

Jika jumlah elemen dalam deret lebih dari pada yang terdapat dalam list,
maka sisa elemennya diberi nilai nol (0).

#include<iostream.h>
main()
{
double a[4] = {22.2, 88.8};
for (int i = 0; i < 4; i++)
cout << “a[“ << i << “] = “ << a[i] << endl;
}

Bentuk keluarannya adalah

a[0] = 22.2
a[1] = 88.0
a[2] = 0.0
a[3] = 0.0

Jika deklarasi sebuah deret tidak memuat list inisialisasi, maka elemen-
elemen kemungkinan akan berisi nilai yang sembarang.

#include<iostream.h>
main()
{
double a[4];
for (int i = 0; i < 4; i++)
cout << “a[“ << i << “] = “ << a[i] << endl;
}

Bentuk keluarannya adalah


90

a[0] = 2.122e-314
a[1] = 2.05154e-289
a[2] = 3.31558e-316
a[3] = 7.48088e-309

Terlihat bahwa isinya tidak dapat diduga.

Sebuah deret yang secara eksplisit diinisialisasi, maka ukurannya dapat


saja tidak dituliskan (diabaikan dalam deklarasinya).

Penulisan

float a[4] = {22.2, 44.4, 66.6, 88.8};

sama saja dengan

float a[] = {22.2, 44.4, 66.6, 88.8};

2. Melalukan Sebuah Deret Ke Suatu Fungsi

Kode float a[] digunakan untuk mendeklarasikan sebuah deret dengan


sebuah list inisialisasi, yang memberitahu compiler 2 hal, yaitu nama
deret adalah a dan elemen deret bertipe float.
Simbol a menyimpan alamat memori deret. Sehingga kode float a[]
memberikan semua informasi yang dibutuhkan compiler untuk
mendeklarasikan deret. Ukuran deret (jumlah elemen dalam deret) tidak
perlu disampaikan ke compiler.

Kode yang digunakan untuk melalukan sebuah deret ke suatu fungsi


terdiri dari tipe elemen deret dan namanya. Terdiri dari 2 fungsi yang
memroses deret. Dalam list parameter, deret a[] dideklarasikan dalam
list parameter sebagai

double a[]

Jumlah elemen-elemen sebenarnya yang segera dilalukan dari suatu


variabel integer yang terpisah.

Bila suatu fungsi melalukan sebuah deret dengan cara ini, sebenarnya
hanya melalukan alamat dari sel memori dimana deret dimulai. Nilainya
91

direpresentasikan oleh nama deret. Selanjutnya fungsi dapat mengubah


isi deret secara langsung dengan mengakses sel memori dimana elemen
deret disimpan. Jadi, meskipun nama deret melalukan nilai, elemen-
elemennya dapat diubah seperti jika telah dilalukan sesuai referensi.

Perhatikan contoh beriku.

#include<iostream.h>
const int ukuran = 100;

void getArray (double [], int&);

void printArray (const double [], const int);

main()
{
double a[ukuran];
int n;
getArray (a, n);
cout << “Deret mempunyai “ << n << “ elemen. Yaitu :\n”;
printArray (a,n);
}

void getArray (double a[], int& n)


{
n = 0;
cout << “Masukkan data. Akhiri dengan 0 :\n”;
for (n = 0; n < ukuran; n++) {
cout << n << “ : “;
cin >> a[n];
if (a[n] == 0) break;
}
}

void printArray (const double a[], const int n)


{
for (int i = 0; i < n; i++)
cout << “\t” << i << “ : “ << a[i] << endl;
}

Keluarannya adalah
92

Masukkan data. Akhiri dengan 0 :


0 : 22.22
1 : 66.66
2 : 99.99
3:0
Deret mempunyai 3 elemen. Yaitu :
0 : 22.22
1 : 66.66
2 : 99.99

Terlihat bahwa fungsi getArray (a, n) dan printArray (a, n) melalukan


nama deret a dan variabel integer n. Juga terlihat bahwa lup for dalam
fungsi masukan mencegah user memasukkan data lebih dari ukuran
yang telah ditetapkan dalam deret tersebut.
Fungsi masukan getArray () mengubah ukuran parameter formal,
sehingga dilalukan sesuai referensi. Parameter formal a melalukan
alamat dari elemen pertama dalam deret, dan alamat ini tidak diubah,
sehingga a melalukan nilai. Karena a adalah nama dari sebuah deret
(ditunjukkan dengan a[]), fungsi masih dapat mengubah nilai-nilai dari
elemen deret.
Fungsi keluaran printArray () tidak membuat perubahan terhadap
parameternya, sehingga dinyatakan seperti dalam list parameter sebagai
const.

Perhatikan contoh fungsi penjumlahan berikut.

// Mengembalikan hasil penjumlahan dari n elemen pertama dari


deret.
double sum (const double a[], const int n)
{
double s = 0.0;
for (int i = 0; i < n; i++)
s += a[i];
return s;
}

Seperti fungsi printArray () dalam contoh sebelumnya, fungsi di atas


tidak mengubah nilai-nilai parameternya, sehingga masing-masing
dilalukan sebagai suatu const.
93

3. C++ Tidak Men-cek Jangkauan Dari Suatu Indeks Deret

Dalam beberapa bahasa pemrograman, suatu variabel indeks tidak


mengijinkan melampaui batas yang telah didefinisikan sebuah deret.
Sebagai contoh, dalam pemrograman dengan bahasa Pascal, jika suatu
deret a didefinisikan mempunyai indeks dari 0 sampai 4, maka referensi
a[5] akan menyebabkan terjadinya crash dalam program. Mekanisme
sekuriti seperti ini tidak terdapat dalam C++ (atau C).

4. Algoritma Mencari Secara Linier (Linear Search)

Komputer kemungkinan digunakan lebih dari sekedar menyimpan dan


mengambil informasi, tetapi untuk kegunaan lainnya. Data seringkali
disimpan dalam suatu struktur sekuensial seperti sebuah deret. Cara
yang paling sederhana untuk mencari suatu obyek dalam suatu deret
adalah mulai dari awal dan memeriksa setiap elemennya satu per satu,
sampai obyek yang dimaksud ditemukan. Metoda pencarian seperti ini
yang dikenal dengan sebutan algoritma mencari secara linier.

Perhatikan program berikut.

#include<iostream.h>

void mencari (int& cari, int& lokasi, int a[], int n, int target);

main()
{
int a[] = {55, 22, 99, 66, 44, 88, 33,77}, target, cari, lok;
do {
cout << “Target : “;
cin >> target;
mencari (cari, lok, a, 8, target);
if (cari) cout << target << “ pada a[“ << lok << “].\n”;
else cout << target << “ tidak ditemukan.\n”;
94

} while (target != 0);


}

// Berikut adalah fungsi mencari secara linier.


void mencari (int& cari, int& lokasi, int a[], int n, int target)
{
cari = lokasi = 0;
while (!cari && lokasi < n)
cari = (a[lokasi++] == target);
--lokasi;
}

Keluarannya adalah

Target : 33
33 pada a[6].
Target : 44
44 pada a[4].
Target : 50
50 tidak ditemukan.
Target : 0
0 tidak ditemukan.

Dalam setiap iterasi lup pencarian, elemen a[lokasi] dibandingkan


dengan target. Pencarian ini terus berlangsung sampai ditemukan nilai
yang cocok atau sampai semua elemen telah di-cek. Setiap iterasi
menaikkan indeks lokasi, setelah mengaksesnya. Jadi, bila lup berhenti
karena ditemukan yang cocok, lokasi harus diturunkan ke indeks
dimana target ditemukan.
Terlihat bahwa fungsi mencari () mempunyai tiga parameter masukan
(a, n dan target) dan dua parameter keluaran (cari dan lokasi).

5. Algoritma Bubble Sort


95

Algoritma mencari secara linier tidaklah efisien. Jelas bukan merupakan


cara yang baik untuk mendapatkan sebuah nama dalam buku telepon.
Karena nama yang tersimpan dalam buku telepon sudah terurut, akan
lebih efisien mencarinya dengan menggunakan algoritma struktur data
sekuensial. Seperti suatu deret, pertama-tama struktur diurutkan untuk
meletakkan elemennya dalam keadaan terurut.
Terdapat beragam algoritma untuk mengurutkan suatu deret. Meskipun
tidak efisien dibandingkan dengan yang lain, Bubble sort adalah
algoritma yang paling sederhana.

Perhatikan contoh berikut.

#include<iostream.h>

void print (float [], const int);


void sort (float [], const int);

main ()
{
float a[8] = {55.5, 22.2, 99.9, 66.6, 44.4, 88.8, 33.3, 77.7);
print (a, 8);
sort (a, 8);
print (a, 8);
}

void print (float a[], const int n)


{
for (int i = 0; i < n-1; i++) {
cout << a[i] << “, “;
if ((i+1) % 16 == 0) cout << endl;
}
cout << a[n-1] << endl;
}

void swap (float& x, float& y)


{
float temp = x;
x = y;
y = temp;
}
96

// Bubble sort :
void sort (float a[], const int n)
{
for (int i = n-1; i > 0; i--)
for (int j = 0; j < i; j++)
if (a[j] > a[j+1]) swap (a[j], a[j+1]);
}

Keluarannya adalah

55 22 99 66 44 88 33 77
22 33 44 55 66 77 88 99

6. Algoritma Mencari Secara Biner (Binary Search)

Perhatikan contoh berikut.

// Mencari secara biner.


#include<iostream.h>

void mencari (int& cari, int& lokasi, int a[], int n, int target);

main()
{
int a[] = {22, 33, 44, 55, 66, 77, 88, 99}, target, cari, lok;
do {
cout << “Target : “;
cin >> target;
mencari (cari, lok, a, 8, target);
if (cari) cout << target << “ pada a[“ << lok << “].\n”;
else cout << target << “ tidak ditemukan.\n”;
} while (target != 0);
}

void mencari (int& cari, int& lokasi, int a[], int n, int target)
{
int kiri = 0, kanan = n-1;
cari = 0;
while (!cari && kiri <= kanan) {
lokasi = (kiri + kanan)/2; // titik tengah
97

cari = (a[lokasi] == target);


if (a[lokasi] < target) kiri = lokasi + 1;
else kanan = lokasi –1;
}
}

Keluarannya adalah

Target : 33
33 pada a[1].
Target : 99
44 pada a[7].
Target : 50
50 tidak ditemukan.
Target : 22
22 pada a[0].
Target : 0
0 tidak ditemukan.
7. Menggunakan deret Dengan Tipe-Tipe Enumeration

Perhatikan contoh berikut, yang merepresentasikan tinggi temperatur


udara setiap harinya dalam satu minggu.

#include<iostream.h>
main ()
{
enum Hari (minggu, senin, selasa, rabu, kamis, jum’at,
sabtu);
float tinggi[sabtu+1] = {23.5, 24.5, 25.2, 24.8, 23.9, 24.3, 24.1};
for (Hari hari = minggu; hari <= sabtu; hari++)
cout << “Tinggi temperatur untuk hari “ << hari << “
adalah “
<< tinggi[hari] << endl;
}

Keluarannya adalah

Tinggi temperatur untuk hari 0 adalah 23.5


Tinggi temperatur untuk hari 1 adalah 24.5
Tinggi temperatur untuk hari 2 adalah 25.2
Tinggi temperatur untuk hari 3 adalah 24.8
98

Tinggi temperatur untuk hari 4 adalah 23.9


Tinggi temperatur untuk hari 5 adalah 24.3
Tinggi temperatur untuk hari 6 adalah 24.1

Contoh lain, dengan menggunakan tipe Boolean.

#include<iostream.h>
enum Boolean {salah, benar};
void getInfo (Boolean& Menikah, Boolean& PasanganBekerja);
main ()
{
Boolean Menikah, PasanganBekerja;
getInfo (Menikah, PasanganBekerja);
if (Menikah) {
cout << “Anda menikah.\n”;
if (PasanganBekerja) cout << “Pasangan anda bekerja.\
n”;
else cout << “Pasangan anda tidak bekerja.\n”;
} else cout << “Anda tidak menikah.\n”;
}
void getInfo (Boolean& Menikah, Boolean& PasanganBekerja)
{
char jawaban;
cout << “Anda menikah ? “; cin >> jawaban;
Menikah = (jawaban == ‘y’ || jawaban == ‘Y’);
if (Menikah) {
cout << “Apakah pasangan anda bekerja ? “; cin >>
jawaban;
PasanganBekerja = (jawaban == ‘y’ || jawaban ‘Y’);
} else PasanganBekerja = salah;
}
Keluarannya adalah

Anda menikah ? y
Apakah pasangan anda bekerja ? y
Anda menikah.
Pasangan anda bekerja.

Anda menikah ? Y
Apakah pasangan anda bekerja ? T
Anda menikah.
99

Pasangan anda tidak bekerja.

Anda menikah ? t
Anda tidak menikah.

8. Deret Multidimensional

Deret yang telah dijelaskan sebelumnnya adalah deret satu dimensi,


yang berarti linier, contohnya deret sekuensial. Tipe elemen dari sebuah
deret dapat menyerupai suatu tipe, termasuk suatu tipe deret. Suatu deret
dari deret disebut suatu deret multidimensional. Suatu deret berdimensi
satu dari deret berdimensi satu disebut suatu deret berdimensi dua; suatu
deret berdimensi satu dari deret berdimensi dua disebut suatu deret
berdimensi tiga, dan seterusnya.
Cara yang paling sederhana untuk mendeklarasikan suatu deret
multidimensional adalah seperti berikut.

double a[32][10][4];

yang merupakan suatu deret berdimensi tiga dengan dimensi 32, 10 dan
4.

Pernyataan
a[25][8][3] = 99.99;
akan menunjuk nilai 99.99 ke elemen yang diidentifikasi oleh indeks
(25,8,3).

Perhatikan contoh berikut.


100

#include<iostream.h>

void baca (int a[][5]);

void print (const int a[][5]);

main ()
{
int a[3][5];
baca (a);
print (a);
}

void baca (int a[][5])


{
cout << “Masukkan 15 bilangan integer, 5 bilangan per
baris :\n”;
for (int i = 0; i < 3; i++) {
cout << “Baris “ << i << “ : “;
for (int j = 0; j < 5; j++)
cin >> a[i][j];
}
}

void print (const int a[][5])


{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++)
cout << “ “ << a[i][j];
cout << endl;
}
}

Keluarannya adalah

Masukkan 15 bilangan integer, 5 bilangan per baris :


Baris 0 : 11 22 33 44 55
Baris 1 : 10 20 30 40 50
101

Baris 2 : 15 25 35 45 55
11 22 33 44 55
10 20 30 40 50
15 25 35 45 55

Contoh berikut adalah membaca dan mencetak deret berdimensi dua.

#include<iostream.h>
const jmlmhs = 3;
const jmlkuis = 5;
typedef int Nilai [jmlmhs] [jmlkuis];
void baca (Nilai);
void printratakuis (const Nilai);
void printratakelas (const Nilai);

main ()
{
Nilai nilai;
cout << “Masukkan nilai “ << jmlkuis << “ kuis untuk setiap
mahasiswa :\n”;
baca (nilai);
cout << “Rata-rata kuis adalah :\n”;
printratakuis (nilai);
cout << “Rata-rata kelas adalah :\n”;
printratakelas (nilai);
}

void baca (Nilai nilai)


{
for (int s = 0; s < jmlmhs; s++) {
cout << “Mahasiswa ke “ << s+1 << “ : “;
for (int q =0; q < jmlkuis; q++)
cin >> nilai [s] [q];
}
}
102

void printratakuis (const Nilai nilai)


{
for (int s = 0; s < jmlmhs; s++) {
float sum = 0.0;
for (int q = 0; q < jmlkuis; q++)
sum += nilai [s] [q];
cout << “\tMahasiswa ke “ << s+1 << “ : “ <<
sum/jmlkuis << endl;
}
}

void printratakelas (const Nilai nilai)


{
for (int q =0, q < jmlkuis; q++) {
float sum = 0.0;
for (int s = 0; s < jmlmhs; s++)
sum += nilai [s] [q];
cout << “\tKuis ke “ << q+1 << “ : “ << sum/jmlmhs <<
endl;
}
}

Keluarannya adalah
Masukkan nilai 5 kuis untuk setiap mahasiswa :
Mahasiswa ke 1 : 8 7 9 8 9
Mahasiswa ke 2 : 9 9 9 9 8
Mahasiswa ke 3 : 5 6 7 8 9
Rata-rata kuis adalah :
Mahasiswa ke 1 : 8.2
Mahasiswa ke 2 : 8.8
Mahasiswa ke 3 : 7
Rata-rata kelas adalah :
Kuis ke 1 : 7.33333
Kuis ke 2 : 7.33333
Kuis ke 3 : 8.33333
Kuis ke 4 : 8.33333
Kuis ke 5 : 8.66667

Contoh berikut adalah program untuk menghitung banyaknya angka 0


dalam deret berdimensi tiga.
103

#include<iostream.h>
int jmlnol (int a[] [4] [3], int n1, int n2, int n3);
main()
{
int a[2] [4] [3] = { { {5, 0, 2}, {0, 0, 9}, {4, 1, 0}, {7, 7, 7}},
{ {3, 0, 0}, {8, 5, 0}, {0, 0, 0}, {2, 0, 9} } };
cout << “Deret ini mempunyai angka nol sebanyak : “
<< jmlnol (a, 2, 4, 3) << “ buah.\n”;
}

int jmlnol (int a[] [4] [3], int n1, int n2, int n3)
{
int hitung = 0;
for (int i = 0; i < n1; i++)
for (int j = 0; j < n2; j++)
for (int k = 0; k < n3; k++)
if (a[i] [j] [k] == 0) ++hitung;
return hitung;
}

Keluarannya adalah

Deret ini mempunyai angka nol sebanyak : 11 buah.


104

DAFTAR PUSTAKA

1. Zamir, Saba, C++ Primer for Non C Programmers, Mc. Graw Hill, 1995.
2. Shammas, Namir C., C/C++ Mathematical Algorithms for Scientists and
Engineers, Mc. Graw Hill, 1996.
3. Hubbard, John, Programming with C++, Schaum’s Outlines Series, Mc. Graw
Hill, 1996.
4. Savitch, Walter, Problem Solving with C++ - The Object of Programming,
Addison Wesley, Fourth Ed., 2003.
5. Perry, Greg & Marcus, Johnson, Turbo C++ By Example – The Easiest Way to
Learn How to Program!, QUE, 1992.
6. Perry, Paul J., Do-it-Yourself Turbo C++ - The Simplest Way to Program with
Turbo C/C++!, SAMS Publishing, 1992.
105

Kode Mata Kuliah :


Mata Kuliah : Pemrograman C++ (C++ Programming)
SKS :2
Semester : Matrikulasi

Syllabus :

Introduction, data types, identifiers and keywords, operators, control structures,


functions, arrays, pointers, structures.

References :

1. Zamir, Saba, C++ Primer for Non C Programmers, Mc. Graw Hill, 1995.
2. Shammas, Namir C., C/C++ Mathematical Algorithms for Scientists and
Engineers, Mc. Graw Hill, 1996.
3. Hubbard, John, Programming with C++, Schaum’s Outlines Series, Mc. Graw
Hill, 1996.
106

Kode Mata Kuliah : EL-6E0


Mata Kuliah : Advanced Programming
SKS :2
Semester :I

Syllabus :

Basic concepts, classes and objects, constructors and destructors, overloading


operators, derived class, composition, inheritance, polymorphism, templates,
iterators.

References :

1. Kafura, Dennis, Object Oriented Software Design and Construction with C++,
Prentice Hall, 1998.
2. Coad, P. & Nicola, J., Object Oriented Programming, Prentice Hall, 1993
3. Zamir, Saba, C++ Primer for Non C Programmers, Mc. Graw Hill, 1995.
107

Kode Mata Kuliah :


Mata Kuliah : Data Structures and Algorithms
SKS :2
Semester : Matrikulasi

Syllabus :

Introduction, dynamic arrays, single-linked lists, multidimensional arrays, data


types, stacks, queues, ordered lists, sorted lists, hashing, hash table, trees, search
trees.

References :

1. Preiss, Bruno R., Data Structures and Algorithms with Object Oriented Design
Patterns in C++, John Wiley & Sons, Inc., 1999.
2. Heileman, Gregory L., Data Structures, Algorithms, and Object Oriented
Programming, Mc. Graw Hill, 1996.

Anda mungkin juga menyukai