RPG Fantasy Web Indonesia Forum

Kingdom Services => Level-Up Training Lot => Topik dimulai oleh: Èxsharaèn pada 04 November 2006, 08:41:59

Judul: Buat program yuk!
Ditulis oleh: Èxsharaèn pada 04 November 2006, 08:41:59
Versi sebelumnya acak-acakan karena aku belum menemukan konsep yang pas, maka untuk versi kali ini aku buat sesimpel mungkin, jika perlu dengan gambar supaya memudahkan.

Juga, kali ini aku hanya akan memakai satu bahasa saja, yaitu C++. Ini terpaksa dilakukan mengingat bahasa lainnya (VB, Ruby, Java, dan PHP) membutuhkan pengetahuan ekstra tentang pemrograman berorientasi objek (object-oriented programming, biasa disingkat OOP), yang sebaiknya dipelajari bertahap setelah kita mantap pada konsep pemrograman. Jadi, yang ingin belajar bahasa lain, atau yang mengeluh kenapa hasil program dalam topik ini masih berbasis konsol (DOS), sabar dulu yaa...

Perlahan-lahan aku akan post kembali semua topik yang pernah diulas di forum lama, mungkin dengan bahasa yang lebih ringan, supaya yang baru bergabung di sini tidak ketinggalan.

Ditungguh yah!
Judul: Re: Buat program yuk!
Ditulis oleh: Èxsharaèn pada 03 Maret 2007, 10:46:43
Dengan berbagai pertimbangan, bahasa di topik ini aku ubah ke Ruby. Kenapa pakai Ruby? Ruby relatif lebih mudah dipelajari ketimbang C++ dan lisensinya GPL alias gratis, jadi kita nggak usah merasa berdosa memakai program bajakan.

Sebelum itu, ada baiknya kita mengenal dulu apa itu Ruby.

Ruby diciptakan di Jepang oleh seorang profesor (maaf lupa namanya) yang merasa kurang puas akan bahasa pemrograman yang sudah ada saat itu. Saat Ruby lahir, ia semata-mata hanya untuk memenuhi projek kuliah saja, namun dibantu ketidakpuasan sang profesor, bahasa ini berkembang. Dulu tidak terlalu populer dibandingkan C, Perl, Phyton, dan bahasa lainnya, namun sekarang bahasa ini mulai diminati karena kemudahannya. Karena itulah aku memutuskan menggunakan bahasa Ruby sepanjang artikel ini, sekaligus memperkenalkannya di Indonesia.

Ruby diklaim 100% berbasis objek (tentang apa ini lihat artikel lain berjudul Pemrograman Berbasis Objek, segera ditulis) dan mungkin hal ini benar. Kita tidak akan pusing-pusing dulu tentang kenyataan ini, yang penting kita familiar dulu dengan logika pemrograman. Setelah paham logikanya, dijamin kalian akan cepat mempelajari bahasa baru.

Ruby versi terbaru adalah versi 1.8.5, bisa didapatkan di http://www.ruby-lang.org (atau kalau ada yang beli PCMedia edisi 03/2007, instalernya ada di DVD-nya; AWAS! Berukuran besar, 27 MB). Silakan dapatkan dan instal. Kalau mau, kalian bisa mencoba bahasa Ruby langsung di perambah pada alamat di atas.

Karena kita hanya akan belajar logika pemrograman saja, kita tidak akan membahas lebih lanjut tentang cara membuat program di Ruby. Untuk ini, kita bisa menggunakan FreeRIDE yang sudah disertakan dalam paket instalasi. (FreeRIDE serupa dengan Visual C++, Turbo Pascal, dsb.)

Sudah siap?
Judul: Re: Buat program yuk!
Ditulis oleh: Èxsharaèn pada 03 Maret 2007, 11:21:12
Untuk membuka FreeRIDE, pilih Start Menu > All Programs > Ruby-<nomor versi> > FreeRIDE. Pada awalnya, sebuah jendela konsol (DOS) akan terbuka dan banyak muncul warning, namun abaikan saja. Jendela baru akan terbuka.

Untuk membuat sebuah program, kita sebaiknya membuat sebuah projek. Namun, untuk saat ini, kita tidak perlu membuat sebuah projek. Cukup buat sebuah berkas baru dengan memilih menu File > New atau tekan saja Ctrl + N. Sebuah berkas baru bernama untitled1.rb akan terbuka.

Khusus pengguna Windows, ada sedikit pengaturan yang perlu dilakukan. Buka menu Edit > Preferences.... Cari bagian Debugger/Run, lalu beri tanda pada pilihan Run process in terminal. Ini supaya kita bisa menjalankan program kita. Jika perlu, beri tanda juga pada pilihan Save files before running/debug.... Klik OK.

OK, kita siap membuat program pertama kita!
Judul: Re: Buat program yuk!
Ditulis oleh: Èxsharaèn pada 03 Maret 2007, 11:26:18
Sesuai tradisi untuk pengenalan bahasa baru, kita akan mencetak kalimat "Hello World!". Untuk melakukan ini, ketikkan kode berikut.

p "Hello World!"

Langsung jalankan dengan menekan tombol roket (agak aneh tombolnya ;)). Coba lihat hasilnya.
Judul: Angka
Ditulis oleh: Èxsharaèn pada 24 Mei 2007, 10:52:43
Okay! Setelah lama vakum, aku coba lanjutkan tutorial ini.

Oh ya, ada cara lain untuk menulis program dalam Ruby. Kalau kalian malas menggunakan FreeRIDE, mungkin karena loading-nya lama, silakan gunakan Notepad! Atau, kalau ingin kode yang kalian tuliskan diformat dengan rapi, carilah Notepad++. Simpan progam kalian dengan format "namafile.rb" kalau menggunakan Notepad (awas! Jangan lupa .rb di akhir nama berkas lengkap dengan tanda petik gandanya). Untuk menjalankan, silakan buka Command Prompt, cari berkas program kalian tadi, dan ketikkan seperti berikut di Command Prompt:

C:\>ruby programku.rb

Silakan gunakan cara manapun yang kalian suka.

Kita coba yang simpel-simpel dulu yah...

Angka

Siapa sih yang nggak tahu angka? Angka sudah jadi makanan kita sehari-hari. Nah, dalam pemrograman, termasuk Ruby, angka bisa dibagi menjadi dua kategori besar:

Integer, yaitu bilangan bulat (positif maupun negatif). Contohnya, 12, 4, 0, -2, dan seterusnya.
Floating-point, atau cukup float saja, yaitu bilangan pecahan dalam bentuk desimal. Contohnya: 4.5, 24.53, -23.53, dan seterusnya.

Diingat dulu yah, kita akan menggunakan titik untuk menyatakan tanda desimal (sistem US) alih-alih koma. Jadi, kalau aku tulis 4.5, itu maksudnya 4,5 dalam bahasa Indonesia.

Nah, kita bebas mengoperasikan kedua jenis angka ini. Ayo mulai! Cobalah program berikut.

p 4 + 1
p 6 - 7
p 9.5 * 2.5
p 9 / 4


dan jalankan.

Bagaimana hasilnya?

Kenapa bisa begitu?

Simpel sekali, kita menggunakan perintah p (atau puts) untuk menampilkan hasil perhitungan kita. Jadi, bisa ditebak:
4 + 1 = 5
6 - 7 = -1
9.5 * 2.5 = 23.75

Tapi...
9 / 4 = 2

Lho? Bukannya 9 / 4 itu 2.25? Memang, di kebanyakan bahasa pemrograman, ada sebuah aturan demikian. Integer jika dioperasikan dengan integer, hasilnya akan tetap integer. Nah, 9 itu integer, dan 4 juga integer. Ketika kita menghitung 9 / 4, komputer tetap akan menghitung hasilnya sebagai 2.25, namun dibulatkan ke bawah karena integer adalah bilangan bulat. Coba saja hitung 11 / 4, seharusnya 2.75 namun Ruby akan menampilkan 2 alih-alih 3.

Apa yang terjadi kalau kita mengoperasikan integer dengan float (atau sebaliknya)? Ayo dicoba!

p 4.5 / 2
p 2 * 3.14

Hasilnya 2.25 dan 6.28. Berarti, integer dengan float akan selalu menghasilkan nilai float.

Yuk diulang! Integer dengan integer hasilnya pasti integer, integer dengan float (dan sebaliknya) hasilnya pasti float.

Lha, trus, gimana dong kalau andaikan kita ingin mengoperasikan integer dengan integer tapi hasilnya float? Mudah saja: ubah salah satu angka menjadi float. Misalnya seperti berikut:

p 9 / 4.0
p 9.0 / 4
p 9.0 / 4.0
p 9.to_f / 4

Semua variasi kode ini menghasilkan 2.25. Apa itu to_f? Ini adalah salah satu metode (method) untuk mengubah tipe data sebuah angka. Nanti kita akan bicara lebih banyak tentang method. Untuk sekarang, anggap ini perkenalan ke istilah baru yang akan sering kita jumpai nanti.

Mudah kan?
Judul: Huruf
Ditulis oleh: Èxsharaèn pada 24 Mei 2007, 11:20:20
Sebelum kita mulai mengacak-acak angka dengan perhitungan matematis (misalnya dalam persamaan linear), kita kenalan dulu dengan satu lagi tipe data yang cukup penting. Apa itu?

Huruf

Tidak ada yang spesial dengan huruf. Semuanya sudah tahu kan? Tapi, bagaimana di dunia pemrograman? Apa huruf diperlakukan secara spesial?

Jawabannya adalah ya.

Pada kebanyakan bahasa pemrograman, kumpulan huruf (termasuk tanda baca dan karakter lainnya) disebut string. Bukan benang lho... tapi bisa juga dianggap "untaian karakter". Ruby juga mengenal string.
Tapi, seperti apa sih string itu di Ruby? Nii contohnya...

'Aku adalah contoh string.'
'Ini juga string.'
'A'
''

String dalam Ruby biasa diapit dengan tanda kutip tunggal '. Boleh juga sih pakai tanda kutip ganda ". Lah, baris terakhir itu apa juga string? Yup, itu juga termasuk string, namun biasanya disebut empty string alias string kosong, karena memang tidak isinya.

Apa saja yang bisa kita lakukan dengan string? Niii...

Menampilkan string! Mudah saja, gunakan perintah p atau puts. Kita sudah melakukan ini di awal perkenalan kita dengan Ruby:

p 'Hello World!'

Menggabungkan dua atau lebih string! Menariknya, ini dilakukan dengan operasi "aritmatika", yaitu penjumlahan. Ayo kita coba saja:

p 'Aku ini' + ' seorang manusia'
Hasilnya adalah 'Aku ini seorang manusia'.

Mengulang string yang sama! Ini juga menarik, karena bisa dilakukan dengan operasi perkalian! Coba:

p 'Bosan! ' * 5
Hasilnya adalah 'Bosan! Bosan! Bosan! Bosan! Bosan! '.

Nah, hati-hati, angka juga bisa dijadikan string. Bedakan 12 dengan '12'. 12 pertama adalah angka 12, sementara 12 yang kedua adalah string atau teks "12". Hati-hati saat melakukan operasi yang melibatkan angka dan string. Misal:

p '12' + 12
Ini akan menyebabkan kesalahan TypeError: Can't convert Fixnum into String. Kenapa? Tidak ada perintah untuk menambahkan string dengan angka memang (dan nggak masuk akal kan?), jadi Ruby akan mengeluarkan pesan kesalahan tersebut.

Nah, ada satu lagi yang perlu diperhatikan saat bermain-main dengan string. Ingat kan kalau string diapit dengan tanda kutip tunggal? Bagiamana kalau aku mau menulis 'I wasn't there'? Seperti inikah?

p 'I wasn't there'
Silakan coba, dijamin error :D

Lha trus gimana dong? Untuk keperluan inilah kita mengenal escape character, yaitu karakter khusus yang berfungsi "meloloskan" karakter berikutnya agar tetap dianggap sebagai satu kesatuan dengan string kita. Jadi, kalimat tadi ditulis begini:

p 'I wasn\'t there'
p "I wasn't there"

Baris terakhir tidak akan bermasalah, karena kita mengapit string kita dengan tanda kutip ganda, sehingga tanda kutip tunggal yang ditemui di dalam string kita tidak akan mengganggu.

Ada beberapa escape character yang terkenal, misalnya \n untuk menandai baris baru. \\ akan menghasilkan \ sendirian. Silakan dicoba!

Okay, sekarang kita siap untuk pemrograman lebih lanjut!
Judul: Variabel
Ditulis oleh: Èxsharaèn pada 25 Mei 2007, 12:10:22
Nah, setelah mengenal dua tipe data yang paling penting, yaitu angka dan string, kita siap melakukan pemrograman sesungguhnya, yang melibatkan cukup banyak faktor. Jangan pusing dulu, ini tidak sesulit yang dibayangkan kok!

Anggap saja sekarang kita hendak membuat program untuk menghitung luas lingkaran (tahu semua yah? Luas lingkaran = 3.14 * jari-jari * jari-jari). Kita mungkin buat program seperti ini:

p 3.14 * 2 * 2
Tapi ini untuk lingkaran berjari-jari 2 saja. Bagaimana kalau aku ingin jari-jarinya 10? Atau terserah pengguna kita mau masukkan berapa saja? Nah, untuk itulah kita mengenal...

Variabel

Mudah saja, variabel di sini fungsinya sama persis seperti variabel yang kita kenal dalam persamaan matematika. Dalam pemrograman, variabel berfungsi menyimpan sementara sebuah nilai sampai diperlukan kembali.

Nah, untuk mengisi sebuah variabel, kita memerlukan persamaan atau assignment. Mudah sekali, ini diwakili dengan tanda sama dengan =.

Awas, variabel mempunyai tata nama sendiri. Ini berbeda untuk tiap bahasa pemrograman. Di Ruby, variabel selalu diawali dengan huruf kecil dan hanya boleh mengandung huruf dan angka. Contoh:

variabelku --> ini benar
variabel2ku --> ini benar
2variabel --> salah!!!
Variabel --> benar tapi bukan variabel!!!

Untuk kasus terakhir, kita bicarakan nanti.

Biasakan memberi nama variabel yang jelas. Misalnya, untuk menampung jari-jari, silakan beri nama jari, jari_jari (tanda - tidak diperbolehkan dalam nama variabel), radius, dan sebagainya. Memang ada beberapa kasus bahwa nama variabel tidak perlu diperhatikan, tapi untuk mempermudah pembacaan dan agar program kalian dimengerti orang lain, biasakan hal ini yaa...

Oke! Jadi, program luas lingkaran kita bisa ditulis begini:

radius = 5
p 3.14 * radius * radius

Coba jalankan. Hasilnya adalah 78.5.
Untuk perpangkatan (misal kuadrat), boleh juga menggunakan operator **. Jadi, radius * radius bisa diubah menjadi radius ** 2. Silakan dicoba!

Aduh, tapi aku nggak ingin pakai 3.14 untuk pi! Aku mau 22/7 saja, atau 3.141592853! Mengubah langsung angkanya sih tidak masalah, tapi andaikan angka itu digunakan berulang kali, alangkah ribetnya... Untuk itulah kita mengenal...
Judul: Konstanta
Ditulis oleh: Èxsharaèn pada 25 Mei 2007, 12:16:19
Konstanta

Konstanta adalah variabel khusus yang nilainya selalu tetap. Jadi, sangat tidak dianjurkan mengubah nilai sebuah konstanta (apa kata para pakar matematika kalau kita mengubah PI ke 3?). Tata nama konstanta mirip dengan variabel, hanya saja konstanta diawali dengan HURUF BESAR. Agar tidak keliru dengan variabel, dianjurkan memberi nama konstanta dengan HURUF BESAR SEMUA sementara nama variabel dengan huruf kecil semua.

Jadi, PI kita bisa dijadikan konstanta seperti berikut:

PI = 3.141592853
radius = 5
p PI * radius ** 2

walaupun sebenarnya Ruby sudah menyediakan konstanta untuk PI, yaitu Math::PI.

Cobalah mengubah nilai PI di tengah-tengah program, Ruby akan memberikan peringatan (warning) bahwa konstanta sudah diberi nilai sebelumnya.

Gampang kan?

Okay! Dengan pengetahuan yang sudah kita dapat sejauh ini, ayo mulai membuat program yang menarik!
Judul: Masukan dan konversi data
Ditulis oleh: Èxsharaèn pada 25 Mei 2007, 12:35:19
Sebelum mulai latihan, ada satu perintah lagi yang sebaiknya diberikan sekarang, yaitu gets. Kalian pasti sudah tahu fungsi puts, yaitu menampilkan apapun ke layar. Nah, supaya program kita lebih interaktif, yaitu bisa menerima masukan (input) dari penggunanya, kita gunakan fungsi gets. Cara pakainya seperti ini:

variabel = gets
Tiap kali bertemu perintah gets, program akan berhenti sebentar, menunggu masukan dari kita sampai kita menekan tombol Enter. Awas! gets memberikan hasil berupa string, jadi hati-hati kalau kita sebenarnya ingin masukan itu berupa angka.

Contoh! Andaikan program luas lingkaran kita tadi ingin menerima masukan jari-jari dari pengguna. Mungkin ini berhasil...?

radius = gets
p Math::PI * radius ** 2

Jalankan dan masukkan angka berapa saja, misalkan 24. Ternyata keliru! Ruby mengatakan:
KutipUndefined method '**' for "24\n":String

Lho... kenapa ada \n di sana? Memang, gets memberikan input apapun yang dimasukkan, tapi termasuk Enter itu sendiri, yang diwakili dengan karakter \n. Kita bisa menghilangkan \n dengan memanggil perintah chomp seperti ini:

radius = gets.chomp
p Math::PI * radius ** 2

Coba jalankan, masukkan angka sembarang, misalkan 24. Lhooo... kok salah lagi?
KutipUndefined method '**' for "24":String

\n sudah hilang, tapi kenapa masih tidak mau? Ingat, gets memberikan hasil dalam bentuk string, dan kebetulan string tidak mengenal tanda **. Lalu, bagaimana?

Konversi data

Nah, inilah contoh kasus, ada kalanya kita perlu mengubah sebuah nilai dari tipe data satu ke tipe data lainnya. Pada kasus kita, kita menginginkan nilai dalam bentuk angka (integer/float), tapi yang kita punya string. Mudah saja, konversi ini dilakukan dengan perintah to_i, to_f, atau to_s untuk mengubah apapun ke integer, float, atau string.

Ayo kita kembali lagi ke program luas lingkaran tadi! Mari kita ubah masukan pengguna tadi menjadi angka. Caranya:

radius = gets.chomp
p Math::PI * radius.to_f ** 2

Jalankan sekali lagi dan masukkan angka berapa saja, misalkan 24. Nah, kali ini hasilnya benar: 1809.55736846772. Akhirnya!

Kenapa penulisan to_f didahului tanda titik? Sebenarnya, to_i dan kawan-kawannya adalah metode yang bisa digunakan oleh semua angka (numeric). Kita bicarakan ini di topik lain (Pemrograman Berbasis Objek).

Coba percantik program ini supaya tampilnya kurang lebih seperti ini:
KutipMasukkan jari-jari: 24
Luas lingkaran: 1809.55736846772

Nah, kita siap untuk latihan! Nggak susah-susah amat kok, tenang!
Judul: Latihan
Ditulis oleh: Èxsharaèn pada 25 Mei 2007, 12:45:53
Wow, sudah cukup banyak juga yah yang kita pelajari kali ini. Kita sudah mengenal angka, huruf, variabel, konstanta, masukan, dan konversi data. Sekarang, waktunya kita mencoba membuat program dengan pengetahuan ini!

1. Perluas program luas lingkaran tadi untuk menghitung juga kelilingnya (keliling = 2 * pi * jari-jari). Contoh tampilan:
KutipMasukkan jari-jari: 5
Luas lingkaran: 78.5398163397448
Keliling lingkaran: 31.4159265358979

2. Buat program untuk memasukkan nama depan, nama tengah, dan nama belakang seseorang. Setelah selesai, beri sambutan dengan menuliskan nama terangnya. Contoh:
KutipNama depan: Dewi
Nama tengah: Maharani
Nama belakang: Putri
Halo, Dewi Maharani Putri!

Ini dulu saja deh, coba dibuat dulu. Nggak susah kok!

Berikutnya, kita akan mempelajari bagaimana kita bisa bermain-main lebih banyak dengan program kita. Ditunggu ya!
Judul: Percabangan
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 09:24:08
Nah, bagaimana latihannya? Nggak susah kan? Asalkan kita mengerti konsep dasarnya dan tidak hanya menghafalkan saja, kita pasti bisa membuat program sendiri. Sudah siap melanjutkan petualangan?

Seperti yang sudah kita lihat bersama, program kita selama ini dikerjakan secara urut. Baris paling atas akan dikerjakan lebih dulu dan berturut-turut baris-baris di bawahnya mengambil giliran sampai baris terakhir program kita. Tapi, ada kalanya kita akan "melanggar" aturan ini. Bukan berarti nanti kita bisa mengerjakan program dari bawah ke atas, tapi kita bisa melompati atau mengulangi beberapa baris. Nanti kita juga akan melihat bagaimana kita bisa mengerjakan program dari mana saja!

Oke, sekarang bayangkan kasus ini. Ambil saja contoh program sambutan kita. Sambutan itu terdengar datar saja, sama untuk tiap orang, tidak peduli jenis kelaminnya. Kita ingin agar kalau pria yang menggunakan program itu, sambutannya terdengar maskulin, sementara wanita akan disambut dengan feminin.

