Kamis, 31 Desember 2015

Matematika - Logika Perkalian 5

Matematika sebenarnya merupakan ilmu yang menyenangkan untuk diulik. Dengan melakukan eksperimen-eksperimen kecil, kita akan mendapatkan hasil yang cukup memuaskan walaupun untuk diri kita sendiri. Dari eksperimen tadi, kita akan mengetahui fakta-fakta baru serta secara tidak langsung meningkatkan logika kita. Yang akan saya bahas kali ini merupakan logika perkalian angka 5. Adapun kebenarannya saya dapatkan hasil eksperimen sendiri.

Bagaimana cara menghitung cepat 92.398.293.649 x 5? Atau 92.398.293.649 x 5.555? Kita akan mendapatkan jawabannya dari eksperimen!

Angka 5 merupakan bilangan yang menurut saya spesial. Karena perkalian serta pembagian dengan angka ini terasa ringan. 5 merupakan setengah dari 10, benar? Sehingga di dapat logika, N x 5 = (N x 10) : 2. Dengan mengalikan N ke 10, kita akan mempermudah proses pengerjaan. Contoh kasus dimulai dari yang kecil, 129 x 5?

   129
       5
   ------- x
   645
Coba kita gunakan (N x 10) : 2.

129 x 10 = 1290
1290 : 2 = 645
 ^ ^
 6 45
Lebih cepat ketimbang mengalikan satu-satu dengan 5 bukan? Kita coba dengan angka yang lebih besar yaitu 92398293649 x 5.

92398293649 x 10 = 923982936490
9  2  3  9  8  2   9   3  6  4  9  0 : 2 = 461991468245
^   ^  ^  ^  ^  ^   ^   ^   ^   ^   ^  ^
4  6  1 9   9   1  4   6  8  2 4  5
Lihat, cara ini tidak membutuhkan resource otak yang besar. Yang ini masih kurang jelas? Oke saya jabarkan lebih lanjut:

92398293649 x 10 = 923982936490
923982936490 : 2
-----------------------------
[1] Ambil yang paling depan yaitu 9. Kemudian bagi 2. Hasilnya 4, dengan sisa 1.
[2] Letakan sisa 1 lalu ambil angka berikutnya, yaitu 2. Sehingga menjadi 12 lalu bagi 2, hasilnya 6, sisanya 0.
[3] Letakan sisa 0 lalu ambil angka berikutnya, yaitu 3. Sehingga menjadi 03 lalu bagi 2, hasilnya 1, sisanya 1.
[4] Letakan sisa 1 lalu ambil angka berikutnya, yaitu 9. Sehingga menjadi 19 lalu bagi 2, hasilnya 9, sisanya 1.
[n] Dan seterusnya. Sama halnya dengan pembagian biasanya. Hanya saja yang satu ini melakukan pembagian cepat menggunakan otak.
------------------------------
Hasilnya 461.991.468.245
Lihat angka yang saya beri warna biru, itu merupakan angka yang dihasilkan dari contoh kasus pembagian cepat di atas. Sudah mulai panas? Ayo lanjut ke yang lebih ekstrim! 92398293649 x 5555.
Logikanya? Oke saya buatkan tabel seperti di bawah:

AngkaRumus JadiLogika
5(N x 10) : 210 = 2x5. Maka 10N = 2 sehingga 10N:2
50(N x 100) : 2100 = 2x50. Maka 100N = 2 sehingga 100N:2
500(N x 1000) : 21000 = 2x500. Maka 1000N = 2 sehingga 1000N:2
5000(N x 10000) : 210000 = 2x5. Maka 10000N = 2 sehingga 10000N:2
5 x (N digit 0)(N x (1 x (N + 1 digit 0))) : 2(1 x (N + 1 digit 0)) = 2x(5 x (N digit 0)). Maka (1 x (N + 1 digit 0))N = 2 sehingga (1 x (N + 1 digit 0))N:2

Logika dari 5555 yaitu 5000 + 500 + 50 + 5, benar? Maka, kita terapkan (N x 10000):2 + (N x 1000):2 + (N x 100):2 + (N x 10):2.

Pertama, cari yang paling kecil. Yaitu (N x 10):2.
92398293649 x 10 = 923982936490
9  2  3  9  8  2   9   3  6  4  9  0 : 2 = 461991468245
^   ^  ^  ^  ^  ^   ^   ^   ^   ^   ^  ^
4  6  1 9   9   1  4   6  8  2 4  5

Sehingga berikutnya hanya perlu menambahkan N-1 0 digit dibelakang sebanyak rumus.
(N x 10):2 = 461991468245
(N x 100):2 = 4619914682450
(N x 1000):2 = 46199146824500
(N x 10000):2 = 461991468245000

Berikutnya, jumlahkan semua.
   461991468245000
     46199146824500
       4619914682450
         461991468245
--------------------------------- +
   513272521220195
Ya, selesai! Coba hitung dengan kalkulator. Hasilnya pasti sama! Lihat, kita sudah berhasil mengerjakan soal ekstrim tanpa kalkulator dengan cepat. Jadi, 92.398.293.649 x 5.555 = 513.272.521.220.195

Mudahnya, logika dari ini yaitu:

N x (5 x  (10^(M-1))) = 2/2
(N:2) x (5 x (10^(M-1))) x 2
(N:2) x (2(5 x (10^(M-1)))) = (N x (2(5 x (10^(M-1))))):2

Dimana, N = Bilangan yang akan Dikali. Dan, M = Jumlah Digit Pengali. Misal, N = 92398293649. Dan, M = 50 (ada 2 digit).
Sehingga:

