Rabu, 21 Desember 2011

Pengulangan


Pengulangan


Pernyataan while

while adalah sebuah perintah sebagaimana halnya if dan else. while bukanlah fungsi pustaka, karenanya while tidak menggunakan file header. Seperti if, while adalah pernyataan berganda dan tanda kurung muncul di dekat ekspresi relasional. Ekspresi relasional dapat berisi satu atau beberapa operator relasional. Jika anda menggunakan lebih dari satu operator relasional di dalam ekspresi relasional, gunakanlah operator nalar ( && dan || ) untuk mengkombinasikan pengujian relasional tersebut. Berikut adalah bentuk umum dari pernyataan while :

while ( ekspresi penguji )
{
// satu atau lebih pernyataan C++
}

pengujian relasional muncul di bagian atas blok while. Lokasi dari penguji tersebut penting. Jika ekspresi while bernilai salah saat yang pertama kali, kalang tersebut tidak akan dieksekusi satu kali pun dan program berlanjut ke pernyataan berikutnya di bawah blok while jika masih ada. Blok while akan akan dieksekusi hanya jika pengujian relasional bernilai benar.

Contoh 5.1 :
Program berikut menampilkan kalimat “Belajar pemrograman C++” sebanyak lima kali pada layar.

#include < iostream.h >

void main()
{
int cacah=1;
while ( cacah <= 5 )
{ cout << “Belajar pemrograman C++” << endl;
cacah++; }
}

Keluaran programnya :

Belajar pemrograman C++
Belajar pemrograman C++
Belajar pemrograman C++
Belajar pemrograman C++
Belajar pemrograman C++

Variabel cacah di dalam blok while disebut sebagai variabel pencacah. Setiap kali melalui blok while, program menaikan cacah. Seperti kalau menghitung 1, 2, 3 dan seterusnya, cacah bernilai 1, 2, 3 dan seterusnya, sampai C++ menaikan cacah ke nilai akhir yaitu 5. Pada saat melangkah ke hitungan berikutnya pengujian menjadi salah yaitu pada saat cacah = 6 dan blok while berakhir.

Contoh 5.2 :
Berikut ini contoh program untuk meverifikasi masukan pemakai menggunakan while :

#include

void main()
{
int umur;

cout << "Berapa umur anda : ";
cin >> umur;

while ((umur < 5) || (umur > 80))
{
cout << "Saya tidak yakin umur anda " << umur << " tahun"
<< endl;
cout << "Ulangi kembali dengan benar..." << endl << endl;
cout << "Berapa umur anda : ";
cin >> umur;
}

if (umur < 17)
{
cout << "Anda belum boleh mengendarai mobil" << endl;
cout << "karena umur anda dibawah 17 tahun" << endl;
}
else
{
cout << "Anda boleh mengendarai mobil" << endl;
cout << "Hati-hatilah !!!" << endl;
}
}

Keluaran programnya :

Berapa umur anda : 3
Saya tidak yakin umur anda 3 tahun
Ulangi kembali dengan benar...

Berapa umur anda :

Lainnya :

Berapa umur anda : 10
Anda belum boleh mengendarai mobil
karena umur anda dibawah 17 tahun

lainnya :

Berapa umur anda : 18
Anda boleh mengendarai mobil
Hati-hatilah !!!

Lainnya :

Berapa umur anda : 120
Saya tidak yakin umur anda 120 tahun
Ulangi kembali dengan benar...

Berapa umur anda :


Pernyataan do-while

C++ mempunyai blok while lainnya yaitu do-while, yang pengujian relasionalnya muncul di akhir blok. Berikut adalah format do-while :

do
{
// satu atau lebih pernyataan C++
}
while ( ekspresi relasional );

do-while tidak menguji relasi hingga kalang dieksekusi satu siklus penuh. Setelah blok do-while dieksekusi sekali, pengujian relasional dites untuk melihat perlu tidaknya blok ini dieksekusi lagi atau diakhiri. Hanya setelah pengujian relasional menjadi salah maka program melanjutkan sisa program berikutnya jika masih ada.

Contoh 5.3 :
Berikut ini contoh penggunaan do-while untuk menampilkan “Belajar pemrograman C++” sebanyak 5 kali :

#include

void main()
{
int cacah=1;

do
{
cout << "Belajar pemrograman C++" << endl;
cacah++;
}
while ( cacah <= 5);
}

Keluaran programnya sama dengan contoh 5.1

Contoh 5.4 :

#include

void main()
{
int umur;

do
{
cout << "Berapa umur anda : ";
cin >> umur;

if ((umur < 5) || (umur > 80))
{
cout << "Saya tidak yakin umur anda " << umur << " tahun"
<< endl;
cout << "Ulangi kembali dengan benar..." << endl << endl;
}
}
while ((umur < 5) || (umur > 80));

if (umur < 17)
{
cout << "Anda belum boleh mengendarai mobil" << endl;
cout << "karena umur anda dibawah 17 tahun" << endl;
}
else
{
cout << "Anda boleh mengendarai mobil" << endl;
cout << "Hati-hatilah !!!" << endl;
}
}

Pada contoh program 5.4 penggunaan do-while memerlukan sebuah if tambahan yang tidak diperlukan seperti pada contoh program yang menggunakan while.


Pernyataan for

Pernyataan for tidaklah sulit untuk dipahami. Berikut ini adalah format dari loop for.

for ( ekspresi awal; kondisi; ekspresi pencacah)
{
// satu atau lebih pernyataan C++
}

Pada saat C++ menjumpai pernyataan for, ia akan mengikuti langkah-langkah berikut untuk melaksanakan loop :
1. Melaksanakan ekspresi awal, yang biasanya berupa pernyataan penugasan.
2. Menguji ekspresi kondisi dengan hasil salah atau benar.
3. Melaksanakan blok loop jika kondisi bernilai benar.
4. Melaksanakan ekspresi pencacah, yang biasanya berupa operasi penaikan atau penurunan.
5. Kembali ke langkah 2.

