Jumat, 18 Maret 2011

PEMROGRAMAN C++

PEMROGRAMAN C++

Pemrograman C++ di dalam sistem operasi Linux menggunakan software g++ %GNU C++%. Kompiler ini dapat secara otomatis terinstall pada saat menginstall sistem operasi, dengan catatan kita memilih opsi untuk menginstall g++.

Kompilasi menggunakan g++ dilakukan di dalam console Linux. Dengan teelebih dahulu menyimpan file source C++ ke dalam file berekstension .cpp, .cp, cxx, c++, cp, atau cc. Lalu tempatkan dalam folder home/.  Ketikkan perintah

            g++ -o

path file tidak diperlukan apabila terlebih dahulu kita masuk ke dalam folder tempat file source disimpan. File output bisa tidak diberikan, namun secara default g++ akan membuat file output bernama a.out.

Setelah kompilasi dilakukan, cek apakah kompilasi sudah berhasil dengan melihat pesan hasil kompilasi. Jika terdapat pesan error maka file output belum terbentuk. Kita perlu melakukan editing source kemudian compile lagi. Cara lain untuk mengetahui apakah kompilasi berhasil dengan memasuki folder tempat file source di simpan, dan ketikkan perintah

            ls

Apabila telah muncul file output yang kita definisikan atau file a.out maka kompilasi berhasil. Sebaliknya jika file belum muncul maka kompilasi belum berhasil. Eksekusi file output dengan mengetikkan perintah

            ./

Perintah ini membuat kita dapat melihat hasil program yang sudah dibuat.

Bentuk umum file source C++ adalah sebagai berikut :

#include
#include
#define jumlah 50

void tampilan(float c);
float penjumlahan(float a);

int main()
{
     float b;
     cout << “Masukkan nilai = “ << endl;
     cin >> b;
     tampilan(b);
     b = penjumlahan(b);
     cout << “nilai b = “ << b;
    
     return 0;
}

void tampilan(float c)
{
     cout << “nilai c = “ << c << endl;
}

float penjumlahan(float a)
{
     return(a+5);
}

Berikut penjelasan bagian-bagian dari program.

#include
#include
#define jumlah 50

Baris tersebut merupakan preprocessor program. Berisi perintah include dan define. Include digunakan untuk menyisipkan file library atau program C++. Sedangkan define digunakan untuk mendefinisikan nilai konstanta. File include biasanya berisi header-header fungsi yang digunakan pada source. Misalnya pada contoh di atas menggunakan fungsi cout dan cin untuk menampilkan keluaran ke monitor dan menerima masukan dari keyboard. Kedua fungsi tersebut termuat dalam file include iostream.h. Oleh karena itu apabila tidak disertakan include iostream.h dalam source di atas, maka fungsi cout dan cin akan menimbulkan error.

Fungsi include dalam g++ tersimpan di dalam folder /usr/include atau /usr/include/c++/. Untuk file include di /usr/include merupakan file include bersama. Disebut bersama karena sebenarnya file-file tersebut biasa digunakan oleh bahasa C, namun C++ juga bisa memakainya. Tetapi tidak semua file include C bisa dipakai oleh C++. Seperti string.h, bisa dipakai C maupun C++.

Sebuah trik dalam pemrograman C++, semisal kita menggunakan suatu fungsi yang kita tidak mengetahui headernya dimuat di file include apa. Kita bisa menelusurinya satu per satu. Contohnya kita akan menggunakan fungsi sqrt, untuk menghitung akar kuadrat dari suatu bilangan. Fungsi sqrt tidak bisa digunakan begitu saja. Kita harus memuat file header yang mendefinisikan fungsi sqrt. Fungsi sqrt terdapa di file include antara math.h dan tgmath.h. Jika bingung akan memilih yang mana, coba cek satu per satu. dalam file math.h cari kata #define sqrt, jika tidak ditemukan cari di file tgmath.h. Ternyata fungsi sqrt dijumpai di file tgmath.h. Jadi, untuk menggunakan fungsi sqrt di dalam source kita harus menginclude file tgmath.h. Berikut cuplikan fungsi sqr di file tgmath.h
/* Return the square root of X.  */
#define sqrt(Val) __TGMATH_UNARY_REAL_IMAG (Val, sqrt, csqrt)

File yang diinclude akan disisipkan pada awal program yang kita buat.

Baris define akan mendefinisikan suatu konsanta bernama jumlah dengan nilai 10. Karena berupa konstanta, maka nilai jumlah tidak pernah bisa diubah. Variabel konstanta jumlah tidak memiliki tipe data, sehingga pemakaiannya terbatas.

Baris berikutnya adalah

void tampilan(float c);
float penjumlahan(float a);

merupakan prototipe fungsi. Pemrograman C++ memperbolehkan kita membuat suatu fungsi dimana pemakaian fungsi bermanfaat untuk lebih menyederhanakan atau menstrukturkan penulisan program. Misalkan dalam sebuah algoritma memuat proses pengurutan data, pencarian nilai tertinggi, dan pencarian modus data, tentu masing-masing proses tersebut akan lebih mudah diimplementasikan dalam program jika dikelompok-kelompokkan menjadi suatu fungsi tersendiri.

Fungsi berisi sub program. Dengan kata lain, fungsi adalah penyusun program secara keseluruhan. Ada dua ciri dalam menggunakan fungsi di dalam program yang kita buat. Pertama, fungsi selalu didahului dengan prototipe-nya. Dan yang kedua, fungsi didefinisikan sub programnya.

Dari contoh di atas terlihat bahwa fungsi selalu mempunyai tipe data, yaitu void dan non void(integer, float, char, dsb). Ada perbedaan dari fungsi bertipe void dan non void. Fungsi bertipe void tidak mengembalikan nilai, sedangkan fungsi bertipe non void akan mengembalikan suatu nilai sesuai dengan tipe datanya.

Baris selanjutnya dimulai dengan
            int main()

dan diakhiri dengan tanda kurawal tutup }. Yaitu fungsi main yang mengembalikan nilai integer. Setiap program C++ harus memiliki fungsi ini. Karena ketika compiler C++ melakukan kompilasi program, kursor kompilasi diletakkan mulai dari baris ini. Kemudian kursor bergerak dari kiri ke kanan dan dari atas ke bawah. Kursor kompilasi dapat melompat ketika menemukan baris yang memaksa dia untuk berpindah arah. Seperti pada baris

tampilan(b);
b = penjumlahan(b);

kursor kompilasi akan berpindah menuju ke sub program fungsi tampilan dan fungsi penjumlahan.

Pada baris akhir terdapat definisi sub program untuk masing-masing fungsi

void tampilan(float c)
{
     cout << “nilai c = “ << c << endl;
}

float penjumlahan(float a)
{
     return(a+5);
}

Perhatikan tipe data, nama, dan parameter fungsi, semuanya sama seperti pada prototipe fungsinya. Karena berupa sub program maka fungsi diawali dengan tanda kurawal buka { dan diakhiri dengan kurawal tutup }. Pembahasan lebih lanjut mengenai fungsi pada bab Function.











TIPE DATA DAN VARIABEL

Di dalam memprogram kita sering melakukan penyimpanan nilai. Kemudian nilai itu kita kalikan, kita jumlah, dlsb. Nilai tersebut harus disimpan di dalam memori komputer agar bisa dioperasikan. Sebelum suatu nilai disimpan ke dalam memori, terlebih dahulu dilakukan pengalokasian memori. Cara ini disebut dengan deklarasi variabel.

Semisal kita membutuhkan sebuah memori untuk menyimpan nilai. Maka pertama kita kapling memori tersebut dan memberinya nama. Hal itu saja tidak cukup, kita juga perlu mendefinisikan tipe data yang bisa masuk ke dalam memori tersebut.
Tipe data dalam C++ ada bermacam-macam, antara lain :

Tipe Data
Jumlah Bit
Jangkauan
Keterangan
char
8
-128 s/d 127
karakter
int
16
-32768 s/d 32767
integer
float
32
3.4E-38 s/d 3.4E+38
real
double
64
1.7E-308 s/d 1.7E+308
real presisi ganda
void
0
-
tak bertipe

Sehingga untuk menyimpan suatu nilai, diperlukan deklarasi variabel sbb :

[= ekspresi]

Contoh : float nilai = 10;, baris ini berarti : alokasikan sebuah memori bertipe float dengan alamat/nama nilai dan bernilai 10. Pengisian nilai bersama dengan deklarasi variabel diperbolehkan . Nama variabel bebas, jika nama lebih dari satu kata jangan dipisahkan dengan tanda spasi.

Ekspresi merupakan statement yang berisi operasi matematika atau operasi logika. Semisal ada statement  seperti ini : x = 5 + 6. Statement tersebut merupakan ekspresi. Contoh lain : x = y | z. Statement ini juga merupakan ekspresi dengan operasi logika.

Variabel didefinisikan sebelum digunakan. Pendefinisiannya boleh di mana saja (di dalam program utama, di dalam perulangan, di dalam statement control statement). Biasanya kita akan meletakkan deklarasi variabel secara mengelompok dan tepat di awal program utama. Hal ini hanya untuk memudahkan pengecekan apakah suatu variabel sudah didefinisikan atau belum. Berikut contoh pendefinisian variabel.

#include

int main()
{
     int y;
     float x = 12.3;
     char huruf;

     y = 5;
     huruf = 'Y';

     cout << “Nilai Y = “ << y << endl;
     cout << “Nilai X = “ << x << endl;
     cout << “Huruf = “ << huruf << endl;

     return 0;
}

Nama variabel adalah case sensitive. Artinya ketika kita memberikan nama sebuah variabel dengan Jumlah  tidak akan sama dengan variabel bernama jumlah, JUMLAH, atau JumLah.
Setelah variabel dideklarasikan dan diisi nilainya, selanjutnya variabel dapat dioperasikan. Operasi di dalam C++ ada beberapa macam, antara lain :

Simbol
Arti
*
Perkalian
/
Pembagian
%
Sisa pembagian (MOD)
+
Penjumlahan
-
Pengurangan
++
Penjumlahan dengan 1
--
Pengurangan dengan 1

Pemakaian operasi di atas berbentuk seperti berikut :

variabel_penampung = variabel_operan1 variabel_operan2;

Contoh pemakaiannya : x = x + 10;
Operasi lainnya yang juga berlaku untuk vaiabel dalam C++ adalah operasi bit . Berikut simbol-simbol operasi logika :

Simbol
Arti
>> 
geser bit ke kanan
<< 
geser bit ke kiri
^
XOR
~
NOT
|
OR
&
AND

Pengunaannya sama seperti operasi aritmetika di atas, memakai dua operan dan satu variabel penampung kecuali untuk operasi ~(NOT). Operasi logika adalah operasi yang berlaku pada bit nilai variabel. Seperti misalnya kita melakukan operasi

int x = 10;
x = x << 1;

Hasil dari x digeser bitnya ke kiri satu bit menjadi x = 20. Penjelasannya sbb :
x = 10              -> 0000 0000 0000 1010
digeser ke kiri 1 bit menjadi
x = 20              -> 0000 0000 0001 0100
Contoh lain

int x = 10;
x = x &(~x);

