Keuntungan OOP Dibandingkan Dengan Prosedural

Mata kuliah Metode Perancangan Program Semester 2.

Jelaskan beberapa keuntungan OOP dibandingkan dengan prosedural!

Object-oriented design

“A well-designed system should maximize cohesion, and minimize coupling.” -Unknown

Ada beberapa kelebihan OOP dibanding Prosedural.
 
Berikut ini beberapa keunggulan OOP dibanding Procedural Programming:
Pemrograman berorientasi objek memperkenalkan konsep Encapsulation dimana penulis kode memiliki kemampuan untuk menyembunyikan ataupun mengatur jangkauan akses sebuah data, sehingga secara langsung meminimalisir Coupling (ketergantungan antar Class) dan memaksimalkan Cohesion (efisiensi kerjasama kumpulan data dalam sebuah Class).
 
Ada juga konsep Inheritance. Misalnya seorang programmer ingin membangun sistem yang mirip dengan implementasi sebelumnya yang telah ada. Programmer tersebut dapat melakukan hal itu tanpa menulis ulang semua kode yang mirip tersebut. Cukup dengan mewarisi implementasi sebelumnya dan memodifikasi seperlunya.
 
Pada dasarnya, pemrograman berorientasi objek meminimalisir kemungkinan terjadinya kesalahan oleh sang penulis kode (human-error) pada project berskala besar karena adanya limitasi agar potongan kode yang satu tidak merusak potongan kode lainnya baik secara sengaja ataupun tidak sengaja.

Rational Class in C++ (Object-oriented Programming)

Object-oriented Programming with C++

Assignment: Create a Rational class in c++ to perform arithmetic operation with fractional numbers.

  • Use integer variables to represent the private data of the class, the numerator and the denominator.
  • Provide a constructor that enables an object of this class to be initialized when it is declared.
  • The constructor should contain default values in case no initializers are provided and should store the fraction in reduced form. For example, the fraction 2/4 would be stored in the object as 1 in the numerator and 2 in the denominator.
  • Provide public member functions that perform each of the following tasks:

Adding two Rational numbers. The result should be stored in reduced form.

Subtracting two Rational numbers. The result should be stored in reduced form.

Multiplying two Rational numbers. The result should be stored in reduced form.

Dividing two Rational numbers. The result should be stored in reduced form.

Printing Rational numbers in the form a/b, where a is the numerator and b is the denominator.

Printing Rational numbers in floating-points format.

Leonhard EulerEuclid's Algorithm

Rational.h
/*

Author : William Chanrico
Date : 12/03/2016
Summary : Class representing rational number

Tested on gcc version 5.1.0 (i686-posix-dwarf-rev0, Built by MinGW-W64 project)
>> g++ Demo.cpp Rational.cpp -o a.exe

*/


#ifndef RATIONAL_H
#define RATIONAL_H

class Rational{

private:
 int numerator;
 int denominator;

 int GCD(int x, int y); // Finding greatest commond divisor to calculate reduced form of rationals

public:

 Rational(int numerator = 1, int denominator = 1); // Constructor

 void printFraction() const; // Print rational in form "numerator/denominator"
 void printDecimalFraction() const; // Print rational in decimal fraction format

 Rational add(const Rational &other) const; // Calculate addition
 Rational subtract(const Rational &other) const; // Calculate subtraction
 Rational multiply(const Rational &other) const; // Calculate multiplication
 Rational divide(const Rational &other) const; // Calculate division

 // Operator overloading for convenient use
 Rational operator+(const Rational &other) const;
 Rational operator-(const Rational &other) const;
 Rational operator*(const Rational &other) const;
 Rational operator/(const Rational &other) const;

 operator std::string() const;
 operator float() const;
 
};

#endif /* RATIONAL_H */
Rational.cpp
#include <iostream>
#include <sstream>
#include "Rational.h"

Rational::Rational(int numerator, int denominator){

 this->numerator = numerator;
 this->denominator = denominator;

 int reducer = GCD(numerator, denominator);

 this->numerator /= reducer;
 this->denominator /= reducer;

 if(this->denominator < 0){

 this->numerator *= -1;
 this->denominator *= -1;

 }

}

int Rational::GCD(int x, int y){ return (y == 0) ? x : GCD(y, x % y); }

