• Tidak ada hasil yang ditemukan

Hari : Rabu Pertemuan : 2 Tanggal Praktikum : Oktober 2001 Shift : 4

N/A
N/A
Protected

Academic year: 2021

Membagikan "Hari : Rabu Pertemuan : 2 Tanggal Praktikum : Oktober 2001 Shift : 4"

Copied!
14
0
0

Teks penuh

(1)

Hari : Rabu Pertemuan : 2 Tanggal Praktikum : Oktober 2001

Shift : 4

Tujuan Instruksional Khusus

Mahasiswa bisa memahami pengoperasian file index secara sequential

Pokok Bahasan

Pengenalan file index sequential

Materi

- Membuat file baru - Membuka file - Menambah data - Menyisipkan data - Melakukan update

Dengan cara Index Sequential.

Cara mengakses berdasarkan indexnya.

Sintaks – sintaks yang dipakai :

• FILE *handle1, *handle2

Menentukan handle-handle yang akan digunakan dalam program.

• fread (void *ptr, size_t size, size_t n, FILE *stream)

Perintah ini digunakan untuk membaca data dari FILE *stream. n menunjukkan banyaknya data yg dibaca per kali baca. Size menunjukkan sepanjang apa data yang akan kita baca. Sedangkan *ptr menunjuk pada bagian data yang dibaca.

• fopen (const char *filename, const char *mode)

Sebelum data dalam suatu file bisa diakses, maka filenya harus dibuka terlebih dahulu dengan sintaks fopen. *filename menunjukkan nama file yang akan dibuka, sedangkan mode menunjukkan status file yang dibuka tsb. Mode yang

(2)

dipakai dalam program ini adalah r+ (read write), r (read), w (write), a (append). Bisa juga ditambah b yang berarti binary.

• fclose(FILE *stream)

Untuk menutup FILE *stream yang sebelumnya telah dibuka.

• fwrite(const void ptr, size_t size, size_t n, FILE*stream)

Untuk menuliskan data ke dalam FILE *stream. Penggunaannya mirip dengan fread. Size menunjukkan panjang data yang hendak kita tulis, lalu n menunjukkan banyaknya data yang ingin kita tulis per kali tulis.

• remove (const char *filename)

Digunakan untuk menghapus suatu file handle.

• rename (const char *oldname, const char *newname)

Untuk mengubah nama, di mana oldname berarti nama asal (lama) dan newname adalah nama baru.

• fseek (FILE *stream, long offset, int whence)

Fungsi ini berguna untuk mencari letak suatu data dalam file.

FILE *stream adalah file tempat data yang hendak dicari. Long offset adalah alamat (offset) tempat data tsb berada. Sedangkan int whence adalah tempat awal pencarian, biasanya digunakaan SEEK_SET yang berarti dari awal file.

• ftell(FILE *stream)

Untuk mencari/mendapatkan alamat offset dari suatu data dalam file *stream.

• fscanf (FILE *stream, const char *format [, address, ...])

Untuk membaca data dari FILE *stream disertai dengan jenis data dan nama data yang hendak diambil.

• fprintf(FILE *stream, const char *format [, argument, ...])

Untuk menulis data ke FILE *stream, disertai dengan jenis data, dan data apa saja yang hendak ditulis.

(3)

Hari : Rabu Pertemuan : 2 Tanggal Praktikum : Oktober 2001

Shift : 4

Pembahasan Soal ALGORITMA

þ Tentukan library yang akan dipakai, file handle yang akan digunakan, dan variabel- variabel lainnya. Di sini dipakai 3 file handle. 2 file handle (file1 dan file2) berguna untuk menyimpan data secara lengkap. Sedangkan idx_file nantinya digunakan sebagai file index (hanya terdapat nama dan alamat offset). Setelah itu modul main/utama dijalankan.

Modul main akan memanggil modul proses().

Modul proses akan memanggil modul display untuk mengeluarkan menu utama. Dalam modul proses, user diharuskan menginput sesuai dengan pilihannya. Setelah user menginput, akan tampil menu selanjutnya sesuai pilihan user.

Menu utama akan terus tampil selama user tidak memilih untuk exit (4).

þ Algoritma Append

Dalam modul ini dipanggil modul- modul lain, yaitu : modul cek_file, isi_file, dan sorting_file.

Algoritma cek_file

Buka handle1 sebagai read only.

Lalu cek apakah file telah berisi atau belum. Jika belum maka file di open dengan mode write. Terakhir file di close, lalu lanjut ke modul isi_file Algoritma isi_file

Pesan variabel sama dan a. Nilai nol di assign ke variabel sama. Buka file handle1 dengam mode r.

