Selasa, 21 September 2010

TUGAS STRUKTUR DATA

Nama         : Nur Kahfi Ibrahim

Nim            : 09018238
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;
}









HASIL COMPILENYA :


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();
}