Kamis, Agustus 13, 2015

Programming in C - Part 21 : Header, extern dan Fungsi Rekursif

Dalam sebuah program yang kompleks, fungsi selalu diletakkan dalam library sehingga dapat digunakan secara bersama- sama oleh beberapa bagian program. Fungsi-fungsi dapat dikumpulkan dalam suatu file tersendiri.  Untuk menggunakan fungsi yang ditulis di file lain dapat menggunakan :
  • header
  • extern
Header adalah file teks yang biasanya diberikan ekstensi .h (header) yang berisi fungsi - fungsi yang dapat digunakan oleh program yang meng-include header tersebut. Untuk menggunakan fungsi ini dilakukan dengan Menggunakan kata kunci include "namaFile.h"

Penggunaan header lebih praktis. Namun perlu diketahui bahwa header hanya boleh diinclude satu kali saja, jika tidak akan muncul pesan kesalahan pada saat kompilasi. Bila anda menuliskan fungsi dalam suatu file yang diberinama fungsi.h, maka anda dapat menggunakan semua fungsi dalam file fungsi.h tersebut dengan memanggilnya sbb :

#include "fungsi.h"  (tanpa token ;)

alternatif lain adalah dengan menggunakan extern. Penggunaan extern untuk memanggil fungsi yang ditulis pada file fungsi.c dapat dilakukan dengan cara menulis nama fungsi yang akan digunakan (seperti pada saat mendeklarasikannya di awal file main). Selanjutnya kompilasi kedua file dengan cara (contoh menggunakan compiler gcc dengan mesin linux ubuntu)

gcc -o fileHasil fileSumber1.c fileSumber2.c

Selain untuk menggunakan fungsi secara bersama-sama, extern juga digunakan untuk membaca variabel yang didefinisikan atau diinisiasi di file lain. Seringkali pada program kompleks, setting tertentu diletakkan pada file tersendiri sehingga memudahkan pada saat adanya perubahan. Dalam kondisi inilah penggunaan extern akan memberikan manfaat yang cukup besar.


Fungsi rekursif


Seperti yang diketahui bahwa fungsi adalah sekumpulan perintah yang dibuat untuk melakukan tugas tertentu dan dapat memberikan hasil luaran yang dapat dikembalikan kepada program yang memanggil fungsi tersebut. Tugas yang diselesaikan dengan fungsi adalah tugas-tugas yang lebih kecil dan menunjang penggunaan program. Program akan memanggil fungsi untuk mengerjakan tugas tertentu dan 'melaporkan' hasil pekerjaannya kepada program yang memanggil tersebut.

Sebuah fungsi dapat memanggil fungsi lain (bekerjasama) untuk menghasilkan luaran tertentu, bahkan, fungsi dapat memanggil dirinya sendiri. Fungsi yang dapat memanggil dirinya sendiri  inilah yang disebut dengan fungsi Rekursif

Untuk membuat dan menggunakan fungsi rekursif sama dengan fungsi - fungsi biasa. Namun demikian, anda harus ekstra hati-hati menmbuat fungsi rekursif karena jika tidak hati-hati anda dapat terjebak dalam fungsi tersebut dan tidak bisa keluar. Oleh karena itu exit point harus jelas

Untuk dapat memahami fungsi rekursif ini silahkan lihat contoh studi kasus di bawah ini

Studi Kasus 1 : Membuat fungsi 'terbilang'

Anda diminta untuk membuat suatu fungsi yang akan digunakan untuk 'menyebutkan' angka (dan deretan angka) dalam bahasa Indonesia. Saya memberi nama fungsi ini 'terbilang' karena pada setiap kuitansi atau invoice selalu menyebutkan jumlah uang yang harus dibayar disamping angkanya. Misalnya
Rp 1.200.000 (Satu Juta Dua Ratus Ribu Rupiah)
Tips :
Untuk menyelesaikan tugas ini, anda dapat menggunakan fungsi rekursif. Anda juga harus memperhatikan pola yang akan digunakan. Silahkan ikuti dan kembangkan pola berikut ini

1 - 11 : angka murni, dapat diucapkan langsung
12 - 19 : angka ditambah kata "Belas "
20 - 99 : angka ditambah kata "Puluh " ditambah sebutan 1 - 11
100 - 199 : kata "Seratus" ditambah sebutan dari dua digit terakhir (159 = Seratus Lima Puluh Sembilan)
200 - 999 :angka ditambah kata "Ratus " ditambah dua digit terakhir
1000 - 1999 : kata "Seribu " ditambah sebutan 3 digit terakhir

dst...silahkan kembangkan sendiri  sesuai kebutuhan. Perlu melakukan analisa bahasa dulu sebelum membuat pola. Misalnya 200 akan di sebut "dua ratus" bukan "dua nol nol".Demikian juga dengan 111 akan disebut "Seratus Sebelas", bukan "Satu ratus Sebelas" atau "Satu Ratus Satu Satu".