Langkah pertama, kita mungkin menyuruh pengguna memasukkan jenis kelaminnya seperti ini:
p "Masukkan jenis kelamin:"
sex = gets

Lah, terus, bagaimana kita menentukan apa yang akan ditampilkan program kita? Kita sudah tahu jenis kelamin pengguna kita, tapi apa yang harus kita lakukan? Nah, di sinilah kita mulai mengenal...

Percabangan

Istilah kerennya branching. Yup, program kita memang bisa "bercabang", terutama jika kita menemui kondisi-kondisi tertentu yang harus dipenuhi. Mudah sekali, dalam bahasa Inggris percabangan ini diwakili dengan kata if (jika). Semua bahasa pemrograman pasti memiliki kata if termasuk Ruby. Bagaimana cara kerjanya?

Blok if yang paling sederhana berbentuk seperti ini:
if kondisi [then]
  program di sini...
end


Tiap kali bertemu kata if, program kita akan mengecek kondisi, terpenuhi atau tidak. Kalau terpenuhi, ia akan menjalankan program apapun yang berada di dalamnya. Kalau tidak, seluruh blok (yang diapit dengan kata if dan end) akan dilewati alias tidak dikerjakan. Kata then boleh digunakan boleh tidak.

Bingung? Nii ilustrasinya dalam kata-kata sederhana...

jika kondisi terpenuhi
  lakukan apa saja yang ingin kita lakukan di sini
selesai

Contoh! Pada kasus kita tadi, kita ingin tahu, jenis kelamin pengguna kita laki-laki atau perempuan. Dalam bahasa manusia, ilustrasinya seperti ini.

jika jenis kelamin adalah laki-laki
  beri sambutan maskulin
selesai

Aduh, tapi bagaimana dengan yang perempuan? Blok if juga mengizinkan kita menuliskan program yang akan dilakukan kalau kondisinya tidak terpenuhi. Pada Ruby, ini ditandai dengan kata else. Blok if kita akan jadi seperti ini:

if kondisi [then]
  apa yang kita lakukan kalau kondisinya terpenuhi
else
  apa yang kita lakukan kalau kondisinya tidak terpenuhi
end

Inilah yang populer dengan sebutan if-then-else.

Kembali lagi ke program kita! Jadi, dalam bahasa manusia, kita akan melakukan perintah berikut:

jika jenis kelamin adalah laki-laki
  beri sambutan maskulin
selain itu
  beri sambutan feminin
selesai

Bahasa Ruby-nya bagaimana? Nah, untuk mendefinisikan kondisi, kita bebas menggunakan tanda perbandingan, misalnya lebih kecil <, lebih besar >, sama dengan == (awas! Tanda == menunjukkan kondisi sama, bukan persamaan/assignment), tidak sama dengan !=, dan sebagainya. Jadinya seperti ini:
if sex == "L"
  p "Hi Mas!"
else
  p "Halo Mbak!"
end


Lengkapnya menjadi seperti ini (kita abaikan dulu yah nama pengguna):
p "Masukkan jenis kelamin Anda (L/P):"
sex = gets.chomp.upcase
if sex == "L"
  p "Hi Mas!"
else
  p "Halo Mbak!"
end

upcase akan mengubah string menjadi huruf besar semua.
Silakan dicoba!

Waduh, tapi kalau aku masukkan huruf apapun selain L, program ini memberikan sambutan feminin! Gimana dengan para transgender?
Judul: Percabangan banyak!
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 10:04:48
Nah, andaikan syarat atau kondisi yang kita mau ternyata banyak (lebih dari satu), kita bisa menggunakan banyak if, misalnya seperti ini:

if kondisi1
  program kalau kondisi1 terpenuhi
else
  if kondisi2
    program kalau kondisi2 terpenuhi
  end
end


Atau seperti ini:
if kondisi1
  program kalau kondisi1 terpenuhi
elsif kondisi2
  program kalau kondisi2 terpenuhi
else
  program kalau semua kondisi tidak terpenuhi
end


Nah, kita mengenal satu kata lagi, elsif. Ini sebetulnya kependekan dari else if, menandakan kalau ada syarat lain yang harus dicek kalau syarat sebelumnya tidak terpenuhi.

Program sambutan kita tadi bisa diperbaiki agar ia mengenali jenis kelamin laki-laki dan perempuan. Kalau pengguna memasukkan jenis kelamin yang lain, program tidak akan menyambut pengguna. Kodenya seperti ini:
p "Masukkan jenis kelamin Anda (L/P):"
sex = gets.chomp.upcase
if sex == "L"
  p "Hi Mas!"
elsif sex == "P"
  p "Halo Mbak!"
else
  p "Siapa kamu?"
end


Oke! Kita bisa menggunakan percabangan yang banyak ternyata. Nah, dalam satu waktu ternyata kita boleh mengecek lebih dari satu kondisi sekaligus! Kondisi-kondisi ini dihubungkan dengan operator logika (pernah dipelajari di SMP dan SMA). Misalnya, kita ingin membuat program yang mengizinkan pengguna memasukkan umurnya dan program kita akan memberi tahu apa dia bayi, anak-anak, remaja, dewasa, atau tua. Kira-kira seperti ini dalam bahasa manusia:

Masukkan umur.
Kalau umur di bawah 5, berarti kamu balita.
Kalau umur antara 5 hingga 12, kamu anak-anak.
Kalau umur antara 12 hingga 17, kamu remaja.
Kalau umur antara 17 hingga 50, kamu dewasa.
Kalau umur di atas 50, kamu tua.

Kodenya? Perhatikan, operator logika yang paling sering digunakan adalah and, or, dan not. Operator apa nih?

Operator and meminta seluruh syarat terpenuhi agar ia memberikan nilai benar (true). Selain itu, operator and akan mengembalikan nilai salah (false). Misalnya...

if aku cinta dia and dia cinta aku
  kami menikah
end

Kalau dia ternyata tidak cinta aku, kami tidak akan menikah. Aku tidak cinta dia, kami juga tidak akan menikah.
Masuk akal kan? Begitulah operator and bekerja.

Operator or kebalikannya. Ia meminta paling tidak satu kondisi terpenuhi agar ia memberikan nilai true. Kalau ternyata seluruh kondisinya salah, ia memberikan nilai false. Contoh...

if aku cinta dia or dia cinta aku
  kami menikah
end

Ini agak maksa :P Nggak peduli bahwa ternyata dia tidak cinta aku, kami tetap menikah. Atau aku tidak cinta dia tapi dia cinta aku, kami juga tetap menikah. Tapi, kalau aku nggak cinta dia dan dia nggak cinta aku, kami nggak menikah.

Operator not membalik nilai apapun yang diberikan padanya: true jadi false dan sebaliknya. Misal...

if not aku cinta dia
  kami menikah
end

Agak aneh jadinya :D Kalau aku nggak cinta dia, kami justru menikah. Kalau aku cinta dia, kami nggak menikah. Operator not memang membalik semuanya.

Cara pakai and dan or seperti ini: kondisi1 and kondisi2 and kondisi3 ... Khusus not, dia diletakkan sebelum kondisi, jadi bentuknya seperti ini: not kondisi1. Boleh juga dicampur, misalnya kondisi1 and kondisi2 or kondisi3 and not kondisi4.

Nah, kalau ada banyak kondisi, ada prioritas pengerjaan agar hasilnya tepat. Di Ruby, operator not akan selalu dikerjakan lebih dahulu, disusul and dan terakhir or. Misalkan ada syarat seperti ini:
kondisi1 and kondisi2 or kondisi3 and not kondisi4
Pengerjaannya adalah:
1. kondisi1 and kondisi2
2. not kondisi4
3. kondisi 3 and (2)
4. (1) or (3)
Jadi, hati-hati saat menggunakan banyak kondisi. Jika ingin kondisi itu dikerjakan lebih dulu, gunakan tanda kurung ().

Oke! Sekarang kita siap membuat program umur kita:
p "Masukkan umur:"
umur = gets.chomp.to_i
if umur < 5
  p "Balita"
elsif umur >= 5 and umur < 12
  p "Anak-anak"
elsif umur >= 12 and umur < 17
  p "Remaja"
elsif umur >= 17 and umur < 50
  p "Dewasa"
else
  p "Tua"
end


Hmm... Bagus sih, tapi panjang juga yah... Apa nggak ada cara yang lebih singkat dan ringkas tapi masih bisa terbaca?
Judul: Select!
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 10:26:59
Pada beberapa kasus, terutama kalau kondisinya banyak, kadang-kadang menuliskan elsif yang cukup banyak agak melelahkan dan mengurangi pemahaman program kita (agak susah bacanya). Karena itu, untuk menyederhakan kondisi yang cukup banyak, Ruby (dan beberapa bahasa lain) menyediakan bentuk lain percabangan: case (di bahasa lain mungkin dikenal dengan istilah switch, select dsb.). Bentuknya seperti ini:

case variabel_yang_dicek
when nilai1
  ...
[when nilai2, nilai3, nilai4[, ...]
  ...]
[when nilai_awal .. nilai_akhir
  ...]
[...]
[else
  kalau tidak terpenuhi semuanya...]
end


Wah, bentuknya ada banyak juga yah... Maksudnya apa nih? Kita lihat satu-satu.

when nilai1
Bagian ini akan dikerjakan kalau variabel_yang_dicek bernilai nilai1. Mudah kan?

when nilai2, nilai3, nilai4[, ...]
Bagian ini akan dikerjakan kalau variabel_yang_dicek bernilai nilai2, nilai3, atau nilai4. Cocok untuk meringkas beberapa kondisi alih-alih menggunakan operator logika.

when nilai_awal .. nilai_akhir
Bagian ini akan dikerjakan kalau variabel_yang_dicek nilainya ada di rentang nilai_awal hingga nilai_akhir (disebut juga range). Tanda .. menandakan bahwa nilai_akhir juga diikutkan dalam pengecekan (nilai_awal <= variabel_yang_dicek <= nilai_akhir) sementara tanda ... menandakan nilai_akhir tidak diikutkan (nilai_awal <= variabel_yang_dicek < nilai_akhir).

else
Bagian ini akan dikerjakan jika tidak ada nilai yang memenuhi kasus-kasus sebelumnya.

Nah, program umur kita sebelumnya bisa diubah menggunakan case sebagai berikut:
p "Masukkan umur: "
umur = gets.chomp.to_i
case umur
when 0 ... 5
  p "Balita"
when 5 ... 12
  p "Anak-anak"
when 12 ... 17
  p "Remaja"
when 17 ... 50
  p "Dewasa"
else
  p "Tua"
end


Tergantung penggunaannya, case bisa meringkas pekerjaan atau malah merepotkan. Banyak-banyak latihan untuk menemukan mana yang lebih enak digunakan, OK?

Nah, percabangan sudah selesai sampai di sini! Sebelum kita melanjutkan perjalanan...
Judul: Tips
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 10:38:25
Tips saat menggunakan percabangan:

1. Saat memulai sebuah blok, misalnya if, case, biasakan langsung mengakhirinya dengan end, baru tuliskan program yang ingin kita lakukan dalam blok itu. Misalnya begini:

if
elsif
else
end

Untuk sekarang mungkin belum terlihat apa efektifnya tips ini. Andaikan blok ini sudah selesai dan ternyata ada kondisi lain...

if sex == "L"
  p "Laki-laki"
elsif sex == "P"
  p "Perempuan"
else
  if
  else
  end
end

Aku bisa menulis dan membaca dengan benar bahwa ada blok percabangan lain di dalam else yang pertama. Ini akan sangat berguna untuk menghindari kesalahan blok, karena if harus diakhiri dengan end. Andaikan pada blok if yang kedua aku lupa memberi end, program ini pasti error.

2. Biasakan memberikan indentasi pada baris kode baru di dalam sebuah blok. Misalnya, alih-alih
if kondisi
if kondisi2
program
else
program
end
else
program
end

yang terlihat membingungkan, biasakan
if kondisi
  if kondisi2
    program
  else
    program
  end
else
  program
end

Lebih enak kan bacanya?

3. Jika perlu, berikan komentar pada program. Komentar adalah baris yang tidak akan pernah dijalankan oleh program kita. Ini sangat berguna untuk memberikan keterangan apa yang program kita lakukan, walaupun program yang ditulis dengan baik kadang-kadang tidak memerlukan komentar. Dianjurkan memberikan komentar apabila program kita sudah cukup kompleks, supaya kita bisa mengingat kembali apa yang program kita lakukan sewaktu membaca ulang di kemudian hari dan supaya orang lain juga bisa memahami program kalian. Komentar dalam Ruby ditandai dengan #. Contoh:

# Cek jenis kelamin
# Kalau pria...
if sex == "L"
  # Sambutan maskulin
  p "Hi, Mas!"
end


Lanjut!
Judul: Perulangan
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 11:02:50
Suatu saat, kita ingin melakukan potongan program yang sama berulang kali. Apa cara termudah untuk melakukannya? Copy-paste. Tapi apa yang terjadi kalau ternyata ada satu saja baris yang berubah? Bagaimana kalau kita tidak tahu harus berapa kali mengulang potongan program tersebut?

Karena itulah, sekarang kita berkenalan dengan...

Perulangan

Istilah kerennya loop. Untuk menyatakan perulangan, ada beberapa cara yang bisa ditempuh, tergantung apakah kita tahu harus mengulang berapa kali.

Kalau kita tahu berapa kali perulangannya...

Blok for praktis digunakan untuk perulangan yang diketahui jumlahnya. Bentuknya seperti ini:

for variabel_penghitung in range
  program perulangan di sini
end

Ingat ya, range didefinisikan dengan nilai_awal .. nilai_akhir atau nilai_awal ... nilai_akhir. Nanti kita akan tahu bahwa range bisa juga tidak berupa jangkauan angka, tapi jangkauan dalam benda lain.

Misalkan begini. Tahu faktorial? 2! adalah 2 * 1, 4! adalah 4 * 3 * 2 * 1. Ayo kita coba buat programnya!

p "Masukkan angka:"
angka = gets.chomp.to_i
faktorial = 1
for i in 1 .. angka
  faktorial *= i
end
p angka.to_s + "! = " + faktorial.to_s

Coba masukkan angka sembarang dan cobalah hitung dengan kalkulator biasa. Hasilnya sama kan?

Operator *= adalah bentuk khusus dari operator perkalian. Operator ini mengalikan nilai variabel tersebut dengan operand, hasilnya disimpan ke variabel itu sendiri. Jadi, variabel *= operand sama artinya dengan variabel = variabel * operand. Ini berlaku untuk nyaris semua operator aritmatika, misalnya +=, -=, /=.

Kalau perulangannya tidak diketahui...

Blok for tidak dapat mengatasi hal ini. Maka, kita berkenalan dengan blok while. Bentuknya seperti ini:

while kondisi
  program yang harus diulang
end

Blok while akan melakukan apa saja yang ada di dalamnya, selama kondisinya terpenuhi.

Nah, hati-hati saat menggunakan blok ini. Pastikan untuk selalu mengubah kondisi yang harus dicek agar perulangan itu bisa berhenti. Kalau kondisinya tidak pernah berubah, perulangan bisa saja tidak pernah berhenti. Ini dikenal dengan infinite loop. Infinite loop sangat menguras memori dan CPU. Andaikan program kita terjebak dalam infinite loop, hentikan secara paksa dengan menekan tombol Ctrl + Break.

Contoh! Program faktorial kita di atas bisa diubah menggunakan blok while seperti berikut:
p "Masukkan angka:"
angka = gets.chomp.to_i
faktorial = 1
i = 1
while i <= angka
  faktorial *= i
  i += 1 # Jangan lupa baris ini! Coba hilangkan, akan terjadi infinite loop
end
p angka.to_s + "! = " + faktorial.to_s


Ada blok lain yang mirip dengan while, namanya until. Bentuknya sama persis:
until kondisi
  program yang harus diulang
end

Bedanya, blok ini akan terus dilakukan selama kondisinya tidak terpenuhi. Program baru keluar dari blok ini saat kondisi terpenuhi. Coba ubah program di atas menggunakan blok until!

Ada juga bentuk perulangan lain seperti berikut:
loop do
  program yang harus diulang
end

Tapi, kapan berhentinya?
Judul: Stop! Lanjut!
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 11:20:21
Nah, ada kalanya kita harus menghentikan paksa perulangan yang tengah dijalankan. Untuk melakukan ini, gunakan kata break. break akan menghentikan paksa sebuah perulangan for, while, until, loop do.

Jadi, saat menggunakan loop do, berikut cara berhenti dari perulangan tersebut:
loop do
  program yang harus diulang
  break if kondisi
end

Lho, bentuk if-nya kok lain? Ya, ini bentuk khusus blok if: Jika ia tidak punya bagian else dan perintah yang dilakukan hanya satu, bentuk
if kondisi
  perintah
end

bisa diringkas ke dalam bentuk
perintah if kondisi
Tapi ingat, perintah yang dilakukan cuma boleh satu ya...

Kadang-kadang kita juga perlu melanjutkan perulangan begitu saja tanpa melakukan beberapa potongan program yang semestinya dilakukan. Misalnya kita ingin membuat faktorial yang "unik": ia hanya menghitung perkalian bilangan ganjil. Jadi, 3! berarti 3 * 1, 6! berarti 5 * 3 * 1. Untuk kasus ini, kita bisa menggunakan kata next. Contoh:
p "Masukkan angka:"
angka = gets.chomp.to_i
faktorial = 1
i = 0
loop do
  i += 1
  next if i % 2 == 0
  break if i > angka
  faktorial *= i
end
p "Faktorial unik ini hasilnya " + faktorial.to_s


Program yang aneh... :D Program ini berulang kali menambah i dengan 1. Kalau ternyata i genap, langsung lanjutkan perulangan. Baris setelah next tidak akan dikerjakan.

Yah, memang kasus-kasus ini agak jarang terjadi, tapi cukup berguna saat program kita sudah cukup kompleks.

Terakhir! Ada kalanya kita harus melakukan perulangan paling tidak sekali. Blok while dan until bisa melakukan hal ini, hanya dengan bentuk yang sedikit berbeda:
begin
  program yang harus diulang
end while|until kondisi

Dengan bentuk seperti ini, program kita akan menjalankan apapun yang ada di blok begin lebih dahulu baru mengecek kondisinya. Itu sebabnya, perulangan seperti ini pasti dilakukan paling tidak sekali.

Wow, banyak juga yah bentuk perulangan yang kita kenali! Silakan pilih bentuk yang paling bersahabat dan mudah dikuasai. Sekarang, ayo kita terapkan pengetahuan kita sejauh ini!
Judul: Latihan lagi
Ditulis oleh: Èxsharaèn pada 27 Mei 2007, 11:52:44
Yuk latihan!

1. Buat program yang menghitung panjang nama yang dimasukkan pengguna. Program akan menampilkan seberapa panjang nama tersebut dengan ketentuan:
kurang dari 10 karakter: pendek
10 hingga 20 karakter: sedang
lebih dari 20 karakter: panjang
Tips: Gunakan perintah length untuk mengetahui panjang sebuah string (contoh: variabelku.length)

2. Buat program yang menerima masukan sebuah huruf. Tentukan apakah huruf tersebut vokal atau konsonan.

3. Buat program untuk mengetahui faktor sebuah angka. Contoh: Faktor dari 6 adalah 1, 2, 3, 6. Tampilkan seperti ini:
KutipMasukkan angka: 6
Faktor-faktornya:
1
2
3
6

4. Buat program untuk menghitung KPK (kelipatan persekutuan terkecil). Misal: KPK 5 dan 3 adalah 15.

5. Buat program untuk mengetahui apakah sebuah bilangan yang dimasukkan adalah bilangan prima. Program (3) dapat digunakan untuk membuat program ini.

6. Buat program yang menerima dua masukan: tahun awal dan tahun akhir. Tampilkan seluruh tahun kabisat yang berada di jangka waktu tersebut.

7. Buat program permainan tebak-tebakan. Komputer akan mengacak sebuah angka dan pengguna harus menebak angka tersebut. Beri petunjuk (respon dari komputer), apakah angka yang dimasukkan lebih besar atau lebih kecil dari angka tebakan. Setelah tertebak, tampilkan berapa kali tebakan pemain dan beri pujian berdasarkan jumlah tebakan:
1: Hebat sekali!
2 - 10: Hebat!
11 - 20: Lumayan
20 - 30: Payah!
>30: Ngawur amat sih?
Tips: Gunakan perintah rand(angka_max) untuk mengacak angka. rand(100) akan mengembalikan angka acak antara 0 hingga 99. Batasi angka acak antara 0 hingga 100.

8. Kali ini, biarkan komputer yang menebak angkamu. Masukkan jangkauan angkanya (misal dari 0 hingga 100). Ingat-ingat angka yang harus ditebak. Tiap kali komputer menebak, beri petunjuk apakah angka tebakannya lebih besar atau lebih kecil dari angkamu. Buat sedemikian rupa sehingga komputer menebak dengan jumlah tebakan paling sedikit.

Salah satu pendekatannya adalah sebagai berikut. Komputer akan langsung mengambil nilai tengah jangkauan awal. Beri tahu komputer apakah angka sebenarnya lebih besar atau lebih kecil dari angka acak tersebut. Berikutnya, komputer akan memperkecil jangkauan tebakannya dan mengambil nilai tengah sebagai tebakan berikutnya. Lakukan terus sampai angkanya tertebak.

