Anda di halaman 1dari 19

BAB I PENDAHULUAN

Tujuan Praktikum
o o o o Mampu menggunakan kalimat pemrograman untuk mengatur alur eksekusi Mampu menggunakan kalimat pemrograman looping Mampu menggunakan throw dan catch exception Mampu menampilkan pesan kesalahan

Teori Pengantar
1. Switch merupakan prosedur pemilihan eksekusi yang meng-handle pilihan yang banyak. Bila ada baris statement sesuai dengan kondisi, maka baris yang bersangkutan akan mengerjakan tugasnya sesuai dengan isi barisnya.
switch (expression) { case constant-expression: statement jump-statement [default: statement jump-statement] }

2. if else merupakan prosedur pemilihan eksekusi berdasarkan nilai boolean dan memiliki dua cabang eksekusi. Meski hanya dua, tiap cabang bisa membentuk cabang eksekusi sendiri lagi. Juga bisa terdiri dari lebih dari 2 cabang. Contoh bentuk cabang yang lebih dari 2:
bool flagCheck = true; if (flagCheck == true) { if (flagCheck == true) { Console.WriteLine(""); } else { Console.WriteLine(""); } } else if { Console.WriteLine(""); } else { Console.WriteLine(""); }

Bimo Adi Pradono 31045

www.digizoneku.com

3. While do selama kondisi yang disyaratkan while bernilai true, looping dalam while akan terus berjalan. Hal tersebut dikarenakan, while berada pada urutan eksekusi program yang lebih awal daripada do. Ada bentuk lainnya juga, yaitu do-while: akan mengeksekusi isi do tanpa mempedulikan kondisi while, sebanyak satu kali. Bila while bernilai true, do akan dieksekusi lagi.
do { sum += ids[i]; i++; } while (i < 4);

Bimo Adi Pradono 31045

www.digizoneku.com

BAB II PEMBAHASAN
1. MENGGUNAKAN KALIMAT PEMROGRAMAN
1.1 Membaca Jumlah Hari ___________ Source Code ___________
using using using using System; System.Collections.Generic; System.Linq; System.Text;

