Senin, 22 November 2010

Pemrograman Qbasic 6

 

        MODUL 6
        FUNGSI CIPTAAN DAN SUB RUTIN

        Fungsi Ciptaan
        Fungsi-fungsi bawaan yang disediakan oleh QBasic adalah bersifat
        umum, sehingga kadang-kadang programmer harus membuat fungsi
        sendiri sesuai dengan kebutuhannya.

        Misalnya :
        Dalam mengembangkan program keuangan, seorang programmer akan
        banyak membutuhkan fungsi-fungsi Time Value of Money seperti
        Present Value, Future Value, Depresiasi dll.

        QBasic menyediakan fasilitas bagi programmer yang ingin
        mengembangkan fungsi ciptaannya sendiri. Adapun tata cara
        penulisannya adalah sebagai berikut :

        FUNCTION namafungsi[(parameterlist)] [STATIC]
            [statementblock]
            namafungsi = expression
            [statementblock]
        END FUNCTION


        type data yang dikembalikan ditentukan oleh akhiran pada nama
        tersebut(%, &, !, #, atau $) yang masing-masing adalah INTEGER,
        LONG, SINGLE, DOUBLE dan STRING.

        Contoh :

        FUNCTION SLN#(cost AS double, salvage AS double, life AS single)
           SLN# = (cost-salvage)/life
        END FUNCTION

        Fungsi diatas adalah fungsi ciptaan untuk menghitung depresiasi
        dengan metode garis lulus.

        Contoh Lain :

        FUNCTION FV#(pv AS double, rate AS single, term AS integer)
           Dim npv as double, i as integer
           npv = pv
           FOR i = 1 TO term STEP 1
               npv = npv + npv*rate        'nilai akhir = pokok + bunga
           NEXT i
           FV# = npv
        END FUNCTION

        atau dengan rumus pertumbuhan

        FUNCTION FV#(pv AS double, rate AS single, term AS integer)
           FV# = np*(1+rate)^term
        END FUNCTION

        Fungsi diatas adalah fungsi ciptaan untuk menghitung Future Value
        dari suatu nilai uang, jika diketahui suku bunga per periode dan
        jumlah periode yang diinginkan.

        Contoh :
        Misalnya anda memiliki uang Rp. 1.000.000 (satu juta), anda
        menyimpannya ke Bank dengan suku bunga 10% per tahun, berapa uang
        anda setelah disimpan 3 tahun ?

        Catatan :
        Pada Qbasic, fungsi ciptaan disimpan pada lokasi yang berlainnan
        dengan program utama, untuk beralih ke program utama maupun
        fungsi ciptaan anda dapat menggunakan tombol F2

        Anda dapat menggunakan perintah EXIT FUNCTION untuk keluar dari
        fungsi.

        Contoh :

        FUNCTION PRIMA! (bilangan AS LONG)
        DIM i AS INTEGER
        IF bilangan < 2 THEN
           PRIMA! = 0                    'semua bilangan < 2 bukan prima
        ELSEIF bilangan < 4 THEN
           PRIMA! = 1                    'bilangan 2 dan 3 adalah prima
        ELSE
           i = 2                         'bagi bilangan tersebut mulai
           DO WHILE i <= SQR(bilangan)   'dari 2 s/d Akar dari bilangan
               IF (bilangan MOD i) = 0 THEN
                  PRIMA! = 0             'jika habis dibagi, bukan prima
                  EXIT FUNCTION
               END IF
               i = i + 1
           LOOP
           PRIMA! = 1                    'jika tidak habis dibagi, prima
        END IF
        END FUNCTION

        Menggunakan Fungsi Ciptaan

        Cara menggunakan fungsi ciptaan sama saja dengan fungsi bawaan,
        contoh :

        DIM I AS LONG
        FOR I = 1 To 30
            If PRIMA!(I) = 1 Then
               Print I
            End If
        NEXT I

        Akan mencetak bilangan prima antara 1 s/d 30

        Sub Rutin

        Sub Rutin merupakan sebagian dari program. Adapun keuntungan dari
        pembentukan adalah menghindari pengetikan yang berulang-ulang
        terhadap bagian program yang sama, dan membuat program lebih
        terstruktur.

        Pada QBasic tata cara penulisan Sub Rutin adalah sebagai berikut:

        SUB namasub [(Parameterlist)] [STATIC]
          [statementblock]
        END SUB

        Contoh :
        Sub KOTAK(Y1%,X1%,Y2%,X2%)
            posisiX% = POS(0)             'Simpan posisi kursor sekarang
            posisiY% = CRSLIN
            LOCATE Y1%,X1%
            PRINT Chr$(218);String$(X2-X1-2,196);Chr$(191)
            FOR I%=Y1% TO Y2% STEP 1
                LOCATE I%,X1% : PRINT Chr$(179)
                LOCATE I%,X2% : PRINT Chr$(179)
            NEXT I%
            LOCATE Y2%,X1%
            PRINT Chr$(192);String$(X2-X1-2,196);Chr$(217)
            LOCATE POSISIY%,POSISIX%
        END SUB

        Sub diatas akan mengambar suatu kotak ASCII single berdasarkan
        koordinat yang diberikan.

        Contoh :
        CALL KOTAK(5,10,20,70)

        pengiriman argumen pada Sub Procedure terdapat dua cara antara
        lain :
        1. Secara referensi
        Argumen yang diberikan dengan cara ini kepada procedure dan
        diolah, kemudian hasil akhirnya akan didefinisikan pada variabel
        tersebut pada main program.
        2. Dengan Value/Nilai
        Argumen ini hanya berupa nilai yang dipergunakan oleh procedure
        pada saat pengolahan.

        Contoh :

        SUB contoh(A as INTEGER)
            A = 10
        END SUB

        Pengiriman argumen secara Referensi :

        DIM Nilai As INTEGER
        Nilai = 1
        Call contoh(Nilai)            ' Call
        Print Nilai                   ' Akan tercetak 10

        Pengiriman argumen secara Value :

        DIM Nilai As INTEGER
        Nilai = 1
        contoh(Nilai)                 ' Tanpa Call
        Print Nilai                   ' Akan tercetak 1

        ----------------------------------------------------------------
        Jadi anda perlu berhati-hati dalam pemakaian Variabel yang
        digunakan sebagai parameter pada saat pemanggilan SUB RUTIN.
        ----------------------------------------------------------------

        static, menyatakan nilai variabel local dalam function tidak
        dibuang ketika fungsi atau sub berakhir.

        Dalam QBasic anda dapat menentukan tingkatan/sifat variabel yang
        mengatur dimana variabel itu digunakan(level of access). Inilah
        tingkatan tersebut :

        1. Variabel Local, hanya bisa digunakan pada Sub Procedure atau
        function tersebut telah selesai dikerjakan, maka variabel lokal
        tersebut dibuang dari memory dan tidak lagi dipergunakan oleh
        bagian program lain.

        2. Variabel Shared, atau variabel global bisa digunakan pada
        seluruh bagian program maupun Sub Procedure tertentu. Nilai
        variabel ini dapat berubah selama program tersebut berjalan.

        3. Variabel Static, adalah variabel local, tetapi variabel ini
        nilainya tetap dipertahankan sampai pemanggilan berikutnya.


        Latihan :
        1. Buatlah fungsi ciptaan terbilang, contoh 1250 akan dibaca
        sebagai "Seribu Duaratus limapuluh".

        2. Buatlah sub kotak double.

        Bilang.Bas

        DECLARE FUNCTION angka$ (x AS INTEGER, posisi AS INTEGER)
        DECLARE FUNCTION ratus$ (x AS INTEGER, posisi AS INTEGER)
        DECLARE FUNCTION terbilang$ (x AS LONG)

        PRINT terbilang$(1234567890)

        FUNCTION angka$ (x AS INTEGER, posisi AS INTEGER)
        SELECT CASE x
               CASE 0: angka$ = "Nol"
               CASE 1:
                       IF posisi = 1 THEN
                          angka$ = "Satu"  'Posisi paling akhir dibaca
                       ELSE                'Satu
                          angka$ = "Se"
                       END IF
               CASE 2: angka$ = "Dua"
               CASE 3: angka$ = "Tiga"
               CASE 4: angka$ = "Empat"
               CASE 5: angka$ = "Lima"
               CASE 6: angka$ = "Enam"
               CASE 7: angka$ = "Tujuh"
               CASE 8: angka$ = "Delapan"
               CASE 9: angka$ = "Sembilan"
               CASE 10: angka$ = "Sepuluh"
               CASE 11: angka$ = "Sebelas"
               CASE 12: angka$ = "Duabelas"
               CASE 13: angka$ = "Tigabelas"
               CASE 14: angka$ = "Empatbelas"
               CASE 15: angka$ = "Limabelas"
               CASE 16: angka$ = "Enambelas"
               CASE 17: angka$ = "Tujuhbelas"
               CASE 18: angka$ = "Delapanbelas"
               CASE 19: angka$ = "Sembilanbelas"
        END SELECT
        END FUNCTION

        FUNCTION ratus$ (x AS INTEGER, posisi AS INTEGER)
        DIM a100 AS INTEGER, a10 AS INTEGER, a1 AS INTEGER
        DIM baca AS STRING
        a100 = x \ 100                     'Ambil angka ratusan
        a10 = (x MOD 100) \ 10             'Ambil angka puluhan
        a1 = x MOD 10                      'Ambil angka satuan
        IF a100 > 0 THEN
           baca = angka$(a100, posisi) + "ratus"
        END IF
        IF a10 = 1 THEN                    'Sepuluh s/d Sembilanbelas
           baca = baca + angka$(a10 * 10 + a1, posisi)
        ELSE
           IF a10 > 0 THEN                 'Duapuluh s/d Sembilanpuluh
              baca = baca + angka$(a10, posisi) + "puluh"
           END IF
           IF a1 > 0 THEN                  'Satu s/d Sembilan
              baca = baca + angka$(a1, posisi)
           END IF
        END IF
        ratus$ = baca
        END FUNCTION

        FUNCTION terbilang$ (x AS LONG)
        DIM milyar AS INTEGER, juta AS INTEGER, ribu AS INTEGER, satu AS
        INTEGER
        DIM baca AS STRING
        IF x = 0 THEN                      'Jika x = Nol
           baca$ = angka$(0, 1)            'Dibaca Nol
        ELSE
           milyar = x \ 1E+09              'Ambil bagian ratusan milyar
           juta = (x MOD 1E+09) \ 1000000  'Ambil bagian ratusan juta
           ribu = (x MOD 1000000) \ 1000   'Ambil bagian ratusan ribu
           satu = x MOD 1000               'Ambil bagian ratusan
           IF milyar > 0 THEN
              baca = ratus$(milyar, 4) + "milyar"
           END IF
           IF juta > 0 THEN
              baca = baca + ratus$(juta, 3) + "juta"
           END IF
           IF ribu > 0 THEN
              baca = baca + ratus$(ribu, 2) + "ribu"
           END IF
           IF satu > 0 THEN
              baca = baca + ratus$(satu, 1)
           END IF

        END IF
        terbilang$ = baca
        END FUNCTION