Contoh: Angka yang harus ditebak = 65. Jangkauan tebakan 0 hingga 100
Tebakan pertama komputer: (0 + 100) / 2 = 50.
Ternyata angka tebakan komputer lebih kecil dari angka sebenarnya. Komputer akan memperkecil jangkauannya menjadi 50 hingga 100. Tebakan berikutnya adalah (100 + 50) / 2, yaitu 75.
Lebih besar. Komputer mempersempit lagi jangkauannya menjadi 50 ke 75. Tebakan berikutnya adalah (50 + 75) / 2 = 62.
Llebih kecil. Jangkauan menjadi 62 ke 75. Tebakan berikutnya adalah (62 + 75) / 2 = 68.
Lebih besar. Jangkauan menjadi 62 ke 68. Tebakan berikutnya adalah (62 + 68) / 2 = 65.
Akhirnya tertebak juga...

Jangan lupa hitung berapa kali komputer menebak, dan beri dia pujian seperti pada program sebelumnya.

Selamat mencoba!
Judul: Jawaban latihan
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 09:54:33
Oke, gimana? Nggak sulit kan? Kalau ada yang kesulitan, atau ingin mencocokkan jawaban, silakan baca jawaban di bawah ini. Kalau sudah bisa, ayo lanjut!

Ingat, ini hanya salah satu alternatif jawaban! Punya kalian mungkin lebih panjang atau bahkan lebih pendek dari jawaban ini, namun yang penting logikanya benar.

1.
puts "Masukkan nama:"
nama = gets.chomp
case nama.length
when 0 .. 10
  puts "Namamu pendek yah."
when 11 .. 20
  puts "Lumayan panjang..."
else
  puts "Wah, panjangnya namamu..."
end


2. Perbaiki program ini agar karakter apapun yang dimasukkan selain huruf tidak terdeteksi sebagai "huruf konsonan!"
puts "Masukkan huruf:"
huruf = gets.chomp.upcase
case huruf
when "A", "E", "I", "O", "U"
  p "Huruf vokal"
else # waduh, karakter nonhuruf juga masuk bagian ini!
  p "Huruf konsonan"
end


3.
puts "Masukkan angka:"
angka = gets.chomp.to_i
p "Faktor-faktornya:"
i = 1 # hitung mulai dari 1...
while i <= angka
  if angka % i == 0 # kalau sisa pembagian (modulus, %) angka terhadap i adalah 0...
    puts i # ...i adalah faktor dari angka!
  end
  i += 1 # jangan lupa ubah kondisi perulangan
end


4. Ada yang bisa memanfaatkan program nomor 3?
puts "Masukkan angka pertama:"
angka1 = gets.chomp.to_i
puts "Masukkan angka kedua:"
angka2 = gets.chomp.to_i
i = angka1 # ambil salah satu angka
until i % angka2 == 0 # berhenti kalau hasil sisa pembagiannya 0
  i += angka1
end
# keluar dari blok until, i akan bernilai sama dengan KPK kedua angka! Kenapa begitu?
p "KPK-nya: " + i.to_s


5. Ada yang bisa memanfaatkan program nomor 3?
puts "Masukkan angka:"
angka = gets.chomp.to_i
i = 1
faktor = 0
for i in 1 .. angka
  faktor += 1 if angka % i == 0 # hitung jumlah faktor
  break if faktor > 2 # hentikan saja loop for ini kalau jumlah faktor sudah lebih dari dua (berarti bukan prima, ya kan?)
end
if faktor == 2
  p "Angka prima!"
else
  p "Bukan angka prima!"
end


Tunggu sebentar... Kenapa ada banyak tanda # di dalam kode program di atas?
Judul: Komentar
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 10:04:42
Walaupun Ruby sudah didesain agar se-Inggris mungkin (maksudnya mirip dengan tata bahasa Inggris) sehingga mudah dibaca, programmer tingkat ahli pun masih sering memanfaatkan fitur berikut:

Komentar

Pada Ruby, komentar ditandai dengan #. Apapun yang kita tulis setelah tanda ini, asalkan tidak ganti baris, akan dianggap sebagai komentar. Komputer akan mengabaikan seluruh komentar yang ada dalam program kita. Walaupun mungkin memperbesar ukuran berkas kode program kita, amat dianjurkan memberi komentar terutama pada baris-baris kode yang sudah cukup rumit. Komentar ini amat bermanfaat saat kita membaca ulang program kita lama setelah pembuatannya, supaya kita ingat untuk apa program ini dibuat dan bagaimana cara kerjanya. Komentar juga bermanfaat agar program kita dapat dimengerti oleh orang lain yang membaca program kita.

Ada satu lagi cara untuk menandai komentar, terutama kalau komentarnya panjang sekali, berbaris-baris. Gunakan blok =begin untuk menulis komentar berbaris-baris dan akhiri dengan blok =end. Awas! Penulisan =begin dan =end harus diletakkan di awal baris tanpa ada awalan apapun, termasuk spasi dan tabulasi. Contoh:

=begin
Ini adalah komentar yang cukup panjang.
Biasanya berisi nama program...
  Pembuatnya... (boleh diawali spasi)
Tanggal dibuat... (juga boleh diawali tabulasi)
Keterangan singkat kegunaan program...
Dan hal-hal lain yang perlu diketahui orang yang membaca kode program ini.
Ini adalah baris terakhir komentar kita.
=end


Coba biasakan untuk memberi komentar kapanpun dirasa perlu.
Judul: Metode apa?
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 10:19:29
Nah, untuk latihan nomor 6, 7, dan 8, aku serahkan dulu pada kalian. Kalau ada kesulitan, silakan ditanyakan di sini langsung (atau buat topik baru kalau memang perlu). Kita lanjut ke bagian berikutnya.

Metode

Pada beberapa bagian di awal kita sebenarnya sudah menyinggung beberapa metode, seperti to_i, chomp, upcase, length, dan sebagainya. Ada penggunaan lain metode, yaitu untuk mengulang potongan program kapanpun kita butuhkan. Lho, bukannya bisa pakai perulangan (loop)? Ada kalanya kita tidak langsung memerlukan potongan program tersebut. Lihat contoh berikut.

Ada proses A di sini...
Ada proses B di sini...
Ada proses C di sini...
Ternyata kita butuh proses B.
Ada proses D...
Butuh lagi proses B.

Bagaimana ini dilakukan dengan perulangan biasa? Nah, metode bisa mengatasi masalah ini. Dengan memanggil metode tersebut, kita bisa mengulangi kembali baris program yang kita perlukan. Dengan cara ini, program kita sudah mulai bisa "lompat-lompat", karena metode harus didefinisikan dulu sebelum bisa digunakan. Contohnya untuk kasus di atas...

Definisikan dulu proses B.
Ada proses A di sini...
Panggil proses B.
Ada proses C...
Ternyata kita buruh proses B. Panggil saja proses B.
Ada proses D...
Butuh lagi proses B. Panggil lagi proses B!

Nah, bagaimana cara membuat sebuah metode? Ingat, sebuah metode harus didefinisikan dahulu sebelum dipakai? Mudah saja, Ruby mendefinisikan metode dengan

def nama_metode
  # apapun yang ingin kita lakukan di sini...
end


Untuk menggunakan metode ini, cukup panggil namanya.

Ini adalah bentuk metode paling sederhana. Kita coba contoh programnya dulu.

def panggil
  p "Halo " + nama + "!"
end
p "Masukkan nama:"
nama = gets.chomp
panggil
p "Masukkan nama sahabat karibmu:"
nama = gets.chomp
panggil


Aduh, kenapa Ruby memberikan error?
KutipUndefined local variable or method 'nama' for main:Object (NameError)
Judul: Parameter
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 10:42:23
Apa yang salah dengan program kita sebelumnya? Well, Ruby ternyata tidak mengenali variabel nama yang ada di baris kedua program kita:
p "Halo " + nama + "!"
Kok tidak kenal? Bukannya ada variabel nama di bawahnya? Memang namanya sama, tapi sebenarnya kita belum punya variabel nama di metode kita. Ingat, variabel harus paling tidak pernah digunakan sekali sebelum digunakan kembali. Karena pada metode panggil kita sama sekali belum pernah menggunakan variabel nama, Ruby tidak akan mengenalinya.

Lha terus gimana? Ada dua pemecahan masalah ini, tapi aku berikan satu dulu. Ingatkan untuk pemecahan masalah satunya yah!

Supaya metode kita bisa mengakses variabel dari luar dirinya, kita memerlukan yang dinamakan

Parameter

Parameter adalah variabel bantu yang bisa "dilemparkan" program dari luar suatu metode agar metode itu bisa mengaksesnya. Bentuknya seperti ini:

def nama_metode(parameter)
  # apa saja yang mau dilakukan di sini...
  # boleh juga mengakses parameter lho!
end


Waktu memanggil metode ini, jangan lupa parameternya. Metode di atas akan dipanggil dengan nama_metode(nilai_parameter_ini).

Parameter boleh lebih dari satu! Misalnya...
def metodeku(param1, param2)

end


Parameter boleh juga diberi nilai awal, jadi kalau pengguna kita kelupaan memasukkan nilai untuk suatu parameter, program akan otomatis memberi nilai. Contoh:
def faktor(angka = 1)

end

Parameter seperti ini juga sering disebut dengan optional parameter, artinya boleh dipakai boleh tidak. Program kita harus mampu mengecek apakah parameter tersebut digunakan atau tidak. Kalau parameternya lebih dari satu dan beberapa memang opsional, usahakan seluruh parameter opsional berada di belakang. Misalnya:
def panggil(nama, jenis_kelamin, alamat = "Jl. Antah Berantah", umur = 0)

end


Nah, program kita tadi bisa dibetulkan menjadi seperti berikut:

def panggil(nama)
  p "Halo " + nama + "!"
end
p "Masukkan nama:"
nama = gets.chomp
panggil(nama)
p "Masukkan nama sahabat karibmu:"
nama = gets.chomp
panggil(nama)


Asyik, program kita sekarang berjalan dengan mulus! Rupanya metode ini berguna sekali ya? Tunggu dulu, masih ada satu lagi kegunaan metode...
Judul: Fungsi
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 11:08:39
Ada kalanya kita ingin metode kita bisa "berkomunikasi" dengan program kita berikutnya. Misalnya, kita ingin hasil proses dalam metode kita bisa tetap diakses di luar metode tersebut. Untuk itulah, ada satu bentu metode yang spesial...

Fungsi

Ruby tetap menyebutnya sebagai metode. Fungsi adalah metode yang "mengembalikan sebuah nilai" (dalam arti sebenarnya). Jadi, hasil proses sebuah metode bisa "dikembalikan" ke program untuk diproses lebih lanjut. Sama seperti metode, fungsi amat berguna kalau kita membutuhkan proses ini berulang-ulang. Misalnya...

