Belajar Bahasa C sharp/Bab III: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Willysaef (bicara | kontrib)
k baru
 
Willysaef (bicara | kontrib)
Baris 12:
Simbol plus dan strip di atas merupakan contoh dari '''operator aritmetika'''. Kedua operator tersebut juga dapat dikategorikan sebagai '''operator biner''' ('''''binary operator'''''), karena memang keduanya memiliki dua buah ''operand'' (operand pertama adalah yang berada di sebelah kiri simbol, sementara operator kedua berada di sebelah kanan simbol). Sebuah ''operand'' dapat berupa ekspresi tertentu, dan ekspresi tersebut dapat berupa sebuah variabel, literal numerik, atau hasil dari operasi lainnya.
 
Kita juga bisa menggunakan kedua simbol di atas secara sekaligus, sebagai '''operator unary''' ('''''unary operator''''', yang memiliki satu buah operator''operand'' saja). Daripada harus menuliskan bentuk seperti:
<source lang="csharp">
C = A - B;
Baris 31:
</source>
Tanda operator plus di sana terlihat aneh dan, karenanya, oleh para desainer C# di Microsoft dibuat agar tidak memiliki efek pada variabel/nilai yang mengikutinya. Lagi pula, jika memang membingungkan, dan tidak berguna, maka saya juga tidak akan menuliskan bentuk seperti di atas lagi di dalam tulisan-tulisan saya selanjutnya mengenai C#. Ini adalah waktu terakhir Anda melihatnya!
==Perkalian==
Nah, penjumlahan dan pengurangan sudah dibahas, akan tetapi bagaimana dengan perkalian? Padahal, di dalam matematika, kita mengetahui bahwa simbol perkalian adalah × (Unicode 007D), dan simbol tersebut tidak terdapat di dalam ''keyboard'' yang kita gunakan. Terus bagaimana digunakannya? Dalam sebagian besar bahasa pemrograman populer, kita bisa menggunakan karakter asterisk (<code>*</code>), dan kita bisa menggunakannya sebagai operator untuk perkalian. Dibanding kita menggunakan bentuk:
<source lang="csharp">
Luas = Panjang × Lebar;
</source>
Kita bisa menggunakan bentuk:
<source lang="csharp">
Luas = Panjang * Lebar;
</source>
Ingat, sebagian besar bahasa pemrograman menggunakan karakter ''asterisk'' sebagai simbol perkalian, bukan hanya C# saja. Dan daripada menyebutnya dengan sebutan yang agak susah, para ''programmer'' di luar negeri pun menyebutnya dengan sebutan ''star'' saja. Kita juga sama deh! Kita sebut karakter ''asterisk'' sebagai karakter bintang, karena lebih mudah digunakan dan diingat. Oke?
==Pembagian dan Sisa Hasil Bagi==
Papan ketik yang kita gunakan juga mungkin tidak memiliki tanda untuk pembagian yang kita kenal yakni ÷ (Unicode 00F7). Akan tetapi, sama seperti halnya perkalian yang menggunakan tanda bintang sebagai pengganti simbol ÷, pembagian juga menggunakan karakter pengganti, yakni garis miring maju, atau slash! (<code>/</code>) Sehingga, kita bisa menuliskan bentuk <code>Jam=Menit ÷ 60</code>, dalam C# menjadi:
<source lang="csharp">
Jam = Menit / 60;
</source>
 
Di antara semua operasi aritmetika dasar, mungkin semua orang akan setuju bila saya mengatakan bahwa pembagian adalah operasi yang paling rumit dilakukan. Komputer pun sama bodohnya, karena memang komputer lebih bodoh dibandingkan dengan kita! Tidak seperti operasi lainnya terhadap bilangan bulat yang "adem-adem" saja, pembagian terhadap dua buah bilangan bulat memiliki kerumitan tersendiri yang tidak kita bisa abaikan. Oke, jika tidak percaya mungkin potongan kode ini bisa dijadikan sebagai demonstrasi:
<source lang="csharp">
int JumlahKue, JumlahOrang, Bagian;
JumlahKue = 11;
JumlahOrang = 4;
 
Bagian= JumlahKue / JumlahOrang;
</source>
 
Oke, berapa nilai akhir dari variabel <code>Bagian</code>? Jawabannya pasti bukan <code>2.75</code>! Variabel <code>Bagian</code> tidak dapat bernilai 2.75 karena kita tahu bahwa pada deklarasi variabel di atas, variabel <code>Bagian</code> memiliki tipe data bilangan bulat (''integer''). Kata kunci <code>int</code> sama sekali tidak bisa mengakomodir pecahan, yang berarti jika memang kita membutuhkan hasil dalam bentuk pecahan, kita harus mencari pendekatan lainnya (yang nanti akan dibahas)!
 
Sebenarnya, variabel <code>Bagian</code> yang dideklarasikan sebagai ''integer'' bukanlah menjadi masalah di sini. Masalahnya sebenarnya terdapat pada tanda sama dengan (<code>=</code>) yang digunakan di dalam operasi, yakni pada sebelah kanan tanda sama dengan tersebut. Variabel <code>JumlahKue</code> dan <code>JumlahOrang</code> juga dideklarasikan sebagai ''integer'', dan di dalam C#, semua operasi antara dua buah ''integer'' akan menghasilkan ''integer'' pula.
 
Saat C# membagi dua buah bilangan bulat, maka C# akan memotong hasilnya, yang berarti bagian pecahannya akan dibuang begitu saja (tidak akan dianggap)! Hasil dari pembagian antara <code>11</code> dan <code>4</code> bukanlah <code>2.75</code>, karena nilai <code>0.75</code> akan dibuang dan nilai akhir dari pembagian tersebut adalah <code>2</code>. Berarti, setiap orang mendapatkan dua buah kue, dan secara logika masih tersisa tiga buah kue yang tidak dibagikan untuk siapa-siapa.
 
Oke, sekarang lihat contoh di bawah ini:
<source lang="csharp">
int JumlahKue, JumlahOrang, Bagian;
 
JumlahKue = 11;
JumlahOrang = 12;
 
Bagian= JumlahKue/JumlahOrang;
</source>
Berapa nilai akhir dari variabel <code>Bagian</code>? Jawabannya adalah <code>0</code>, karena jumlah orang terlalu banyak jika dibandingkan dengan jumlah kuenya, akhirnya ibu dapur pun tidak membaginya, sehingga <code>12</code> orang pun akhirnya "kelaparan."
 
Pemotongan pun berlaku untuk angka negatif:
<source lang="csharp">
A = -3;
B = 2;
 
C = A / B;
</source>
 
Jika saja semua bilangan tersebut dianggap bukan sebagai bilangan bulat, maka hasilnya adalah <code>-1.5</code>, tapi C# akan membuang pecahan ½ tersebut, dan hasil akhirnya adalah <code>-1</code>. Pemotongan dalam kasus-kasus ini pun kadang disebut sebagai "pembulatan".
 
Untungnya, bahasa C# menawarkan operator lainnya yang mengizinkan kita untuk "menyelamatkan" sisa pembagian tersebut, sehingga bisa "dimanfaatkan". Operator ini dinamakan juga dengan modulus operator, atau operator sisa. Dalam C#, operator modulus menggunakan simbol persen (<code>%</code>), sebuah simbol yang pada dasarnya mengandung karakter garis miring (slash) sehingga menjadikannya berhubungan dengan pembagian. Oke deh, kita modifikasi program di atas menjadi seperti ini:
<source lang="csharp">
int JumlahKue, JumlahOrang, Bagian;
 
JumlahKue = 11;
JumlahOrang = 4;
 
Bagian= JumlahKue/JumlahOrang;
 
int Sisa;
Sisa = JumlahKue % JumlahOrang;
</source>
 
Sebelas kue dibagi ke empat orang menghasilkan setiap orang mendapatkan dua buah kue utuh, dan sisanya ada tiga buah kue yang tidak digunakan. Saat menggunakan operator ''modulus'' terhadap bilangan negatif, hasilnya pun selalu memiliki tanda yang sama dengan nilai yang ditaruh di samping kiri dari operator modulus tersebut (jika positif maka hasil akhirnya akan positif dan bila negatif, maka hasil akhirnya juga negatif).
 
Operator modulus akan sangat berguna untuk melakukan beberapa pekerjaan tertentu, karena operator ini dapat membagi sebuah angka yang mungkin nantinya akan lebih rumit jika menggunakan operator pembagian biasa. Sebagai contoh, anggaplah kita memiliki sebuah variabel dengan nama <code>Tahun4Digit</code>, yang menyimpan angka seperti <code>1968</code>, <code>1985</code>, atau <code>2008</code>. Jika kita hendak mengubahnya menjadi tahun dengan panjang dua digit, dengan nama variabel <code>Tahun2Digit</code> (seperti <code>68</code>, <code>85</code>, atau <code>08</code>), maka kita bisa melakukannya dengan cara:
<source lang="csharp">
Tahun2Digit = Tahun4Digit % 100;
</source>
Variabel <code>Tahun2Digit</code> adalah angka sisa pembagian setelah kita membagi variabel <code>Tahun4Digit</code> dengan angka <code>100</code>. Nilainya akan selalu merupakan angka antara <code>0</code> hingga <code>99</code>.
 
Contoh lainnya: anggaplah kita memiliki variabel dengan nama <code>MenitTotal</code>, yang mungkin mengandung total menit berjalannya sebuah film di bioskop. Jika memang kita hendak memisahkan nilai tersebut ke dalam bentuk <code>Jam:Menit</code> yang merupakan bentuk bilangan bulat, maka kita bisa gunakan:
<source lang="csharp">
Jam = MenitTotal / 60;
Menit = MenitTotal % 60;
</source>
Jika variabel MenitTotal bernilai 135, maka <code>Jam</code> akan bernilai 2, dan <code>Menit</code> akan bernilai 15. Hasil dari variabel <code>Menit</code> pasti akan selalu memiliki nilai 0 hingga 59.
 
