Arsip Penulis: Hendra,MT

Tentang Hendra,MT

Hendra,S.Kom.,MT. lahir di Tangerang tahun 1975. Menamatkan gelar sarjana komputer di Universitas Bina Nusantara tahun 1998 dan Magister Teknik Elektro di Universitas Trisakti Jakarta tahun 2001. Disamping sebagai praktisi IT di perusahaan IT Services, juga aktif mengajar di Binus University sejak 1999.

Introduction String Class

String pada prinsipnya merupakan array bertipe karakter (Array of char)

String is Array of Char

C++ menyediakan library class <string>  untuk melakukan berbagai operasi string, seperti: penggabungan string (concatination), perbandingan string (comparison) dan juga operasi substring (insert, replace, erase, search).

Berikut ini beberapa fungsi string di C yang dapat dilakukan oleh Class String di C++.

No. C C++
1. strcpy(s1,s2) =
2. strcat(s1,s2) +=
3. strcmp(s1,s2) ==, !=, <, >, <=, >=
4. strchr(s1,ch) find(s1,ch)
5. strstr(s1,s2) find(s1,s2)
6. strrchr(s1,ch) rfind(s1,ch)
7. strlen(S1) size(s1) or length(s1)

Selengkapnya untuk contoh coding C++ string dapat dilihat pada referensi berikut ini.

http://www.cplusplus.com/reference/string/string/

https://www.tutorialspoint.com/cplusplus/cpp_strings.htm

 

 

 

Program Login

Mari main program C++ untuk membuat halaman login aplikasi kita.