Hasilnya nilai x = -1. Penjelasannya sbb :
x = 10              -> 0000 0000 0000 1010
dan ~x             -> 1111 1111 1111 0101
Kemudian dikenakan operasi AND, maka hasilnya menjadi
x = 0                -> 0000 0000 0000 0000

Operator Kombinasi

C++ memperbolehkan operator kombinasi untuk memperpendek penulisan suatu ekspresi. Sebagai contoh

x = x + 2;
y = y * 3;

dapat dikombinasikan menjadi

x += 2;
y *= 3;

Kombinasi yang lain adalah

Ekspresi
Kependekan dari
x += 2
x = x + 2
x -= 2
x = x - 2
x *= 2
x = x * 2
x /= 2
x = x / 2
x %= 2
x = x % 2
x << 2
x = x << 2
x >> 2
x = x >> 2
x &= 2
x = x & 2
x |= 2
x = x | 2
x ^= 2
x = x ^ 2

Konversi Tipe Data

Suatu ekspresi bisa mengandung lebih dari dua operan. Jika masing-masing operan berbeda tipe maka C++ akan melakukan konversi tipe data agar semuanya sama, baru dioperasikan. Ada dua kunci dalam konversi ini. Pertama, apabila ada dua atau lebih operan tetapi masih dalam jenis yang sama (misalnya : tipe int, char, longint masih satu jenis tipe yaitu tipe integer. Atau tipe float, double masih dalam satu jenis tipe yaitu tipe real) maka konversi dilakukan otomatis oleh C++.

Jika ada salah satu operan bertipe longint, maka semua operan diubah ke longint. Atau jika salah satu operan bertipe double, maka semua operan diubah ke tipe data double. Ciri konversi ini adalah, tipe data yang digunakan adalah tipe data yang memiliki bit paling luas dari salah satu tipe data yang dipakai operan.

Cara kedua menggunakan variabel cast. Ini digunakan apabila ada dua operan yang memiliki jenis yang berbeda, misalnya float dengan int. Cara menggunakannya sbb :

int x;
float y, jumlah;
jumlah = y * (float) x;

Atau :

int x, y;
float jumlah;
jumlah = (float) (x * y);

(float) akan memaksa variabel yang mengikutinya dikonversi ke tipe data yang didefinisikan.

Definisi Konstanta

Seperti yang sudah dijelaskan sebelumnya, cara mendefinisikan konsanta dapat dengan fungsi define di preprocessor. Namun ada cara mendefinisikan konsanta yang lebih baik. Yaitu dengan fungsi const. Contoh deklarasinya

#include

int main()
{
     const int nilai = 90;
     const float jumlah = 80.6;
}

Kenapa membuat konsanta lebih baik menggunakan const? Karena tipe data variabel konsanta jelas. Sehingga operasi terhadap variabel konstanta jelas pula. Jika konstanta bertipe char, maka variabel konstanta dapat diberlakukan fungsi-fungsi pengolah karakter.

Typedef

Suatu kali kita mengulang dalam menuliskan tipe data yang cukup panjang, misalnya : unsigned short int. Kesalahan penulisan bisa saja terjadi. Untuk memperpendek nama tipe data, C++ menyediakan fasilitas fungsi typedef untuk menggantikan nama tipe data yang panjang. Caranya sbb :

#include
typedef unsigned short int tipe;

int main()
{
     tipe nilai, jumlah;
     nilai = 90;
     jumlah = 80;
     return 0;
}

Program contoh di atas sama saja apabila kita menggantikan tipe data bernama 'tipe' dengan unsigned short int.

Enumerasi     

Enumerasi adalah mendefinisikan beberapa konsanta sekaligus. Fungsi untuk mendefinisikan konstanta enumerasi menggunakan enum. Sebagai contoh perhatikan program berikut
#include

int main()
{
     enum warna{hijau, merah, biru, cokelat, putih, hitam};
     cout << hijau << endl;
     cout << merah << endl;
     return 0;
}

Cara mendefinisikan konstanta enumerasi dapat ditempuh dengan cara seperti contoh. Fungsi enum diikuti dengan nama konstanta dan nilai-nilai enumerasi dimasukkan dalam tanda kurawal.

Hasilnya adalah hijau untuk konstanta bernilai 0, merah = 1, biru = 2, dst. Namun apabila kita ingin nilai-nilai tersebut kita definisikan sendiri, maka penulisannya menjadi

#include

int main()
{
     enum warna{hijau =100, merah, biru=500, cokelat, putih,         hitam};
     cout << hijau << endl;
     cout << merah << endl;
     cout << cokelat << endl;
     return 0;
}

Hasilnya hijau bernilai = 100, merah = 101, dan cokelat = 501.



































BASIC INPUT OUTPUT

Input output g++ menggunakan basis console. Seperti yang telah kita bahas sebelumnya, input output ditangani oleh file include iostream.h. Dari fungsi-fungsi input output kita bisa menampilkan keluaran di layar monitor dan menerima masukan dari keyboard.

Cout

Cout untuk menampilkan keluaran di monitor memiliki bentuk bebas dan tidak standar. Tetapi fungsi ini selalu diikuti dengan tanda kurang dari dobel (<<). Berikut cara penggunaan cout :

cout << [string|variabel|special character] << [string|variabel|special character] << dst...

Contohnya sbb :

int f = 10;
cout << “Nilai f “ << f << "\tnilai F lagi = " << f << endl;

Parameter cout bisa lebih dari satu seperti terlihat pada contoh di atas. Isi parameter cout juga bervariasi, bisa berupa string, variabel, ataupun special character. “Nilai f “ adalah parameter berupa string, yang akan ditampilkan apa adanya ke dalam monitor. f adalah variabel bertipe integer, yang akan ditampilkan isi dari variabel tersebut. Sedangkan \f merupakan special character yang berarti menambahkan tab horizontal.

Special character yang didukung oleh C++ antara lain :

Karakter
Fungsi
\n
baris baru
\t
tab horizontal
\v
tab vertical
\f
jarak form
\a
bunyi alarm
\”
mencetak double quote
\\
mencetak back slash
\(digit oktal)
mencetak bilangan oktal
\x(digit hexadecimal
mencetak bilangan hexadecimal
Special character \n sama dengan fungsi endl.

Cin

Berfungsi untuk menangkap masukan dari keyboard. Masukan yang akan ditangkap adalah semua karakter yang ditekan dalam keyboard sebelum tanda enter ditekan. Sebagai contoh

#include

int main()
{
     int b;
     cout << “Masukkan nilai b = “;
     cin >> b;
     return 0;
}

Pada program di atas kursor eksekusi akan berhenti sejenak saat mengeksekusi baris cin. Menunggu tombol enter ditekan. Ketika tombol enter ditekan seluruh/sebagian karakter yang ditekan sebelum tombol enter akan dimasukkan ke dalam variabel b.

Karakter yang dimasukkan bisa berupa angka (bulat/pecahan), huruf dan karakter. Cin akan menyimpan masukan ke dalam variabel, oleh karena itu masukannya juga tidak boleh sembarangan. Masukan harus sesuai dengan tipe data variabel yang menampung.

Output File

Kita juga bisa menyimpan output program ke dalam file. Fungsi ini menggunakan dua file include, yaitu : stdio.h dan stdlib.h. Ada dua tipe output yang biasa kita temui. Pertama output berupa angka dan output berupa string.

Khusus output berupa angka (pecahan/bulat), kita perlu melakukan konversi supaya menjadi string. Konversi ini menggunakan fungsi dari stdlib.h bernama gcvt, fcvt, atau ecvt. Ketiga fungsi tersebut mempunyai empat parameter kecuali gcvt. Parameter pertama adalah variabel yang menyimpan angka. Yang kedua adalah jumlah digit pembulatan. Parameter ketiga merupakan variabel yang menyimpan (berupa array bertipe char) nilai angka tersebut setelah dikonversi ke dalam string.

Berikut deklarasi gcvt, fcvt, dan ecvt dalam stdlib.h

extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) __THROW;
extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt, int *__restrict __sign) __THROW;
extern char *gcvt (double __value, int __ndigit, char *__buf) __THROW;

Setelah nilai angka dikonversi menjadi string, kemudian disimpan ke dalam file menggunakan fungsi fputs dari stdio.h. Berikut deklarasi dari fputs dalam file stdio.h

extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);

Dari deklarasi kita bisa mengetahui bahwa fungsi fputs memiliki dua parameter masukan. Masukan pertama adalah variabel penyimpan string yang akan dituliskan ke dalam file. Dan yang kedua adalah pointer yang menunjuk ke file penyimpan.

File tempat menyimpan string terlebih dahulu didefinisikan terlebih dahulu dengan fungsi fopen dari stdio.h. Berikut deklarasi fungsi fopen

extern FILE *fopen (__const char *__restrict __filename,
               __const char *__restrict __modes);

Dari deklarasi fungsinya dapat diketahui bahwa fopen memiliki dua parameter masukan. Pertama adalah path file akan disimpan. Dan yang kedua adalah metode yang dipakai. Metode yang digunakan sbb :
    r      : file hanya bisa dibaca
    w     : file baru selalu menulis. Sehingga jika sudah ada file bernama yang sama, maka      file tersebut akan ditimpa isinya.
    a      : file akan diisi data pada akhir baris, jika file sudah ada isinya.
Setelah selesai menyimpan ke dalam file, maka file harus ditutup supaya file dapat diakses oleh aplikasi lainnya. Penutupan file ini dengan fungsi fclose yang masih dalam satu file include dengan fopen. Parameter fclose hanya ada satu, yaitu pointer yang menunjuk ke file.

Contoh penyimpanan output pada file sbb :