void Rational::printFraction() const{

 std::cout << (std::string) *this;

}

void Rational::printDecimalFraction() const{

 std::cout << (float) *this;

}

Rational Rational::add(const Rational &other) const{

 int ansNumerator = (numerator * other.denominator) + (other.numerator * denominator);
 int ansDenominator = denominator * other.denominator;

 Rational ans(ansNumerator, ansDenominator);

 return ans;

}

Rational Rational::subtract(const Rational &other) const{

 int ansNumerator = (numerator * other.denominator) - (other.numerator * denominator);
 int ansDenominator = denominator * other.denominator;

 Rational ans(ansNumerator, ansDenominator);

 return ans;

}

Rational Rational::multiply(const Rational &other) const{

 int ansNumerator = (numerator * other.numerator);
 int ansDenominator = (denominator * other.denominator);

 Rational ans(ansNumerator, ansDenominator);

 return ans;

}

Rational Rational::divide(const Rational &other) const{

 Rational divider(other.denominator, other.numerator);

 int ansNumerator = (numerator * divider.numerator);
 int ansDenominator = (denominator * divider.denominator);

 Rational ans(ansNumerator, ansDenominator);

 return ans;

}

Rational Rational::operator+(const Rational &other) const{

 return (*this).add(other);

}

Rational Rational::operator-(const Rational &other) const{

 return (*this).subtract(other);

}

Rational Rational::operator*(const Rational &other) const{

 return (*this).multiply(other);

}

Rational Rational::operator/(const Rational &other) const{

 return (*this).divide(other);

}

Rational::operator std::string() const{

 std::stringstream ss;

 ss << numerator << "/" << denominator;

 return ss.str();

}

Rational::operator float() const{

 return (float) numerator / denominator;

}
DemoRational.cpp
#include <iostream>
#include "Rational.h"

int main(){

 Rational obj1(-5, 9);
 Rational obj2(-17, 2);

 Rational obj3 = obj1 * obj2; // obj3 = obj1.multiply(obj2)

 
 std::cout << (std::string) obj3 << "\n"; // obj3.printFraction()
 std::cout << (float) obj3 << "\n"; // obj3.printDecimalFraction()

}

Pengalaman FEP Binusian 2019

Dalam post ini saya akan menuangkan sedikit gambaran kegiatan FEP berdasarkan pengalaman FEP yang saya ikuti, dan berhubung ada tugas dari AO (ntar gue jelasin AO itu apa) jadi bahasa dalam tulisan ini agak mengikuti kaidah EYD (gak sering nyingkat2 kata).

Pengalaman FEP Sebagai Binusian 2019
Cabang Binus Kemanggisan

Foto Bareng Kelas FEP
Foto Bareng Kelas FEP EBN03

Oke, di Binus ada sebuah kegiatan untuk menyambut mahasiswa baru yang disebut FEP, secara singkat FEP ini merupakan tahap orientasi dimana kegiatan ini sangat berbeda dengan orientasi/ospek di universitas lainnya yang terkenal lebih menjurus ke pelatihan fisik, mental, atau bahkan memakai kostum-kostum konyol.

Kegiatan FEP terbagi menjadi 3 tahap, yaitu General Orientation, Academic Orientation, dan Campus Life Orientation. Pada tahap General Orientation, kita para mahasiswa baru akan didampingi oleh beberapa Buddy Coordinator atau biasa kita sebut BC. Kebetulan kelas GO saya yaitu EBN03 didampingi oleh 7 BC.

Jadi dalam FEP ini kita benar-benar dikenalkan dengan lingkungan kampus seperti bimbingan dalam penggunaan fasilitas perkuliahan, contohnya cara menggunakan situs binusmaya dimana situs ini menjadi portal utama yang akan digunakan sehari-hari oleh para binusan selama masa kuliah berlangsung.

Pada hari terakhir tahap General Orientation, para mahasiswa baru dikenalkan dan diberi kesempatan untuk mendaftar UKM yang ada di Binus. UKM merupakan singkatan dari Unit Kegiatan Mahasiswa, dimana UKM yang ada cukup banyak sehingga pada hari itu kampus Syahdan seperti menggelar festival dengan adanya pertunjukan dari berbagai UKM untuk menarik perhatian para mahasiswa baru yang mengikuti FEP. Sebelumnya sudah ada presentasi dari berbagai UKM di ruang Auditorium. Acara ini sekaligus menutup kegiatan General Orientation yang telah berlangsung selama seminggu dan akan dilanjutkan tahap FEP kedua, yaitu Academic Orientation.

Ruang auditorium & lab. praktikum di kampus Anggrek :

Ruang Auditorium
Ruang Auditorium di Kampus Binus Anggrek
Ruang Lab Komputer
Ruangan Lab Komputer di Kampus Binus Anggrek

Ini contoh sebagian jadwal selama FEP (GO & AO) :

Jadwal GO

Pada Academic Orientation, kita tidak lagi didampingi oleh para BC. Selama sesi Academic Orientation, kita dikenalkan dan dipersiapkan agar dapat beradaptasi dengan sistem perkuliahan seperti situasi pembelajaran di kelas ketika sudah mulai kuliah nanti. Jadi yang membimbing kita pada sesi AO adalah dosen.

Pada sesi AO ini kita langsung diberikan materi-materi dasar sesuai kurikulum jurusan masing-masing untuk mempermudah kita ketika memasuki awal perkuliahan.

Ketika AO, berhubung saya berasal dari jurusan Computer Science, organisasi himpunan mahasiswa yang berasal dari fakultas School of Computer Science (SoCS) atau biasanya disebut HIMTI (Himpunan Mahasiswa Teknik Informatika) mengadakan acara semacam Welcoming Party khusus untuk merayakan kedatangan mahasiswa yang berasal dari jurusan-jurusan fakultas sebagai anggota baru dalam keluarga besar SoCS.

Acara tersebut bernama HTTP (HIMTI Togetherness and Top Performance). Di acara ini ada banyak pertunjukan dan Guest Star yang diundang untuk mengisi acara. HTTP ini tetap termasuk bagian dari jadwal AO yang berlangsung di gedung BPPT dari pagi hingga malam.

Sekian cerita singkat mengenai pengalaman FEP.

William Chanrico,
Simply Proud to be Binusian 2019.

Soal Pengenalan Algoritma dan Pemrograman (8)

Soal 8/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #8

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

8

Berikut ini solusi untuk soal di atas :

#include <stdio.h>
#include <vector>
#include <bitset>

std::vector<int> primes;
std::bitset<10000000> bs;

void sieve(long long x){
	bs.set();
	for(long long a = 2; a <= x; a++) if(bs[a]){
		for(long long b = a * a; b <= x; b += a) bs[b] = 0;
		primes.push_back((int) a);
	}
}

int main(){
	int N;

	sieve(1000000);
	scanf("%d", &N);
	for(int a = 0; a < N; a++){
		for(int b = 1; b < N-a; b++) printf("%-3c", ' ');
		for(int b = a; b >= 0; b--) printf("%-3d", primes[b]);
		printf("\n");
	}
}

Penjelasan :

Soal ini meminta kita untuk mencetak bilangan prima sesuai dengan pola pada contoh gambar di atas. Kali ini kita menggunakan teknik yang bernama Sieve of Eratosthenes.

Saya mempelajari bentuk optimisasi fungsi Sieve of Eratosthenes tersebut dari buku Competitive Programming 3 (by Steven Halim & Felix Halim), jadi bila diperhatikan potongan fungsi di atas memang mirip.

Pada baris 22 dan 23, for-loop yang berindeks mewakili buah baris dan yang berindeks b pertama mewakili banyaknya karakter spasi yang perlu dicetak pada setiap baris ke-yaitu N-a buah, sedangkan for-loop berindeks kedua mewakili banyaknya bilangan prima yang perlu dicetak agar sesuai dengan pola dari soal yaitu a+1 buah untuk setiap baris ke-a.

Soal Pengenalan Algoritma dan Pemrograman (7)

Soal 7/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #7

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

7

Berikut ini salah satu solusi untuk soal di atas :

#include <stdio.h>
#include <string.h>

int memo[10000];

int fib(int x){
	if(memo[x] != -1) return memo[x];
	return memo[x] = fib(x - 1) + fib(x - 2);
}

int main(){
	int N;

	memset(memo, -1, sizeof(memo));
	memo[0] = memo[1] = 1;

	scanf("%d", &N);

	for(int a = 1; a <= N; a++){
		for(int b = 0; b < a; b++) printf("%-4d", fib(b));
		printf("\n");
	}
}