namespace TanggalBerapa1 { class Program { static void Main(string[] args) { Console.WriteLine("Silakan masukkan jumlah hari antara 1 sampai 365: "); string baris = Console.ReadLine(); int jmlHari = int.Parse(baris); //tiga baris kode diatas akan mengambil angka jumlah hari untuk dikonversi menjadi bulan int jmlBulan = 0; if (jmlHari <= 31) //conditional branch yang akan mengurangi angka yang kita masukkan untuk tiap batas tanggal bulan dan mecocokkannya dengan bulan yang tepat { // Januari goto End; } else { jmlHari -= 31; jmlBulan++; } if (jmlHari <= 28) { // Februari goto End; } else { jmlHari -= 28; jmlBulan++; } if (jmlHari <= 31)

Bimo Adi Pradono 31045

www.digizoneku.com

{ // Maret goto End; } else { jmlHari -= 31; jmlBulan++; } if (jmlHari <= 30) { // April goto End; } else { jmlHari -= 30; jmlBulan++; } if (jmlHari <= 31) { // Mei goto End; } else { jmlHari -= 31; jmlBulan++; }

if (jmlHari <= 30) { // Juni goto End; } else { jmlHari -= 30; jmlBulan++; } if (jmlHari <= 31) { // Juli goto End; } else { jmlHari -= 31; jmlBulan++; } if (jmlHari <= 31) { // Agustus goto End; } else { jmlHari -= 31;

Bimo Adi Pradono 31045

www.digizoneku.com

jmlBulan++; } if (jmlHari <= 30) { // September goto End; } else { jmlHari -= 30; jmlBulan++; } if (jmlHari <= 31) { // Oktober goto End; } else { jmlHari -= 31; jmlBulan++; } if (jmlHari <= 30) { // November goto End; } else { jmlHari -= 30; jmlBulan++; } if (jmlHari <= 31) { // Desember goto End; } else { jmlHari -= 31; jmlBulan++; } End: string namaBulan=""; switch (jmlBulan) { //switch bertugas memberi nama tiap bulan sesuai dengan nilai //nama bulan yang didapat dari loop if-else diatas case 0 : namaBulan = "Januari"; break; case 1 : namaBulan = "Februari"; break; case 2 : namaBulan = "Maret"; break; case 3 : namaBulan = "April"; break; case 4 : namaBulan = "Mei"; break;

Bimo Adi Pradono 31045

www.digizoneku.com

case 5 : namaBulan case 6 : namaBulan case 7 : namaBulan case 8 : namaBulan case 9 : namaBulan case 10 : namaBulan case 11: namaBulan }

= "Juni"; break; = "Juli"; break; = "Agustus"; break; = "September"; break; = "Oktober"; break; = "November";break; = "Desember"; break;

Console.WriteLine("{0} {1}", jmlHari, namaBulan); Console.ReadLine(); } static System.Collections.ICollection TanggalDlmBulan = new int[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; } }

___________ Source Code ___________

Dari semua program latihan 1, alur proses eksekusi programnya sama. Untuk lebih jelasnya, kita akan bahas dengan input 65 yang outputnya bisa dilihat di atas: Setelah mendapat input 65, maka eksekusi baris program selanjutnya adalah masuk ke bagian seleksi kondisional dengan menggunakan if-else. Input-nya lebih dari 31 (yang disyaratkan pada kondisional pertama), maka akan dikurangi 31 dan hasilnya akan disimpan dalam variable jmlHari = 34, juga variable jmlBulan akan ditambah 1, jadi nilai variable jmlBulan = 1. Kemudian masuk ke if-else selanjutnya. jmlHari jadi 35 28 = 6 dan jmlBulan jadi 1 + 1 = 2. Karena nilai variable jmlHari sudah kurang dari 31, maka eksekusi akan melompat ke End: di mana fungsi switch berada. Variable yang digunakan untuk mengecek adalah jmlBulan. Karena jmlBulan = 2, maka akan masuk ke case 2. Case 2 akan memberikan nilai string Maret pada variable namabulan. Perintah print ke layar adalah jmlHari + namabulan sehingga jika memberi input 65, maka tampilan yang akan keluar di layar adalah 6 Maret.

Bimo Adi Pradono 31045

www.digizoneku.com

1.2 Menghitung Nama Bulan dengan Enum Sekarang, kalimat switch case diganti dengan enum namaBulan di awal kode: ___________ Source Code ___________
enum namaBulan { Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember }

___________ Run Program ___________ Hasilnya masih sama:

Input dari Praktikum yang wajib dimasukkan untuk menguji program:

Bimo Adi Pradono 31045

www.digizoneku.com

1.3 Mengganti 12 Kalimat if Dengan Satu Foreach Kode dipersingkat lagi dengan mengganti semua kalimat if-else-if di atas dengan satu foreach: ___________ Source Code ___________
foreach (int hariDlmBulan in HariDlmBulan) { if (jmlHari <= hariDlmBulan) { break; } else { jmlHari -= hariDlmBulan; jmlBulan++; } }

___________ Run Program ___________ Hasilnya masih sama:

Hasil input di luar batas:

*Program masih belum mampu menangani input di luar batas tersebut.

2. MENGGUNAKAN EXCEPTION
2.1 Melakukan Validasi Jumlah Hari ___________ Source Code ___________
using System; using System.Collections.Generic; using System.Linq;

Bimo Adi Pradono 31045

www.digizoneku.com

using System.Text; namespace TanggalBerapa { enum namaBulan {//enumerasi nama bulan Januari, Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember } class Program { static void Main(string[] args) { try {//blok try Console.Write("Silakan masukkan angka jumlah hari antara 1 sampai 365: "); baris = Console.ReadLine(); int jmlHari = int.Parse(baris); if (jmlHari < 1 || jmlHari > 365) { //melempar argument apabila ada anomali di mana jmlHari < 1 //atau jmlHari > 365, prinsipnya mirip dengan exception throw new ArgumentOutOfRangeException("Jumlah hari melebihi batas "); } int jmlBulan = 0; foreach (int hariDlmBulan in HariDlmBulan) { if (jmlHari <= hariDlmBulan) { break; } else { jmlHari -= hariDlmBulan; jmlBulan++; } } namaBulan temp = (namaBulan)jmlBulan; string namaBulan = temp.ToString(); Console.WriteLine("{0} {1}", jmlHari, namaBulan); Console.ReadLine();

Bimo Adi Pradono 31045

www.digizoneku.com

} catch (Exception caught) {//blok catch Console.WriteLine(caught); Console.ReadLine(); } } //mendefinisikan enumerasi int jumlah hari dalam tiap bulan //mengatur koleksi non generik yang dipanggil dalam loop static System.Collections.ICollection HariDlmBulan = new int[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; } }

___________ Run Program ___________ Hasil capture untuk yang lebih kecil dari 1 (gambar di bawah):

Hasil capture untuk yang lebih besar dari 365 (gambar di bawah):

Menambahkan exception handling dan throw untuk menangkap anomali jmlHari < 1 atau jmlHari > 365 yang tidak tertangani oleh program sebelumnya. Akan bekerja dengan hasil run seperti pada hasil capture di atas, apabila masukannya jmlHari < 1 atau jmlHari > 365.

2.2 Menangani Tahun Kabisat ___________ Source Code ___________


using using using using System; System.Collections.Generic; System.Linq; System.Text;

namespace TahunKabisat1 { enum namaBulan { Januari,

Bimo Adi Pradono 31045

www.digizoneku.com

Februari, Maret, April, Mei, Juni, Juli, Agustus, September, Oktober, November, Desember } class Program { static void Main(string[] args) { try { Console.Write("Silakan masukkan tahun : "); string baris = Console.ReadLine(); int jmltahun = int.Parse(baris); bool thnkabisat = (jmltahun%4 == 0) && (jmltahun %100 !=0 ) || jmltahun%400 == 0; if (thnkabisat) {//pengecekan tahun kabisat Console.WriteLine("merupakan tahun kabisat"); } else { Console.WriteLine("bukan Tahun kabisat"); } Console.Write("Silakan masukkan angka jumlah hari antara 1 sampai 365: "); baris = Console.ReadLine(); int jmlHari = int.Parse(baris); if (jmlHari < 1 || jmlHari > 365) { //melempar argument apabila ada anomali di mana jmlHari < 1 //atau jmlHari > 365, prinsipnya mirip dengan exception throw new ArgumentOutOfRangeException("Jumlah hari melebihi batas "); } int jmlBulan = 0; foreach (int hariDlmBulan in HariDlmBulan) { if (jmlHari <= hariDlmBulan) { break; } else { jmlHari -= hariDlmBulan; jmlBulan++; }

Bimo Adi Pradono 31045

www.digizoneku.com

} namaBulan temp = (namaBulan)jmlBulan; string namaBulan = temp.ToString(); Console.WriteLine("{0} {1}", jmlHari, namaBulan); Console.ReadLine(); } catch (Exception caught) { Console.WriteLine(caught); Console.ReadLine(); } } //mendefinisikan enumerasi int jumlah hari dalam tiap bulan //mengatur koleksi non generik yang dipanggil dalam loop static System.Collections.ICollection HariDlmBulan = new int[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; } }

___________ Run Program ___________ Hasil run untuk tahun kabisat:

Hasil run untuk bukan tahun kabisat

Bimo Adi Pradono 31045

www.digizoneku.com

Tahun Kabisat (Leap Year) adalah sebuah Tahun Syamsiah di mana pada tahun tersebut jumlah hari tidak terdiri dari 365 hari tetapi 366 hari. Satu tahun syamsiah tidak secara persis terdiri dari 365 hari, tetapi 365 hari, 5 jam, 48 menit dan 45,1814 detik. Jika hal ini tidak dihiraukan, maka setiap empat tahun akan kekurangan hampir satu hari. Maka untuk mengkompensasi hal ini setiap empat tahun sekali (tahun yang bisa dibagi empat), diberi satu hari ekstra: 29 Februari. Tetapi karena 5 jam, 48 menit dan 45,1814 detik kurang dari 6 jam, maka tahun-tahun yang bisa dibagi 100 (seperti tahun 1900), bukan tahun kabisat, kecuali bisa dibagi dengan 400 (seperti tahun 2000). Terdapat algoritma mudah untuk menentukan apakah suatu tahun termasuk tahun kabisat atau bukan sebagai berikut: 1. Jika angka tahun itu habis dibagi 400, maka tahun itu sudah pasti tahun kabisat. 2. Jika angka tahun itu tidak habis dibagi 400 tetapi habis dibagi 100, maka tahun itu sudah pasti bukan merupakan tahun kabisat. 3. Jika angka tahun itu tidak habis dibagi 400, tidak habis dibagi 100 akan tetapi habis dibagi 4, maka tahun itu merupakan tahun kabisat. 4. Jika angka tahun tidak habis dibagi 400, tidak habis dibagi 100, dan tidak habis dibagi 4, maka tahun tersebut bukan merupakan tahun kabisat. Sehingga untuk memenuhi logika tahun kabisat di atas, kode yang diperlukan adalah sebagai berikut:
bool thnkabisat = jmltahun%400 == 0; (jmltahun%4 == 0) && (jmltahun %100 !=0 ) ||

variable thnkabisat didefinisikan sebagai Boolean, artinya akan mendapat nilai true atau false. Ketika thnkabisat bernilai true, maka proses eksekusi program untuk validasi 366 hari akan dijalankan. Untuk proses yang lain, sama dengan proses penentuan konversi jumlah hari ke tanggal dan bulan.

2.3 Memvalidasi Jumlah Hari 365 atau 366 ___________ Source Code ___________
using using using using System; System.Collections.Generic; System.Linq; System.Text;

namespace TahunKabisat2 { enum namaBulan { Januari, Februari, Maret, April,

Bimo Adi Pradono 31045

www.digizoneku.com

Mei, Juni, Juli, Agustus, September, Oktober, November, Desember } class Program { static void Main(string[] args) { try { Console.Write("Silakan masukkan tahun : "); string baris = Console.ReadLine(); int jmltahun = int.Parse(baris); bool thnkabisat = (jmltahun % 4 == 0) && (jmltahun % 100 != 0) || jmltahun % 400 == 0; int maxjmlhari = thnkabisat ? 366 : 365; Console.Write("Silakan masukkan angka jumlah hari antara 1 sampai {0} : ", maxjmlhari); baris = Console.ReadLine(); int jmlHari = int.Parse(baris); if (jmlHari < 1 || jmlHari > maxjmlhari) { throw new ArgumentOutOfRangeException("Jumlah hari melebihi batas "); } int jmlBulan = 0; if (thnkabisat) { foreach (int haridlmbulan in hariDalamBulanKabisat) { if (jmlHari <= haridlmbulan) { break; } else { jmlHari -= haridlmbulan; jmlBulan++; } } } else { foreach (int hariDlmBulan in HariDlmBulan) { if (jmlHari <= hariDlmBulan) { break; } else {

Bimo Adi Pradono 31045

www.digizoneku.com

jmlHari -= hariDlmBulan; jmlBulan++; } } } namaBulan temp = (namaBulan)jmlBulan; string namaBulan = temp.ToString(); Console.WriteLine("{0} {1}", jmlHari, namaBulan); Console.ReadLine(); } catch (Exception caught) { Console.WriteLine(caught); Console.ReadLine(); } } //mendefinisikan enumerasi int jumlah hari dalam tiap bulan //mengatur koleksi non generik yang dipanggil dalam loop static System.Collections.ICollection HariDlmBulan = new int[12] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; static System.Collections.ICollection hariDalamBulanKabisat = new int[12] { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; } }

___________ Run Program ___________

Bimo Adi Pradono 31045

www.digizoneku.com

Bimo Adi Pradono 31045

www.digizoneku.com

BAB III JAWABAN PERTANYAAN


1. Buat sebuah perbandingan mengenai fungsi case dan if else! Kapan sebuah if-else lebih cocok dibanding dengan case?
Jawab: FUNGSI Percabangan Faktor yang dicek Keberadaan nilai default Case Lebih dari dua If-Else Dua (bisa >2 dengan if-else-if) Boleh Tidak ada

Variabel tunggal (int atau char) Kondisi boolean Ada

Fungsi lain dalam fungsi Tidak boleh

if-else lebih tepat digunakan untuk percabangan yang lebih kompleks, misalnya fungsi dalam fungsi / kondisional dalam kondisional. Karena memang didesain untuk percabangan yang rumit. Dalam beberapa bahasa dan lingkungan pemrograman, penggunaan case atau pernyataan switch dianggap lebih unggul dibanding dengan if-else (misalnya untuk percabangan yang simple, seperti hanya mengecek nilai variabel): o mudah untuk debug (misalnya breakpoints pengaturan pada kode vs panggilan tabel, jika debugger tidak memiliki kemampuan breakpoint bersyarat) o mudah dibaca (subjektif) o lebih mudah untuk dipahami o lebih mudah untuk di-maintain Selain itu, dalam suatu implementasi yang dioptimalkan untuk performance dapat:
o

mengeksekusi jauh lebih cepat, karena sering diimplementasikan dengan menggunakan indeks tabel cabang.

2. Apakah keunggulan foreach dibanding dengan for? Apa pula kelemahan foreach dibanding dengan loop yang lain seperti do-while?
Jawab: Foreach sangat berguna ketika ingin menjelajahi semua elemen dalam satu Collection atau array. Syntax baru ini dikeluarkan karena sebelumnya untuk melakukan penjelajahan pada Collection menggunakan metode Iterator yang cukup rumit dalam penggunaannya. Dalam penggunaan iterator seperti contoh di atas untuk menjelajahi Collection satu persatu diperlukan minimal 2 baris kode, yaitu mengambil objek iterator dan mengiterasinya
Bimo Adi Pradono 31045 www.digizoneku.com

menggunakan while. Satu lagi kelemahan penggunaan iterator yang lain adalah keharusan meng-casting Collection walapun Collection telah menggunakan Generik. Jika sebelumnya untuk menjelajahi Collection dibutuhkan minimal dua baris kode, maka dengan foreach kita hanya membutuhkan satu baris kode. Foreach juga sepenuhnya menggunakan kemampuan generik sehingga kita tidak perlu pengcastingan lebih dahulu. Dalam penggunaannya dalam array, foreach tidak terlalu banyak berguna karena dengan menggunakan perulangan for biasa, penjelajahan array bisa dilakukan dengan maksimal. Salah satu kelebihan foreach dibandingkan dengan for dalam penjelajahan array adalah syntax yang sederhana dan tidak perlunya menggunakan indeks saat mengakses elemen dalam array. Tetapi dalam menjelajahi array, foreach memiliki keterbatasan. Di dalam foreach kita tidak bisa melakukan pemanipulasian terhadap isi array. Karena foreach tidak mereferensi langsung pada isi array tersebut. Dibandingkan dengan for, foreach memiliki keunggulan: o akses array yang lebih simpel dan cepat o sintaks yang lebih sederhana o karena tiap elemen array secara default sudah dimasukkan, tidak mungkin terjadi error akibat exceeding batas array Dibanding loop lain, kekurangannya: o hanya untuk proses yang operasinya menggunakan array o agak blind operation; elemen array mana yang sedang dieksekusi tidak diketahui karena secara otomatis mengindeks semua isi array-nya.

Bimo Adi Pradono 31045

www.digizoneku.com

BAB IV KESIMPULAN
1. Percabangan dalam program dapat dilakukan dengan switch atau if-else. 2. Switch memiliki performa lebih ringan dibanding if-else, sehingga biasa digunakan pada program yang percabangannya tidak rumit. 3. Case dalam Switch dapat diganti dengan enum sebagai alternative untuk menyederhanakan program. 4. If-else biasa digunakan pada percabangan yang rumit. 5. If-else dapat ditangani oleh foreach dan dengan menambahkan collection untuk list datanya. 6. Dalam menangani exception, keyword yang digunakan minimal dua: try dan catch. 7. Bila terjadi sesuatu yang tidak bisa ditangani oleh blok try, error message akan ditangkap oleh block catch dalam exception dan akan ditampikan ke konsol.

Bimo Adi Pradono 31045

www.digizoneku.com