Soal 1:
Volume Kubus
Buat program untuk menghitung volume dari sebuah kubus Penjelasan: Dalam menulis sebuah program ada beberapa langkah yang harus dilakukan, yaitu: 1. Tentukan apa yang akan dicari atau dijadikan output dari program 2. Setelah dapat yang dicari, tentukan apa yang dibutuhkan untuk mencari itu 3. Dari berbagai hal yang dibutuhkan tersebut, tentukan mana yang sudah memiliki nilai dan mana yang belum punya nilai 4. Jika ada yang belum memiliki nilai maka nilainya akan diberikan lewat input data 5. Analisa cara memperoleh hasil (output) dari nilai-nilai yang ada (input maupun bukan), biasanya akan menghasilkan sebuah rumus atau langkahlangkah penyelesaian 6. Setelah caranya didapatkan, tentukan semua variabel yang terlibat, dari output, input maupun dari proses yang akan dilakukan Coba kita aplikasikan langkah-langkah tersebut pada soal di atas! Hasilnya sbb: 1. Hasil yang akan dicari pada soal tersebut adalah volume kubus 2. Untuk mencari volume kubus hanya dibutuhkan panjang sisi dari kubus tersebut 3. Dari soal jelas tidak disebutkan berapa panjang sisi kubus yang akan dihitung volumenya, jadi panjang sisi kubus belum memiliki nilai 4. Panjang sisi kubus harus dimasukkan lewat input 5. Volume kubus diperoleh dari rumus panjang sisi dipangkatkan tiga atau sisi kali sisi kali sisi 6. Jadi variabel yang terlibat disini adalah variabel untuk volume kubus dan variabel untuk panjang sisi kubus Dari langkah-langkah tersebut, berlanjut dengan memberikan nama setiap variabel yang akan dilibatkan ke dalam program. Nama variabel merupakan identifier, sehingga harus unik dan menganut cara penulisan identifier. Untuk variabel yang menampung nilai volume kubus, dapat menggunakan nama volume atau isi atau v atau vol, atau yang lainnya. Sedangkan untuk panjang sisinya dapat menggunakan nama sisi atau s atau panjang atau p. Supaya jelas, saya akan menggunakan nama volume dan sisi. Agar lebih singkat, Anda boleh saja menggunakan v dan s. Yang perlu diingat, sekali ditentukan, nama tersebut harus Anda gunakan terus dalam program dan ditulis apa adanya. Dan perlu diketahui juga bahwa nama variabel di PHP selalu diawali dengan tanda dolar ($). Nah, setelah selesai menentukan setiap variabel yang ada, saatnya menuliskan kode programnya. Secara umum, urutan dari sebuah program adalah dimulai dengan input data, dilanjutkan dengan pemrosesan dan diakhiri dengan output hasil. INPUT,
2
PROSES, OUTPUT!!! Itu yang harus Anda ingat baik-baik! Ada baiknya juga untuk memfokuskan penulisan program pada inti program terlebih dahulu, baru menambahkan user interface jika diperlukan dan jika ada waktu baru tambahkan kosmetik. Pada program PHP yang berbasis console, untuk melakukan input data digunakan perintah fgets(STDIN). Pada program kita ini, variabel yang perlu diinput nilainya adalah variabel sisi yang akan menampung nilai panjang sisi kubus. Penulisannya adalah sebagai berikut: $sisi = fgets(STDIN); Pada bagian proses, yang dilakukan adalah menghitung volume kubus berdasarkan rumus yang telah tersedia. Penulisannya adalah sebagai berikut: $volume = $sisi * $sisi * $sisi; Sedangkan bagian output digunakan untuk menampilkan nilai variabel volume yang telah dihitung di bagian proses tadi. Penulisannya adalah sebagai berikut: echo $volume; Selanjutnya ketiga bagian tersebut digabungkan dengan ditulis secara berurutan. Sehingga kalau hanya inti programnya saja maka hasilnya adalah sebagai berikut: $sisi = fgets(STDIN); $volume = $sisi * $sisi * $sisi; echo $volume; ?> Saatnya untuk menambahkan user interface. Untuk program berbasis console seperti program di atas biasanya hanya terdapat dua bagian untuk user interface, yaitu bagian instruksi input data dan penjelasan output atau hasil. Bagian instruksi input data biasanya adalah penulisan kalimat instruksi atau perintah pada user untuk memasukkan data sebelum kode untuk input data (fgets). Sedangkan bagian penjelasan output adalah penulisan kalimat sebelum melakukan output yang menjelaskan tentang apa yang dituliskan tersebut. Untuk bagian instruksi input data, bisa ditulis sbb: echo 'Masukkan panjang sisi kubus : '; Untuk bagian penjelasan output, bisa ditulis sbb: echo 'Volume kubus adalah : ';
3
Sehingga program menjadi sbb: echo 'Masukkan panjang sisi kubus : '; $sisi = fgets(STDIN); $volume = $sisi * $sisi * $sisi; echo 'Volume kubus adalah : '; echo $volume; ?> Dua baris terakhir dapat disingkat menjadi: echo 'Volume kubus adalah : ', $volume; Dan terakhir adalah pemberian kosmetik, seperti judul program dan ucapan terima kasih misalnya. Perlu juga diberi baris-baris pemisah bagian program sehingga program akan lebih mudah dibaca, seperti terlihat pada jawaban yang tertulis setelah penjelasan ini.
Jawab: echo "PROGRAM MENGHITUNG VOLUME KUBUS\n"; echo "Copyright (c) 2010, Choerun Asnawi\n"; echo "Masukkan panjang sisi kubus : "; $sisi = fgets(STDIN); $volume = $sisi * $sisi * $sisi; echo "Volume kubus : ", $volume; ?>
4
Soal 2:
Luas Persegi Panjang
Buat program untuk menghitung luas persegi panjang Penjelasan: Langsung saja ke langkah-langkah penulisan program, sbb: 1. Output yang akan dihasilkan adalah luas persegi panjang 2. Luas persegi panjang didapat dari panjang dikalikan lebarnya, sehingga kita butuh panjang dan lebar persegi panjang tersebut 3. Kedua nilai tersebut tidak disebutkan di soal 4. Nilai panjang dan lebar perlu diinput 5. Nilai luas persegi panjang dapat dicari dengan rumus panjang kali lebar 6. Variabel yang terlibat adalah panjang, lebar dan luas persegi panjang Variabel-variabel yang terlibat saya beri nama luas, panjang dan lebar. Sehingga kalau hanya inti program maka akan terlihat sbb: $panjang = fgets(STDIN); $lebar = fgets(STDIN); $luas = $panjang * $lebar; echo $luas; ?> Anda perhatikan bahwa terdapat dua buah input pada program di atas. Satu untuk variabel panjang, satu lagi untuk variabel lebar. Ditambah user interface maka akan menjadi sbb: echo 'Masukkan panjang persegi panjang : '; $panjang = fgets(STDIN); echo 'Masukkan lebar persegi panjang : '; $lebar = fgets(STDIN); $luas = $panjang * $lebar; echo 'Luas persegi panjang adalah : ', $luas; ?> Ingat, urutan input tidaklah penting asal penulisan instruksinya tepat. Jadi mau memasukkan panjang dulu atau lebar dulu sama saja artinya. Sehingga Anda bisa saja menulis baris-baris input di atas menjadi: echo 'Masukkan lebar persegi panjang : '; $lebar = fgets(STDIN); echo 'Masukkan panjang persegi panjang : '; $panjang = fgets(STDIN);
5
Tetapi Anda tidak boleh menulisnya menjadi seperti berikut: echo 'Masukkan lebar persegi panjang : '; $panjang = fgets(STDIN); echo 'Masukkan panjang persegi panjang : '; $lebar = fgets(STDIN); atau juga tidak boleh menulisnya menjadi seperti ini: echo 'Masukkan lebar persegi panjang : '; echo 'Masukkan panjang persegi panjang : '; $panjang = fgets(STDIN); $lebar = fgets(STDIN); Urutannya harus menuliskan instruksi diteruskan dengan melakukan input yang sesuai, menuliskan instruksi lagi diikuti dengan melakukan input yang sesuai, dst. Jadi kalau instruksinya untuk memasukkan panjang, inputnya ya harus panjang juga.
Jawab: echo "PROGRAM MENGHITUNG LUAS PERSEGI PANJANG\n"; echo "Copyright (c) 2010, Choerun Asnawi\n"; echo 'Masukkan panjang persegi panjang : '; $panjang = fgets(STDIN); echo 'Masukkan lebar persegi panjang : '; $lebar = fgets(STDIN); $luas = $panjang * $lebar; echo 'Luas persegi panjang adalah : ', $luas; ?>
6
Soal 3:
Keliling & Luas Lingkaran
Buat program untuk menghitung keliling dan luas lingkaran Penjelasan: Langsung saja ke langkah-langkah penulisan program, sbb: 1. Output yang akan dihasilkan adalah keliling dan luas lingkaran 2. Keliling maupun luas lingkaran dapat dicari dari nilai jari-jari (radius atau r) lingkaran tersebut dan suatu nilai yang disebut sebagai pi (π) 3. Nilai jari-jari tidak disebutkan di soal, sedangkan nilai π adalah sekitar 3,14 4. Nilai jari-jari perlu diinput, sedangkan nilai π tidak perlu Keliling 2 r 5. Nilai keliling dan luas lingkaran memiliki rumus: Luas r 2 6. Variabel yang terlibat adalah keliling, luas dan jari-jari lingkaran Variabel-variabel yang terlibat saya beri nama keliling, luas dan jari2. Kalau ingin lebih singkat Anda dapat menggunakan nama-nama seperti k, l dan r. Sehingga kalau hanya inti program maka akan terlihat sbb: $jari2 = fgets(STDIN); $keliling = 2 * 3.14 * $jari2; $luas = 3.14 * $jari2 * $jari2; echo $keliling; echo $luas; ?> Anda perhatikan bahwa hanya ada satu input saja tapi terdapat dua buah proses dan dua output pada program di atas. Proses dan output adalah untuk variabel keliling dan untuk variabel luas. Perhatikan bahwa urutan proses dan output dapat Anda bolakbalik sesuka hati asalkan sebuah output harus ditulis setelah (di bawah) proses yang bersangkutan. Misalkan untuk menampilkan nilai keliling maka nilai keliling tersebut harus sudah dihitung sebelumnya. Contoh penulisan alternatif yang diperbolehkan adalah: $luas = 3.14 * $jari2 * $jari2; $keliling = 2 * 3.14 * $jari2; echo $luas; echo $keliling; atau: $luas = 3.14 * $jari2 * $jari2; echo $luas;
7
$keliling = 2 * 3.14 * $jari2; echo $keliling; atau: $luas = 3.14 * $jari2 * $jari2; $keliling = 2 * 3.14 * $jari2; echo $keliling; echo $luas; atau: $keliling = 2 * 3.14 * $jari2; echo $keliling; $luas = 3.14 * $jari2 * $jari2; echo $luas; Sedangkan contoh yang tidak diperbolehkan adalah: $luas = 3.14 * $jari2 * $jari2; echo $keliling; $keliling = 2 * 3.14 * $jari2; echo $luas; atau: $keliling = 2 * 3.14 * $jari2; echo $luas; $luas = 3.14 * $jari2 * $jari2; echo $keliling; Perhatikan baris-baris yang digarisbawahi pada dua cuplikan kode program di atas. Baris-baris tersebut berisi perintah output yang mendahului proses perhitungan yang berkaitan. Hal itulah yang tidak diperbolehkan! Lebih lanjut lagi, jika ada lebih dari satu output yang dihasilkan oleh program, maka penulisan kode seperti di atas akan membuat kedua nilai yang ditulis tersebut akan tampil berdampingan tanpa pembatas sehingga menjadi tidak jelas mana yang luas dan mana yang keliling. Untuk itu menjadi perlu untuk menuliskan kedua nilai tersebut pada barisnya sendiri-sendiri. Caranya adalah dengan menuliskan karakter newline ("\n") yang fungsinya sama dengan tombol Enter. Contohnya adalah sbb: echo $keliling; echo "\n"; echo $luas; atau:
8
echo $keliling, "\n"; echo $luas; atau kalau mau lebih menghemat kode bisa ditulis sebagai: echo $keliling, "\n", $luas; Bahkan kalau sudah tahu tentang interpolasi string, bentuk tersebut masih dapat disingkat menjadi: echo "$keliling\n$luas";
Jawab: echo "Masukkan panjang jari-jari lingkaran : "; $jari2 = fgets(STDIN); $keliling = 2 * 3.14 * $jari2; $luas = 3.14 * $jari2 * $jari2; echo "Keliling lingkaran : ", $keliling, "\n"; echo "Luas lingkaran : ", $luas; ?>
9
Soal 4:
Total Pembayaran
Buat program untuk menghitung harga yang harus dibayarkan jika membeli sejumlah barang tertentu, dengan harga satuannya diinputkan Penjelasan: Program pada soal 4 ini sebenarnya secara substansial sama saja dengan program pada soal 2 (menghitung luas persegi panjang). Kesamaan itu dapat dilihat dari rumus yang dipakai untuk menghitung output. Rumus untuk menghitung luas persegi panjang adalah perkalian dua bilangan, yaitu panjang kali lebar. Sedangkan rumus untuk menghitung total harga juga merupakan perkalian dua bilangan, yaitu harga satuan kali jumlah barang. Tinggal mengganti aja kan… Adapun langkah-langkah penulisan programnya adalah sbb: 1. 2. 3. 4. 5. 6.
Output yang dicari adalah total harga yang dibayarkan Untuk mencari total harga dibutuhkan harga satuan dan banyaknya barang Kedua nilai belum disebutkan di soal Harga satuan dan banyaknya barang harus diinput Rumusnya adalah: total harga = harga satuan kali banyaknya barang Variabel yang terlibat adalah total harga, harga satuan dan banyaknya barang
Sedangkan untuk variabel, saya beri nama total untuk total harga, harga untuk harga satuan dan jumlah untuk banyaknya barang yang dibeli. Tanpa user interface, programnya sebagai berikut: $harga = fgets(STDIN); $jumlah = fgets(STDIN); $total = $harga * $jumlah; echo $total; ?> Sekali lagi, antara variabel harga dan jumlah bisa dibolak-balik baik inputnya maupun penulisan pada prosesnya. Sehingga penulisan-penulisan potongan program berikut dapat dianggap BENAR: $jumlah = fgets(STDIN); $harga = fgets(STDIN); dan $total = $jumlah * $harga;
10
Ditambah user interface dan kosmetik maka program akan menjadi seperti jawaban berikut.
Jawab: echo "PROGRAM MENGHITUNG HARGA TOTAL\n"; echo "Copyright (c) 2010, Choerun Asnawi\n"; echo "Masukkan harga satuannya : "; $harga = fgets(STDIN); echo "Masukkan jumlah barang yang dibeli : "; $jumlah = fgets(STDIN); $total = $harga * $jumlah; echo "Total harga yang harus dibayar : ", $total; ?>
11
Soal 5:
Harga Diskon + Pajak
Buat program untuk menghitung harga yang harus dibayarkan jika harga asli barang masih harus ditambah pajak 10% dari harga aslinya dan masih didiskon 15% dari harga aslinya juga Penjelasan: Langkah-langkahnya sbb: 1. Output yang diminta adalah harga yang harus dibayarkan 2. Dari soal terlihat bahwa untuk menghitung harga tersebut dibutuhkan harga aslinya (harga awal), besar pajak dan diskonnya 3. Harga asli jelas belum disebutkan di soal, sedangkan besar pajak dan diskon walaupun tidak disebutkan secara langsung tetapi di soal terdapat petunjuk cara mencari atau menghitung nilainya 4. Harga asli jelas harus diinputkan, sementara besar pajak dan diskon tidak perlu malahan tidak boleh diinputkan, karena nilainya harus dihitung berdasarkan harga aslinya 5. Rumus-rumusnya adalah sbb: Harga_Bayar = Harga_Asli + Pajak – Diskon, dimana Pajak = 10% Harga_Asli dan Diskon = 15% Harga_Asli 6. Variabel-variabelnya adalah harga yang dibayarkan, harga asli (awal) barang, besarnya pajak dan diskon Dalam PHP tidak dikenal adanya tanda persen menggunakan tanda %. Untuk menulisnya Anda harus ingat terlebih dahulu arti tanda %, yaitu per seratus alias dibagi dengan seratus. Jadi kalau 10% artinya 10 per seratus atau 10/100 yang hasilnya adalah 1/10 atau kalau ditulis ke bentuk desimal menjadi 0,1. Demikian juga 15% jika ditulis ke dalam bentuk desimal menjadi 0,15. Bahasa PHP menggunakan notasi bilangan yang digunakan di Inggris. Dalam PHP, tanda desimal bukannya koma (,) melainkan titik (.). Sehingga 10% dalam PHP ditulis 0.1, bukan 0,1. Dalam PHP juga tidak boleh menuliskan pemisah ribuan, sehingga bilangan sejuta dalam PHP ditulis 1000000, bukannya 1.000.000. Tanpa user interface, jawaban soal di atas kira-kira sbb: $asli = fgets(STDIN); $pajak = 0.1 * $asli; $diskon = 0.15 * $asli; $bayar = $asli + $pajak - $diskon; echo $bayar; ?> Sebenarnya untuk yang sudah terbiasa menulis program, jawaban di atas masih bisa disingkat dengan menghilangkan variabel pajak dan diskon, dan penghitungan keduanya langsung dimasukkan ke dalam satu proses sekaligus, sbb: 12
$asli = fgets(STDIN); $bayar = $asli + (0.1 * $asli) – (0.15 * $asli); echo $bayar; ?> Atau bahkan untuk yang lebih jeli dapat menyederhanakannya menjadi sbb: $asli = fgets(STDIN); $bayar = 0.95 * $asli; echo $bayar; ?> Kok bisa seperti itu? Silahkan cari sendiri! Hanya penyederhanaan rumus kok!
Jawab: echo "PENGHITUNG HARGA PEMBAYARAN\n"; echo "===========================\n"; echo "Masukkan harga aslinya : "; $asli = fgets(STDIN); $pajak = 0.1 * $asli; $diskon = 0.15 * $asli; $bayar = $asli + $pajak - $diskon; echo "Harga yang harus dibayarkan : ", $bayar; ?>
13
Soal 6:
Fungsi Matematis
Buat program untuk menghitung nilai fungsi kuadrat berikut: f ( x) x 2 4 x 3 Penjelasan: Soal ini sebenarnya sangat sederhana sehingga saya rasa sudah tidak perlu penjelasan lebih lanjut lagi. Yang perlu diterangkan adalah bagaimana caranya menerjemahkan rumus matematis tersebut ke dalam program PHP. Sebelumnya saya tulis dulu langkah-langkah awalnya, sbb: 1. Output yang akan dicari adalah nilai fungsi f(x) 2. Untuk mencarinya – dilihat dari rumus pada soal – diperlukan nilai x saja (Ingat!!! Bukan x2, 4x dan 3, lho!!!) 3. Nilai x jelas tidak tertera pada soal 4. Nilai x harus diinput oleh user 5. Rumusnya adalah: f ( x) x 2 4 x 3 6. Variabel yang terlibat adalah fungsi f(x) dan x Output yang dicari pada soal tersebut – yaitu f(x) – dalam program harus ditampung ke dalam suatu variabel. Karena nama f(x) sendiri tidak valid digunakan sebagai identifier karena mengandung tanda kurung, maka kita harus mencari nama lain untuk mewakilinya. Dalam hal ini saya gunakan nama fx sebagai nama variabel yang mewakili f(x). Anda boleh hanya menggunakan nama f saja, atau nama fungsi juga boleh. Bahkan jika Anda ingin menggunakan nama variabel y juga diperkenankan. Yang penting disini bukan nama literalnya namun arti yang tersirat di dalamnya. Bentuk x2 dalam PHP atau kebanyakan bahasa pemrograman lainnya juga dapat ditulis sebagai perkalian dua buah nilai x, ditulis x * x. Sehingga, bentuk matematis f ( x) x 2 4 x 3 jika ditulis dalam PHP akan menjadi: $fx = $x * $x + 4 * $x + 3; Atau jika kurang yakin bisa ditambahkan tanda kurung sbb: $fx = ($x * $x) + (4 * $x) + 3; Sehingga jika hanya inti programnya saja program dapat ditulis menjadi: $x = fgets(STDIN); $fx = $x * $x + 4 * $x + 3; echo $fx; ?>
14
Program selengkapnya dapat dilihat pada jawaban berikut.
Jawab: echo "Masukkan nilai x : "; $x = fgets(STDIN); $fx = $x * $x + 4 * $x + 3; echo "Nilai f(x) adalah : ", $fx; ?>
15
Soal 7:
Kecepatan Atlet
Buat program untuk menghitung besarnya kecepatan dari seorang atlet yang berlari pada lintasan 100 m Penjelasan: Dalam ilmu Fisika disebutkan bahwa kecepatan dapat dicari dari jauhnya jarak tempuh dibagi waktu yang diperlukan untuk menempuhnya. Dari pengertian ini maka dapat kita susun langkah-langkah awal berikut: 1. Output yang mau dihasikan adalah besarnya kecepatan 2. Untuk mencari kecepatan diperlukan jarak dan waktunya 3. Jarak tempuh sudah disebutkan di soal, yaitu 100 m, sedangkan waktunya belum disebutkan 4. Jarak tempuh tidak perlu diinput, sedangkan waktu perlu diinput s 5. Rumusnya, kecepatan = jarak per waktu atau singkatnya V t 6. Variabel yang terlibat adalah kecepatan dan waktu, jarak tidak perlu dibikin variabel karena nilainya udah fix (tetap), yaitu 100 m Untuk nama variabel saya gunakan nama kecepatan dan waktu. Kalau ingin lebih singkat bisa saja Anda gunakan nama v dan t, sesuai rumus di atas. Sehingga inti programnya sebagai berikut: $waktu = fgets(STDIN); $kecepatan = 100 / $waktu; echo $kecepatan; Hanya saja disini ada tambahan dikarenakan adanya pembagian pada rumus yang digunakan. Yang perlu diingat adalah jikalau ada pembagian dalam program maka kita sebagai programmer harus mencegah jangan sampai terjadi pembagian dengan nol (divided by zero). Dalam komputer pembagian dengan nol adalah suatu error yang sangat fatal yang dapat menghentikan jalannya suatu program. Rumus kecepatan melibatkan pembagian dengan nilai waktu yang digunakan. Untuk itu kita harus mencegah agar supaya nilai waktu tersebut tidak bernilai nol. Tetapi kalau dilihat bahwa nilai waktu tersebut diinputkan oleh user maka pencegahan tersebut menjadi tidak memungkinkan (untuk saat ini) karena user memang bisa memasukkan nilai apa saja disitu, termasuk nlai nol. Oleh karenanya yang dapat kita lakukan adalah tidak melakukan proses jika nilai waktu yang diinput adalah nol. Jadi proses pencarian kecepatan hanya akan dilakukan jika waktu tidak sama dengan nol. Sekalian saja, waktu yang digunakan untuk menempuh jarak juga tidak mungkin negatif, sehingga dengan dasar ini maka proses pencarian kecepatan hanya akan dilakukan jika nilai waktu lebih besar dari nol.
16
Output juga hanya akan ditampilkan jika proses dilakukan. Tidak mungkin kita akan menampilkan output jika apa yang akan ditampilkan tersebut tidak dihitung dulu. Sehingga jika proses tidak dilakukan, maka output juga tidak ada. Dengan kata lain, proses dan output hanya akan dilakukan jika nilai waktu lebih besar dari nol. Dalam PHP, hal tersebut ditulis menjadi: if ($waktu > 0) { $kecepatan = 100 / $waktu; echo $kecepatan; } Ada baiknya kalau user diberi peringatan jika memasukkan nilai nol. Contohnya sbb: if ($waktu <= 0) { echo 'Waktu tidak boleh nol atau negatif!'; } Sehingga lengkapnya menjadi: if ($waktu > 0) { $kecepatan = 100 / $waktu; echo $kecepatan; } if ($waktu <= 0) { echo 'Waktu tidak boleh nol atau negatif!'; } Pada potongan kode di atas Anda dapat melihat bentuk konstruksi if yang tertulis berurutan. Bentuk umumnya adalah: if (A) { statements_A; } if (B) { statements_B; } Jika terdapat bentuk seperti ini maka perlu dilihat hubungan antara kondisi A dengan kondisi B. Dengan mencermati hubungan keduanya memungkinkan kita untuk menuliskan program yang lebih efisien. Kondisi A dan kondisi B dikatakan berhubungan jika mengandung variabel yang sama. Jika tidak berisi variabel yang sama maka dikatakan tidak berhubungan. Hubungan antara dua kondisi A dan B bisa berbentuk: 1. A sama persis dengan B, jika semua keadaan yang memenuhi kondisi A juga memenuhi kondisi B dan juga demikian sebaliknya Contoh: A : x adalah bilangan genap B : x adalah kelipatan 2
17
2. A merupakan bagian dari B, jika semua keadaan yang memenuhi kondisi A juga memenuhi kondisi B, tapi tidak sebaliknya, yaitu ada suatu keadaan yang memenuhi kondisi B tetapi tidak memenuhi kondisi A Contoh: A : x > 10 B : x>2 3. A beririsan dengan B, jika ada keadaan yang memenuhi keduanya tetapi juga ada keadaan yang memenuhi salah satunya (A saja atau B) saja Contoh: A : x > 6 B : x<8 4. A terpisah dari B, jika tidak ada keadaan yang memenuhi keduanya (tidak beririsan) tapi masih ada keadaan yang tidak memenuhi keduanya Contoh: A : x < 10 B : x > 20 5. A kebalikan dari B, jika tidak ada keadaan yang memenuhi keduanya (tidak beririsan) dan juga tidak ada keadaan yang tidak memenuhi keduanya Contoh: A : x adalah bilangan genap B : x adalah bilangan ganjil Atau kalau ditulis dalam bentuk tabel: No. 1. 2. 3. 4. 5.
Hubungan A sama persis dengan B A bagian dari B A beririsan dengan B A terpisah dengan B A kebalikan dari B
Ada keadaan yang memenuhi … keduanya A saja B saja tidak dua2nya ada mungkin ada ada mungkin ada ada ada mungkin ada ada ada ada ada -
Konsep ini sebenarnya sama dengan konsep himpunan. Adapun hubungan dan akibatnya terhadap program adalah sbb: 1. Jika kondisi A sama persis dengan kondisi B maka sebaiknya potongan program di atas diubah ke bentuk: if (A) { statements_A; statements_B; } 2. Jika kondisi A bagian dari kondisi B maka sebaiknya ditulis menjadi: if (B) { if (A) { statement_A; } statement_B; }
18
Bentuk seperti di atas sering dinamakan sebagai Nested If atau Konstruksi If Bersarang, yang artinya konstruksi if yang berada di dalam konstruksi if lain. 3. Jika kondisi A beririsan dengan kondisi B maka harus ditulis apa adanya 4. Jika kondisi A terpisah dari kondisi B maka sebaiknya ditulis menjadi: if (A) { statements_A; } else if (B) { statements_B; } Bentuk di atas dinamakan Konstruksi If Bertingkat, dimana konstruksi if yang kedua dan seterusnya di serangkaian konstruksi if berurutan tersebut depannya diberi tambahan keyword else yang artinya „selainnya itu‟. 5. Jika kondisi A merupakan kebalikan dari B maka bisa ditulis menjadi: if (A) { statements_A; } else { statements_B; } Adapun jika kondisi A dan B tidak berhubungan – misalkan kondisi A melibatkan variabel x sementara kondisi B melibatkan variabel y – maka bentuk konstruksi if berurutan tersebut tetap harus ditulis apa adanya. Sedangkan jika konstruksi if yang berurutan tersebut ada lebih dari dua, misalkan seperti bentuk berikut: if (A) { statements_A; } if (B) { statements_B; } if (C) { statements_C; } if (D) { statements_D; } maka sebaiknya Anda lihat hubungan antar kondisi secara berurutan dari atas ke bawah. Kondisi-kondisi yang sudah dicek hubungannya dicek lagi dengan kondisi yang di bawahnya, dan seterusnya. Pada contoh di atas, pertama kondisi A dicek hubungannya dengan kondisi B. Setelah itu gabungan kondisi A dan B dibandingkan dengan kondisi C. Terakhir gabungan kondisi A, B dan C dicek hubungannya dengan kondisi D.
19
Kembali ke bentuk: if ($waktu > 0) { $kecepatan = 100 / $waktu; echo $kecepatan; } if ($waktu <= 0) { echo 'Waktu tidak boleh nol atau negatif!'; } Potongan program ini kira-kira dapat dibaca sbb: “Jika besarnya waktu yang diinput user lebih besar dari nol maka lakukan perhitungan kecepatan dan tampilkan hasilnya. Jika waktunya nol atau kurang maka kasih peringatan ke user”. Dari kalimat ini maka dapat dilihat bahwa kondisi (Waktu > 0) dan kondisi (Waktu <= 0) adalah dua kondisi yang berkebalikan, sehingga sesuai aturan dapat diubah menjadi: if ($waktu > 0) { $kecepatan = 100 / $waktu; echo $kecepatan; } else { echo 'Waktu tidak boleh nol atau negatif!'; } Potongan program di atas kira-kira dibaca sbb: “Jika besarnya waktu yang diinput user lebih besar dari nol maka lakukan perhitungan kecepatan dan tampilkan hasilnya, selain itu kasih peringatan ke user”. Catatan terakhir, untuk blok statement (yang tertulis di dalam kurung kurawal) yang hanya terdiri atas satu statement saja, maka dapat ditulis tanpa tanda kurung kurawal. Dengan demikian blok setelah else di atas dapat disingkat menjadi: else echo 'Waktu tidak boleh nol atau negatif!';
Jawab: echo "PENGHITUNG KECEPATAN\n"; echo "====================\n"; echo 'Waktu tempuh (detik) : '; $waktu = fgets(STDIN); if ($waktu > 0) { $kecepatan = 100 / $waktu; echo 'Kecepatannya adalah : ', $kecepatan; } else echo 'Waktu tidak boleh nol atau negatif!'; ?>
20
Soal 8:
Harga Diskon Bervariasi
Buat program untuk menghitung harga yang harus dibayarkan dari pembelian barang dengan ketentuan diskon sbb: Harga Barang Kurang dari Rp 50.000 Rp 50.000 – Rp 200.000 Lebih dari Rp 200.000
Diskon Tanpa Diskon 10% 25%
Penjelasan: Langkah-langkah penyelesaian untuk soal ini adalah sebagai berikut: 1. Output yang akan dihasilkan adalah harga akhir yang akan dibayarkan 2. Untuk menghitung harga akhir tersebut dibutuhkan harga awal dan diskon 3. Besarnya harga awal jelas tidak disebutkan di soal, sedangkan besarnya diskon dapat dihitung lewat harga awal 4. Harga awal harus diinput, sedangkan diskon dihitung (tidak perlu diinput) 5. Harga akhir dicari dari harga awal dikurangi diskon, sedangkan besarnya diskon bervariasi tergantung harga awalnya, dengan ketentuan: a. Jika harga awal kurang dari Rp 50.000 maka diskon = 0 b. Jika harga awal dari Rp 50.000 sampai Rp 200.000 maka diskon = 10% harga awal c. Jika harga awal lebih dari Rp 200.000 maka diskon = 25% harga awal 6. Variabel yang terlibat adalah harga akhir, harga awal dan diskon Jawaban soal ini sebenarnya sederhana, karena masih berupa program yang mengikuti alur INPUT, PROSES dan OUTPUT. Hanya saja prosesnya sedikit kompleks dari biasanya. Dalam soal ini proses untuk mencari output dibagi menjadi dua, yaitu: proses mencari diskon dan diikuti proses mencari harga akhirnya. Pencarian besarnya diskon pun bercabang menjadi tiga cabang yang ditentukan oleh tiga buah kondisi. Sebelumnya, kita beri nama dulu setiap variabel yang akan kita pakai. Saya menggunakan nama akhir untuk harga akhir, awal untuk harga awal dan diskon untuk besarnya diskon. Untuk mencari harga akhir gunakan kode program berikut: $akhir = $awal – $diskon; Besarnya diskon harus dicari sebelum kode program di atas. Berikut ini adalah tiga kode program yang digunakan untuk mencari besarnya diskon: $diskon = 0; dan
21
$diskon = 0.1 * $awal; dan $diskon = 0.25 * $awal; Berikut ini kondisi beserta kode program untuk mencari diskonnya: 1. Kondisi jika harga awal kurang dari Rp 50.000, kondisi ini jika ditulis dalam PHP menjadi: $awal < 50000, sehingga lengkapnya menjadi: if ($awal < 50000) $diskon = 0; 2. Kondisi jika harga awal berkisar dari Rp 50.000 sampai Rp 200.000, kondisi ini jika ditulis dalam PHP menjadi: ($awal >= 50000) and ($awal <= 200000), sehingga lengkapnya menjadi: if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; 3. Kondisi jika harga awal lebih dari Rp 200.000, kondisi ini jika ditulis dalam PHP menjadi: $awal > 200000, sehingga lengkapnya menjadi: if ($awal > 200000) $diskon = 0.25 * $awal; Kalau ketiganya digabungkan maka akan menjadi: if ($awal < 50000) $diskon = 0; if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; if ($awal > 200000) $diskon = 0.25 * $awal; Bentuk di atas merupakan bentuk tiga konstruksi if berurutan yang berhubungan. Analisa hubungan ketiga kondisinya adalah sebagai berikut: 1. Kondisi pertama $awal < 50000 dan kondisi kedua ($awal >= 50000) and ($awal <= 200000) merupakan dua kondisi yang terpisah, artinya tidak ada satupun nilai awal yang dapat memenuhi kedua kondisi tersebut (coba pikir, ada gak suatu nilai yang kurang dari 50.000 sekaligus lebih dari 50.000 ???) tapi masih ada nilai awal yang tidak memenuhi keduanya, contohnya 250.000. Karena kedua kondisi terpisah maka sesuai aturan maka bentuknya dapat ditulis menjadi:
22
if ($awal < 50000) $diskon = 0; else if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; 2. Karena kondisi $awal >= 50000 sendiri merupakan kebalikan dari kondisi $awal < 50000 maka bentuk di atas dapat lebih disingkat jadi: if ($awal < 50000) $diskon = 0; else if ($awal <= 200000) $diskon = 0.1 * $awal; 3. Sekarang kedua kondisi pertama di atas – yaitu $awal < 50000 dan ($awal >= 50000) and ($awal <= 200000)– dibandingkan dengan kondisi ketiga, yaitu $awal > 200000. Yang satu bernilai 200.000 ke bawah, sedangkan yang satu nilainya lebih dari 200.000. Dari sini dapat diambil kesimpulan bahwa kedua kondisi tersebut merupakan suatu kebalikan, karena tidak ada satupun nilai awal yang memenuhi keduanya maupun yang tidak memenuhi keduanya. Sehingga kode program menjadi: if ($awal < 50000) $diskon = 0; else if ($awal <= 200000) $diskon = 0.1 * $awal; else $diskon = 0.25 * $awal; Perlu diketahui bahwa perhitungan besarnya diskon tidak perlu urut sesuai dengan tabel di soal. Hal ini disebabkan karena rumus diskon yang satu tidak ada kaitannya dengan rumus pencarian diskon yang lain. Artinya, bentuk yang semula: if ($awal < 50000) $diskon = 0; if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; if ($awal > 200000) $diskon = 0.25 * $awal; bisa saja dibolak-balik dan ditulis menjadi: if ($awal < 50000) $diskon = 0; if ($awal > 200000) $diskon = 0.25 * $awal; if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; atau
23
if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; if ($awal < 50000) $diskon = 0; if ($awal > 200000) $diskon = 0.25 * $awal; atau if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; if ($awal > 200000) $diskon = 0.25 * $awal; if ($awal < 50000) $diskon = 0; atau if ($awal > 200000) $diskon = 0.25 * $awal; if ($awal < 50000) $diskon = 0; if (($awal >= 50000) and ($awal <= 200000)) $diskon = 0.1 * $awal; Setiap bentuk di atas dapat dianalisa kembali dan akan menghasilkan kode program akhir yang berbeda bentuknya namun sama fungsinya. Contohnya, bentuk yang terakhir di atas jika dianalisa lebih lanjut akan menjadi sbb: if ($awal > 200000) $diskon = 0.25 * $awal; else if ($awal < 50000) $diskon = 0; else $diskon = 0.1 * $awal; Silahkan mencoba menganalisa bentuk yang lainnya!
24
Jawab: echo "PENGHITUNG HARGA DISKON\n"; echo "=======================\n"; echo 'Harga awal : '; $awal = fgets(STDIN); if ($awal < 50000) $diskon = 0; else if ($awal <= 200000) $diskon = 0.1 * $awal; else $diskon = 0.25 * $awal; $akhir = $awal - $diskon; echo 'Harga akhir : ', $akhir; ?>
25
Soal 9:
Fungsi Bercabang (Bilangan Nyata)
Buat program untuk menghitung nilai fungsi berikut: 0, untuk x 0 x 2 5, untuk 0 x 3 f ( x) 2 x 1, untuk 3 x 5 5 x, untuk 5 x 10 x, untuk x 10 untuk x anggota bilangan nyata Penjelasan: Langkah-langkah penyelesaian untuk soal ini adalah sebagai berikut: 1. 2. 3. 4. 5. 6.
Output yang akan dihasilkan adalah nilai fungsi f(x) Untuk menghitung fungsi diperlukan nilai x Besarnya nilai x jelas tidak disebutkan di soal Nilai x harus diinput Nilai fungsi f(x) dicari dengan rumus yang bervariasi (lihat soal) Variabel yang terlibat adalah nilai fungsi f(x) dan nilai x
Beberapa kondisi yang mempengaruhi hasil akhir adalah sbb: No. 1. 2. 3. 4. 5.
Kondisi x0 0 x3 3 x 5 5 x 10 x 10
Dalam PHP $x <= 0 ($x > 0) and ($x <= 3) ($x > 3) and ($x <= 5) ($x > 5) and ($x <= 10) $x > 10
Perhitungan Nilai Fungsi $fx = 0 $fx = $x * $x + 5 $fx = 2 * $x + 1 $fx = 5 * $x $fx = $x
Dari tabel di atas jika diimplementasikan ke dalam program menjadi sbb: if ($x <= 0) $fx = 0; if (($x > 0) and ($x <= 3)) $fx = $x * $x + 5; if (($x > 3) and ($x <= 5)) $fx = 2 * $x + 1; if (($x > 5) and ($x <= 10)) $fx = 5 * $x; if ($x > 10) $fx = $x; Bentuk di atas jika dianalisa lebih lanjut maka akan berubah menjadi:
26
if ($x <= 0) $fx = 0; else if (($x > 0) and ($x <= 3)) $fx = $x * $x + 5; else if (($x > 3) and ($x <= 5)) $fx = 2 * $x + 1; else if (($x > 5) and ($x <= 10)) $fx = 5 * $x; else $fx = $x; atau lebih dipersingkat menjadi: if ($x <= 0) $fx = 0; else if ($x <= 3) $fx = $x * $x + 5; else if ($x <= 5) $fx = 2 * $x + 1; else if ($x <= 10) $fx = 5 * $x; else $fx = $x; Penyingkatan di atas dapat dilihat penjelasannya pada penjelasan soal sebelumnya.
Jawab: echo "PROGRAM PENGHITUNG FUNGSI\n"; echo "=========================\n"; echo 'Nilai x : '; $x = fgets(STDIN); if ($x <= 0) $fx = 0; else if ($x <= 3) $fx = $x * $x + 5; else if ($x <= 5) $fx = 2 * $x + 1; else if ($x <= 10) $fx = 5 * $x; else $fx = $x; echo 'Nilai f(x) = ', $fx; ?>
27
Soal 10:
Fungsi Bercabang (Bilangan Bulat)
Buat program untuk menghitung nilai fungsi berikut: 0, untuk x 0 x 2 5, untuk 0 x 3 f ( x) 2 x 1, untuk 3 x 5 5 x, untuk 5 x 10 x, untuk x 10 untuk x anggota bilangan bulat positif Penjelasan: Soal ini hampir sama dengan soal sebelumnya hanya saja tipe data untuk x berbeda. Yang sebelumnya menggunakan bilangan nyata sekarang menggunakan bilangan bulat positif. Penyelesaiannya sebenarnya sama saja, dan bagian proses dapat ditulis sama dengan jawaban soal sebelumnya, yaitu: if ($x <= 0) $fx = 0; else if ($x <= 3) $fx = $x * $x + 5; else if ($x <= 5) $fx = 2 * $x + 1; else if ($x <= 10) $fx = 5 * $x; else $fx = $x; Karena nilai x merupakan sebuah bilangan positif, maka nilai yang paling kecil adalah nilai nol dan tidak mungkin lebih kecil dari nol, sehingga dua baris pertama potongan kode di atas dapat diubah menjadi: if ($x == 0) $fx = 0; Kemudian karena nilai x merupakan bilangan bulat, maka dari setiap kondisi yang ada sudah jelas sekali berapa nilai x yang memenuhi kondisi tersebut. Berbeda dengan bilangan real yang tidak memiliki batas sampai berapa angka di belakang koma. Berikut tabel berisi setiap kondisi dengan nilai x yang memenuhi kondisi tersebut: No. 1. 2. 3. 4. 5.
Kondisi x0 0 x3 3 x 5 5 x 10 x 10
Nilai x yang Memenuhi Kondisi tersebut 0 1, 2 dan 3 4 dan 5 6, 7, 8, 9 dan 10 11, 12, 13, dst (selain nilai yang di atas) 28
Dengan melihat hal tersebut, maka bentuk konstruksi if bertingkat tersebut dapat diubah ke dalam bentuk switch. Secara umum bentuk switch dapat ditulis sbb: switch (ekspresi) { case nilai_1: kelompok_statement_1; break; case nilai_2: kelompok_statement_2; break; ... default: kelompok_statement_Lainnya; } Sehingga konstruksi if di atas jika diubah ke dalam bentuk switch menjadi sbb: switch ($x) { case 0: $fx = 0; break; case 1: $fx = $x * $x + 5; break; case 2: $fx = $x * $x + 5; break; case 3: $fx = $x * $x + 5; break; case 4: $fx = 2 * $x + 1; break; case 5: $fx = 2 * $x + 1; break; case 6: $fx = 5 * $x; break; case 7: $fx = 5 * $x; break; case 8: $fx = 5 * $x; break; case 9: $fx = 5 * $x; break; case 10: $fx = 5 * $x; break; default: $fx = $x; }
29
Selanjutnya untuk nilai-nilai yang memiliki kelompok statement sama dapat digabung menjadi satu dipisah dengan tanda koma. Ilustrasinya begini, jika seandainya di dalam struktur switch ada pola berbentuk: case a: statement; break; case b: statement; break; Bentuk di atas dapat disingkat menjadi bentuk: case a: case b: statement; break; Dengan demikian, potongan kode program di atas dapat disingkat menjadi: switch ($x) { case 0: $fx = 0; break; case 1: case 2: case 3: $fx = $x * $x + 5; break; case 4: case 5: $fx = 2 * $x + 1; break; case 6: case 7: case 8: case 9: case 10: $fx = 5 * $x; break; default: $fx = $x; } Baris-baris yang terlalu pendek bisa ditulis dalam satu baris saja untuk menyingkat kode program. Sehingga potongan kode program di atas dapat disingkat lagi menjadi: switch ($x) { case 0: $fx = 0; break; case 1: case 2: case 3: $fx = $x * $x + 5; break; case 4: case 5:
30
$fx = 2 * $x + 1; break; case 6: case 7: case 8: case 9: case 10: $fx = 5 * $x; break; default: $fx = $x; } Lengkapnya dapat dilihat pada jawaban di bawah ini.
Jawab: echo "PROGRAM PENGHITUNG FUNGSI\n"; echo "=========================\n"; echo 'Nilai x : '; $x = fgets(STDIN); switch ($x) { case 0: $fx = 0; break; case 1: case 2: case 3: $fx = $x * $x + 5; break; case 4: case 5: $fx = 2 * $x + 1; break; case 6: case 7: case 8: case 9: case 10: $fx = 5 * $x; break; default: $fx = $x; } echo 'Nilai f(x) = ', $fx; ?>
31
Soal 11:
Nama Hari dalam Seminggu
Buat program untuk menampilkan nama hari berdasarkan nomor hari yang diinput oleh user Contohnya jika user menginput angka satu maka muncul output Senin, kalau user menginput dua muncul output Selasa, input tujuh muncul output Minggu Penjelasan: Jawaban soal ini sangat sederhana dan boleh dikatakan banyak sekali alternatifnya. Alternatif pertama adalah dengan tetap menggunakan alur yang biasanya yaitu INPUT, PROSES baru OUTPUT, seperti tertulis pada jawaban pertama di atas. Bagian INPUT hanya berisi input untuk nomor hari. Bagian PROSES isinya untuk menentukan nama hari berdasarkan input nomor hari. Bagian OUTPUT untuk menampilkan nama hari yang tadi sudah ditentukan pada bagian proses. Jika diperhatikan, ternyata bagian proses sebenarnya sangat sederhana, karena di dalamnya tidak ada proses perhitungan sama sekali. Yang ada hanyalah melakukan pemberian nilai kepada variabel yang mewakili nama hari. Oleh karena itu kita dapat menggunakan alternatif jawaban yang intinya adalah menggabungkan proses dan output menjadi satu. Dalam alternatif ini penentuan nama hari langsung diikuti dengan menampilkan outputnya. Karena penentuan nama harinya sangat sederhana maka proses dan output dilebur jadi satu bagian.. Pada alternatif kedua dapat dilihat bahwa variabel untuk nama hari sudah tidak diperlukan lagi. Hal tersebut karena nilai nama hari yang pada alternatif pertama disimpan dulu untuk ditampilkan nanti, pada alternatif kedua ini langsung ditampilkan dan tidak perlu disimpan (dalam variabel) dulu. Alternatif yang lainnya adalah mengganti konstruksi switch menjadi konstruksi if bertingkat, walaupun tentu saja konstruksi switch adalah pilihan yang lebih baik. Untuk latihan coba gantilah jawaban-jawaban di atas ke dalam bentuk konstruksi if bertingkat (yang menggunakan if-else-if). Supaya lebih jelas, berikut ini adalah langkah-langkah penyelesaian soal di atas: 1. 2. 3. 4. 5.
Output yang akan dihasilkan adalah tampilan nama hari Yang diperlukan adalah nomor harinya Nomor hari tidak disebutkan di soal Nomor hari diinputkan Untuk mencari nama hari tidak diperlukan perhitungan atau rumus tertentu, tapi hanya perlu mengecek berapa nomor hari yang diinputkan oleh user 6. Variabel yang terlibat dan wajib ada adalah nomor hari, sedangkan nama hari boleh dijadikan variabel, boleh juga tidak
32
Jawab: echo "PROGRAM NAMA HARI\n"; echo "=================\n"; echo "Nomor hari : "; $nomor = fgets(STDIN); switch ($nomor) { case 1: $nama = 'Senin'; break; case 2: $nama = 'Selasa'; break; case 3: $nama = 'Rabu'; break; case 4: $nama = 'Kamis'; break; case 5: $nama = 'Jumat'; break; case 6: $nama = 'Sabtu'; break; case 7: $nama = 'Minggu'; break; default: die('Nomor hari hanya dari 1 sampai 7'); } echo 'Nama hari : ', $nama; ?>
atau echo "PROGRAM NAMA HARI\n"; echo "=================\n"; echo "Nomor hari : "; $nomor = fgets(STDIN); switch ($nomor) { case 1: echo 'Senin'; break; case 2: echo 'Selasa'; break; case 3: echo 'Rabu'; break; case 4: echo 'Kamis'; break; case 5: echo 'Jumat'; break; case 6: echo 'Sabtu'; break; case 7: echo 'Minggu'; break; default: echo 'Nomor hari hanya dari 1 sampai 7'; } ?>
33
Soal 12:
Persamaan Kuadrat
Buat program untuk mencari penyelesaian persamaan kuadrat berikut: ax 2 bx c 0 , dengan nilai koefisien a, b dan c diinputkan Petunjuk: Gunakan “rumus abc” berikut: b D x1, 2 dimana D b 2 4ac (Diskriminan) 2a Untuk akar kuadrat (√) gunakan perintah sqrt (square root) Penjelasan: Soal ini sebenarnya tidak cocok buat orang yang ga suka pelajaran Matematika, apalagi buat yang tidak banyak mendapatkan pelajaran tersebut waktu sekolah. Bagi sebagian orang istilah persamaan kuadrat mungkin sangatlah asing. Sekilas saja, persamaan kuadrat adalah suatu persamaan polinomial (apa lagi ini??) dengan derajat (pangkat) tertingginya adalah 2 (dua) atau sering disebut berorde dua. Sekedar tambahan pengetahuan, polinomial orde satu dinamakan persamaan linier (linear). Bentuk umum dari persamaan kuadrat adalah: ax 2 bx c 0 , dengan a ≠ 0
Huruf-huruf a, b dan c dalam persamaan tersebut dinamakan sebagai koefisien. Koefisien a dinamakan sebagai koefisien kuadrat, b dinamakan sebagai koefisien linier dan c dinamakan koefisien konstan atau disebut juga suku bebas. Untuk menjadi suatu persamaan kuadrat, nilai a harus tidak sama dengan nol, karena jika a bernilai nol maka persamaan tersebut menjadi persamaan linier. Beberapa contoh persamaan kuadrat adalah: Persamaan x 2x 1 0 2 x 2 16 x 0 3x 2 4 x 9 0 5x 2 4 0 10 x 2 0 2
Nilai a 1 2 -3 5 10
Nilai b 2 -16 4 0 0
Nilai c 1 0 9 -4 0
Nah, penyelesaian dari persamaan kuadrat adalah berupa nilai-nilai yang mungkin untuk variabel x sedemikian sehingga persamaan tersebut bernilai benar. Artinya jika nilai penyelesaian menggantikan setiap variabel x pada persamaan tersebut maka ekspresi yang di sebelah (ruas) kiri tanda = (sama dengan) akan bernilai sama dengan nilai yang ada di sebelah (ruas) kanan, yaitu nol.
34
Contohnya gini lho, misalkan ada persamaan kuadrat berikut: x 2 2 x 1 0 , jika beberapa nilai kita cobakan sebagai nilai x sbb: Nilai x
Proses
Kesimpulan
x 2x 1 0 2
2 2 2.2 1 0 4 4 1 0
2
Bukan Penyelesaian
1 0 x 2x 1 0 2
12 2.1 1 0 1 2 1 0
1
Penyelesaian
00
Dari hitung-hitungan di atas (kolom Proses) dapat dilihat bahwa nilai 2 jika dimasukkan sebagai nilai x hasilnya tidak cocok, sehingga nilai 2 bukanlah penyelesaian dari persamaan di atas. Sedangkan nilai 1 ternyata cocok jika dimasukkan sebagai nilai x, sehingga nilai 2 adalah penyelesaian dari persamaan tersebut. Sebuah persamaan kuadrat maksimal memiliki dua buah penyelesaian. Dilihat dari banyak penyelesaiannya, persamaan kuadrat dibedakan menjadi tiga kasus, yaitu: 1. tidak memiliki penyelesaian, artinya tidak ada satupun bilangan nyata yang cocok sebagai nilai x. 2. hanya memiliki satu penyelesaian. 3. memiliki dua buah penyelesaian. Untuk selanjutnya dapat dianggap setiap persamaan kuadrat memiliki dua buah penyelesaian, yaitu x1 dan x2, hanya saja nilai penyelesaian tersebut bisa berupa bilangan imajiner (kasus pertama) atau bisa juga keduanya sama nilainya (kasus kedua). Nilai x1 dan x2 tersebut dapat dicari menggunakan “rumus abc” berikut:
x1
b b 2 4ac 2a
dan x 2
b b 2 4ac 2a
dimana nilai b 2 4ac sering disebut Diskriminan atau disingkat D. Dengan melihat rumus di atas maka dapat diambil kesimpulan bahwa: 1. Nilai a tidak boleh sama dengan nol karena jika nol maka akan terjadi pembagian dengan nol 2. Jika nilai Diskriminan negatif (kurang dari nol) maka nilai x1 dan x2 berupa bilangan imajiner karena akar kuadrat dari bilangan negatif adalah bilangan imajiner, sehingga persamaan tidak memiliki penyelesaian bilangan nyata 3. Jika nilai Diskriminan sama dengan nol maka nilai x1 dan x2 sama, sehingga dapat dianggap hanya ada satu penyelesaian 4. Jika nilai Diskriminan lebih besar dari nol maka nilai x1 dan x2 berbeda, sehingga terdapat dua penyelesaian
35
Demikian tentang persamaan kuadrat. Sekarang kembali ke persoalan. Berikut ini langkah-langkah penyelesaian soal di atas: 1. Output yang akan dihasilkan adalah penyelesaian persamaan kuadrat, yang direpresentasikan dengan lambang x1 dan x2 2. Untuk mencari output tersebut diperlukan persamaan kuadratnya, yang diwakili oleh koefisien a, b dan c, dan untuk tahu ada tidaknya output diperlukan nilai diskriminan 3. Nilai koefisien a, b dan c tidak disebutkan dalam soal, sedangkan nilai diskriminan dapat dicari dari ketiga nilai koefisien tersebut 4. Nilai koefisien a, b dan c harus diinputkan, diskriminan tidak 5. Rumus pencarian menggunakan “rumus abc” seperti tertera di soal 6. Variabel yang terlibat adalah penyelesaian x1 dan x2, koefisien a, b dan c serta diskriminan Untuk nama variabel supaya singkat saya gunakan nama x1 dan x2 untuk nilai penyelesaian, nama a, b dan c untuk koefisien dan D untuk diskriminan. Sekali lagi tahapan dalam program seperti biasa adalah INPUT, PROSES dan OUTPUT. Bagian INPUT-nya adalah berupa input untuk ketiga koefisien, sbb: $a = fgets(STDIN); $b = fgets(STDIN); $c = fgets(STDIN); Setelah melakukan input kemudian masuk ke dalam PROSES, yang terdiri dari menghitung besarnya diskriminan dan kedua penyelesaian. Untuk menghitung diskriminan kodenya adalah: $D = $b * $b – 4 * $a * $c; Sedangkan untuk menghitung kedua penyelesaian adalah: $x1 = (-$b + sqrt($D)) / (2 * $a); $x2 = (-$b - sqrt($D)) / (2 * $a); Setelah melakukan proses perhitungan dan ditemukan hasilnya maka masuk ke tahap OUTPUT, yaitu untuk menampilkan hasil pencarian kedua penyelesaian. Kode programnya adalah sbb: echo $x1; echo $x2; Sehingga jika digabungkan akan menjadi sbb: $a = fgets(STDIN); $b = fgets(STDIN);
36
$c = fgets(STDIN); $D = $b * $b – 4 * $a * $c; $x1 = (-$b + sqrt($D)) / (2 * $a); $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x1; echo $x2; Lebih lanjut, program di atas masih perlu dimodifikasi untuk mengantisipasi jika user memasukkan nilai nol untuk koefisien a. Seperti yang telah disebutkan, sebagai persamaan kuadrat maka koefisien kuadrat a tidak boleh bernilai nol. Sehingga jika user memasukkan nilai nol untuk a, maka tidak perlu melakukan proses perhitungan maupun output. Dengan kata lain proses perhitungan dan output hanya akan dilakukan jika nilai a tidak sama dengan nol. Berikut kode programnya: if ($a != 0) { $D = $b * $b – 4 * $a * $c; $x1 = (-$b + sqrt($D)) / (2 * $a); $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x1; echo $x2; } Selainnya itu, jika user memasukkan nol untuk nilai a maka perlu diberi peringatan supaya dia tahu kalau melakukan kesalahan. Dengan demikian potongan kode program di atas perlu ditambah kode berikut: else echo ' Koefisien a tidak boleh nol'; Setelah menghitung dan mendapatkan nilai diskriminan, perlu diingat juga bahwa proses selanjutnya dan penulisan output hanya akan dilakukan jika diskriminan tidak negatif. Dengan kata lain proses perhitungan x1 dan x2 hanya akan dilakukan jika nilai diskriminan D nilainya nol ke atas. Jika diimplementasikan ke kode program maka bentuk di atas akan menjadi konstruksi nested if sbb: if ($a != 0) { $D = $b * $b – 4 * $a * $c; if ($D >= 0) { $x1 = (-$b + sqrt($D)) / (2 * $a); $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x1; echo $x2; } else echo ' Tidak memiliki penyelesaian'; } else echo ' Koefisien a tidak boleh nol'; Ingat bahwa bentuk proses dan output yang lebih dari satu dan berurutan seperti potongan kode berikut (proses, proses, output, output):
37
$x1 = (-$b + sqrt($D)) / (2 * $a); $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x1; echo $x2; Asalkan proses-proses yang di bawah tidak tergantung pada proses-proses yang ada di atasnya, maka bentuk tersebut dapat diubah menjadi bentuk berikut (proses, output, proses, output): $x1 = (-$b + sqrt($D)) / (2 * $a); echo $x1; $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x2; Sehingga konstruksi nested if di atas dapat diubah menjadi sbb: if ($a != 0) { $D = $b * $b – 4 * $a * $c; if ($D >= 0) { $x1 = (-$b + sqrt($D)) / (2 * $a); echo $x1; $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x2; } else echo ' Tidak memiliki penyelesaian'; } else echo ' Koefisien a tidak boleh nol'; Nah, jika sudah pada bentuk ini maka analisa lanjut dapat kita lakukan. Seperti yang sudah dijelaskan di atas, penyelesaian akan berjumlah dua hanya jika nilai diskriminan lebih besar dari nol. Jika nilai diskriminan sama dengan nol maka kedua penyelesaian akan bernilai sama atau dapat dianggap hanya ada satu penyelesaian saja. Artinya jika diskriminan sama dengan nol maka cukup menghitung x1 saja dan tidak usah menghitung x2. Dengan kalimat lain, nilai x2 hanya akan dihitung dan ditampilkan jika nilai diskriminan D lebih besar dari nol. Kodenya adalah sebagai berikut: if ($D > 0) { $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x2; } Sehingga bentuk konstruksi nested if di atas akan menjadi satu tingkat lebih dalam lagi dan hasilnya adalah: if ($a != 0) { $D = $b * $b – 4 * $a * $c; if ($D >= 0) { $x1 = (-$b + sqrt($D)) / (2 * $a); echo $x1; 38
if ($D > 0) { $x2 = (-$b - sqrt($D)) / (2 * $a); echo $x2; } } else echo ' Tidak memiliki penyelesaian'; } else echo ' Koefisien a tidak boleh nol'; Selengkapnya dapat dilihat pada jawaban di bawah ini.
Jawab: PENYELESAIAN PERSAMAAN KUADRAT ============================== echo 'Masukkan nilai a : '; $a = fgets(STDIN); echo 'Masukkan nilai b : '; $b = fgets(STDIN); echo 'Masukkan nilai c : '; $c = fgets(STDIN); if ($a != 0) { $D = $b * $b – 4 * $a * $c; if ($D >= 0) { $x1 = (-$b + sqrt($D)) / (2 * $a); echo "Nilai x1 : ", $x1, "\n"; if ($D > 0) { $x2 = (-$b - sqrt($D)) / (2 * $a); echo "Nilai x2 : ", $x2; } } else echo 'Tidak memiliki penyelesaian'; } else echo 'Koefisien a tidak boleh nol'; ?>
39
Soal 13:
Konversi Suhu
Buat program untuk melakukan konversi suhu dari Celcius ke Kelvin, Fahrenheit, Reaumur, Newton dan Delisle sekaligus Rumusnya: o
K o C 273,15
o
F C 1,8 32
o
R o C 0,8
o
33 100 o D (100 o C ) 1,5
o
N oC
Penjelasan: Ini soal yang sederhana, lebih sederhana dari soal sebelumnya. Jika ada yang bilang kalo soal ini susah karena ga pernah belajar soal IPA atau tentang suhu, itu cuman alasan yang dibuat-buat aja. Rumusnya kan dituliskan di soal. Jadi untuk bikin programnya orang ga perlu tahu secara detail apa itu Celcius, apa itu Kelvin, dll. Yang perlu diketahui hanyalah cara bikin programnya saja. Jawaban soal di atas memang proses dan outputnya banyak banget. Namun demikian inputnya cuman satu. Berikut ini langkah-langkah penyelesaiannya: 1. Output yang akan dihasilkan adalah suhu dalam satuan Kelvin, Fahrenheit, Reaumur, Newton dan Delisle 2. Sesuai dengan soal, yang dibutuhkan hanyalah nilai suhu dalam satuan Celcius 3. Nilai suhu Celcius belum tertera di soal 4. Jadi suhu Celcius harus diinputkan 5. Rumusnya sudah ada di soal 6. Variabel yang terlibat adalah suhu Celcius, suhu Kelvin, suhu Fahrenheit, suhu Reaumur, suhu Newton dan suhu Delisle Untuk menyingkat, nama variabelnya adalah C, K, F, R, N dan D diambil dari huruf awal satuan yang dipakai. Untuk input dan output tidak perlu saya terangkan dengan detail. Hanya saja untuk output, user interface menjadi sangat penting supaya user tahu bilangan-bilangan yang bermunculan di layar itu maksudnya apa dan dapat membedakan mana yang output Kelvin, mana yang output Fahrenheit, dan mana output yang lainnya. Untuk proses, berikut tabel yang berisi rumus dan padanannya dalam PHP: Rumus Matematis o
K o C 273,15
o
F o C 1,8 32
R o C 0,8 33 o N oC 100 o D (100 o C ) 1,5
o
Bahasa PHP $K = $C + 273.15; $F = $C * 1.8 + 32; $F = 1.8 * $C + 32; $R = $C * 0.8; $R = 0.8 * $C; $N = $C * 33 / 100;
$N = 0.33 * $C;
$D = (100 – $C) * 1.5;
40
Jawaban selengkapnya dapat dilihat di bawah.
Jawab: APLIKASI KONVERSI SUHU ======================
= = = = =
echo echo echo echo echo ?>
$C + $C * $C * $C * (100
273.15; 1.8 + 32; 0.8; 0.33; – $C) * 1.5;
"Suhu "Suhu "Suhu "Suhu "Suhu
Kelvin Fahrenheit Reaumur Newton Delisle
: : : : :
$K $F $R $N $D
Kelvin\n"; Fahrenheit\n"; Reaumur\n"; Newton\n"; Delisle\n";
41
Soal 14:
Konversi Suhu dengan Pilihan
Buat program untuk melakukan konversi suhu dari Celcius ke berbagai satuan yang tertera pada soal sebelumnya, tetapi hanya satu konversi saja yang dilakukan tergantung dari pilihan user Contoh tampilan output: Masukkan suhu (Celcius) : 100 Pilihan Konversi: [1] Kelvin [4] Newton [2] Fahrenheit [5] Delisle [3] Reaumur Pilihan Anda : 1 Hasil Konversi : 373.15
Penjelasan: Soal ini mirip dengan soal sebelumnya dalam hal banyaknya proses yang tertulis. Hanya saja jika pada soal sebelumnya semua proses dijalankan maka pada soal kali ini hanya ada satu saja yang dijalankan, tergantung dari pilihan yang diinput user. Karena hanya ada satu proses yang dijalankan maka cukup hanya satu output saja yang ditampilkan. Untuk itu daripada menggunakan banyak variabel seperti soal sebelumnya, soal ini outputnya cukup satu variabel saja, sebut saja variabel hasil. Untuk inputnya yang pada soal tadi menggunakan variabel C sekarang saya gunakan variabel asal, yang artinya suhu asal sebelum dikonversi. Selain itu kita butuh satu variabel lagi untuk menyimpan pilihan yang diinput oleh user, sebut saja variabel pilihan. Bagian input data terdiri dari input suhu asal yang akan dikonversi diikuti dengan input pilihan. Intinya untuk input data kode programnya adalah sbb: $asal = fgets(STDIN); $pilihan = fgets(STDIN); Untuk bagian proses boleh menggunakan konstruksi if bertingkat seperti berikut: if ($pilihan == 1) $hasil = $asal + 273.15; else if ($pilihan == 2) $hasil = $asal * 1.8 + 32; else if ($pilihan == 3) $hasil = $asal * 0.8; else if ($pilihan == 4) $hasil = $asal * 0.33; else if ($pilihan == 5) $hasil = (100 – $asal) * 1.5; atau dengan memakai konstruksi switch yang lebih singkat berikut:
42
switch case case case case case }
($pilihan) { 1: $hasil = $asal + 273.15; break; 2: $hasil = $asal * 1.8 + 32; break; 3: $hasil = $asal * 0.8; break; 4: $hasil = $asal * 0.33; break; 5: $hasil = (100 – $asal) * 1.5; break;
Program selengkapnya dapat dilihat pada jawaban di bawah.
Jawab: APLIKASI KONVERSI SUHU ====================== Pilihan Konversi: [1] Kelvin [2] Fahrenheit [3] Reaumur
[4] Newton [5] Delisle
($pilihan) { 1: $hasil = $asal + 273.15; break; 2: $hasil = $asal * 1.8 + 32; break; 3: $hasil = $asal * 0.8; break; 4: $hasil = $asal * 0.33; break; 5: $hasil = (100 – $asal) * 1.5; break;
echo "Hasil Konversi : $hasil"; ?>
43
Soal 15:
Jumlah N Bilangan Pertama
Buat program untuk melakukan penjumlahan N bilangan pertama Penjelasan: Ini adalah soal pertama dalam kumpulan soal jawab ini yang jawabannya menuntut penggunaan konstruksi perulangan. Menuntut disini artinya harus menggunakan alias wajib, tidak mungkin tidak. Penjelasan kali ini akan membahas mengapa konstruksi perulangan diperlukan. Sebelum membahas bagaimana menjumlahkan N bilangan pertama, kita ambil contoh sederhana saja dengan mengambil sebuah nilai sederhana untuk N, misalkan 3. Tanpa menggunakan perulangan, untuk menjumlahkan 3 bilangan pertama dalam pemrograman PHP setidaknya ada empat cara yang cara satunya adalah pengembangan dari cara sebelumnya, yaitu: 1. Seluruh proses penjumlahan langsung dilakukan dalam satu baris program $hasil = 1 + 2 + 3; 2. Setiap nilai pada cara pertama dijumlahkan satu persatu dan secara langsung menyebut nilai yang akan dijumlahkan pada setiap penjumlahan $hasil $hasil $hasil $hasil
= = = =
0; $hasil + 1; $hasil + 2; $hasil + 3;
3. Setiap nilai pada cara kedua di atas dimasukkan terlebih dahulu ke dalam variabel bantu, lalu variabel bantu tersebutlah yang dijumlahkan $hasil = 0; $bilangan = 1; $hasil = $hasil + $bilangan; $bilangan = 2; $hasil = $hasil + $bilangan; $bilangan = 3; $hasil = $hasil + $bilangan; 4. Mirip dengan cara ketiga hanya saja pemberian nilai pada variabel bantunya dengan melihat hubungan dengan nilai sebelumnya $hasil = 0; $bilangan = 0; $bilangan = $bilangan + 1; $hasil = $hasil + $bilangan;
44
$bilangan = $bilangan + 1; $hasil = $hasil + $bilangan; $bilangan = $bilangan + 1; $hasil = $hasil + $bilangan; Syarat dari cara-cara di atas adalah bahwa nilai N-nya harus diketahui terlebih dahulu, supaya kita tahu kapan harus berhenti menuliskan bilangan-bilangan yang dijumlahkan. Cara tersebut tidak mungkin digunakan untuk mencari penjumlahan N bilangan pertama jika nilai N-nya belum diketahui. Terlebih lagi untuk suatu nilai N yang besar cara-cara di atas menjadi tidak efisien. Bayangkan jika nilai N adalah 1000, maka kita harus menuliskan kurang lebih seribu kali lebih panjang dari setiap potongan kode program di atas. Untuk nilai N yang belum diketahui dari awal, cocoknya ya hanya dengan konstruksi perulangan. Dari keempat contoh yang telah disebutkan tadi, hanya cara keempat atau yang terakhir saja yang dapat dibentuk ke dalam konstruksi perulangan. Hal tersebut dikarenakan tidak adanya baris-baris berurutan yang sama penulisannya pada ketiga cara pertama. Berbeda dengan cara yang keempat, kita melihat disitu terdapat gabungan dua baris berurutan yang sama penulisannya alias diulang-ulang. Gabungan dua baris itu adalah: $bilangan = $bilangan + 1; $hasil = $hasil + $bilangan; Baris-baris yang diulang-ulang penulisannya itulah yang dapat ditulis ke dalam konstruksi perulangan, sbb: $hasil = 0; $bilangan = 0; for ($i = 1; $i <= $N; $i++) { $bilangan = $bilangan + 1; $hasil = $hasil + $bilangan; } atau kalau mau lebih disederhanakan lagi, dengan melihat bahwa variabel bilangan dan variabel i sebenarnya sama saja artinya, maka dapat ditulis menjadi: $hasil = 0; for ($bilangan = 1; $bilangan <= $N; $bilangan++) $hasil = $hasil + $bilangan; atau dalam PHP dapat memanfaatkan fungsi range dan konstruksi foreach sebagai berikut: $hasil = 0; foreach (range(1, $N) as $bilangan) $hasil = $hasil + $bilangan;
45
Tiga baris potongan kode program di ataslah yang menjadi bagian proses dalam program penjumlahan bilangan ini. Jawaban selengkapnya dapat dilihat di bawah penjelasan ini.
Jawab: PROGRAM PENJUMLAHAN N BILANGAN PERTAMA ======================================
atau PROGRAM PENJUMLAHAN N BILANGAN PERTAMA ======================================
atau PROGRAM PENJUMLAHAN N BILANGAN PERTAMA ======================================
46
Soal 16:
Jumlah N Bilangan Genap Pertama
Buat program untuk melakukan penjumlahan N bilangan genap pertama Penjelasan: Jawaban soal ini akan didasarkan pada jawaban soal sebelumnya. Jika diperhatikan, untuk menjumlahkan N bilangan pertama, dimulai dengan nilai nol yang kemudian dinaikkan satu satu sampai mencapai N. Setiap nilai yang akan dijumlahkan merupakan satu tingkat di atas nilai sebelumnya. Hal tersebut dapat dilihat pada ilustrasi di bawah ini: 0
1 +1
+ +1
2
+ +1
3
+ +1
4
+ +1
5
+ +1
6
+ +1
...
+ +1
N
Untuk penjumlahan N bilangan genap pertama ilustrasinya dapat dilihat di bawah ini: 0
2 +2
+ +2
4
+ +2
6
+ +2
8
+ +2
10
+ +2
12
+ +2
...
+ 2N +2
Dapat dilihat dari situ bahwa penjumlahan akan dimulai dengan bilangan nol yang kemudian ditambah dua dua hingga mencapai suatu nilai 2 kali N. Jadi setiap nilai yang dijumlahkan adalah dua tingkat dari nilai sebelumnya. Dengan melihat hal tersebut maka potongan kode untuk menjumlahkan N bilangan pertama yang telah dibahas pada soal sebelumnya dapat dimodifikasi sehingga menjadi penjumlahan N bilangan genap pertama, sbb: $hasil = 0; $bilangan = 0; for ($i = 1; $i <= $N; $i++) { $bilangan = $bilangan + 2; $hasil = $hasil + $bilangan; } Perhatikan bagian yang diberi garis bawah di atas. Jika pada soal sebelumnya ditambahkan dengan satu, maka pada kode di atas bilangan ditambahkan dengan dua. Juga dengan memperhatikan rumus untuk mencari bilangan genap ke-i, yaitu: genapi 2i , maka dapat juga kita tulis menjadi: $hasil = 0; for ($bilangan = 1; $bilangan <= $N; $bilangan++) $hasil = $hasil + 2 * $bilangan; Pada kode yang digarisbawahi di atas dapat dilihat bahwa yang ditambahkan bukan sekedar bilangan saja tapi dua kali bilangan tersebut. Variabel bilangan disini mewakili i pada rumus bilangan genap di atas.
47
Jawaban selengkapnya dapat dilihat di bawah penjelasan ini.
Jawab: PROGRAM PENJUMLAHAN N BIL GENAP PERTAMA =======================================
atau PROGRAM PENJUMLAHAN N BIL GENAP PERTAMA =======================================
48
Soal 17:
Jumlah N Bilangan Ganjil Pertama
Buat program untuk melakukan penjumlahan N bilangan ganjil pertama Penjelasan: Seperti halnya bilangan genap, bilangan ganjil urut yang satu dengan yang lainnya memiliki jeda dua nilai. Hanya saja jika penjumlahan bilangan genap diinisialisasi dari angka nol maka bilangan ganjil yang satu tingkat di bawah bilangan genap dimulai dari satu tingkat di bawah nol yaitu -1. Kodenya ditulis sbb: $hasil = 0; $bilangan = -1; for ($i = 1; $i <= $N; $i++) { $bilangan = $bilangan + 2; $hasil = $hasil + $bilangan; } Atau dengan memperhatikan rumus untuk mencari bilangan ganjil ke-i, yaitu: ganjil i 2i 1 maka dapat ditulis juga menjadi: $hasil = 0; for ($bilangan = 1; $bilangan <= $N; $bilangan++) $hasil = $hasil + 2 * $bilangan - 1; Rumus bilangan ganjil di atas dapat dicari dengan cara berikut: Pertama kita misalkan bahwa ganjil i ai b Kita tahu bahwa bilangan ganjil pertama adalah 1, sehingga kalau disubstitusikan ke persamaan di atas menghasilkan: ganjil 1 ai b
ai b ganjil i a.1 b 1 a b 1
a 1 b persamaan 1
Bilangan ganjil kedua adalah bilangan 3, jika disubstitusikan menghasilkan: ganjil i ai b
ai b ganjil i
2a b 3 persamaan 2
Jika persamaan 1 disubstitusikan ke persamaan 2 akan menjadi:
49
2a b 3
21 b b 3 2 2b b 3
a 1 b
2b b 3 2 b 1
b 1
Sampai disini kita sudah mendapatkan nilai b, sehingga jika disubstitusikan ke persamaan 1 akan ditemukan sbb:
a 1 b b 1 a 1 1 a 11 a2 Sehingga jika disubstitusikan ke persamaan ganjil i ai b maka akan menjadi: ganjil i 2i 1 atau ganjil i 2i 1
Jawab: PROGRAM PENJUMLAHAN N BIL GANJIL PERTAMA =======================================
atau PROGRAM PENJUMLAHAN N BIL GANJIL PERTAMA =======================================
50
Soal 18:
Jumlah Bilangan Genap dari 1 Sampai N
Buat program untuk melakukan penjumlahan semua bilangan genap dari 1 hingga suatu nilai N tertentu Penjelasan: Penjelasan jawaban soal ini juga saya dasarkan pada soal penjumlahan N bilangan pertama yang sudah saya jelaskan sebelumnya. Untuk menjumlahkan bilangan genap dari 1 sampai N tinggal mengecek satu persatu setiap bilangan dari 1 sampai N, jika bilangan tersebut genap maka ditambahkan, jika tidak genap biarkan saja. Untuk mengecek bilangan tersebut genap atau bukan gunakan konstruksi if dengan kondisi yang dicek adalah: ($bilangan % 2 == 0). Hal ini didasarkan pada kenyataan bahwa bilangan genap adalah bilangan-bilangan kelipatan 2, yang artinya habis dibagi dengan 2. Untuk mencari sisa hasil bagi dalam PHP digunakan operator % (yang artinya modulus). Istilah habis dibagi artinya jika dibagi sisanya nol. Jika tidak habis dibagi maka sisanya pasti selain nol. Berikut ini beberapa daftar pengecekan kondisi dari suatu bilangan yang melibatkan operator % beserta kode programnya: Kondisi Bilangan genap Bilangan ganjil Bilangan kelipatan N Bilangan bukan kelipatan N Bilangan faktor dari N Bilangan bukan faktor dari N
Kode Bahasa PHP $bilangan % 2 == 0 $bilangan % 2 != 0 $bilangan % $N == 0 $bilangan % $N != 0 $N % $bilangan == 0 $N % $bilangan != 0
$bilangan % 2 == 1
Kode program yang berbunyi “jumlahkan bilangan ini jika bilangan ini adalah bilangan genap” adalah: for ($bilangan = 1; $bilangan <= $N; $bilangan++) { if ($bilangan % 2 == 0) { $hasil = $hasil + $bilangan; } } Karena dalam konstruksi if di atas hanya ada satu statement saja maka tanda kurung kurawal dapat dihilangkan menjadi: for ($bilangan = 1; $bilangan <= $N; $bilangan++) { if ($bilangan % 2 == 0) $hasil = $hasil + $bilangan; }
51
Penulisan di atas sebenarnya sudah baik dan banyak direkomendasikan. Hanya saja ada yang lebih suka menulisnya jadi lebih singkat lagi. Perlu Anda tahu, baris berikut: if ($bilangan % 2 == 0) $hasil = $hasil + $bilangan; tidak dianggap sebagai dua statement, melainkan satu statement. Bahkan seandainya saja ada baris-baris berbentuk sbb: if (kondisi) { statement1; statement2; statement3; statement4; statement5; ... } Pada bentuk di atas, dari kata if sampai kurung kurawal terakhir tetap dianggap sebagai satu statement. Inilah yang disebut sebagai Compound Statement, yang merupakan kebalikan dari Simple Statement. Simple Statement adalah statement yang terdiri hanya dari satu statement sederhana. Sedangkan Compound Statement adalah suatu statement yang merupakan gabungan dari satu atau lebih Simple Statement yang “dibungkus” dalam suatu konstruksi pemrograman semisal konstruksi pemilihan kondisi atau percabangan atau perulangan. Melihat itu maka kembali ke potongan kode yang di atas, kode tersebut masih dapat disingkat lagi menjadi: for ($bilangan = 1; $bilangan <= $N; $bilangan++) if ($bilangan % 2 == 0) $hasil = $hasil + $bilangan; Jawaban selengkapnya dapat dilihat di bawah penjelasan ini.
Jawab: PROGRAM PENJUMLAHAN BIL GENAP SAJA ==================================
52
Soal 19:
Bilangan Kelipatan 3 dari 1 Sampai N
Buat program untuk menampilkan semua bilangan kelipatan 3 dari 1 hingga suatu nilai N tertentu Penjelasan: Soal ini masih mirip dengan soal sebelumnya hanya kondisinya saja yang diubah. Seperti sudah dibahas pada soal sebelumnya, untuk mengecek apakah suatu bilangan kelipatan dari N adalah dengan memakai kondisi ($bilangan % $N == 0). Untuk kelipatan 3 berarti kondisinya adalah ($bilangan % 3 == 0). Soal ini juga tidak menyebutkan adanya penjumlahan. Yang diinginkan dari soal ini hanyalah menampilkan semua bilangan kelipatan 3 saja, tidak menjumlahkan. Oleh karena itu semua kode program yang berhubungan dengan penjumlahan harus dihilangkan atau diganti. Kita lihat lagi jawaban dari soal sebelumnya (menjumlahkan bilangan genap dari 1 sampai N), yang inti programnya adalah: Pertama, karena pada soal kali ini tidak ada hasil penjumlahan maka variabel hasil dihilangkan saja dan semua kode program yang mengandung variabel hasil juga dihilangkan. Proses penjumlahan sendiri (baris yang berisi kode: $hasil = $hasil + $bilangan;) harus diganti menjadi kode untuk menampilkan atau menuliskan bilangannya, menggunakan perintah echo atau print. Sehingga dengan memodifikasi jawaban soal sebelumnya itu maka kira-kira akan menjadi sebagai berikut: Hanya saja kalau untuk menuliskan bilangannya hanya menggunakan kode echo $bilangan maka outputnya nanti akan menajdi tidak jelas, karena satu bilangan
53
dengan bilangan selanjutnya akan saling menempel. Misalnya jika N = 20, maka output yang muncul adalah: 369121518 Melihat itu maka perlu diberikan pemisah di antara setiap bilangan yang muncul tersebut sehingga menjadi lebih jelas. Pemisah itu biasanya dalam bentuk spasi. Alternatif pertama adalah dengan menambahkan karakter spasi di depan atau belakang bilangan yang akan kita tulis. Kodenya adalah: echo " $bilangan"; atau echo "$bilangan "; Alternatif yang lainnya adalah menggunakan karakter tab yang dilambangkan dengan karakter escape \t. Kodenya adalah: echo "\t$bilangan"; atau echo "$bilangan\t"; Jawaban selengkapnya dapat dilihat di bawah penjelasan ini.
Jawab: PROGRAM BILANGAN KELIPATAN TIGA ===============================
54
Soal 20:
Faktor dari Suatu Bilangan
Buat program untuk menampilkan semua faktor dari suatu bilangan yang diinput Petunjuk: Faktor dari suatu bilangan N adalah semua bilangan yang habis membagi N Penjelasan: Jawaban soal ini merupakan modifikasi dari jawaban soal sebelumnya, yaitu dengan mengganti kondisi pengecekan, yang tadinya adalah: if ($bilangan % 3 == 0) menjadi if ($N % $bilangan == 0) Yang artinya jika N habis dibagi dengan bilangan maka bilangan tersebut adalah faktor dari N. Atau jika variabel bilangan diubah namanya menjadi faktor dan variabel N diubah namanya menjadi bilangan, maka menjadi: if ($bilangan % $faktor == 0)
Jawab: PROGRAM MENAMPILKAN FAKTOR ==========================
55
Soal 21:
Banyaknya Faktor dari Suatu Bilangan
Buat program untuk menampilkan banyaknya faktor dari suatu bilangan yang diinput Penjelasan: Soal ini juga hanya modifikasi sedikit dari soal sebelumnya. Jika pada soal sebelumnya hanya disuruh menampilkan faktor dari bilangan N, maka pada soal ini menghitung jumlah faktornya. Jadi kode untuk menampilkan diganti untuk menghitung atau mencari banyaknya. Untuk mencari banyaknya faktor sebelum mengecek setiap bilangan maka perlu diinisialisasi dulu, dengan kode: $banyak = 0; Yang artinya karena belum menemukan faktor, maka banyaknya masih nol atau belum ada faktor. Nantinya begitu proses pengecekan tiap bilangan dilakukan, setiap menemukan satu faktor maka nilai variabel banyak ini akan kita naikkan satu. Jadi kode untuk menampilkan faktor pada jawaban soal sebelumnya diganti dengan kode: $banyak++; Selengkapnya bisa dilihat pada jawaban di atas penjelasan ini.
Jawab: PROGRAM MENGHITUNG BANYAKNYA FAKTOR ===================================
56
Soal 22:
Bilangan Prima atau Bukan
Buat program untuk menentukan apakah suatu bilangan yang diinput termasuk bilangan prima ataukah bukan Catatan: Bilangan prima adalah bilangan yang faktornya hanya dua Penjelasan: Soal ini juga masih merupakan modifikasi dari soal sebelumnya. Anda perhatikan bahwa jawaban soal ini masih saya ambil dari jawaban soal sebelumnya. Perintah untuk menuliskan banyaknya faktor pada soal sebelumnya, pada soal ini diganti menjadi pengecekan berapa banyaknya faktor dan menentukan prima atau bukan. Jika banyaknya faktor dua maka bilangan tersebut adalah bilangan prima, selain itu bukan bilangan prima. Kodenya adalah: if ($banyak == 2) echo "$bilangan adalah bilangan prima"; else echo "$bilangan bukan bilangan prima"; Selebihnya dapat dilihat pada jawaban di bawah ini.
Jawab: PROGRAM CEK PRIMA ATAU BUKAN ============================
57
Soal 23:
Bilangan Prima dari 1 Sampai N
Buat program untuk menampilkan semua bilangan prima dari 1 sampai N Penjelasan: Dengan langkah-langkah deskriptif, algoritma untuk memecahkan soal ini adalah sbb: 1. Lakukan pengecekan setiap bilangan dari 1 sampai N 2. Untuk setiap bilangan tersebut, periksalah apakah termasuk bilangan prima atau bukan, caranya adalah: a. Hitung berapa banyaknya faktor yang dimiliki bilangan itu b. Jika banyaknya faktor dua maka tulis bilangan itu, jika tidak lewati Langkah 1. jika ditulis ke dalam kode program bentuknya adalah sbb: for (range(1, $N) as $bilangan) { } Kode program yang untuk langkah 2.a. adalah sbb: $banyak = 0; foreach(range(1, $bilangan) as $faktor) if ($bilangan % $faktor == 0) $banyak++; Sedangkan untuk langkah 2.b. kodenya ditulis setelah kode di atas dan bentuknya sbb: if ($banyak == 2) then echo "$bilangan "; Jika ketiga kode program di atas digabung menjadi satu maka hasilnya adalah: for (range(1, $N) as $bilangan) { $banyak = 0; foreach(range(1, $bilangan) as $faktor) if ($bilangan % $faktor == 0) $banyak++; if ($banyak == 2) then echo "$bilangan "; } Dalam kode di atas Anda dapat jumpai bentuk perulangan foreach (yang menggunakan iterator faktor) yang ada di dalam bentuk perulangan foreach lainnya (yang memakai iterator bilangan). Bentuk perulangan di dalam perulangan seperti ini disebut sebagai konstruksi Nested Loop atau Perulangan Bersarang.
58
Nested Loop merupakan suatu konstruksi yang akan sering Anda jumpai dalam dunia programming. Dalam kode di atas, terjadi perulangan untuk mengecek setiap bilangan dan di dalamnya ada juga perulangan untuk mencari banyaknya faktor. Untuk lebih lengkapnya jawaban dapat dilihat setelah penjelasan ini.
Jawab: BILANGAN PRIMA DARI 1 SAMPAI N ==============================
59