Class C++

Class C++
Pengertian Class C++
Kelas adalah salah satu abstraksi (pemodelan) data atau disebut juga
abstract data type. Konstruksi kelas adalah sebagai berikut :




class nama-kelas {
// bagian public
public :
// bagian private
private :
// bagian protected
protected :
};
Biasanya, data termasuk pada bagian private (information hiding), sedangkan
method (fungsi) berada pada bagian public. Pada bagian public inilah setiap objek
dari kelas tersebut dapat saling berkomunikasi lewat message passing (pertukaran
pesan). Method biasanya merupakan fungsi yang memanipulasi data dari kelas yang
bersangkutan.


Kelas CurrencyUntuk mempelajari kelas, kita gunakan kelas currency untuk contoh. Objek
dari setiap kelas currency ini akan mempunyai method sebagai berikut:
a. memberikan nilai ke objek
b. menentukan komponen (tanda, banyaknya dollar, maupun banyaknya sen)
c. menambah dua objek bertipe currency

d. menaikkan nilai
e. menampilkan output tipe currency
Di bawah ini diberikan konstruksi dari kelas tipe currency.
 

#include <iostream.h>
#include <stdlib.h>
#include "bool.h"
enum sign {plus, minus};
class Currency {
public:
Currency(sign s = plus, unsigned long d = 0, unsigned int c = 0);
~Currency() {}
bool Set(sign s, unsigned long d, unsigned int c);
bool Set(float a);
sign Sign() const {return sgn;}
unsigned long Dollars() const {return dollars;}
unsigned int Cents() const {return cents;}
Currency Add(const Currency& x) const;
Currency& Increment(const Currency& x);
void Output() const;
private:
sign sgn;
unsigned long dollars;
unsigned int cents;
};

Kelas Currency mempunyai 3 data member, yaitu sgn yang mempunyai
kemungkinan nilai plus atau minus, dollars untuk menyimpan nilai utuh dari pecahan
dollar dan cents untuk menyimpan nilai pecahan. Misalnya $1.25 akan disimpan
sebagai dollars = 1, dan cents = 25, sedangkan sgn bernilai plus.
Method Set digunakan untuk mengubah data member. Terdapat dua method
Set, yang pertama mempunyai 3 parameter yang langsung menspesifikasi setiap
data member. Sementara yang kedua bertipe float yang nantinya harus dipecah
menjadi 3 bagian seperti halnya 3 data member, yaitu tanda, bagian dollar dan
bagian sen.


Preprocessor (1), (2), dan diakhiri #endif digunakan untuk menjamin bahwa
kelas Currency hanya akan dikompilasi sekali. Isi dari bool.h adalah sebagai berikut :

 
 

#ifndef bool_
#define bool_
typedef int bool;
const bool false = 0;
const bool true = 1;
#endif

Tipe bool mempunyai dua alternatif harga yaitu false dan true. False untuk
menggantikan nilai 0, sedangkan true untuk menggantikan nilai 1.


Program 2.3. Konstruktor kelas Currency.
Currency::Currency(sign s, unsigned long d, unsigned int c)
{
if (c > 99)
{
cerr << "Cents should be < 100" << endl;
exit(1);}
sgn = s; dollars = d; cents = c;
}


Konstruktor Currency langsung dispesifikasi membentuk objek Currency yang
terdiri dari tanda, bagian dollar dan bagian sen. Khusus bagian sen, oleh karena 1
dollar sama dengan 100 sen maka harga c tidak boleh melebihi 99 (3), yang apabila
dilanggar akan memberikan sinyal error (5) dan keluar dari program (6).
Pembentukan objek dilakukan dengan meng-assign pada setiap data member (7),
berturut-turut s meng-assign sgn, d meng-assign dollars, dan c meng-assign cents.


 
Program 2.4. Memberikan harga pada objek dengan 3 komponen.
bool Currency::Set(sign s, unsigned long d, unsigned int c)
{
if (c > 99) return false;
sgn = s; dollars = d; cents = c;
return true;
}

Untuk mengubah data member, selain pada saat dibuat objeknya, kita dapat
mengubahnya dengan method Set yang perilakunya mirip dengan konstruktor
Currency. Hanya saja method Set ini akan mengembalikan nilai true jika berhasil
melakukan perubahan, false jika terjadi kesalahan, artinya data member tidak
diubah nilainya.