Penjelasan :

Sebelum masuk ke fungsi main, fungsi fib(int x) merupakan fungsi untuk mengeluarkan nilai fibonacci ke-x. Dalam fungsi fibonacci di atas menggunakan array memo karena fungsi rekursifnya cukup boros (memanggil dengan parameter sama berulang-ulang).

Saya juga akan menyertakan versi non-rekursif dari solusi soal ini.

Pada for-loop di baris 17 dan 18, yang berindeks merupakan wakil dari banyaknya baris (buah baris) dan yang berindeks merupakan wakil dari banyaknya bilangan fibonacci yang dicetak untuk setiap baris ke-(buah bilangan fibonacci).

Berikut ini versi lain dari solusi di atas (versi non-rekursif) :

#include <stdio.h>

int main(){
	int N;
	int x;
	int y;
	int z;

	scanf("%d", &N);
	
	for(int a = 0; a < N; a++){
		x = 0; 
		y = 0; 
		z = 1;
		for(int b  =0; b <= a; b++){
			printf("%-3d", z);
			x = y;
			y = z;
			z = x + y;
		}
		printf("\n");
	}
}

Soal Pengenalan Algoritma dan Pemrograman (6)

Soal 6/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #6

Format masukan berupa sebuah bilangan ganjil N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah,
dengan panjang keluaran secara horizontal harus memenuhi lebar layar output secara dinamis (asumsikan lebar layar default CMD yaitu 80).

6

Berikut ini solusi untuk soal di atas :

#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int N;
    int lebarBufferCMD;
 
    scanf("%d", &N);
    N /= 2;

    for(int a = -N; a <= N; a++){
        lebarBufferCMD = 79;
        for(int b = -N; b <= N; b++){
            if(lebarBufferCMD == 0) break;
            if(abs(a) == abs(b)) printf("x"); else printf(" ");
            if(b == N) b = -N;
            --lebarBufferCMD;
        }
        printf("\n");
    }
}

Penjelasan :

Soal menentukan bahwa input bilangan harus ganjil agar polanya lebih rapi, jadi kita akan mengakalinya dengan operasi pembagian. Cara ini dapat dimanfaatkan karena pembagian bilangan bulat pada C++ akan menghasilkan bilangan bulat juga dengan pembulatan ke bawahSehingga input bilangan genap atau ganjil misal (4 atau 5) akan diartikan sama oleh program.

Sebelum masuk ke for-loop, untuk soal ini diperlukan sebuah variabel tambahan.

Variabel lebarBufferCMD digunakan untuk membatasi banyak karakter yang dicetak pada tiap baris dengan mengisi variabel ini seusai lebar layar output.(salah satu solusi untuk memenuhi aturan soal yang meminta kita untuk mengisi penuh lebar layar output).

Pada baris 10, kita menginisialisasikan setiap nilai dari variabel lebarBufferCMD dengan nilai jumlah karakter yang dapat ditampung oleh lebar layar output (dalam kasus ini 80 berarti kita masukkan nilai 79, bukan 80 karena kita harus menyisihkan 1 karakter terakhir yang terisi otomatis oleh sistem pada saat run-time).

Untuk for-loop pada baris 9 dan 11, yang berindeks digunakan untuk mewakili banyaknya baris yang akan dicetak (mulai dari -N hingga +N), sedangkan yang berindeks digunakan untuk mewakili tiap karakter pada baris ke-a.

Bagian algoritma yang menyebabkan pola cetakan sesuai soal ini terletak pada baris 13, yaitu ketika nilai absolut dari indeks for-loop yang dan bernilai sama.

Pada baris 15, kita mengurangi nilai dari lebarBufferCMD agar kita dapat mengetahui kapan untuk berhenti mencetak (perhatikan statement break; pada baris 12) dan pindah baris ketika lebar layar output telah terpenuhi. 

Pada baris 17, kita hanya mengubah nilai dari indeks menjadi -N agar for-loop tidak berhenti sebelum lebar layar output terpenuhi (hingga kondisi pada baris 12 menjadi true).

 

Soal Pengenalan Algoritma dan Pemrograman (5)

Soal 5/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #5

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

5

Berikut ini solusi untuk soal di atas :

#include <stdio.h>

