Senin, 22 November 2010

Pemrograman Qbasic 9

         MODUL 9
        PENGOLAHAN FILE ACAK

        Pada file sequential pengolahan datanya bersifat FIFO, tetapi
        dalam pengolahan data kadang-kadang diperlukan proses pengolahan
        yang sifatnya acak sehingga pengolahannya dapat dilakukan dengan
        cepat dan sederhana.

        File sequential banyak digunakan pada ekspor/impor data antar
        sistem dimana format pada sistem yang satu tidak dikenali oleh
        sistem lain, sehingga data dari suatu sistem perlu diekspor dalam
        bentuk teks, kemudian diimpor kembali oleh sistem lain. Pada
        pengolahan seperti ini tentu saja proses pengolahannya bersifat
        FIFO.

        Pengolahan data yang membutuhkan pencarian, pengurutan dan
        perbaikan data tentu saja sulit menggunakan proses pengolahan
        FIFO, karena akan menggunakan sumber daya yang besar dan menjadi
        rumit. Pada pengolahan data seperti ini sangat dibutuhkan proses
        pemasukan maupun pengambilannya berdasarkan alamat data tersebut.

        Agar data dapat diambil dengan cepat, tentu saja dalam
        penyimpannannya membutuhkan keteraturan, yaitu setiap data
        memiliki ukuran yang sama, sehingga alamat data dapat didapatkan
        dengan cepat.


        FILE ACAK

        File acak didalam pengolahannya data ditempatkan dalam bentuk
        record yang memiliki panjang yang tertentu. Dengan sistem
        pengolahan yang demikian suatu record data dapat langsung dibaca
        ataupun ditulis tanpa harus memproses record sebelumnya.  Dalam
        hal ini type data record akan berperan.

        Contoh :

        TYPE SISWA
             NOINDUK AS STRING * 10
             NAMA    AS STRING * 15
             TEORI   AS SINGLE
             PRAKTEK AS SINGLE
             RATA    AS SINGLE
        END TYPE
        Dim DAT As SISWA

        Perintah pengolahan file ACAK


        1. Perintah membuka file ACAK

        Sebelum suatu file randon dapat digunakan harus dibuka, jika file
        tersebut belum ada, maka akan dibuat yang baru. Adapun perintah
        membuka file ACAK adalah sebagai berikut :

        OPEN namafile FOR RANDOM  AS [#]filenum [LEN=reclen]

        Contoh :

        OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT)

        Membuka file "siswa.rec" untuk diolah secara acak sebagai file
        nomor 1 dan ukuran tiap record adalah sama dengan ukuran variabel
        DAT.


        2. Mendapatkan jumlah record pada file ACAK yang telah terbuka.

        JlhRec = LOF(1)/LEN(DAT)

        Jumlah record dalam file ACAK adalah ukuran keseluruhan file ACAK
        dibagi dengan ukuran tiap record.


        3. Perintah input/output pada file ACAK

        Perintah menulis data

        PUT [#]filenum[,nomorrecord][,variable]

        Contoh :

        DAT.NOINDUK = "920403024"
        DAT.NAMA    = "Hendra"
        DAT.TEORI   = 70
        DAT.PRAKTEK = 80
        DAT.RATA    = (DAT.TEORI+DAT.PRAKTEK)/2

        PUT #1,JlhRec+1,DAT

        Menyimpan data dari variabel DAT ke file ACAK nomor 1, sebagai
        record baru pada akhir file (JlhRec+1).


        Perintah membaca data

        GET [#]filenum[,nomorrecord][,variabel]

        Contoh :

        GET #1,1,DAT

        Membaca data record nomor 1 dari file ACAK nomor 1 ke variabel
        DAT.


        4. Perintah menutup file ACAK
        Setelah selesai digunakan, file ACAK perlu ditutup untuk
        memastikan semua data ditulis ke media penyimpanan, dan
        memberikan indikator EOF.

        Contoh :

        CLOSE #1

        Menutup file acak nomor 1.


        Contoh sederhana program pengolahan data dengan file ACAK.

        'PROGRAM MENGISI DATA KE FILE SISWA.REC
        TYPE SISWA
             NOINDUK AS STRING * 10
             NAMA    AS STRING * 15
             TEORI   AS SINGLE
             PRAKTEK AS SINGLE
             RATA    AS SINGLE
        END TYPE
        DIM DAT AS SISWA
        DIM NOINDUK AS STRING
        OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT)
        RECNO = LOF(1)/LEN(DAT)
        DO
           PRINT "DATA SISWA KE -";I
           INPUT "NO.INDUK  :",NOINDUK
           IF NOINDUK <> "" THEN
              DAT.NOINDUK = NOINDUK
              INPUT "NAMA      :",DAT.NAMA
              INPUT "TEORI     :",DAT.TEORI
              INPUT "PRAKTEK   :",DAT.PRAKTEK
              DAT.RATA = (DAT.TEORI+DAT.PRAKTEK)/2
              PUT #1,RECNO+1,DAT
              RECNO = RECNO + 1
           ENDIF
        LOOP UNTIL NOINDUK = ""
        CLOSE #1
        END

        'PROGRAM MENGURUT DATA DI FILE SISWA.REC
        TYPE SISWA
             NOINDUK AS STRING * 10
             NAMA    AS STRING * 15
             TEORI   AS SINGLE
             PRAKTEK AS SINGLE
             RATA    AS SINGLE
        END TYPE
        DIM DAT1 AS SISWA
        DIM DAT2 AS SISWA
        OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT)
        JD = LOF(1)/LEN(DAT)
        FOR I = (JD-1) TO 1 STEP -1
            Sempurna = 1
            FOR J = 1 TO I STEP 1
                GET #1,J,DAT1
                GET #1,J+1,DAT2
                IF DAT1.NAMA > DAT2.NAMA THEN
                   PUT #1,J,DAT2
                   PUT #1,J+1,DAT1
                   Sempurna = 0
                ENDIF
            NEXT J
            If Sempurna = 1 Then
               I = 0
            End IF
        NEXT I
        CLOSE #1
        END

        'PROGRAM BACA DATA DARI SISWA.REC DAN MENCETAK KE LAYAR
        CLS
        TYPE SISWA
             NOINDUK AS STRING * 10
             NAMA    AS STRING * 15
             TEORI   AS SINGLE
             PRAKTEK AS SINGLE
             RATA    AS SINGLE
        END TYPE
        DIM DAT AS SISWA
        OPEN "SISWA.REC" FOR RANDOM AS #1 LEN = LEN(DAT)
        JD = LOF(1)/LEN(DAT)
        PRINT -------------------------------------------------------------------"
        PRINT "NO.INDUK   NAMA            TEORI     PRAKTEK   RATA-RATA   ULUS   "
        PRINT "-------------------------------------------------------------------"
        POLA$="\        \ \             \ ###.##    ###.##    ###.##      \     \ "
        VIEW PRINT 4 TO 23
        FOR I = 1 TO JD STEP 1
            GET #1,I,DAT
            IF DAT.RATA < 60 THEN LULUS$="TIDAK" ELSE LULUS$ = "YA"
            PRINT USING POLA$;DAT.NOINDUK;DAT.NAMA$;DAT.TEORI;
                                DAT.PRAKTEK;DAT.RATA;LULUS$
        NEXT I
        CLOSE #1
        END


        LATIHAN

        1. Buatlah program untuk mengisi data ke file PEGAWAI.REC.

        NAMA         GOL  JAM KERJA
        SURYAJAYA    A           50
        SUTIMAN      C           48
        JUSMAN       B           60
        WIJAYA       A           50
        YUSNI        B           48
        TUTI         A           45

        2. Buatlah program mengurut data pada PEGEWAI.REC berdasarkan
        nama.

        3. Buatlah program membaca data dari file PEGAWAI.REC dan
        menghasilkan laporan dengan ketentuan.

        - Gaji Pokok PEGAWAI ditentukan sebagai berikut :
          Golongan      Gaji Pokok/Bulan
              A         Rp.  175.000,00
              B         Rp.  220.000,00
              C         Rp.  350.000,00
        - jika jam kerja > 48 jam diberikan Bonus = (jam kerja - 48) * 5000/jam
        - jika jam kerja < 48 jan dikenakan Potongan = (48 - jam kerja) * 1000/jam
        - Total Gaji = Gaji Pokok + Bonus - Potongan
        Output yang diharapkan :

                           P.T. JAYA WIJAYA
                      JL. Kemerdekaan Barat No. 12
                      ============================

                          LAPORAN GAJI PEGAWAI
           ========================================================
           Nama      Gol  Jam     Gaji     Bonus Potongan    Total
           Pegawai        Kerja   Pokok     (Rp)   (Rp)       (Rp)
           --------------------------------------------------------
           Suryajaya  C      50   350,000  10,000    -      360,000
           Sutiman    B      48   200,000     -      -      200,000
           ========================================================
                                                 Total :    560,000
           ========================================================