Mata kuliah Metode Perancangan Program Semester 2.
Jelaskan beberapa keuntungan OOP dibandingkan dengan prosedural!
“A well-designed system should maximize cohesion, and minimize coupling.” -Unknown
Jelaskan beberapa keuntungan OOP dibandingkan dengan prosedural!
“A well-designed system should maximize cohesion, and minimize coupling.” -Unknown
Object-oriented Programming with C++
Assignment: Create a Rational class in c++ to perform arithmetic operation with fractional numbers.
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.
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() }
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).
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 :
Ini contoh sebagian jadwal selama FEP (GO & AO) :
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 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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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 a mewakili N buah baris dan yang berindeks b pertama mewakili banyaknya karakter spasi yang perlu dicetak pada setiap baris ke-a yaitu N-a buah, sedangkan for-loop berindeks b kedua mewakili banyaknya bilangan prima yang perlu dicetak agar sesuai dengan pola dari soal yaitu a+1 buah untuk setiap baris ke-a.
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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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 a merupakan wakil dari banyaknya baris (N buah baris) dan yang berindeks b merupakan wakil dari banyaknya bilangan fibonacci yang dicetak untuk setiap baris ke-a (a 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 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.
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).
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 N 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 bawah. Sehingga 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 a digunakan untuk mewakili banyaknya baris yang akan dicetak (mulai dari -N hingga +N), sedangkan yang berindeks b 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 a dan b 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 b menjadi -N agar for-loop tidak berhenti sebelum lebar layar output terpenuhi (hingga kondisi pada baris 12 menjadi true).
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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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-a diminta sebanyak N 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 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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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-a sesuai pola yang diinginkan soal yaitu sebanyak N-a buah untuk setiap baris ke-a.
Lalu for-loop yang berindeks b kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak a buah dengan pola bilangan 1 2 3 hingga a.
Sedikit catatan, pada cetakan bilangan di dalam for-loop yang berindeks b 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 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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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-a sesuai pola yang diinginkan soal yaitu sebanyak a buah untuk setiap baris ke-a.
Lalu for-loop yang berindeks b kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak a buah dengan pola bilangan 1 2 3 hingga N-a.
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.
Format masukan berupa sebuah bilangan N.
Format keluaran berupa N baris dengan pola sesuai gambar di bawah.
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-a sesuai pola yang diinginkan soal yaitu sebanyak N–a buah untuk setiap baris ke-a.
Lalu for-loop yang berindeks b kedua untuk banyaknya cetakan bilangan yang diinginkan soal yaitu sebanyak a buah dengan pola bilangan a a-1 a-2 hingga 1.