Pengenalan Pohon

Semester ini saya mendapatkan matakuliah baru dan kebetulan saya tidak pernah mendapatkan ilmunya ketika saya kuliah. Alhasil saya harus benar-benar menguasai sebelum saya mengajar dikelas. Matakuliahnya sangat menarik penuh dengan logika saya sangat suka tapi cukup kewalahan mencari materi. Ok mari kita mulai..

Pohon adalah struktur data yang secara bentuk menyerupai pohon. Hanya saja berbeda dengan dunia nyata pohon tumbuh ke atas tapi di struktur dari pohonnya tumbuh ke bawah. Pohon terdiri dari serangkaian simpul (node) yang saling terhubung. Sebuah pohon merepresentasikan sebuah hirarki atau tingkatan. Contoh pohon:

  1. Pohon Struktur Organisasi

mdp

2. Daftar isi sebuah bukudaspro

Banyak istilah-istilah umum yang perlu anda ketahui:

p1

Gambar 3. Contoh Pohon

  1. Induk (Parent)
    Node yang berada di atas node lain secara langsung. Contoh dari Gambar 3, 1 merupakan parent dari 2, 3 dan 4. Contoh lain 4 merupakan parent dari 7, 8 dan 9.
  2. Anak (Child)
    Node anak adalah node yang merupakan cabang langsung dari sebuah node. Contoh 2 adalah anak dari 1.
  3. Akar (root)
    Akar adalah node yang tidak memiliki induk atau node yang paling tinggi. Jika dilihat pada Gambar 3, maka rootnya adalah 1.
  4. Daun (leaf)
    Daun adalah node yang tidak memiliki anak. Seperti : 5, 6, 3, 7, 8, dan 9.
  5. Simpul dalam (internal node)
    Simpul dalam adalah simpul yang memiliki anak minimal 1. Seperti node 1, 2 dan 4.
  6. Simpul luar (external node)
    Simpul luar adalah simpul yang paling luar atau sama saja dengan daun. Seperti: 5, 6,3,7, 8 dan 9.
  7. Level
    Level adalah tingkatan yang ditinjau dari posisi akar. akar memiliki level 0. Untuk contoh pohon dapat dilihat pada Gambar 4.
  8. Tinggi (Height)
    Ketinggian adalah level tertinggi dari suatu pohon di tambah dengan 1. Maka ketinggian pohon pada Gambar 4 adalah 4 (level tertinggi+1).

    picture1

    Gambar 4. Contoh Pohon 2

  9. Derajat
    Derajat adalah jumlah anak maksimal yang boleh dimiliki oleh node. Dari Gambar 4 node T memiliki anak terbanyak yaitu 3. Maka derajat dari pohon tersebut adalah 3.
Advertisements

Binary Tree

Pohon biner adalah jenis pohon yang memiliki ke khasan, yaitu jumlah anak setiap simpul maksimal dibatasi dua buah saja.

1. Node

Pada dasarnya pohon biner sama saja dengan list hanya saja koneksinya lebih dari 1. Biasanya node  tree terdiri dari 2 bagian, data dan koneksi. Pada pohon biner terdapat koneksinya adalah koneksi kiri (anak kiri) dan koneksi kanan (anak kanan).

node

   Gambar 1. Representasi Node

  • Data adalah nilai yang disimpan didalam node dan biasanya tipe datanya adalah tipe data primitif.
  • Sedangkan L adalah koneksi yang menghubungkan dengan Node sebelah kiri.
  • dan R adalah koneksi yang menghubungkan dengan Node sebelah kanan.

Ada juga Node yang memiliki 3 koneksi, yaitu kanan, kiri dan parent.

Picture1

Gambar 2. Node dengan 3 koneksi

Parent adalah koneksi yang menghubungkan Node dengan Node orang tuanya. Sehingga anaknya bisa mengetahui data orang tuanya. Berbeda dengan Gambar 1, hanya orang tua yang mengenali anak tetapi tidak sebaliknya.

2. Pohon

Sebuah pohon harus memiliki akar atau root. Root dari sebuah pohon tidak boleh lepas karena root adalah pangkal dari sebuah pohon. Jika kita mengetahui pangkal sebuah pohon maka otomatis kita bisa menngunjungi semua node pada pohon tersebut.

Jenis-Jenis Binary Tree

  1. Full Binary Tree
    Pohon biner yang semua nodenya (kecuali leaf) pasti memiliki 2 anak dan tiap subtree memiliki tinggi pohon yang sama.
    Picture2
  2. Complete Binary Tree
    Pohon biner yang mirip dengan full binary tree tetapi tiap subtree memiliki selisih ketinggian minimal 1. Contoh tinggi pohon kiri 2 dan pohon kanan 1. maka selisihnya adalah 1. Jika selisih 1 maka pohon di bawah ini dapat diseput pohon complete.
    Picture3
  3. Skewed Binary Tree
    Pohon biner yang semua nodenya hanya memiliki 1 anak dan pohonnya condong. Misal condongnya ke kiri maka semua node hanya memiliki anak kiri semua begitu juga sebaliknya.
    Picture4

 

Pemrosesan Kata dengan List (Word Processing with List)

Sebenarnya ini adalah tugas besar yang pernah saya berikan kepada mahasiswa saya. Karena batas pengumpulan sudah lama lewat maka rasanya tidak apa-apa jika saya publish solusinya.

Pada dasarnya kali ini saya akan membahas bagaimana membuat pemrosesan text di C++. Yang di maksud dengan  pemrosesan disini adalah menghitung banyak kata dari paragraf yang kita input dan menghitung ada berapa banyak sebuah kata muncul dalam satu paragraf. Binggung?? Baiklah saya berikan contoh :

Misal ada sebuah paragraf :

Pada hari minggu saya bersama keluarga akan berlibur ke sebuah pulau di kepualan Riau. 
Saya sudah menyiapkan semua kebutuhan sebelum kami pergi.

Dari paragraf di atas dapat kita hitung :

Jumlah kata : 22 kata
Pada : 1            hari : 1        minggu : 1        saya : 2

dan seterusnya akan dihitung untuk semua kata.

Saya rasa setelah melihat contoh diatas sudah lebih jelas gambaran aplikasi yang akan di banggun. Bahasa yang saya gunakan disini adalah bahasa C++, karena ini menggunakan Linked List. Kalau menggunakan bahasa pemrogram berorientasi objek tentu akan lebih mudah. Baiklah sebelum membuat aplikasi ini ada baiknya kita list terlebih dahulu apa yang harus dilakukan.
1. Tentu pertama adalah bagaimana kita bisa menginput sebuah paragraf di C++.
2. Kita salin semua paragraf ke dalam sebuah list.
3. Dari kalimat yang telah diinput, buang semua tanda baca.
4. Setelah dibuang semua tanda baca sekarang kita potong semua elemen list per kata simpan kedalam nested list dan hilangkan tanda spasi.
5. Menghitung kemunculan semua kata.
6. Tampilkan Jumlah semua kata dan masing-masing total.

Tahapan diatas memang terlalu berbelit, tapi kita harus menginggat kembali bahwa ini ditujukan untuk mahasiswa yang baru menggenal Senarai dan Struktur Data.

Baiklah mari kita mulai :
Langkah 1. Langkap pertama adalah input paragraf, pada dasarnya ini sanggat sederhana yaitu cukup membuat kode program yang bisa menerima inputan string.

string Tempparagraf;
cout<<"Input Paragraf :\n";getline(cin,Tempparagraf);

Langkah 2.
Kita sudah bisa menginput sebuah string yang berfungsi menampung paragraf kita. Sekarang saatnya untuk memotong string menjadi sekumpulan karakter. Sekaligus kita akan membuang semua tanda baca yang di masukkan kecuali spasi. Oh iya hampir lupa, angka juga akan dihapus karena kita hanya menghitung kemunculan suatu kata. Sebelum kita potong string menjadi sekumpulan karakter, kita sebaiknya menyiapkan sebuah list yang terlebih dahulu.

#define info(P) P->info
#define next(P) P->next
#define first(L) (L).first
typedef struct tElement *address;
typedef struct tElement{
    char info;
    address next;
}element;

typedef struct{
    address first;
}List;

Setalah list sudah siap sekarang kita salin isi string TempParagraf ke dalam list.

void CreateList(List *L){
    first(*L)=NULL;
}
address alokasi(char x){
    address P;
    P=(address)malloc(sizeof(element));
    if(P!=NULL){
        info(P)=x;
        next(P)=NULL;
    }
    return P;
}
void insertFirst(List *L, address Temp){
    Temp->next=first(*L);
    first(*L)=Temp;
}
void insertAfter(List *L,address prec, address x){
    x->next=prec->next;
    prec->next=x;
}
int IsEmpty(List L){
    if(first(L)==NULL)
        return 0;
    else
        return 1;
}
void insert(List *L, char x){
    address Temp;
    Temp=alokasi(x);
    if(IsEmpty(*L)==NULL)
        insertFirst(&(*L),Temp);
    else{
        address last=first(*L);
        while (last->next!=NULL){
            last=last->next;
        }
        insertAfter(&(*L),last,Temp);
    }
}

Sedangkan di void main kita cukup menulis :

List C;    
CreateList(&C);
address T=first(C);
for(int i=0; i<Tempparagraf.size(); i++){
        insert(&C,Tempparagraf[i]);
}
Tampil(C);

Jika telah kalian jalankan hasil dari potongan program ini adalah kita sudah berhasil menyalin semua huruf ke dalam sebuah list.

Langkah 3.

Setelah disalin sekarang saatnya kita menghapus tanda baca dan bilangan yang ada di dalam list. Untuk menghapus elemen list kita harus memiliki method untuk menghapus elemen baik elemen pertama, elemen di tenggah atau elemen yang terkahir. Tetapi untuk kasus masalah ini kita hanya membutuhkan delete after karena dalam bahasa indonesia yang benar tidak boleh ada tanda baca di awal paragraf. Untuk itu berikut kode untuk menghapus elemen list after adalah.

void DeleteAfter(address prev){
    address del=prev->next;
    prev->next=del->next;
    del->next=NULL;
}

Setelah method delete after sekarang saatnya membuat method untuk menghapus tanda baca.

void DeleteTandaBaca(List *L){
    if(first(*L)!=NULL){
        address temp=first(*L)->next;
        address prev=first(*L);
        do{
            if((temp->info<65 || temp->info>93 )&&( temp->info<97 || temp->info>125)&& (temp->info!=32)){
                prev->next=temp->next;
                temp->next=NULL;
                temp=NULL;
                temp=prev->next;
            }
            else{
                prev=temp;
                temp=temp->next;
            }
        }while(temp->next!=NULL);
        if((temp->info<65 || temp->info>93 )&&( temp->info<97 || temp->info>125)&& (temp->info!=32)){
                prev->next=temp->next;
                temp->next=NULL;
                temp=NULL;
                temp=prev->next;
        }
    }
}

Langkah 4.
Setelah dibuang semua tanda baca sekarang kita potong semua elemen list per kata simpan kedalam list dalam list dan hilangkan tanda spasi. untuk itu kita harus memiliki tipe data baru yaitu list dalam list.

typedef struct LList{
    List Info;
    LList *next;
};

LList *LinkList;

Pada dasarnya list dalam list adalah list biasa tetapi info dari list tersebut adalah sebuah. Binggung kan?? Kira-kira begitulah silahkan diperluas maknanya.. Nah sekarang bagaimana menyalin list yang sudah kita buat ke dalam list dalam list. Logikanya satu elemen list dalam list (yang saya beri nama Linklist) adalah sejumlah elemen dari list C. Contoh : isi list C :

S a y a p e r g i

Sekarang bagaimana menyalinnya kedalam Linklist menjadi seperti ini :

Dari gambar diatas pemotongan kata dilakukan jika kita menemukan spasi. Brikut cara memotong semua listnya.

void Salin(List L){
    LinkList=NULL;
    List temp;
    first(temp)=NULL;
    address elemenL=first(L);
    LList *LastLinkedList=new LList;
    LastLinkedList=NULL;
    LastLinkedList=LinkList;
    do{
        if(elemenL->info!=32)
            insert(&temp,elemenL->info);
        if(elemenL->info==32 ||elemenL->next->next==NULL){
            if(elemenL->next->next==NULL)
                insert(&temp,elemenL->next->info);
            LList *NewLList= new LList;
            NewLList->Info=temp;
            NewLList->next=NULL;
            first(temp)=NULL;
            Tampil(NewLList->Info);
            if(LastLinkedList==NULL){
                LinkList=NewLList;
                LinkList->next=NULL;
                LastLinkedList=LinkList;
            }else {
                NewLList->next=LastLinkedList->next;
                LastLinkedList->next=NewLList;
                LastLinkedList=LastLinkedList->next;
            }
        }
        elemenL=elemenL->next;
    }while(elemenL->next!=NULL);
}

Langkah 5 dan 6.

Menghitung kemunculan semua kata. untuk menghitung kemunculan kata tentu kita membutuhkan method untuk membandingkan 2 buah kata, apakah dua kata tersebut sama atau tidak. Berikut adalah method untuk pembandingan

int Kompare(List A, List B){
    address a=first(A);
    address b=first(B);
    int k=1;
    do{
        if(a->info!=b->info){
            k=0;
        }
        //cout<<"\na : "<<a->info<<" b:"<<b->info;
        a=a->next;b=b->next;
    }while(k!=0 && a->next!=NULL);
    return k;
}

Sesudah dibandingkan sekarang kita hitung kemunculan setiap kata dan sudah langsung menampilkan hasil dari perhitungan setiap kata.

void Hitung(){
    List A,B;
    first(A)=NULL;first(B)=NULL;
    LList *Temp=new LList;
    cout<<"\nCek:\n";
    CetakLL();
    LList *Temp2=new LList;
    Temp2=LinkList;
    do{
        cout<<"\nkata: ";
        Tampil(Temp2->Info);
        Temp=Temp2;
        A=Temp2->Info;
        int hasil=1;
        do{
            B=Temp->next->Info;
            int t=Kompare(A,B);
            hasil+=t;
            if(t==1){
                LList *Delete=NULL;
                Delete=Temp->next;
                Temp->next=Delete->next;
                Delete->next=NULL;
            }else
                Temp=Temp->next;
        }while(Temp->next!=NULL);
        Temp2=Temp2->next;
        cout<<"Hasil :"<<hasil;
        if(Temp2->next==NULL){
            Tampil(Temp2->Info);
            cout<<"Hasil :"<<1;
        }
    }while(Temp2->next!=NULL);
}

Selesai…
Semoga bisa menjadi bahan untuk anda yang sedang mendalami tentang list dan yang sedang belajar tentang struktur data. Semoga membantu.. 🙂

Pencarian dengan Algoritma Binary Search

Pencarian bagidua atau pencarian biner adalah metode pencarian yang diterapkan pada sekumpulan data yang sudah terurut (terurut menaik atau terurut menurun). Data yang terurut syarat mutlak penerapan algoritma ini. Salah satu keuntungan data terurut adalah memudahkan pencarian, dalam hal ini pencarian bagidua.

Misalkan indeks kiri adalah Ia dan indeks kanan adalah Ib. Kondisi awal Ia=1 dan Ib = N.
Langkah 1. Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks k = (Ia+Ib) div 2
(elemen tengah , L[k], membagi larik menjadi dua bagian, yaitu bagian kiri L[Ia..k-1] dan bagian kanan L[K+1..Ib])

Langkah 2. Periksa apakah L[k] = X.
Jika L[k] = X, pencarian dihentikan sebab X sudah ditemukan. Tetapi, jika L[k] ≠ X, harus ditentukan apakah pencarian akan dilakukan di larik bagian kiri atau di bagian kanan. Jika L[k] < X, maka pencarian dilakukan pada bagian kiri. Sebaliknya, jika L[k] > X, pencarian dilakukan pada larik bagian kanan.
Langkah 3. Ulangi langkah 1 sampai X ditemukan atau Ia > Ib (ukuran larik sudah nol).

Procedure Bagidua(input L: Larik, input N:integer, input X: integer, output IX:integer)
Algoritma
Ia <-N
Ib <-1
ketemu <-false
while (not ketemu) and (Ib > Ia) do
k <-(Ia + Ib) div 2
if (L[k] = X) then
ketemu= true
else
if (L[k] > X) then
Ia <-k
else
Ib <-k+1
endif
endif
endwhile
If (ketemu = true) then
IX <-k
else
IX <-0
endif

Contoh :
Diketehui sebuah senarai belum terurut dan bilangan yang akan dicari adalah 2 :

2 35 7 4 6 1 9 4 23 25

Penyelesaian :

1. Urutkan terlebih dahulu semua bilangan, boleh terurut menaik atau terurut menurun. Kali ini saya akan menggunakan terurut menaik sehingga diperoleh array sebagai berikut dan kemudian saya tambah dengan keterangan urutan di baris bawah.

Nilai 1 2 4 4 6 7 9 23 25 35
Indeks 1 (Ib) 2 3 4 5 6 7 8 9 10 (Ia)

2. Tentukan Indek atas (Ia) dan indek bawah (Ib). Ia adalah nilai indek terbesar dari array yaitu 10. Sedangkan Ib indek terkecik dari array yaitu 1. dan kita tetapkan bahwa saat ini ketemu=tidak ketemu.
3. Cek apakah saat ini ketemu != ketemu dan Ib < dari Ia? Jika iya maka buka elemen ke-k, dimana k adalah Ia+Ib/2 = 10+1/2= 5 (Biasanya pembulatan kebawah).
4. Sekarang periksa elemen ke-5 apakah sama dengan 2 (bilangan yang dicari)? Ternyata bukan, elemen ke-5 adalah 6.
5. Karena bukan maka periksa apakah nilai elemen ke-5 > dari 2?? Jika iya maka nilai Ia akan diubah menjadi k atau sama saja dengan Ia=k=5. Sehingga area yang dicari menjadi lebih sempit.

Nilai 1 2 4 4 6
Indeks 1 (Ib) 2 3 4 5 (Ia)

6. Cek apakah saat ini ketemu != ketemu dan Ib < dari Ia? Jika iya maka buka elemen ke-k, dimana k adalah Ia+Ib/2 = 1+5/2= 3.
7. periksa elemen ke-3 apakah sama dengan 2 (bilangan yang dicari)? Ternyata bukan, elemen ke-3 adalah 4.
8. Karena bukan maka periksa apakah nilai elemen ke-3 > dari 2?? Jika iya maka nilai Ia akan diubah menjadi  k atau sama saja dengan Ia=k=3.

Nilai 1 2 4
Indeks 1 (Ib) 2 3 (Ib)

9. Cek apakah saat ini ketemu != ketemu dan Ib < dari Ia? Jika iya maka buka elemen ke-k, dimana k adalah Ia+Ib/2 = 1+3/2= 2.
10. periksa elemen ke-2 apakah sama dengan 2 (bilangan yang dicari)? Ternyata benar. Jika benar ketemu =ketemu.
11. Cek apakah saat ini ketemu != ketemu dan Ib < dari Ia? tidak! ketemu=ketemu maka perlulangan berhenti.

Jika dilihat kembali dengan binary search elemen yang diperiksa hanya elemen ke 5, 3 dan 2. dengan tiga langkah elemen yang dicari langsung ketemu.

