Tugas 1 PBO

Tugas 1 PBO

Pemrograman terstruktur dan pemrograman berorientasi objek memiliki perbedaan yang bisa dilihat sekejap mata. Berikut adalah perbedaan keduanya:
Pemrograman TerstrukturPemrograman 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
Jika melihat perbedaannya saja maka akan menimbulkan kebingungan, berikut adalah penjelasan daripada poin-poin pemrograman terstruktur yang telah disebutkan pada tabel diatas menggunakan contoh kode:
  • 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 ini menjelaskan bahwa pemrograman terstruktur biasa membagi program kedalam beberapa fungsi seperti yang bisa di lihat diatas, ada fungsi main, instruksi1, jarak_feet, dan jarak_meter. Masing-masing fungsi memiliki tugasnya sendiri yang digunakan untuk menyelesaikan permasalahan
  • 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
#include 
using 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.
  • 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

Postingan Populer