KUG1C3 Dasar algoritma & pemrograman SEQUENTIAL FILE
Outline Definisi sequential file, & primitive akses Konsolidasi (tanpa & dengan separator) Merging Updating Splitting
Definisi Sequential File Record 1st rec <StdID> <Name> <Major> <Supervisor> File 2nd rec Mark Tersimpan dalam memori sekunder Sequential File (arsip sekuensial) adalah sekumpulan record (rekaman) yang disimpan dalam media penyimpanan sekunder komputer, yang dapat diakses secara berurutan mulai dari record pertama sampai dengan record terakhir, record per record secara searah. Record merupakan kumpulan field. Kumpulan record disebut File. Tiap record memiliki struktur yang sama, dapat berupa tipe data dasar atau tipe data terstruktur (bentukan) Record terakhir adalah record fiktif yang menandai akhir dari arsip. Pada beberapa implementasi, record fiktif ini disebut sebagai EOF (end of file). Sequential File (arsip sekuensial) adalah sekumpulan record (rekaman) yang disimpan dalam media penyimpanan sekunder computer, diakses secara berurutan, secara searah.
Struktur lojik arsip sekuensial Urutan akses satu per satu Rec-1 Rec-2 Rec-3 Rec-N MARK Struktur lojik vertikal Arah akses Rec-1 Rec-2 Rec-3 Rec-N Rekaman fiktif “MARK” ditambahkan untuk memberitahu computer sebagai tanda akhir sebuah arsip. Struktur lojik arsip dapat diilustrasikan secara vertical dan horizontal. Struktur lojik horisontal MARK
Pendefinisian Arsip Sekuensial (1/3) Kamus Type rekaman : <………> {sebuah type terdefinisi untuk setiap record} NamaArsip : SEQFILE of (*) <nama_rek> : rekaman (l) <mark> Dengan catatan bahwa (*) mungkin kosong,1 rekaman atau lebih
Pendefinisian Arsip Sekuensial (2/3) Contoh 1: Arsip MHS yang berisi NIM, nama, dan nilai. Type rekaman : <NIM:integer, Nama:String, Nilai:Integer[0..100]> ArsipMhs : SEQFILE of (*) RekMhs : rekaman (l) <9999999,’’,0> Domain : sesuai dg domain masing-masing rekaman Konstanta : sebuah rekaman misal <7473001,’Juliete’,95>,< 9999999,’’,0 > CONTOH
Pendefinisian Arsip Sekuensial (3/3) Contoh 2: Arsip CC yang berisi data bertipe karakter. Type rekaman : character Dokumen : SEQFILE of (*) CC : rekaman (l) <#> Domain setiap rekaman : character Konstanta : sebuah rekaman misal <’J’>,<‘#’>
Primitif Arsip Sekuensial (1/7) Procedure ASSIGN (Input NamaArsip,NamaFisik) {Arsip sekuensial yang namanya dikenal dalam program sebagai NamaArsip, secara fisik diberi nama NamaFisik IS : sembarang FS : Arsip dg NamaArsip pada program siap dipakai} Dalam matakuliah KUG1C3, perintah ASSIGN tidak didefinisikan dalam teks algoritma.
Primitif Arsip Sekuensial (2/7) Procedure OPEN (Input NamaArsip,<rekaman>) {Arsip Sekuensial siap dibaca. Rekaman pertama yang informasinya ada pada <rekaman> dapat diakses IS : sembarang FS : Informasi pada rekaman siap diakses, dengan mengacu pada <rekaman>} Cara Akses Rekaman Pertama : OPEN (ArsipMhs,RekMhs) OPEN (Dokumen, CC)
Primitif Arsip Sekuensial (3/7) Procedure READ (Input NamaArsip,<rekaman>) {Rekaman sesudah rekaman yang sedang ‘current’,yg dpt diakses IS : <rekaman> bukan merupakan mark (EOF),sebut sebagai current_rekaman FS : Arsip dimajukan satu rekaman,<rekaman> berisi informasi yang disimpan pada rekaman sesudah current_rekaman. Mungkin <rekaman> yang baru adalah mark (EOF)} Cara Akses : READ (ArsipMhs, RekMhs) {NIM 9999999} READ (Dokumen, CC) {CC ‘#’}
Primitif Arsip Sekuensial (4/7) Procedure CLOSE (Input NamaArsip) {Arsip sekuensial ‘ditutup’,tidak dpt diakses maupun ditulis IS : sembarang FS : Arsip tidak dapat diproses lagi} Cara Akses : CLOSE (ArsipMhs) CLOSE (Dokumen)
Primitif Arsip Sekuensial (5/7) Procedure Rewrite (Input/Output NamaArsip) {Arsip sekuensial siap untuk direkam IS : sembarang FS : Arsip sekuensial yang bernama NamaArsip siap untuk direkam pada posisi pertamanya} Cara menyiapkan : Rewrite (ArsipMhs) Rewrite (Dokumen)
Primitif Arsip Sekuensial (6/7) Procedure Write (Input/Output NamaArsip,<rekaman>) {Data pada <rekaman> direkam pada posisi aktual arsip. Kemudian posisi diajukan satu IS : arsip sekuensial berada pada posisi yang telah siap menerima rekaman,<rekaman> bukan merupakan mark (EOF) FS : <rekaman> direkam pada posisi yang telah disiapkan,arsip diajukan satu posisi. Jika <rekaman> yang diisikan ke arsip adalah elemen fiktif yang dimaksudkan sebagai mark,maka arsip tak dapat lagi direkam}
Primitif Arsip Sekuensial (7/7) Cara mengisi :WRITE (ArsipMhs,RekMhs) WRITE (ArsipMhs,<7473002,’Davy’,96>) WRITE (ArsipMhs,Rek1) {Rek1 bertipe rekaman} WRITE (Dokumen,CC) WRITE (Dokumen,<’D’>) WRITE (Dokumen,Kar) {Kar bertipe character} Cara mengisi akhir rekaman : WRITE (ArsipMhs,<9999999,‘’,0>) WRITE (Dokumen,<‘#’>)
Contoh: membaca arsip sambil menghitung nilai rata-rata mahasiswa. Program NILAIRATA_RATA {Model proses sekuensial dengan mark, dg penanganan kasus kosong} Kamus : Type rekaman: <nim:integer, nilai:integer[1..100]> ArsipMhs : SEQFILE of (*)RekMhs: rekaman (1)<9999999,99> SumNil : integer {jumlah nilai} JumMhs : integer {jumlah mahasiswa} Algoritma : OPEN (ArsipMhs,RekMhs) {first-elmt} If RekMhs.nim = 9999999 then Output (‘arsip kosong’) Else SumNil 0 {inisialisasi}; JumMhs 0 {inisialisasi} Repeat Sumnil := Sumnil + RekMhs.nilai {proses} JumMhs := JumMhs + 1 {proses} READ (ArsipMhs,RekMhs) {Next-Elmt} Until (RekMhs.nim = 9999999) {EOF} Output(Sum/JumMhs); {terminasi} CLOSE (ArsipMhs) Contoh: membaca arsip sambil menghitung nilai rata-rata mahasiswa.
File Konsolidasi Didefinisikan sebuah sekuensial file yang terurut, arsip tersebut mengandung kelompok-kelompok data dengan kunci yang sama yang harus diproses sebagai satu kesatuan.
Kelompok lain dikenali karena adanya perubahan kunci. Model konsolidasi (1/2) Kelompok lain dikenali karena adanya perubahan kunci. Tanpa separator
Proses kategori yang sama Program KONSOLIDASITanpaSeparator {tanpa penanganan kasus kosong} {Input: sebuah arsip sequential, terurut} {Proses: mengelompokkan setiap kategori dan memrosesnya} {Output: sesuai hasil proses} Kamus type rekaman: <KeyIn: keytype, {kunci} ValIn: valtype {harga lain yg direkam}> ArsipIn: SEQFILE of (*)RekIn: rekaman (1)<mark,val> EOP: Boolean Current_categ: keytype procedure Init_all_categ {inisialisasi global} procedure Terminasi_all_categ {terminasi global} procedure Proses_FElmt {inisialisasi sebuah kategori} procedure Init_categ {inisialisasi kategori} procedure Proses_current_categ {proses sebuah elemen dlm 1 kategori} procedure Terminasi_categ {terminasi sebuah kategori} Algoritma Init_all_categ OPEN(ArsipIn,RekIn) while not EOP do {proses satu kategori} Init_categ current_categ RekIn.KeyIn repeat Proses_current_categ READ(ArsipIn,RekIn) until (current_categ ≠ RekIn.KeyIn) Terminasi_categ Terminasi_all_categ CLOSE(ArsipIn) Proses kategori yang sama
Program KONSOLIDASITanpaSeparator {Dengan penanganan kasus kosong} {Input: sebuah arsip sequential, terurut} {Proses: mengelompokkan setiap kategori dan memrosesnya} {Output: sesuai hasil proses} Kamus type rekaman: <KeyIn: keytype, {kunci} ValIn: valtype {harga lain yg direkam}> ArsipIn: SEQFILE of (*)RekIn: rekaman (1)<mark,val> EOP: Boolean Current_categ: keytype procedure Init_all_categ {inisialisasi global} procedure Terminasi_all_categ {terminasi global} procedure Proses_FElmt {inisialisasi sebuah kategori} procedure Init_categ {inisialisasi kategori} procedure Proses_current_categ {proses sebuah elemen dlm 1 kategori} procedure Terminasi_categ {terminasi sebuah kategori} Algoritma OPEN(ArsipIn,RekIn) {First_elmt} if (EOP) then Kasus_kosong else {minimal ada 1 kategori} Init_all_categ Repeat {proses satu kategori} Init_categ current_categ RekIn.KeyIn repeat Proses_current_categ READ(ArsipIn,RekIn) until (current_categ ≠ RekIn.KeyIn) Terminasi_categ Until (EOP) Terminasi_all_categ CLOSE(ArsipIn)
Latihan: Konsolidasi tanpa separator Diketahui sebuah arsip nilai mahasiswa, satu mahasiswa dapat mempunyai beberapa buah nilai (karena dalam satu semester mengambil beberapa mata kuliah dan setiap mahasiswa tidak sama mata kuliahnya). Tulislah algoritma untuk menghitung nilai rata-rata setiap mahasiswa dan membuat daftar nilai sederhana, yaitu menuliskan NIM dan nilai rata-rata setiap mahasiswa. Latihan 2 Perhatikan kembali latihan 1, tambahkan proses untuk menghitung nilai rata-rata seluruh mhs, yaitu jumlah nilai rata-rata setiap mahasiswa dibagi jumlah mahasiswa.
Model konsolidasi (2/2) Ada rekaman tertentu yang memisahkan satu kelompok dan kelompok lainnya. Separator ini boleh satu rekaman atau lebih dari satu rekaman. Pada contoh berikut separator adalah ’kartu putih’. Dengan Separator
Program KONSOLIDASIDenganSeparator {Input: sebuah arsip sequential} {Proses: mengelompokkan setiap kategori dan memrosesnya} {Output: sesuai hasil proses} Kamus type rekaman: <KeyIn: keytype, {kunci} ValIn: valtype {harga lain yg direkam}> ArsipIn: SEQFILE of (*)RekIn: rekaman (1)<mark,val> EOP: Boolean procedure Init_all_categ {inisialisasi global} procedure Terminasi_all_categ {terminasi global} procedure Kasus_kosong {penanganan kasus kosong} procedure Init_categ {inisialisasi kategori} procedure Proses_current_categ {proses sebuah elemen dlm 1 kategori} procedure Terminasi_categ {terminasi sebuah kategori} function Separator(K: keytype) boolean Algoritma Init_all_categ OPEN(ArsipIn,RekIn) {First_elmt} if EOP then Kasus_kosong else repeat {skip separator} while (not EOP) and (Separator(KeyIn)) do READ(ArsipIn,RekIn) Init_categ while (not EOP) and (not Separator(KeyIn)) do Proses_current_categ Terminasi_categ until EOP Terminasi_all_categ CLOSE(ArsipIn) KeyIn bukan separator. KeyIn adalah elemen pertama dari Next_categ atau EOP.
Latihan: Konsolidasi dengan separator Diberikan sebuah arsip teks yang dapat diakses sekuential huruf per huruf. Diandaikan bahwa teks hanya mengandung huruf dan ”blank”. Kata adalah sekumpulan huruf yang dipisahkan oleh satu atau beberapa blank. Tulislah algoritma untuk menghitung kata yang terpanjang dalam teks tersebut.
Merging adalah penggabungan dua buah arsip. Yang paling sederhana adalah jika arsip yang pertama dikonkatenasi ke arsip kedua (artinya data dari arsip ke dua ditambahkan setelah rekaman terakhir arsip pertama dan membentuk arsip yang baru)
MERGING (2/2) Algoritma untuk penggabungan dua buah arsip terurut menjadi sebuah arsip yang terurut Cara sebelumnya tak dapat dipakai jika kedua arsip sudah terurut, dan dikehendaki sebuah arsip hasil yang tetap terurut.
Program MERGING {Input: dua arsip sekuensial, terurut, sejenis} {Proses: menggabungkan kedua arsip menjadi sebuah arsip yang terurut} {VERSI AND} {Output: sequential file baru yang terurut} Kamus type rekaman: <Key: keytype, {kunci} Val: valtype {harga lain yg direkam}> ArsipIn1: SEQFILE of (*)RekIn1: rekaman (1)<mark,val> ArsipIn2: SEQFILE of (*)RekIn2: rekaman ArsipOut: SEQFILE of (*)RekOut: rekaman Algoritma OPEN(Arsip1,RekIn1) {First_elmt of Arsip1} OPEN(Arsip2,RekIn2) {First_elmt of Arsip2} REWRITE(ArsipOut) {menyiapkan arsip hail: Arsip3} while (RekIn1.Key ≠ mark) and (RekIn2.Key ≠ mark) do depend on RekIn1.key,RekIn2.key: RekIn1.key ≠ RekIn2.key: WRITE(ArsipOut,RekIn1); READ(ArsipIn1,RekIn1) RekIn1.key > RekIn2.key: WRITE(ArsipOut,RekIn2); READ(ArsipIn2,RekIn2) while (RekIn1.key ≠ mark) do WRITE(ArsipOut,RekIn1); READ(ArsipIn1,RekIn1) while (RekIn2.key ≠ mark) do WRITE(ArsipOut,RekIn2); READ(ArsipIn2,RekIn2) WRITE(ArsipOut,<mark,val>) CLOSE(ArsipIn1) CLOSE(ArsipIn2) CLOSE(ArsipOut)
UPDATING dengan Transaction File Updating adalah mengubah harga rekaman yang ada pada sebuah master file dengan data dari transaction file. <Key : integer, Saldo: integer> <Key : integer, Jumlah: integer> ArsipMaster: <1,23><3,34><6,200><16,10><22,50><30,0><999,0> ArsipTransaction: <3,2><3,4><16,10><22,1><25,50><30,5><999,0> Peremajaan dilakukan terhadap rekaman yang ada dilakukan berdasarkan arsip terurut lain (update file) dengan key yang tidak unik. Artinya satu rekaman pada master file dapat mengalami 1 atau beberapa kali peremajaan. Hasil peremajaan dilakukan langsung terhadap arsip master. Contoh: peremajaan arsip saldo pada tabungan di bank, dengan perjanjian jumlah pada arsip update adalah negatif untuk pengambilan, positif untuk penabungan. Penabungan adalah dalam US$. UPDATING ArsipMasterBaru: <1,23><3,40><6,200><16,0><22,51><30,5><999,0>
Program UPDATING {Input: dua arsip sekuensial (MasterFile & TransactionFile), terurut menaik, menurut kunci yang sama} {Proses: meremajakan sebuah field pada MasterFile berdasarkan TransactionFile} {Output: sequential file baru yang terurut menaik menurut key} Kamus type rekMaster: <keyM: integer, saldo: integer> type rekTrans: <keyT: integer, TransSaldo: integer> Master: SEQFILE of (*)RekM: rekMaster (1)<9999,0> Transaction: SEQFILE of (*)RekT: rekTrans NewMaster: SEQFILE of (*)RekNM: rekMaster NewSaldo : integer Algoritma OPEN(Master,RekM) {First_elmt of Master} OPEN(Transaction,RekT) {First_elmt of Transaction} REWRITE(NewMaster) {Mempersiapkan arsip hasil NewMaster} while (RekM.key ≠ 9999) do while (RekT.key < RekM.key) and (RekT.key ≠ 9999) do READ (Transaction,RekT) if (RekT.key = RekM.key) then {updating} NewSaldo RekM.saldo repeat NewSaldo NewSaldo + RekT.TransSaldo READ(Transaction,RekT) until (RekT.key)≠ RekM.key) OR (RekT.key=9999) WRITE(NewMaster,<RekM.key,NewSaldo>) else {tidak ada update thd Master, salin} WRITE(NewMaster,<KeyM,Saldo>) READ(Master,RekM) {Next_elmt of Master} WRITE(NewMaster,<9999,0>) CLOSE(Master); CLOSE(Transaction); CLOSE(NewMaster)
SPLITTING Adalah pemecahan sebuah arsip menjadi dua atau lebih arsip. Algoritmanya tergantung pada kriteria pemecahannya. Memisahkan sebuah arsip pegawai menjadi beberapa arsip sesuai dengan kode golongan Atau memisahkan arsip data percobaan sesuai dengan kriteria data (misalnya yang layak dipakai dan yang harus dibuang).
Referensi Liem, Inggriani. Diktat kuliah IF223 Algoritma & Pemrograman. Jurusan Teknik Informatika. ITB. 1999 Munir, R., Lidya, L. Algoritma & Pemrograman. Penerbit Informatika. 1997.