int main(){
	int N;

	scanf("%d", &N);
	for(int a = 1; a <= N; a++){
		for(int b = 1; b <= N; b++){
			if(a == 1 || a == N || b == 1 || b == N){
				printf("%-2c", '*');
			}else{ 
				printf("%-2c", ' ');
			}
		}
		printf("\n");
	}
}

Penjelasan :

Diperlukan 2 buah pengulangan, for-loop pada kode di atas yang berindeks a untuk banyaknya baris yaitu sebanyak N kali (dari 1 hingga N), dan yang indeks b mencetak karakter ‘*’ atau spasi.

Pada setiap baris ke-diminta sebanyak buah karakter ‘*’ untuk setiap baris pertama dan terakhir (ketika a = 1 dan a = N) dan untuk baris lainnya cukup cetak karakter ‘*’ pada awal dan akhir baris (ketika b = 1 dan b = N), selain itu cetak karakter spasi.

 

Soal Pengenalan Algoritma dan Pemrograman (4)

Soal 4/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #4

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

4

Berikut ini solusi untuk soal di atas :

#include <stdio.h>

int main(){
	int N;

	scanf("%d", &N);
	for(int a = 1; a <= N; a++){
		for(int b = 0; b < N-a; b++) printf("%-2c", ' ');
		for(int b = 1; b <= a; b++) printf("%-4d", b);
		printf("\n");
	}
}

Penjelasan :

Diperlukan 3 buah pengulangan, for-loop pada kode di atas yang berindeks a untuk banyaknya baris yaitu sebanyak N kali (dari 1 hingga N), yang indeks b pertama untuk banyaknya karakter spasi setiap baris ke-sesuai pola yang diinginkan soal yaitu sebanyak N-a buah untuk setiap baris ke-a.

Lalu for-loop yang berindeks kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak buah dengan pola bilangan 1 2 3 hingga a.

Sedikit catatan, pada cetakan bilangan di dalam for-loop yang berindeks kedua, setiap cetakan ditambahkan 2 space lebih banyak dari biasanya, ekstra 2 karakter spasi ini ditambahkan agar cetakan membentuk pola segitiga yang diminta oleh soal.

Soal Pengenalan Algoritma dan Pemrograman (3)

Soal 3/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #3

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

 

3

Berikut ini solusi untuk soal di atas :

#include <stdio.h>

int main(){
	int N;

	scanf("%d", &N);
	for(int a = 0; a < N; a++){
		for(int b = 0; b < a; b++) printf("%-3c", ' ');
		for(int b = 1; b <= N-a; b++) printf("%-3d", b);
		printf("\n");
	}
}

Penjelasan :

Diperlukan 3 buah pengulangan, for-loop pada kode di atas yang berindeks a untuk banyaknya baris yaitu sebanyak N kali (dari 0 hingga N-1), yang indeks b pertama untuk banyaknya karakter spasi setiap baris ke-sesuai pola yang diinginkan soal yaitu sebanyak buah untuk setiap baris ke-a.

Lalu for-loop yang berindeks kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak buah dengan pola bilangan 1 2 3 hingga N-a.

Soal Pengenalan Algoritma dan Pemrograman (2)

Soal 2/8

Tugas AO Computer Science

Dari delapan soal yang diberikan, semuanya meminta kita untuk mencetak output angka atau karakter lainnya dengan susunan/pola menyerupai bangun datar.

Soal Pengenalan Algoritma dan Pemrograman #2

Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.

2

 

Berikut ini solusi untuk soal di atas :

#include <stdio.h>

int main(){
	int N;
	
	scanf("%d", &N);
	for(int a = 1; a <= N; a++){
		for(int b = 0; b < N-a ; b++) printf("%-3c", ' ');
		for(int b = a; b >= 1; b--) printf("%-3d", b);
		printf("\n");
	}

}

Penjelasan :

Diperlukan 3 buah pengulangan, for-loop pada kode di atas yang berindeks a untuk banyaknya baris yaitu sebanyak N kali (dari 1 hingga N), yang indeks b pertama untuk banyaknya karakter spasi setiap baris ke-sesuai pola yang diinginkan soal yaitu sebanyak Nbuah untuk setiap baris ke-a.

Lalu for-loop yang berindeks kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak buah dengan pola bilangan a a-1 a-2 hingga 1.