TUGAS 1 STRUKTUR DATA


CONTOH PROGRAM

Description   : sebuah Program untuk memanajemen database pada suatu perpustakaan

. Database disimpan pada sebuah file biner dengan nama file “database.dat”.

//File-file Header yang digunakan
#include
#include
#include
#include
using namespace std;
// hapus layar
#include
void clrscr(void);
#include
void clrscr(void)
{
COORD coordScreen = { 0, 0 }; // sudut kiri atas
DWORD cCharsWritten;
DWORD dwConSize;
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hCon, &csbi);
dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
// isi dg spasi
FillConsoleOutputCharacter(hCon, TEXT(‘ ‘),
dwConSize, coordScreen, &cCharsWritten);

GetConsoleScreenBufferInfo(hCon, &csbi);
FillConsoleOutputAttribute(hCon, csbi.wAttributes,
dwConSize, coordScreen, &cCharsWritten);

// cursor sudut kiri atas
SetConsoleCursorPosition(hCon, coordScreen);
}
//Konstanta
#define FILE “database.dat” //Nama File Database
//Prototype fungsi
int menu();
void header_kolom();
void peminjaman();
void pengembalian();
void hapus_buku();
void data_buku();
void laporan();
void hapus_database();
//————————- Awal dari class buku ——————————-//
//Deklarasi untuk class buku
class buku{
char Kategori[25],Judul[50],Pengarang[50],Penerbit[50],Harga_sewa[25],
Pinjam[100],Terpinjam[100];

int pnjm;
long hargasewa, hargapinjam;
int terpinjam;
public:
buku();
void get_kategori(char *);
void get_judul(char *);
int get_pnjm();
void set_pnjm(int);
long get_hargapinjam();
long get_hargasewa();
int get_terpinjam();
void set_terpinjam(int);
void input_buku(char *);
void tampil();
void hapus();
};
//Constructor untuk class buku
buku::buku(){
strcpy(Kategori,”NULL”);
strcpy(Judul,”NULL”);
strcpy(Pinjam,”NULL”);
strcpy(Harga_sewa,”NULL”);
strcpy(Terpinjam,”NULL”);
hargasewa=10000;
pnjm=0;
//Terpinjam=0;
}
//Method untuk class buku
void buku::get_kategori(char *k){ //Pembacaan kategori buku
strcpy(k,Kategori);
}
void buku::get_judul(char *t){ //Pembacaan judul buku
strcpy(t,Judul);
}
int buku::get_pnjm(){ //Pembacaan stok buku
return(pnjm);
}
void buku::set_pnjm(int s){ //Penulisan stok buku
pnjm=s;
}
long buku::get_hargapinjam(){ //Pembacaan total sewa buku
return(hargasewa*pnjm);
}
long buku::get_hargasewa(){ //Pembacaan harga sewa buku
return(long)(hargasewa);
}
int buku::get_terpinjam(){ //Pembacaan jumlah buku terpinjam
return(terpinjam);
}
void buku::set_terpinjam(int t){ //Penulisan jumlah buku terpinjam
terpinjam=t;
}
void buku::hapus(){ //Penghapusan buku
strcpy(Kategori,”#NULL#”);
}
//Method yang meminta user untuk memasukkan
data buku baru

void buku::input_buku(char *k){
char sb[100];
int len;
hargasewa=0;
pnjm=0;
strcpy(Kategori,k);
cout << “\nMasukkan data kategori buku ” << Kategori << ” :\n”;
len=100;
while((len50)){
cout << “Judul Buku : “;
cin.getline(sb,100);
len=strlen(sb);
if((len50))
cout << “\nMasukkan Salah!\nPanjang kata antara
1-49 karakter\n”;

}
strcpy(Judul,sb);
len=100;
while((len50)){
cout << “Pengarang : “;
cin.getline(sb,100);
len=strlen(sb);
if((len50))
cout << “\nMasukkan Salah!\nPanjang kata antara
1-49 karakter\n”;

}
strcpy(Pengarang,sb);
len=100;
while((len50)){
cout << “Penerbit : “;
cin.getline(sb,100);
len=strlen(sb);
if((len50))
cout << “\nMasukkan Salah!\nPanjang kata antara
1-49 karakter\n”;

}
strcpy(Penerbit,sb);
while((hargasewa8000)){
cout << “Harga Sewa : “;
cin.getline(sb,100);hargasewa=atoi(sb);
if((hargasewa8000))
cout << “\nMasukkan salah!\nMasukkan nilai antara
3000 – 8000\n”;

}
while((pnjm99)){
cout << “Jumlah Sewa : “;
cin.getline(sb,100);pnjm=atoi(sb);
if((pnjm99))
cout << “\nMasukkan salah!\nMasukkan nilai antara
1-99\n”;

}
terpinjam=0;
}
//Method untuk menampilkan data tentang suatu buku
void buku::tampil(){
cout.setf(ios::left);
cout.width(12);
cout << Kategori;
cout.width(16);
cout << Judul;
cout.width(16);
cout << Pengarang;
cout.width(16);
cout << Penerbit;
cout.width(19);
cout << (long)(hargasewa);
cout.width(0);
cout << pnjm;
}
//************************ Akhir dari Class buku *******************************//
//Program Utama
int main()
{
//Jika file database tidak ditemukan, maka buat file
database yang baru

ifstream test(FILE);
if(!test){
ofstream test(FILE);
test.close();
}
else test.close();
int m=100;
while(m!=7){
m=menu();
switch(m){
case 1: peminjaman();
break;
case 2: pengembalian();
break;
case 3: data_buku();
break;
case 4: laporan();
break;
case 5: hapus_buku();
break;
case 6: hapus_database();
break;
//Sebelum keluar dari program, tampilkan ucapan
terima kasih

default:
cout << “\nTerima kasih telah menggunakan program ini.\n”;
cout << “\nRIYAN SINTARI (09018214)\n”;
cout << “\n2009\n”;
break;
}
}
cout << endl;
return(0);
}
//Fungsi untuk menampilkan menu pilihan
int menu(){
char sb[100];
int p=0;
while((p7)){
cout << “\n\n\n——————————–\n”;
cout << “| MAVITA’S COLLECTION BOOK |\n”;
cout << “——————————–\n”;
cout << “\nWelcome in The Mavita’s Collection Book.\n”;
cout << “Masukkan Pilihan anda :\n\n”;
cout << “ [1] Peminjaman\n”;
cout << “ [2] Pengembalian\n”;
cout << “ [3] Data Buku\n”;
cout << “ [4] Laporan Peminjaman\n”;
cout << “ [5] Hapus buku\n”;
cout << “ [6] Hapus Database\n”;
cout << “ [7] Keluar\n\n”;
cout << “{ Masukkan angka antara [1-7] }\n\n”;
cout << “Pilihan anda : “;
cin.getline(sb,100);
p=atoi(sb);
clrscr();
}
return(p);
}
//Fungsi untuk menampilkan header pada tabel data buku
void header_kolom(){
int i;
for(i=0;i<80;i++) cout << “-”;
cout.setf(ios::left);
cout.width(12);
cout << “Kategori”;
cout.width(16);
cout << “Judul Buku”;
cout.width(16);
cout << “Pengarang”;
cout.width(15);
cout << “Penerbit”;
cout.width(15);
cout << “Harga sewa”;
cout.width(2);
cout << “Pinjam”;
for(i=0;i<80;i++) cout << “-”;
}
//Fungsi untuk memproses Peminjaman buku
void peminjaman(){
buku bfr;
char pb[100],sb[100],kb0[8],kb1[8],judul[20];
int len,sama,jumlah,pnjm_baru;
pb[0]=’U';
while((pb[0]==’U')||(pb[0]==’u')){
fstream file(FILE,ios::in|ios::out|ios::binary|ios::ate);
//Jika tidak bisa melakukan penulisan pada file database
if(!file.good()){
break;
}
cout < Peminjaman\n =========\n\n”;
len=100;
while((len25)){
cout << “Masukkan kategori buku : “;
cin.getline(sb,100);
len=strlen(sb);
if((len25))
cout << “\nMasukkan salah!\nKategori antara [1-25]
karakter.\n\n”;

}
strcpy(kb0,sb);
file.seekg(0,ios::beg);
sama=0;
while((!file.eof())&&(sama==0)){
file.read((char *)&bfr,sizeof(bfr));
bfr.get_kategori(kb1);
bfr.get_judul(judul);
if(strcmp(kb0,kb1)==0){
sama++;
cout << “\nKategori judul Buku” << kb0 <<” sudah terdaftar.\n\n”;
cout << “Judul Buku : ” << judul << “\n”;
cout << “Pinjam sblm peminjaman : ” << bfr.get_pnjm() <98){
cout << “\nPinjam penuh!\n”;
cout <99)||(jumlah<1)){
cout <99)||(jumlah<1)){
cout << “\nMasukkan angka [1-99]“;
cout << (99-(bfr.get_pnjm()));
}
}
bfr.set_pnjm(pnjm_baru);
cout << “Pinjam sekarang : ” << pnjm_baru << “\n\n”;
}
}
}
if(sama==0){
file.close();
fstream file1(FILE,ios::out|ios::binary|ios::app);
bfr.input_buku(kb0);
file1.write((char *)&bfr,sizeof(bfr));
file1.close();
}
else {
file.seekp((int)(0-(sizeof(bfr))),ios::cur);
file.write((char *)&bfr,sizeof(bfr));
file.close();
}
pb[0]=’Z';
while(((pb[0]!=’U')&&(pb[0]!=’u')&&(pb[0]!=’T')&&(pb[0]!=’t'))
||(strlen(pb)!=1)){
cout << “\nTekan ‘U’ untuk melakukan peminjaman lagi atau “;
cout << “‘T’ untuk selesai : “;
cin.getline(pb,100);
}
}
clrscr();
}
//Fungsi untuk memproses pengembalian buku
void pengembalian(){
buku bfr;
char pb[100],sb[100],kb0[8],kb1[8],judul[50],a_judul[50][50];
int len,a,sama,jumlah,pnjm_baru,terpinjam,a_sewa[50];
long hargasewa,a_hargasewa[12],total;
strcpy(pb,”U”);
a=0;
a_sewa[0]=0;
while((pb[0]==’U')||(pb[0]==’u')){
fstream file(FILE,ios::in|ios::out|ios::binary|ios::ate);
//Jika tidak bisa melakukan penulisan pada file database
if(!file.good()){
break;
}
cout < Pengembalian\n =========\n”;
len=100;
while((len25)){
cout << “\nMasukkan kategori judul buku : “;
cin.getline(sb,100);
len=strlen(sb);
if((len25))
cout << “\nMasukkan salah!\nKategori antara [1-27] karakter.\n\n”;
}
strcpy(kb0,sb);
file.seekg(0,ios::beg);
sama=0;
while((!file.eof())&&(sama==0)){
file.read((char *)&bfr,sizeof(bfr));
bfr.get_kategori(kb1);
bfr.get_judul(judul);
hargasewa=(long)(bfr.get_hargasewa());
terpinjam=bfr.get_terpinjam();
if(strcmp(kb0,kb1)==0){
sama++;
cout << “\n\nKategori Judul Buku :” << kb0 << ” \n”;
cout << “Judul Buku : ” << judul << “\n”;
cout << “Harga sewa : ” << hargasewa<< “\n”;
cout << “Pinjam sblm pengembalian : ” << bfr.get_pnjm() <<”\n”;
if(bfr.get_pnjm()<1){
cout << “\nPinjam habis!\n”;
cout << “Tidak bisa melakukan pengembalian buku tsb.\n\n”;
}
else{
pnjm_baru=-1; jumlah=0;
while((pnjm_baru<0)||(jumlah<1)){
cout << “\nMasukkan jumlah pengembalian : “;
cin.getline(sb,100);jumlah=atoi(sb);
pnjm_baru=(bfr.get_pnjm())-jumlah;
if((pnjm_baru<0)||(jumlah<1)){
if(bfr.get_pnjm()==1)
cout << “Pinjam Buku tinggal 1″;
else{
cout << “\nMasukkan angka [1]“;
cout << bfr.get_pnjm();
}
}
}
bfr.set_pnjm(pnjm_baru);
bfr.set_terpinjam(terpinjam+jumlah);
a_sewa[a]=jumlah;
a_hargasewa[a]=hargasewa;
strcpy(a_judul[a],judul);
a++;
cout << “Pinjam sekarang : ” << pnjm_baru << “\n\n”;
}
}
}
if(sama==0) cout << “\nKategori buku tidak terdaftar pada database!\n”;
else {
file.seekp((int)(0-(sizeof(bfr))),ios::cur);
file.write((char *)&bfr,sizeof(bfr));
}
file.close();
pb[0]=’Z';
while(((pb[0]!=’U')&&(pb[0]!=’u')&&(pb[0]!=’T')&&(pb[0]!=’t'))
||(strlen(pb)!=1)){
cout << “\nTekan ‘U’ untuk melakukan pengembalian lagi atau “;
cout << “‘T’ untuk selesai : “;
cin.getline(pb,100);
}
}
//Jika proses pengembalian telah selesai maka
tampilkan nota pengembalian

a_sewa[a]=0;
cout < Nota Pengembalian\n ==========\n\n”;
//Menampilkan header tabel nota pengembalian
for(a=0;a<80;a++) cout << “-”;
cout.setf(ios::left);
cout.width(12);
cout << “No”;
cout.width(16);
cout << “Judul buku”;
cout.width(16);
cout << “Harga sewa”;
cout.width(16);
cout << “Jumlah buku”;
cout.width(4);
cout << “Total”;
cout << endl;
for(a=0;a<80;a++) cout << “-”;
//Menampilkan isi tabel nota pengembalian
a=0;
total=0;
while(a_sewa[a]!=0){
cout.width(12);
cout << (a+1);
cout.width(16);
cout << a_judul[a];
cout.width(16);
cout << a_hargasewa[a];
cout.width(16);
cout << a_sewa[a];
cout.width(4);
cout << a_hargasewa[a]*a_sewa[a];
total=total+(a_hargasewa[a]*a_sewa[a]);
cout << endl;
a++;
}
//Menampilkan total harga keseluruhan
for(a=0;a<80;a++) cout << “-”;
cout.width(50);
cout << “Total Harga Keseluruhan : “;
cout.width(50);
cout << total;
cout << endl;
for(a=0;a<80;a++) cout << “-”;
cout << “\nTekan Enter untuk melanjutkan”;
cout << “\n=============================”;
cin.get();
clrscr();
}
//Fungsi untuk memproses penghapusan buku
void hapus_buku(){
buku bfr;
char pb[100],sb[100],kb0[8],kb1[8],judul[20];
int len,sama;
pb[0]=’U';
while((pb[0]==’U')||(pb[0]==’u')){
fstream file(FILE,ios::in|ios::out|ios::binary|ios::ate);
//Jika tidak bisa melakukan penulisan pada file database
if(!file.good()){
break;
}
cout < Penghapusan Buku\n ============\n”;
len=100;
while((len25)){
cout << “Masukkan Kategori judul buku : “;
cin.getline(sb,100);
len=strlen(sb);
if((len25))
cout << “\nMasukkan salah!\nKategori antara [1-27]
karakter.\n”;

}
strcpy(kb0,sb);
file.seekg(0,ios::beg);
sama=0;
while((!file.eof())&&(sama==0)){
file.read((char *)&bfr,sizeof(bfr));
bfr.get_kategori(kb1);
bfr.get_judul(judul);
if(strcmp(kb0,kb1)==0) sama++;
}
if(sama==0)
cout << “\nKategori buku tidak terdaftar !\n”;
else {
cout << “\nKategori judul buku :” << kb0 << “\n\n”;
cout << “Judul buku : ” << judul << “\n”;
cout << “Jumlah pinjam : ” << bfr.get_pnjm() <<”\n”;
sb[0]=’Z';
while(((sb[0]!=’Y')&&(sb[0]!=’y')&&(sb[0]!=’T')&&(sb[0]!=’t'))
||(strlen(sb)!=1)){
cout << “\nAnda yakin ingin menghapus Buku ini ? “;
cout << “\nTekan ‘Y’ jika setuju atau ‘T’ untuk membatalkan : “;
cin.getline(sb,100);
}
if((sb[0]==’Y')||(sb[0]==’y')){
bfr.hapus();
bfr.set_terpinjam(0);
file.seekp((int)(0-(sizeof(bfr))),ios::cur);
file.write((char *)&bfr,sizeof(bfr));
}
cout << “\nData Buku telah dihapus”;
}
file.close();
pb[0]=’Z';
while(((pb[0]!=’U')&&(pb[0]!=’u')&&(pb[0]!=’T')&&(pb[0]!=’t'))
||(strlen(pb)!=1)){
cout << “\n\nTekan ‘U’ untuk melakukan penghapusan lagi atau “;
cout << “‘T’ untuk selesai : “;
cin.getline(pb,100);
}
}
clrscr();
}
//Fungsi untuk menampilkan data buku yang
terdaftar pada Database