Sewaktu kondisi diuji dan didapatkan bernilai salah, C++ menghentikan loop dan program berlanjut ke pernyataan sesudah loop for jika masih ada.

Contoh 5.5 :
Program berikut akan menampilkan kalimat “Belajar pemrograman C++” sebanyak 5 kali menggunakan pernyataan for.

#include

void main()
{
for (int i=1; i<=5; i++)
{ cout << “Belajar pemrograman C++” << endl; }
}

Keluaran programnya sama dengan contoh 5.1

Loop for bukanlah loop yang bagus untuk melakukan validasi masukan, tetapi loop while baik untuk tujuan ini. Loop for cocok kalau anda tahu terlebih dahulu jumlah yang ingin anda eksekusi terhadap suatu loop. Pada loop for diatas, blok loop dieksekusi secara persis 5 kali dengan ekspresi di dalam pernyataan for mengontrol 5 pengeksekusian.

Jika kondisi bernilai salah di awal, sebagaimana pernyataan for berikut, blok loop tidak pernah dieksekusi :

for ( int i=15; i<=10; i++ )
{ cout << “cout ini tidak pernah dijalankan”; }

Saat loop ini dimulai, C++ menyimpan 15 ke i. Kondisi i<=10, bernilai salah sehingga C++ menghentikan loop dan melanjutkan program tepat sesudah loop tanpa pernah mengeksekusi blok loop.

Contoh 5.6 :

#include

void main()
{
int n;
float data, total=0, rata_rata;

cout << "Berapa banyak datanya : ";
cin >> n;

for ( int i=1; i<=n; i++ )
{
cout << "Data ke-" << i << " : ";
cin >> data;
total += data;
}

rata_rata=total/n;
cout.precision(2);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout << endl << "Nilai rata-rata : " << rata_rata;
}

Satu hal menarik untuk diperhatikan adalah bahwa kurung loop for tidak harus seluruhnya berisi ketiga ungkapan. Sebagai contoh :

for ( bil=2; bil <= 10; bil += 2)

Dapat diubah menjadi :

bil=2;
for ( ; bil <= 10; )
{
// blok loop dimulai dari sini
bil += 2;
}

Menempatkan ekspresi keluar dari pernyataan for kadangkala dibenarkan, terutama kalau pemakai menginisialisasi nilai awal variabel pengontrol dengan cin, bukannya dengan inisialisasi melalui pernyataan. Walaupun demikian untuk kebanyakan pemakai loop for, tempatkan semua ekspresi di dalam kurung for, sehingga semua informasi pengontrol tersedia di dalam satu pernyataan.

Pointer


Pointer


Pointer adalah suatu variabel yang mempunyai harga alamat dari variabel lain atau elemen array. Pointer banyak digunakan dalam pemrograman C++, misalkan untuk mengirimkan informasi dari dan ke fungsi. Terutama pointer sangat berguna untuk mengirimkan data yang terdiri lebih dari satu harga dari dan ke fungsi. Untuk memahami pointer kita perlu pengetahuan tentang bagaimana komputer menyimpan informasi di dalam memori. Memori di dalam PC yang dikenal sebagai RAM (Random Access Memory) terdiri dari sederetan sel memori dan setiap sel memori mempunyai alamat tersendiri.

Sewaktu kita mendefinisikan variabel, C++ akan memberikan sel memori dengan address tertentu yang tak terpakai untuk menyimpan variabel itu. Bila program kita menggunakan nama variabel tersebut, otomatis akan menggunakan alamat dari sel memori yang berhubungan dengan variabel tersebut. Suatu misal ketika kita mendefinisikan variabel lebar dengan harga awal 25 dan dimisalkan C++ memberikan alamat 1004 untuk variabel lebar, hal ini dapat digambarkan sebagai berikut :

Alamat Memori Variabel
1001
1002
1003
1004 25 lebar


Jika kita mengetahui alamat dari suatu variabel, maka kita dapat menciptakan variabel kedua yang menyimpan alamat dari variabel pertama. Misalkan kita mendefinisikan variabel kedua plebar yang menyimpan alamat dari variabel pertama lebar. Karena plebar memuat alamat dari lebar, ini berarti plebar menunjukkan lokasi penyimpanan di dalam memori. Dalam pergertian ini berarti plebar menunjuk ke lebar atau sebagai pointer ke lebar. Misalkan plebar mempunyai alamat 1001, hal ini dapat digambarkan sebagai berikut :

Alamat Memori Variabel
1001 1004 Plebar
1002
1003
1004 25 Lebar

Kesimpulan : suatu pointer adalah suatu variabel yang memuat atau menyimpan alamat dari variabel lain, termasuk elemen array.

Deklarasi Pointer
Variabel pointer sma seperti variabel yang lain harus dideklarasikan sebelum digunakan didalam program C++. Nama variabel pointer mengikutim atuaran yang sama seperti variabel lain. Variabel pointer dideklarasikan dengan membubuhi tanda asteriks ( * ) didepan nama variabel pointer. Tipe data yang dituliskan pada deklarasi pointer menunjukkan tipe data dari data yang alamatnya disimpan di dalam pointer dan bukan tipe data dari pointer itu sendiri. Bentuk umum deklarasi variabel pointer adalah :
tipe data *variabel_pointer ;

Berikut ini beberapa contoh deklarasi pointer :

int *radius; atau int * radius; atau int* radius;
float *volume; atau float * volume; atau float* volume;

Operator Alamat ( & )
Dari gambar penjelasan sebelumnya, alamat dari lokasi memori variabel lebar dapat ditentukan dengan ekspresi &lebar, dimana & adalah operator unary yang disebut juga sebagai operator alamat. Disini &lebar adalah alamat dari variabel lebar yaitu 1004. Jadi plebar adalah sama dengan &lebar.