#include <iostream>
#include <conio.h> //getch()
#include <windows.h> //COORD
using namespace std;
void setxy(int x, int y)
{   COORD coord={x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int main ()
{
char text1[]="Please Login First!";
char text2[]="===================";
char user[80];
string password;
setxy(30,5); //go to center screen
cout<<text1;
setxy(30,6);cout<<text2;
setxy(30,9);cout<<"Username : ";
setxy(30,10);cout<<"Password : ";
setxy(41,9);cin.getline(user,sizeof(user));
setxy(41,10);
char ch = getch();
while(ch != 13){ //Char 13 = enter
    password.push_back(ch);
    cout << '*';
    ch = getch();
}
if (password=="CobaAja")
{   system("cls"); //clear console
    cout << "Welcome back " << user <<endl;
    system( "color 1f" );
}
else
{   system("cls"); cout << "Go Away " << user << "!\n";
}
getch();
return 0;
}

Ada yang tahu passwordnya apa?

Untuk mengganti warna, silakan gunakan Color Code berikut ini.
Caranya?
system( “color 17” ); //Bg=1=Blue FG=7=White

O- black
1-blue
2-green
3-aqua
4-red
5-purple
6-yellow
7-white
8-gray
9- light blue
a- light green
b- light aqua
c- light red
d- light purple
e- light yellow
f- bright white

Selamat mencoba, semoga sukses.

Program Hitung Nilai Akhir

Mari kita main program CPP untuk menghitung nilai akhir kita.

#include <iostream>
#include <conio.h>
using namespace std;
 int main()
 {
	system("cls");
	char nama [60] ;
	int tugas,uts,uas,prak;
	int final;
	printf("PROGRAM HITUNG NILAI AKHIR");
	printf("\n=============================\n");
	cout<<"Nama mahasiswa = "; cin.getline(nama,60);
	cout<<"Nilai Tugas = "; cin>>tugas;
	cout<<"Nilai UTS = "; cin>>uts;
	cout<<"Nilai UAS = "; cin>>uas;
	cout<<"Nilai Praktikum = "; cin>>prak;
	final=tugas*20/100 + uts*30/100 + uas*50/100;
	final=final*50/100 + prak*50/100;
	printf("\nMau tahu nilainya? Enter saja! \n");
	getch();
	cout<<"\nNilai akhir " << nama << " = " << final;
	getch();
 }

Program ini akan menghasilkan output:

Selamat mencoba, semoga sukses.

C++ Overloading Operator: What, When, Where, Which, Why & How

  • Apa itu Overloading Operator?

Anda tentu sudah membaca artikel tentang overloading function.
Dalam C++ Operator overloading dikenal sebagai ad-hoc polymorphism, yakni jenis polymorphism dimana operator seperti +, = atau == diperlakukan sebagai fungsi polymorphic yang dapat memiliki behavior yang berbeda tergantung jenis argumentnya.
Overloaded operator merupakan fungsi dengan nama berupa simbol operator yang akan didefinisikan. Sebagai fungsi, overloaded operator juga memiliki return type dan argument/parameter.

Format penulisan Overloaded operator:
Type  operatoroperator_symbol (parameter)

myclass  operator(myclass);

  • Kapan menggunakan Overloading Operator?

Operator overloading digunakan untuk menyesuaikan perilaku operator yang berbeda.
Operator overloading baik digunakan saat meningkatkan kejelasan / kemudahan kelas yang Anda gunakan.
misalnya, overloading operator + untuk menjumlahkan object segiempat dengan cara yang jelas (jumlah panjangnya atau lebarnya).
Jangan menggunakan operator overloading hanya karena bisa dilakukan atau melakukan trik yang cerdik.
Tujuan overloading operator adalah membuat program lebih jelas dengan memberikan makna konvensional untuk operator seperti, ==, [], +, dan lainnya.
Misalnya, operator + seharusnya di-overload untuk melakukan penambahan, dan bukan pengurangan atau lainnya.
Hindari penggunaan overloading operator secara berlebihan atau tidak konsisten, karena ini bisa membuat sebuah program menjadi tidak jelas dan sulit dibaca.

  • Dimana Overloading Operator digunakan?

Overloading Operator digunakan dimana Anda membutuhkan operasi yang berbeda di dalam program C++ Anda.
C++ menyediakan sejumlah operator yang dapat di overload berikut ini.

+

* / % ^

&

| ~ ! ,

=

<= >= ++

<< 

>>  == != && ||
+= -= /= %= ^=

&=

|= *= <<= >>= []

()

-> ->* new new [] delete

delete []

  • Yang mana Overloading Operator yang benar?

Anda dapat membuat fungsi overloading untuk melakukan operasi sesuai dengan oparator tersebut di atas.
Anda tidak dapat melakukan overloading pada operator berikut ini.

  • dot (.) operator
  • sizeof operator
  • Scope resolution (::) operator
  • Arithmetic if (?:) operator
  • (.*) operator

Anda juga tidak dapat membuat operator baru; Hanya operator yang tersebut saja yang bisa di-overload.
Anda tidak bisa mengubah prioritas/precedence operator.

  • Mengapa perlu Overloading Operator?

Kita perlu melakukan overloading operator karena build-in operator yang disediakan oleh C++ melakukan fungsi yang alami, misalnya operator penjumlahan: 5 + 5 = 10. Kita memerlukan fungsi yang disesuaikan (user-defined function) secara khusus pada program object oriented kita, misalnya bujursangkar + segiempat = ?.

  • Bagaimana menggunakan Overloading Operator?

Berikut contoh program menggunakan overloading operator penjumlahan.

R1tambahR2

Penjumlahan dua obyek

#include<iostream>
using namespace std;
class Rectangle{
   private:
      int length;
      int width;
   public:
      Rectangle(int length=0, int width=0);
      Rectangle operator+(const Rectangle&) const; //operator+
      int getLength(){return length;}
      int getWidth(){return width;}
      int getArea(){ return length*width;}
};
Rectangle::Rectangle(int length, int width){
    this->length = length;
    this->width = width;
}
// Redefine overloaded operator plus (+)
Rectangle Rectangle::operator+ (const Rectangle& c) const {
    Rectangle result;
    result.length = (this->length + c.length);
    result.width = this->width;
    return result;
}
int main() {
   Rectangle x(4,5);
   Rectangle y(6,5);
   Rectangle z = x + y; // calls Rectangle::operator+(), 
   //note that width R1 must be the same with R2,
   //else will just take width of R1 instead of R2
   cout<<"z.length = "<<z.getLength()<<endl;
   cout<<"z.width = "<<z.getWidth()<<endl;
   cout<<"Area x = "<<x.getArea()<<endl;
   cout<<"Area y = "<<y.getArea()<<endl;
   cout<<"Area z = "<<z.getArea()<<endl;
   cin.get(); 
   return 0;
}

Beberapa contoh program C++ overloading operator dapat Anda lihat disini:
https://www.tutorialspoint.com/cplusplus/cpp_overloading.htm
https://en.wikibooks.org/wiki/C%2B%2B_Programming/Operators/Operator_Overloading

Jenis-jenis Polymorphism

Secara umum Polymorphism dibagi menjadi 2 jenis:

  • Universal Polymorphism : jumah tipe yang dapat dibentuk tidak terbatas (universal)

Jenis polimorphism universal terdiri dari Parametric Polymorphism dan Subtype Polymorphism

  • Ad-hoc Polymorphism : implementasi tipe yang beragam secara potensial dapat dibentuk melalui parameter functionnya.

Jjenis polimorphism Ad-hoc terdiri dari Overloading Polymorphism dan Coercion Polymorphism

Dalam C++ operasi Polymorphism dapat dibagi menjadi 2 jenis:

  • Early Binding / Static Linking -> terjadi pada saat compile time
  • Late Binding / Dynamic Linking -> terjadi pada saat run time

Parametric Polymorphism

Dalam C++, parametric polymorphism di implementasikan dalam bentuk class template.

Berikut ini contoh implementasi parametric polymorphism.

#include <iostream>
using namespace std;
template <class T>
T GetMax (T a, T b) {
  T result;
  result = (a > b) ? a : b;
  return (result);
}
int main() {
  int i = 5, j = 6, k;
  long l = 10, m = 5, n;
  k = GetMax<int>(i, j);       // type parameter: int
  n = GetMax<long>(l, m);      // type parameter: long
  std::cout << k << std::endl;
  std::cout << n << std::endl;
  return 0;
}

 

Inclusion/Dynamic/Subtype Polymorphism

Implementasi dari inclusion polymorphism dalam C++ adalah dengan function overriding.

Berikut ini contoh Inclusion/Dynamic/Subtype Polymorphism dalam C++.

#include <iostream>
using namespace std;
class Bidang 
{	protected:	int lebar, tinggi;
	public:
	Bidang( int a=0, int b=0)
	{ 	lebar = a;
		tinggi = b;
	}
	virtual int luas() // change to virtual int luas()
	{	cout << "Luas Bidang : 0 " << endl;
	}
};
class Segitiga: public Bidang
{	public:
	Segitiga( int a=0, int b=0):Bidang(a, b) { }
	int luas ()
	{	cout << "Luas Segitiga : " 
		     << (lebar * tinggi) << endl;
	}
};
class Segiempat: public Bidang
{	public:
	Segiempat( int a=0, int b=0):Bidang(a, b) { }
	int luas ()
	{	cout << "Luas Segiempat : " 
		 	 << (lebar * tinggi / 2) << endl;
	}
};

int main( )
{	Bidang *bidang;
	Segitiga segitiga(10,7);
	Segiempat segiempat(10,5);
	bidang = &segitiga;
	bidang->luas();
	bidang = &segiempat;
	bidang->luas();
	return 0;
}

Coercion Polymorphism

Implementasi dari Coercion polymorphism dalam C++ adalah dengan konversi tipe data (type casting).
Berikut ini contoh Coercion Polymorphism dalam C++.

#include <iostream>
using namespace std;
int square(int a) 
{  cout << "Square of ints\n";
   return a * a;
}
double square(double a) 
{  cout << "Square of doubles\n";
   return a * a;
}
int main() 
{  double b = 'a';
   int i = 'a';
   cout << square(b) << std::endl;
   cout << square(i) << std::endl;
   cout << square('a') << std::endl;
}

Konsep Polymorphism dalam C++

Masih ingat 3 konsep utama dalam OOP?  Ya itu adalah:

  • Encapsulation
  • Inheritance
  • Polymorphism

Sebelumnya kita sudah bahas 2 konsep utamanya, yaitu Encapsulation dan Inheritance, dan kali ini saya akan bahas mengenai Polymorphism.

Dari asal katanya, Polymorphism diambil dari bahasa Yunani, Poly artinya banyak dan Morph artinya bentuk. Polymorphism dalam OOP dapat diartikan Object yang memiliki operasi yang sama tapi perilaku yang berbeda beda.
Misalnya: Burung dan Pinguin yang sama sama memiliki atribut sayap untuk operasi bergerak atau berpindah tempat.
Cara atau perilaku burung untuk berpindah tempat dengan pinguin itu berbeda. Burung dapat berpindah tempat dengan terbang menggunakan sayapnya, sedangkan pinguin berpindah tempat dengan berenang menggunakan sayapnya.

Contoh lain misalnya dalam menghitung luas sebuah bidang. Misalkan kita punya 2 bidang yakni segitiga dan segiempat. Keduanya memiliki operasi hitung luas, tapi cara menghitung luas segitiga tentu beda dengan hitung luas segiempat.

Perhatikan program C++ Polymorphism berikut ini.

#include <iostream>
using namespace std;
class Bidang 
{	protected: int lebar, tinggi;
	public:
	Bidang( int a=0, int b=0)
	{ lebar = a;
	  tinggi = b;
	}
	int luas()
	{  cout << "Luas Bidang : 0 " << endl;
	}
};
class Segitiga: public Bidang
{	public:
	Segitiga( int a=0, int b=0):Bidang(a, b) { }
	int luas ()
	{ cout << "Luas Segitiga : " 
	       << (lebar * tinggi) << endl;
	}
};
class Segiempat: public Bidang
{	public:
	Segiempat( int a=0, int b=0):Bidang(a, b) { }
	int luas ()
	{   cout << "Luas Segiempat : " 
		 << (lebar * tinggi / 2) << endl;
	}
};
int main( )
{	Bidang *bidang;
	Segitiga segitiga(10,7);
	Segiempat segiempat(10,5);
	bidang = &segitiga;
	bidang->luas();
	bidang = &segiempat;
	bidang->luas();
	return 0;
}

Output:

Luas Bidang : 0
Luas Bidang : 0

Output yang dihasilkan seperti di atas karena pada saat compile time, Compiler melakukan Static Linking atau Early Binding pada method Luas() di kelas Bidang.
Operasi hitung Luas yang kita inginkan adalah Luas Segitiga dan Luas Segiempat. Untuk itu kita tambahkan keyword virtual pada method Luas() di kelas Bidang, menjadi:

virtual int luas()
{ cout << "Luas Bidang : 0 " << endl; }

Dengan demikian maka output yang dihasilkan menjadi:

Luas Segitiga : 70
Luas Segiempat : 25

Selamat mencoba.

Standard Template Library (STL) dalam C++

C++ memiliki library standard berupa template yang umumnya digunakan dalam sebuah aplikasi, seperti vector, list, map dan stack. Dasar dari pembuatan template C++ bisa dilihat di posting sebelumnya tentang konsep pemrograman generik di C++.

STL C++ terdiri dari 3 komponen:

  • Algoritma –> berlaku sebagai Container yang melakukan inisialisasi, sorting, searching dan transforming sebuah content
  • Container –> mengatur sekumpulan object yang berbeda tipe. Contoh Container: Vector, List, Map, Stack
  • Iterator –> digunakan untuk menelusuri setiap elemen dalam object. Algoritma menggunakan iterator untuk berinteraksi dengan object yang tersimpan dalam container

Berikut ini contoh penggunaan STL Vector, container yang mirip dengan array berisi object yang mampu mengubah panjangnya secara otomatis pada run time.

#include <iostream>
#include <vector>
using namespace std;
int main() {
   // Buat object instance vec untuk menyimpan data integer
   vector<int> vec; 
   int i;

   // Tampilkan ukuran awal vec
   cout << "vector size = " << vec.size() << endl;

   // masukan 5 values ke dalam vector
   for(i = 0; i < 5; i++){
      vec.push_back(i);
   }

   // Tampilkan perubahan ukuran vec
   cout << "extended vector size = " << vec.size() << endl;

   // Akses 5 values dari vector
   for(i = 0; i < 5; i++){
      cout << "value of vec [" << i << "] = " << vec[i] << endl;
   }

   // Gunakan iterator untuk akses values
   vector<int>::iterator v = vec.begin();
   while( v != vec.end()) {
      cout << "value of v = " << *v << endl;
      v++;
   }

   return 0;
}

Output:

vector size = 0
extended vector size = 5
value of vec [0] = 0
value of vec [1] = 1
value of vec [2] = 2
value of vec [3] = 3
value of vec [4] = 4
value of v = 0
value of v = 1
value of v = 2
value of v = 3
value of v = 4

Penjelasan lebih lanjut tentang library Vector dapat dilihat di  https://www.tutorialspoint.com/cpp_standard_library/vector.htm

Berikut ini contoh penggunaan STL Algorithm. STL Algoritm berisi sekumpulan function yang digunakan pada range elemen.

#include <iostream>     
#include <algorithm>    
#include <vector>       
using namespace std;
int main () 
{ int myints[] = {20,10,40,5,15};
  vector<int> v(myints,myints+5); //sediakan 6 elemen dalam vector v

  make_heap (v.begin(),v.end()); //atur elemen di dalam heap
  // Tampilkan elemen terbesar
  cout << "initial max heap   : " << v.front() << '\n'; 
  // tukar value di posisi first dan value di posisi last-1 lalu 
  // buat subrange [first, last-1) dalam max heap
  pop_heap (v.begin(),v.end());
  // hapus elemen terakhir dari vector dan kurangi satu ukuran vektor
  v.pop_back();
  cout << "max heap after pop : " << v.front() << '\n';
  // masukan elemen 100 ke dalam Vector lalu tambah satu ukuran vector 
  v.push_back(100);
  
  push_heap (v.begin(),v.end());
  cout << "max heap after push: " << v.front() << '\n';
  sort_heap (v.begin(),v.end());

  cout << "final sorted range :";
  for (unsigned i=0; i<v.size(); i++)
    cout << ' ' << v[i];

  cout << '\n';
  return 0;
}

Output:

initial max heap   : 40
max heap after pop : 20
max heap after push: 100
final sorted range : 5 10 15 20 100
Press any key to continue . . .

Penjelasan lebih lanjut tentang library Algorithm dapat dilihat di
http://www.cplusplus.com/reference/algorithm/

Berikut ini contoh penggunaan STL Iterator. Iterator merupakan object yang menunjuk ke suatu elemen pada range elemen atau container.

#include <iostream>     
#include <iterator>     
using namespace std;
class MyIterator : public iterator<input_iterator_tag, int>
{
  int* p;
public:
  MyIterator(int* x) :p(x) {}
  MyIterator(const MyIterator& mit) : p(mit.p) {}
  MyIterator& operator++() {++p;return *this;}
  MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
  bool operator==(const MyIterator& rhs) const {return p==rhs.p;}
  bool operator!=(const MyIterator& rhs) const {return p!=rhs.p;}
  int& operator*() {return *p;}
};

int main () {
  int numbers[]={10,20,30,40,50};
  MyIterator from(numbers);
  MyIterator until(numbers+5);
  for (MyIterator it=from; it!=until; it++)
     cout << *it << ' ';
  cout << '\n';
  return 0;
}

Output:

10 20 30 40 50

Penjelasan lebih lanjut tentang library Iterator dapat dilihat di
http://www.cplusplus.com/reference/iterator/
 

Konsep Pemrograman Generik di C++

Pelopor pemrograman generik dan juga template C++ adalah Alexander Stevanov. Di pemrograman generik algoritma ditulis dengan konsep “to be specified later” kemudian diinisialisasi saat dibutuhkan untuk tipe tertentu sebagai parameter. Bahasa yang pertama kali menggunakan konsep ini adalah Ada di tahun 1983, dimana penulisan fungsi generik yang dapat dipanggil dengan tipe yang berbeda sehingga mengurangi duplikasi. Entitas pemrograman yang menggunakan pemrograman generik dikenal dalam berbagai nama: generic di Ada, Java, C# dan Visual Basic.NET, parametric polymorphism di M, Scala dan Haskl, template di C++ dan parameterized type di buku Design Patterns (Gang of Four 1995) yang ide dasarnya dikemukakan oleh Christopher Alexander di bidang Ilmu Arsitektur tetapi kemudian diadopsi oleh banyak bidang ilmu termasuk Ilmu Komputer.

C++ Template

Ada dua bentuk template di C++:

  • Function Template.
  • Class Template disebut juga generic class/parameterized type.

Contoh Function Template

template <class T>
void swap (T& x, T& y)
{  T temp = x;
   x = y;
   y = temp;
}

Function template tersebut dapat dipanggil dengan tipe parameter yang berbeda, misal:
swap(1,2); // tipe parameter: integer
swap(‘A’,’B’); // tipe parameter: char
Ketika fungsi swap dipanggil dengan parameter bertipe integer, compiler C++ akan membentuk fungsi swap dengan parameter bertipe integer ini pada saat compile time (bukan run time). Dengan demikian Template C++ merupakan polymorphism jenis static.

Contoh Class Template

template<class T>
class A{
public : 
   T x;
};

Class template tersebut dapat dipanggil dengan tipe object yang berbeda, misal:
A Obj1; // tipe object: integer
A Objw; // tipe object: string

 

Sumber: Subandijo. 2011. Paradigma Bahasa Pemrograman. Jurnal ComTech Vol.2 No. 2 Desember 2011: 702-714

 

Access Modifier pada Class Turunan

Tipe Inheritance

Tipe Inheritance

Masih ingat 3 jenis akses modifier dalam class? Nah, pada konsep inheritance kita dapat menggunakan tipe akses protected, yang memungkinkan sebuah class memberikan akses member classnya ke class turunannya.

Kita dapat menurunkan sebuah class dengan 3 jenis akses modifier:

  1. Class diturunkan secara public (disebut juga public inheritance)
    class Derived: public Base
    {
    };
  2. Class diturunkan secara private (disebut juga private inheritance)
    class Derived: private Base
    {
    };
  3. Class diturunkan secara protected (disebut juga protected inheritance)
    class Derived: protected Base
    {
    };

Public Inheritance
Ini adalah tipe inheritance yang paling banyak digunakan dan paling mudah dipahami :).
JIka kita menurunkan base class secara public, member public dari base class itu tetap menjadi public di class turunannya, begitu juga member protected dan private dari base class tetap menjadi protedted dan private di class turunannya.

Perhatikan program berikut ini.

class Base
{
public:
    int pub;
private:
    int pri;
protected:
    int pro;
};
 
class Derived:public Base // ini public inheritance
{   
public:
    Derived()
    {
        pub = 1; // ok
        //pri = 2; // error: pri tidak dapat diakses oleh derived class
        pro = 3; // ok
    }
};
 
int main()
{
    Base B;
    B.pub = 1; // ok
    //B.pri = 2; // Error: pri tidak dapat diakses diluar Base class
    //B.pro = 3; // Error: pro hanya dapat biakses dari Base class dan Derived class
 
    Derived D;
    D.pub = 1; // ok
    //D.pri = 2; // Error: pri tidak dapat diakses diluar Base class
    //D.pro = 3; // Error: pro hanya dapat biakses dari Base class dan Derived class
}

Cobalah mengganti public inheritance menjadi private inheritance dan protected inheritance, lalu perhatikan apa yang terjadi.

 

 

Passing by Const Reference

Pada tulisan saya tentang Function dalam C++, ada 3 macam passing data melalui parameter/argumen sebuah fungsi, yakni:

  • Passing By Value
  • Passing By Reference
  • Passing By Address

Kelemahan dari passing by value adalah ketika data yang di-passing itu berupa object class yang cukup besar yang dapat memakan waktu. Hal ini bisa diatasi dengan passing by reference, karena reference akan mengcreate actual argument tanpa mengcopy isinya. Dengan demikian performancenya akan lebih efisien.

Namun passing by reference ini berpotensi menimbulkan masalah, yakni data didalamnya dapat berubah. Dengan passing by reference memungkinkan fungsi untuk merubah datanya. Padahal kita tidak ingin datanya tidak berubah, seperti pada passing by value.

Bagaimana supaya data yang dipassing itu read only?
Solusinya adalah dengan passing by const reference.

Dengan const reference dipastikan fungsi tidak akan merubah argumentnya. Jika data argumen diubah maka akan terjadi compile error.

void foo(const int &x) // x = const reference
{
    x = 6;  // compile error: const reference tidak dapat merubah value x
}

Selain untuk memastikan data yang di kirim tidak berubah, Const Reference juga biasa digunakan untuk memberitahukan programmer fungsi tersebut tidak dapat merubah nilai parameternya.
Jika Anda ingin mengirim object ke fungsi tanpa merubah objectnya, Anda dapat menggunakan passing by const reference.