Operator dan Cmath

Operator didefinisikan sebagai simbol yang mewakili suatu aksi yang dilakukan terhadap operand-operandnya. Contoh operator misalnya operator penjumlahan (+), pengurangan (-), dll. Operand dari operator-operator tersebut bisa berupa angka atau variabel.

Saat belajar matematika di sekolah, kalian mungkin tidak asing dengan yang namanya "aritmetika". Sekalipun kata aritmetika terdengar asing, kalian seharusnya pernah mendengar operator-operator seperti pembagian, perkalian, pengurangan, dan penjumlahan. Operator-operator tersebut termasuk operator aritmetika.

Selain operator-operator yang sudah saya sebutkan sebelumnya, kalian mungkin pernah menemukan operator modulo (mod) di kalkulator. Operator mod digunakan untuk mencari sisa hasil bagi dari bilangan bulat. Kalau kalian punya kalkulator saintifik, kalian bisa mencoba untuk menggunakan operator tersebut.

Penjelasan matematis tentang mod bisa kalian lihat di bawah ini.

  1. 137 div 2 = 68
  2. 68 x 2 = 136
  3. 137-136 = 1
  4. 137 mod 2 = 1

      Hasil pembagian dalam C++ ditentukan oleh tipe data angka yang dibagi. Jika angka yang dibagi tipenya bilangan bulat (integer) maka hasilnya adalah bilangan bulat. Jika angka yang dibagi adalah pecahan desimal (float), hasilnya adalah pecahan desimal.

      Pengelompokan Operator

      Dalam bahasa pemrograman, selain operator aritmetika, ada operator-operator lain. Operator-operator tersebut dikelompokkan menjadi beberapa kelompok operator. Beberapa kelompok operator tersebut bisa kalian lihat di bawah ini.

      • Operator assignment :  increment ( ++ ), decrement ( -- ), sama dengan (=), +=, -=, /=, %=, |=, &=, ^=, >>=, dan <<=.
      • Operator aritmetik : penjumlahan ( + ), pengurangan ( - ), perkalian ( * ), pembagian ( / ), modulus ( % ), dan tanda kurung ().
      • Operator bitwise : or ( | ), and ( & ), xor ( ^ ) shift left ( << ), shift right ( >> ),  dan negasi ( ~ ).
      • Operator relasional : sama dengan ( == ), tidak sama dengan ( != ), Kurang dari ( < ), kurang dari sama dengan (<=), lebih dari ( > ), dan lebih dari sama dengan ( >= ).
      • Operator logika  : Logical and ( && ), logical or ( || ), dan logical not ( ! ).
      • Operator lainnya : sizeof, ternary operator ( ?: ), alamat pointer ( &variabel ), isi pointer (*variabel), struct biasa ( . ), struct pointer ( -> ), dll.

      Operator assignment, aritmetika, dan bitwise digunakan untuk melakukan perhitungan yang bisa disimpan hasilnya. Kalian bisa menggunakan ketiga kelompok operator tersebut secara bersamaan. Contoh penggunaan operator-operator tersebut bisa kalian lihat di bawah ini.

      #include <iostream>
      using namespace std;
      
      int main(){
          int a, b, c, d;
          a=1;
          b=2;
          c+=b;
          c-=a;
          c*=b;
          c/=a;
          d=(a*b+c-d)/2;
          cout << "Hasil" << (a>>2||b&&c^d<<2);
      
          return 0;
      }
      Output :
      Hasil : 1
      

      Operator bitwise digunakan untuk memanipulasi nilai biner suatu bilangan. Operator ini biasa digunakan untuk bilangan bulat / integer. Jika kalian hanya menggunakan operator untuk mengerjakan rumus matematika, kalian bisa mengabaikan operator ini untuk sementara. Saya mungkin akan membahas penggunaan operator bitwise bersamaan dengan bilangan biner lain kali.

      Operator logika dan relasional digunakan untuk syarat dalam percabangan atau perulangan. Kita akan mempelajarinya saat kita membahas perulangan dan percabangan.

      Menerapkan Rumus Matematika

      Kalian bisa membuat program untuk menghitung luas bangun datar atau volume bangun ruang dengan menggunakan bahasa C++ jika kalian sudah mempelajari input, output, dan operator. Rumus-rumus dasar matematika hanya membutuhkan operator aritmetika. Selama kalian belum perlu menggunakan trigonometri atau kalkulus, kalian seharusnya sudah bisa membuat program perhitungan sederhana dengan apa yang sudah kalian pelajari sampai saat ini.

      Langkah pertama untuk membuat program dengan menggunakan rumus matematika atau fisika adalah dengan menentukan variabel apa saja yang kalian butuhkan dalam rumusnya. Misalnya, jika kalian ingin membuat program untuk menentukan luas persegi panjang, kalian akan memerlukan variabel untuk menyimpan luas, panjang, dan lebar. Langkah selanjutnya bisa kalian lihat di bawah ini.

      • Deklarasikan semua variabel yang dibutuhkan. Tipe datanya sebaiknya menggunakan float atau double supaya bisa menyimpan nilai pecahan. Btw, pecahan desimal dipisahkan dengan menggunakan tanda titik (.), dan bukan tanda koma (,).
      • Tulis rumusnya dalam satu baris statement jika rumusnya hanya butuh operator aritmetika. Jika rumusnya panjang, sebaiknya pelajari penggunaan function untuk memisahkan rumus dari program utama.
      • Gunakan cin untuk meminta nilai variabel yang ada di dalam rumus, selain variabel yang menampung hasil perhitungannya.
      • Gunakan cout untuk mencetak nilai variabel yang menyimpan hasil akhir.

      Daripada cuma baca penjelasan yang ribet, langsung saja kita buat kode programnya. Saya akan memberikan contoh program penghitung Luas persegi panjang.

      #include <iostream>
      
      using namespace std;
      
      int main(){
      	float p, l, Luas;
      	cout << "Panjang : "; cin >> p;
      	cout << "Lebar : "; cin >> l;
      	Luas=p*l;
      	cout << "Luas : " << Luas;
      	return 0;
      }
      Output :
      Panjang : 23
      Lebar : 25
      Luas : 575

      Kode programnya lebih pendek daripada ocehan saya? Memang seharusnya begitu. Kalian mungkin bisa lebih mudah dalam memahami programnya hanya berdasarkan contoh kalau kalian mau berusaha menganalisa sendiri programnya.

      Selanjutnya, kalian bisa mencoba buat program dengan rumus lain. Belajar pemrograman lebih baik disertai dengan pembiasaan, ujicoba, dan analisa.

      Operator Penugasan

      Operator penugasan atau assignment operator digunakan untuk menyimpan nilai ke dalam variabel. Nilai tersebut bisa berupa konstanta atau hasil perhitungan dengan operator lainnya. Selain =(sama dengan) yang berdiri sendiri, operator assignment digunakan untuk mempersingkat penulisan operator aritmetik dan operator bitwise. Tabel kesamaan operator assignment dan bitwise maupun aritmetika bisa kalian lihat di bawah ini.

      Assignment OperatorAritmetik / Bitwise
      A+=BA=A+B
      A-=BA=A-B
      A/=BA=A/B
      A*=BA=A*B
      A%=BA=A%B
      A&=BA=A&B
      A|=BA=A|B
      A^=BA=A^B
      A>>=BA=A>>B
      A<<=BA=A<<B

      Hirarki Operator

      Dalam matematika, ada urutan pengerjaan operator. Misalnya, operator perkalian dan pembagian dikerjakan lebih awal jika dibandingkan dengan penjumlahan dan pengurangan. Ini juga berlaku dalam pemrograman dengan bahasa C++ maupun bahasa pemrograman lain secara umum.

      Prioritas Operator Deskripsi Associativity
      1::Scope resolutionTidak ada
      2++Suffix incrementKiri ke kanan
      --Suffix decrement
      ()Function call
      []Array subscripting
      .Element selection by reference
      ->Element selection through pointer
      typeid()Run-time type information
      const_castType cast
      dynamic_castType cast
      reinterpret_castType cast
      static_castType cast
      3++Prefix incrementKanan ke kiri
      --Prefix decrement
      +Unary plus
      -Unary minus
      !Logical NOT
      ~Bitwise NOT
      (type)Type cast
      *dereferensi untuk pointer
      &Alamat pointer
      sizeofUkuran tipe data
      new, new[]Dynamic memory allocation
      delete, delete[]Dynamic memory deallocation
      4.*Pointer to memberKiri ke kanan
      ->*Pointer to member
      5*Perkalian Kiri ke kanan
      /Pembagian
      %Modulo (sisa hasil bagi)
      6+PenjumlahanKiri ke kanan
      -Pengurangan
      7 << Bitwise, geser kiri Kiri ke kanan
      >> Bitwise, geser kanan
      8<Kurang dariKiri ke kanan
      <=Kurang dari atau sama dengan
      >Lebih besar dari
      >= Lebih dari atau sama dengan
      9 == Sama dengan (perbandingan) Kiri ke kanan
      !=Tidak sama dengan
      10&Bitwise ANDKiri ke kanan
      11^Bitwise XOR (exclusive or)Kiri ke kanan
      12|Bitwise OR (inclusive or)Kiri ke kanan
      13&&Logical ANDKiri ke kanan
      14||Logical ORKiri ke kanan
      15?:?:)Kanan ke kiri
      16=Penugasan / pemberian nilaiKanan ke kiri
      +=Penugasan dengan penjumlahan
      -=Penugasan dengan pengurangan
      *=Penugasan dengan perkalian
      /=Penugasan dengan pembagian
      %=Penugasan dengan sisa hasil bagi
      <<=Penugasan dengan bitwise left shift
      >>= Penugasan dengan bitwise right shift
      &=Penugasan dengan bitwise AND
      ^=Penugasan dengan bitwise XOR
      |=Penugasan dengan bitwise OR
      17throwThrow operator (exceptions throwing)Kanan ke kiri
      18,KomaKiri ke kanan

      Operator aritmetika urutan pengerjaannya sama seperti dalam matematika. Perkalian dan pembagian didahulukan jika tidak ada tanda kurung. Operator bitwise hirarkinya berada di bawah operator aritmetika yang artinya pengerjaannya dilakukan setelah pengerjaan semua operator aritmetika.

      Operator Pembagian

      Hasil operator pembagian dalam bahasa C++ ditentukan oleh tipe data operand pertamanya. Tipe data angka dalam C++ ada 2, yaitu bilangan bulat (int) dan pecahan desimal (float). Jika bilangan yang dibagi adalah float maka hasilnya adalah float. Sebaliknya, pembagian dua bilangan bulat hasilnya akan berupa bilangan bulat yang dibuang nilai pecahannya.

      #include <iostream>
      
      using namespace std;
      
      int main(){
          int bilbul=5;
          float bilpec=5;
      	
          cout << "5/2 = " << bilbul / 2 << endl;
          cout << "5.0/2 = " << bilpec / 2 << endl;
      }
      Output :
      5/2 = 2
      5.0/2 = 2.5

      Satu hal lagi yang perlu diperhatikan adalah pembagian dengan nol. Pembagian dengan 0 tidak bisa diproses komputer dan menghasilkan error (division by zero). Kalian perlu mengecek nilai variabel yang dibagi jika sudah belajar percabangan. 

      Beberapa compiler memang bisa mengoptimasi kode sehingga tidak terjadi error "division by zero", tapi sebaiknya kalian tambahkan sendiri pengecekan nilai bilangan yang akan dibagi dengan if.

      Postfix vs Prefix

      Operator increment dan decrement bisa ditulis dengan dua cara. Cara tersebut disebut dengan postfix (++variabel atau --variabel) dan prefix (variabel++ atau variabel--). Perbedaannnya akan terlihat saat kalian menggunakan cout atau menyelipkannya bersama operator aritmetika lainnya.

      #include <iostream>
      
      using namespace std;
      
      int main(){
          int angka=2;
      	
          cout << "Nilai pertama : " << angka++ << endl;
          cout << "Nilai pertama : " << angka << endl;
      
          return 0;
      }
      Output :
      Nilai pertama : 2
      Nilai pertama : 3

      Operator postfix akan mengubah nilai setelah variabel statement selesai. Itu berlaku untuk operator increment (++) maupun decrement (--). Cout pertama menampilkan nilai i sebelum diubah. Jika kalian mengganti operator postfix dengan prefix, hasilnya akan berbeda.

      #include <iostream>
      
      using namespace std;
      
      int main(){
          int angka=2;
      	
          cout << "Nilai pertama : " << angka++ << endl;
          cout << "Nilai pertama : " << angka << endl;
          return 0;
      }
      Output :
      Nilai pertama : 3
      Nilai pertama : 3

      Walaupun hanya menukar letak operator, hasilnya bisa terlihat berbeda. Operator prefix akan langsung mengubah nilai variabel sebelum cout atau function lain digunakan. Nilai variabel i sudah berubah sejak sebelum cout pertama menampilkan nilainya.

      Header Cmath

      Beberapa fungsi matematika tidak disediakan C++ dalam bentuk operator. Sebagai gantinya, C++ menyediakan header cmath yang berisi fungsi-fungsi matematika seperti pangkat, akar, log, trigonometri, dll. Kalian bisa melihat contoh penggunaannya di bawah ini.
      #include <iostream>
      #include <cmath>
      
      using namespace std;
      
      int main(){
          float n;
          int m;
          float PI=3.14159265;
          
          srand(round(n));
          m=rand();
          
          cout << "n : ";cin >> n;
          cout << "random : " << m << endl;
          cout << endl << endl;
          cout << "Akar "<< n << " = " << sqrt(n) << endl;
          cout << "|"<< n << "| = " << abs(n) << endl;
          cout << "floor("<< n << ") = " << floor(n) << endl;
          cout << "ceil("<< n << ") = " << ceil(n) << endl;
          cout << "round("<< n << ") = " << round(n) << endl;
          cout << n << "^3=" << pow(n, 3);
          cout << endl << endl;
          cout << "sin("<< n << " pi rad) = " << sin(n*PI) << endl;
          cout << "cos("<< n << " pi rad) = " << cos(n*PI) << endl;
          cout << "tan("<< n << " pi rad) = " << tan(n*PI) << endl;
          cout << endl << endl;
          cout << "asin("<< n << ") = " << asin(n) << endl;
          cout << "acos("<< n << ") = " << acos(n) << endl;
          cout << "atan("<< n << ") = " << atan(n) << endl;
          cout << "log("<< n << ") = " << log(n) << endl;
          
          cout << n << "^4  = " << pow(n, 4) << endl;
      
          return 0;
      }
      Contoh :
      n : 0.3333333
      random : 2059215011
      
      
      Akar 0.333333 = 0.57735
      |0.333333| = 0.333333
      floor(0.333333) = 0
      ceil(0.333333) = 1
      round(0.333333) = 0
      0.333333^3=0.037037
      
      sin(0.333333 pi rad) = 0.866025
      cos(0.333333 pi rad) = 0.5
      tan(0.333333 pi rad) = 0.808449
      
      
      asin(0.333333) = 0.339837
      acos(0.333333) = 1.23096
      atan(0.333333) = 0.321751
      log(0.333333) = -1.09861
      0.333333^4  = 0.0123457
      

      Header cmath menyediakan beberapa fungsi yang disediakan di dalam header math. Kalian bisa menggunakan header <math.h> dalam bahasa C++, tapi penggunaan cmath lebih direkomendasikan. Beberapa fungsi yang ada di dalam cmath adalah sebagai berikut.

      • abs (float n) : nilai mutlak dari n
      • ceil (float n) : bulatkan nilai n ke bawah
      • floor (float n) : bulatkan nilai n ke atas
      • round (float n) : bulatkan nilai n sesuai aturan pembulatan bilangan.
      • log (float n) : logaritma dari nilai n
      • pow(float m, float n) : m pangkat n
      • sqrt (float n) : akar dari n
      • srand dan rand : hasilkan bilangan "yang terlihat" acak.
      • sin (float n) : sinus dari n (dengan satuan π radian)
      • cos (float n) : cosinus dari n (dengan satuan π radian)
      • tan (float n) : tangen (dengan satuan π radian)
      • asin (float n) : lawan dari sin
      • acos (float n) : lawan dari cos
      • atan (float n): lawan dari tan