Lalu minta input kode dari user, setiap input divalidasi untuk banyak karakter. Jika tidak memenuhi validasi, user akan terus diminta memasukkan kode.

(4)

Kode input disimpan di variabel sementara.

Lalu dicocokkan apakah kode tersebut sudah terdapat dalam file handle1. Jika sudah akan ditampilkan pesan kesalahan dan user dibawa kembali ke menu utama.

Close file handle1 dan open kembali dengan mode append.

Kode input dicopy ke variabel sesungguhnya, lalu user diminta untuk memasukkan data selanjutnya. Tiap masukkan data divalidasi, kalau tidak cocok user kembali ke menu awal.

Tulis data-data input ke file handle1. Tutup file handle1.

Algoritma sorting_file

Buka file1 dengan mode read. Buka file index dengan mode write.

Lakukan hal- hal berikut sampai proses pembacaan records dari file1 selesai - bentuk tempat baru untuk data dengan struct.

- Lalu copy data.kode ke curr->kode

- Cek apakah posisi head=NULL yang berarti belum ada data, jika ya lakukan hal berikut :

* jadikan head=curr. * jadikan tail=curr.

* posisi record yang sekaran dibuat sama dengan nol.

* assign bahwa di belakang head dan di depan tail adalah kosong (NULL).

Jika tidak maka alamat offset dari data dicari dengan fungsi ftell, lalu panggil modul sortin_insertion.

- Panggil modul tulis_FileIdx, lalu file1 dan file index diclose.

Algoritma tulis_FileIdx Assign nilai head ke temp

(5)

• Cetak kode dan posisi offset dari data ke file index.

• Temp bergeser ke temp selanjutnya. Algoritma sorting_insertion

Pesan variabel status dengan nilai awal nol dan assign temp = head. Selama nilai status masih nol, dilakukan hal sbb :

- cek apakah kode yang tadi diinput lebih kecil daripada kode di posisi head. Jika ya jadikan posisi berikut curr (curr->next) sebagai head. Lalu posisi sebelum head (head->prev) sebagai curr. Samakan head dan curr (assign nilai curr ke head), pastikan nilai pada posisi sebelum head adalah NULLL. Jadikan status = 1. Jika tidak memenuhi kondisi I maka cek ke kondisi kedua. Apakah kode inputan lebih kecil dari kode di tail. Jika ya assign nilai curr ke posisi berikut dari tail. Ubah status menjadi 1. Jika tidak memenuhi kondisi kedua, cek di kondisi ketiga. Apakah kode input berada di antara head dan tail (di tengah-tengah). Jika ya jadikan curr -> temp sama denagn temp->next. Isi nilai dari temp->next>prevv dengan curr. Posisi sebelum curr diassign dengan temp. Posisi berikut dari temp diassign oleh curr. Ubah status jadi 1.

- Kalau status telah berubah jadi 1, assign nilai berikut dari temp ke temp.

þ

þ Algoritma Insert

Panggil modul cek_file

Pesan variabel baris, barisins, dan sama. Semuanya diassign nol.

Buka file handle1 dengan mode r dan hitung banyaknya records yang ada. Lalu tutup kembali filenya.

Kalau jumlah record menunjukkan nol, tampilkan pesan kesalahan, user dibawa ke menu awal.

(6)

File handle1 dibuka kembali dalam mode r. Kode input dicocokkan terlebih dahulu dengan kode di file handle1.

Jika ada yang sama, tampilkan pesan kesalahan, user kembali ke menu awal. Jika tidak ada yang sama minta user memasukkan kode selanjutnya (seperti biasa, divalidasi tiap input).

Semua data yang diinput disimpan di variabel temp. Lalu minta user memasukkan letak insert.

Letak insert di cek apakah lebih kecil / sama dengan jumlah record. Jika tidak tampilkan pesan kesalahan dan user kembali ke menu awal. Selain itu buka file handle2 dengan mode w dan file handle1 dengan mode r. Set baris ke nol kembali.

Dalam perulangan pembacaan data dari file handle1 lakukan hal berikut

• jumlah baris ditambah satu

• cocokkan apakah posisi baris sama dengan posisi insert.

• Jika tidak, tulis data yang dibaca tadi ke file handle2. Selain itu tulis terlebih dahulu data input/temp ke file handle2 diikuti oleh data dari file handle1. Setelah itu file handle1 dan file handle2 ditutup.

Hapus file handle1.

Rename/Ubah nama file handle2 menjadi file handle1. Lalu panggil modul sorting_file.

þ

þ Algoritma Update

<Hal-hal berikut dilakukan di main program :>

• Panggil modul cek_file.

• Buka file handle1 untuk pembacaan data.

• Assign nilai nol untuk baris.

• Hitung jumlah records dengan cara perulangan pembacaan data.

• Kalau records tidak ada (= 0) tampilkan pesan kesalahan dan user kembali ke menu awal.Selain itu minta user memasukkan kode yang akan d iupdate, lalu panggil modul update dengan mentransfer nilai kode.

(7)

Pesan variabel yang akan dipakai, yaitu updata, offset, dan sama. Untuk sama diberi nilai nol.

Buka file index untuk pembacaan data.

Lakukan hal- hal berikut dalam looping pembacaan data :

• ambil nilai dari updata dan offset.

• Cocokkan apakah nilai updata sama dengan cari.

Jika sampai akhir pembacaan data tidak ada nilai yang sama, tampilkan pesan kesalahan dan user kembali ke menu awal dengan terlebih dahulu menutup kembali file yang telah dibuka.

Jika ada yang sama, cari posisi offset dari data yang sama tersebut dengan fseek dan baca data dari file handle1.

Lalu minta user memasukkan data selanjutnya.

Kemudian buka file handle1 dengan mode read-write (r+) dan salin data perubahan tadi ke file handle1.

Tutup file handle1 dan file index.

CODING

#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h>

FILE *file1, *file2, *idx_file;

struct txt { char kode[6]; char nama[21]; char jabatan[20]; char umur[4]; } data, temptxt; struct idx_rec { char kode[6]; long pos_rec;

struct idx_rec *next, *prev; }

(8)

*head=NULL, *curr, *tail, *temp; void cek_file(void) { file1=fopen("data", "rb"); if(file1==NULL) { file1=fopen("data", "wb"); } fclose(file1); } void sorting_insertion() { int status=0; temp=head; while(!status) { if(strcmp(head->kode, curr->kode)>0) { curr->next=head; head->prev=curr; head=curr; head->prev=NULL; status=1; }

else if(strcmp(tail->kode, curr->kode)<0) { tail->next=curr; curr->prev=tail; tail=curr; tail->next=NULL; status=1; }

else if((strcmp(curr->kode, temp->kode)>0) && (strcmp(curr->kode, temp->next->kode)<0)) { curr->next=temp->next; temp->next->prev=curr; curr->prev=temp; temp->next=curr; status=1; } if(!status) temp=temp->next; } //end of while } //end of module void tulis_fileIdx() { temp=head; while(temp!=NULL) {

fprintf(idx_file, "%s %ld\n", temp->kode, temp->pos_rec); temp=temp->next;

(9)

}

void sorting_file(void) {

file1= fopen("data","rb");

idx_file= fopen("data.idx","wb");

while(fread(&data, sizeof(data), 1, file1)!=NULL) {

curr=(struct idx_rec*) malloc (sizeof(struct idx_rec)); strcpy(curr->kode, data.kode); if(head==NULL) { head=curr; tail=curr; curr->pos_rec=0; head->prev=NULL; tail->next=NULL; } else { curr->pos_rec=ftell(file1); sorting_insertion(); } }//end of while

tulis_fileIdx(); // kalo udah selesai sorting, Linked-Listnya // kita tulis ke file 'data.idx'

fclose(file1); fclose(idx_file); } void insert() { int barisins=0; int baris=0; int sama=0; file1=fopen("data", "r");

while(fread(&data, sizeof(data), 1, file1)!=NULL) {

baris=baris+1;

gotoxy(15,20);printf("Jumlah baris : %d", baris); }

fclose(file1);

if(baris==0) {

gotoxy(1,9);

printf("file belum pernah ada"); } else { do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(temptxt.kode);

(10)

}

while (strlen(temptxt.kode)!=5); file1=fopen("data", "r");

while(fread(&data, sizeof(data), 1, file1)!=NULL) { if(strcmp(temptxt.kode, data.kode)==0) { sama=1; } } fclose(file1); if(sama==1) { gotoxy(1,11); clreol();

printf("kode sudah pernah ada"); } else { do { gotoxy(1,6);clreol(); printf("Nama [max.20] :"); gets(temptxt.nama); } while(strlen(temptxt.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(temptxt.jabatan); } while(strlen(temptxt.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(temptxt.umur); } while(strlen(temptxt.umur)>3); gotoxy(1,13);

printf("Data akan diinsert pada urutan ke :"); scanf("%d", &barisins);

if(barisins>baris) {

gotoxy(1,9); printf("hanya ada %d record", baris); }

else {

file2=fopen("data2","w"); fclose(file2);

(11)

file2=fopen("data2","a"); file1=fopen("data","r"); baris=0;

while(fread(&data, sizeof(data), 1, file1)!=NULL) {

baris++;

if(baris!=barisins) {

fwrite(&data, sizeof(data), 1, file2); }

else {

fwrite(&temptxt, sizeof(temptxt), 1, file2); fwrite(&data, sizeof(data), 1, file2);

} } fclose(file1);fclose(file2); file1=fopen("data","w"); fclose(file1); remove("data"); rename("data2","data"); sorting_file();

}//tutupan else bawah

}//tutupan else atas } getch(); } void isi_file() { int sama=0; int a; file1=fopen("data", "r"); do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(temptxt.kode); } while (strlen(temptxt.kode)!=5);

while(fread(&data, sizeof(data), 1, file1)!=NULL) { a=strcmp(data.kode, temptxt.kode); if(a==0) sama=1; } fclose(file1); if(sama==1) { gotoxy(1,11); clreol();

printf("kode sudah pernah ada"); getch();

(12)

} else { file1=fopen("data","ab"); strcpy(data.kode, temptxt.kode); do { gotoxy(1,6);clreol(); printf("Nama [max.20] :"); gets(data.nama); } while(strlen(data.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(data.jabatan); } while(strlen(data.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(data.umur); } while(strlen(data.umur)>3); fwrite(&data, sizeof(data),1,file1); fclose(file1); } }

void update(char *cari) {

char updata[5]; long offset; int sama=0;

idx_file=fopen("data.idx", "rb"); while(!sama && !feof(idx_file)) {

fscanf(idx_file, "%s", updata); fscanf(idx_file, "ld", &offset); if(!strcmp(cari, updata)) sama=1; }

if(sama) {

fseek(file1, offset, SEEK_SET);

fread(&data, sizeof(data), 1, file1); do

{

gotoxy(1,6);clreol();

(13)

gets(data.nama); } while(strlen(data.nama)>20); do { gotoxy(1,7);clreol(); printf("Jabatan [max.20] :"); gets(data.jabatan); } while(strlen(data.jabatan)>20); do { gotoxy(1,8);clreol(); printf("Umur [3] :"); gets(data.umur); } while(strlen(data.umur)>3); file1=fopen("data", "w");

fwrite(&data, sizeof(data), 1, file1);

} else {

gotoxy(1,9);clreol();

printf("kode belum pernah ada"); } getch(); fclose(file1); fclose(idx_file); } void display() { clrscr();

printf("1. Append data"); printf("\n2. Insert data"); printf("\n3. Update data"); printf("\n4. Exit"); printf("\nPilihan : "); } void proses() { char a; int baris=0; do { display(); a=getch(); switch (a) { case '1' : { cek_file();

(14)

isi_file(); sorting_file(); break; } case '2' : { cek_file(); insert(); break; } case '3' : { cek_file(); file1=fopen("data", "rb"); baris=0;

while(fread(&data, sizeof(data), 1, file1)!=NULL) {

baris=baris+1;

gotoxy(1,20);clreol();

printf("Jumlah baris : %d", baris); }

fclose(file1);

if(baris==0) {

gotoxy(1,11);

printf("file belum pernah ada"); getch(); } else { do { gotoxy(1,5);clreol(); printf("Kode [5] :"); gets(data.kode); } while(strlen(data.kode)!=5); update(data.kode); } break; } case '4' : break; default : display(); } } while(a!='4'); } void main() { proses(); }

Referensi

Dokumen terkait

LAPORAN STUDI EHRA BJM 2012 43 EHRA (Environmental Health Risk Assessment) atau Penilaian Risiko Kesehatan Lingkungan adalah studi yang bertujuan untuk memahami kondisi

Kuisoner tersebut berupa google form yang berisi sejumlah pertanyaan yang disebarkan melalui aplikasi whatsapp kepada warga Dukuh Menanggal, dari data yang diambil

adalah suhu, sedangkan salinitas memiliki peranan penunjang dalam memperkecil energi untuk osmoregulasi bagi telur ikan jambal siam, karena dari penelitian yang

Manpower Planning merupakan sebuah proses dalam suatu perusahaan untuk memastikan bahwa perusahaan tersebut akan mempunyai jumlah pekerja yang tepat dan memiliki

Penelitian ini dilaksanakan di Kota Tangerang Selatan. Variabel yang diamati/diukur dalam penelitian ini adalah a) Jumlah penduduk Tangerang Selatam menurut

Suatu molekul tidak dapat memiliki momen dipol tegak lurus terhadap semua sumbu rotasi.. Molekul

Abstrak: Dalam mendukung tercapainya tujuan pembelajaran matematika diperlukan faktor kemampuan memori yang berkenaan dengan daya ingat seseorang dan metode pembelajaran yang

Saya senang menyelesaikan dengan baik pekerjaan yang sulit 48.. Saya senang diperlakukan