Operator modulus juga bisa sangat berguna untuk menentukan apakah sebuah angka bisa habis dibagi oleh angka lainnya. Sebagai contoh, kita tahu bahwa tahun kabisat adalah tahun yang habis dibagi dengan empat, dan akan muncul setiap empat tahun sekali. Dengan demikian, jika ekspresi <code>Tahun % 4</code> memiliki nilai 0, maka tahun tersebut merupakan tahun kabisat. Betul tidak?
===Beberapa masalah dalam pembagian===
Di atas, saya mungkin menyebutkan "kerumitan dalam pembagian". Maksudnya apa sih? Selain dua masalah di atas, pembagian memiliki beberapa kerumitan lagi, di antaranya adalah sebagai berikut:
<source lang="csharp">
int A, B, C;
 
A = 11;
B = 0;
 
C= A / B;
</source>
 
Bentuk kode di atas menunjukkan sebuah proses pembagian dengan angka nol, yang tentu saja tidak diizinkan untuk digunakan oleh sebuah bilangan bulat. Mungkin, Anda mengira mengapa saya bilang "tidak diizinkan", padahal memang di dalam matematika setiap angka yang dibagi dengan angka 0 akan menghasilkan bilangan infinity atau tak keberhinggaan (∞). Untuk lebih memahaminya, coba perhatikan kode yang lebih sempurna di bawah ini:
<source lang="csharp">
//Program02.cs
using System;
 
class BagiDgnNol
{
static void Main()
{
int A, B, C;
 
A=11;
B=0;
 
Console.WriteLine(A);
Console.WriteLine(B);
 
C=A/B;
 
Console.WriteLine(C);
}
}
</source>
Program di atas akan dikompilasi dengan benar, tanpa ada kesalahan apapun. Dan ketika dijalankan pun, kita akan melihat nilai dari variabel A dan B karena memang kita telah menyuruh komputer untuk menampilkan nilai dari variabel A dan B. Lalu, program yang kita buat tersebut akan berhenti sejenak, lalu muncul sebuah kotak dialog dengan judul ''Just-In-Time Debugging''. Tekan saja tombol "No" karena kita tidak mau melakukan debugging (lebih tepatnya, belum bisa melakukannya ). Kotak dialog pun hilang, tapi di layar console, kita akan melihat pesan:
 
Unhandled Exception: System.DivideByZeroException: Attempted to divide by zero.
 
Kita mungkin akan memperoleh informasi mengenai pada baris ke berapa kesalahan tersebut terjadi di dalam berkas kode sumber <code>Program02.cs</code> yang menyebabkan program kita tidak berjalan dengan sempurna. Akhirnya, program pun terhenti dan kita tidak tahu berapa nilai C, karena memang tidak diberi kesempatan untuk memanggil statemen <code>Console.WriteLine</code> yang ketiga yang digunakan untuk memperlihatkan nilai variabel C.
 
Ketika kita salah dalam mengetikkan kode (sebaiknya sih jangan), mungkin kita akan “akrab” dengan pesan kesalahan yang ditampilkan oleh kompiler (''compiler error''), yang pada umumnya berisi kesalahan sintaksis di dalam kode yang harus kita perhatikan pada saat melakukan kompilasi (''syntax error''). Akan tetapi, dalam program <code>Program02.cs</code> di atas, meski tidak ada kesalahan saat melakukan kompilasi, program tidak mau berjalan dengan sempurna, saat dijalankan. Karenanya jenis kesalahan tersebut dikenal juga dengan sebutan runtime error (kesalahan saat dijalankan), karena memang kesalahan tersebut muncul saat program dijalankan, bukan ketika kompilasi, atau bahkan pengetikan.
 
Saat berhadapan dengan penyebut yang memiliki nilai 0, maka operasi pembagian dikatakan sedang mencoba untuk membuat pengecualian, atau ''exception'', yang merupakan istilah yang digunakan untuk merujuk kepada keluhan yang dimiliki komputer akibat munculnya sebuah masalah. Sebuah program juga sebenarnya dapat diberi informasi mengenai sebuah exception telah terjadi dan disuruh untuk menanganinya, yang nanti akan kita pelajari pada bab selanjutnya. Hingga saat kita belajar hal tersebut, kita mungkin menjadi akrab dengan pesan “unhandled exception”, yang berarti sebuah exception yang tidak bisa ditangani oleh program, malahan ditangani oleh ''.NET Framework''. Pesan tersebut juga mengandung kata <code>System.DivideByZeroException</code>, yang merupakan sebuah kelas di dalam namespace System yang digunakan oleh operator pembagian untuk membuat ''exception''.
 
Dalam program PembagianDenganNol.cs, coba ubah nilai C dengan bentuk seperti di bawah ini:
<source lang="csharp">
C = A / 0;
</source>
atau
<source lang="csharp">
C = 3 / 0;
</source>
Sekarang, lakukan kompilasi terhadapnya! Anda akan melihat bahwa saat kompilasi, kompiler akan menampilkan kesalahan
 
Divide by constant zero
 
Saat kita menaruh angka 0 di sebelah kanan tanda pembagian di dalam program kita, kompiler cukup cerdas untuk menolak kode kita dengan mengeluarkan pesan semacam itu.
{{stub}}