char str[25];
int sig = 5;
pf = fopen("output/bobot_w.h","w");
for (k=0; k
{
     for (j=0; j
     {
           gcvt(bobot_w[j][k], sig, str);
           fputs(str, pf);
           fputs("\n",pf);
     }
}
fclose(pf);

Cuplikan program di atas menggambarkan penyimpanan suatu nilai berupa angka yang disimpan dalam variabel bobot_w ke dalam file yang terletak di folder output dan file bobot_w.h.























CONTROL STATEMENT

Control statement dapat menjadikan program menjadi fleksibel. Karena dengan control statement kita bisa mendefinisikan baris program yang akan dieksekusi apabila suatu kondisi terpenuhi, dan tidak dieksekusi apabila kondisi tidak terpenuhi. Dalam C++ control statement ada dua jenis. Pertama, memakai if...else dan yang kedua memakai switch case.

If ... Else

Bentuk umum dari statement if adalah

if (kondisi)
{
     statement1;
     statement2;
     ....
     statementN;    
}

atau :

if (kondisi)
{
     statement1;
     statement2;
     ....
     statementN;    
}

else if (kondisi)
{
     statement1;
     statement2;
     ....
     statementN;    
}

........

else
{
     statement1;
     statement2;
     ....
     statementN;    
}

Tingkatan if...else disesuaikan dengan kebutuhan.
Kondisi yang harus dipenuhi dapat berbentuk ekspresi dengan operator logika dan operator relasi.

Operator logika yang bisa digunakan antara lain :

Simbol
Arti
&&
AND
||
OR

NOT

Sedangkan operator relasi antara lain :

Simbol
Arti
==
sama dengan
>=
lebih dari sama dengan
lebih dari
<=
kurang dari sama dengan
kurang dari
=
tidak sama dengan

Contoh program

#include

int main()
{
     int b;
     float jumlah = 0;
     cout << “Masukkan nilai b = “;
     cin >> b;

     if (b > 10)
           jumlah = jumlah + b;
     else
           jumlah = jumlah – b;

     return 0;      
}

contoh di atas apabila variabel diberi nilai lebih dari 10 maka statement jumlah = jumlah + b akan dijalankan. Namun apabila nilai yang dimasukkan sama dengan 10 atau kurang dari 10, maka statement else dijalankan. Karena statement hanya satu baris maka tanda kurawal bisa dihilangkan.

Kursor kompilasi akan menjalankan statement jumlah = jumlah + b apabila kondisi pertama true, kemudian kebenaran dari else tidak dicek karena kondisi pertama sudah true. Namun jika kondisi pertama tidak true baru else dicek.

Dalam mendesain control statement sebaiknya kita menggunakan garis bilangan supaya mudah untuk mengetahui wilayah true masing-masing kondisi. Semisal kita memiliki control statement dengan kondisi sbb :

if (b >= 20)
else if (b < 20) AND (b >= 10)
else if (b <= 5) AND (b >= 0)
else

contoh di atas memiliki 4 kondisi dengan garis bilangan masing-masing

                                                                                                            kondisi 1
                                                20

                                                                                                            kondisi 2
                                10                   20


 

                                                                                                            kondisi 3
                                  0              5








 

                                                                                                            kondisi 4
                                 0                    5                  10






 

Pengecekan 4 kondisi di atas terjadi pertama kali di kondisi 1. Apabila kondisi 1 sudah true maka kondisi-kondisi berikutnya tidak dicek oleh kursor kompilasi. Namun jika kondisi pertama tidak true, maka kondisi kedua dicek. Kondisi kedua sudah true maka kondisi lainnya di bawah kondisi dua tidak dicek. Begitu seterusnya hingga kondisi keempat. Pengecekan seperti ini terjadi karena control statement di atas masih dalam satu blok.
Pentingnya menggambarkan garis bilangan juga kita jumpai pada kasus tertentu seperti contoh berikut :

if (b >= 20)
else if (b < 20) AND (b >= 25)

Garis bilangannya sbb :

                                                                                                            kondisi 1
                                               20
                                                                                                            kondisi 2
                                20           25
 

Terdapat ketimpangan daerah true antara kondisi 1 dan 2. Ketimpangan terjadi pada b >= 25. Kondisi 1 dan 2 memenuhi nilai tersebut. Namun karena kedua kondisi masih dalam satu blok control statement maka kondisi 1 saja yang akan dijalankan statementnya karena kondisi satu lebih dahulu dijumpai oleh kursor kompilasi.

Blok kondisi dimulai dengan kata if dan diakhiri dengan kata else atau adanya blok kondisi baru. Misalnya

if (kondisi)
if (kondisi)
else if (kondisi)
else if (kondisi) AND (kondisi)
else
if (kondisi)
else if (kondisi)

Pada contoh di atas terdapat tiga blok control statement. blok 1 adalah baris pertama, blok 2 adalah baris 2-5, dan blok 3 adalah baris 6-7. Blok kondisi berbeda dengan control statement bersarang. Masing-masing blok memiliki kedudukan sejajar. Berikut contoh control statement bersarang

if (kondisi)
{
     statement;
     ....

     if (kondisi)
           statement;
     else if (kondisi)
           statement;
     else if (kondisi) AND (kondisi)
     {
           if (kondisi)
                statement;
           else if (kondisi)
                statement;
           else
                statement;
     }         
     else
           statement;
}

Contoh di atas memiliki blok control statement yang berbeda. Namun ketiga blok control statement tersebut tidak sama tingkatannya. Blok ketiga merupakan bagian dari blok kedua, dan blok kedua merupakan bagian dari blok pertama. 

Contoh lain :

#include

int main()
{
     int input;
     cout << "Masukkan hari ke- = ";
     cin >> input;
    
     if (input == 1)
     {
           cout << "Anda memasukkan hari minggu";
     }
     else if (input == 2)
     {
           cout << "Anda memasukkan hari senin";
     }
     else if (input == 3)
     {
           cout << "Anda memasukkan hari selasa";
     }
     else if (input == 4)
     {
           cout << "Anda memasukkan hari rabu";
     }
     else if (input == 5)
     {
           cout << "Anda memasukkan hari kamis";
     }
     else if (input == 6)
     {
           cout << "Anda memasukkan hari jumat";
     }
     else if (input == 7)
     {
           cout << "Anda memasukkan hari sabtu";
     }
     else
     {
           cout << "Bukan input hari/salah masukan";
     }
     return 0;
}

Contoh ini akan kita bandingkan dengan control statement menggunakan switch ... case.

Switch ... Case

Control statemen menggunakan switch ... case hanya pada kondisi yang memakai operasi relasi sama dengan. Pada contoh terakhir control statement menggunakan if else, semua kondisi menggunakan operasi relasi sama dengan. Oleh karenanya untuk menyederhanakan penulisan, bisa digunakan switch ... case seperti pada contoh

#include

int main()
{
     int input;
     cout << "masukkan hari ke- ";
     cin >> input;
    
     switch(input)
     {
           case 1 : cout << "minggu";
           break;
           case 2 : cout << "senin";
           break;
           case 3 : cout << "selasa";
           break;
           case 4 : cout << "rabu";
           break;
           case 5 : cout << "kamis";
           break;
           case 6 : cout << "jumat";
           break;
           case 7 : cout << "sabtu";
           break;
           default : cout << "bukan input hari/salah masukan";
           break;
     }
     return 0;
}

switch case menyederhanakan penulisan berulang-ulang if else dan kondisi-kondisinya. Kesalahan ketik dapat diminimilasir. Selain itu pengecekan kondisi lebih mudah menggunakan switch case. Ada fungsi tambahan yaitu break. gunanya untuk keluar dari switch jika salah satu kondisi telah terpenuhi. Dengan adanya break, apabila salah satu case sudah ada yang terpenuhi maka case lain di bawahnya tidak dicek. Oleh karenanya dengan adanya break kita bisa membedakan apakah kondisi tersebut masih dalam satu blok atau tidak.

Default merupakan pengganti dari else pada contoh sebelumnya. Jika semua kondisi tidak terpenuhi maka default akan dijalankan. Pada contoh yang berbeda


#include

int main()
{
     int input;
     cout << "masukkan hari ke- ";
     cin >> input;
    
     switch(input)
     {
           case 1 : cout << "minggu";
           case 2 : cout << "senin";
           case 3 : cout << "selasa";
           case 4 : cout << "rabu";
           case 5 : cout << "kamis";
           case 6 : cout << "jumat";
           case 7 : cout << "sabtu";
           default : cout << "bukan input hari/salah masukan";
     }
     return 0;
}
Break pada tiap-tiap pernyataan dihilangkan, maka pengecekan kondisi input pasti tidak kurang dari 8 kali. Jika salah satu kondisi telah terpenuhi maka kondisi di bawahnya juga ikut true. Sebagai contoh semisal input bernilai 4, maka akan tampil di layar monitor hari rabu, kamis, jumat, sabtu, bukan input/salah masukan. Hal ini disebabkan kondisi di bawah case 4 ikut true.



































PERULANGAN

Ada 4 bentuk perulangan dalam C++, antara lain :
1.    goto
2.    while
3.    do ... while
4.    for
Keempat perulangan memiliki fungsi secara umum sama, namun ada fungsi spesifik yang membedakan keempat perulangan. Oleh karena itu tiap kasus perulangan tidak dapat memakai satu jenis bentuk perulangan saja. Misalnya perulangan for digunakan untuk kasus perulangan yang sudah diketahui jumlah perulangan yang akan dilakukan. Perulangan menggunakan while digunakan untuk perulangan yang tak tentu jumlah perulangannya. Contohnya :

#include

int main()
{
     char input = 'Y';
    
     while ((input != 'T') && (input == 'Y'))
     {
           cout << "Diulang lagi...";
           cout << "Anda mau mengulang?(Y/T)";
           cin >> input;
     }
     return 0;
}

Perulangan yang digunakan adalah while karena jumlah perulangan tidak diketahui. Program di atas tidak bisa digantikan misalnya dengan perulangan for.

Goto

Berikut contoh perulangan menggunakan goto.

#include
int main()
{
     int hitung = 0;
label : hitung++;
     if (hitung <= 10)
           goto label;
           cout << "hitung = " << hitung << endl;
     cout << "hitung selesai";
     return 0;
}   

Keluaran dari program di atas adalah hitung = 11. Perintah goto diikuti dengan label, dimana label tersebut merupakan penunjuk baris yang akan diulang. Jalannya program di atas pertama, hitung berisi nilai 0. Kemudian hitung ditambah satu menjadi 1. Nilai hitung dicek pada kondisi if. Apabila hitung <= 10 maka statemen if dijalankan. Yaitu kursor kompilasi melompat ke baris yang diberi label. Begitu seterusnya hingga kondisi if tidak dipenuhi. Sehingga kursor kompilasi tidak lagi melompat namun meneruskan baris program selanjutnya. Yaitu menampilkan nilai hitung.

Perulangan menggunakan goto kurang terstruktur. Bisa Anda bayangkan jika terdapat banyak label di source yang Anda buat. Lalu banyak pula perintah goto yang menuju ke label-label tersebut dan saling melompati. Hasilnya program akan susah untuk dibaca. Kalau program susah dibaca, tentu mencari kesalahan program juga sulit dilakukan. Karenanya perulangan ini jarang digunakan.

While

Perhatikan program berikut :

#include

int main()
{
     int iterasi = 0;
    
     while (iterasi < 10)
     {
           cout << "Iterasi ke-" << iterasi << endl;
           iterasi++;
     }
     return 0;
}

Keluaran program sbb :

Iterasi ke-0
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
Iterasi ke-6
Iterasi ke-7
Iterasi ke-8
Iterasi ke-9

Dalam menggunakan perulangan bentuk while kita memerlukan 2 hal. Pertama, perulangan memerlukan kondisi untuk memberhentikan proses iterasi. Kedua, perulangan
membutuhkan ekspresi untuk menambah atau mengurangi variabel kondisi. Syarat pertama terlihat bahwa while memiliki kondisi true apabila iterasi kurang dari 10. Syarat kedua terlihat pada baris ke-10. Dimana variabel iterasi dinaikkan  satu per satu supaya kondisi perulangan false. Jika salah satu atau kedua syarat ini tidak ada, maka perulangan akan berjalan terus-menerus tanpa berhenti.

Jalannya program di atas pertama, nilai iterasi sama dengan 0 kemudian masuk ke kondisi perulangan. Karena nilai iterasi < 10, maka statement di dalam perulangan dijalankan. Munculnya pesan di layar monitor dan nilai iterasi ditambah satu, menjadi 1. Kemudian masuk lagi ke kondisi perulangan. Karena iterasi masih < 10, maka statement di dalam perulangan kembali dijalankan. Begitu seterusnya hingga 10 kali perulangan.

Berikut contoh lainnya :

#include

int main()
{
     int iterasi = 20;
    
     while (iterasi < 10)
     {
           cout << "Iterasi ke-" << iterasi << endl;
           iterasi++;
     }
     return 0;
}

Karena iterasi bernilai 20 maka perulangan tidak pernah dijalankan. Sehingga hasil eksekusi program tidak menampilkan apa-apa. Hal ini terjadi dikarenakan pengecekan true/false dari kondisi perulangan dilakukan sebelum baris statement di dalam perulangan. Akan berbeda pada perulangan menggunakan do ... while.


Do ... While

Perhatikan contoh berikut :

#include

int main()
{
     int iterasi = 0;
    
     do
     {
           cout << "Iterasi ke-" << iterasi << endl;
           iterasi++;
     }
     while (iterasi < 10);
     return 0;
}

Keluaran program di atas :

Iterasi ke-0
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
Iterasi ke-6
Iterasi ke-7
Iterasi ke-8
Iterasi ke-9

Hasilnya memang tampak sama dengan perulangan while. Do ... while juga mempunyai kesamaan dengan perulangan while antara lain, perulangan ini juga mempunyai dua syarat yang harus ada supaya iterasi tidak berjalan terus-menerus tanpa berhenti. Perbedaannya, do ... while memiliki pengecekan kondisi yang terletak setelah statement perulangan.

Jalannya program di atas adalah pertama, nilai iterasi = 0. Kemudian menjalankan statement dalam perulangan, yaitu menampilkan nilai iterasi dan menambahkan nilai iterasi dengan satu menjadi 1. Baru setelah itu nilai iterasi masuk ke dalam kondisi. Karena kondisi terpenuhi maka kursor kompilasi kembali ke statement do. Dan mengulang proses. Begitu seterusnya hingga nilai iterasi = 10.

Contoh yang lain :

#include

int main()
{
     int iterasi = 20;
    
     do
     {
           cout << "Iterasi ke-" << iterasi << endl;
           iterasi++;
     }
     while (iterasi < 10);
     return 0;
}

Program di atas menunjukkan perbedaan penggunaan do ... while dan while. Karena pengecekan kondisi pada do ... while terletak setelah statement maka program di atas meskipun nilai iterasi tidak memenuhi kondisi perulangan namun statement perulangan dilakukan sekali. Sehingga keluar tampilan di layar monitor nilai dari variabel iterasi yang tak lain = 20. Dapat disimpulkan bahwa dengan menggunakan do ... while statement perulangan minimal sekali dijalankan, meskipun kondisi tidak terpenuhi.

For

Perulangan for mempunyai bentuk umum sbb :

for (inisialisasi awal; kondisi; menaikkan/menurunkan variabel)

Perhatikan pada contoh berikut :

#include

int main()
{
     int iterasi = 0;
    
     for (iterasi; iterasi < 10; iterasi++)
     {
           cout << "Iterasi ke-" << iterasi << endl;
     }
     return 0;
}
Keluaran program sbb :

Iterasi ke-0
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
Iterasi ke-6
Iterasi ke-7
Iterasi ke-8
Iterasi ke-9

Keluaran yang dihasilkan program sama seperti menggunakan do ... while dan while. Supaya perulangan tidak berjalan terus-menerus tanpa berhenti, maka perulangan for juga memiliki kondisi dimana jika terpenuhi maka statement dijalankan dan memiliki ekspresi unuk menaikkan variabel kondisi supaya suatu waktu kondisi bernilai false (perulangan berhenti).
Inisialisasi variabel di dalam parameter pertama for. Kondisi perulangan dijalankan pada parameter kedua. Dan ekspresi untuk menaikkan variabel kondisi pada parameter ketiga.

Contoh lain :

#include
int main()
{
     for (int iterasi=0; iterasi < 10; iterasi++)
     {
           cout << "Iterasi ke-" << iterasi << endl;
           iterasi++;
     }
     return 0;
}

Inisialisasi variabel kondisi dapat dituliskan dengan cara pada contoh di atas. Variabel iterasi hanya berlaku pada scope perulangan for sehingga pemanggilan variabel di luar perulangan tidak bisa dilakukan. Selain itu penaikan atau penurunan variabel bisa dilakukan di dalam statement perulangan (baris ke-7). Keluarannya menjadi

Iterasi ke-0
Iterasi ke-2
Iterasi ke-4
Iterasi ke-6
Iterasi ke-8
Break

Kita sudah mengenal break pada bahasan switch ... case, dengan definisi yang hampir sama break digunakan untuk keluar dari perulangan. Break ditempatkan di dalam statement perulangan. Ketika kursor kompilasi menjalankan statement break, maka kursor kompilasi akan melompat keluar dari scope perulangan terkait. Semua bentuk perulangan (do ... while, while, dan for) dapat menggunakan break. Perhatikan contoh berikut

#include

int main()
{
     int iterasi = 0;
    
     for (;;)
     {
           if (iterasi < 10)
           {
                cout << "Iterasi ke-" << iterasi << endl;
                iterasi++;
           }
           else break;
     }
     return 0;
}

Pada contoh di atas, for tidak mempunyai parameter apa-apa sehingga perulangan dapat berjalan terus-menerus. Namun ada cara lain untuk menghentikan perulangan. Yaitu dengan memanfaatkan control statement dan break. Jalannya program di atas pertama, nilai iterasi adalah 0. Kemudian perulangan dijalankan. Nilai iterasi dicek dalam kondisi control statement. Karena kondisi terpenuhi maka statement if dijalankan. Nilai iterasi ditampilkan di layar monitor dan nilai iterasi di tambah menjadi satu. Begitu seterusnya hingga nilai iterasi = 10. Kondisi if tidak terpenuhi, maka else dijalankan. Keluaran eksekusi program di atas sbb :

Iterasi ke-0
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-4
Iterasi ke-5
Iterasi ke-6
Iterasi ke-7
Iterasi ke-8
Iterasi ke-9

Continue

Continue adalah kebalikan dari break. Digunakan untuk kembali ke awal baris perulangan. Fungsi ini mirip dengan perintah goto. Penggunaan continue di dalam statement perulangan. Ketika kursor kompilasi menjalankan statement continue, maka kursor kompilasi  akan melompat ke baris awal perulangan. Continue dapat digunakan pada semua bentuk perulangan (do ... while, while, dan for). Perhatikan contoh berikut

#include

int main()
{
     int iterasi = 0;
    
     for (;;)
     {
           if ((iterasi <= 5) && (iterasi > 3))
           {
                iterasi++;
                continue;
           }
               
           else if (iterasi < 10)
           {
                cout << "Iterasi ke-" << iterasi << endl;
                iterasi++;
           }
           else break;
     }
     return 0;
}

Keluaran program menjadi

Iterasi ke-0
Iterasi ke-1
Iterasi ke-2
Iterasi ke-3
Iterasi ke-6
Iterasi ke-7
Iterasi ke-8
Iterasi ke-9
Terlihat bahwa iterasi ke-4 dan ke-5 tidak ditampilkan di layar monitor. Jalannya program di atas pertama, iterasi bernilai = 0. Kemudian masuk ke dalam perulangan. if pertama dicek kondisinya apakah bernilai true. Karena kondisi pertama tidak dipenuhi, maka kursor kompilasi menuju ke kondisi kedua. Kondisi else if ternyata terpenuhi, maka nilai iterasi = 0 ditampilkan di layar dan nilai iterasi ditambah dengan satu menjadi 1. Hingga iterasi bernilai 4 dan 5, ternyata kondisi if pertama terpenuhi, maka statement di dalamnya dijalankan. Nilai iterasi ditambah satu menjadi 5 dan 6, serta kursor kompilasi melompat kembali ke awal perulangan for. Hal inilah yang membuat tampilan iterasi ke-4 dan 5 tidak ada. Sebab statement di dalam else if tidak dijalankan.

Jika baris program

if ((iterasi <= 5) && (iterasi > 3))
{
     iterasi++;
     continue;
}

digantikan dengan

if ((iterasi <= 5) && (iterasi > 3))
{
     continue;
     iterasi++;
}

Maka program akan berbeda, nilai iterasi setelah mencapai 4 tidak pernah naik menjadi 5, dst. Karena statement penaikan nilai iterasi tidak pernah dieksekusi. Hasilnya perulangan program di atas tidak akan pernah berhenti.

Kondisi Perulangan

Kondisi yang dipakai di dalam perulangan mempunyai beberapa aturan supaya tidak menimbulkan kesalahan program. Pertama, variabel kondisi perulangan harus bertipe integer atau char. Variabel bertipe float tidak dianjurkan meskipun sebenarnya bisa. Jika terpaksa menggunakan variabel kondisi bertipe float/pecahan, sebaiknya cek logika kondisi tersebut secara teliti.

Khusus perulangan menggunakan for, ketiga parameter dapat dihilangkan satu, dua, atau bahkan semuanya. Namun untuk faktor berhentinya harus tetap ada. faktor tersebut dapat diletakkan di dalam statement perulangan.
Perulangan Bersarang

Perulangan di dalam perulangan diperbolehkan pada hampir semua bahasa pemrograman. Contoh perulangan di dalam perulangan dapat dilihat pada program berikut :

#include

int main()
{
     int nested1, nested2;
     int awal1 = 1, awal2;
     cout << "masukkan nilai nested1 = ";
     cin >> nested1;
     cout << "\nmasukkan nilai nested2 = ";
     cin >> nested2;
    
     if ((nested1 > 0) && (nested2 > 0))
     {
           while (awal1 <= nested1)
           {
                for(awal2=1; awal2 <= nested2; awal2++)
                {
                     cout << "Perulangan ke-" << awal1 * awal2                       << endl;
                }
                awal1++;
           }
     }  
}

Pada contoh di atas, terdapat perulangan di dalam perulangan. Semua bentuk perulangan dapat diletakkan pada statement bentuk perulangan yang lain. Seperti pada program contoh perulangan for di dalam perulangan dengan while. Statement baris ke-18, akan dijalankan sebanyak nested1 x nested2 (sesuai dengan masukan user).

Jalannya program contoh sebagai berikut. Pertama, nilai nested1 dan nested2 dimasukkan oleh user adalah 2 dan 3. Kemudian kondisi if akan dicek apakah nilai nested masing-masing berupa nilai integer positif. Jika true maka perulangan while di jalankan. Di dalam kondisi while nilai awal1 akan dicek apakah kurang dari nilai nested1 (2). Karena kondisi true maka statement while dijalankan. Di dalam statement while ditemukan perulangan lagi, maka kondisi perulangan dicek. Apakah nilai awal2 kurang dari nested2. Karena kondisi true maka statement for dijalankan. Yaitu menampilkan pesan ke layar monitor perulangan ke-...

Statement for akan dijalankan hingga nilai awal2 lebih dari nested2. Dengan kata lain perulangan for statementnya dijalankan sebanyak 3x. Sedangkan perulangan while statementnya dijalankan sebanyak 2x. Kesimpulannya total statement baris ke-18 dijalankan sebanyak 6x (2 x 3). Keluaran program sbb :

masukkan nilai nested1 = 2

masukkan nilai nested2 = 3
Perulangan ke-1
Perulangan ke-2
Perulangan ke-3
Perulangan ke-2
Perulangan ke-4
Perulangan ke-6



























LARIK (ARRAY)

Kita sudah mengenal deklarasi variabel. Ketika sebuah variabel dideklarasikan maka sebuah memori dialokasikan untuk variabel tersebut, dengan cara memberi nama memori dengan nama variabel. Larik atau juga disebut sebagai array adalah kumpulan memori/variabel yang memiliki tipe data yang sama. Nama dari variabel juga sama. Untuk membedakan variabel satu dengan yang lain, larik menggunakan indeks. Dengan kata lain larik adalah variabel yang bertipe sama serta letaknya berurutan di dalam memori.

Berikut contoh dari array :

#include

int main()
{
     int larik1[5];
     int larik2[] = {5,6,9,2};
     char kata[6];
}   

terdapat 2 buah array dengan nama larik1 dan larik2. Larik1 merupakan kumpulan dari 5  buah memori yang bertipe integer yang berlum memiliki nilai (0). Sedangkan larik2 merupakan kumpulan dari 4 buah memori yang bertipe integer juga dengan nilai di dalam memori berturut-turut 5, 6, 9, dan 2. Terakhir adalah array bernama kata dengan jumlah memori 6 buah dan bertipe char.

Array Satu Dimensi

Contoh-contoh array sebelumnya adalah bentuk array satu dimensi. Kita ulangi contoh di atas untuk melihat ciri-ciri array lebih dalam. int larik1[5], merupakan deklarasi array. 5 merupakan penanda bahwa larik1 beranggotakan 5 buah memori. Karena array memiliki indeks, sekarang kita melihat cara pengindeksan array di C++. Berbeda cara pengindeksan array di Pascal, C++ tidak memperbolehkan programmer mendefinisikan sendiri indeks array yang mereka buat. Indeks array di C++ pasti dimulai dari 0.

Nah, karena larik1 mempunyai jumlah memori 5 maka indeksnya sbb :

0
1
2
3
4





Lalu bagaimana kita mengakses isi dari array. Perhatikan contoh berikut :

#include

int main()
{
     int i;    
     int larik1[5];
     int larik2[] = {5,6,9,2};
     char kata[6];
    
     for (i=0; i<5; i++)
     {
           larik1[i] = i*2;
           cout << larik1[i] << ", ";
     }
     cout << endl;
    
     for (i=0; i<4; i++)
     {
           cout << larik2[i] << ", ";
     }
     cout << endl;
    
     for (i=0; i<6; i++)
     {
           kata[i] = 67+i;
           cout << kata[i] << ", ";
     }
     cout << endl;
     return 0;
}

Mengakses array berupa pengisian elemen array, menampilkan isi array, atau melakukan operasi pada elemen array. Akses array biasanya memanfaatkan perulangan. Perulangan pertama melakukan pengisian array larik1 dengan nilai  = indeks array x 2. Kemudian perulangan kedua berfungsi menampilkan isi dari larik2 yang tak lain adalah  5, 6, 9, dan 2. Terakhir, perulangan ketiga berfungsi untuk mengisikan elemen array dengan huruf/karakter dengan kode ASCII berurut mulai kode 67-72. Hasil keluarannya sbb :

0, 2, 4, 6, 8,
5, 6, 9, 2,
C, D, E, F, G, H,

Karena array berupa kumpulan memori, maka pengaksesannya juga harus spesifik. Artinya memori yang mana yang kita akses. Sehingga untuk mengakses caranya dengan menuliskan nama array kemudian diikuti dengan nomer indeksnya. Dan lagi-lagi Anda harus berhati-hati dalam mendefinisikan indeks array (selalu dimulai dari nol dan indeks maksimum adalah jumlah array – 1).

Pada contoh diperlihatkan juga bagaimana cara mengisikan langsung nilai ke dalam array. Perhatikan baris ke-7, pendeklarasian seperti itu diperbolehkan, yaitu array tidak diberikan jumlah elemennya. Namun dalam deklarasi harus langsung memberikan nilai-nilai dari elemen array tersebut. Deklarasi array seperti ini tidak diperbolehkan

int larik3[];

karena alokasi memori untuk array larik3 tidak jelas. C++ tidak menerima deklarasi array yang tidak jelas alokasi memorinya (rancu).

Contoh lainnya :

#include

int main()
{
     int i;
     int larik1[5];
     int larik2[] = {5,6,9,2};
     char kata[6];

     cout << “Masukkan nilai ke-1 = “;
     cin >> larik1[0];
     cout << “\nMasukkan nilai ke-2 = “;
     cin >> larik1[1];
     cout << “\nMasukkan nilai ke-3 = “;
     cin >> larik1[2];
     cout << “\nMasukkan nilai ke-4 = “;
     cin >> larik1[3];
     cout << “\nMasukkan nilai ke-5 = “;
     cin >> larik1[4];

     i = larik1[0] + larik1[1] + larik1[2] + larik1[3] + larik1          [4];
     cout << “\nNilai i = “ << i << endl;
}

Array sama seperti variabel biasa. Maksud sama di sini adalah perlakuan terhadap array sama seperti pada variabel (pengisian nilai dan cara panggil). Letak perbedaannya, array merupakan variabel-variabel serupa yang disatukan. Hanya itu saja yang membedakan antara array dan variabel.

Array Dua Dimensi

Menjelaskan array berdimensi dua paling mudah menggunakan contoh matriks. Segala bentuk matriks adalah implementasi array dua dimensi. Misalnya matriks :

            3   6   7
A   =    4   9   2
            7   8   5

Deklarasi array dua dimensi di atas sbb :

int matriks1[3][3] = {{3, 6, 7},
                      {4, 9, 2},
                     {7, 8, 5}}

Contoh yang lain adalah :

int matriks2[4][3];
float matriks[][3] = {{2.6, 8.9, 5.6},
                      {6.4, 3.8, 6.2} };

matriks1 pada tiap kolomnya memiliki 3 elemen dan tiap baris juga 3 elemen. Matriks2 memiliki 4 elemen pada tiap kolomnya dan 3 elemen tiap barisnya. Matriks memiliki 2 elemen tiap kolomnya dan 3 elemen tiap barisnya.
Harap diingat bahwa indeks matriks1 yang pertama [3] merupakan jumlah elemen pada kolom dan indeks kedua [3] adalah jumlah elemen pada baris. Matriks2, indeks pertama [4] merupakan jumlah elemen pada tiap kolomnya dan indeks kedua [3] merupakan jumlah elemen tiap barisnya. Jangan berfikir bahwa indeks pertama merupakan jumlah baris matriks dan indeks kedua adalah jumlah kolom matriks. Karena jika Anda berpemahaman seperti ini maka ketika melakukan akses pada matriks/array berdimensi 2, Anda akan bingung. Pemahaman ini hanya untuk menyamakan persepsi dalam membaca array berdimensi dua/matriks.

Pada gambar di bawah ini Anda akan lebih diperjelas lagi mengenai pemahaman tentang indeks pertama dan indeks kedua dari matriks/array dua dimensi. Dapat disimpulkan bahwa deklarasi array dua dimensi sbb :

nama_variabel[jumlah_elemen_kolom][jumlah_elemen_baris];
in
0
1
2
0



1



2



3



                        matriks2

Deklarasi array matriks memberikan contoh kepada Anda bagaimana cara mendeklarasikan sebuah array dua dimensi sekaligus mengisikan nilainya. Indeks array matriks yang pertama dapat dikosongi, sedangkan indeks kedua harus diisi. 
Cara mengakses array dua dimensi dapat dilihat pada contoh berikut :

#include

int main()
{
     int matriks[3][2];
     char kata[ ][4] = {{'A','K','U','&'},
                       {'K','A','M','U'}};
                 
     for (int i=0; i<3;i++)
     {
           for (int j=0; j<2; j++)
           {
                matriks[i][j] = i * j;
           }
     }

     for (int i=0; i<2;i++)
     {
           for (int j=0; j<4; j++)
           {
                cout << kata[i][j];
           }
           cout << "\t";
     }
    
     cout << endl;

     cout << "nilai matriks[3][2] = " << matriks[2][1] << endl;
     return 0;
}
Keluarannya sbb :

AKU&    KAMU   
nilai matriks[3][2] = 2

Eksekusi program di atas, pertama komputer akan mengalokasikan 6 buah memori untuk array matriks. Dengan spesifikasi 3 memori untuk tiap kolomnya dan 2 memori untuk tiap barisnya. Selanjutnya komputer juga mengalokasikan 8 buah memori untuk array char kata. Dengan spesifikasi 2 buah untuk tiap kolomnya dan 4 buah untuk tiap barisnya. Kemudian memori tersebut diisikan dengan karakter-karakter yang telah didefinisikan.

in
0
1
0
0
0
1
0
1
2
0
2
            matriks

Setelah memori dialokasikan untuk array matriks, pada perulangan pertama nilai elemen array matriks didefinisikan.

in
0
1
2
3
0
A
K
U
&
1
K
A
M
U
                        kata

Sekali lagi jangan bingung terhadap indeks pada gambar. Memang terlihat indeks baris ada 2 sedangkan indeks kolom ada 4. Setelah memori dialokasikan untuk array kata dan isinya juga sudah didefinisikan, pada perulangan kedua isi elemen array kata ditampilkan. Terakhir, nilai pada array matriks [3][2] juga ditampilkan. 

Contoh yang lain yaitu :

#include

int main()
{
     int matriksA[2][3] = {{3, 6, 9},
                      {4, 5, 2}};
     int matriksB[3][2] = {{5, 8},
                            {5, 9},
                            {4, 2}};
     int matriksC[2][2];
     int i, j, k, kali, jumlah = 0;
    
     for (i=0; i<2; i++)
     {
           for (j=0; j<3; j++)
           {
                for (k=0; k<2; k++)
                {
                     kali = matriksA[i][j] * matriksB[j][k];
                     jumlah = jumlah + kali;
                     matriksC[i][k] = jumlah;
                }
           }
     }
    
     for (i=0; i<2; i++)
     {
           for (k=0; k<2; k++)
           {
                cout << matriksC[i][k] << "\t";
           }
           cout << endl;
     }
}

Array Multidimensi

Hampir mirip dengan array dua dimensi, array ini memiliki indeks hingga lebih dari dua. Deklarasinya sbb :

int larik1[3][4][5];
int larik2[2][2][3] =
{{{5, 6, 4}, {8, 8, 6}},
 {{9, 6, 4}, {2, 3, 7}}};

Pada contoh di atas terlihat cara mendeklarasikan array tiga dimensi. Contoh di atas juga bisa dijadikan patokan untuk membuat array dimensi yang lebih tinggi. Cara pengisian langsung untuk array multi dimensi adalah pertama, Anda lihat indeks terakhir dari array. Pada contoh di atas indeks terakhirnya adalah 3. Sehingga untuk kurung kurawal pertama berisi 3 elemen [{5, 6, 4}]. Selanjutnya indeks kedua dari akhir, pada contoh di atas bernilai 2. Oleh karena itu Anda membuat kurung kurawal yang lebih tinggi satu tingkat dari yang telah Anda buat tadi. Isi dari kurawal yang lebih tinggi ini adalah elemen-elemen di kurawal yang lebih rendah satu tingkat dengan dia dan sebanyak indeksnya yaitu 2 [{{5, 6, 4}, {8, 8, 6}}]. Terakhir, indeks paling awal yang bernilai 2. Berarti Anda perlu membuat kurung kurawal baru yang lebih tinggi tingkatannya dari yang sebelumnya. Isi dari kurawal tersebut adalah elemen-elemen di tingkat sebelumnya sebanyak indeks yang tercantum yaitu 2 [{{{5, 6, 4},{8, 8, 6}},{{9, 6, 4}, {2, 3, 7}}}].

Anda dapat mengetahui jumlah alokasi memori pada array tiga dimensi dengan mengalikan indeks-indeksnya. Pada contoh di atas jumlah alokasi memori sebanyak 2 x 2 x 3 = 12 buah. Cara mengakses array sbb :

larik2[0][0][0] = 5
larik2[0][0][1] = 6
larik2[0][0][2] = 4

larik2[0][1][0] = 8
larik2[0][1][1] = 8
larik2[0][1][2] = 6

larik2[1][0][0] = 9
larik2[1][0][1] = 6
larik2[1][0][2] = 4

larik2[1][1][0] = 2
larik2[1][1][1] = 3
larik2[1][1][2] = 7

Kesimpulan

Pada array dua dimensi, saat dideklarasikan indeks pertama sebagai jumlah elemen tiap kolom dan indeks kedua sebagai jumlah elemen tiap baris. Sedangkan pada saat pengaksesan array dua dimensi, indeks pertama sebagai penunjuk baris ke dan indeks kedua sebagai penunjuk kolom ke.








STRING

Berbeda dengan bahasa pemrograman Pascal yang memiliki tipe data string. Dalam C++ tipe data string dapat diperoleh dengan cara mendefinisikan suatu array bertipe char. Karena pada hakekatnya string merupakan kumpulan dari variabel bertipe char. Meskipun berupa array, perlakukan terhadap array bertipe char sedikit lebih istimewa. Karena terdapat beberapa fungsi yang bisa digunakan untuk memanipulasi langsung array ini. Sedangkan pada array bertipe non char tidak ada fungsi untuk memanipulasi. Fungsi-fungsi untuk array bertipe char diletakkan pada file include string.h.

Bagaimana cara mendeklarasikan string? Sama seperti dengan array biasa namun tipe datanya adalah char. Berikut contohnya :

#include

int main()
{
     char kata1[5];
     char kata2[] = {'B', 'E', 'L', 'A', 'J', 'A', 'R'};
    
     for (int i=0; i<5; i++)
     {
           kata1[i] = 'A'+i;
           cout << kata1[i];
     }

     cout << endl;
    
     for (int i=0; i<7; i++)
     {
           cout << kata2[i];
     }
    
     cout << endl;
     return 0;
}

Contoh di atas mirip dengan contoh-contoh pada bab sebelumnya. Tipe data char masih satu jenis dengan tipe data integer. Karena tipe data char diisi oleh karakter-karakter ASCII yang dikodekan dengan angka integer dari 0 – 127. Pada perulangan pertama terlihat bahwa elemen kata1 berturut-turut diisi dengan karakter A (ASCII = 65), B (ASCII = 66), C (ASCII = 66), D (ASCII = 66), dan E (ASCII = 66). Keluaran dari program di atas adalah :

ABCDE
BELAJAR

Fungsi-Fungsi Dalam String.h

Sama seperti dengan file include yang lain, string.h terletak di /usr/include. Kita akan melihat fungsi apa saja yang didukung oleh string.h.

/* Copy SRC to DEST.  */
extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
     __THROW;
/* Copy no more than N characters of SRC to DEST.  */
extern char *strncpy (char *__restrict __dest,
                 __const char *__restrict __src, size_t __n) __THROW;

/* Append SRC onto DEST.  */
extern char *strcat (char *__restrict __dest, __const char *__restrict __src)
     __THROW;
/* Append no more than N characters from SRC onto DEST.  */
extern char *strncat (char *__restrict __dest, __const char *__restrict __src,
                 size_t __n) __THROW;

/* Compare S1 and S2.  */
extern int strcmp (__const char *__s1, __const char *__s2)
     __THROW __attribute_pure__;
/* Compare N characters of S1 and S2.  */
extern int strncmp (__const char *__s1, __const char *__s2, size_t __n)
     __THROW __attribute_pure__;
/* Return the length of S.  */
extern size_t strlen (__const char *__s) __THROW __attribute_pure__;
__END_NAMESPACE_STD

Ketujuh fungsi di atas paling banyak dipakai untuk memanipulasi string. Jika Anda menggunakan Microsoft Visual C++, fungsi manipulasi string lebih banyak, seperti strstr, strupr, dan strlwr.



fungsi
Parameter
Keterangan
strcpy
source, dest
mengkopi kata dari source ke dalam dest
strncpy
source, dest, n
mengkopi kata dari source ke dalam dest sebanyak n karakter
strcat
source, dest
menambahkan string dari source ke string dest di posisi akhir
strncat
source, dest, n
menambahkan string dari source ke string dest di posisi akhir sebanyak b karakter
strcmp
s1, s2
membandingkan string dari s1 dengan string dari s2
strncmp
s1, s2, n
membandingkan string dari s1 dengan string dari s2 sebanyak n karakter
strlen
s
menghasilkan panjang dari string s

Fungsi-fungsi di atas dapat digunakan pada tipe string. Pada contoh sebelumnya, kita menampilkan kata BELAJAR dengan melakukan cout satu per satu dari elemen array. Untuk lebih praktisnya, contoh sebelumnya akan kita ganti dengan program berikut :

#include

int main()
{
     char kata1[6];
     char kata2[] = "BELAJAR";
    
     strcpy(kata1, "ABCDE");
     cout << kata1 << endl;
     cout << kata2 << endl;
    
     return 0;
}

Terlihat bahwa string meskipun berupa array namun memiliki perlakuan yang berbeda. Pendeklarasian sekaligus pengisian array bertipe char berbeda dengan pendeklarasian sekaligus pengisian nilai array bertipe non char.

Keluaran program di atas sbb :

ABCDE
BELAJAR
Menangkap Inputan Berupa Karakter

Suatu saat program kita membutuhkan input dari user berupa karakter. Untuk menangkap karakter yang dimasukkan, perintahnya sama seperti menangkap inputan biasa pada tipe data integer atau float. Berikut contoh programnya :

#include

int main()
{
     char kata1[6];
     char kata2[] = "BELAJAR";
     char kata3[15];
    
     cout << "Masukkan suatu kata dengan panjang 6 = ";
     cin >> kata1;
     cout << kata1;

     strncpy(kata3, kata1, 3);
     cout << "\n" << kata3 << endl;
     cout << strncmp(kata3, kata1,3) << endl;
     cout << "Panjang kata 2 adalah = " << strlen(kata3);
    
     return 0;
}

Keluaran dari program tersebut adalah :

Masukkan suatu kata dengan panjang 6 = faizal
faizal
fai
0
Panjang kata 2 adalah = 7

Pada program terdapat 3 buah larik masing-masing kata1, kata2, dan kata3. Kemudian baris ke-9 program meminta masukan dari user berupa kata. Karakter yang dapat diterima hanya 6 buah. Meskipun user memasukkan sebanyak 8 karakter, maka hanya 6 karakter pertama yang disimpan. Cara menerima inputan user berupa karakter yaitu dengan perintah

cin >> kata1;

Meskipun kata1 berupa array namun pengaksesan array bertipe char dapat dengan menghilangkan informasi indeksnya. Fasilitas ini khusus untuk array bertipe char saja. Pada baris ke-10 juga seperti itu. Untuk menampilkan sebuah string tidak perlu menampilkan satu per satu, namun bisa menampilkan sekaligus dengan tidak menyertakan indeks array yang bersangkutan.

Baris ke-12 memperlihatkan cara pemakaian fungsi strncpy. Isi karakter pada array kata1 di copy ke array larik3 sebanyak 3 karakter saja, kemudian ditampilkan isinya. Pada baris ke-14 array kata1 dan kata3 dibandingkan. Namun pembandingan hanya sebatas 3 karakter saja. Hasilnya adalah nilai 0 yang berarti 'true'. Terakhir, menampilkan ukuran dari array kata2 yang berjumlah 7 karakter.

Kesimpulan, Cara akses array bertipe char dengan non char adalah berbeda. C++ memberikan fasilitas khusus untuk array bertipe char. Hal ini untuk mempermudah programmer dalam menggunakan tipe data string. Pengaksesan dengan menghilangkan indeks array. Rahasianya adalah, setiap array char yang kita buat secara otomatis akan ditambahkan oleh C++ karakter null yang berarti tanda akhir string.

Seperti array kata2, oleh C++ alokasi memorinya menjadi :
B
E
L
A
J
A
R
/0
karakter terakhir adalah tanda akhir string dari kata2. Oleh karenanya apabila dilakukan cout maka C++ akan melakukan perulangan dengan menampilkan isi array kata2 hingga dijumpai karakter null. Makanya kenapa indeks array pada saat pengaksesan array bertipe char dapat dihilangkan. Karena patokannya kepada karakter null.
 
FUNCTION

Function seperti yang telah sedikit disinggung di bab pertama, merupakan sub program yang menyusun program secara keseluruhan. Dalam bahasa C++ hanya dikenal function sedangkan dalam bahasa Pascal dikenal 2 sub program dengan function dan procedure. Function merupakan sub program yang bisa mengembalikan nilai. Dengan kata lain function selain sub program, dia juga memiliki alokasi memori tersendiri mirip dengan variabel. Procedure adalah sub program yang tidak dapat mengembalikan nilai atau tidak ada alokasi memori.

Meskipun di dalam C++ hanya mengenal function, namun sebenarnya C++ tetap mempunyai procedure juga. Perbedaannya procedure dalam C++ tidak didefinisikan secara implisit dengan kata kunci yang dikenali C++ yaitu procedure. Function yang ada di dalam program C++ harus memiliki tipe data. Tipe datanya antara lain tipe data yang dikenali oleh C++ serta tipe data void. Tipe data void berarti suatu variabel tidak bertipe atau tidak memiliki alokasi memori. Karenanya function yang bertipe void dalam C++ sama seperti procedure dalam Pascal.

Perhatikan contoh program yang menggunakan function berikut ini :

#include

void tampilkan(float a);
float hitung();

int main()
{
     tampilkan(hitung());
     return 0;
}

void tampilkan(float a)
{
     cout << "nilai a menjadi = " << a << endl;
}

float hitung()
{
     float x;
     cout << "Masukkan nilai a = ";
     cin >> x;
     x = x + 5;
     return(x);
}

Keluaran program di atas sbb :

Masukkan nilai a = 0.5
nilai a menjadi = 5.5

Pada baris ke-3 dan 4 terdapat prototipe fungsi. Prototipe fungsi digunakan untuk mendeklarasikan fungsi-fungsi apa saja yang berada dalam program. Baris ke-3 merupakan prototipe fungsi berupa procedure yang memiliki parameter masukan satu variabel bertipe float (float a). Sedangkan pada baris ke-4 merupakan prototipe fungsi berupa function yang bertipe float. Ketika baris ke-4 ini dieksekusi maka C++ akan mengalokasikan sebuah memori untuk menyimpan keluaran dari fungsi hitung. Nama memori itu sendiri adalah hitung.

Pada program utama baris ke-6, terdapat pemanggilan fungsi tampilkan. Pemanggilan fungsi harus disuaikan dengan kondisi fungsinya. Kondisi yang ahrus diperhatikan adalah nama fungsi, besar kecilnya huruf harus sama dan parameter masukan fungsi, jumlahnya harus sama pula. Misalnya apabila parameter fungsi satu buah maka ketika fungsi dipanggil harus menyertakan nilai masukan satu buah
Fungsi tampilkan memiliki sebuah nilai masukan, oleh karenanya ketika pemanggilan tampilkan() nilai masukan disertakan. Nilai masukan ini boleh nilai langsung atau nama variabel yang menyimpan suatu nilai. Yang harus diperhatikan, karena parameter memiliki tipe data maka nilai masukan harus sesuai dengan tipe data tersebut.

Pada contoh di atas, nilai masukan berasal dari variabel bernama hitung. Hitung sendiri merupakan fungsi, namun memiliki alokasi memori. Boleh dikatakan hitung juga merupakan variabel. Tipe data hitung juga harus sesuai dengan tipe data parameter masukan fungsi tampilkan, yaitu float.

Ketika baris tampilkan(hitung()) dijalankan, maka fungsi tampilkan dijalankan dan parameter masukan diganti menjadi hitung().

void tampilkan(hitung())
{
     cout << "nilai a menjadi = " << a << endl;
}

Selanjutnya, karena parameter masukan berupa fungsi maka fungsi tersebut dijalankan terlebih dahulu, supaya didapatkan nilai implisit untuk parameter masukan.

float hitung()
{
     float x;
     cout << "Masukkan nilai a = ";
     cin >> x;
     x = x + 5;
     return(x);
}

Baris ketiga fungsi hitung meminta kepada user untuk memasukkan nilai bertipe float ke dalam program. Kemudian nilai akan dimasukkan ke dalam variabel x. Dimisalkan nilai x adalah 0.5. Nilai variabel x ditambah dengan 5 menjadi 5.5. Terakhir, nilai x dimasukkan ke dalam variabel hitung yang tak lain adalah nilai kembali dari fungsi hitung. Tipe data variabel x dan fungsi hitung sama-sama float sehingga tidak perlu adanya konversi tipe data.

Setelah fungsi hitung selesai dikerjakan, kursor kompilasi kembali ke fungsi tampilkan, kali ini parameter masukannya sudah jelas nilainya.

void tampilkan(5.5)
{
     cout << "nilai a menjadi = " << a << endl;
}

Dan nilai a yang tak lain adalah 5.5 ditampilkan ke layar monitor. Proses kompilasi program yang mempunyai function tidak terurut seperti contoh-contoh program sebelumnya. Prosesnya akan melompat-lompat. Kunci untuk merunut proses kompilasi pada program yang mempunyai function adalah. Ketika menjumpai suatu kata yang tak lain adalah nama sebuah function maka kursor kompilasi akan berpindah menuju ke baris program function tersebut. Seperti pada statement

void tampilkan(hitung())

Contoh program lainnya :

#include

float nilai(int a, int b);
int jumlah(float x);
void masukan(char kata[]);

int main()
{
     int l, m;
     float w;
     char kata[15];

     cout << "Masukkan nama variabel = ";
     cin >> kata;
     cout << "\nMasukkan nilai a = ";
     cin >> l;

     m = l + 10;
     w = nilai(l,m);
     cout << "Nilai hasilnya adalah = " << jumlah(w) << endl;
     masukan(kata);

     return 0;
}

void masukan(char kata[])
{
     cout << "Nama variabelnya adalah = " << kata;
    
}

int jumlah(float x)
{
     return((int)x * 100);
}

float nilai(int a, int b)
{
     return((float)a + b);
}

Keluaran program adalah :

Masukkan nama variabel = variabelku

Masukkan nilai a = 3
Nilai hasilnya adalah = 1600
Nama variabelnya adalah = variabelku

Program pertama kali mendeklarasikan 3 buah fungsi masing-masing bernama nilai, jumlah, dan masukan. Dari ketiga fungsi hanya dua yang mendapatkan alokasi memori, yaitu nilai dan jumlah. Tipe data dari masing-masing memori tersebut berturut-turut adalah float dan integer. Kedua memori memiliki nama nilai dan jumlah.
Fungsi pertama memiliki 2 buah masukan yang masing-masing bertipe integer. Fungsi kedua memiliki sebuah masukan bertipe float, dan fungsi terakhir memiliki masukan berupa array bertipe char.

Di dalam program utama, dideklarasikan 2 buah variabel bertipe integer, 1 buah bertipe float, dan sebuah array bertipe char sebanyak 15 elemen. Baris keenam program utama, berfungsi menerima masukan dari user. Segala masukan baik berupa karakter atau angka akan disimpan ke dalam array bernama kata, dan dikenali sebagai karakter (meskipun user memasukkan angka).

Selanjutnya user juga diminta untuk memasukkan nilai a. Nilai yang dimasukkan user disimpan ke dalam variabel l. Kursor kompilasi berpindah menuju baris selanjutnya, nilai m didapatkan. Kemudian nilai w sama dengan nilai yang dikembalikan oleh fungsi nilai. Karena kursor kompilasi menjumpai kata dimana kata tersebut merupakan nama sebuah fungsi, maka fungsi terkait dijalankan.

Pemanggilan fungsi nilai harus memperhatikan jumlah parameter yang dibutuhkan dan tipe data dari parameter tersebut. Karena variabel l dan m merupakan integer serta masukan yang dibutuhkan fungsi nilai juga integer maka sah jika fungsi dijalankan. Kursor kompilasi menuju ke awal sub program fungsi nilai. Fungsi nilai mengembalikan sebuah bilangan float yang tak lain adalah penjumlahan dari parameter 1 dengan parameter 2. Bilangan hasil penjumlahan ini kemudian dikopikan ke dalam variabel w.

Kursor kompilasi kembali ke baris 12 program utama. Nilai variabel jumlah ditampilkan. Karena jumlah merupakan suatu fungsi, maka sebelum ditampilkan sub programnya dijalankan terlebih dahulu. Kursor kompilasi kembali berpindah menuju ke baris awal sub program fungsi jumlah. Fungsi ini memerlukan sebuah masukan bertipe float. Nilai w sebagai masukan juga bertipe float, maka sah jika fungsi ini dijalankan. Fungsi jumlah mengembalikan sebuah nilai bertipe integer hasil perkalian dari parameter masukan dengan nilai 100. Hasil ini disimpan ke dalam variabel jumlah.

Kursor kompilasi kembali pada baris 12 program utama dan menyelesaikan statementnya. Nilai pada fungsi jumlah ditampilkan. Pada baris berikutnya, dijalankan fungsi tampilkan. Fungsi ini memiliki sebuah masukan yang berbentuk array dengan tipe char. Variabel kata yang berperan sebagai parameter masukan fungsi tampilkan juga berbentuk array dan bertipe char. Maka sah jika fungsi tampilkan dijalankan. Kursor kompilasi menuju sub program fungsi tampilkan. Di dalamnya hanya terdapat satu baris program yang berfungsi untuk menampilkan string/array karakter dari parameter fungsi.

int main()
{
     int l, m;
     float w;
     char kata[15];

     cout << "Masukkan nama variabel = ";
     cin >> kata;
     cout << "\nMasukkan nilai a = ";
     cin >> l;      l = 3
                          
     m = l + 10;         
     w = nilai(l,m);      float nilai(3, 13)
                           {
                                return((float) 3 + 13);
                           }





 

     cout << "Nilai hasilnya adalah = " << jumlah(w) << endl;








 



                                int jumlah (16)
                                {
                                     return((int) 16 * 100);
                                }

     masukan(kata);      
                          
      void masukan(kata=”variabelku”)    
      {
           cout << "Nama variabelnya adalah = " << kata;
      }

     return 0;
}

Contoh berikut ini akan memperlihatkan cara memberikan parameter fungsi berupa array multi dimensi.

#include

float fungsi(int larik[][3], int kolom, int baris);

int main()
{
     int nilai[][3] = {{5, 6, 8},{2, 9, 7}};
    
     cout << "Nilai fungsinya = " << fungsi(nilai, 2, 3) << endl;
     return 0;
}

float fungsi(int larik[][3], int kolom, int baris)
{
     float jumlah = 0;

     for (int i=0; i
     {
           for (int j=0; j
           {
                jumlah = (float) jumlah + larik[i][j];
           }
     }
     return(jumlah);
}

Terlihat pada baris ketiga program, prototipe fungsi memiliki parameter masukan array dua dimensi. Cara penulisannya boleh disertakan indeks array yang pertama maupun yang kedua. Apabila indeks ingin dikosongi karena belum diketahui jumlah elemennya, maka hanya indeks pertama saja yang boleh kosong. Indeks kedua dan seterusnya harus diisikan jumlah elemennya.


Rekursi

Rekursi merupakan pemanggilan fungsi sendiri di dalam fungsi terkait. Contohnya sbb :

#include

int faktorial(int a);

int main()
{
     int z;
     cout << "Masukkan nilai yang akan dicari faktorialnya = ";
     cin >> z;
     cout << faktorial(z);
}

int faktorial(int a)
{
     int hasil=1;
     if (a == 0)
     {
           return(1);
     }
    
     else if (a > 0)
     {
           hasil = a * faktorial(a-1);
           return(hasil);
     }
    
}

Terdapat fungsi faktorial dengan nilai kembali berupa integer. Di dalam sub program fungsi ada pemanggilan fungsi faktorial itu sendiri yaitu :

hasil = a * faktorial(a-1);

sehingga apabila user memberikan masukan parameter a nilai 3 misalnya, maka program akan berjalan sbb :

rekursi I :

Hasil mula-mula bernilai 1. Kemudian karena a bernilai 3 maka statement else dijalankan.
Hasil = 3 * faktorial(2)

rekursi II :

Hasil mula-mula bernilai 1. Kemudian karena a bernilai 2 maka statement else dijalankan.
Hasil = 2 * faktorial(1)

rekursi III :

Hasil mula-mula bernilai 1. Kemudian karena a bernilai 1 maka statement else dijalankan.
Hasil = 1 * faktorial(0)

rekursi IV :

Hasil mula-mula bernilai 1. Karena a = 0 maka masuk ke statement if. Hasilnya fungsi faktorial pada rekursi keempat mengembalikan nilai 1 (return (1)).

Setelah hasil rekursi keempat didapat, jalannya program kembali ke rekursi di atasnya.
rekursi III :

hasil = 1 * 1 adalah 1
kemudian nilai hasil (1) dikembalikan oleh fungsi faktorial pada rekursi ketiga. Selanjutnya jalannya program menuju ke rekursi di atasnya yaitu rekursi kedua.

rekursi II :

hasil = 2 * 1 adalah 2
kemudian nilai hasil (2) dikembalikan oleh fungsi faktorial pada rekursi kedua. Selanjutnya jalannya program menuju ke rekursi di atasnya yaitu rekursi pertama.

rekursi I :

hasil = 3 * 2 adalah 6
kemudian nilai hasil (6) dikembalikan oleh fungsi faktorial pada rekursi pertama dan sekaligus sebagai hasil akhir nilai faktorial dari 3.

POINTER

Pointer digunakan untuk menunjuk variabel/memori secara fleksibel. Pointer mirip dengan variabel, yang sama-sama memiliki alokasi memori di komputer. Perbedaannya adalah isi dari pointer. Isinya adalah suatu alamat memori. Selain itu pointer minimal membutuhkan alokasi 2 memori saat menggunakannya.

Perhatikan penjelasan berikut yang akan memudahkan Anda memahami apa itu pointer.


a
10F
20

Gambar dia atas adalah suatu variabel bernama a yang mendapatkan alokasi memori di dalam komputer di alamat 10F. Kemudian nilai dari variabel a adalah 20.


*p
21C
10F

Gambar di atas adalah suatu pointer bernama p (tanda * merupakan penunjuk bahwa p merupakan pointer) yang memiliki alokasi memori pada alamat 21C. Nilai dari p adalah 10F. 10F tak lain adalah alamat dari variabel a. Inilah sebab pointer disebut penunjuk variabel/memori.

Tipe Data Pointer

Meskipun pointer menyimpan alamat memori/variabel bukan berarti pointer tidak memiliki tipe data atau bertipe data integer. Pointer memiliki tipe data layaknya variabel seperti biasanya. Lalu tipe data ini fungsinya untuk apa? Tipe data pointer berfungsi untuk menjelaskan tipe data variabel/memori yang ditunjuk oleh pointer tersebut.

Seperti pada kedua gambar di atas, pointer *p memiliki tipe data integer. Artinya adalah nilai di dalam memori beralamat 10F bertipe data integer. Semisal pointer bertipe integer sedangkan variabel a bertipe float, maka pointer p tidak bisa menunjuk ke variabel a. dikarenakan berbeda tipe data.

Pengaksesan Pointer

Contoh sederhana yang akan menjelaskan tentang pengaksesan pointer adalah menggunakan fungsi cout. Perhatikan program berikut :

#include

int main()
{
     int *p = NULL;
     int nilai = 9;
    
     p = &nilai;
     cout << "Alamat yang ditunjuk p adalah = " << p << endl;
     cout << "Nilai yang ditunjuk p adalah = " << *p << endl;
     return 0;
}

Keluaran program adalah :

Alamat yang ditunjuk p adalah = 0xbffffa90
Nilai yang ditunjuk p adalah = 9

Terlihat bahwa ada dua pilihan dalam mengakses pointer. Pertama, kita mengakses isi pointer yang berupa alamat memori dan kedua adalah kita mengakses nilai memori yang ditunjuk oleh pointer. Untuk cara pertama cukup dengan menyebutkan nama pointernya tanpa menyertakan tanda *. Sedangkan untuk cara kedua kita perlu menyertakan tanda * sebelum nama pointer.

Pada baris ke-8 program

p = &nilai;

mempunyai arti pointer p yang semula tidak menunjuk ke memori manapun <int *p = NULL;> dialihkan menjadi menunjuk ke memori nilai. Tanda & berarti alamat. Sehingga nilai pointer p sama dengan alamat dari variabel nilai. Contoh lainnya sbb :

#include

int main()
{
     int *p = NULL;
     int nilai = 9;
    
     p = &nilai;
     *p = 11;
     cout << "Alamat yang ditunjuk p adalah = " << p << endl;
     cout << "Nilai sekarang bernilai = " << nilai << endl;
     return 0;
}

Keluaran program di atas adalah :

Alamat yang ditunjuk p adalah = 0xbffffa90
Nilai sekarang bernilai = 11

Baris ke-9 program di atas memperlihatkan cara mengganti nilai dari suatu variabel melalui pointer. Variabel nilai diganti dari 9 menjadi 11 melalui pointer p. Dengan

Pointer Dan Array

Pada hakekatnya pointer dapat menunjuk ke segala memori. Karena array juga merupakan memori yang dikumpulkan menjadi satu, maka pointer dapat menunjuknya. Cara penunjukkannya ada dua macam. Pertama adalah menunjuk array non char dan yang kedua adalah menunjuk array char.

Cara pertama yaitu dengan menunjuk array satu per satu seperti menunjuk variabel biasa. Perhatikan contoh program berikut :

#include

int main()
{
     int larik[3] = {50, 30, 10};
     int *p;
    
     p = &larik[0];
     cout << "Nilai pertama = " << *p << endl;
     for (int i=0; i<3; i++)
           cout << *(p+i) << endl;
    
     return 0;
}

Keluaran dari program di atas adalah :

Nilai pertama = 50
50
30
10
Baris ke-8 program menunjukkan cara pointer menunjuk ke sala satu elemen array. Apabila indeks array ini dihilangkan, maka program akan error, dikarenakan pointer bertipe non char harus menunjuk tepat pada satu eleman array. Baris ke-10 dan 11 menunjukkan cara menampilkan semua elemen array melalui pointer yang menunjuknya.
Untuk lebih jelasnya perhatikan gambar berikut :


10A
10B
10C
larik
50
30
10
Alokasi memori pada array bernama larik


FF1
p
10A
Alokasi memori pada pointer p

Maka statement (p+i) berarti isi dari pointer ditambah dengan i. Sehingga berturut-turut bernilai 10A, 10B, dan 10C. Lebih lengkapnya statement *(p+i) berarti nilai dari variabel yang ditunjuk oleh pointer yang tak lain 50, 30, dan 10.

Apabila statement *(p+i) diganti dengan *p+i maka berturut-turut keluarannya menjadi 50, 51, dan 52. Hal ini disebabkan *p selalu menunjuk ke elemen array yang pertama. Kemudian elemen yang ditunjuk tersebut ditambah dengan i.

Cara kedua adalah penunjukan terhadap array bertipe char atau string. Lebih berbeda dari penunjukan array non char karena array char atau string di dalam C++ mempunyai perlakukan khusus. Perhatikan contoh berikut :

#include

int main()
{
     char kata[] = "belajar C++";
     char *p;
    
     p = kata;
     cout << p;
     return 0;
}

Terdapat sebah array bertipe char berrnama kata. Jumlah elemen array kata adalah 12. Kemudian terdapat pula sebuah pointer bertipe char bernama p. pointer tersebut menunjuk ke array kata dengan ekspresi  p = kata; tanpa karakter * mengawali nama pointer dan karakter & mengawali nama array. Ekspresi tersebut berarti pointer menunjuk kepada elemen array yang paling pertama (kata[0]). Selanjutnya elemen-eleman yang ditunjuk oleh pointer p ditampilkan di layar. Hasil keluaran porgram di atas adalah

belajar C++

Seperti pada perintah yang sudah kita pelajari sebelumnya, untuk menampilkan array bertipe char bisa langsung dituliskan cout << kata; tanpa menggunakan perulangan layaknya array bertipe non char. Demikian pula dengan pointer bertipe char yang menunjuk ke array bertipe string. Tidak perbedaan dalam menampilkan ke layar. cukup cout << p tanpa karakter bintang pada p. Jika menggunakan karakter * maka tampilan hanya akan mengeluarkan huruf b.

Pemahaman dengan gambar sbb :


101
102
103
104
105
106
107
108
109
10A
10B
10C
kata
b
e
l
a
j
a
r

C
+
+
/0


fff
p
101

Ketika ekspresi cout << p dijalankan, maka C++ akan mengeluarkan semua elemen pada array yang ditunjuk oleh p. Hingga C++ menemukan tanda null (/0) pada salah satu elemen array. Contoh lainnya sbb :

#include

int main()
{
     char *p = "belajar C++";
    
     cout << p;
     return 0;
}

Keluaran program adalah :

belajar C++

Arti dari program di atas adalah (char *p = "belajar C++";) dialokasikan sebuah array berelemen 12 buah. Array tersebut tidak mempunyai nama (anonymous). Isi array tak lain adalah karakter “belajar C++”. Kemudian dialokasikan sebuah pointer bernama p dengan tipe char yang menunjuk ke array anonymous tersebut.

Pointer Menunjuk Pointer

Pointer pada hakekatnya juga merupakan memori namun fungsinya untuk menunjuk memori yang lain. Hal ini yang menyebabkan pointer dapat ditunjuk oleh pointer lainnya. Cara penulisan pointer yang menunjuk ke pointer sbb :

#include

int main()
{
     int *p = NULL;
     int **q = NULL;
     int z = 12;
    
     p = &z;
     cout  << "Nilai yang ditunjuk p = " << *p << endl;
     q = &p;
     *p = 15;
     cout  << "Nilai yang ditunjuk q = " << **q << endl;
     cout  << "Nilai yang ditunjuk p = " << *p << endl;
     return 0;
}

Keluaran program adalah :

Nilai yang ditunjuk p = 12
Nilai yang ditunjuk q = 15
Nilai yang ditunjuk p = 15

Pointer q merupakan pointer yang menunjuk kepada pointer lain. Pada baris 12 dan 13, terdapat ekpresi dimana pointer q menunjuk ke pointer p dan nilai pointer p diganti dengan 15. Pointer q menunjuk ke pointer p. Sedangkan pointer p menunjuk ke variabel z yang bernilai 15 (nilai z juga otomatis terganti dengan adanya statement pada baris ke-13). Inilah sebabnya untuk menampilkan nilai yang ditunjuk oleh pointer p melalui pointer q dituliskan seperti pada baris ke-14 (**q). Penjelasan dengan gambar dapat dilihat sbb :



10F

z
12


55A

*p
10F


FF0
**q
55A






Array Dari Pointer

Suatu array dapat berupa pointer elemennya. Namun ada perbedaan antara array pointer bertipe char dan non char. Perbedaannya terletak pada cara pendeklarasian dan pengaksesan. Berikut contohnya :

#include

int main()
{
     int *p[3];
     int q[] = {1, 2, 3};
    
     for (int i=0; i<3; i++)
     {
           p[i] = &q[i];
           cout << *p[i];
     }
     return 0;
}

Keluarannya adalah 1 2 3
Sedangkan untuk array pointer bertipe char berikut contohnya :

#include

int main()
{
     char *p[] = {"merah", "hijau", "kuning"};
          
     for (int i=0; i<3; i++)
           cout << p[i] << endl;
     return 0;
}

Keluarannya adalah

merah
hijau
kuning
Array pointer bertipe non char tidak dapat langsung dideklarasikan isinya. Mereka membutuhkan array lain untuk menyimpan nilai yang akan ditunjuk. Terlihat bahwa array pointer p pada program pertama tidak bisa langsung diisi dengan nilai 1, 2, dan 3. Namun nilai tersebut diisi terlebih dahulu ke dalam array q. Baru kemudian menggunakan perulangan, array pointer didefinisikan penunjukkannya.

Sedangkan pada array pointer bertipe char, array p langsung bisa didefinisikan penunjukannya. Ekspresi  char *p[] = {"merah", "hijau", "kuning"}; memiliki arti bahwa terdapat tiga buah array dengan nama anonymous. Masing-masing berelemen 5, 5, dan 6. Kemudian isi ketiga array tersebut adalah kata merah, hijau, dan kuning. Selanjutnya terdapat 3 buah array pointer yang bertipe char menunjuk ketiga array anonymous. Baris progam

for (int i=0; i<3; i++)
     cout << p[i] << endl;

memiliki fungsi untuk menampilkan elemen array yang ditunjuk oleh array pointer p.

0 komentar:

Posting Komentar