N x (5 x (10^(M-1))) = 2/2
92398293649 x  (5 x (10^(2-1)) = 2/2
92398293649 x (5 x 10) = 2/2
(92398293649):2 x (50 x 2)
(92398293649):2 x 100 = (92398293649 x 100):2
=> 4619914682450

Partial Method

Partial method sendiri saya tidak tahu sudah ada atau belum. Namun, saya namakan partial method karena kita akan membagi-bagi bilangan menjadi beberapa bagian. Seperti contoh, 1920 jika dibuat partial akan menjadi 1000 + 900 + 20 + 0. Cara ini sangat berguna untuk menghitung angka-angka menyebalkan seperti desimal. Contoh kasus, berapa 178 x 4.5? Menyebalkan bukan?

Mari kita gunakan partial method untuk mencari solusinya.

4.5 = 5 - 0.5

Maka:
178 x 5 = 1780:2 = 890

Ada 0.5 tuh. Caranya? 0.5 itu kan 5:10. Berarti, sama dengan logika perkalian 5, hanya saja hasilnya dikurangi dari digit dibelakang koma. Dari 0.5 ada 1 digit dibelakang koma. Sehingga, 178 x 5 = 1780:2 = 890:(10 x N digit dibelakang koma) = 890:10 = 89.

Jadi:
4.5 = 5 - 0.5
890 - 89 = 801
Untuk tabel logika perkalian 5 desimal ada di bawah. Peringatan! Angka di depan harus lah bilangan 0. Jika tidak, maka pisahkan dulu dengan partial method. Angka yang didapat seharusnya hanya 0 dan atau 5. Seperti, 5, 50, 500, 0.5, 0.05, dst.

AngkaRumus JadiLogika
0.5N : 20.5 = 1:2. Maka N = 2 sehingga N:2
0.05(N : 2) : 100.05 = (1:2):10. Maka N:10 = 2 sehingga N:20
0.005(N : 2) : 1000.005 = (1:2):100. Maka N:100 = 2 sehingga N:200
0.0005(N : 2) : 10000.0005 = (1:2):1000. Maka N:1000 = 2 sehingga N:2000
5 : (N dgit dibelakang koma)(N : 2) : 10 ^ (N digit dibelakang koma - 1)N : (2 x 10 ^ (N digit dibelakang koma - 1))

Pusing? Sama!

Kesimpulan

Gunakanlah partial method untuk memudahkan penyelesaian masalah. Jika yang dihadapi angka 5. Cukup gunakan logika di atas untuk mempercepat perhitungan. Awalnya memang menghitungnya butuh waktu karena otak kita sedang menyesuaikan logika baru. Jadi, sering lah latihan dan gunakan logika ini. Nanti, kita akan terbiasa.

Perkalian 5:
N x 10 ^ (digit perkalian) : 2
Perkalian 5 Desimal:

N : 2 x (10 ^ (digit perkalian - 1))
 Parital Method:

Pecah bilangan lalu tambahkan.
=> 3234 = 3000 + 230 + 30 + 4

 Penutup

Ilmu merupakan sesuatu yang tidak ada habisanya. Semakin banyak kita memperoleh ilmu, maka kita akan semakin merasa tidak punya apa-apa. Karena itu lah, ilmu sangat luas dan ilmu ingin kita pelajari. Maka gunakan lah waktu yang ada untuk mencari ilmu. Jangan kita sia-sia kan waktu kita untuk hal yang tidak bermanfaat. Eksperimen kecil dapat mengubah pandangan kita serta dapat meningkatkan pemahaman kita. Maka dari itu, mulai lah bereksperimen dan melakukan uji coba!

Tulisan ini bisa saja mengandung kesalahan. Karena itu, mohon dikoreksi dan dimaklumi serta dimaafkan. Karena saya hanya lah manusia biasa yang mencoba untuk menjadi penulis. Terima kasih.

Matematika - Logika Gauss dalam Barisan dan Deret


Johann Carl Friedrich Gauß (juga dieja Gauss) merupakan salah satu ilmuwan yang terkenal karena di dalam bidang Matematika karena penemuannya, yaitu rumus barisan dan deret. Dalam tulisan ini, saya akan bahas penyelesaian kasus barisan dan deret hanya dengan logika. Kita gunakan logika yang digunakan Gauss sewaktu menemukan rumus barisan dan deret.

Dalam barisan deret 1 hingga 100. Terdapat 100 buah bilangan yang nilainya berurut. Karena berurut, kita dapat dengan mudah menyelesaikannya. Mari kita hitung 1+2+3+..100 dengan logika Gauss.

Diberikan N bilangan sebanyak 100 buah, yaitu 1,2,3,...,100.

N = 1,2,3,4,5,6,7,8,9,10,...,48,49,50,51,52,...,91,92,93,94,95,96,97,98,100
Karena bilangan berurut, mari kita jumlahkan N dengan M. Dimana M merupakan N yang dibalik.

M = 100,99,98,97,96,95,94,93,92,91,...,52,51,50,49,48,...,10,9,8,7,6,5,4,3,2,1
Setelah dijumlahkan, ternyata setiap bilangan jumlahnya sama.

N+M = 101,101,101,...,101
Berapa banyak suku yang dimiliki N+M? Tentu saja 100. Masing-masing suku bernilai sama yaitu 101. Karena berjumlah 100 buah, mari kita kalikan. Diberikan H sebagai hasil akhir.

H = 101 x 100
H = 10100
Berikutnya, bagi H dengan 2. Kenapa? Karena pada awal, kita menjumlahkan N+M, dimana N dan M merupakan bilangan yang sama namun pada M kita membalikannya. Jadi, secara logika, N+M:2 = H.

H = 10100:2
H = 5050
Jika kita menggunakan rumus barisan dan deret.

Sn = n/2(2a + (n-1)b)
S100 = 50(2 + 99)
S100 = 50(101)
S100 = 5050

Keterangan:
Sn = Banyaknya jumlah n bilangan dari barisan
n = Banyaknya bilangan (suku)
a = Angka dimulainya barisan
b = Perbedaan jarak antar angka dalam barisan
Lihat, hasilnya sama! Di dalam rumus itu terdapat N:2. Dari perhitungan manual di atas, kita juga membagi 2 hasil akhir. Bedanya, di dalam rumus ini yang dibagi merupakan jumlah suku atau jumlah banyaknya bilangan.

H = (n(2a + (n-1)b))/2
H = (100(2 + 99))/2
H = (100(101))/2
H = 10100/2
H = 5050
Jika kita ubah sedikit rumusnya, maka dengan sangat jelas seperti pengerjaan manual di atas.

Sudah ada rumus yang tersedia, tapi kenapa masih menghitung manual?

Penutup

Memang benar untuk apa menghitung manual jika sudah ada rumus. Tapi, memangnya mau menghafal rumus-rumus? Di matematika ada banyak sekali rumus. Jika dihafalkan tentu saja tidak efisien. Salah satu cara terbaik adalah memahami konsep serta logika dari rumus tersebut. Kenapa bisa terbentuk rumus seperti ini? Itulah yang kita pahami dari tulisan ini. Jika kita paham konsepnya, sudah jelas kita akan ingat bagaimana cara penyelesaiannya tanpa harus menghafal rumus karena secara tidak langsung kita mengerjakannya seperti menggunakan rumus. Bahkan, dalam beberapa kasus kita mengharuskan menggunakan konsep atau logikanya ketimbang menggunakan rumus yang ada.

Demikian tulisan yang membahas sedikit tentang logika Gauss dalam barisan dan deret. Tulisan ini bisa saja mengandung kesalahan. Karena itu mohon dikoreksi dan dimaklumi serta dimaafkan. Akan saya perbaiki ketika ada kesalahan. Saya hanyalah orang yang mencoba untuk menjadi penulis. Saya juga masih belajar. Terima kasih.

PHP - Kompleksitas Kode untuk Keluaran


PHP merupakan salah satu bahasa yang sangat populer di Indonesia. Dan tulisan ini saya buat untuk semua kalangan developer yang memcari efisiensi penulisan kode serta kompleksitasnya sehingga waktu eksekusi dapat dioptimalkan.

Data yang saya dapat berasal dari hasil melakukan eksperimen dengan bantuan alat PHP Profiler. Adapun yang saya gunakan yaitu Blackfire. Setelah melakukan banyak eksperimen dengan function print, printf, dan echo. Dengan pertimbangan banyak aspek tes seperti melakukan keluaran dengan big number (integer) yang terdiri dari 19 digit serta karakter huruf a-z yang terdiri dari 260 karakter.

Apa saja yang akan diuji? Saya akan uji beberapa tipe data seperti integer, string, dan array. Serta manipulasi variable dan mixing data type.

Integer

Untuk tipe data integer, dari hasil tes yang saya lakukan, sebaiknya gunakan print atau printf. Adapun waktu tercepat diperoleh oleh printf dengan beberapa ketentuan. Apakah Anda mengenal data type convertion di dalam bahasa C? Dengan menggunakan itu, kita akan mempercepat eksekusi kode. Caranya sangat mudah, tambahkan saja "(int)" di depan angka yang kita definisikan. Semisal:

$var = (int) 1;

Berbeda jika tanpa (int), kecepatan eksekusi berkurang, kenapa? Saya memiliki hipotesis seperti ini, "Tipe data di dalam PHP asumsikan saja umum, jika kita mendefinisikan tipe data-nya, maka kita mempercepat eksekusi waktunya". Kenapa? Jika tipe data tidak di definisikan, maka PHP akan mendefinisikannya untuk kita sehingga memerlukan waktu lagi. Karena itu, jika tipe data tersebut selalu sama dalam contoh kasus integer, maka tambahkan/gunakan (int) di depannya.
Untuk penggunaan kode-nya, bisa dilihat seperti ini.

print (int) 0123456789;
printf((int) 0123456789);
$var = (int) 0123456789;
print $var;
printf("%d", $var);

String

Berbeda dengan integer, tipe data string memiliki banyak aturan untuk efisiensi eksekusi waktunya. Tapi, secara umum tipe data string sudah cukup cepat jika menggunakan print atau echo. Sama halnya dengan integer yang menggunakan data type convertion (int), string juga akan lebih cepat jika menggunakan (string). Namun, jika menggunakan (string) sebaiknya saat penggunaan kutip satu (') saja. Penjelasan penggunaannya supaya efisien sebagai berikut.

print 'keluaran';
echo 'keluaran'; # sebaiknya gunakan echo
print (string) 'keluaran'; # sebaiknya gunakan print
echo (string) 'keluaran';
print "keluaran";
echo "keluaran"; # sebaiknya gunakan echo

Untuk variabel string, penggunaannya supaya efisien sebagai berikut.

$var = 'keluaran';
print $var;
echo $var; # sebaiknya gunakan echo
$var = "keluaran";
print $var;
echo $var; # sebaiknya gunakan echo
$var = (string) 'keluaran';
print $var;
echo $var; # sebaiknya gunakan echo
$var = (string) "keluaran";
print $var;
echo $var; # sebaiknya gunakan echo

Untuk fungsi printf, gunakan apabila kasusnya seperti ini saja.

$var = "keluaran";
printf("%s", $var);

Kesimpulan untuk tipe data string, sebaiknya gunakan echo saja.

echo 'keluaran'; # jika hanya string tanpa variabel, gunakan kutip satu saja
echo "keluaran $var"; # jika dengan variabel, gunakan kutip dua seperti ini saja

Array

 Tes ini dilakukan dengan array yang total isinya 1.000 index. Ada 2 cara penulisan array, yaitu.

array(...); # dengan function array
[...]; # dengan simbol []

Dari dua cara di atas, sebaiknya gunakan simbol [] untuk mendefinisikan array. Karena penggunaan [] lebih ringan dibandingkan dengan array().
Di dalam bermain array, untuk looping sebaiknya gunakan foreach. Dari hasil tes yang saya lakukan dengan array yang memiliki 1.000 index, function foreach yang memiliki kecepatan tertinggi dalam proses eksekusinya.

Peringatan! foreach yang terbaik apabila hanya digunakan untuk menampilkan data dari array. Namun, jika untuk melakukan modifikasi isi array, tentu saja berbeda.

$array = [0,1,2,3,..,1000]; # array berjumlah 1.000 index
foreach($array as $value) ...; # jika hanya ingin mengambil isi array
foreach($array as $key=>$value) ...; # jika ingin mengambil index serta isi array
# untuk mengambil index/keys pada array lalu melakukan manipulasi, sebaiknya gunakan
$keys = array_keys($array);
foreach($array as $value) lebih cepat dibandingkan dengan foreach([...] as $value)

Kesimpulan untuk tipe data array, dalam kebutuhan untuk keluaran, foreach merupakan yang terbaik. Untuk kecepatan, foreach($var as $new_var) lebih cepat dibandingkan dengan foreach([1,2,3,..,n] as $new_var).

Kesimpulan

Berbeda tipe data juga berbeda penanganannya untuk keluaran. Untuk int, print merupakan pilihan terbaik. Namun untuk str, echo-lah yang terbaik. Sementara untuk array, foreach lebih baik daripada penggunaan for dan while dalam kasus looping.

Penutup

Tulisan yang membahas kompleksitas serta efisiensi penulisan kode untuk PHP ini telah selesai. Tulisan yang dibuat bisa saja terdapat kesalahan, maka dari itu apabila menemukan kesalahan pada tulisan ini, saya berharap dapat dikoreksi bersama. Bukan bermaksud menggurui, saya hanya berbagi pengalaman yang saya dapatkan. Terima kasih.

Free Pascal - Tips untuk Kode yang Lebih Baik


Di dalam bahasa pemrograman apapun, dikenal dengan faster code dan smaller code. Adapun tujuannya yaitu untuk mendapatkan kompleksitas kode yang baik sehingga ukuran kode ringan serta cepat. Berikut ini tips yang diberikan langsung oleh Michaël Van Canneyt yang merupakan pembuat buku referensi untuk Free Pascal Programmers.

Better Algorithm

Di dalam penyelesaiannya kasus-kasus dengan Free Pascal, tentu dapat dilakukan dengan banyak cara. Semisal yang satu dengan yang lainnya berbeda dalam penyelesaian kasus 1. Dimana si A melakukannya dengan if statement sementara si B menggunakan switch-case atau case-of. Dan tentu saja kompleksitas-nya berbeda-beda tergantung dari kasus serta penulisan kode.
Semisal, ada kasus, identifikasi bilangan lalu cetak apakah itu satuan, puluhan, ratusan, atau ribuan. Dalam hal ini, mulai lah si A dan si B menulis sebuah program.

Si A:

program Identifikasi;
var i: Integer;
begin
  i := 1030;
  if i < 9 then writeln('satuan')
    else if i < 99 then writeln('puluhan')
      else if i < 999 then writeln('ratusan')
        else writeln('ribuan');
end.
Si B:

program Identifikasi;
var i: Integer;
begin
  i := 1030;
  case i of
    0..9: writeln('satuan');
    10..99: writeln('puluhan');
    100..999: writeln('ratusan');
    else
      writeln('ribuan');
  end;
end.
Kedua program tersebut hasilnya akan sama. Namun mana yang lebih baik dan lebih cepat? Dari segi kompleksitas kode, tentu saja lebih baik si B. Jadi, mulai lah mempelajari tentang kompleksitas kode dan terapkan ke dalam kode yang kita tulis. Cari penyelesaian kasus dengan algoritma yang terbaik.

Tilik Processor Dependency

Setiap processor, misal i386 atau amd64, memiliki keunggulan dan kekurangan masing-masing. Itu semua berpengaruh kepada variabel (tipe data) yang akan kita pilih. Semisal, kita menggunakan Free Pascal dengan processor amd64 (64-bit). Maka, longword dan longint direkomendasikan sebagai pilihan terbaik.

Larangan

Penulis yang memberi tips ini mengatakan bahwa ansistrings, widestrings, dan exception support membutuhkan lebih banyak resource yang membuat code over-head. Selain itu, penggunaan cdecl modifier juga tidak disarankan.

Bermain dengan FPC

FPC (Free Pascal Compiler) memiliki banyak optional parameter yang dapat dimanfaatkan untuk kebutuhan seperti ini. Untuk menganalisis kode kita, fpc mendukung paramter -pg untuk mencari mana yang menghabiskan banyak resource. Kemudian, kita dapat mengubahnya ke bahasa assembly supaya mendapatkan hasil yang optimal. Selain itu, kita disarankan untuk menggunakan parameter -Og pada fpc.

Penutup

Masih banyak cara yang dapat digunakan untuk menghemat resource serta mempercepat kode. Namun, karena keterbatasan ilmu saya sehingga saat ini hanya tulisan ini yang dapat mewakili. Saya hanyalah manusia biasa yang mencoba untuk menjadi penulis. Jika ada kesalahan mohon dikoreksi dan kemudian akan saya perbaiki. Terima kasih.

Free Pascal - Memulai Masuk ke Dunianya


Free Pascal merupakan salah satu bahasa pemrograman favorit dalam kompetisi yang menggunakan bahasa pemrograman. Syntax kode-nya mudah dibaca sehingga bahasa ini menjadi pilihan di Indonesia. Katanya, Free Pascal mudah dipelajari karena itu dalam soal OSN Komputer tingkat Kabupaten dan Provinsi menggunakan Free Pascal sebagai pseudo-code-nya. Dalam tulisan ini, saya akan bahas bagaimana memulai belajar bahasa Free Pascal. Sebenarnya, nama bahasa pemrograman ini Pascal, namun kita menggunakan Free Pascal sebagai compiler-nya. Selain Free Pascal, ada Turbo Pascal yang populer di sistem opersi Windows. Kenapa kita belajar Free Pascal? Karena dalam sistem judment tokilearning.org menggunakan Free Pascal. Sehingga lebih baik pelajari Free Pascal yang digunakan di dalam semua sistem judment.

Secara umum, untuk mengenal sebuah bahasa pemrograman, kita akan mulai dengan sedikit sejarah bahasa pemrograman tersebut. Kemudian berlanjut ke materi input/output, if statement, looping, lalu sedikit tentang function (method).

Sejarah

Pengembang utama Free Pascal adalah Florian Klämpfl. Ia menulis compiler ini dengan bahasa Object Pascal dan Assembly. Veris 1.0 dirilis pada bulan Juli 2000. Nama Free Pascal Compiler disebut dengan fpc yang kini (31 Desember 2015) telah menginjak versi 2.7.1.

Struktur Umum Kode

Di dalam Free Pascal, secara umum struktur kode-nya terdiri dari nama program (program), variabel (var), pembuka (begin), dan penutup (end.). Namun terkadang ada juga yang menambahkan fungsi definisi untuk compiler (uses). Jika dibuat, maka struktur seperti ini:

program ...; // ... diisi dengan nama program, tanpa spasi
uses ...; // ... diisi dengan module compiler yang ingin digunakan, ini optional, boleh tidak digunakan
var ...: ...; // ...: ... diisi dengan "nama variabel": "tipe data"
begin // pembuka
... // ... isi kode yang akan dijalankan
end. // penutup

Komentar

 Dalam bahasa pemrograman, ada yang namanya komentar. Komentar merupakan bagian yang diabaikan oleh compiler, sehingga apapun yang kita tulis tidak akan berpengaruh. Di dalam Free Pascal, kita dapat gunakan:

(* Ini Komentar *)
{ Ini Komentar }
// Ini Komentar
Perbedaan dari ketiga-nya yaitu untuk // hanya mengabaikan 1 baris. Sementara (* *) dan { } akan mengabaikan sebanyak apapun dari pembuka (* atau { hingga penutup } atau *).

Input/Output

Untuk masukan berupa variabel di dalam bahasa Free Pascal kita dapat gunakan perintah var. Kemudian diikuti dengan nama variabel serta tipe data-nya. Setelah itu, barulah kita berikan masukan. Sebagai contoh, saya akan buat variabel dengan nama "angka" serta dengan tipe data Byte. Secara umum, penulisannya seperti ini:

var angka: Byte = 5;
// atau
var angka: Byte;
begin
  angka := 5;
end.
Lalu, untuk keluaran, yang biasa digunakan merupakan write atau writeln. Write untuk menulis, serta writeln untuk menulis di satu baris tersendiri. Keduanya hanya mau diberi kutip satu ('). Jika diberikan kutip dua (") maka akan muncul error dan kode tidak di compile. Secara umum penulisannya seperti ini:

write('A');
write('B');
// maka keluaran: AB
writeln('A');
writeln('B');
// maka keluaran:
// A
// B
writeln(angka); // Asumsikan angka telah didefinisikan di atas
// maka keluaran:

// 5
Keduanya juga dapat ditulis kosong seperti ini:

write;
writeln;

If Statement

Di dalam bahasa pemrograman, sangat erat dengan yang namanya logical expression. Nah, hal tersebut bersangkutan dengan if statement. Bisa dibilang, if statement merupakan hal wajib ada sama halnya dengan input/output. Di dalam Free Pascal, penggunaan if statement secara umum seperti ini:

if kondisi then perintah;
Untuk 1 perintah, sebaiknya gunakan if-then dalam satu baris. Atau bisa juga:

if kondisi then
  perintah;
Dan untuk lebih dari 1 perintah, bisa gunakan if-then-begin-end seperti ini:

if kondisi then
begin
  perintah;
  perintah;
  // ...
end;

If digunakan untuk mencari nilai benar. Misal, if kondisi = ketentuan. Jika kondisi sama dengan ketentuan, maka akan bernilai benar dan kode di bawah if tersebut akan dieksekusi. Lalu, bagaimana jika bernilai salah? Kode dalam if tidak akan dieksekusi, namun akan berjalan ke else apabila didefinisikan.

if kondisi = ketentuan then
  perintah // jika bernilai benar
else
  perintah; // Jika bernilai salah
Jika perintahnya lebih dari 1, maka penggunaannya seperti ini:

if kondisi = ketentuan then
  begin
    // perintah...
  end
else
  begin
    // perintah...
  end;
"=" di dalam kode tersebut disebut ekspresi. Lalu, apa saja yang dapat kita gunakan di dalam Free Pascal?
Secara umum, kita dapat gunakan apa yang ada di tabel untuk ekspresi.

EkspresiPenjelasan
=Sama dengan. Apabila kondisi sama dengan ketentuan maka benar
>Lebih dari. Apabila kondisi lebih dari ketentuan maka benar
>=Lebih dari sama dengan. Apabila kondisi lebih dari sama dengan ketentuan maka benar
<Kurang dari. Apabila kondisi kurang dari ketentuan maka benar
<=Kurang dari sama dengan. Apabila kondisi kurang dari sama dengan ketentuan maka benar
<>Tidak. Apabila kondisi tidak sama dengan ketentuan maka benar

Di dalam statement, kita dapat menggunakan boolean untuk multiple condition. Misal, jika kondisi = ketentuan atau kondisi <> ketentuan.

if (kondisi1 = ketentuan1) or (kondisi2 <> ketentuan2) then
  perintah;
Secara umum, boolean yang digunakan di dalam if yaitu or dan and. Or (atau) apabila salah satunya bernilai benar, maka ia akan bernilai benar. And (dan) apabila salah satunya bernilai salah, maka ia akan bernilai salah. Jika Anda ingin lihai dalam penggunaan ini, sebaiknya Anda mulai belajar "Logika Matematika".

Else If dilakukan secara manual di dalam Free Pascal. Karena tidak ada perintah else-if.

if kondisi = ketentuan then
  if kondisi2 = ketentuan2 then
    perintah;

if kondisi = ketentuan then
  if kondisi2 = ketentuan2 then
    perintah
  else
    perintah
else
  perintah;

Looping

Looping di dalam Free Pascal secara umum ada 3, yaitu for, repeat, dan while.

For

For digunakan untuk kasus-kasus yang biasanya menggunakan fixed number. Semisal, saya mau looping sebanyak 10 kali dan saya butuh variabel berapa kali saya sudah melakukan loop.

var i: Byte;
begin
  for i := 1 to 10 do
    writeln('Saya sudah looping sebanyak ', i, 'kali!');
end.
Sama halnya dengan if statement, jika di dalam for kita akan memberikan perintah lebih dari satu, maka gunakan block begin-end.

var i: Byte;
begin
  for i := 1 to 10 do
    begin
      // perintah
      // perintah
    end;
end.
Di kode tersebut terdapat perintah "to" yang maksudnya hingga. Semisal, saya ingin looping dari 1 hingga 10. Maka gunakan to, "1 to 10". Lalu, bagaimana jika saya ingin perhitungan mundur? Anda bisa gunakan downto. Semisal, saya ingin looping dari 100 hingga 1. Maka gunakan downto, "100 downto 1".
Sebenarnya selain for-to, ada for-in. Tapi, for-in digunakan dalam kasus yang memiliki Enumeration (daftar barisan data). Hal-hal yang sifatnya advanced akan dibahas di tulisan tersendiri.

Repeat

Seperti namanya, fungsi dari repeat yaitu ulangi perintah hingga ke batas yang ditentukan (repeat-until). Untuk penggunaannya:

repeat
  perintah;
until ketentuan;
Semisal, saya ingin ulangi perintah hingga 100 kali dengan variabel i = 1 (dari 1 hingga 100).

repeat
  writeln('Cetak ini terus!');
  i := i+1; // jika variabel i tidak ditambahkan secara manual, maka ini akan berulang terus selamanya
until i >= 100;
Perbedaan antara for dan repeat telah terlihat bukan? For secara otomatis melakukan penambahan +1 pada variabel patokannya. Sementara repeat, jika tidak ditambahkan secara manual ia akan terus mengulanginya. Karena, variabel until tidak akan pernah tercapai.

While

Penggunaan while hampir sama dengan repeat. Bedanya, pada repeat pengecekan ketercapaian kondisi dilakukan saat akhir perulangan. Sementara pada while, akan dicek saat awal memulai perulangan. Dan while akan melakukan perulangan jika kondisi belum keluar dari ketentuan. Adapun penggunaannya:

i := 1;
// Ulangi hingga variabel i di atas 10
while i < 10 do
  perintah;
  i := i+1; // penambahan manual
while i < 10 do
  begin
    perintah;
    perintah;
    i := i+1; // penambahan manual
  end;

Tambahan

Di dalam looping, Anda dapat bermain dengan perintah break dan continue. Break digunakan untuk menghentikan looping. Sementara continue digunakan untuk melewati dan langsung ke looping yang selanjutnya. Adapun kode yang dilewati hanya kode yang berada di bawahnya.

i := 0;
repeat
  i := i+1;
  if i = 2 then continue;
  writeln(i);
  if i = 5 then break;
until i > 10;
Kode di atas akan berjalan looping dari 1 hingga 10. Namun, pada saat i = 2 kode di bawahnya tidak akan dieksekusi dan langsung berlanjut ke proses berikutnya. Lalu, pada saat i = 5, kode akan dihentikan dan keluar dari looping. Sehingga keluaran akan menjadi:

1
3
4
5

Function

Function digunakan untuk membuat sebuah method yang akan digunakan berkali-kali untuk menghemat penulisan. Di dalam Free Pascal, function ditulis di atas pembuka (begin). Adapun penulisan untuk function seperti ini:

function name(parameter): dataType;
begin
  // isi function
end;
Contoh:

var i: Integer;
function
tambah(i: Integer): Integer;
begin
  i := i+1;
  tambah := i; // return value di dalam Free Pascal
end;
Selain function, ada procedure. Perbedaannya, procedure tidak mendukung return value sehingga hanya digunakan untuk hal-hal yang bersifat langsung berupa keluaran. Tapi, yang paling sering digunakan bukanlah function, namun procedure karena jarang ada orang yang bermain return value di Free Pascal. Apa yang dibuat, langsung dikeluarkan. Seperti itulah.

Procedure

Penggunaannya tidak jauh berbeda dari function.

var i: Integer;
procedure tambah(i: Integer);
begin
  i := i + 1;
  writeln(i);
end;
Dilihat dari perbadingannya sudah terlihat bukan? Seperti yang saya jelaskan sebelumnya di dalam function.

Penutup

Demikian tulisan saya yang membawa Anda memulai belajar bahasa Pascal dengan menggunakan compiler Free Pascal. Adapun yang kita bahas hanyalah sebagian kecil, yaitu secara umum. Kita sekarang telah mengenal komentar, input/output, if statement, function serta procedure, dan looping di dalam bahasa Pascal. Masih sangat banyak yang belum saya jelaskan. Dari masing-masing perintah seperti if, while, repeat, dan lain sebagainya masih banyak yang belum dijelaskan dan dijabarkan.
Saya hanyalah manusia biasa yang mencoba menjadi penulis. Saya juga masih baru belajar. Jadi, apabila ada kesalahan harap dikoreksi dan dimaklumi serta dimaafkan. Saya akan memperbaikinya segera apabila terdapat kesalahan. Terima kasih.

Rabu, 30 Desember 2015

Free Pascal - Referensi Tipe Data Secara Umum


Bahasa pemrograman Free Pascal sebenarnya memiliki banyak tipe data. Namun, beberapa tipe data yang digunakan secara umum meliputi Integer, Subrange, Boolean, Strings, dan Arrays. Yang saya maksud "umum" di sini merupakan tipe data yang kebanyakan orang tahu. Atau bisa dibilang, semua bahasa pemrograman memiliki tipe data ini, kecuali Subrange. Padahal, di dalam bahasa Free Pascal sendiri terdapat banyak sekali tipe data yang dalam satu kategori integer saja masih terdapat banyak jenis (sub-tipe). Sebagai contoh, di dalam satu kategori integer terdapat sub-tipe integer, shorint, smallint, longint, dst.

Integer

Integer memiliki sub-tipe data yaitu byte, shortint, smallint, word, integer, cardinal, longint, longword, int64, dan qword. Tipe-tipe tersebut digunakan sesuai keperluannya. Adapun spesifikasi masing-masing tipe data ada di bawah.
Tipe DataBatasanUkuran (byte)
Byte0..2551
Shortint-128..1281
Smallint-32768..327672
Word0..655352
Integersmallint atau longint2 atau 4
Cardinallongword4
Longint-2147483648..21474836474
Longword0..42949672954
Int64-9223372036854775808..92233720368547758078
QWord0..184467440737095516158

Penggunaannya secara umum sebagai berikut.

program FreePascal; // Nama program "FreePascal"
var angka: Integer; // Definisi variabel angka berupa integer
begin // __main__ dalam Free Pascal
  angka := 1; // Definisi isi variabel angka menjadi 1
  writeln(angka); // Cetak keluaran dari variabel angka
end. // EOF dalam Free Pascal (baris akhir berkas)
Apabila yang didefinisikan keluar batasan (lihat tabel) maka akan muncul pesan warning dengan isi "Warning: range check error while evaluating constants". Sebagai contoh, asumsikan penggunaan tipe data Byte dengan masukan -2. Maka keluaran akan menjadi 254. Bagaimana bisa? Batasan pada Byte yaitu 0 hingga 255. Apabila masukan keluar dari batas misal -2, maka dari 0 mundur 2 angka. Diketahui nilai maksimal dari Byte yaitu 255. Dari angka 0 mundur 1 angka, sehingga menjadi 255. Dari 255 mundur lagi 1 angka, sehingga menjadi 254. Atau, pada tipe data Byte dengan masukan 258. Maka, keluaran akan menjadi 2. Karena, batasan Byte dari 0 hingga 255. Masukan berupa 258 yang melebihi 3 angka dari batas (258-255 = 3). Karena keluar batas maksimal, maka kembali ke batas minimal yaitu 0 lalu ditambah sisanya. Karena kembali ke 0 telah memakan 1 angka, maka sisanya 2.

Lebih mudahnya seperti ini:
min = Minimum.
max = Maximum.
input = Masukan.
result = Keluaran.

input > max? result = |max + ( 1 - input )|
input < min? result = |max + ( 1 + input )|

Contoh, tipe data Byte dengan batasan 0..255. Lalu diberikan masukan -19 dan 289.
-19 < 0 maka result = |255 + ( 1 + (-19) )| = |255 - 18| = |237| = 237
289 > 255 maka result = |255 + ( 1 - 289 )| = |255 - 288| = |-33| = 33

Kesimpulan, rumus pencarian masukan apabila melebihi batasan sebagai barikut:
result = |max + (1 +- input)|
Keterangan:
result = keluaran
max = batasan maksimum tipe data
input menjadi positif (+) apabila input < min
input menjadi negatif (-) apabila input > max

Strings

Strings bisa juga disebut tipe data untuk huruf atau karakter. Di dalam Strings, terdapat sub-tipe data juga. Adapun penjelasannya, saya tulis di bawah. Sebenarnya, tidak perlu lagi melakukan definisi besaran dari Strings. Namun, jika tidak didefinisikan, Strings bisa memuat unlimited data (ansistring). Jika kita tidak ingin itu terjadi, cukup definisikan maksimal dari Strings tersebut. Secara umum, Strings didefinisikan seperti ini:
var teks: String;

Short Strings

Short Strings merupakan Strings yang besarnya kurang dari 255. Definisinya:
ShortString = String[255];
Kode tersebut dibaca "Tipe data String dengan maksimum 255 karakter".
Short Strings memakan memori sebanyak 0 byte.

Ansistrings

Ansistrings dapat memuat data hingga tidak terbatas. Ansistrings juga dapat diubah menjadi Short Strings oleh compiler apabila perlu. Untuk penggunaannya, cukup definisikan di variabel.
var teks: AnsiString;
Peringatan! AnsiStrings tidak direkomendasikan untuk kebutuhan kecepatan dan keringanan kode.
AnsiStrings memakan memori sebanyak "Panjang Karakter + 1 + 16 byte". Dengan catatan 16 byte dari Free Pascal 2.7.1.

UnicodeStrings

Seperti namanya, UnicodeStrings digunakan untuk bermain Unicode. Contoh penggunannya:
var unicode: UnicodeString;
begin
  unicode := 'at a: '#$0040' '#$0041; // Unicode ditulis dengan #$unicode
  writeln(unicode);
end.
UnicodeStrings memakan memori sebanyak "2 x Panjang Karakter + 1 + 16 byte". Dengan catatan 16 byte dari Free Pascal 2.7.1.

WideStrings

Pada dasarnya, WideStrings sama saja dengan UnicodeStrings. Namun, jika menggunakan ini di Windows, maka akan bekerja dengan windows function yang kemudian dapat digunakan bersama OLE automation.
Peringatan! AnsiStrings tidak direkomendasikan untuk kebutuhan kecepatan dan keringanan kode.
WideStrings memakan memori sebanyak "2 x Panjang Karakter + 1 + 16 byte". Dengan catatan 16 byte dari Free Pascal 2.7.1. Di Windows, WideStrings memakan memori sebanyak 0 byte.

Constant Strings

Sebenarnya ini merupakan String, namun penggunaannya untuk mendefinisikannya dengan kutip satu (single-quotes). ASCII code dapat digunakan di dalam Constant Strings.
S := 'Just a Char! With ASCII: '#145;

PChar

Tipe data ini sebenarnya tidak jauh beda dari Strings. Namun, ia memiliki index karakter yang dimulai dari 0. Normalnya, apabila kita mengambil index 0 dari Strings, maka akan muncul error. Tapi, tetap saja huruf pertama dimulai dari index 1.
PChar memakan memori sebanyak "Panjang Karakter + 1".

Subrange

Subrange bisa dibilang berupa jarak atau batasan. Di dalam Free Pascal, tipe data ini sering digunakan di dalam switch-case.Maka dari itu saya anggap umum. Seperti namanya, subrange merupakan jarak (kita sebut saja barisan). Semisal saya membuat Array dengan index dari 1 hingga 10. Maka tampilan pseudo-code-nya seperti ini:
var barisan: Array[1..10] of Integer = (1,2,3,4,5,6,7,8,9,10);
Barisan  (1,2,3,..,10) disebut sebagai tipe data Enumeration. Adapun Subrange yaitu pada Array[1..10]. Atau sebut saja begini, Enumeration merupakan barisan yang harus didefinisikan secara manual. Sementara Subrange merupakan barisan yang didefinisikan secara otomatis dengan titik sebanyak dua kali (..) sebagai identifier jarak.

Boolean

Ada beberapa tipe boolean di dalam Free Pascal. Namun, secara umum memang boolean lah yang digunakan. Boolean memiliki definisi 0 untuk nilai salah (false). Dan semua yang bukan 0 (nol) merupakan definisi untuk nilai benar (true).

Arrays

Arrays bisa dibilang merupakan barisan data yang memiliki nilai index atau kunci serta memiliki isi sebanyak jumlah index.

Statis

Untuk Static Arrays penggunaannya seperti yang telah ditulis di dalam pembahasan Subrange.
var barisan: Array[1..10] of Byte;
Dari kode di atas, kita dapat menyimpulkan untuk membuat sebuah Array haruslah mendefinisikan tipe data apa yang ada di dalam Array tersebut. Sebagai contoh dari data di atas, kita dapat baca "variabel barisan dengan tipe data Array yang membuat tipe data Byte".

Dinamis

Jika definisi Array statis menggunakan Subrange, di dalam dinamis cukup tuliskan Array saja.
var barisan: Array of Byte;
Untuk membuat data secara otomatis, gunakan method SetLength.
SetLength(barisan, 1000);
Artinya, buat Array dengan index berjumlah 1000. Adapun index yang dibuat yaitu 0..999. Ingat! Array selalu dimulai dengan index 0 apabila tidak didefinisikan secara jelas.

Penutup

Secara umum, di dalam Free Pascal, yang paling sering digunakan yaitu Integer, String, Subrange, Enumerator, dan Array. Pembahasan yang saya buat hanya memuat tipe data secara umum, namun sudah cukup banyak dan panjang penjelasannya. Untuk lengkapnya, akan segera saya tulis.
Tulisan yang saya buat bisa saja terdapat kesalahan atau ketidaktahuan saya dengan materi sehingga miss. Saya dengan senang hati menerima koreksian serta kritik/saran dari Anda. Jika ada kesalahan, maka akan segera saya revisi. Saya hanyalah orang biasa yang mencoba menjadi penulis. Jika ada kesalahan mohon dimaklumi dan dimaafkan. Terima kasih.