Tugas 1 PBO
Tugas 1 PBO
Pemrograman terstruktur dan pemrograman berorientasi objek memiliki perbedaan yang bisa dilihat sekejap mata. Berikut adalah perbedaan keduanya:
Pemrograman Terstruktur | Pemrograman Berorientasi Objek |
Memecah program dalam fungsi dan data
|
Menggabungkan fungsi dan data dalam kelas – kelas atau objek - objek
|
Memiliki ciri Sequence (berurutan), Selection (pemilihan) dan Repetition (perulangan)
|
Memiliki ciri Encapsulation (pengemasan), Inheritance (penurunan sifat) dan Polymorphism (perbedaan bentuk dan perilaku)
|
Struktur program rumit karena berupa urutan proses dan fungsi-fungsi
|
Struktur program ringkas, cukup dengan membuat Objek dan class lalu bekerja berdasarkan object dan class tersebut.
|
Re-use kode program kurang
|
Kode program sangat re-usable. object dan class dapat digunakan berkali-kali, sehingga dapat menghemat space memori.
|
Efektif digunakan untuk menyelesaikan masalah kecil dan tidak cocok untuk menyelesaikkan masalah yang rumit, karena nantinya akan kesulitan menemukan solusi permasalahan ketika terjadi error
|
Efektif digunakan untuk menyelesaikan masalah besar, karena OOP terdiri dari class-class yang memisahkan setiap kode program menjadi kelompok - kelompok kecil, sesuai dengan fungsinya
|
Mudah diawal, namun kompleks diproses selanjutnya
|
Sulit diawal (karena harus membuat class) namun selanjutnya akan terasa mudah dan cepat
|
Eksekusi lebih lambat karena setiap perintah dikerjakan berurutan
|
Eksekusi lebih cepat karena dieksekusi bersamaan, program hanya mengatur Objek, properties dan method-nya saja
|
- Point 1 : Memecah program dalam fungsi dan data
#include <stdio.h>//deklarasi fungsi double jarak_feet(double x); double jarak_meter(double x); void instruksi1(void); int main () //fungsi utama { instruksi1(); //untuk memanggil fungsi instruksi1 } void instruksi1(void) //fungsi untuk menginput waktu dan output kecepatan { double time,g,h; printf("Masukan menit : "); scanf("%lf",&g); printf("Masukan detik : "); scanf("%lf",&h); time=g*60+h; printf("Feet Per Second: %g \nMeter Per Second: %g",jarak_feet(time),jarak_meter(time)); } double jarak_feet(double x) //fungsi untuk menghitung kecepatan dalam feet per second { return(5280/x); } double jarak_meter(double x) //fungsi untuk menghitung kecepatan dalam meter per second { return((5280*1000/3282)/x); }
- Point 2 : Memiliki ciri Sequence (berurutan), Selection (pemilihan) dan Repetition (perulangan)
#include <stdio.h> int fpb (int a, int b) { if (a==0) return b; return fpb(b%a,a); } int kpk(int a,int b) { int val_fpb=fpb(a,b); return (a*b)/val_fpb; } int main () { int n,i,j,a,b,c,kelipatan=0,kpk_sementara,kpk_fix,min,hari_terkecil; scanf("%d",&n); for (i=0;n>i;i++) { scanf("%d %d %d",&a,&b,&c); kpk_sementara=kpk(a,b); kpk_fix=kpk(kpk_sementara,c); kpk_fix%=30; hari_terkecil=kpk_fix; kelipatan = kpk_fix*2; while (kelipatan%30!=0) { min=kelipatan%30; if (min<hari_terkecil && min>0) { hari_terkecil=min; } kelipatan = kelipatan + kpk_fix; } if (hari_terkecil==0 || (hari_terkecil>=15 && hari_terkecil<=30)) printf("imposibruuu!\n"); else printf("%d\n",hari_terkecil); } }
Point ini menjelaskan bahwa pemrograman terstruktur memiliki urutan jalan yaitu program jalan berurutan dari atas ke bawah tergantung kode mana duluan yang akan di eksekusi. Pada contoh kode ini program akan menjalankan fungsi main terlebih dahulu kemudian akan berjalan menjalankan kode-kode yang ada di fungsi main secara berurutan sampai nantinya memanggil fungsi kpk dan kemudian fungsi fpb, sampai akhirnya menuliskan hasil output program pada console. Memiliki perulangan bisa dilihat pada kode diatas. Program diatas menggunakan fungsi while untuk melakukan perulangan hingga keadaan yang diinginkan bernilai salah.
- Point 3 : Struktur program rumit karena berupa urutan proses dan fungsi-fungsi
#include <stdio.h> #include <string.h> #include <math.h> typedef struct //deklarasi struct { char nama[100]; //variabel nama char nrp[100]; //variabel NRP char kode_matkul; //variabel kode mata kuliah double n_tugas; //variabel nilai tugas double n_praktikum; //variabel nilai praktikum double n_ETS; //variabel nilai ETS double n_EAS; //variabel nilai EAS double n_akhir; //variabel nilai akhir char predikat[10]; //variabel predikat } mahasiswa; void nilaiakhir (mahasiswa mhs[], int n) //fungsi untuk menghitung nilai akhir { int b; for (b=0;n>b;b++) { mhs[b].n_akhir = (mhs[b].n_tugas/4)+(mhs[b].n_praktikum/4)+(mhs[b].n_ETS/4)+(mhs[b].n_EAS/4); } } void caripredikat (mahasiswa mhs[], int n) // fungsi untuk menghitung predikat { int c; for (c=0;n>c;c++) { if (floor(mhs[c].n_akhir)>=86 && floor(mhs[c].n_akhir)<=100) strcpy(mhs[c].predikat,"A"); //jika nilai akhirnya 86-100 copy karakter "A" ke variabel predikat else if (floor(mhs[c].n_akhir)>=76 && floor(mhs[c].n_akhir)<=85) strcpy(mhs[c].predikat,"AB"); //jika nilai akhirnya 76-85 copy karakter "AB" ke variabel predikat else if (floor(mhs[c].n_akhir)>=66 && floor(mhs[c].n_akhir)<=75) strcpy(mhs[c].predikat,"B"); //jika nilai akhirnya 66-75 copy karakter "A" ke variabel predikat else if (floor(mhs[c].n_akhir)>=61 && floor(mhs[c].n_akhir)<=65) strcpy(mhs[c].predikat,"BC"); //jika nilai akhirnya 61-65 copy karakter "A" ke variabel predikat else if (floor(mhs[c].n_akhir)>=56 && floor(mhs[c].n_akhir)<=60) strcpy(mhs[c].predikat,"C"); //jika nilai akhirnya 56-60 copy karakter "A" ke variabel predikat else if (floor(mhs[c].n_akhir)>=41 && floor(mhs[c].n_akhir)<=55) strcpy(mhs[c].predikat,"D"); //jika nilai akhirnya 41-55 copy karakter "A" ke variabel predikat else if (floor(mhs[c].n_akhir)>=0 && floor(mhs[c].n_akhir)<=40) strcpy(mhs[c].predikat,"E"); //jika nilai akhirnya 0-40 copy karakter "A" ke variabel predikat else strcpy(mhs[c].predikat,"Imajiner"); //jika nilai akhirnya tidak memenuhi } } void printoutput (char nama_mt[],mahasiswa mhs[],int n,int nama_terpanjang) //fungsi untuk mengeluarkan output { char name[5]="Nama",enerpe[4]="NRP",tugas[6]="Tugas",praktikum[10]="Praktikum",ETS[4]="ETS",EAS[4]="EAS",akhir[6]="Akhir",predikat[9]="Predikat"; printf("%*s%-*s|",(nama_terpanjang-4)/2 , "",nama_terpanjang-((nama_terpanjang-4)/2),name); //print tulisan "nama" ditengah nama terpanjang printf(" NRP |"); printf("%*s%-*s|",(strlen(nama_mt)-6)/2 , "",strlen(nama_mt)-((strlen(nama_mt)-6)/2),"Matkul"); //print tulisan "matkul" ditengah nama mata kuliahnya printf(" Tugas |"); printf("%9s|",praktikum); printf(" ETS |"); printf(" EAS |"); printf(" Akhir |"); printf("Predikat|"); printf("\n"); int d; for (d=0;d<n;d++) { printf("%-*s|",nama_terpanjang, mhs[d].nama); //mengeluarkan output nama printf("%s|",mhs[d].nrp); //mengeluarkan output NRP printf("%s|",nama_mt); //mengeluarkan output nama mata kuliah printf("%7.2f|",mhs[d].n_tugas); //mengeluarkan output nilai tugas printf("%9.2f|",mhs[d].n_praktikum); //mengeluarkan output nilai praktikum printf("%7.2f|",mhs[d].n_ETS); //mengeluarkan output nilai ets printf("%7.2f|",mhs[d].n_EAS); //mengeluarkan output nilai EAS printf("%7.2f|",mhs[d].n_akhir); //mengeluarkan output nilai akhir printf("%8s|",mhs[d].predikat); //mengeluarkan output predikat printf("\n"); } } int main() { mahasiswa mhs[100]; int n; printf("Masukkan jumlah mahasiswa : "); scanf("%d",&n); //scan jumlah mahasiswa printf("\n"); int a,nama_terpanjang=0; for (a=0;a<n;a++) //mengambil data mahasiswa { getchar(); printf("Masukkan nama mahasiswa %d : ",a+1); scanf("%[^\n]c",&mhs[a].nama); if (strlen(mhs[a].nama)>nama_terpanjang) nama_terpanjang=strlen(mhs[a].nama); getchar(); printf("Masukkan NRP mahasiswa %d : ",a+1); scanf("%s",&mhs[a].nrp); printf("Masukkan nilai tugas mahasiswa %d : ",a+1); scanf("%lf",&mhs[a].n_tugas); printf("Masukkan nilai praktikum mahasiswa %d : ",a+1); scanf("%lf",&mhs[a].n_praktikum); printf("Masukkan nilai ETS mahasiswa %d : ",a+1); scanf("%lf",&mhs[a].n_ETS); printf("Masukkan nilai EAS mahasiswa %d : ",a+1); scanf("%lf",&mhs[a].n_EAS); printf("\n"); } char kode_matkul[4]="IF184101"; char nama_mt[100]; if (strcmp(kode_matkul,"IF184101")==0) strcpy(nama_mt,"Dasar Pemrograman A"); //memasukkan nama mata kuliah nilaiakhir(mhs,n); //memanggil fungsi nilaiakhir caripredikat(mhs,n); //memanggil fungsi caripredikat printoutput(nama_mt,mhs,n,nama_terpanjang); //memanggil fungsi printoutput }
Untuk pemrograman terstruktur, program akan jalan secara sekuensial. Artinya program akan berjalan dari atas ke bawa sesuai urutan. Fungsi dijalankan secara berurutan dan setiap line dijalankan satu-satu. Menyebabkan program menjadi rumit dan sangat tidak enak dibaca.
- Point 4 : Re-use kode program kurang
#include <stdio.h> #include <string.h> int kombinasi (int panjang,char array1[],char array2[], int index2,int index1,int n) { //index1 = index array1 //index2 = index array2 int j; if (index2==panjang) //Jika index array2 sama dengan panjang kombinasinya { printf("{"); for (j=0;j<panjang;j++) //lakukan perulangan sebanyak panjang kombinasinya { printf(" %c ",array2[j]); if (j!=panjang-1) printf(","); } printf("}"); printf("\n"); return; } if (index1>=n) return; //jika index1 lebih besar atau sama dengan panjang string, maka return; array2[index2]=array1[index1]; //untuk mengisi array2 index2 dengan isi yang sama dengan array1 index1 kombinasi(panjang,array1,array2,index2+1,index1+1,n); //pemanggilan rekursi dengan menambah index2 dan index1 while (array1[index1]==array1[index1+1]) index1++; //jika array1 dengan index dan index+1 isinya sama, maka index array1 ditambah (diskip) untuk menghindari duplikasi pada penulisan kombinasi kombinasi(panjang,array1,array2,index2,index1+1,n); //pemanggilan rekursi dengan menambah index1 } int main () { int no[26] = {0}, c, t, x; char ch,array3[100]; char array1[100]; printf("Masukkan string yang ingin di kombinasikan = "); scanf("%s",&array1); int n=strlen(array1); //untuk mendeklarasikan variabel n dan memasukkan nilai panjangnya string yang diimputkan oleh user //Untuk melakukan Counting Sort pada array1 for (c=0; c<n; c++) { array1[c]=toupper(array1[c]); ch = array1[c] - 'A'; no[ch]++; } t=0; for (ch='A'; ch<='Z'; ch++) { x=ch-'A'; for (c=0; c<no[x]; c++) { array3[t]=ch; t++; } } array3[t]='\0'; //menaruh karakter null pada bagian akhir array int panjang; printf("Masukkan panjang kombinasi = "); scanf("%d",&panjang); //memasukan panjang yang akan dikombinasikan if (panjang>n) //jika panjang yang dimasukkan lebih besar dibanding banyak string { printf("Data Tidak valid\n"); return 0; } char array2[100]; kombinasi (panjang,array3,array2,0,0,n); //untuk memanggil fungsi kombinasi }
Pada pemrograman terstruktur penggunaan kembali code sangat minimal. Bisa dilihat pada contoh diatas penggunaan code tidak banyak me reuse code yang ada. Karena itu, pemrograman terstruktur sangat tidak efisien dibanding pbo yang me reuse codenya.
- Point 5 : Efektif digunakan untuk menyelesaikan masalah kecil dan tidak cocok untuk menyelesaikkan masalah yang rumit, karena nantinya akan kesulitan menemukan solusi permasalahan ketika terjadi error
#include <stdio.h> #include <math.h> int main () { int a,b,c; scanf("%d",&a); b=1; while (b<a) { b=b*2; } if (a==b) { printf("ya"); } else { printf("tidak"); } return 0; }
Premrograman terstruktur bagus untuk menyelesaikan masalah kecil seperti contoh diatas, yaitu untuk mencari apakah suatu bilangan adalah kelipatan dua. Namun tidak efektif dalam masalah yang besar karena masalah-masalah yang dicantumkan diatas, yaitu program lebih rumit, re-use code kurang, dan lain-lain.
- Point 6 : Mudah diawal, namun kompleks diproses selanjutnya
- Point 7 : Eksekusi lebih lambat karena setiap perintah dikerjakan berurutan
#include <stdio.h> int main () { int n; scanf("%d", &n); while(n--) { int x; scanf("%d", &x); int index = 0; int kedua = 1; long long int power = 1; while (x - power > 0) { x -= power; index++; if (kedua == 1) { kedua = 0; power *= 9; } else { kedua++; } } if (x > 0) index++; x--; unsigned long long int angka = 0; int i; for (i = 0; i < index/2; i++) { unsigned long long tambah = x % 9 + 1; int j; for (j = 0; j < i; j++) { tambah *= 10; } angka += tambah; x /= 9; } unsigned long long angka2 = angka; if (index & 1) { angka *= 10; angka += 5; } for (i = 0; i < index/2; i++) { angka *= 10; angka += 10 - (angka2 % 10); angka2 /= 10; } printf("%llu\n", angka); } }
Berikut adalah penjelasan dan contoh pemrograman berorientasi data menurut tabel diatas:
- Point 1 : Menggabungkan fungsi dan data dalam kelas – kelas atau objek - objek
#includeusing namespace std; class PersegiPanjang { int panjang,lebar; public: int luas() { return (panjang*lebar); } void set_values(int x,int y) { panjang = x; lebar = y; } }; class Segitiga { int alas,tinggi; public: float luas() { return (alas*tinggi*0.5); } void set_values(int a, int t) { alas = a; tinggi = t; } }; int main() { PersegiPanjang Kotak1; PersegiPanjang Kotak2; Segitiga Segitiga1; Segitiga Segitiga2; Kotak1.set_values(10,10); Kotak2.set_values(5,5); Segitiga1.set_values(7,6); Segitiga2.set_values(3,7); cout << “Luas Kotak 1 adalah ” << Kotak1.luas() << endl; cout << “Luas Kotak 2 adalah ” << Kotak2.luas() << endl; cout << “Luas Segitiga 1 adalah ” << Segitiga1.luas() << endl; cout << “Luas Segitiga 2 adalah ” << Segitiga2.luas() << endl; }
- Point 2 : Memiliki ciri Encapsulation (pengemasan), Inheritance (penurunan sifat) dan Polymorphism (perbedaan bentuk dan perilaku)
class Doctor { void Doctor_Details() { System.out.println("Doctor Details..."); } } class Surgeon extends Doctor { void Surgeon_Details() { System.out.println("Surgen Detail..."); } } public class Hospital { public static void main(String args[]) { Surgeon s = new Surgeon(); s.Doctor_Details(); s.Surgeon_Details(); } }
Maksud dari Encapsulation adalah pengemasan variabel, fungsi dan yang lainnya didalam sebuah class. Jika dilihat pada contoh atas, maka class Doctor, Suregon, dan Hospital merupakan contoh dari encapsulation ini, pada class-class tersebut terdapat property dan methodnya tersendiri yang dibungkus untuk menjaga agar tidak diakses sembarangan.
Sedangkan maksud dari Inheritance adalah penurunan sifat dari class lain, dalam hal ini yaitu property dan method yang ada dalam class itu. Inheritance digunakan untuk menyingkat program, maksudnya adalah kita bisa menggunakan kembali kode tersebut agar tidak usah menulis ulang kode yang sama. Pada contoh diatas, Inheritance bisa dilihat pada class Surgeon. Pada pemrograman java, inheritance di tulis dengan kata "extends". Berarti class surgeon juga memiliki property dan method yang dimiliki oleh class doctor.
Sedangkan maksud dari polymorphism adalah penggunaan lebih dari satu method yang memiliki nama yang sama. Penggunaan polymorphism ini dapat digunakan dengan method overloading dan overriding.
Sedangkan maksud dari Inheritance adalah penurunan sifat dari class lain, dalam hal ini yaitu property dan method yang ada dalam class itu. Inheritance digunakan untuk menyingkat program, maksudnya adalah kita bisa menggunakan kembali kode tersebut agar tidak usah menulis ulang kode yang sama. Pada contoh diatas, Inheritance bisa dilihat pada class Surgeon. Pada pemrograman java, inheritance di tulis dengan kata "extends". Berarti class surgeon juga memiliki property dan method yang dimiliki oleh class doctor.
Sedangkan maksud dari polymorphism adalah penggunaan lebih dari satu method yang memiliki nama yang sama. Penggunaan polymorphism ini dapat digunakan dengan method overloading dan overriding.
- Point 3 : Struktur program ringkas, cukup dengan membuat Objek dan class lalu bekerja berdasarkan object dan class tersebut.
#include <iostream> // using IO functions #include <string> // using string using namespace std; class Circle { private: double radius; // Data member (Variable) string color; // Data member (Variable) public: // Constructor with default values for data members Circle(double r = 1.0, string c = "red") { radius = r; color = c; } double getRadius() { // Member function (Getter) return radius; } string getColor() { // Member function (Getter) return color; } double getArea() { // Member function return radius*radius*3.1416; } }; // need to end the class declaration with a semi-colon // Test driver function int main() { // Construct a Circle instance Circle c1(1.2, "blue"); cout << "Radius=" << c1.getRadius() << " Area=" << c1.getArea() << " Color=" << c1.getColor() << endl; // Construct another Circle instance Circle c2(3.4); // default color cout << "Radius=" << c2.getRadius() << " Area=" << c2.getArea() << " Color=" << c2.getColor() << endl; // Construct a Circle instance using default no-arg constructor Circle c3; // default radius and color cout << "Radius=" << c3.getRadius() << " Area=" << c3.getArea() << " Color=" << c3.getColor() << endl; return 0; }
- Point 4 : Kode program sangat re-usable. object dan class dapat digunakan berkali-kali, sehingga dapat menghemat space memori.
#include<iostream> using namespace std; class Person{ protected: string name; public: void getName(){ cin>>name; } void printName(){ cout<<name<<endl; } }; class Teacher : public Person{ }; class Student : public Person{ }; int main(){ Person *p1 = new Teacher(); Person *p2 = new Student(); p1->getName(); p2->getName(); p1->printName(); p2->printName(); }
- Point 5 : Efektif digunakan untuk menyelesaikan masalah besar, karena OOP terdiri dari class-class yang memisahkan setiap kode program menjadi kelompok - kelompok kecil, sesuai dengan fungsinya
class Animal { private String name; private double averageWeight; private int numberOfLegs; // Getter methods public String getName() { return name; } public double getAverageWeight() { return averageWeight; } public int getNumberOfLegs() { return numberOfLegs; } // Setter methods public void setName(String name) { this.name = name; } public void setAverageWeight(double averageWeight) { this.averageWeight = averageWeight; } public void setNumberOfLegs(int numberOfLegs) { this.numberOfLegs = numberOfLegs; } } public class TestAnimal { public static void main(String[] args) { Animal myAnimal = new Animal(); myAnimal.setName("Eagle"); myAnimal.setAverageWeight(1.5); myAnimal.setNumberOfLegs(2); System.out.println("Name: " + myAnimal.getName()); System.out.println("Average weight: " + myAnimal.getAverageWeight() + "kg"); System.out.println("Number of legs: " + myAnimal.getNumberOfLegs()); } }
- Point 6 : Sulit diawal (karena harus membuat class) namun selanjutnya akan terasa mudah dan cepat
class katt { int jumlah_ekor = 1; //field public void makan() //method { System.out.println("Makan"); } } class siam extends katt //class siam adalah turunan class katt { public static void main(String[] args) { siam siam1 = new siam(); siam1.jumlah_ekor = 10; // class siam memiliki field //jumlah_ekor karena jumlah_ekor diturunkan dari class katt siam1.makan(); // akan mencetak "Makan" } }
- Point 7 : Eksekusi lebih cepat karena dieksekusi bersamaan, program hanya mengatur Objek, properties dan method-nya saja
package oopsconcept; public class Mobile { private String manufacturer; private String operating_system; public String model; private int cost; //Constructor to set properties/characteristics of object Mobile(String man, String o,String m, int c){ this.manufacturer = man; this.operating_system=o; this.model=m; this.cost=c; } //Method to get access Model property of Object public String getModel(){ return this.model; } // We can add other method to get access to other properties }
package oopsconcept; public class Android extends Mobile{ //Constructor to set properties/characteristics of object Android(String man, String o,String m, int c) { super(man, o, m, c); } //Method to get access Model property of Object public String getModel() { return "This is Android Mobile- " + model; } }
package oopsconcept; public class Blackberry extends Mobile{ //Constructor to set properties/characteristics of object Blackberry(String man, String o,String m, int c) { super(man, o, m, c); } public String getModel() { return "This is Blackberry-"+ model; } }
Komentar
Posting Komentar