Anggap saja kita ingin menghitung nilai sinus suatu sudut (pada Ruby, fungsinya adalah Math.sin(x)). Kita memasukkan nilai sudut itu dalam derajat, namun fungsi trigonometri pada umumnya meminta sudut dalam radian (untuk yang tidak belajar matematika, satu lingkaran penuh (360°) adalah satu radian atau 2
π
). Supaya kita tidak melulu harus mengubah satuan sudut saat menghitung, kita bisa membuat sebuah fungsi berikut:

def deg_to_rad(sudut_deg)
  sudut_rad = sudut_deg.to_f / 180 * Math::PI
  return sudut_rad
end


Perhatikan kata return di akhir fungsi kita? Itu adalah kata kunci untuk menandai Ruby, apa yang ingin kita kembalikan (return). Sebenarnya, tiap metode mengembalikan suatu nilai, yaitu nilai apapun yang berada di akhir metode. Jadi, kata kunci return tidak mutlak dituliskan, seperti ini:

def deg_to_rad(sudut_deg)
  sudut_rad = sudut_deg.to_f / 180 * Math::PI
  sudut_rad
end


Tapi agar tidak bingung dan mudah membedakannya dari metode biasa, biasakan memberi kata return untuk mengembalikan suatu nilai. Metode biasa juga mengembalikan nilai berupa nil (ini akan kita singgung kemudian). Jangan lupa untuk menampung nilai suatu fungsi ke suatu variabel.

Nah, fungsi itu kini bisa dipakai pada program kita:

def deg_to_rad(sudut_deg)
  sudut_rad = sudut_deg.to_f / 180 * Math::PI
  return sudut_rad
end

p "Masukkan sudut (derajat):"
sudut = gets.chomp
p "sin(" + sudut.to_s + ") dalam derajat = " + deg_to_rad(sudut).to_s

Coba masukkan angka 30. Hasilnya mungkin seperti berikut:
Kutip"Masukkan sudut (derajat):"
30
"sin(30) dalam derajat = 0.523598775598299"

Wah, jauh lebih akurat dari yang diajarkan guru matematika kita dulu yah :D

Coba perhatikan baris ini:
p "sin(" + sudut.to_s + ") dalam derajat = " + deg_to_rad(sudut).to_s
Hasil dari suatu fungsi dapat langsung digunakan pada proses berikutnya, seperti contoh di atas. Jadi, kalau sudah mahir, kita bisa menggunakan cara di atas kalau memang hasil fungsi tersebut tidak perlu diolah lagi. Bentuk sederhananya adalah sebagai berikut:
sudut_rad = deg_to_rad(sudut)
p "sin(" + sudut.to_s + ") dalam derajat = " + sudut_rad.to_s

Silakan gunakan kesukaan kalian.
Judul: Review
Ditulis oleh: Èxsharaèn pada 12 Juni 2007, 11:26:27
Kita berhenti sejenak di sini. Wow, banyak juga yah yang sudah kita pelajari bersama! Kita sudah belajar bagaimana menggunakan variabel dan konstanta; mengatur alur program kita dengan perulangan, percabangan, ditambah metode dan fungsi yang kita pelajari barusan, memberi komentar pada program kita, dan mengubah tipe data. Dasar-dasar pemrograman sebenarnya selesai sampai di sini, jadi selamat! Kalian sudah bisa membuat program yang lebih kompleks lagi!

Tapi tunggu, masih ada beberapa konsep dasar yang umum dijumpai di bahasa pemrograman manapun, termasuk Ruby. Tunggu artikel berikutnya untuk mengetahui lebih banyak lagi!

Untuk sekarang, coba kerjakan ulang latihan sebelumnya. Bisakah kalian menulis ulang program nomor 3 untuk digunakan pada program nomor 4 dan 5?

Ini soalnya kalau ada yang ketinggalan:

3. Buat program untuk mengetahui faktor sebuah angka. Contoh: Faktor dari 6 adalah 1, 2, 3, 6. Tampilkan seperti ini:
KutipMasukkan angka: 6
Faktor-faktornya:
1
2
3
6
Modifikasi seperlunya untuk mengerjakan nomor 4 dan 5.

4. Buat program untuk menghitung KPK (kelipatan persekutuan terkecil). Misal: KPK 5 dan 3 adalah 15.

5. Buat program untuk mengetahui apakah sebuah bilangan yang dimasukkan adalah bilangan prima. Program (3) dapat digunakan untuk membuat program ini.

Untuk tambahan latihan:

9. Buat metode untuk menghitung faktorial suatu angka (dimasukkan lewat parameter).

10. Buat metode untuk menggambar bintang sejumlah angka yang dimasukkan lewat parameter. Misalnya: gambar_bintang(5) akan menghasilkan gambar seperti berikut:
*
**
***
****
*****


11. Buat metode untuk mengubah bilangan desimal yang dimasukkan lewat parameter menjadi bilangan biner. Contoh, dec_to_bin(7) akan menghasilkan 111.
Petunjuk: Bilangan biner adalah bilangan yang hanya terdiri dari 0 dan 1.
Tips: Anggap bilangan biner adalah kumpulan string 0 dan 1, bukan angka 0 dan 1.

12. Kebalikan dari nomor 11, buat metode untuk mengubah bilangan biner yang dimasukkan lewat parameter menjadi bilangan desimal.
Petunjuk: Akses satu huruf dari sebuah string dengan cara nama_string[indeks, 1]. Contoh:
stringku = "Halo!"
p stringku[0, 1] # "H"


Selamat bekerja! ;)
Judul: Awas error!
Ditulis oleh: Èxsharaèn pada 04 September 2007, 12:34:47
Nah, bagaimana? Sudah bisa bikin program sendiri? Yang suka baca-baca pasti sudah tahu bahwa fungsi untuk latihan nomor 11 dan 12 sebenarnya sudah disediakan oleh Ruby :D

Sebentar lagi kita akan melangkah lebih jauh dengan mengenal konsep pemrograman yang dipakai Ruby, yaitu Pemrograman Berbasis Objek (PBO), tapi kita akan meneruskan artikel ini dengan dua materi lagi sebelum kita pindah ke materi baru.

Jadi, apa yang akan kita pelajari sekarang?

Error handling

Sudah mencoba menunjukkan program pertama pada teman? Bagaimana reaksi mereka?
Nah, andaikan saja ada pengguna yang kelewat iseng. Kita ambil contoh program menghitung luas lingkaran kita (masih ingat?). Bagaimana seandainya ada yang iseng memasukkan angka seperti ini?

KutipMasukkan jari-jari lingkaran: sapi

Di bahasa pemrograman lain, program tersebut mungkin sudah pasti error. Sama juga dengan Ruby, program kita tersebut bisa mengalami kesalahan apabila masukan yang diterima ternyata bukan masukan yang benar. Program tersebut mungkin akan menghasilkan nilai yang tidak diharapkan, atau paling parah terjadi error.

Tidak hanya kesalahan masukan saja yang dapat menyebabkan program kita error. Kesalahan sintaks (syntax error) akibat ketidaktelitian saat mengetik juga menjadi salah satu hal yang berperan, terutama pada programmer pemula (jangan khawatir, bahkan aku dulu juga sering kok mengalami syntax error). Kesalahan yang agak tidak terlihat namun termasuk paling sering terjadi adalah kesalahan logika, misalnya secara tidak sadar mengalikan sebuah angka dengan variabel yang ternyata string (tidak bisa kan?).

Nah, namanya manusia tidak bisa lepas dari kesalahan, tapi komputer tidak bisa menoleransi kesalahan. Kesalahan sedikit saja mungkin dapat berakibat fatal pada komputer, mulai dengan komputer hang, aplikasi tiba-tiba menutup sendiri, bahkan paling parah sistem operasi juga kena imbasnya (ingat kan blue screen of death di Windows 98?). Jadi, kita sebagai programmer harus meminimalkan kesalahan-kesalahan yang mungkin terjadi, bahkan kalau bisa meniadakannya. Itu bukan hal yang cukup sulit kok.

Pertama-tama, kita harus membatasi masukan dari pengguna program kita. Misal, pada contoh program luas lingkaran, tentu kita hanya ingin masukan berupa angka, ya kan? Sebelum memroses luas lingkaran, kita bisa mengecek dulu masukan pengguna. Dua baris pertama program kita bentuknya kan seperti ini...

p "Masukkan jari-jari lingkaran: "
radius = gets.chomp.to_f


Nah, perintah to_f ternyata mengembalikan nilai 0 kalau string yang ia coba ubah ternyata bukan angka yang valid (karakter pertama string yang akan diubah ternyata bukan angka). Kita bisa coba cara ini:

# Cek dulu!!!
if radius > 0
  luas = Math::PI * radius ** 2
  p "Luas lingkaran: " + luas.to_s
else
  p "Maaf, masukkan hanya angka!"
end


Oke! Masukan bukan angka sudah tidak diterima lagi. Tapi... waktu dimasukkan jari-jari 0 satuan, kenapa program kita mengeluarkan Maaf, masukkan hanya angka!? Nah, rupanya ada kesalahan logika di sini ^_^; Tapi, jika dipikirkan lebih jauh, masukan yang kita terima sebenarnya kan memang string? Trus, gimana dong?
Judul: Selamatkan diri!
Ditulis oleh: Èxsharaèn pada 04 September 2007, 01:27:23
Nah, ada banyak pendekatan untuk menyelesaikan masalah ini. Kita bisa membiarkan program kita menerima masukan string (sehingga luas lingkaran menjadi 0.0, atau melakukan pengecekan yang agak "ekstrim". Tetap lakukan komversi to_f, namun jika hasilnya 0 (awas, 0 di sini adalah 0 bulat, bukan 0 yang diikuti angka desimal), lihat karakter pertama. 0 atau bukan? Kalau ternyata 0, tetap hitung luas lingkaran (tentu saja, hasilnya 0.0); kalau tidak, tampilkan pesan kesalahan.

Tapi, ada kalanya kita tahu persis baris program kita yang mungkin menimbulkan kesalahan, misalnya saat mengerjakan pembagian. Sudah jadi rahasia umum bahwa pembagian dengan 0 tidak diizinkan. Apa yang terjadi seandainya kita tetap membiarkan pembagian dengan 0?

a = 0
b = 20 / a
p b.to_s


Yang terjadi adalah:
Kutipdivided by 0

Andaikan saja memang tidak dapat dicegah bahwa pembaginya kadang-kadang bisa bernilai 0, kita bisa menggunakan bantuan Ruby untuk menangkap kesalahan yang mungkin terjadi. Istilah kerennya exception. Untuk itulah, blok begin ... rescue ... [ensure ...] end digunakan. Gimana cara pakainya?

begin
  # Lakukan apa saja yang dicurigai dapat menyebabkan error/exception di sini...
  # Bisa beberapa baris
rescue [<tipe exception> => <variabel bantu untuk menangkap exception>]
  # Lakukan apa saja yang akan terjadi andaikan terjadi error di sini...
[ensure]
  # Lakukan apa saja yang pasti harus dilakukan di sini, tidak peduli terjadi error atau tidak...
end


Langkah kerjanya begini. Ruby akan melakukan apa saja yang ada pada bagian begin. Andaikan di suatu tempat di bagian itu terjadi error, Ruby akan menghentikan diri (sehingga baris berikutnya dalam blok begin tidak akan pernah dijalankan) dan langsung lompat ke bagian rescue, kemudian menjalankan apapun yang ada di blok rescue. Jika ada blok ensure (blok ini boleh ada boleh tidak), selesai dari blok rescue Ruby akan menjalankan perintah pada blok ensure, tidak peduli apakah pernah terjadi error pada blok begin atau tidak.

Susah dimengerti? Nii contohnya...

begin
  a = 0
  b = 20 / a # (1) Baris ini salah!!! Ruby akan lompat ke...
  p b.to_s # ini tidak akan pernah dijalankan karena baris sebelumnya ada error.
rescue
  p "Salah oi!" # (2) ...sini!
  # Oh, ternyata tidak ada lagi yang dikerjakan di blok ini. Selanjutnya, Ruby akan mengerjakan...
ensure
  # (3) ...blok ini sampai selesai.
  a = 1 if a == 0
  b = 20 / a
  p "Hasil pembagian: " + b.to_s
end


Bagaimana hasilnya?
KutipSalah oi!
Hasil pembagian: 20

Coba kita ganti nilai variabel a ke angka lain selain 0.

begin
  a = 10
  b = 20 / a # Tadi dicurigai salah, kan? Ternyata tidak ada error!
  p b.to_s # Jadi, baris ini tetap dikerjakan.
  # Oh, selesai! Apa blok rescue tetap dikerjakan? Tentu saja tidak, kan tidak ada error!
rescue
  p "Salah oi!"
ensure
  # Tapi, Ruby akan tetap mengerjakan bagian ini.
  a = 1 if a == 0
  b = 20 / a
  p "Hasil pembagian: " + b.to_s
end


Hasilnya:
Kutip2
Hasil pembagian: 2
Ups, hasil pembagiannya tampil dua kali :P

Oke! Jadi kita sudah bisa memperkecil area kesalahan ke potongan kecil program kita yang dicurigai "bersalah". Tapi, apa guna teks-teks tambahan di belakang rescue itu? Kok tidak digunakan?
Judul: Tim penyelamat
Ditulis oleh: Èxsharaèn pada 04 September 2007, 01:42:47
Ada kalanya pula kita tahu persis jenis kesalahan (exception) yang mungkin terjadi, misalnya pembagian nol (ZeroDivisionError), salah tipe (TypeError), dan sebagainya. Kalau kita tahu persis jenis kesalahannya, kita boleh pakai format rescue <tipe error> => <variabel bantu untuk error>. Informasi kesalahan yang terjadi akan disimpan ke variabel bantu kita, sehingga kita bisa mengetahui beberapa informasi tambahan, seperti nama error, pesan kesalahan yang dibuat Ruby, baris berapa yang menyebabkan kesalahan, dan sebagainya. Kita boleh juga menggunakan beberapa blok rescue seperti berikut:

begin
  a = "sapi" # Coba ganti-ganti nilai variabel ini dengan angka biasa, 0, atau apapun.
  b = 20 / a
  p b.to_s
rescue ZeroDivisionError => zde # khusus untuk pembagian 0
  p "Salah oi! " + zde.message
rescue TypeError => tye # khusus untuk tipe data yang tidak sesuai
  p "Jangan pakai string dong!"
rescue Exception => exc # untuk error lainnya yang tidak kita ketahui
  p "Error apa ini ya? " + exc.message
ensure
  p "Program selesai!"
end


Lha jenis-jenis error tahu dari mana? Ada dua cara untuk mengetahui jenis-jenis error. Gunakan Ruby Doc, dan cari Error. Ada banyak kelas Error yang disediakan, tapi mungkin informasinya kurang lengkap. Cara lainnya, gunakan saja rescue Exception => ex dan tampilkan jenis kesalahan dengan kode p ex.inspect.. Hasilnya mungkin seperti ini:

Kutip#<TypeError: String can't be coerced into Fixnum>
Yang dicetak tebal adalah jenis error.

Nah, bisa kan sekarang mengurangi kesalahan yang mungkin terjadi pada program kita?
Judul: Daftar
Ditulis oleh: Èxsharaèn pada 04 September 2007, 07:47:25
Selagi kita membebaskan diri dari kesalahan program, ada dua tipe data (sebenarnya objek) khusus yang disediakan Ruby untuk berurusan dengan daftar.

Andaikan saja kita membuat program untuk memasukkan nama beberapa barang, anggap saja lima barang. Kita mungkin memulai program kita seperti ini:

p "Berapa barang?"
jum_brg = gets.chomp.to_i
for i in 1 .. jum_brg
  p "Nama barang " + i.to_s + ": "


Lha, nama barangnya disimpan di mana? Apa seperti ini?

p "Berapa barang?"
jum_brg = gets.chomp.to_i
for i in 1 .. jum_brg
  p "Nama barang " + i.to_s + ": "
  nama_brg = gets.chomp
end
# Tampilkan seluruh barang
for i in 1 .. jum_brg
  p "Nama barang " + i.to_s + ": " + nama_brg
end


Coba jalankan. Bagaimana hasilnya?

Kutip"Berapa barang?"
5
"Nama barang 1: "
Pensil
"Nama barang 2: "
Buku
"Nama barang 3: "
Penggaris
"Nama barang 4: "
Pena
"Nama barang 5: "
Kertas
"Nama barang 1: Kertas"
"Nama barang 2: Kertas"
"Nama barang 3: Kertas"
"Nama barang 4: Kertas"
"Nama barang 5: Kertas"

Lha kok Kertas semua? Mana barang yang lain?

Atau pakai cara ini? Kita sediakan banyak-banyak variabel, jadi nanti tinggal pakai satu per satu. Tapi, berapa banyak variabel yang harus kita sediakan? Nggak tahu juga kan kalau kasusnya seperti di atas?

Untuk itulah, kita akan mengenal satu kawan baru (objek sebenarnya, tapi kita bisa mempelajari objek ini tanpa belajar PBO dulu). Perkenalkan:

Array

Bahasa Indonesianya mungkin agak aneh: larik. Kita pakai array saja.

Array adalah objek khusus (di bahasa pemrograman lain mungkin bukan objek) yang bisa digunakan untuk menyimpan sebanyak-banyaknya variabel yang kita perlukan. Anggap saja kita punya banyak variabel seperti ini: nama_brg1, nama_brg2, nama_brg3, nama_brg4, nama_brg5. Kelima variabel tersebut bisa diwakili oleh satu array nama_brg yang berdimensi satu dengan ukuran 5.

Aduh, sudah ada dua istilah baru lagi: dimensi dan ukuran! Apa lagi nih?

Akan sangat mudah jika kita menganggap array adalah sebuah tabel. Anggap saja kita mempunyai tabel dengan penyimpanan data dilakukan menurun (per baris), sehingga nama 5 barang disimpan ke tabel berikut:

Pensil
Buku
Penggaris
Pena
Kertas


Jumlah kolom pada tabel tersebut adalah dimensi sebuah array, dan jumlah barisnya sama persis dengan ukuran array.

Ayo kita buat array pertama kita! Agak berbeda dengan variabel biasa, variabel array harus dideklarasikan terlebih dahulu (karena array adalah objek). Jadi, untuk menggunakan array, kita harus membuatnya terlebih dahulu dengan:

arrayku = Array.new
arrayku = Array.new(<ukuran>)

Baris pertama akan membuat sebuah array baru yang tidak punya ukuran. Baris kedua membuat array dengan ukuran tertentu. Kalau memang tahu ukuran array yang kita perlukan, disarankan pakai bentuk kedua saja.

Setelah dibuat, bagaimana caranya mengisi array kita? Nanti setelah diisi, cara mengaksesnya bagaimana?
Judul: Isi tabel, eh, array
Ditulis oleh: Èxsharaèn pada 17 September 2007, 11:55:24
Nah, untuk mengisi dan mengakses sebuah array, kita memerlukan indeks, yaitu sebuah bilangan bulat (integer) yang menunjukkan lokasi array yang ingin kita isi/akses. Gampangannya, pada tabel, indeks adalah nomor baris. Misalnya seperti ini:

arrayku[0] = "Sapi"
p arrayku[0] # hasilnya [color=red]"Sapi"[/color]


Tunggu dulu... kenapa pakai angka 0? Kenapa nggak 1 saja? Nah, inilah salah satu keanehan dunia pemrograman. Nyaris semua bahasa pemrograman yang memiliki array akan setuju bahwa indeks pertama yang dimiliki sebuah array adalah 0, bukan 1 (ini disebut zero-based array index). Ada alasan mengapa mereka menggunakan angka 0 sebagai indeks pertama, tapi untuk konsumsi kita cukup lah kalau indeks pertama array di Ruby adalah 0.

Awas! Karena dimulai dari 0, indeks tertinggi yang dimiliki sebuah array adalah ukurannya dikurangi 1. Lebih lanjut nanti, kita dapat mengetahui ukuran sebuah array dengan perintah <nama array>.size atau <nama array>.length.

Nah, setelah mengetahui kegunaan array, masalah kita pun terpecahkan! Programnya akan menjadi seperti ini:

p "Berapa barang?"
jum_brg = gets.chomp.to_i
nama_brg = Array.new(jum_brg)
for i in 0 ... jum_brg # perhatikan tanda titiknya!
  p "Nama barang " + (i + 1).to_s + ": "
  nama_brg[i] = gets.chomp
end
# Tampilkan seluruh barang
for i in 0 ... jum_brg
  p "Nama barang " + (i + 1).to_s + ": " + nama_brg[i]
end


Ayo dicoba!

Kutip"Berapa barang?"
5
"Nama barang 1: "
Pensil
"Nama barang 2: "
Buku
"Nama barang 3: "
Penggaris
"Nama barang 4: "
Pena
"Nama barang 5: "
Kertas
"Nama barang 1: Pensil"
"Nama barang 2: Buku"
"Nama barang 3: Penggaris"
"Nama barang 4: Pena"
"Nama barang 5: Kertas"

Mudah kan?
Judul: Multidimensi
Ditulis oleh: Èxsharaèn pada 17 September 2007, 12:30:37
Ada kalanya kita membutuhkan array yang lebih besar. Misalkan program tadi kita perluas untuk menerima masukan dari beberapa orang untuk memesan barang kesukaannya. Tentu saja, array kita jadi tidak cukup menampung semuanya. Ada dua pendekatan untuk ini:

1. Tetap menggunakan array satu dimensi, dengan ukuran jumlah orang dikalikan jumlah barang. Hanya saja, pendekatan ini akan gagal kalau tiap orang memiliki jumlah barang yang berbeda (ada yang bisa mengatasinya?).

2. Kita gunakan array berdimensi lebih besar, dalam kasus ini cukup berdimensi dua. Aduh, gimana bikinnya?
Agak berbeda dengan bahasa pemrograman lain, pada Ruby kita tidak bisa secara langsung mendefinisikan array multidimensi dari awal. Mau tidak mau, kita harus mendefinisikan array baru di setiap elemennya. Kasarannya seperti ini:

arrayku = Array.new(jumlah_baris)
for i in 0 ... jumlah_baris
  arrayku[i] = Array.new(jumlah_kolom)
end


Hati-hati, perintah Array.size tidak serta merta memberikan ukuran total array kita (yang diduga adalah jumlah baris dikalikan jumlah kolom), namun hanya mengembalikan ukuran array terluar saja (dalam kasus di atas adalah jumlah baris). Tidak percaya? Nii...

arrayku = Array.new(5)
for i in 0 ... 5 # sementara kita pastikan dulu jumlahnya 5
  arrayku[i] = Array.new(2)
end
# Ukuran array kita seharusnya 5 x 2 = 10 kan?
p arrayku.size

Hasilnya?
Kutip5

Ini terjadi karena sebenarnya array kita bukan array multidimensi, namun array yang "bersarang" dalam array lain (istilah kerennya nested array). Jadi, arrayku pada contoh di atas sebenarnya adalah array satu dimensi yang memiliki array satu dimensi di tiap elemennya. Walaupun demikian, kita bisa menganggapnya array multidimensi.

Lalu, cara aksesnya bagaimana? Jangan khawatir, nggak sulit kok. Karena kini array kita memiliki dimensi banyak, indeks yang diperlukan juga jadi banyak, tergantung jumlah dimensinya. Untuk array berdimensi dua, cukup gunakan arrayku[indeks1][indeks2]. Array dimensi tiga? Ya arrayku[indeks1][indeks2][indeks3]. Dan seterusnya.

Perlu dicoba? Ayo!

p "Berapa orang?"
jml_org = gets.chomp.to_i
nama_brg = Array.new(jml_org)
for i in 0 ... jml_org
  p "Orang " + (i + 1).to_s + ": Berapa barang?"
  jml_brg = gets.chomp.to_i
  nama_brg[i] = Array.new(jml_brg)
  for j in 0 ... jml_brg
    p "Barang " + (j + 1).to_s + ":"
    nama_brg[i][j] = gets.chomp
  end
end
# sekarang tampilkan masukan keseluruhan
for i in 0 ... nama_brg.size
  p "Orang " + (i + 1).to_s
  for j in 0 ... nama_brg[i].size
    p "Barang " + (j + 1).to_s + ": #{nama_brg[i][j]}"
  end
end


Hasilnya:
Kutip"Berapa orang?"
2
"Orang 1: Berapa barang?"
3
"Barang 1:"
Kursi
"Barang 2:"
Meja
"Barang 3:"
Papan tulis
"Orang 2: Berapa barang?"
2
"Barang 1:"
Buku
"Barang 2:"
Pena
"Orang 1"
"Barang 1: Kursi"
"Barang 2: Meja"
"Barang 3: Papan tulis"
"Orang 2"
"Barang 1: Buku"
"Barang 2: Pena"

Tidak sesulit yang dibayangkan!

Tapi tunggu, ada yang aneh di program di atas... Apa ini?
    p "Barang " + (j + 1).to_s + ": #{nama_brg[i][j]}"

Ini adalah jalan pintas untuk menuliskan nilai suatu variabel dalam string, jadi kita tidak perlu memanggil perintah to_s. Formatnya adalah #{nama_variabel}. Tapi ingat, ini hanya berlaku kalau string-nya menggunakan tanda kutip ganda, dan tidak semua variabel bisa diakses dengan cara ini. Coba deh ganti kode itu menjadi:
    p "Barang #{(j + 1)}: #{nama_brg[i][j]}"
dan lihat hasilnya!

Oke! Itu saja tentang array! Lebih banyak lagi tentang array akan kita kupas di topik selanjutnya. Tapi tunggu, ada satu bentuk khusus dari array...

EDIT:
Aduh, maaf, aku lupa kalau [ i ] itu BBCode untuk mencetak miring :P koreksinya sudah aku berikan di atas, yaitu:
untuk mengakses array dua dimensi: arrayku[indeks1][indeks2]
untuk mengakses array tiga dimensi: arrayku[indeks1][indeks2][indeks3]
Ada kebiasaan sih bahwa variabel penghitung (counter) itu namanya i, j, dan k :P
Judul: Hash
Ditulis oleh: Èxsharaèn pada 01 April 2008, 01:53:02
Wah, sudah lama juga yah aku nggak nulis di sini, padahal materinya tinggal satu :P

Yuk dilanjutkan! Setelah artikel ini selesai, kita bisa melanjutkan ke artikel berikutnya, yaitu PBO (http://forum.rpgfantasy.web.id/index.php?topic=167.0).

Jadi, apa satu bentuk spesial dari array?

Hash

Pengguna PHP pasti familiar dengan istilah ini. Hash pada Ruby sejatinya juga array juga, namun ada perbedaannya. Kalau pada array kita hanya bisa mengindeks menggunakan angka (0, 1, 2, bahkan angka negatif diizinkan di Ruby), hash mengizinkan kita mengindeks menggunakan hampir apapun. Wah, gimana caranya? Niii...

# Inisialisasi awal...
hashku = Hash.new
# atau...
hashku_yang_lain = {}


Lalu, masukkan nilainya? Mirip array kok. Misalkan saja kita ingin punya daftar orang dan binatang peliharaannya, itu bisa dimasukkan ke dalam hash seperti berikut:

pet = {}
pet["Adi"] = "Kucing"
pet["Budi"] = "Anjing"
pet["Charlie"] = "Ikan"
# Istilah kerennya...
hash[key] = value


Hmm... lalu, cara aksesnya? Kalau mau akses satu-satu per elemen, bisa dengan cara ini:

p pet["Adi"] # "Kucing"

Lha kalau mau semuanya? Di sini kelemahan hash, isinya tidak diurutkan, jadi kita harus tahu kuncinya (key). Tapi nggak masalah kan, bukannya kita memang sudah tahu kuncinya?

OK, andaikan saja kita dipaksa menampilkan isi hash tersebut, kita bisa gunakan dua metode milik objek Hash, yaitu Hash.keys untuk mengetahui semua kunci yang dimiliki sebuah hash, dan Hash.values untuk mengetahui semua nilai yang dimiliki sebuah hash. Misal, untuk hash kita di atas...

for key in pet.keys
  p "#{key} memiliki binatang peliharaan {#pet[key]}"
end


Hasilnya:

Kutip"Charlie memiliki binatang peliharaan Ikan"
"Budi memiliki binatang peliharaan Kucing"
"Adi memiliki binatang peliharaan Anjing"

OK! Silakan bermain-main sendiri dengan array dan hash. Artikel ini selesai sampai di sini (yay!). Dengan pengetahuan dasar yang sudah didapat dari artikel ini, kita sudah bisa membuat program sendiri. Namun, ada satu lagi pengetahuan yang sebaiknya didapat supaya kita bisa beradaptasi dengan segala macam bahasa pemrograman, yaitu Pemrograman Berbasis Objek (http://forum.rpgfantasy.web.id/index.php?topic=167.0). Lanjutkan di artikel itu yah!

Selamat mencoba-coba!
Judul: geMasTIK 2009 Programming Contest: No 1
Ditulis oleh: Èxsharaèn pada 30 Agustus 2009, 02:24:05
Berikut aku tuliskan beberapa contoh soal lomba pemrograman, salah satunya adalah geMasTIK (http://www.gemastik.com/2009/index.php?categoryid=11) 2009.

Ini adalah soal nomor 1, yang sayangnya sudah ada di Internet. Soal aslinya bisa dilihat di sini (http://acm.uva.es/p/v7/706.html), sementara salah satu jawabannya (dalam C++) ada di sini (http://snippets.dzone.com/posts/show/5244).

Problem 1: LCD Display
Tampilan angka atau huruf pada papan peraga digital merupakan masalah yang menarik untuk diprogram. Pada masalah ini, anda hanya diminta menampilkan angka digital saja. Angka disusun oleh segmen "-" dan segmen "|". Tulislah program yang menampilkan bilangan (barisan angka) dalam gaya LCD display.

Input:
Masukan dibaca dari file. File terdiri dari beberapa baris, pada tiap baris terdapat bilangan yang akan ditampilkan. Tiap baris berisi integer s dan integer n, dimana n adalah bilangan yang ditampilkan (0 <= n <= 99.999.999) dan s adalah ukuran angka yang ditampilkan (1 <= s <= 10). File masukan ditandai dengan baris terakhir yang berisi dua buah angka 0 untuk mengakhiri pembacaan. Dua buah nol ini tidak diproses.

Output:
Setiap angka dicetak dalam gaya LCD display dengan menggunakan s buah karakter "-" untuk segmen horizontal dan s buah karakter "|" untuk karakter vertikal. Tiap angka membutuhkan tepat s + 2 kolom dan 2s + 3 baris. Setiap angka dipisahkan oleh satu spasi, dan setiap output bilangan dipisahkan oleh satu baris kosong.

Sample Input:
2  12345
3  67890
0  0

Sample Output
   --  --        --
|    |   | |  | |
|    |   | |  | |
   --  --   --   --
| |      |    |    |
| |      |    |    |
   --  --        --

---  ---   ---   ---   ---
|        | |   | |   | |   |
|        | |   | |   | |   |
|        | |   | |   | |   |
---        ---   ---
|   |    | |   |     | |   |
|   |    | |   |     | |   |
|   |    | |   |     | |   |
---        ---   ---   ---


Coba dijawab dulu ;)

[spoiler=Petunjuk]
Salah satu pendekatannya seperti ini. Secara umum, karakter LCD itu dibentuk dari 7 garis tegak dan mendatar seperti berikut:

-0-
|   |
1   2
|   |
-3-
|   |
4   5
|   |
-6-


Contoh! Angka 0 dibentuk dari garis 0, 1, 2, 4, 5, dan 6. Angka 1 dibentuk dari garis 2 dan 5. Demikian seterusnya. Nah, pembentukan karakter ini bisa kita simpan dalam sebuah Hash :) misalkan saja formatnya seperti ini:

karakter => [Array berukuran 7 yang memuat informasi garis yang terpakai untuk membuat karakter tersebut]

Secara urut, isi elemen array dengan angka 1 jika garis itu digunakan. Kalau tidak, isi dengan 0.

Misalnya:

"0" => [1, 1, 1, 0, 1, 1, 1]

berarti angka "0" memerlukan garis 0, 1, 2, 4, 5, dan 6. Garis 3 tidak diperlukan karena nilainya 0.

Nah, dengan pendekatan ini, coba buat programnya :) jika mau, teruskan untuk karakter huruf ;)
[/spoiler]