void data_buku(){
buku bfr;
int i;
char kategori[50];
ifstream file(FILE,ios::in|ios::binary|ios::ate);
file.seekg(0,ios::beg);
cout < Data Buku\n ==============\n\n”;
header_kolom();
while(!file.eof()){
file.read((char *)&bfr,sizeof(bfr));
bfr.get_kategori(kategori);
if((!file.eof())&&(strcmp(kategori,”#NULL#”)!=0)) bfr.tampil();
}
for(i=0;i<80;i++) cout << “-”;
cout << “\nTekan Enter untuk kembali ke menu utama”;
cout << “\n=======================================”;
cin.get();
file.close();
clrscr();
}
//Fungsi untuk menampilkan Laporan pengembalian
void laporan(){
int i,no;
long total;
char judul[50];
buku bfr;
ifstream file(FILE,ios::in|ios::binary|ios::ate);
file.seekg(0,ios::beg);
cout < Laporan Pengembalian\n ==========\n\n”;
//Menampilkan header tabel laporan pengembalian
for(i=0;i<80;i++) cout << “-”;
cout.setf(ios::left);
cout.width(15);
cout << “No”;
cout.width(25);
cout << “Judul Buku”;
cout.width(25);
cout << “Harga Sewa”;
cout.width(15);
cout << “Total Biaya”;
for(i=0;i<80;i++) cout << “-”;
//Menampilkan isi tabel laporan pengembalian
no=0;
total=0;
while(!file.eof()){
file.read((char *)&bfr,sizeof(bfr));
if((!file.eof())&&(bfr.get_terpinjam()!=0)){
no++;
cout.width(15);
cout << no;
bfr.get_judul(judul);
cout.width(25);
cout << judul;
cout.width(25);
cout << bfr.get_hargasewa();
cout.width(15);
cout << bfr.get_hargapinjam();
}
}
//Menampilkan total Laba keseluruhan
for(i=0;i<80;i++) cout << “-”;
cout << “\nTekan Enter untuk kembali ke menu utama”;
cout << “\n=======================================”;
cin.get();
file.close();
clrscr();
}
void hapus_database(){
char sb[100];
fstream file(FILE,ios::in|ios::out|ios::binary|ios::ate);
if(file.good()){
file.close();
sb[0]=’N';
while((sb[0]!=’Y')&&(sb[0]!=’y')&&(sb[0]!=’T')&&(sb[0]!=’t')){
cout << “\nPERHATIAN !!\n”;
cout << “============\n\n”;
cout << “Perintah ini akan menghapus seluruh data Buku !\n\n”;
cout << “Anda yakin mau mengeksekusi perintah ini ?\n”;
cout << “Tekan ‘Y’ jika setuju atau ‘T’ untuk membatalkan\n\n”;
cout << “Pilihan anda : “;
cin.getline(sb,100);
if(strlen(sb)!=1) sb[0]=’N';
}
if((sb[0]==’Y')||(sb[0]==’y')){
ofstream file(FILE);
file.close();
cout << “\nSeluruh Data Buku telah terhapus !!\n\n\n”;
cout << “Tekan Enter untuk kembali ke menu utama “;
cout << “\n=======================================”;
cin.get();
}
}
clrscr();
}

class

Sebuah kelas merupakan konsep yang diperluas struktur data: bukan hanya memegang data, dapat menyimpan data maupun fungsi.

Sebuah objek adalah sebuah Instansiasi dari sebuah kelas. Dalam hal variabel, sebuah kelas akan menjadi tipe, dan objek akan menjadi variabel.

Kelas umumnya dideklarasikan menggunakan kata kunci class, dengan format berikut:

kelas class_name (
access_specifier_1:
member1;
access_specifier_2:
member2;

) Object_names;

Mana class_name adalah identifier yang valid untuk kelas, merupakan pilihan object_names daftar nama untuk objek kelas ini. Tubuh deklarasi dapat berisi anggota, yang dapat berupa data atau fungsi deklarasi, dan akses opsional specifiers.

Semua ini sangat mirip dengan deklarasi pada struktur data, kecuali bahwa sekarang kita bisa juga menyertakan fungsi dan anggota, tapi juga hal baru ini disebut akses specifier. Specifier akses adalah salah satu dari tiga kata kunci: swasta, publik atau dilindungi. Specifiers ini mengubah hak akses yang mengikuti mereka para anggota mendapatkan:

* Pribadi anggota suatu kelas hanya dapat diakses dari dalam anggota-anggota lain dari kelas yang sama atau dari teman-teman mereka.
* Dilindungi anggota dapat diakses dari anggota kelas yang sama mereka dan dari teman-teman mereka, tetapi juga dari anggota turunan kelas mereka.
* Akhirnya, anggota publik dapat diakses dari mana saja dimana objek terlihat.

Secara default, semua anggota kelas kelas menyatakan dengan kata kunci memiliki akses pribadi untuk semua anggotanya. Oleh karena itu, setiap member yang dinyatakan sebelum salah satu specifier kelas lain secara otomatis memiliki akses pribadi. Contoh:

kelas CRectangle (
int x, y;
publik:
void set_values (int, int);
int area (void);
) Rect;

Menyatakan kelas (yakni, tipe) disebut CRectangle dan objek (misalnya, variabel) dari kelas ini disebut rect. Kelas ini berisi empat anggota: dua anggota data bertipe int (anggota anggota x dan y) dengan akses private (karena private adalah default tingkat akses) dan dua anggota fungsi dengan akses publik: set_values () dan area (), yang untuk sekarang kita hanya memasukkan pernyataan mereka, bukan definisi mereka.

Perhatikan perbedaan antara nama kelas dan nama objek: Pada contoh sebelumnya, CRectangle adalah nama kelas (yaitu, jenis), sedangkan rect adalah objek tipe CRectangle. Ini adalah hubungan yang sama int dan miliki dalam deklarasi berikut:

int a;

mana int adalah nama tipe (kelas) dan a adalah nama variabel (objek).

Setelah deklarasi sebelumnya CRectangle dan rect, kita bisa lihat dalam tubuh program untuk setiap anggota publik dari objek rect seolah-olah mereka normal normal fungsi atau variabel, hanya dengan memasukkan nama objek diikuti oleh sebuah titik (. ) dan kemudian nama anggota. Semua sangat mirip dengan apa yang kami lakukan dengan struktur data sederhana sebelumnya. Contoh:

rect.set_values (3,4);
myarea = rect.area ();

Satu-satunya anggota rect bahwa kita tidak dapat mengakses dari tubuh program kami di luar kelas adalah x dan y, karena mereka memiliki akses pribadi dan mereka hanya dapat dirujuk dari dalam anggota-anggota lain dari kelas yang sama.

Berikut adalah contoh lengkap kelas CRectangle:

/ / Kelas contoh
# include <iostream>
using namespace std;

kelas CRectangle (
int x, y;
publik:
void set_values (int, int);
int area () (return (x * y);)
);

void CRectangle:: set_values (int a, int b) (
x = a;
y = b;
)

int main () (
CRectangle rect;
rect.set_values (3,4);
cout << “area:” <<rect.area ();
return 0;
)

Yang paling penting hal baru dalam kode ini adalah operator dari lingkup (::, dua titik dua) termasuk dalam definisi set_values (). Hal ini digunakan untuk menentukan anggota kelas dari luar definisi kelas itu sendiri.

Anda mungkin memperhatikan bahwa definisi fungsi anggota area () telah dimasukkan secara langsung di dalam definisi kelas CRectangle diberikan dengan sangat sederhana, sedangkan set_values () hanya memiliki prototipe yang dideklarasikan dalam kelas, tetapi definisi yang di luar itu. Dalam deklarasi di luar ini, kita harus menggunakan operator scope (::) untuk menentukan bahwa kita sedang mendefinisikan sebuah fungsi yang merupakan anggota kelas CRectangle dan bukan fungsi global biasa.

Ruang lingkup operator (::) menetapkan kelas yang dinyatakan anggota berada, memberikan lingkup yang persis sama sifat seolah-olah ini definisi fungsi itu langsung dimasukkan dalam definisi kelas. Sebagai contoh, dalam fungsi set_values () dari kode sebelumnya, kita telah dapat menggunakan variabel x dan y, yang merupakan anggota privat kelas CRectangle, yang berarti mereka hanya dapat diakses dari anggota-anggota lain dari kelas mereka.

Satu-satunya perbedaan antara mendefinisikan fungsi anggota kelas benar-benar berada dalam kelas atau hanya menyertakan prototipe dan kemudian definisinya, adalah bahwa dalam kasus pertama, fungsi akan secara otomatis dianggap sebagai fungsi anggota inline oleh compiler, sedangkan di yang kedua akan menjadi normal (tidak-inline) fungsi anggota kelas, yang sebenarnya tidak mengandaikan perbedaan perilaku.

Anggota x dan y memiliki akses swasta (ingat bahwa jika tidak ada lagi yang mengatakan, semua anggota kelas kelas didefinisikan dengan kata kunci memiliki akses pribadi). Dengan menyatakan mereka swasta kita menolak akses kepada mereka dari mana saja di luar kelas. Ini masuk akal, karena kita telah mendefinisikan fungsi anggota untuk mengatur nilai-nilai bagi para anggota dalam benda: set_values fungsi anggota (). Oleh karena itu, seluruh program tidak perlu memiliki akses langsung ke mereka. Mungkin dalam contoh sederhana seperti ini, sulit untuk melihat sebuah utilitas dalam melindungi dua variabel, tetapi dalam proyek-proyek yang lebih besar mungkin akan sangat penting bahwa nilai-nilai tidak dapat diubah dalam cara yang tak terduga (yang tidak terduga dari sudut pandang dari objek ).

Salah satu keuntungan yang lebih besar dari sebuah kelas adalah bahwa, sebagai jenis lain, kita dapat menyatakan beberapa benda itu. Sebagai contoh, berikut dengan contoh sebelumnya kelas CRectangle, kita bisa menyatakan objek rectb di samping objek rect:

/ / Contoh: satu kelas, dua benda
# include <iostream>
using namespace std;

kelas CRectangle (
int x, y;
publik:
void set_values (int, int);
int area () (return (x * y);)
);

void CRectangle:: set_values (int a, int b) (
x = a;
y = b;
)

int main () (
CRectangle rect, rectb;
rect.set_values (3,4);
rectb.set_values (5,6);
cout << “rect area:” <<rect.area () <<endl;
cout << “rectb area:” <<rectb.area () <<endl;
return 0;
)

rect area: 12
rectb area: 30

Dalam kasus konkret, kelas (tipe dari obyek) yang kita bicarakan adalah CRectangle, yang ada dua contoh atau objek: rect dan rectb. Masing-masing anggota memiliki variabel dan fungsi anggota.

Perhatikan bahwa panggilan untuk rect.area () tidak memberikan hasil yang sama seperti panggilan untuk rectb.area (). Hal ini disebabkan karena setiap objek CRectangle kelas memiliki variabel x dan y, seperti mereka, dengan cara tertentu, juga memiliki fungsi masing-masing anggota set_value () dan area () yang masing-masing objeknya menggunakan variabel sendiri untuk beroperasi.

Itu adalah konsep dasar pemrograman berorientasi objek: data dan fungsi anggota kedua objek. Kami tidak lagi menggunakan set variabel global yang kita lulus dari satu fungsi sebagai parameter lain, melainkan kita menangani objek yang memiliki data mereka sendiri dan fungsinya sebagai anggota tertanam. Perhatikan bahwa kita tidak harus memberikan parameter dalam salah satu panggilan ke rect.area atau rectb.area. Fungsi anggota tersebut secara langsung menggunakan anggota data dari masing-masing objek rect dan rectb.

Konstruktor dan destructors
Objek umumnya perlu menginisialisasi variabel atau menetapkan memori dinamis selama proses penciptaan mereka untuk menjadi operasi dan untuk menghindari kembali nilai-nilai yang tak terduga selama eksekusi mereka. Sebagai contoh, apa yang akan terjadi jika pada contoh sebelumnya kita disebut fungsi anggota area () sebelum memiliki fungsi yang disebut set_values ()? Mungkin kita akan mendapatkan hasil yang belum ditentukan karena anggota x dan y akan belum pernah diberi sebuah nilai.

Untuk menghindari itu, suatu kelas dapat menyertakan fungsi khusus yang disebut constructor, yang disebut secara otomatis setiap kali objek baru dari kelas ini dibuat. Ini fungsi konstruktor harus memiliki nama yang sama dengan kelas, dan tidak dapat memiliki jenis kembali; bahkan tidak berlaku.

Kita akan menerapkan CRectangle termasuk constructor:

/ / Example: class constructor
# include <iostream>
using namespace std;

kelas CRectangle (
int width, height;
publik:
CRectangle (int, int);
int area () (return (width * height);)
);

CRectangle:: CRectangle (int a, int b) (
width = a;
height = b;
)

int main () (
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << “rect area:” <<rect.area () <<endl;
cout << “rectb area:” <<rectb.area () <<endl;
return 0;
)

Seperti yang anda lihat, hasil dari contoh ini identik dengan sebelumnya. Tapi sekarang kami telah menghapus fungsi anggota set_values (), dan telah menyertakan sebaliknya constructor yang melakukan tindakan yang sama: ia menginisialisasi nilai-nilai lebar dan tinggi dengan parameter yang diberikan kepada hal itu.

Perhatikan bagaimana argumen-argumen ini dilewatkan ke constructor pada saat di mana objek kelas ini dibuat:

CRectangle rect (3,4);
CRectangle rectb (5,6);

Konstruktor tidak bisa disebut secara eksplisit seolah-olah mereka fungsi anggota biasa. Mereka hanya dijalankan ketika sebuah objek baru dari kelas yang dibuat.

Anda juga dapat melihat seberapa baik deklarasi constructor prototipe (dalam kelas) maupun yang kedua mencakup definisi constructor return value; bahkan tidak berlaku.

The destructor memenuhi fungsi sebaliknya. Hal ini secara otomatis dipanggil ketika sebuah objek dihancurkan, baik karena lingkup keberadaannya telah selesai (misalnya, apakah itu didefinisikan sebagai objek lokal dalam fungsi dan tujuan fungsi) atau karena ini adalah obyek yang ditetapkan secara dinamis dan dilepaskan menggunakan operator delete.

The destructor harus memiliki nama yang sama dengan kelas, tetapi didahului dengan tanda tilde (~) dan harus juga tidak mengembalikan nilai.

Penggunaan destructors khususnya cocok jika sebuah benda memberikan memori dinamis selama masa pakai baterai dan pada saat sedang dihancurkan kita ingin melepaskan memori objek yang dialokasikan.

/ / Contoh di konstruktor dan destructors
# include <iostream>
using namespace std;

kelas CRectangle (
int * width, * height;
publik:
CRectangle (int, int);
~ CRectangle ();
int area () (return (* width * * height);)
);

CRectangle:: CRectangle (int a, int b) (
width = new int;
height = new int;
* width = a;
* height = b;
)

CRectangle:: ~ CRectangle () (
delete width;
delete height;
)

int main () (
CRectangle rect (3,4), rectb (5,6);
cout << “rect area:” <<rect.area () <<endl;
cout << “rectb area:” <<rectb.area () <<endl;
return 0;
)

OVERLOADING OPERATOR

Dasar Teori

Jika kita mempunyai ekspresi dibawah ini :

int a, b, c;

a = b + c;

adalah benar, selama variable-variabel tersebut merupakan tipe data dasar. Namun tidak demikian halnya dengan contoh berikut:

struct {

char product [50];

float price; } a, b, c;

a = b + c;

Tetapi C++ memungkinkan hal seperti diatas dengan menggunakan overload operator.

Dibawah ini adalah operator-operator yang dapat dioverload:

+ – * / = < > += -= *= /= << >>

<<= >>= == != <= >= ++ — % & ^ ! |

~ &= ^= |= && || %= [] () new delete

Untuk mengoverload operator kita cukup menuliskan satu fungsi anggota class dengan nama operator diikuti dengan operator apa yang akan dioverload. Syntaxnya sbb:

type operator sign (parameters);

Misal : Kita akan menjumlahkan vector 2 dimensi a(3,1) and b(1,2). Hasilnya adalah sbb: (3+1,1+2) = (4,3). Untuk keperluan ini maka kita dapat mengoverload operator + seperti dalam contoh berikut :

Contoh 5.1 :

// vectors: overloading operators example

#include

class CVector {

public:

int x,y;

CVector () {};

CVector (int,int);

CVector operator + (CVector);

};

CVector::CVector (int a, int b) {

x = a;

y = b;

}

CVector CVector::operator+ (CVector param) {

CVector temp;

temp.x = x + param.x;

temp.y = y + param.y;

return (temp);

}

int main () {

CVector a (3,1);

CVector b (1,2);

CVector c;

c = a + b;

cout << c.x << “,” << c.y;

return 0;

}

Output:

4,3

Jika kita bingung dengan banyaknya pernyataan CVector yg dipakai, perhatikan bahwa beberapa mengacu pada class CVector dan beberapa merupakan fungsi.

CVector (int, int); // fungsi CVector (constructor)

CVector operator+ (CVector); // fungsi operator+ yang return value-nya

// bertipe CVector

Fungsi operator+ dalam class CVector yang bertipe CVector tersebut digunakan untuk mengoverload operator + , sehingga pada program untuk menjumlahkan vector a ,b dan hasilnya disimpan di vector c kita dapat menggunakan salah satu instruksi berikut:

c = a + b;

c = a.operator+ (b);

Perhatikan bahwa kita juga harus mengikutkan empty constructor (tanpa parameter) yang kita definisikan dengan blok tanpa instruksi.

CVector () { };

Ini penting, karena kita mempunyai deklarasi

CVector temp;

CVector c:

Sehingga jika empty constructor tersebut dihilangkan maka dua deklarasi tersebut menjadi tidak valid..

Empty constructor dapat juga dideklarasikan seperti dibawah ini :

CVector () { x=0; y=0; };

dan untuk menyederhanakan penulisan maka tidak disertakan.

Langkah pemahaman materi

  1. Cobalah contoh program 5.1 diatas.
    1. Ganti instruksi

c = a + b;

dengan instruksi

c = a.operator+ (b);

    1. Tambahkan fungsi untuk mengoverload operator pengurangan dan gunakan fungsi tersebut untuk mengurangi kedua vector diatas.
  1. Modifikasilah contoh 5.1 untuk menjumlahkan dua vektor dalam ruang 3D

Cth : a (2,3,4)

b(5,6,7)

c=a+b = (7,9,11)

  1. Modifikasi program 5.1 untuk mengalikan vector dengan konstanta misal:

Vector v(2,3) dan konstanta k=4.

Diharapkan h = v * k akan memberikan hasil (8,12).

Petunjuk : buat fungsi untuk mengoverload operator *

  1. Cobalah program berikut ini. Program digunakan untuk mengoverload operator * sehingga pada saat objek dikalikandengan bilangan lain hasilnya adalah penjumlahan dari objek dan bilangan tersebut.

#include

#include

class kali {

public:

int a;

kali (int);

int operator*(int);

};

kali::kali(int x)

{a=x;}

int kali::operator*(int b)

{return (a+b);}

main() {

kali a(5);

int b,c;

b=3;

c=a*b;

cout<<“c = “<

int d,e,f;

d=5; e=6;

f=d*e;

cout<<“\nf = “<

getch();

}

Modifikasilah program diatas agar operator + yang dikenakan terhadap dua bilangan integer hasilnya adalah perkalian kedua bilangan tersebut.

Petunjuk : Buat fungsi untuk mengoverload operator + agar hasilnya *.

  1. Cobalah contoh 6.3 diatas. Program digunakan untuk mengoverload operator ++ agar pada saat digunakan nilainya bertambah 10.

#include

#include

class plus{

public:

int x;

plus(int);

void operator++();

};

plus::plus(int a)

{x=a;}

void plus::operator++()

{x=x+10;}

main(){

plus a(5);

a++;

cout<<“a = “<

int b=5;

b++;

cout<<“\nb = “<

getch);

}

Modifikasilah program tersebut untuk mengoverload operator – agar pada saat operator tersebut digunakan nilainya berkurang 5

PENURUNAN CLASS
Dalam pemrograman berorientasi objek, pewarisan (inheritance) merupakan salah satu sifat utama yang menjadi ciri dari konsep pemrograman OOP. Suatu kelas dasar dalam program memiliki kemampuan untuk mewariskan sifat-sifat yang terdapat didalamnya ke kelas turunannya. Kelas dasar yang dimaksud disini adalah kelas yang akan dijadikan sebagai induk (base class) yang akan menurunkan sifat-sifatnya kedalam kelas-kelas turunannya (derived class).
Untuk mempermudah pemahaman, bentuk listing disini akan saya pecah menjadi beberapa bagian, sedangkan dalam bentuk aslinya ini merupakan satu kesatuan program dan jangan dipecah-pecah menjadi beberapa file 

Berikut ini contoh kelas dasar yang akan digunakan untuk membuat kelas turunan :

#include <iostream>

using namespace std;

class induk {
int x;
public:
void setX(int xx) {
x=xx;
}

int getX() {
return x;
}
}

Sekarang kita akan membuat kelas yang diturunkan dari kelas induk diatas :

class turunan: public induk {
int y;
public:
void setY(int yy) {
y=yy;
}

int getY() {
return y;
}
}

Untuk mengaplikasikan proses pewarisannya sekarang kita buat fungsi utamanya :

int main() {

induk a; // membuat instan kelas induk : a
a.setX(12);

cout<<”Nilai x yang akan dipanggil dari kelas induk : ”;
cout<<a.getX()<<endl;
cout<<”\n”<<endl;

turunan b; //membuat instan kelas turunan : b
b.setY(40);

cout<<”Nilai y yang terdapat pada kelas turunan : “;
cout<<a.getX()<<endl;
cout<<”\n”<<endl;

b.setX(35);

cout<<”Nilai x yang dipanggil dari kelas turunan : “;
cout<<b.getX()<<endl;
cout<<”\n”<<endl;

return 0;
}

Dari fungsi utama diatas kita dapat melihat bagaimana kelas dasar menurunkan sifat-sifatnya kedalam kelas turunannya bisa dilihat baris kode berikut :

b.setX(35);

cout<<”Nilai x yang dipanggil dari kelas turunan : “;
cout<<b.getX()<<endl;
cout<<”\n”<<endl;

Kelas turunan dapat memanggil fungsi yang terdapat dalam kelas utama setX() dengan memasukan nilai baru 35 dan memanggil fungsi getX(), hal ini terjadi karena kelas turunan mewariskan sifat objek yang ada pada kelas induk

About Sintata
Seek and Share Knowledge

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: