Let’s say “Hello World”

April 11, 2008 at 12:50 pm (programming & algorithm)

Akrab dengan kata “Hello World” ???, yup itu adalah terminologi programming yang sudah sangat dikenal, biasanya digunakan saat mempelajari suatu bahasa pemograman bagi pemula. Hello World bisa jadi adalah nama program pertamamu pada bahasa pemograman yang baru bagi mu. Program Hello World secara sederhana akan menampilkan kata “Hello World” ke layar komputermu (hehe.. ya ga mungkin kelayar ponselmu lah..), and here are some of them:

In javascript:

<script language = “javascript”>
   document.write(“Hello World”);
</script>

in PHP:

<?php
   echo “Hello World”;
?>

In C:

#include <stdio.h>
void main() {
   prinft(“Hello World\n”);
}

In C++:

#include <iostream.h>
void main() {
   cout << “Hello World” << endl;
}

In C#:

using System;
class HelloWorld {
   static void Main(){
      Console.WriteLine(“Hello World”);
   }
}

In Pascal:

program HelloWorld;
begin
   writeln(‘Hello World’);
end.

In Java:

class HelloWorld {
   public static void main(String[] args) throws IOException {
      System.out.println(“Hello World”);
   }
}

In Visual Basic:

Sub Form_Load()
   msgbox “Hello World”
End Sub

In Scheme:

(write-line “Hello World”)

ada yang mau menambahkan?? ;-)

Permalink 4 Comments

rekursif(2)

March 28, 2008 at 12:03 pm (programming & algorithm)

oke guys… saatnya happy coding lagi..
kalian taukan bagaimana biasanya membuat fungsi untuk memjumlahkan dua bilangan..
nah… sekarang aku menemukan cara melakukan operasi-operasi sederhana (penambahan,
pengurangan, perkalian) dengan metode rekursif yang biasanya kita lakukan secara explicit
ex. a+b, a-b, a*b
okey.. here we go…

Penambahan:

int add(int a, int b){
if (b==0) {
return a;
}else {
return add(a, b-1)+1;
}
}

Pengurangan:

int sub(int a, int b){
if (b==0) {
return a;
}else {
return sub(a, b-1)-1;
}
}

Perkalian:

int multiple(int a, int b){
if (b==0) {
return 0;
}else if(b==1){
return a;
}else {
return multiple(a, b-1)+ a;
}
}

nah sekarang aku ngasi tantangan buat kamu sekalian… untuk membuat fungsi rekursif untuk pembagian gimana merasa tertantang ga???(soalnya udah pening kepalaku dibuatnya) ;-)
oya method2 tersebut kubuat dari bahasa pemograman java jadi silahkan disesuaikan ke bahasa yang dipakai masing2 :-D en validasinya masih cemen jadi bisa dibilang ini untuk semua bilangan positif…so kalo mau nambahi validasiny silahkan menambahkan masing2 aja y… ;-)

oya klo ada masukan atau pencerahan jangan sungkan untuk meninggalkan komentar dibawah..
dan kalo ada kesalahan harap maklum lagi-lagi masih pemula… ;-)

Permalink 11 Comments

Algoritma Brute Force

March 24, 2008 at 6:49 pm (programming & algorithm)

Oke sekarang kita coba bahas tentang salah satu teknik algoritma yang sangat banyak dipakai banyak orang terutama untuk persoalan yang tidak memperdulikan masalah efisiensi…, yaitu algoritma brute force.

Sebenarnya secara sadar atau tidak…, kita juga sering berpikir dengan teknik ini, nah sekarang siapkan otak eh… maksudku simak neh ceritanya…

Algoritma Brute Force ???

  • Brute force adalah sebuah pendekatan yang sangat jelas(straightforward) untuk memecahkan suatu persoalan, biasanya didasarkan pada problem statement dan definisi konsep yang dilibatkan.
  • Algoritma brute force memecahkan masalah dengan sangat sederhana, langsung dan dengan cara yang jelas .

Cara kerja Algoritma Brute Force

  1. Enumerasi (list) setiap solusi yang mungkin dengan cara yang sistematis.
  2. Evaluasi setiap kemungkinan solusi “satu per satu” dan simpan solusi terbaik yang ditemukan sampai sejauh ini (the best solusi found so far).
  3. Bila pencarian solusi berakhir, umumkan solusi terbaik (the winner)

Karakteristik Algoritma Brute Force

  • Algoritma brute force sebenarnya bukanlah algoritma yang “cerdas” dan mangkus(efisien), karena ia membutuhkan jumlah langkah yang besar/banyak dalam penyelesaiannya dan tentu saja membutuhkan waktu yang berbanding lurus dengan jumlah langkah penyelesaiannya. Kadang-kadang algoritma brute force disebut juga algoritma naif (naïve algorithm).
  • Algoritma brute force seringkali merupakan pilihan yang kurang disukai karena ketidakmangkusannya itu, tapi kalau mencari pola2 dasar, keteraturan, atau trik-trik khusus, biasanya dapat membantu membantu untuk menemukan algoritma yang lebih cerdas dan lebih mangkus lagi.
  • Untuk persoalan2 yang kecil, kesederhanaan brute force lebih diperhitungkan daripada ketidakmangkusannya. Algoritma brute force sering digunakan sebagai basis bila membandingkan beberapa alternatif algoritma yang mangkus.
  • Meskipun brute force bukan merupakan teknik pemecahan masalah yang mangkus, namun teknik brute force dapat diterapkan pada sebagian besar persoalan. Bayangkan..,sangat sulit menemukan masalah yang tidak dapat dipecahkan dengan teknik brute force, tapi ada masalah yang hanya dapat dipecahkan secara brute force.

Algoritma bubble sort mengimplementasikan teknik brute force dengan jelas sekali. Berikut contoh persoalan sorting yang dipecahkan dengan algoritma bubble sort:

procedure BubbleSort (input/output L : arrayOfInt, input n : integer)
{ Mengurutkan array L[1..N] sehingga terurut menaik dengan metode pengurutan bubble sort.
Masukan : Array L yang sudah terdefenisi nilai-nilainya.
Keluaran: Array L yang terurut menaik sedemikian sehingga
L[1]  L[2]  …  L[N].
}
Deklarasi
i : integer { variabel untuk jumlah langkah }
k : integer { variabel,untuk pengapungan pada setiap langkah }
temp : integer { variabel untuk pertukaran }
Algoritma:
for i <- 1 to n – 1 do
   for j <- n downto i + 1 do {looping menurun}
      if (L[j] < L[j-1]) then
         {tukar L[j] dengan L[j-1]}
         temp <- L[j]
         L[j] <- L[j-1]
         L[j-1] <- temp
      endif
   endfor
endfor

Setelah kita lihat2 lagi algoritma diatas.., sangat mudah dimengerti. Dengan melooping sebanyak isi array lalu menukarkan nilainya, jika ada nilai yang lebih kecil berada di bawah nilai yang lebih besar, lalu melooping lagi untuk sebanyak jumlah isi array untuk memastikan seluruh kondisi di-cek satu per satu dan menukarkan nilainya kembali jika masih terdapat kondisi seperti diatas dan seterusnya sampai selesai.huh… capek juga ya, coba bayangkan jika banyaknya nilai yang disorting itu mencapai ratusan ribu sampai jutaan jumlahnya hmm… bisa jenggotan juga tuh nunggunya… ;-)

Nah sekarang yang menjadi pertanyaan adalah…
Adakah algoritma sorting yang lebih mangkus daripada brute force?? :-D

“Ken Thompson (salah seorang penemu Unix) mengatakan: “When in doubt, use brute force“, faktanya kernel Unix yang asli lebih menyukai algoritma yang sederhana dan kuat (robust) daripada algoritma yang cerdas tapi rapuh.

oh iya… hampir lupa teknik lain yang terkait erat dengan brute force adalah exhaustive search. Brute force maupun exhaustive search sering dianggap dua metode yang sama, padahal dari jenis masalah yang dipecahkan ada sedikit perbedaan(walopun bisa aja dianggap sama…).
Dimana perbedaannya??? ya udah.. kita liat aja entar.. hehehe… ;-)

Permalink 2 Comments

Object oriented paradigm vs procedural paradigm

March 18, 2008 at 11:43 am (programming & algorithm)

A comparison the object paradigm and the procedural paradigm. The flaws of the procedural paradigm are also discussed, which made it possible for the evolution of a new paradigm

Procedural Paradigm:

Previously, programs were written in a procedural fashion i.e. the statements were written in the form of a batch. But as the requirements grew, it was seen that the programs were getting larger and larger and it became difficult to debug. So functions were introduced to reduce the size of the programs and improve readability in them. Still that was not enough.

One of the major problems with the “Procedural Paradigm” was that data was treated as a stepson and functions were given more priority. Where as, it is the other way. In this procedure the original data could easily get corrupted, as it was accessible to all the functions, even to those which do not have any right to access them.

Object Oriented Paradigm:

At this point, a new procedure for programming was introduced. In this paradigm, the previous drawbacks were taken away. The data, which was treated badly in the procedural paradigm, was given the first priority. This was done by packing the data and the functions, which are supposed to have the access to the data, into one box known as an object. This made the chances of any unauthorized access of the data to die.

Before OOP, the programmer was restricted to use the predefined data types such as integer, float and character. If any program required handling of the x-y coordinates of some point then it is quite a headache for the programmer. Where as, in OOP this can be handled very easily as the programmer can define his own data types and the corresponding functions.

One of the advantages of OOP over Functional programming is that the objects made in a program can be reused by any other program. This increases the reusability of the programs once written. Objects are treated as the real life objects. Just like real life objects these objects have their own identities, behaviors and states. Similarly, as we know that there are different versions of programs that come out. The programs written in an OOP can be easily updated by using the facilities of inheritance.

 

Thus we conclude that the Object Oriented Paradigm is much reliable than the Functional Paradigm. The Object Oriented Paradigm has made the life of a programmer easier by providing the facilities of Data Hiding, Reusability by Inheritance and by Polymorphism.

Permalink Leave a Comment

sedikit tentang graph

March 13, 2008 at 9:20 pm (programming & algorithm)

Graphs merupakan fundamental struktur data (data structure) didunia programming – sebuah abstrak yang dapat menggambarkan sistem transportasi, electrical circuits, interaksi antara manusia, telekomunikasi jaringan dll. Sangat banyak perbedaan struktur yang dapat di modelkan menggunakan dari sebuah graph.
Nah disini kita hanya fokus pada pengetahuan dasar yang dibutuhkan untuk algoritma graph, khususnya penggunaan tepat dari struktur data graph dan traversal algorithm.

Gambar.1

Sebuah graph G = (V,E) dibentuk dari sekumpulan vertices(titik) V, dan sekumpulan edges(penghubung/garis) E seperti pada Gambar 1. Pada pemodelan jalan, vertices bisa menunjukkan kota atau persimpangan jalan, yang tentu saja dihubungkan oleh jalan yang dimodelkan dengan edges. Contoh lain ada pada pemodelan meng-analisa source code pada program komputer, vertice menunjukkan baris kode(lines of code), dengan sebuah edges yang menjadi penghubung antar baris, misal x dan y dimana statement y dieksekusi setelah x.
Ada beberapa properti dasar dari graph yang mempengaruhi pemilihan dari struktur data yang biasa digunakan untuk menggambarkannya dan algoritma yang tersedia utnuk menganalisa graph tersebut. Langkah awal pada setiap persoalan graph ditentukan oleh beberapa pertimbangan, seperti:

  • Undirected vs directed – sebuah graph G = (V,E) dikatakan Undirected jika edge (x,y) ? E menyatakan bahwa (y,x) juga ada pada E (Gambar.3). Jika tidak, maka dikatakan directed (Gambar.2). Jalanan antar kota bisa dikatakan undirected, karena jalan besar yang biasa dilewati dengan dua arah, sedangkan jalan2 dalam kota yang satu arah bisa dikatakan directed karena graph tersebut memiliki arah yang sudah ditentukan.
Gambar.2 Gambar.3
  • Weighted vs UnWeighted – pada Weighted graph(Gambar.4), setiap edge(bisa juga verteices) dari graph G diberikan sebuah nilai atau bobot. Biasanya menggambarkan jarak jalan, waktu tempuh antara x dan y. Pada unweihted graph, nilai atau bobot tidak ada atau tidak ada perbedaan nilai atau bobot antara edges atau vertice yang berbeda. Perbedaan antara Weighted dan unWeighted menjadi penting bila digunakan untuk mencari jalur terpendek dari sebuah graph. Untuk unWeighted graph, jalur terpendek harus memiliki beberapa edges, dan dapat dicari dengan menggunakan algoritma breadth-first search(BFS).
Gambar.4
  • Cyclic vs Acyclic – sebuah graph yang acyclic tidak memiliki cycle yang dapat kembali ke node sebelumnya. Tree(Gambar.5) merupakan acyclic Undirected graph yang terhubung, karena alur dari edge-nya tidak dapat kembali lagi keatas. Cyclic adalah graph yang dapat kembali ke node sebelumnya(Gambar.3).
Gambar.5
  • Simple vs Non-simple – jika terdapat sebuah self-loop pada edge(x,x) pada satu vertices disebut Non-simple() ( Gambar.6)sedangkan graph yang tidak memunculkan hal tersebut disebut simple
Gambar.6
  • Implicit vs explicit – banyak graph yang tidak dibentuk sejak awal, yang berarti graph itu dibentuk pada saat kita menggunakannya(di programming di sebut pada saat runtime), contoh lebih dekat untuk graph type implicit ini adalah permainan labirin. Bayangkan kita mencari jalan pada permainan labirin, kita belum tahu jalan mana yang harus dilalui untuk sampai ke tujuan…, nah disini kita membuat graph pada saat kita melewati jalan2 tersebut, nah.. pada saat kita melewati jalan tersebut kita sedang membentuk graph. Sedangkan graph explicit adalah graph yang sudah dibentuk sebelumnya

oke deh kayanya segini aja dulu, lagian artikel ini perlu buat final project-ku.
oya kalo ada yang salah mohon pencerahannya maklum namanya juga baru pemula… ;-)

Permalink 2 Comments

Rekursif

March 9, 2008 at 10:32 pm (programming & algorithm)

 

Rekursif merupakan salah satu programming skill yang penting. Tetapi kadang sulit melihat bagaimana suatu masalah dapat dipecahkan secara rekursif. Dan mudah juga membuat kesalahan program rekursif yang memiliki waktu teminasi yang lama atau tidak terminasi sama sekali alias looping forever.

Suatu fungsi dikatakan rekursif apabila fungsi tersebut memanggil dirinya sendiri(fungsi itu sendiri). Contoh dibawah adalah pseudocode dari fungsi rekursif yang mencetak phrase “Hello world” sebanyak count.

Code:

function HelloWorld(count)
{

if(count<1)return
print(“Hello World!”)
HelloWorld(count – 1)

}

Kita lihat bagaimana program tersebut berjalan apabila kita panggil fungsi HelloWorld dengan parameter count = 10.

Baris 1 tidak akan dieksekusi karena count tidak lebih kecil dari 1. Pada baris selanjutnya program mencetak Hello World! Sekali. Jadi kita perlu mengeprint phrase tersebut 9 kali. Karena fungsi HelloWorld tersebut hanya bisa mengeprint sekali maka kita panggil lagi fungsi HelloWorld(sekarang count = 9) untuk mengeprint sisanya. Copy dari fungsi HelloWorld ini pun mengeprint Hello World! sekali dan kemudian memanggil dirinya untuk mengeprint 8 sisa lagi. Hal ini terus berlanjut sampai fungsi tersebut memanggil HelloWorld dengan count = 0. HelloWorld(0) tidak melakukan apa apa hanya mengembalikan ke si pemanggil. Ketika HelloWorld(0) selesai, HelloWorld(1) juga selesai dan mengembalikan ke si pemanggil. Hal ini berlanjut sampai pada pemanggilan awal kita yaitu HelloWorld(10). Pada saat HelloWorld(10) selesai tugasnya mengeprint Hello World sebanyak 10 kali selesai.

Hal diatas merupakan sesuatu yang mungkin tidak menarik tetapi fungsi diatas mendemokan hal hal yang penting dalam mendesign algoritma rekursif.

1. Fungsi rekursif menangani base case tanpa memanggil dirinya lagi. Dalam contoh yaitu count < 1 atau HelloWorld(0);

2. Mencegah terjadinya cycle.
Apabila HelloWorld(10) memanggil HelloWorld(10) yang kemudian memanggil lagi HelloWorld(10) kita akan berakhir dengan loop yang tak berakhir. Dalam banyak recursif program kita dapat mencegah cycle dengan membuat fungsi tersebut memanggil fungsi yang lebih kecil. Cth HelloWorld(10) memanggil HelloWorld(9) yang kemudian memanggil HelloWorld(8). Dalam hal ini adalah lebih simple mengeprint sebanyak 9 kali dibanding dengan 10 kali

3. Setiap pemanggilan fungsi melakukan penanganan yang complete pada tugas yang diberikan.
Dalam kasus ini ketika kita memanggil HelloWorld dengan argument 10, fungsi tersebut melakukan tugasnya yaitu mengeprint sekali dan memberikan penanganan selanjutnya kepada HelloWorld(9) dan seterusnya.

Kita memerlukan fungsi rekursif dalam situasi yang complex. Rekursif dapat diaplikasikan dalam banyak hal tetapi dalam skenario tertentu hal tersebut sangat membantu.

taken from here

Permalink Leave a Comment

Code Optimization Tips

March 4, 2008 at 10:29 pm (programming & algorithm)

* if you’ve got a lot of if / else statements try to put the one most likely to be met first

* use a++ and a– instead of a+=1 and a-=1

* even better, use ++a or –a instead of their post-increment versions. For primitive types, on some architectures, this will make a difference. For STL iterators, it’s much more important and may save a lot of overhead.

Permalink Leave a Comment

Pointer Tips :-)

March 4, 2008 at 10:27 pm (programming & algorithm)

1) Never ever forget to initialize the pointer. This may be simple and easy known stuff but here I would like to add it as an embedded system developer that this was the main cause of many bugs.

2) Also never change the pointer variable itself unless & until you need to change the pointer.
3) Also monitor that the pointers are not overlapping if not pointing to same memory location range.

Permalink Leave a Comment

Keep fit to program better

July 2, 2007 at 11:04 am (programming & algorithm)

It may seem obvious but it is 100% true. If a programmer exercises regularly to be on shape he/she can program better. You don’t have to worry about physical problems like stiffness and exercising make’s you feel better about yourself.

#include

int main(void){

Exercise you(“Your name here”);

you.do_pushups(25);

you.do_situps(30);

if (you.tired()) {

you.rest_for_a_while();

}

you.lift_weights();

return 0;

}

You get the point…
:-)

Permalink Leave a Comment

good algorithm (2)

June 14, 2007 at 10:06 am (programming & algorithm)

“A good algorithm is like a sharp knife – it does exactly what it is supposed to do with a minimum amount of applied effort. Using the wrong algorithm to solve a problem is trying to cut a steak with a screwdriver: you may eventually get a digestible result, but you will expend considerable more effort than necessary, and the result is unlikely to be aesthetically pleasing.”

Permalink Leave a Comment

Next page »