Pemecahan masalah penyusunan struktur tree dg contoh kasus operasi matematika(C#)

Pada operasi matematika, kita kerap kali menghadapi masalah siapa operasi yang harus didahulukan atau yg terakhir kita eksekusi, misal:  5+4^2*7

Pada operasi diatas, kita tidak bisa langsung melakukan perhitungan dari depan, misal 5+4=9, 9^2=81, dan 81*7=567. Tidak seperti itu bukan.. Untuk menghitung operasi di atas, kita harus mulai dari 4^2=16, lalu 16*7=112, dan 112+5=117….

567 dan 117, berbeda jauh bukan? dan sialnya, akan ada banyak operasi matematika yang jauh lebih kompleks dari kasus di atas. Mungkin ini bukanlah hal yang sulit bila kita hitung secara manual, tapi ini tidaklah mudah untuk kita terjemahkan ke dalam program. Maka dari itu, kita perlu menerapkan suatu teknik yang bisa mengatur pengurutan dari eksekusi suatu operasi. Teknik yang akan saya bahas disini adalah dengan menggunakan strutur pohon http://en.wikipedia.org/wiki/Tree_data_structure. Untuk memahami lebih jauh tentang tree silahkan anda pelajari sendiri, karena untuk postingan ini, saya akan berfokus pada teknik pemrogramannya, bukan konsep dari tree itu sendiri..

Baiklah, saya akan membuat sebuah contoh kasus dimana kita akan membuat program kalkulator yang dapat mengeksekusi lebih dari satu operasi dimana di dalamnya terdapat struktur tree untuk menentukan jalanny suatu operasi..
Misal kita memiliki kasus seperti beriktu:

Jelas anda tahu bukan hasilnya berapa? Yak silahkan anda hitung sendiri ^_^..

Mari kita jalannya perhitungan tersebut:

  1. 1^9…..(1), pangkat adalah operasi yang pertama kita jalankan.
  2. 5*3…..(2)
  3. 8/2…..(3)
  4. 3-2…..(4)
  5. (3)*(4)….(5)
  6. (1 )+(2)….(6)
  7. (6)+(5)… finish..

Dari kasus tersebut, hal pertama yang harus kita lakukan adalah memberi level pada masing2 operasi. Level sendiri kita gunakan untuk mengetahui siapa yang harus dikerjakan lebih dulu dan belakangan:

private int duluan(string n)

{

int antri;

if (n == “^”) antri = 3;

else if (n == “!” || n == “C” || n == “P”) antri = 4;

else if (n == “*” || n == “/”) antri = 2;

else if (n == “+” || n == “-“) antri = 1;

else antri = 0;

return antri;

}

Code diatas digunakan untuk mengenali level-level operasi yang dmasukkan. Semakin besar level yang dimilik oleh suatu operasi, maka operasi tersebut akan diutamakan dari operasi lain yang level nya lebih rendah..

Setelah itu, dalam satu kasus, tentunya kita harus mengenali mana saja yang termasuk operasi atau mana yang bukan. Misal: 7+5, dari operasi di atas, tentunya program harus tahu apakah “7” merupakan sebuah angka? atau “+” tersbut mrpkn sebuah angka atau operasi? Nah, maka dari itu kita harus kenali satu persatu, berikut pemecahan yang saya buat dari masalah tersebut:

private int operato(string i)

{

if (i == “^” || i == “*” || i == “/” || i == “+” || i == “-” || i == “!” || i == “C” || i == “P”)

return 1;

else

return 0;

}

Dari code di atas, akan dikenali apakah suatu inputan bernilai sebagai operator atau angka..

Di dalam tree, kita mengenal istilah pop dan push(silahkan pelajari lagi mengenai konsep ini). Saya akan jelaskan secara singkat, untuk melakukan pengurutan operasi, kita akan melibatkan suatu tempat penyimpanan sementara yang berbentuk array yang berguna untuk membantu kita menerapkan pengurutan operasi. Nah, “push” sendiri adalah suatu perintah dimana kita ingin menginput suatu nilai ke dalam suatu tempat penyimpanan tadi, sedangkan “pop” adalah kondisi kita ingin mengambil nilai terakhir dari suatu array dan mengeluarkannya dari tempat penyimpanan sementara tersebut. Karena ada ny nilai tempat penyimpanan tersebut, maka kita harus mendeklarasikannya ke dalam sebuah variabel array(anda bisa menggunakan tipe list<> atau yg lainnya, tapi saya contohkan dengan array):

private double[] nilai = new double[100];//variabel penyimpanan sementara

private int b;//indeks variabel nilai[]

Setelah itu, kita buat perintah push dan pop nya:

private void pushHitung(double isi)

{

b += 1;

nilai[b] = isi;

}

private double popHitung()

{

double bentar;

bentar = nilai[b];

b–;

return bentar;

}
Code di atas telah memperlihatkan bagaimana suatu nilai akan disimpan ke dalam array.

Untuk menyempurnakan aplikasi perhitungan kita, mari kita tambahkan agar tidak hanya operasi-operasi biasa yang bisa kita eksekusi, tetapi kita buat perhitungan2 seperti “sin”,”cos”,”tan”, “permutasi”, “combinasi”, dll dapat kita eksekusi juga. Untuk melakukan hal itu, pertama-tama, kita harus definisikan apa2 saja yang bisa kita eksekusi:

string[] strFunctionsdepan ={“sqrt”,”abs”, “sin”, “cos”, “tan”, “asin”,”acos”,”atan”,

“sinh”,”cosh”,”tanh”,”exp”,”ln”,”log”};

string[] strFunctionBelakang = { “!” };

string[] strFunctionDeBel = { “P”, “C” };


Operasi2 tersebut saya bagi menjadi tiga jenis, “strFunctiondepan” dimana operasi tersebut akan diletakkan di depan angka, misal cos(90), lalu ada “strFunctionBelakang” dimana operasi tersebut akan diletakkan di belakang suatu angka, misal faktorial: 5!, dan satu lagi operasi “strFunctionDeBel” dimana operasi tersebut diletakkan di antara angka yang akan akan di eksekusi, misal permutasi: 5P2.

Nah, karena kita sudah mendefinisikan beberapa penghitugan sendiri, berarti program kita juga harus bisa melakukan pengenalan terhadap operasi-operasi tersebut, mari kita buat agar program dapat mengenali penghitungan yang sudah kita definisikan tersebut:

private bool cekFungsiDepan(string isi)

{

for (int i = 0; i < strFunctionsdepan.Length; i++)

if (string.Compare(isi, strFunctionsdepan[i], true) == 0)

return true;

return false;

}

private bool cekFungsiBelakang(string isi)

{

for (int i = 0; i < strFunctionBelakang.Length; i++)

if (string.Compare(isi, strFunctionBelakang[i], true) == 0)

return true;

return false;

}

private bool cekFungsiDeBel(string isi)

{

for (int i = 0; i < strFunctionDeBel.Length; i++)

if (string.Compare(isi, strFunctionDeBel[i], true) == 0)

return true;

return false;

}

Code di atas berguna untuk mengenali fungsi yang telah kita definisikan sendiri.

Setelah kita berhasil mengenali operasi2 tersebut, mari kita buat suatu perintah yang akan mendefinisikan apa perintah yang akan dilakukan jika kita mengeksekusi program tersebut:

private double operation(string fungsi, double nilai)

{

double hasil;

switch (fungsi)

{

case “sin”:

hasil = Math.Sin(nilai);

break;

case “cos”:

hasil = Math.Cos(nilai);

break;

case “tan”:

hasil = Math.Tan(nilai);

break;

case “abs”:

hasil = Math.Abs(nilai);

break;

case “asin”:

hasil = Math.Asin(nilai);

break;

case “acos”:

hasil = Math.Acos(nilai);

break;

case “atan”:

hasil = Math.Atan(nilai);

break;

case “sinh”:

hasil = Math.Sinh(nilai);

break;

case “cosh”:

hasil = Math.Cosh(nilai);

break;

case “tanh”:

hasil = Math.Tanh(nilai);

break;

case “exp”:

hasil = Math.Exp(nilai);

break;

case “ln”:

hasil = Math.Log(nilai);

break;

case “log”:

hasil = Math.Log10(nilai);

break;

case “sqrt”:

hasil = Math.Sqrt(nilai);

break;

default:

hasil = 0;

break;

}

return hasil;

}

Setelah itu, mari kita maju ke tahap dimana input yang kita masukkan akan di urutkan terlebih dahulu berdasarkan levelnya:

private int x, y;//indeks array

private string[] stack = new string[100];//tempat menyimpan sementara

private string[] itu = new string[100];//variabel penyimpanan akhir

private string sementara = “”;//penyimpanan string berbentuk digit sementara

public ubahOrder(string isi)

{

string awal;

x = 0; y = 0;

//Membaca tiap karakter sesuai panjangnya

for (int i = 0; i < isi.Length; i++)

{

awal = isi.Substring(i, 1);

if (awal == “(“)

{

if (sementara != “”)

simpan();

push(awal);

}

else if (awal == “)”)

{

//Memasukkan angka ke dalam nilai

if (sementara != “”)

simpan();

while (stack[x] != “(“)

{

itu[y] = pop();

y += 1;

}

pop();

}

else

{

if (operato(awal) == 1)

{

while (duluan(awal) <= duluan(stack[x]) && x != 0)

{

if (sementara != “”)

simpan();

itu[y] = pop();

y += 1;

}

push(awal);

//Memasukkan angka ke dalam nilai

if (sementara != “”)

simpan();

}

else

{

sementara += awal;

}

}

}

//Memasukkan angka ke dalam nilai

if (sementara != “”)

simpan();

//Mengeluarkan nilai yang masih ada di dalam stack

if (x != 0)

{

while (x > 0 && stack[x] != “(“)

{

itu[y] = pop();

y += 1;

}

}

}

Anda melihat di dalam code di atas memanggil sebuah fungsi simpan, yang digunakan untuk menyimpan tumpukan yang baru untuk pengurutannya, mari kita buat fungsi simpan tersebut seperti beriktu:

private void simpan()

{

itu[y] = sementara;

y += 1;

sementara = “”;

}

Setelah itu selesai, mari kita buat sebuah perintah yang digunakan untuk melakukan perhitungan dari operasi yang kita masukkan:

private double hasil;//penyimpanan hasil akhir

public hitung(string[] nilai, int batas)

{

hasil = 0;

int s;

string kar;

double kiri, kanan;

b = 0;

for (s = 0; s < batas; s++)

{

kar = nilai[s];

if (kar == “^”)

{

kanan = popHitung();

kiri = popHitung();

hasil = (Math.Pow(kiri, kanan));

pushHitung(hasil);

}

else if (kar == “*”)

{

kanan = popHitung();

kiri = popHitung();

hasil = (kiri * kanan);

pushHitung(hasil);

}

else if (kar == “/”)

{

kanan = popHitung();

kiri = popHitung();

hasil = (kiri / kanan);

pushHitung(hasil);

}

else if (kar == “+”)

{

kanan = popHitung();

kiri = popHitung();

hasil = (kiri + kanan);

pushHitung(hasil);

}

else if (kar == “-“)

{

kanan = popHitung();

kiri = popHitung();

hasil = (kiri – kanan);

pushHitung(hasil);

}

else if (cekFungsiDepan(kar))

{

s += 1;

pushHitung(operation(kar, double.Parse(nilai[s])));

hasil = operation(kar, double.Parse(nilai[s]));

}

else if (cekFungsiBelakang(kar))

{

double ini = popHitung();

hasil = faktorial(ini);

pushHitung(hasil);

}

else if (cekFungsiDeBel(kar))

{

double ini = popHitung();

double itu = popHitung();

if (kar == “P”)

hasil = permutasi(itu, ini);

else if (kar == “C”)

hasil = kombinasi(itu, ini);

pushHitung(hasil);

}

else

{

pushHitung(double.Parse(kar));

hasil = double.Parse(kar);

}

}

}

Selesai, anda tinggal memasukkan text yang di input user ke kalkulator dan mengeksekusinya setelah melakukan pengurutan:

ubahOrder baru = new ubahOrder(“input dari user”);

hitung ini = new hitung(baru.getItu(), baru.getY());

textBox2.Text = ini.getHasil().ToString();

Selesai…

Hasil dari code di atas akan menjadi seperti berikut:

Bila ada yang belum jelas, anda dapat mengunduh source dari link berikut: http://sabitblog.blogspot.com/2010/08/smart-statmat.html. Disana akan ada link sebuah aplikasi open source yang dapat anda download juga source code ny…

Selamat mencoba…


Saya bukanlah seorang master, hanya seorang pelajar yg mencoba sharing isi kepalanya..

Jika ada kesalahan dari yg saya buat, mohon koreksi…

Semoga membantu…

%d bloggers like this: