Kuliah05-Struktur_dan_class.

advertisement
Struktur
Struktur
Digunakan untuk mengelompokkan data dengan type yg berbeda
dalam beberapa bahasa pemrograman biasa nya disebut sebagai record
contoh :
struct data_tanggal
{
int tahun ;
int bulan ;
int tanggal ;
};
data_tanggal adalah nama dari struktur yg di buat
dan
tahun
bulan
tanggal
disebut sebagai anggota dari struktur data_tanggal
Struktur
Untuk mendefinisikan struct variable-name di gunakan cara
seperti mendefinisikan typa data
data_tanggal tgl_lahir
data_tanggal adalah nama struktur nya
tgl_lahir adalah variabel-name dari data_tanggal
jadi tgl_lahir mempunyai 3 anggota yaitu : tahun,bulan,tanggal
untuk mengakses nya di gunakan dot operator
seperti
tgl_lahir.tahun
tgl_lahir.bulan
tgl_lahir.tanggal
Struktur
dapat pula suatu struktur berada dalam struktur
misal
struct data_pegawai
{
int nip ;
char nama[25];
data_tanggal tgl_lahir;
} rec_peg ;
jadi untuk mengakses nya
rec_peg.nip
rec_peg.nama
rec_peg.tgl_lahir.tahun
rec_peg.tgl_lahir.bulan
rec_peg.tgl_lahir.tanggal
Struktur dan Fungsi by value
struct koordinat {
int x ;
int y ; };
void tampilkan_posisi(koordinat posisi)
{
cout << "posisi x = " << posisi.x << endl;
cout << "posisi y = " << posisi.y << endl;
}
int main()
{
koordinat posisi;
posisi.x = 27;
posisi.y = 55;
tampilkan_posisi(posisi);
return 0;
}
Struktur dan Fungsi by reff
struct koordinat {
int x ;
int y ; };
void ubah_posisi(koordinat &posisi) {
posisi.x = 51;
posisi.y = 85;
}
int main() {
koordinat posisi;
posisi.x = 12;
posisi.y = 34;
// koordinat adalah type datanya
cout << "awal "<<posisi.x<<" "<<posisi.y<<endl;
ubah_posisi(posisi);
cout << "akhir "<<posisi.x<<" "<<posisi.y<<endl;
return 0; }
Tugas


Baca Union digunakan untuk membagi
memory untuk digunakan bersama
Baca enum untuk memberi nilai pada suatu
data yg jumlahnya terbatas
Managemen memori
dinamis
Pengalokasian memori dalam suatu program
dapat dilakukan secara dinamis, Pada saat
program dijalankan, suatu memori dapat
dipesan utk digunakan, dan jika sudah selesai
dapat dilepaskan kembali. Hal ini sangat
bermanfaat jika kita ingin menggunakan struktur
data link list dan tree
Statement yg di gunakan adalah new dan delete
Tata letak memori
MEMORY
stack
heap
data
kode
Pada saat program dijalankan, program
akan menempati sejumlah memori yg
bebas di bagian heap. Memori di bagian
inilah yg nantinya akan di gunakan untuk
pengalokasian memori dinamis.
Ukuran memori ini sangat bervariasi,
tergantung pada model memori yg
digunakan compiler small, tiny atau huge,
juga sistem operasi yg digunakan
Managemen memori dinamis
Misal didefinisikan
int *ptr_i; //pointer bertype integer
setelah pendefinisian pointer belum menunjuk suatu
lokasi tertentu, agar supaya dapat menunjuk pada
suatu lokasi di heap, harus dialokasikan lebih
dahulu suatu tempat di heap dengan cara
ptr_i = new int
penulisan
int *ptr_i ;
ptr_i = new int;
Atau
int *ptr_i = new int
Penggunaan
int *ptr_i = new int
*ptr_i = 50 ; //mengisi var dinamis
cout << “isi *ptr_i = “ << *ptr_i << endl;
Contoh array
double *acak = new double [5] ; // definisikan array
randomize(); // mengisi data secara random
for (int i=0 ; i < 5 ; i ++)
*(acak+i) = random (500);
// menampilkan elemen array
for (int i=0 ; i < 5 ; i ++)
cout << *(acak + i) << endl;
Contoh string
char *kalimat ;
kalimat = new char [25];
cout << “masukkan kalimat “;
cin.getline(kalimat,25);
cout <<“kalimat yg ditulis : “ << kalimat ;
Memori heap penuh
Pada suatu keadaan dimana kita tidak lagi dapat
menjalankan program disebabkan penuhnya
memori heap, apa yg harus dilakukan?
Gunakan fungsi
set_new_handler() ada di library
<new.h>
Tujuannya utk menggunakan memory bersama
Membuat memori penuh
char *banjir;
do {
banjir = new char [15000];
if (banjir != NULL)
cout << “memori sebesar 15000 berhasil dialokasikan” << endl;
} while (banjir != NULL);
Program akan berjalan sampai memori heap penuh dengan pesan “
Abnormal Program termination”
pencegahan
Tambahkan suatu fungsi untuk menampung jika terjadi
error
void kesalahan_mem()
{
cerr << “memori habis “ << endl;
exit (1);
}
Dan tambahkan pada main program
set_new_handler(kesalahan_mem);
void kesalahan_mem()
{
cerr << "memori habis !! " << endl;
exit(1);
}
int main()
{
char *banjir;
long ukuran;
set_new_handler(kesalahan_mem) ;
cout << "memori yg akan dialokasikan " ; cin >> ukuran;
cout << endl;
banjir = new char [ukuran];
cout << "pengalokasian memory berhasil " << endl;
return 0;
}
Membebaskan memori
Setelahsuatu var dinamis tidak di perlukan
lagi, var dinamis dapat dihapus, sehingga
memori dapat di gunakan var lain dengan
statement
delete var-ptr
contoh
int main() {
double *ptrd = new double (123.45);
float *ptrf = new float (3.14);
int *ptri = new int (6)
cout << ptrd << endl;
cout << ptrf << endl;
cout << ptri << endl;
// menghapus alokasi
delete ptrd;
delete ptrf;
delete ptri;
Struktur dinamis
struct data_pegawai {
int nip;
char nama[25];
long int gaji; };
Mendefinisikan struktur dimanis
data_pegawai *rec_peg;
rec_peg = new data+pegawai;
Class
Kelas merupakan struktur data dari objek yg mirip
dengan struktur
struct buku
{
char judul[20];
char pengarang[20];
int jumlah;
};
class Buku
{
public :
char judul[20];
char pengarang[20];
int jumlah;
};
#include <iostream.h>
#include <string.h>
struct buku
{
char judul[20];
char pengarang[20];
int jumlah;
};
int main()
{
buku novel ; // pendefinisian var struktur
strcpy(novel.judul, "Ramayana");
strcpy(novel.pengarang, "Narayan");
novel.jumlah = 12;
cout << novel.judul << endl;
cout << novel.pengarang << endl;
cout << novel.jumlah << endl;
return 0;
}
#include <iostream.h>
#include <string.h>
class Buku
{
public :
char judul[20];
char pengarang[20];
int jumlah;
};
int main()
{
Buku novel ; // pendefinisian var struktur
strcpy(novel.judul, "Ramayana");
strcpy(novel.pengarang, "Narayan");
novel.jumlah = 12;
cout << novel.judul << endl;
cout << novel.pengarang << endl;
cout << novel.jumlah << endl;
return 0;
}
#include <iostream.h>
#include <string.h>
class Buku
{
private :
char judul[20];
char pengarang[20];
int jumlah;
public :
void inisialisasi(char *Judul, char *Pengarang, int
Jumlah)
{
strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
void info()
{
cout << "Judul
: " << judul << endl;
cout << "Pengarang : " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
};
// end class
int main() {
Buku novel ; // pendefinisian var struktur
novel.inisialisasi("Ramayana", "Narayan", 12);
novel.info();
return 0;
}
Class
Penggunaan private digunakan
pada kelas untuk memproteksi
anggota-anggota tertentu pada
kelas, agar tidak dapat diakses di
luar kelas secara langsung
Contoh perhitungan luas segi empat
class area {
private:
float a, b, c;
public:
float x, y ;
area (float x, float y) //konstruktor
{a = x;
b = y;
cout << "harga a : " << a << endl;
cout << "harga b : " << b << endl << endl;
}
; // fungsi utk cetak hrg parameter
~area()
//destruktor
{
cout << "Stop " << endl;
};
void hasil ()
{ c = a * b;
cout << "Hasil : " << c << endl;
}
};
int main()
{
area luas(2, 4.5);
luas.hasil();
return 0;
}
Membuat header
// penulisan class sebagai header
// harus didahului dengan statement #ifndef
// dan diakhiri dengan #endif
// disini digunakan konstruktor
// nama konstruktor harus sama dengan nama class
// konstruktor tidak mempunyai nilai balik termasuk tanpa void
// dan harus diletakkan pada area public
#ifndef __luas
#define __luas
..
..
#endif
#ifndef __luas
#define __luas
class area
{ private:
float a, b, c;
public:
float x, y ;
area (float x, float y) //konstruktor
{
a = x;
b = y;
cout << "harga a : " << a << endl;
cout << "harga b : " << b << endl << endl;
}
; // fungsi utk cetak hrg parameter
~area()
//destruktor
{
cout << "Stop " << endl;
};
void hasil ()
{ c = a * b;
cout << "Hasil : " << c << endl;
}
};
#endif
// Program untuk menghitung luas segi empat
// dengan menggunakan class
#include <iostream.h>
#include <math.h>
#include "luas.h"
int main()
{
area luas(2, 4.5);
luas.hasil();
return 0;
}
Konstruktor dan
Destruktor
Konstruktor
adalah suatu fungsi anggota yg mempunyai nama yg sama dengan nama class.
kegunaan nya :
- mengalokasikan ruang bagi sebuah object
- memberi nilai awal thd anggota data sebuah object
- membentuk tugas tugas umum lainnya
contoh:
class kompleks {
private:
double re;
double im
public:
Kompleks();
void info(); };
Konstruktor
Nama konstruktor sama dengan nama class
Konstruktor tidak mempunyai nilai balik
(bahkan tanpa void)
Konstruktor harus diletakkan di bagian
public
class Kompleks
{
private:
double x, y ;
public:
Kompleks();
void info();
// konstruktor (tanpa type data)
};
int main()
{
Kompleks p ;
p.info();
//mendefinisikan object p
return 0;
}
//definisi fungsi anggota class Kompleks
Kompleks::Kompleks()
{
cout << "konstruktor dijalankan ...." << endl;
x = 5.2;
y = 7.9;
}
void Kompleks::info()
{
cout << "harga x : " << x << endl;
cout << "harga y : " << y << endl;
}
konstruktor dijalankan ....
harga x : 5.2
harga y : 7.9
class Kompleks
{
private:
double x, y ;
public:
Kompleks();
~Kompleks();
void info();
// konstruktor (tanpa type data)
// dekonstruktor
};
int main()
{
Kompleks p ;
p.info();
//mendef object p
return 0;
}
//definisi fungsi anggota class Kompleks
Kompleks::Kompleks()
{
cout << "konstruktor dijalankan ...." << endl;
x = 5.2;
y = 7.9;
}
Kompleks::~Kompleks()
{
cout << "Destruktor jalan.... proses selesai";}
void Kompleks::info()
{
cout << "harga x : " << x << endl;
cout << "harga y : " << y << endl;
}
konstruktor dijalankan ....
harga x : 5.2
harga y : 7.9
Destruktor jalan.... proses selesai
class Buku
{
private :
char judul[20];
char pengarang[20];
int jumlah;
public :
Buku(char *Judul * char *Pengarang,
int Jumlah) ;
~Buku();
void info() ;
};
int main()
{
Buku novel("Ramayana", "Narayan", 12);
novel.info();
return 0;
}
Buku::Buku(char *Judul, char *Pengarang,
int Jumlah)
{
strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
Buku::~Buku()
{
cout << "Selesai... " << endl; }
void Buku::info()
{
cout << "Judul
: " << judul << endl;
cout << "Pengarang
: " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
Membuat header sendiri

Jika suatu class ingin digunakan pada
sejumlah program, akan lebih baik jika class
didefinisikan sebagai file atau header yg
terpisah seperti :
// membuat file class sebagai header (buku.h)
#ifndef __buku
#define __buku
class Buku
{
private :
char judul[20];
char pengarang[20];
int jumlah;
public :
Buku(char *Judul, char *Pengarang,
int Jumlah)
{
strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
void info()
{
cout << "Judul
: " << judul << endl;
cout << "Pengarang : " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
};
#endif
#include <iostream.h>
#include <string.h>
#include "buku.h">
int main()
{
Buku novel("Ramayana", "Narayan", 12);
// novel didefinisikan sebagai class Buku
// langsung di beri harga
Buku fiksi("Jurassic Parc", "Michael Crichton", 3);
novel.info();
fiksi.info();
return 0;
}
Jika class buku dibuat sebagai prototype
// membuat file class sebagai header
#ifndef __buku1
#define __buku1
class Buku
{ private :
char judul[20];
char pengarang[20];
int jumlah;
public :
Buku(char *Judul, char *Pengarang,
int Jumlah) ;
void info();
};
#endif
#include <iostream.h>
#include <string.h>
#include "buku1.h">
Buku::Buku(char *Judul, char *Pengarang,
int Jumlah)
{ strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
void Buku::info()
{ cout << "Judul
: " << judul << endl;
cout << "Pengarang: " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
int main()
{
Buku novel("Ramayana", "Narayan", 12);
// novel didefinisikan sebagai class Buku
// langsung di beri harga
Buku fiksi("Jurassic Parc", "Michael Crichton", 3);
novel.info();
fiksi.info();
return 0;
}
Class object local dan global


Sebuah object dapat didefinisikan seperti
variabel local dan global
Sebuah object disebut sebagai object global
jika didefinisikan di luar fungsi
class Kata
{
private:
char nama[20];
public:
Kata (char *nama);
// konstruktor
~Kata() ;
// destruktor
};
Kata p("p"); // object global
int main()
{
cout << " awal fungsi .... "<< endl;
Kata x("x"); // definisikan var anggota x berisi xxxx
Kata y("y"); // definisikan var anggota y berisi yyyy
cout << " akhir fungsi ...." <<endl;
return 0;
}
// definisi fungsi anggota
Kata::Kata(char *nama)
{
strcpy(Kata::nama, nama);
cout << "konstruktor object " << Kata::nama << endl;
}
Kata::~Kata()
{
cout << "destruktor object " << endl;
}
konstruktor object p
awal fungsi ....
konstruktor object x
konstruktor object y
akhir fungsi ....
destruktor object
destruktor object
destruktor object
Class object local dan global




Jika suatu object didefinisikan secara global, maka
konstruktor tersebut akan dilaksanakan sebelum
fungsi main() di proses
Jika suatu object didefinisikan secara local, maka
konstruktor akan dilaksanakan saat object
bersangkutan di ciptakan
Destruktor object local akan dilaksanakan saat
fungsi yg mendefinisikan berakhir
Destruktor object global akan dilaksanakan saat
fungsi main() berakhir
Pointer ke obj dan obj dynamic


Jika kita bermaksud mendefinisikan sebuah pointer untuk menunjuk
ke suatu object, maka pernyataan nya
Buku *nonfiksi
Jika pointer nonfiksi diinginkan untuk menunjuk suatu object
berkelas Buku, pernyataan nya
nonfiksi = new Buku(“Turbo C++”, “Borland”, 5)
Untuk mengakses digunakan operator -> untuk mengganti . (dot)
nonfiksi->info() ;
atau
(*nonfiksi). Info();
#include <iostream.h>
#include <string.h>
#include "buku1.h">
Buku::Buku(char *Judul, char *Pengarang,
int Jumlah)
{
strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
void Buku::info()
{
cout << "Judul
: " << judul << endl;
cout << "Pengarang : " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
int main()
{
}
Buku *nonfiksi;
nonfiksi = new Buku("Programming C", "Borland", 3);
nonfiksi->info(); // atau
(*nonfiksi).info();
return 0;
Inheritance
(pewarisan)
Dalam C++ dimungkinkan untuk mewariskan
class atau fungsi ke kelas atau fungsi lain
Sifat ini disebut pewarisan (Inheritance)
Class yg mewarisi sifat kelas lain disebut
turunan (derived clas)
Class yg mewariskan sifat ke kelas lain
disebut class dasar (base class)
Sifat A
Sifat yg di wariskan
Sifat B
Sifat B
Class dasar
Sifat A
Sifat spesifik
Sifat C
Class turunan
class Buku
{
private :
char judul[20];
char pengarang[20];
int jumlah;
public :
void inisialisasi(char *Judul, char *Pengarang,
int Jumlah)
{
strcpy(judul, Judul);
strcpy(pengarang, Pengarang);
jumlah = Jumlah;
}
void info()
{
cout << "Judul
: " << judul << endl;
cout << "Pengarang
: " << pengarang << endl;
cout << "Jumlah
: " << jumlah << endl;
}
};
class Turunan : public Buku
{
public:
void info_turunan()
{
cout<<"info turunan di jalankan....." << endl;
}
};
int main()
{
Buku novel ; // pendefinisian var novel sbg class Buku
novel.inisialisasi("Ramayana", "Narayan", 12);
novel.info();
Turunan anak;
anak.info_turunan();
anak.inisialisasi("C++", "Borland", 5);
anak.info();
return 0;
}
Judul
: Ramayana
Pengarang
: Narayan
Jumlah
: 12
info turunan di jalankan.....
Judul
: C++
Pengarang
: Borland
Jumlah
:5
class Kendaraan
{
private:
char nama[15];
public:
Kendaraan(char *nama_kendaraan = "XXX")
{
strcpy(nama, nama_kendaraan);
cout << "Hidupkan kendaraan anda..." << endl;
}
~Kendaraan()
{
cout << "Matikan mesin kendaraan anda..." << endl;
}
void info_kendaraan()
{
cout << nama << " sedang berjalan .." << endl;
}
};
class Truk : public Kendaraan
{
public:
Truk(char *nama_truk) : Kendaraan(nama_truk)
{
cout << "Hidupkan mesin truk ... " << endl;
}
~Truk()
{
cout << "Matikan mesin truk..." << endl;
}
Hidupkan kendaraan anda...
};
Hidupkan mesin truk ...
Truk Fuso sedang berjalan ..
int main()
Akhir program...
{
Truk fuso("Truk Fuso");
Matikan mesin truk...
fuso.info_kendaraan();
Matikan mesin kendaraan anda...
cout << "Akhir program... " <<endl;
return 0;
}
Polymorphism


Suatu fungsi anggota dari suatu class dapat
dijadikan sebagai fungsi virtual
Jika fungsi ini dideklarasikan kembali pada
class turunan dan suatu pointer yg menunjuk
kelas dasar diciptakan, pointer dapat memilih
object yg tepat, sekiranya fungsi anggota
tersebut dipanggil via pointer
Pointer didefinisikan
Menunjuk kelas dasar
pointer
class dasar
class Turunan 1
Pointer
Dapat
Menunjuk
Ke object
Ber kelas
turunan
class Turunan 2
class Mahluk
{
public:
void informasi()
{ cout << "informasi pd mahluk..."<<endl;}
virtual void keterangan()
{cout<< "keterangan pada mahluk...." <<endl;}
};
class Mamalia : public Mahluk
{
public:
void informasi()
{cout << "informasi pada mamalia..." << endl;}
void keterangan()
{cout << "keterangan pada mamalia.... " << endl;}
};
class Sapi : public Mamalia
{
public:
void informasi()
{cout << "informasi pd sapi..." << endl;}
void keterangan()
{cout << "keterangan pada Sapi ... " << endl;}
};
int main()
{
Mamalia
Sapi
Mahluk
mamalia;
sapi_sumba;
*binatang;
// definisikan obj mamalia
// def sapi_sumba
// def pointer ke obj berkelas mahluk
binatang = &mamalia ;
binatang->informasi();
binatang->keterangan();
cout <<"=====================" << endl;
binatang = &sapi_sumba;
binatang->informasi();
binatang->keterangan();
return 0;
}
informasi pd mahluk...
keterangan pada mamalia....
=====================
informasi pd mahluk...
keterangan pada Sapi ...
Template fungsi dan class


Template sering disebut sebagai blue print,
yang berfungsi untuk mendupilkasikan
sesuatu
Template fungsi sangat bermanfaat untuk
fungsi yg menangani tugas yg sama hanya
berbeda pada type datanya
//awal template
template <class T>
void tukar (T &x, T &y)
{
T temp;
temp = x;
x=y;
y = temp ;
} // akhir template
// prototype fungsi
void tukar (int &x, int &y);
void tukar (double &x, double &y);
p = 12.345 q = 98.765
p = 98.765 q = 12.345
a = 55 b = 88
a = 88 b = 55
int main()
{
double p = 12.345;
double q = 98.765;
cout << "p = "<< p << " q = " << q << endl;
tukar (p, q);
cout << "p = "<< p << " q = " << q << endl;
int a = 55;
int b = 88;
cout << "a = "<< a << " b = " << b << endl;
tukar (a, b);
cout << "a = "<< a << " b = " << b << endl;
return 0;
}
Download