Program 2.5. Memberikan harga pada objek dengan tipe float dan
kemudian mengkonversinya ke bentuk komponen demi komponen.
bool Currency::Set(float a)
{
if (a < 0) {sgn = minus; a = -a;}
else sgn = plus;
dollars = a;
cents = (a + 0.001 - dollars) * 100;
return true;
}


Method Set dengan parameter bertipe float digunakan untuk mengubah data
member dengan memecah a menjadi unsur-unsur ketiga data member Currency.
Yang pertama, apakah a bernilai negatif atau positif. Jika negatif maka tanda sgn
akan diberi nilai minus (3), dan nilai a harus selalu berharga positif (a = -a). Jika
positif nilai sgn diberi nilai plus (4). Oleh karena dollars bertipe long (int) maka (5)
akan mengambil nilai integernya saja (menggunakan konversi nilai). Sementara (6)
mengambil nilai sen dengan cara nilai float a dikurangi dengan bagian integernya,
dan supaya bernilai bulat maka dikalikan dengan 100. Method ini selalu
mengembalikan nilai true (7).



Program 2.6. Method untuk menjumlahkan dua
objek bertipe currency
Currency Currency::Add(const Currency& x) const
{
long a1, a2, a3;
Currency ans;
a1 = dollars * 100 + cents;
if (sgn == minus) a1 = -a1;
a2 = x.dollars * 100 + x.cents;
if (x.sgn == minus) a2 = -a2;
a3 = a1 + a2;
if (a3 < 0) {ans.sgn = minus; a3 = -a3;}
else ans.sgn = plus;
ans.dollars = a3 / 100;
ans.cents = a3 - ans.dollars * 100;
return ans;
}

Method Add digunakan untuk menambahkan sebesar x pada suatu objek
Currency. Pertama, nilai objek dikonversikan menjadi sen dan disimpan pada a1 (5).
Kita hanya akan memperlakukan setiap nilai dengan harga aslinya (6). Kedua, x juga
dikonversi menjadi sen dan disimpan pada a2 (7). Harga a2 juga diambil harga
aslinya (8). Ketiga, kedua nilai tadi kemudian dijumlahkan (9) disimpan pada a3. Yang
perlu diingat adalah bahwa baik dollars maupun cents selalu berharga positif. Untuk
itu operasi penambahan maupun pengurangan sebenarnya menggunakan operasi
aritmetika biasa, sehingga kita perlu mengkonversi setiap objek dengan harga
aslinya. Misalnya sgn = minus, dollars = 3, dan cents = 25 berarti harga aslinya
adalah -3.25.
Langkah terakhir, nilai a3 dikembalikan menjadi bentuk objek, sgn diberi nilai
dan a3 menjadi harga mutlak (10). Nilai dollars diambil nilai integernya saja (12),
kemudian nilai cents diambil dengan cara nilai a3 dikurangi nilai integernya (13).
Harga ans dikembalikan sebagai hasil penambahan (14).
Method Add dapat dipandang sebagai operator + dalam halaman ini.

 
Program 2.7. Method untuk menaikkan nilai objek sebanyak x.
Currency& Currency::Increment(const Currency& x)
{
*this = Add(x);
return *this;
}

Method Increment menggunakan method Add untuk memanipulasi data
member (3). Hanya saja, nilai objek "ini" (dan bukan objek lain) yang bertambah
nilainya dengan x (4). Method Increment dapat dipandang sebagai operator +=.


Program 2.8. Method untuk mencetak objek bertipe
currency
void Currency::Output() const
{
if (sgn == minus) cout << '-';
cout << '$' << dollars << '.';
if (cents < 10) cout << "0";
cout << cents;
}

Method Output digunakan untuk mencetak objek Currency. Kitapun juga bisa
mengubahnya untuk mata uang yang lain.


Program 2.9. Main fungsi untuk menguji-coba kelas currency
#include <iostream.h>
#include "curr1.h"
void main(void)
{ Currency g, h(plus, 3, 50), i, j;
g.Set(minus, 2, 25);
i.Set(-6.45);
j = h.Add(g);
j.Output(); cout << endl;
i.Increment(h);
i.Output(); cout << endl;
j = i.Add(g).Add(h);
j.Output(); cout << endl;
j = i.Increment(g).Add(h);
j.Output(); cout << endl;
i.Output(); cout << endl;
}

