Nama : Nur Kahfi Ibrahim
Semester : 3
PROGRAM SORTING
#include <iostream.h> |
#include <conio.h> |
#include <stdio.h> |
#include <iomanip.h> |
class matrix{ |
friend ostream& operator<<(ostream&, matrix&); |
friend istream& operator>>(istream&, matrix&); |
public: |
void baca(); |
void jumlah(const matrix&, const matrix&); |
void kali(const matrix&, const matrix&); |
void cetak(); |
private: |
int A[10][10]; |
int baris, kolom; |
}; |
void matrix::baca(){ |
int i,j; |
for(i=0;i<baris;i++) |
for(j=0;j<kolom;j++){ |
cout<<"data["<<i+1<<","<<j+1<<"]:"; |
cin>>A[i][j]; |
} |
} |
void matrix::jumlah(const matrix& m1, const matrix& m2){ |
int i,j; |
baris=m1.baris; |
kolom=m1.kolom; |
for(i=0;i<baris;i++) |
for(j=0;j<kolom;j++){ |
A[i][j]=m1.A[i][j]+m2.A[i][j]; |
cetak(); |
} |
} |
void matrix::kali(const matrix& m1, const matrix& m2){ |
int i,j,k,barkol; |
baris=m1.baris; |
kolom=m1.kolom; |
barkol=m1.kolom; |
for(i=0;i<baris;i++) |
for(j=0;j<kolom;j++){ |
A[i][j]=0; |
for(k=0;k<barkol;k++) |
A[i][j]=A[i][j]+m1.A[i][k]*m2.A[k][j]; |
} |
cetak(); |
} |
void matrix::cetak(){ |
int i,j; |
for(i=0;i<baris;i++){ |
for(j=0;j<kolom;j++) |
cout<<setw(5)<<A[i][j]<<""; |
cout<<endl; |
} |
} |
istream& operator >> (istream& in, matrix& A){ |
cout<<"banyak baris :"; |
in>>A.baris; |
cout<<"banyak kolom:"; |
in>>A.kolom; |
cout<<"masukkan data matrix\n"; |
A.baca(); |
cout<<"matrix yang dibuat adalah\n"; |
A.cetak(); |
return in; |
} |
ostream& operator << (ostream& out, matrix& A){ |
int i,j; |
for(i=0;i<A.baris;i++){ |
for(j=0;j<A.kolom;j++) |
cout<<setw(5)<<A.A[i][j]<<""; |
cout<<endl; |
} |
return out; |
} |
main(){ |
matrix m1,m2; |
matrix jumlah; |
cout<<"masukkan data matrix 1\n"; |
cin>>m1; |
cout<<"masukkan data matrix 2\n"; |
cin>>m2; |
jumlah.jumlah(m1,m2); |
cout<<"hasil penjumlahan\n"; |
jumlah.cetak(); |
jumlah.kali(m1,m2); |
cout<<"hasil perkalian\n"; |
jumlah.cetak(); |
getch(); |
return 0; |
} |
STRUKTUR CLASS
Pendefinisian kelas di C++. Dalam bagian ini, kita contohkan beberapa kelas yang lazim kita temui dalam kehidupan sehari-hari. Mari kita amati contoh lain dari kehidupan kita, dengan mendeklarasikan sebuah kelas bernama Bilangan Rasional :
class BilanganRasional |
{ |
public : |
void assign (int,int); |
void cetak(); |
private : |
int pembilang, penyebut; |
}; |
Perhatikan contoh di atas. Untuk mendefinisikan sebuah kelas, dipakai kata kunci class, diikuti dengan pendeklarasian nama kelas tersebut. Fungsi assign() dan cetak() disebut member function (member fungsi). Sedangkan variabel pembilang dan penyebut disebut member data (member data atau member variabel). Disebut member karena kesemuanya merupakan anggota dari kelas BilanganRasional.
Perhatikan kata kunci Public dan Private. Member functions pada contoh di atas dideklarasikan sebagai fungsi global, sedangkan member data dideklarasikan sebagai lokal. Perbedaannya, member global dapat diakses dari luar kelas, sedangkan member lokal hanya dapat diakses dari kelas itu sendiri.
Sekarang, dimana kita telah menciptakan kelas Bilangan Rasional, kita dapat mendeklarasikan sebuah objek dari kelas BilanganRasional sebagai berikut :
BilanganRasional objekBilangan;
Perhatikan bahwa disini objek Bilangan merupakan nama dari objek tersebut, dan Bilangan Rasional merupakan nama kelas yang ingin kita buat objeknya.
Proses pembuatan sebuah objek biasa sisebut penginstansian (bukan penginstalansian), dan sebuah objek disebut instans (intance) daei sebuah kelas.
- Untuk lebih jelasnya, perhatikan listing selengkapnya :
#include <iostrem.h> |
#include <conio.h> |
class BilanganRasional |
{ |
public : |
void assign (int,int); |
void cetak(); |
private : |
int pembilang, penyebut; |
}; |
void main() |
{ |
//mendeklarasikan objekBilangan BilanganRasional objekBilangan; |
// member fungsi assign() dipanggil. |
objekBilangan.assign (22,7); |
// member fungsi cetak() dipanggil. |
ObjekBilangan.cetak(); |
getch(); |
} |
void BilanganRasional::assign(int pemb, int peny) |
{ |
pembilang = pemb; |
penyebut = peny; |
} |
void BilanganRasional::cetak() |
{ |
cout<<pembilang; |
cout<<penyebut; |
}; |
Perhatikan blok main(). Sekarang Anda sudah mempunyai sebuah objek bernama objekBilangan dari kelas BilanganRasional. Seperti Anda lihat, pendeklarasian sebuah objek sama seperti mendeklarasikan sebuah variabel. Atau dengan kata lain objekBilangan adalah sebuah objek dengan tipe BilanganRasional.
Sekarang, bagaimana memanggil fungsi dari sebuah objek? Hal ini dapat dicapai dengan menghubungkan nama objek dan fungsi yang ingin dipanggil dengan operator tanda titik (.). Sehingga untuk memanggil fungsi assign(), dapat dilakukan dengan cara sebagai berikut : objekBilangan.assign(22,7);
Nilai 22 dan 7 merupakan parameter yang diterima oleh fungsi assign(). Di dalam fungsi tersebut, nilai 22 diinisialisasikan ke dalam member data pembilang, dan nilai 7 diinisialisasikan ke dalam member data penyebut. Sehingga bila fungsi cetak() dipanggil, maka akan diperoleh hasil sebagai berikut :
22 / 7
KONSTRUKTOR
Sebuah konstruktor melakukan tugas yang sama dengan fungsi assign(), sehingga Anda tidak perlu repot-repot memanggil fungsi assign() untuk setiap objek yang Anda deklarasikan. Sebuah konstruktor harus mempunyai nama yang sama dengan kelas dimana konstruktor tersebut berada, dan dideklarasikan tanpa return value (nilai balik), juga tanpa kata kunci void. Mari kita kembangkan kelas BilanganRasional yang telah kita bahas sebagai berikut :
class BilanganRasional |
{ |
public : |
//KONSTRUKTOR BilanganRasional |
BilanganRasional(int pemb, int peny) |
{ |
pembilang = pemb; |
penyebut = peny; |
} |
private : |
int pembilang, penyebut; |
}; |
Bandingkan struktur konstruktor dengan fungsi assign() yang telah kita bahas sebelumnya. Konstruktor BilanganRasional melakukan tugas yang sama dengan member fungsi assign(). Bedanya hanya terletak pada pemanggilan fungsi dan konstruktor tersebut. Jika fungsi assign() harus kita panggil dengan didahului oleh pendeklarasian sebuah objek, kemudian fungsi dari objek tersebut dipanggil dengan operator titik disertai nilai yang ingin kita input, misal :
BilanganRasional objekBilangan;
objekBilangan.assign(22,7);
Maka konstruktor cukup dipanggil sebagai berikut :
BilanganRasional objekBilangan(22,7);
Kedua varian tersebut melakukan hal yang sama, yakni menginitialisasikan nilai 22 ke member variabel pembilang, dan nilai 7 ke variabel penyebut.
Konstruktor Dengan Initialization Lists
Penulisan konstruktor dengan daftar initialisasi (initialization lists) merupakan fasilitas yang disediakan oleh C++ untuk menyederhanakan struktur konstruktor. Ini berarti, contoh konstruktor di atas dapat pula ditulis sebagai berikut :
class BilanganRasional |
{ |
public : |
BilanganRasional(int pemb, int peny) : pembilang(pemb), penyebut(peny) { } |
private : |
int pembilang, penyebut; |
}; |
Contoh di atas menghasilkan fungsi yang sama dengan konstruktor yang kita bahas sebelumnya.
MENGOVERLOAD STREAM OPERATOR
C++ mengijinkan anda untuk mengoverload stream insertion operator >>/(input) untuk menyesuaikan input dan stream deletion operator<</(output) seperti halnya aritmatik operator dan relational operator perlu juga dideklarasikan sebagai friend function.
Untuk class T dengan anggota data d, sintaknya untuk operator input dan outputnya adalah
Friend ostream& operator <<(ostream& ostr, const T& t){ |
return ostr << t.d;} |
Disini, ostream adalah suatu Class standar yang didefinisikan dalam haedea file iostream.h. Catat bahwa semua parameter dan nilai kembalian dikirimkan secara nilai.
Fungsi ini kemudian bisa dipanggil mengunakan sintaks yang sama yang kita gunakan untuk tipe primitive:
Cout<<”x=”<<x<<”,y=”<<endl;
Berikut ini merupakan contoh bagamana custom output dapat ditulis :
Class bilangan{ |
friend ostream& operator << (ostream&, const bilangan n); |
public : |
bilangan (int = 0, int d=1):lang(n), but(d){} |
private : |
int lang, but ; |
}; |
Int main(){ |
Bilangan x(22/7),y(-3,8); |
Cout<<”x=”<<x<<”,y=”<<y<<endl; |
Return 0; |
} |
Ostream& operator << (ostream& ostr, const bilangan& r){ |
Return ostr << r.lang<<”/”<<r.but; |
} |
Output :
y=-3/8
Ketika baris kedua dari main () dieksekusi, ekspresi cout <<”x=” dieksekusi lebih dulu. ini memanggil standar output operator <<, melewatkan standar output stream cout dan stream “x=”. Seperti biasanya, ini memasukan stream kedalam output stream dan kemudian mengembalikan reference ke cout. Panggilan ini untuk operator << mengeksekusi cout sebagai pengganti ostr dan dengan x sebagai pengganti r. Hasilnya adalah eksekusi baris.
Return ostr r.lang << “/”<<r.but;
Memasukan 22/7 kedalam output stream dan hasilnya adalah suatu reference ke cout. Kemudian panggilan yang lain untuk standar output operator << dan panggilan yang lain kepada operator yang di overload terjadi, dengan output (suatu reference ke cout ) dari tiap panggilan yang terjadi ke panggilan berikutnya sebagai input. Akhirnya panggilan terakhir pada standar operator << dibuat, mengirim cout dan endl. Ini membangkitkan stream menyebabkan baris yang lengkap x=22/7, y= -3/8
Untuk mencetak sintaks untuk mengoverload operator bagi suatu class dengan data d
Friend istream& operator >> (istream& istr, T& t){ |
Return istr>>t.d;} |
Disini istream adalah class standar lain yang didefinisikan dalam iostream& header file.
INTHERITANCE
Salah satu hal penting dalam class adalah inheritance. Inheritance mengijinkan kita untuk membuat objek yang diturunkan dari objek lain, sehingga dimungkinkan didalamnya terdapat member lain selain membernya sendiri. Sebagai contoh, misalnya kita ingin mendeklarasikan sederetan class yang mendeskripsikan polygon seperti CRectangle atau CTriangle. Keduanya dapat dideskripsikan dengan dua atribut yakni : alas dan tinggi.
Hal ini dapat direpresentasikan dengan class CPolygon dan dari class tersebut diturunkan dua class yakni CRectangle dan CTriangle.
Class CPolygon berisi member yang umum pada semua polygon, dalam contoh ini adalah panjang dan lebar (width dan height). CRectangle dan CTriangle diturunkan dari class tersebut.
Class yang diturunkan dari class lain mewarisi semua member yang ada dalam class dasarnya. Hal ini berarti bahwa jika class dasarnya memiliki member A dan kita menurunkannya ke class lain yang memiliki member B, maka class turunan akan terdiri dari A dan B.
Untuk menurunkan class dari yang lain, kita menggunakan operator : (colon) dalam deklarasi class turunan dengan cara sbb:
class derived_class_name: public base_class_name;
Dimana derived_class_name adalah nama class turunan dan base_class_name adalah nama class yang menjadi dasar. Public dapat diganti dengan akses lain misalnya protected atau private, dan menjelaskan akses untuk member yang diturunkan, seperti kita dapat lihat pada contoh berikut:
Contoh 8.1:
// derived classes |
#include <iostream.h> |
class CPolygon { |
protected: |
int width, height; |
public: |
void set_values (int a, int b) |
{ width=a; height=b;} |
}; |
class CRectangle: public CPolygon { |
public: |
int area (void) |
{ return (width * height); } |
}; |
class CTriangle: public CPolygon { |
public: |
int area (void) |
{ return (width * height / 2); } |
}; |
int main () { |
CRectangle rect; |
CTriangle trgl; |
rect.set_values (4,5); |
trgl.set_values (4,5); |
cout << "\nHasil pemanggilan fungsi area oleh rect= "<<rect.area(); |
cout <<"\nHasil pemanggilan fungsi area oleh trgl = "<<trgl.area(); |
return 0; |
} |
Sebagaimana kita lihat objek class CRectangle dan CTriangle masing-masing berisi member dari class CPolygon yakni : width, height dan set_values().
Protected mirip dengan private, perbedaan hanya terjadi pada class turunan. Ketika kita menurunkan class, member protected dari class dasar dapat digunakan oleh member lain dalam class turunan, namun member private tidak demikian. Karena kita ingin width dan height dapat diakses oleh member dalam class turunan CRectangle dan CTriangle dan tidak hanya oleh member CPolygon, kita pilih akses protected daripada private.
Kita dapat mebuat ringkasan perbedaan tipe akses berdasarkan siapa yang dapat mengakses, sebagai berikut:
Access | Public | Procted | Private |
Members of the same class | Yes | Yes | Yes |
Member of derived classes | Yes | Yes | No |
Not-Members | Yes | No | No |
Dimana “not member” merepresentasikan referensi dari luar class misalnya: dari main(), dari class lain atau dari fungsi, baik local maupun global.
Dalam contoh, member yang diwariskan kepada CRectangle dan CTriangle mengikuti akses yang sama seperti dalam class dasarnya yakni CPolygon:
CPolygon::width // protected access |
CRectangle::width // protected access |
CPolygon::set_values() // public access |
CRectangle::set_values() // public access |
Ini dikarenakan kita menurunkan class dari class lain sebagai public, lihat bahwa
class CRectangle: public CPolygon;
Public menunjukkan level minimum proteksi yang berarti member warisan class dasar (CPolygon) harus diikutkan dalam class baru (CRectangle). Level akses minimum untuk member yang diturunkan dapat diubah menjadi protected atau private selain public. Sebagai contoh, daughter adalah class yang diturunkan dari mother yang didefinisikan sbb :
class daughter: protected mother;
yang menggunakan protected sebagai minimum level akses untuk member daughter yang diwarisi dari mother. Karena itu, semua member yang sifatnya public pada mother akan menjadi protected pada daughter, yang merupakan level minimum dimana ia dapat diwariskan. Tentunya, ini tidak akan menjadi halangan bagi daughter untuk mempunyai member public. Minimum level hanya akan digunakan untuk member yang diwariskan mother.
Penggunaan umum level inheritance selain public adalah private, yang menyediakan encapsulasi sempurna dalam class dasar, kecuali jika tidak ada yang beranggapan classnya akan dapat diakses member class dasar dari turunannya. Sehingga dalam banyak kasus class diturunkan dalam bentuk public.
Jika tidak ada level akses yang ditulis maka dalam class akan dianggap private, dan dalam tipe struct dianggap public.
Contoh 8.2 :
//inheritance class |
#include <iostream.h> |
#include <conio.h> |
class contoh{ |
protected: |
int x; |
public: |
void fcontoh1 (); |
void fcontoh2 (); |
}; |
class cth : public contoh{ |
int y; |
public: |
void fcth1 (); |
}; |
void contoh::fcontoh1() |
{ x=3; |
cout<<"Fungsi contoh 1 anggota class contoh"; |
cout<<"\nNilai x = "<<x;} |
void contoh::fcontoh2() |
{ |
cout<<"\n\nFungsi contoh 2 anggota class contoh"; |
} |
void cth::fcth1() |
{ |
y=3; |
x=5; |
cout<<"\n\nFungsi cth 1 anggota class cth"; |
cout<<"\nNilai y = "<<y; |
cout<<"\nNilai x = "<<x; |
} |
main () { |
contoh a; |
cth b; |
a.fcontoh1(); |
b.fcontoh2(); |
b.fcth1(); |
getch(); |
} |
Tidak ada komentar:
Posting Komentar