Bila diperhatikan pola di atas, maka anda akan segera tahu bahwa rekursif dibutuhkan mulai pada pola ke tiga ( 20 - 99) dst, dimana progam akan mengambil character pertama, dan mengembalikan sisanya ke dalam fungsinya sendiri (mulai dari awal loop)


Sebelum anda melihat solusi yang saya buat, silahkan anda coba untuk membuat sendiri. Jika mengalami kesulitan silahkan lihat solusi saya berikut ini

Letakkan fungsi berikut dalam satu file yang diberi nama,misalnya, fungsi.h

char *terbilang(unsigned int angka)
{
 
  char *namaAngka[12] = {"", "Satu ", "Dua ", "Tiga ", "Empat ", "Lima ", "Enam ", "Tujuh ", "Delapan ", "Sembilan ", "Sepuluh ","Sebelas " };
 static char hasil[] = "" ;
    if (angka==0)
        { return "NOL" ;}
    else if (angka<12)   
      {
      strcat(hasil,*(namaAngka+angka));  // s/d 11
      return hasil;
      }
    else if (angka<20){                    // s/d 19
      strcat(hasil,*(namaAngka+(angka-10)));
      strcat(hasil, "Belas ");
      return hasil;
    }
    else if (angka<100){                // s/d 99
      strcat(hasil,*(namaAngka+(angka/10)));
      strcat(hasil, "Puluh ");
      strcat(hasil,*(namaAngka+(angka % 10)));
      return hasil;
    }
    else if (angka<200){                // s/d 199
      strcat(hasil, "Seratus ");
      terbilang(angka-100);
      return hasil;
    }
    else if (angka<1000){                // s/d 999
      terbilang(angka/100);
      strcat(hasil, "Ratus ");
      terbilang(angka % 100);
      return hasil;
    }
    else if (angka<2000){                // s/d 1999
      strcat(hasil, "Seribu ");
      terbilang(angka-1000);
      return hasil;
    }
    else if (angka<1000000){        // s/d 999.999
      terbilang(angka/1000);
      strcat(hasil, "Ribu ");
      terbilang(angka % 1000);
      return hasil;  
    }
   else if (angka<1000000000){       // s/d    999.999.999
      terbilang(angka/1000000);
      strcat(hasil, "Juta ");
      terbilang(angka % 1000000);
      return hasil;
    }
  
    else if (angka<1000000000000){       // 1 Triliun
      terbilang(angka/1000000000);         // Tipe data membatasi MAKSIMAL 4.199.999.999 !
      strcat(hasil, "Milyar ");
      terbilang(angka % 1000000000);
      return hasil;                       
    }

}



Selanjutnya buat program main yang akan memanggil fungsi terbilang. Sebelumnya anda harus menginclude file header tersebut ke bagian atas progam utama sehingga fungsi tersebut dapat dipanggil

/*** Demonstrasi penggunaan include dan pemanggilan
 * dan eksekusi fungsi rekursif
 *
 * Created By: Sastrawan
 *
 * Nama File : headerRekursif.c
 *
 ***/

#include <stdio.h>
#include "fungsiKu.h"

int main( int argc, char *argv[])

 {

    char *asil;
    unsigned int i ;
  
    i = 123456;
    asil= terbilang(i);
    printf("%s\n", asil);
  
    *asil = NULL ;  // pointer asil dikosongkan dulu
                    // jika tidak akan menyambung asil sebelumnya
                    // dan menggambungkan menjadi satu
                    // Ini tidak kita inginkan
  
    i = 2+3+10*20 ;
    asil= terbilang(i);
    printf("%s\n", asil);

 }
Bila program di atas dikompilasi dan dijalankan maka akan menghasilkan

Seratus Dua Puluh Tiga Ribu Empat Ratus Lima Puluh Enam
Dua Ratus Lima

Tips: Jika anda menambahkan perintah untuk memainkan file audio tertentu (untuk menyebut angka dengan suara), maka anda akan mendapatkan program seperti program mahal yang biasa dipakai di tempat pelayanan umum (bank, rumah sakit, dll) untuk membuat nomor antrian!.

Studi kasus 2.

Studi kasus ini lebih ringan dan mudah dibanding yang pertama. Untuk itu saya tidak menyediakan solusinya karena saya percaya anda akan dapat menyelesaikan sendiri berdasarkan ide yang dipakai di atas.
Silahkan membuat fungsi untuk menyebut nomor telepon !. Ingat nomor telepon 654555 akan dipanggil "Enam Lima Empat Lima Lima Lima" bukan " Enam Ratus Lima Puluh Empat Ribu Lima Ratus Lima Puluh Lima " (Ooo dear, saya menggunakan fungsi rekursif di atas untuk mencetak ini..)

0 comments:

Posting Komentar

Write your comment here