Pada fungsi main dideklarasikan 4 objek Currency yaitu g, h, i, dan j (5).
Khusus objek h langsung diberi nilai awal $3.50. Objek g di-set bernilai -$2.25 (6).
Objek i di-set bernilai -$6.45 (7).
Objek j merupakan hasil penjumlahan dari h dan g, sehingga j bernilai $1.25
(8). Objek i ditambahkan nilainya dengan h menjadi -$2.95 (10). Kemudian objek j
merupakan hasil penjumlahan dari objek i, g dan h (12) menjadi bernilai -$1.70. Cara
lain operasi ini dengan menggunakan (14). Namun perbedaannya adalah nilai i
bertambah dengan g, sedangkan pada (12) nilai i tidak bertambah nilainya. Output
selengkapnya dari fungsi main di atas adalah sebagai berikut :


Di bawah ini diberikan tipe data abstrak yang berbeda untuk kelas currency.
 
Program 2.10. Versi 2 : Kelas Currency dengan menggunakan
representasi yang berbeda
enum sign {plus, minus};
class Currency {
public:
Currency(sign s = plus, unsigned long d = 0, unsigned int c = 0);
~Currency() {}
bool Set(sign s, unsigned long d, unsigned int c);
bool Set(float a);
sign Sign() const {if (amount < 0) return minus; else return plus;}
unsigned long Dollars() const
{if (amount < 0) return (-amount) / 100;
else return amount / 100;}
unsigned int Cents() const
{if (amount < 0) return -amount - Dollars() * 100;
else return amount - Dollars() * 100;}
Currency Add(const Currency& x) const;
Currency& Increment(const Currency& x)
{amount += x.amount; return *this;}
void Output() const;
private:
long amount;
};
      

Implementasi method dari kelas Currency di atas selengkapnya diberikan berikut
ini:



Program 2.11. Implementasi method kelas Currency versi 2
Currency::Currency(sign s, unsigned long d, unsigned int c)
{
if (c > 99)
{// too many cents
cerr << "Cents should be < 100" << endl;
exit(1);}
amount = d * 100 + c;
if (s == minus) amount = -amount;
}
bool Currency::Set(sign s, unsigned long d, unsigned int c)
{// Reset value.
if (c > 99) return false;
amount = d * 100 + c;
if (s == minus) amount = -amount;
return true;
}
bool Currency::Set(float a)
{
sign sgn;
if (a < 0) {sgn = minus; a = -a;}
else sgn = plus;
amount = (a + 0.001) * 100;
if (sgn == minus) amount = -amount;
return true;
}
Currency Currency::Add(const Currency& x) const
{
Currency y;
y.amount = amount + x.amount;
return y;
}
void Currency::Output() const
{
long a = amount;
if (a < 0) {
cout << '-';
a = -a;}
long d = a / 100;
cout << '$' << d << '.';
int c = a - d * 100;
if (c < 10) cout << "0";
cout << c;
}






 
Read More

Dua kali pemanggilan rekursi : Bilangan Fibonaci

Dua kali pemanggilan rekursi : Bilangan Fibonaci

Pada kasus-kasus sebelumnya, kita belajar tentang rekursif dengan satu dan
dua parameter. Kasus berikut ini melibatkan dua kali pemanggilan rekursif setiap
kali proses rekursif dilakukan.




Definisi :
Bilangan Fibonaci adalah bilangan berbentuk :
1, 1, 2, 3, 5, 8, 13, 21, ...
yaitu bilangan ke-n merupakan penjumlahan dari bilangan ke-(n-2) dan
bilangan ke-(n-1).
Bilangan fibonaci memang sejak awal sudah terdefinisi secara rekursif,
artinya suku ke-n baru bisa diketahui bila dua suku sebelumnya diketahui. Dengan
demikian implementasinya menjadi sederhana, yaitu mengikuti dari definisi di atas.


#include <iostream.h>
int fibonaci(int n)
{
if ((n==1) || (n==2)) return 1; // kasus basis
else
return fibonaci(n-1) + fibonaci(n-2); // pemanggilan rekursif
}
void main(void)
{
cout << "fibonaci suku ke-10 = " << fibonaci(10) << endl;
}


Macam-macam Metode Rekursi
Ada 3 macam rekursi yang lazim digunakan, yaitu :
1. rekursi menurun (going down recursion), artinya nilai dari parameter
berkurang mengarah ke kasus basis
2. rekursi menaik (going up recursion), artinya nilai dari parameter bertambah
mengarah ke kasus basis
3. rekursi dibagi separoh (two half recursion), artinya range atau jangkauan
dari parameternya dibagi menjadi dua bagian, setengah bagian pertama pada
pemanggilan pertama sedangkan setengah sisanya pada pemanggilan kedua.
Berikut ini adalah contoh kasus yang digunakan untuk menjelaskan ketiga
macam rekursi di atas. Kasus ini digunakan untuk menghitung nilai m
2 + (m+1)2 + … +
n
2. Implementasi juga menggunakan cara iteratif sebagai pembanding.
#include<iostream.h>
template<class T>
T Sum(T m, T n)
{
T tsum = 0;
for (int i = m; i <= n; i++)

tsum += i*i;
return tsum;
}
void main(void)
{
int a = 5, b = 10;
cout << Sum(a,b) << endl;
}

Di bawah ini diberikan program jumlah kuadrat dengan menggunakan cara going
down recursion.

#include<iostream.h>
template<class T>
T Sum(T m, T n)
{
if (m>=n)
return n*n;

else
return Sum(m, n-1) + n*n;
}
void main(void)
{
int a = 5, b = 10;
cout << Sum(a,b) << endl;
}



Implementasi rekursi dengan cara menaik (going up recursion) diberikan di bawah
ini.

 
#include<iostream.h>
template<class T>
T Sum(T m, T n)
{
if (m>=n)
return m*m;

else
return Sum(m+1, n) + m*m;
}
void main(void)
{
int a = 5, b = 10;
cout << Sum(a,b) << endl;
}




Pada kasus ketiga yaitu rekursi dibagi separoh, nilai di tengah dihitung dari
nilai tengah parameternya yaitu m + n dibagi 2. Oleh karena bisa terjadi nilai
setengahnya tidak selalu bulat, maka bisa diambil hanya nilai integernya saja.
Implementasi dari rekursi dibagi separoh disajikan berikut ini :

#include<iostream.h>
template<class T>
T Sum(T m, T n)
{ int tengah;
if (m==n) return m*m;
else
{

tengah = (m+n) / 2;
return Sum(m, tengah) + Sum(tengah+1, n);
}
}
void main(void)
{
int a = 5, b = 10;
cout << Sum(a,b) << endl;
}

Kasus basisnya memang agak berbeda, yaitu m = n untuk lebih meyakinkan
bahwa nilai m
2 akan diperoleh bila m = n (lebih eksplisit). Bila pada dua kasus
sebelumnya, pohon pemanggilan miring (ke kiri dan ke kanan) maka pohon

pemanggilan dengan cara rekursi dibagi separoh akan menjadi pohon yang seimbang
seperti berikut ini :


Read More

Fungsi rekursif C++

 Fungsi rekursif C++
pengertian fungsi rekursif

Fungsi rekursif adalah function yang memanggil dirinya sendiri secara
langsung maupun tidak langsung melalui function yang lain. Setiap function rekursif
mengandung 2 hal :
a. kasus yang paling sederhana atau kasus basis. Di dalamnya akan
mengembalikan suatu nilai
b. langkah rekursi (recursive call), di mana masalah yang kompleks dipecah
menjadi masalah yang lebih sederhana. Langkah rekursif ini harus
mengarah ke kasus basis.
Sebagai contoh adalah program untuk mencari nilai dari n! dengan n bilangan integer
non negatif. n! didefinisikan sebagai : (iteratif)
n! = n*(n-1)*(n-2)* ... * 1
dengan 1!=1 dan 0!=1. Persoalan ini dapat diselesaikan dengan cara iteratif
menggunakan pernyataan for. Misalkan akan dicari n!


faktorial = 1;
for (int i=1; i<= n; i++)
faktorial = faktorial * i;
Definisi faktorial bisa ditulis dengan relasi : (rekursif)
n! = n * (n-1)!
yang ditulis sebagai
faktorial := n * faktorial(n-1);
Perhatikan evaluasi rekursif dari 4! di bawah ini.

 


#include <iostream.h>
int Factorial(int n)
{
int i, hasil = 1;
for (i=1; i<=n; i++)
hasil = hasil * i;
return hasil;
}
void main(void)
{
cout << "5! = " << Factorial(5) << endl;
}

Pada kasus perulangan iteratif di atas, kita dapat menggunakan pernyataan
perulangan while atau do .. while sebagai ganti for (5). Nilai kumulatif perkalian
dimulai dari 1 (4) dan pernyataan kumulatif nilai perkalian menggunakan (6) [
Silahkan merujuk diktat Algoritma dan Pemrograman ]. Nilai
hasil dikembalikan
sebagai hasil dari fungsi Factorial (7).
Untuk kasus perulangan rekursif, nilai awal dapat kita pandang sebagai kasus
basis yang nantinya akan mengembalikan suatu nilai (4). Sementara sifat
pengulangannya menggunakan pemanggilan dirinya sendiri (5). Tentu saja rumus yang
digunakan disesuaikan dengan kasus yang dihadapi.


#include <iostream.h>
int Factorial(int n)
{
if (n <= 1) return 1; // kasus basis
else return n * Factorial(n - 1); // pemanggilan rekursif
}
void main(void)
{ cout << "5! = " << Factorial(5) << endl; }

Output dari program di atas untuk n = 5 adalah
Faktorial 5 = 120
1. Fungsi Rekursif dua parameter : Perkalian Dua Buah IntegerDefinisi iteratif untuk kasus perkalian dua buah integer adalah sebagai berikut :
Definisi :
(iteratif)
a x b
=a + a + ... + a (b kali), untuk b > 0(-a) + (-a) + ... + (-a) (b kali), untuk b < 0Dalam definisi di atas dapat dilihat bahwa perulangan selalu dipertahankan bernilai
positif, terutama untuk kasus b yang negatif, yaitu dengan cara mengalihkan nilai
negatif ke a. Implementasi definisi tersebut menggunakan fungsi sebagai berikut :


#include <iostream.h>
#include <math.h>
int kali_iteratif(int a,int b)
{
int i, hasil = 0; // nilai awal
for (i=1; i<=abs(b); i++)
hasil = hasil+a;
if (b<0) return -hasil;
else return hasil;
}
void main(void)
{
cout << "3x(-5) = " << kali_iteratif(3,-5) << endl;
}

Fungsi absolut (abs) digunakan untuk perulangan yang selalu positif (7).
Fungsi abs prototipe fungsinya berada pada math.h (2). Sementara bila b bernilai
negatif, kita bisa menggunakan nilai negatif dari perhitungan semula untuk b positif
(9). Dalam implementasi menggunakan fungsi rekursif, nilai awal pada kasus iteratif
digunakan sebagai kasus basis (penyetop). Sementara dua kasus yang ada pada
definisi iteratif digunakan dan dimodifikasi untuk kasus rekursif. Definisi rekursif
dari kasus perkalian dua integer adalah sebagai berikut :
Definisi :
(rekursif)
a x b =
0, untuk b = 0a + (a x (b-1)), untuk b > 0-a + (a x (b+1)), untuk b < 0Implementasi dari definisi rekursif di atas adalah sebagai berikut :
#include <iostream.h>
int kali_rekursif(int a,int b)
{
if (b==0)
return 0; // kasus basis
else if (b>0)
return a + kali_rekursif(a,b-1); // pemanggilan rekursif
else
return (-a) + kali_rekursif(a,b+1); // pemanggilan rekursif
}
void main(void)
{
cout << "3x(-5) = " << kali_rekursif(3,-5) << endl;
}
Pada kasus rekursif yang pertama, nilai b positif. Untuk mengarah pada kasus
basis (b = 0) maka nilai b selalu dikurangi dengan 1 (8). Sementara untuk kasus
rekursif yang kedua (b < 0), untuk mengarah pada kasus basis (b = 0) nilai b
ditambah dengan 1 (10).



 


Read More