Operator Dereferensi ( * )
Data yang disimpan di dalam variabel lebar dari penjelasan sebelumnya, dapat dibaca dari variabel pointer plebar dengan menggunakan ekspresi *plebar, dimana tanda asterik ( * ) adalah operator unary, yang disebut operator dereferensi. Operator dereferensi ( * ) ini hanya digunakan untuk variabel pointer. Jadi *plebar dan lebar adalah sama, yakni menunjukkan harga variabel lebar 25.

Contoh 8.1 :

#include
#include

void main()
{
int panjang, lebar, luas;
int *p_panjang, *p_lebar, *p_luas;

p_panjang = &panjang;
p_lebar = &lebar;
p_luas = &luas;

cout << "Panjang : "; cin >> panjang;
cout << "Lebar : "; cin >> lebar;

luas = panjang * lebar;

cout << endl << endl;
cout << "Data yang diinputkan ke panjang : " << panjang <<
endl;
cout << "Data yang diinputkan ke lebar : " << lebar << endl;
cout << "Data yang dihasilkan oleh luas : " << luas << endl
<< endl;
cout << "Data yang disimpan oleh *p_panjang : " << *p_panjang
<< endl;
cout << "Data yang disimpan oleh *p_lebar : " << *p_lebar <<
endl;
cout << "Data yang disimpan oleh *p_luas : " << *p_luas <<
endl << endl;
cout << "Data alamat variabel panjang : " << &panjang << endl;
cout << "Data alamat variabel lebar : " << &lebar << endl;
cout << "Data alamat variabel luas : " << &luas << endl <<
endl;
cout << "Data alamat variabel p_panjang : " << p_panjang <<
endl;
cout << "Data alamat variabel p_lebar : " << p_lebar <<
endl;
cout << "Data alamat variabel p_luas : " << p_luas << endl
<< endl;
getch();
}

Keluaran programnya :

Panjang : 8
Lebar : 6

Data yang diinputkan ke panjang : 8
Data yang diinputkan ke lebar : 6
Data yang dihasilkan oleh luas : 48

Data yang disimpan oleh *p_panjang : 8
Data yang disimpan oleh *p_lebar : 6
Data yang disimpan oleh *p_luas : 48


Data alamat variabel panjang : 0x8f5efff4
Data alamat variabel lebar : 0x8f5efff2
Data alamat variabel luas : 0x8f5efff0

Data alamat variabel p_panjang : 0x8f5efff4
Data alamat variabel p_lebar : 0x8f5efff2
Data alamat variabel p_luas : 0x8f5efff0

Perhatikan bahwa p_panjang adalah pointer ke variabel panjang, p_lebar adalah pointer ke variabel lebar dan p_luas adalah pointer ke variabel luas. Isi dari p_panjang adalah alamat dari variabel panjang, isi dari p_lebar adalah alamat dari variabel lebar dan isi dari p_luas adalah alamat dari variabel luas.

Mengirimkan Pointer ke Fungsi
Pointer sering digunakan sebagai argumen dari suatu fungsi. Hal ini memungkinkan pertukaran informasi atau data dari fungsi yang satu ke fungsi yang lain. Bila digunakan pointer, maka alamat dari variabel dikirimkan ke fungsi, sedangkan bila digunakan variabel biasa, maka informasi atau data disalin ke fungsi yang dipanggil.

Jadi perubahan suatu data di dalam fungsi tidak berpengaruh terhadap fungsi lain, karena yang diubah hanyalah salinan dari informasi atau data. Bila yang dikirimkan adalah alamat dari suatu variabel pointer, maka perubahan harga dari variabel yang alamatnya dikirimkan tersebut akan berpengaruh terhadap fungsi lain yang menggunakan alamat tersebut.

Contoh 8.2 :

#include
#include

void input_data (float *pr1, float *pr2, float *pr3, float *pi);
void hitung_data (float *pr1, float *pr2, float *pr3,
float *pi,float *prs, float *prp, float *pvs, float *pvp);
void tampilkan (float *prs, float *prp, float *pi, float *pvs,
float *pvp);
void main()
{
float i, r1, r2, r3;
float rs, rp, vs, vp;
float *pi, *pr1, *pr2, *pr3;
float *prs, *prp, *pvs, *pvp;
clrscr();

input_data (&r1, &r2, &r3, &i);
hitung_data (&r1, &r2, &r3, &i, &rs, &rp, &vs, &vp);
tampilkan (&rs, &rp, &i, &vs, &vp);
getch();
}

void input_data (float *pr1, float *pr2, float *pr3, float *pi)
{
cout << "Masukkan Data Tegangan dan Arusnya :" << endl;
cout << "Data R1 : ";
cin >> *pr1;
cout << "Data R2 : ";
cin >> *pr2;
cout << "Data R3 : ";
cin >> *pr3;
cout << "Data i : ";
cin >> *pi;
cout << endl;
}

void hitung_data (float *pr1, float *pr2, float *pr3, float *pi, float *prs, float *prp, float *pvs, float *pvp)
{
float paralel;

*prs = *pr1 + *pr2 + *pr3;
paralel = (1 / *pr1)+(1 / *pr2)+(1 / *pr3);
*prp = 1/paralel;
*pvs = *pi * *prs;
*pvp = *pi * *prp;
}

void tampilkan (float *prs, float *prp, float *pi, float *pvs,
float *pvp)
{
cout.precision(2);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout << "Data total hambatan dan tegangan (seri/paralel) serta
arusnya :" << endl;
cout << "Total hambatan seri (Rs) : " << *prs << endl;
cout << "Total hambatan paralel (Rp) : " << *prp << endl;
cout << "Arus yang melaluinya (i) : " << *pi << endl;
cout << "Tegangan Seri (Vs) : " << *pvs << endl;
cout << "Tegangan paralel (Vp) : " << *pvp << endl;
}

Keluaran programnya :

Masukkan Data Tegangan dan Arusnya :
Data R1 : 1.5
Data R2 : 3.7
Data R3 : 6.3
Data i : 0.45

Data total hambatan dan tegangan (seri/paralel) serta arusnya :
Total hambatan seri (Rs) : 11.50
Total hambatan paralel (Rp) : 0.91
Arus yang melaluinya (i) : 0.45
Tegangan Seri (Vs) : 5.17
Tegangan paralel (Vp) : 0.41

Pada Contoh 8.2 fungsi main hanya berfungsi sebagai pengendali terhadap tiga fungsi buatan yaitu input_data, hitung_data dan tampilkan. Ketiga fungsi tersebut memiliki parameter formal berupa pointer yang mengambil dan mengirimkan nilai dari alamat yang diberikan oleh parameter aktual yang ada di fungsi main.

Pada fungsi input_data terdapat variabel pointer yang nantinya akan menerima data yang diinput dari keyboard. Karena fungsi main memanggil fungsi input_data dengan alamat maka nilai atau data yang ada pada fungsi tersebut bisa diakses oleh fungsi main. Dengan demikian fungsi main sekarang memiliki nilai atau data r1, r2, r3 dan i yang sama dengan nilai atau data yang ada di fungsi input_data.

Selanjutnya fungsi main memanggil fungsi hitung_data agar menghitung jumlah hambatan dan tegangan seri-paralel. Fungsi hitung_data akan mengerjakan proses tersebut sesuai dengan nilai r1, r2, r3 dan i yang dikirimkan oleh fungsi main dan juga mengembalikan hasilnya rs, rp, vs dan vp kepada fungsi tersebut.

Sedangkan fungsi tampilkan yang dipanggil oleh fungsi main akan menampilkan nilai yang didapat oleh fungsi main dari fungsi input_data yaitu : i dan fungsi hitung_data yaitu : rs, rp, vs dan vp.

Contoh 8.3 :
Program berikut ini adalah modifikasi dari contoh program sebelumnya yaitu dengan menghilangkan fungsi tampilkan dan isi program fungsi tersebut diletakan pada fungsi main.

#include
#include

void input_data (float *pr1, float *pr2, float *pr3, float *pi);
void hitung_data (float *pr1, float *pr2, float *pr3,
float *pi,float *prs, float *prp, float *pvs, float *pvp);

void main()
{
float i, r1, r2, r3;
float rs, rp, vs, vp;
float *pi, *pr1, *pr2, *pr3;
float *prs, *prp, *pvs, *pvp;
clrscr();

prs = &rs;
prp = &rp;
pi = &i;
pvs = &vs;
pvp = &vp;

input_data (&r1, &r2, &r3, &i);
hitung_data (&r1, &r2, &r3, &i, &rs, &rp, &vs, &vp);
cout.precision(2);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout << "Data total hambatan dan tegangan (seri/paralel) serta
arusnya :" << endl;
cout << "Total hambatan seri (Rs) : " << *prs << endl;
cout << "Total hambatan paralel (Rp) : " << *prp << endl;
cout << "Arus yang melaluinya (i) : " << *pi << endl;
cout << "Tegangan Seri (Vs) : " << *pvs << endl;
cout << "Tegangan paralel (Vp) : " << *pvp << endl;
getch();
}

void input_data (float *pr1, float *pr2, float *pr3, float *pi)
{
cout << "Masukkan Data Tegangan dan Arusnya :" << endl;
cout << "Data R1 : ";
cin >> *pr1;
cout << "Data R2 : ";
cin >> *pr2;
cout << "Data R3 : ";
cin >> *pr3;
cout << "Data i : ";
cin >> *pi;
cout << endl;
}

void hitung_data (float *pr1, float *pr2, float *pr3, float *pi,
float *prs, float *prp, float *pvs, float *pvp)
{
float paralel;

*prs = *pr1 + *pr2 + *pr3;
paralel = (1 / *pr1)+(1 / *pr2)+(1 / *pr3);
*prp = 1/paralel;
*pvs = *pi * *prs;
*pvp = *pi * *prp;
}

Keluaran programnya :

Masukkan Data Tegangan dan Arusnya :
Data R1 : 1.5
Data R2 : 3.7
Data R3 : 6.3
Data i : 0.45

Data total hambatan dan tegangan (seri/paralel) serta arusnya :
Total hambatan seri (Rs) : 11.50
Total hambatan paralel (Rp) : 0.91
Arus yang melaluinya (i) : 0.45
Tegangan Seri (Vs) : 5.17
Tegangan paralel (Vp) : 0.41

Pada contoh program diatas hampir sama dengan contoh program sebelumnya yaitu dengan menambahkan pernyataan prs = &rs, prp = &rp, pi = &i, pvs = &vs dan pvp = &vp sebagai penunjuk alamat bagi variabel pointer *prs, *prp, *pvs, *pvp dan *pi yang akan menampilkan nilainya.

Dengan demikian dari contoh program 8.2 dan 8.3 diperoleh kesimpulan bahwa pengiriman nilai melalui fungsi dengan menggunakan pointer maka perubahan nilai atau data yang terjadi pada fungsi tersebut akan berpengaruh terhadap fungsi lainnya.

Array dan Pointer
Hingga saat ini array dianggap sebagai daftar nilai. Ini merupakan pengertian array secara konsep. Secara internal nama array adalah pointer ke elemen pertama dalam array. Sewaktu kita mendefinisikan array seperti ini :

int umur[] = { 32, 45, 42, 19, 67 }

Misalkan ingin menampilkan elemen pertama dan kedua array tersebut.

cout << “Nilai elemen kesatu : “ << umur[0];
cout << “Nilai elemen kedua : “ << umur[1];

Berikut ini juga akan menampilkan nilai elemen pertama dan kedua dengan menggunakan pointer.

cout << “Nilai elemen kesatu : “ << *(umur + 0);
cout << “Nilai elemen kedua : “ << *(umur + 1);

Kedua pernyataan cout tersebut akan menghasilkan nilai yang sama yaitu angka 32 dan 45. Perhatikan bahwa bentuk berikut ini adalah ekuivalen :

umur[3], *(umur + 3), *(umur + 0)[3], *(umur + 1)[2], *(umur + 2)[1] dan *(umur + 3)[0]

Contoh 8.4 :

#include
#include

void main()
{
int i;
float nilai[3] = { 11.1, 22.2, 33.3 };
clrscr();

cout.precision(1);
cout.setf(ios::showpoint);
cout.setf(ios::fixed);

cout << "Bentuk array yang menggunakan subscript :" << endl;
for (i = 0; i < 3; i++)
{ cout << nilai[i] << ' '; }

cout << endl << endl;
cout << "Bentuk array yang menggunakan pointer:" << endl;
for (i = 0; i < 3; i++)
{ cout << *(nilai + i) << ' '; }

cout << endl << endl;
cout << "Bentuk array kombinasi:" << endl;
cout << (nilai + 0)[0] << ' ';
cout << (nilai + 1)[0] << ' ';
cout << (nilai + 0)[1] << ' ';
cout << (nilai + 1)[1] << ' ';
cout << (nilai + 2)[1] << ' ';
cout << (nilai + 1)[2] << ' ';
getch();
}

Keluaran programnya :

Bentuk array yang menggunakan subscript :
11.1 22.2 33.3

Bentuk array yang menggunakan pointers:
11.1 22.2 33.3

Bentuk array kombinasi:
11.1 22.2 22.2 33.3 33.3 33.3

Array Pointer
Anda dapat mendefenisikan sebuah array yang menampung tipe data apa saja, termasuk pointer. Berikut merupakan cara menginisialisasi array semacam itu :

char *kota[5] = { “Jakarta”, “Bandung”, “Semarang” };

Ingatlah bahwa C++ memperlakukan literal string sebagai sebuah alamat. Dengan kata lain C++ menyimpan tiga nama kota pada suatu tempat dalam memori yang bebas. Kemudian C++ menugaskan alamat masing-masing literal string itu ke masing-masing elemen array kota.

Contoh 8.5 :

#include
#include

void main()
{
int i;
clrscr();

char *kota[5] = { "Jakarta", "Bandung", "Semarang" };

//Menampilkan tiga nama kota yang diisikan pada program
cout << "Berikut ini adalah kota tersebut"<< endl;
for (i = 0; i < 3; i++)
{ cout << kota[i] << “, “; }
cout << endl;

//Mengganti nama kota diatas dengan yang lainnya
kota[0] = "Yogyakarta";
kota[1] = "Surabaya";
kota[2] = "Bali";

//Menampilkan nama kota dengan notasi pointer
cout << endl << "Berikut ini adalah kota tersebut" << endl;
for (i = 0; i < 3; i++)
{ cout << *(kota + i) << “, “; }
cout << endl;
getch();
}
Keluaran programnya :

Berikut ini adalah kota tersebut
Jakarta, Bandung, Semarang,

Berikut ini adalah kota tersebut
Yogyakarta, Surabaya, Bali,

Setelah menugaskan pointer ke nama-nama kota, loop for pertama pada contoh program diatas akan menampilkan 3 kota menggunakan notasi subscribt. Kemudian variabel kota diisikan dengan data string yang baru melalui masing-masing elemen array. Fungsi strcpy() tidak akan berkerja dengan baik pada penugasan kalau literal string baru lebih panjang daripada string yang akan ditunjuk. Loop for kedua menampilkan nama ketiga kota yang baru memakai dereferensi pointer.

Contoh 8.6 :

#include
#include
#include

void menu_tampilan();
int informasi();
void tampilan_properti(char *kode[], float harga[],
char *alamat[], float komisi[]);
void pencarian_properti(char *kode[], float harga[],
char *alamat[], float komisi[]);

void main()
{
int hasil;
char *kode[3] = { "11A", "22B", "33C" };
float harga[3] = { 15000, 25000, 50000};
char *alamat[3] = { "Jl. Akses UI Depok 12264",
"Jl. Pondok Indah Jakarta 12223",
"Jl. Ciputat Raya Jakarta 12241" };
float komisi[3] = { 0.15, 0.20, 0.30 };
clrscr();

do
{
clrscr();
menu_tampilan();
hasil = informasi();

switch (hasil)
{
case (1) :
{ tampilan_properti(kode, harga, alamat, komisi);
break; }
case (2) :
{ pencarian_properti(kode, harga, alamat, komisi);
break; }
case (3) :
{ return;
break; }
}
} while (hasil != 3);
}
void menu_tampilan()
{
cout << endl << endl;
cout << "** Property Menu Database **" << endl << endl;
cout << "Menu yang bisa dipilih:" << endl << endl;
cout << "1. Melihat data properti" << endl;
cout << "2. Mencari data dengan indeks kode" << endl;
cout << "3. Keluar program" << endl;
cout << endl << "Anda memilih menu (1/2/3) ? ";
}

int informasi()
{
int pilih;
cin >> pilih;
cin.ignore(30,'\n');
return (pilih);
}

void tampilan_properti(char *kode[], float harga[],
char *alamat[], float komisi[])
{
int i;

cout.precision(2);
cout.setf(ios::showpoint);
cout.setf(ios::fixed);

for (i = 0; i < 3; i++)
{
cout << endl ;
cout << "Kode : " << kode[i] << endl;
cout << "Harga : Rp " << harga[i] << endl;
cout << "Alamat : " << alamat[i] << endl;
cout << "Persen komisi : "<< komisi[i] * 100.0 << "%"
<< endl << endl;
}
cout << "Tekan tombol enter untuk lanjut...";
cin.ignore(30,'\n');
}

void pencarian_properti(char *kode[], float harga[],
char *alamat[], float komisi[])
{
int i;
int ketemu = 0;
char buf[6];

cout.precision(2);
cout.setf(ios::showpoint);
cout.setf(ios::fixed);

cout << endl << "Saya akan mencari data yang kita inginkan"
<< endl;
cout << "Tuliskan kode properti dari data yang diinginkan : ";
cin.getline(buf, 6);
for (i = 0; i < 3; i++)
{
if (!strcmp(kode[i], buf))
{
cout << endl ;
cout << "Kode : " << kode[i] << endl;
cout << "Harga : Rp " << harga[i] << endl;
cout << "Alamat : " << alamat[i] << endl;
cout << "Persen komisi : " << komisi[i]*100.0 << "%"
<< endl << endl;
ketemu = 1;
cout << "Tekan sembarang tombol untuk kembali ke
menu......" << endl;
getch();
break;
}
}

if (!ketemu)
{
cout << endl << "Data dengan kode : " << buf << " tidak
ditemukan" << endl << endl;
cout << "Tekan sembarang tombol untuk kembali ke
menu......" << endl;
getch();
}
}

Keluaran programnya :

** Property Menu Database **

Menu yang bisa dipilih:

1. Melihat data properti
2. Mencari data dengan indeks kode
3. Keluar program

Anda memilih menu (1/2/3) ? 1

Kode : 11A
Harga : Rp 15000.00
Alamat : Jl. Akses UI Depok 12264
Persen komisi : 15.00%

Kode : 22B
Harga : Rp 25000.00
Alamat : Jl. Pondok Indah Jakarta 12223
Persen komisi : 20.00%

Kode : 33C
Harga : Rp 50000.00
Alamat : Jl. Ciputat Raya Jakarta 12241
Persen komisi : 30.00%

Tekan tombol enter untuk lanjut...

Pada contoh program diatas dengan menggunakan variabel pointer, maka kita dapat mengakses data dengan alamatnya dan bukan melalui nama variabel. Prototipe string.h digunakan untuk fungsi strcmp (membandingkan isi string). Empat fungsi yang dideklarasikan diatas, dua fungsi tanpa parameter dan dua lagi menggunakan parameter.

Variabel kode dan alamat pada parameter fungsi tampilan_properti serta pencarian_properti dideklarasikan sebagai array pointer agar dapat menangani data yang berisi string. Pada fungsi main variabel kode, harga, alamat dan komisi diisikan langsung pada kode program. Untuk memilih menu dilakukan dengan menggunakan pernyataan do-while yang mana pernyataan ini akan selalu berulang-ulang apabila kita memberikan nilai tidak sama dengan 3. Sedangkan untuk mengakhiri tampilan menu ini kita dapat memberikan input dengan menekan tombol angka 3.

Didalam pernyataan do-while, untuk memilih menu yang memanggil salah satu fungsi digunakan pernyataan switch(). Jadi pemanggilan fungsi yang dilakukan didalam pernyataan switch() membuat agar fungsi-fungsi tersebut tidak harus dijalankan secara serentak seperti pada contoh program 8.2 tetapi hanya fungsi yang ditunjuk oleh pernyataan switch() yang akan bekerja. Fungsi menu_tampilan berfungsi sebagai tampilan yang memandu kita untuk bisa melanjutkan proses berikutnya apabila kita mengisikan data yang sesuai dengan keterangan yang diberikan dalam menu tersebut. Fungsi ini akan dijalankan pertama kali oleh fungsi main yang terdapat pada pernyataan do-while.

Fungsi informasi berfungsi sebagai kelanjutan proses berikutnya yaitu menuju salah satu case yang sesuai pada pernyataan switch(). Pada fungsi ini pilihan angka yang tersedia agar dapat menuju salah satu case yang terdapat pada fungsi switch() adalah 1, 2 dan 3. Bila kita menginputkan dengan menekan tombol angka 1, 2 atau 3 maka data tersebut disimpan kedalam variabel hasil yang mana data tersebut dikembalikan ke fungsi pemanggil yaitu fungsi main menggunakan pernyataan return.

Jadi fungsi informasi mengembalikan nilai yang disimpannya untuk diisikan ke dalam pernyataan pemanggil fungsi pada variabel hasil dan nilai yang ada pada variabel ini selanjutnya akan menuju ke case yang cocok. Kalau cocok maka akan memanggil salah satu fungsi yang berada pada case tersebut. Bila tidak maka pernyataan yang ada didalam do-while akan diulang kembali. Pernyataan cin.ignore (30. ‘\n’) berfungsi sebagai penunggu tombol yang akan ditekan oleh pemakai. Sedangkan pernyataan break berfungsi sebagai pencegah agar C++ tidak mengeksekusi kode program berikutnya.

Fungsi tampilan_properti berfungsi menampilkan data-data yang sudah diisikan pada kode program yang berada di fungsi main. Perhatikan bahwa parameter yang ada di fungsi ini kebetulan namanya dibuat sama dengan parameter yang ada di pernyataan pemanggil fungsi. Pemanggilan fungsi disini sebenarnya hanya melewatkan nilai bukan dengan referensi atau pointer. Sedangkan parameter yang terlihat pada fungsi tampilan_properti atau pencarian_properti bertanda asterik (*) adalah data yang dilewatkan berupa string. Anda tak dapat melewatkan data string pada variabel array biasa, jadi variabel berjenis array pointer-lah yang harus kita gunakan.

Fungsi pencarian_properti berfungsi sebagai fungsi yang menangani proses pencarian sekelompok data pada elemen array yang berbeda tetapi bernomor indeks sama. Melalui peryataan strcmp() inilah maka variabel buf yang diinputkan berupa kode akan dibandingkan dengan kode yang tersimpan pada setiap elemen array.Bila hasil dari pernyataan strcmp() ini sesuai yaitu string pada variabel buf sama dengan string kode[i] maka pernyataan ini akan dijalankan dan akan menampilkan data yang ada di elemen array yang sama pada variabel yang berbeda. Bila data string yang dibandingkan tadi berbeda atau tidak ada yang cocok maka akan menjalankan pernyataan berikutnya yaitu if ( !ketemu ) maksudnya jika tidak ketemu bernilai benar maka peryataan inilah yang akan dieksekusi.

Array


Array

Suatu array adalah suatu identifier yang mewakili sekelompok data yang mempunyai nama sama. Setiap data harus mempunyai tipe data yang sama (misalkan semua integer atau semua float). Setiap elemen array dibedakan dari yang lain dengan menggunakan nama array yang diikuti dengan subscript. Subscript array dalam C/C++ selalu dimulai dari nol, bukan satu.

Setiap subscript diletakan diantara tanda kurung siku ([]). Subscript sering disebut juga index. Harga dari setiap subscript dapat berupa suatu konstanta integer, variabel integer atau suatu expression. Banyaknya subscript menentukan dimensi dari array contoh array a[15] adalah array satu dimensi, b[3][5] adalah array dua dimensi dan c[4][2][5] adalah array tiga dimensi.

Bentuk umum dari array :

data_type nama_array [expression-1]... ... [expression-n];

untuk array kita hanya boleh menggunakan storage class automatic, external dan static sedangkan storage class register tidak bisa digunakan untuk array, karena array memerlukan jumlah memori yang besar sementara jumlah register pada CPU terbatas. Bila storage class tidak dituliskan, maka array dianggap mempunyai storage class automatic untuk array yang diletakan di dalam fungsi dan mempunyai storage class external untuk array yang diletakan di luar fungsi.

Berikut ini diberikan contoh mendefinisikan sebuah array charakter :

char nama[5];

Kita juga dapat menginisialisasi sebuah array langsung pada saat kita mendefinisikannya :

char nama[5] = “Budi”;

Sintaks C++ untuk menginisialisasi string pada array karakter pada definisi char nama[5] tak dapat diterapkan pada array numeris. Sedangkan pada akhir karakter akan terdapat null untuk mengakhiri string tersebut hanyalah berlaku pada data berjenis string. Berikut ini adalah cara menginisialisasi nama[5] satu persatu tiap elemen :

char nama[5] = { ‘B’,‘u’,’d’,’i’,’\0’ };

Pendefinisian ini identik dengan yang sebelumnya. C++ secara otomatis akan menambahkan nol untuk pengakhir dibelakang sebuah string pada saat kita memasukan sebuah nilai awal string. Bila kita mendefinisikan dan menginisialisasi sebuah array pada saat bersamaan, kita tak perlu menyertakan subscript awalnya. Definisi ini identik dengan sebelumnya :

char nama[] = { ‘B’, ‘u’, ‘d’, ‘i’, ‘\0’ };

C++ akan menghitung jumlah elemennya untuk kita. Bila kita memesan array lima elemen di C++, maka jangan kita memasukan enam atau lebih dari 5 pada array. Bila hal ini kita lakukan maka akan menimpa memori yang mungkin berisi variabel lain. Berikut ini contoh definisi array numerik :
int nilai[5] = { 15, 25, 35, 45, 55 };

Statemen ini memberi harga :
nilai[0]=15, nilai[1]=25, nilai[2]=35, nilai[3]=45, nilai[4]=55

Berikut ini akan diberikan contoh pemberian harga awal untuk array dengan dimensi lebih dari satu :

int matrik[2][3] = { 1, 7, 5, -2, 3, -4 };

Array matrik[2][3] adalah array dua dimensi. Hasil dari pemberian harga awal ini adalah:

matrik[0][0]=1
matrik[0][1]=7
matrik[0][2]=5
matrik[1][0]=-2
matrik[1][1]=3
matrik[1][2]=-4

Bila digunakan tanda kurung kurawal ({ }) tambahan untuk mengelompokan elemen-elemen dari harga awal dari array, maka pemberian harga awal array matrik[2][3] diatas dapat dituliskan sebagai berikut :

int matrik[2][3] = {{1, 7, 5}, {-2, 3, -4}};

hasil dari pemberian harga awal array matrik[2][3] ini sama seperti contoh sebelumnya.

Contoh 7.1 :
Program berikut ini akan menampilkan data yang tersimpan pada sebuah variabel bukan array :

#include
#include

void main()
{
int n;
float data;
clrscr();

cout << "Banyaknya data : ";
cin >> n;

cout << endl << "Pada bagian ini adalah data yang kita ketikan"
<< endl;
for ( int i=0; i
{
cout << "Data ke-" << i << " : ";
cin >> data;
}

cout << endl;
cout << "Berikut ini adalah data yang tersimpan di variabel
bukan array" << endl;
for ( i=0; i
{
cout << "Nilai ke-" << i << " : " << data << endl;
}
getch();
}

Keluaran programnya :

Banyaknya data : 3

Pada bagian ini adalah data yang kita ketikan
Data ke-0 : 1000
Data ke-1 : 2000
Data ke-2 : 3000

Berikut ini adalah data yang tersimpan di variabel bukan array
Nilai ke-0 : 3000
Nilai ke-1 : 3000
Nilai ke-2 : 3000

Bandingkan program Contoh 7.1 dengan Contoh 7.2 berikut ini :

Contoh 7.2 :
Program berikut ini akan menampilkan data yang tersimpan pada sebuah variabel array :

#include
#include

void main()
{
int n;
float data[100];
clrscr();

cout << "Banyaknya data : ";
cin >> n;

cout << endl << "Pada bagian ini adalah data yang kita ketikan"
<< endl;
for ( int i=0; i
{
cout << "Data ke-" << i << " : ";
cin >> data[i];
}

cout << endl;
cout << "Berikut ini adalah data yang tersimpan di variabel
array" << endl;
for ( i=0; i
{
cout << "Nilai ke-" << i << " : " << data[i] << endl;
}
getch();
}

Keluaran programnya :

Banyaknya data : 3

Pada bagian ini adalah data yang kita ketikan
Data ke-0 : 1000
Data ke-1 : 2000
Data ke-2 : 3000

Berikut ini adalah data yang tersimpan di variabel array
Nilai ke-0 : 1000
Nilai ke-1 : 2000
Nilai ke-2 : 3000

Dari program Contoh 7.1 dan Contoh 7.2 terlihat bahwa data yang tersimpan di variabel bukan array ketika diisikan dengan nilai maka nilai yang tersimpan adalah nilai yang terakhir. Sedangkan variabel berjenis array, datanya tersimpan dalam setiap elemen sehingga ketika diisikan dengan nilai maka nilai tersebut tersimpan sesuai dengan nilai yang diisikannya.

Array dan Fungsi
Suatu array dapat digunakan sebagai argumen terhadap suatu fungsi. Hal ini memungkinkan seluruh array dikirim ke fungsi. Untuk mengirim suatu array ke suatu fungsi, nama (parameter aktual) dari array tersebut harus dituliskan tanpa tanda kurung siku ( [] ) atau subscript sebagai argumen untuk memanggil fungsi itu.
Parameter formal yang berbentuk array di dalam definisi fungsi cukup dituliskan nama array diikuti tanda kurung siku kosong ( [] ). Berikut ini merupakan contoh fungsi yang menggunakan nama array.

Contoh 7.3 :

#include
#include

const int maks = 5;
int maksimum (int x[], int y);

void main()
{
int n, data[maks], hasil;
clrscr();

cout << "Banyaknya data yang kita inginkan : ";
cin >> n;
for (int i=0; i
{
cout << "Masukan bilangan bulat ke[" << i+1 << "] : ";
cin >> data[i];
}

hasil = maksimum (data, n);

cout << endl << "Nilai terbesarnya adalah : " << hasil << endl;
getch();
}

int maksimum (int x[], int y)
{
int besar=-32000;
for (int j=0; j
{
if ( x[j] > besar )
{ besar = x[j]; }
}
return besar;
}

Keluaran programnya :

Banyaknya data yang kita inginkan : 5
Masukan bilangan bulat ke[1] : 6
Masukan bilangan bulat ke[2] : -10
Masukan bilangan bulat ke[3] : 2
Masukan bilangan bulat ke[4] : -1
Masukan bilangan bulat ke[5] : 4

Nilai terbesarnya adalah : 6


Perhatikan cara penulisan argumen yang berbentuk array untuk memanggil fungsi maksimum() di dalam main() :

hasil = maksimum (data, n);

dan penulisan definisi fungsi yang menggunakan argumen berbentuk array :

int maksimum (int x[], int y)

data adalah array data [maks] yang merupakan parameter aktual untuk memanggil fungsi maksimum(). Meskipun berbentuk array, data[maks] hanya dituliskan nama saja tanpa subscript atau tanda kurung siku ( [] ). Sedangkan x[] adalah array yang digunakan sebagai parameter formal dari definisi fungsi maksimum(). Meskipun berbentuk array, x[] hanya dituliskan namanya saja diikuti tanda kurung siku kosong ([]), bila digunakan sebagai argumen untuk mendefinisikan fungsi.

Contoh 7.4 :

#include
#include

void input_data ( int &n, float &total, float data[]);
void hitung_data (int n, float total, float &rerata);
void tampilkan (int n, float data[], float rerata);

void main()
{
int banyak;
float suhu[100], jumlah, rata_rata;
clrscr();

input_data (banyak, jumlah, suhu);
hitung_data (banyak, jumlah, rata_rata);
tampilkan (banyak, suhu, rata_rata);

getch();
}

void input_data ( int &n, float &total, float data[])
{
int i=0;
cout << "Berapa data yang kita inginkan : ";
cin >> n;
while ( i
{
cout << "Data ke[" << i+1 << "] : ";
cin >> data[i];
total += data[i];
i++;
}
}

void hitung_data (int n, float total, float &rerata)
{
rerata=total/n;
}

void tampilkan (int n, float data[], float rerata)
{
clrscr();
cout.precision(2);
cout.setf(ios::fixed);
cout.setf(ios::showpoint);
for (int i=0; i
{
cout << "Data temperatur hari ke[" << i+1 << "] : "
<< data[i] << endl;
}
cout << "Rata-rata temperatur selama " << n
<< " hari adalah : " << rerata << endl << endl;
}

Keluaran programnya :

Berapa data yang kita inginkan : 3
Data ke[1] : 26
Data ke[2] : 28
Data ke[3] : 31

Tekan tombol enter setelah memasukan data yang terakhir sehingga muncul :

Data temperatur hari ke[1] : 26.00
Data temperatur hari ke[2] : 28.00
Data temperatur hari ke[3] : 31.00
Rata-rata temperatur selama 3 hari adalah : 28.33

Contoh program diatas adalah menggunakan array yang dilewatkan ke fungsi. Supaya memudahkan perpindahan data antar fungsi maka digunakan pemanggilan fungsi dengan referensi, hal ini dimaksudkan agar data yang mengalami perubahan di sebuah fungsi berdampak pada fungsi yang lainnya.

Kita tak akan bisa memprogram seperti ini tanpa menggunakan array. Array memberi kita kemungkinan untuk mengambil semua data kita dengan menggunakan sebuah pengulangan yang bisa kita lihat pada fungsi diatas yaitu fungsi tampilkan() yang memuat sebuah pernyataan pengulangan (loop) for dan memproses semua data tadi sekaligus.

Fungsi main() adalah sebagai pengendali, yaitu memanggil fungsi input_data(), hitung_data() dan tampilkan().