ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
WAHJUDI
TIPE DATA ABSTRAK MENGGUNAKAN BAHASA C Universitas Multimedia Nusantara Tangerang - Banten Januar Wahjudi
Abstrak- Tipe data abstrak(abstract data types atau disingkat ADT) adalah salah satu dasar pemrograman yang harus dipahami oleh pemrogram. Untuk membangun sebuah tipe data abstrak, ada 5(lima) bagian yang perlu diperhatikan, data abstrak berupa daftar terurut(sorted list, ordered list) pada tulisan ini, akan memperjelas batasan antar bagian pada tipe data abstrak. .DWDNXQFLWLSHGDWDDEVWUDNDEVWUDFWGDWDW\SHV$'7WLSHGDWDWHUXUXWVRUWHGOLVWRUGHUHGOLVW&
I.
LATAR BELAKANG
terdapat perbedaan teknik pemrograman antara penulis satu dengan lainnya. Stack, Queue dan List serta beberapa konsep lain dalam pemrograman menggunakan bahasa C, bisa diimplementasikan dengan beberapa tehnik. Diantaranya bisa dengan menggunakan tipe data semi terstruktur, bisa juga dengan tipe data terstruktur yang dibangun atas dasar tipe data abstrak. Contohnya sebuah stack bisa diimplementasikan menggunakan tipe data semi terstruktur, yaitu menggunakan array dan beberapa variabel integer sebagai penunjuk top of the stack . Karena menggunakan array, maka pemrogram dimungkinkan untuk mencetak isi stack bisa dimulai dari dasar stack, padahal prinsip stack hanya mengijinkan akses data (push maupun pop) pada posisi top. Stack bisa diimplementasikan menggunakan struktur data yang sesuai dengan tipe data abstrak stack, dimana pemrogram tidak diperkenankan mengakses isi array tanpa melalui teknik yang benar. Dari contoh stack diatas menunjukkan perlunya pemahaman tipe data abstrak dan cara menggunakannya pada pemrograman. Dengan contoh daftar terurut (sorted list atau ordered list) diharapkan akan mempermudah pemahaman dasar ilmu komputer tentang cara penerapan Abstract Data Types (ADT).
II. STRUKTUR DATA (DATA STRUCTURE) SEBAGAI DASAR TIPE DATA ABSTRAK (ABSTRACT DATA TYPE) Pemahaman tipe data abstrak dimulai dari pemahaman
24
tipe data. Tipe data (data type) yang umum digunakan
! untuk menyimpan karakter. Tipe data ‘int’ dalam bahasa C disimpan dalam memori sebesar 4 byte, dengan demikian batasan nilai yang bisa disimpan adalah "#$%&%'*+%' #$%&%'*+%&/ data int bisa dilakukan beberapa operasi, diantaranya adalah operasi penjumlahan, pengurangan, perkalian, pembagian, modulus, dan lain- lain. Dari contoh tipe data ‘int’ diatas, dapat dilihat bahwa tipe data adalah sebuah wadah untuk menampung dan operasi yang bisa dilakukan untuk data tersebut. 0 mengenai : jenis data, batasan data yang bisa disimpan. Sedangkan operasi yang bisa dilakukan misalnya penjumlahan, pengurangan, perkalian, pembagian, dan lain-lain. 1 2 data sesuai kategori tipe data variabel tersebut. Dengan demikian variabel pada program harus dikategorikan pada salah satu tipe data yang ada, misalnya variabel bernama ‘contohvar’ bertipe data ‘int’, maka variabel contohvar akan disimpan dalam memori sebesar 4 byte, mampu menampung sebuah bilangan bulat dengan "#$%&%'*+%' #$%&%'*+%& dan terhadap variabel contohvar bisa dilakukan operasi penjumlahan, pengurangan, perkalian, pembagian dan lain-lain. TIPE DATA ABSTRAK ...
ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
WAHJUDI
Gambar 1. dibawah ini untuk memperjelas hubungan tipe data dan variabel. Misalnya terdapat potongan program sebagai berikut :
int main() (
int variabel_a, nilai, xyz; char huruf, angka; ...
Gambar 2b. Ilustrasi kasus 1 dengan array 10 nilai
}
Pada gambar 1., terlihat tiga wadah, wadah pertama untuk variabel yang bertipe data int, wadah kedua untuk G 2 variabel yang bertipe data char. variabel_ a xyz nilai
ratarata var_b
Gambar 1. Ilustrasi tipe data
Gambar 2a. Ilustrasi kasus 1 dengan 10 variabel integer
TIPE DATA ABSTRAK ...
Untuk mengatur penyimpanan data pada kasus diatas diperlukan teknik penyimpanan data dalam Teknik (metode/cara) penyimpanan data diatas disebut Struktur data (data structures)(Stubbs, Webre, 1985, pp1-43). Struktur Data dasar yang sering digunakan adalah array, record, union dan pointer (reference). Untuk kasus 1 diatas, bisa diatasi dengan struktur data array (gambar 2b.). Untuk kasus 2 diatas bisa diatasi menggunakan struktur data array dengan elemen berupa record (disebut array of records, gambar 3b.).
Gambar 3a. Ilustrasi kasus 2 dengan 3 buah array yang memiliki 10 elemen
angka huruf
Dalam pemrograman, bisa saja dibutuhkan banyak variabel untuk menyimpan data yang bertipe sejenis. Kasus 1(gambar 2a.), misalkan 10 buah variabel bertipe data ‘int’ untuk menampung nilai mahasiswa, jika disediakan satu variabel untuk masing-masing data, maka akan memerlukan 10 buah nama variabel $O R variabel akan membutuhkan beberapa baris program. Kasus 2(gambar 3a.), selanjutnya jika selain nilai 10 mahasiswa tersebut perlu juga disimpan NIM (Nomor Induk Mahasiswa), dan Nama Mahasiswa. Untuk nilai, nama, dan NIM masing-masing mahasiswa harus ada penghubung (link) sehingga nilai, nama dan NIM tidak tertukar antar mahasiswa.
Gambar 3b. Ilustrasi kasus 2 dengan array 10 record mahasiswa
III.
TIPE DATA ABSTRAK
Tipe data abstrak (Abstract Data Type - ADT) adalah tipe data yang diatur menggunakan struktur data tertentu 3 6 3 6 terpisah dari “representasi” dan “implementasinya” (Horowitz, Sahni dan Freed, 1993,pp1-100). Pengguna <=
representasi dan implementasinya. Namun seorang perancang program (program designer) perlu mengetahui implementasinya. Antara user dan program designer dipisahkan oleh interface (lihat gambar 4.).
Gambar 4. Interface and implementation (http://developer.apple.com/)
> ? ? $@@& %$"'% data types merupakan abstraksi matematis, tidak B E 2 implementasi operasi merupakan bagian terpisah. 3.a Contoh Abstract Data Type Daftar Terurut Tipe Data Abstrak ‘daftar terurut’ (sorted list) berisi data mahasiswa dalam sebuah kelas. Data mahasiswa terdiri dari NIM dan nama. Tentunya ‘daftar terurut’
25
WAHJUDI
ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
(sorted list) dalam imaginasi pengguna, memiliki Z 1. Data terdiri dari nilai kunci (yaitu NIM) untuk mengurutkan berupa sebuah string dan string lainnya (yaitu nama mahasiswa), 2. Ukuran maksimal daftar tersebut, misalnya 100 (seratus) karena dalam sebuah kelas tidak lebih dari 100 (seratus) mahasiswa 3. Jumlah mahasiswa dalam kelas Pengguna akan melakukan beberapa hal seperti dalam Z 1. membentuk sebuah daftar baru 2. menambahkan sebuah data mahasiswa pada daftar 3. mencari nama mahasiswa sesuai sebuah nilai, misalnya NIM Interface Operasi createlist(ukuran)
4. mengetahui jumlah data pada daftar 5. mengetahui jumlah data maksimal pada daftar 6. menghapus seluruh data pada daftar & 8. memeriksa apakah daftarurut sudah penuh 9. memeriksa apakah daftarurut masih kosong 10. dan lain-lain Tipe data untuk ‘daftar terurut’ diatas belum tersedia, karena tipe data tersebut masih berada pada imaginasi dan masih bersifat abstrak. Inilah makna ‘abstrak’ pada istilah Tipe Data Abstrak. Untuk membentuk tipe data ‘daftar terurut’ diatas, tentu ada semacam “interface” untuk pengguna agar bisa mengoperasikan ‘daftar terurut’ tersebut.
Penjelasan Operasi Membentuk sebuah daftar dengan ukuran tertentu, misalk ‘ukuran’ Menambah sebuah data ‘baru’ pada daftar ‘xyz’, mengembalik status 1 jika berhasil dan 0 jika gagal Mencari sebuah data dengan nilai ‘key’ pada daftar ‘xy mengembalikan posisi record jika ditemukan, dan -1 jika tid ditemukan Menghitung jumlah data pada daftar ‘xyz’, mengembalikan jum data Mengembalikan jumlah data maksimal pada daftar ‘xyz’ Menghapus seluruh data pada daftar ‘xyz’ Mencetak seluruh data pada daftar ‘xyz’ Memeriksa apakah list dalam keadaan penuh atau tid mengembalikan nilai 1 jika list penuh, mengembalikan 0 j belum penuh Memeriksa apakah list dalam keadaan kosong atau tid mengembalikan nilai 1 jika list kosong, mengembalikan 0 j tidak kosong
insert(xyz,baru) search(xyz,key)
sizelist(xyz) maxlist(xyz) clearlist(xyz) printlist(xyz) isfull(xyz)
isempty(xyz)
0 E ? ? $@@& %$"'% 2 E operasi-operasi. Operasi yang disediakan dan termasuk didalamnya adalah error-handling (penanganan kesalahan) tergantung kebutuhan dan rancangan pemrogram. Sekali lagi, pengguna tidak perlu mengetahui bagaimana “implementasi”-nya. Bisa saja diimplementasikan dengan struktur data array, bisa juga diimplementasikan dengan struktur data linked list (pointer based). Pada gambar 5. digambarkan sebuah obyek yang berisi data dan mampu melakukan beberapa tugas.
Keterangan :
! " ! " !" !"
!" !" !" !"
= Data (input) = operasi yang tidak mengubah daftar terurut = operasi yang meminta input untuk mengubah daftar terurut Gambar 5. Objek Daftar Terurut
26
TIPE DATA ABSTRAK ...
WAHJUDI
ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
3.b Representasi ADT Daftar Terurut menggunakan bahasa C Untuk menyimpan data didalam memori komputer, harus diatur penyimpanan data dalam memori. Pada C, bisa digunakan ‘struct’. Jumlah data pada daftar terurut dan ukuran daftar terurut berupa bilangan bulat, sehingga digunakan tipe data ‘int’. NIM berupa string dengan panjang misalnya 12 karakter, dimana disimpan berupa deretan tipe data char (array of char). Inilah data structure(struktur data). Untuk menyimpan 100 (seratus) data, maka max diberi typedef struct tdata { char nim[12]; nilai 100 (seratus), dan akan disediakan sebuah array char nama[30]; yang terdiri dari elemen sejumlah max. Sedangkan jdata }; dimulai dari 0 (nol). Jdata akan bertambah otomatis setiap typedef struct daftarurut { kali terjadi penambahan data. Jika dimasukkan sebuah tdata *data;
3O$O$@&OOO$6 int max; int jdata; “James Dean”, maka jdata akan bertambah 1 (satu). }; Ilustrasi representasi daftar terurut untuk contoh diatas adalah sebagai berikut : Data max Jdata
data[0] 0101970001 100 1
James Dean
data[1] [kosong]
[kosong]
... [kosong]
data[99] [kosong]
[kosong]
3.c Implementasi menggunakan Array dalam bahasa C E * diimplementasikan dalam bahasa pemrograman C. Interface Operasi createlist(ukuran)
Penjelasan Operasi dan implementasi dalam bahasa C Membentuk sebuah daftar dengan ukuran tertentu, misalkan ‘ukuran’
daftarurut createlist(int ukuran){ int i; daftarurut xyz; xyz.max = ukuran; xyz.data =(tdata *)malloc(sizeof(tdata) * xyz.max); xyz.jdata = 0; for(i=0;i
insert(xyz,baru)
Menambah sebuah data ‘baru’ pada daftar ‘xyz’, mengembalikan status 1 jika berhasil dan 0 jika gagal
int insert(daftarurut *a, tdata baru){ int i,j; if (isempty(a)) { (*a).data[0] = baru; (*a).jdata++; return 1; } if(!isfull(a)) { j = sizelist(*a); while (j >= 0 && strcmp(baru.nim,(*a).data[j-1].nim)<0) { (*a).data[j] = (*a).data[j-1]; j = j - 1; } (*a).data[j] = baru; (*a).jdata++; return 1; } else { printf("Daftar sudah penuh”); printf(“,jumlah data = %d",(*a).jdata); printf(“maksimal data = %d\n",(*a).max); return 0; } }
TIPE DATA ABSTRAK ...
27
WAHJUDI
ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
search(xyz,key)
Mencari sebuah data dengan nilai ‘key’ pada daftar ‘xyz’, mengembalikan posisi record jika ditemukan, dan -1 jika tidak ditemukan
int searchlist(daftarurut a, char key[]){ int i; for(i=0;i
sizelist(xyz)
Menghitung jumlah data pada daftar ‘xyz’, mengembalikan jumlah data
3.d Contoh program lengkap menggunakan ADT Daftar Terurut dalam bahasa C
int maxlist(daftarurut a) { return a.max; } int sizelist(daftarurut a) { return a.jdata; } #$/4 free((*xyz).data); (*xyz).max=0; (*xyz).jdata=0; } daftarurut createlist(int ukuran){ int i; daftarurut xyz; xyz.max = ukuran; xyz.data = (tdata *) $/#$/ xyz.jdata = 0; 56 7 88/4 xyz.data[i].nim[0] = ‘\0’; xyz.data[i].nama[0] =’\0’; } printf(“ukuran list = %d\n”,xyz. max); printf(“jumlah data dalam list = %d\n”,xyz.jdata); return xyz; } int insert(daftarurut *a, tdata baru){ int i,j; if (isempty(a)) { (*a).data[0] = baru; /988 return 1; } if(!isfull(a)) { j = sizelist(*a); :956??@ nim,(*a).data[j-1].nim)<0) { (*a).data[j] = (*a).data[j-1]; j = j - 1; } (*a).data[j] = baru; /988 return 1; } else { printf(“Daftar sudah penuh”);
printf(“,jumlah data = %d”,(*a). jdata); printf(“maksimal data = %d\n”,(*a). max); return 0; } } int searchlist(daftarurut a, char key[]){ int i; 56 9 88/4 if(strcmp(a.data[i].nim, key)==0) return i; } return -1; } @/4 int i; 56 9 88/ printf(“[%d] %-12s %-30s\n”,i,a. data[i].nim, a.data[i].nama); } typedef struct tdata { char nim[12]; char nama[30]; }; typedef struct daftarurut { tdata *data; int max; int jdata; }; int main() { @ char cari[12]; daftarurut xyz; tdata b; xyz=createlist(4); printf(“jumlah data pada list = %d\n”,sizelist(xyz)); printf(“maximum jumlah data pada list %d\n”,maxlist(xyz));
=
while(scanf(“%[^\n]”,b.nim)==1) { / gets(b.nama); 5?#$ / if(hasilinsert==1) @B@ C n\n”); else @B@CCE/
28
TIPE DATA ABSTRAK ...
WAHJUDI
ULTIMATICS VOL. 1 NO. 1, DESEMBER 2009
} printlist(xyz); printf(“masukkan kunci untuk dicari : “); BGE?/ @5#$/ @55HI/ printf(“Data tidak ditemukan\n\n”); else @BJGKGHILGHM6CE@#$ J@K#$J@K/ ?#$/ getch(); return 1;
DAFTAR PUSTAKA 1. Horowitz,E., Sahni,S. and Anderson-Freed,S.,(1993), Fundamentals of Data Structures in C, Computer Science / ~ 2 2. Ngoen, T.S., (2009), Algoritma dan Struktur Data, Mitra Wacana Media, Jakarta. 3. Stubbs, D.F., Webre, N.W.,(1985), Data Structures with Abstract Data Types and Pascal, Brooks/Cole %? ><$@@&0 < Analysis in C, 2nd Edition,Addison Wesley. ?
=
Z en.wikipedia.org/wiki/Abstract_data_types
}
IV.
PENUTUP
Pada pemrograman menggunakan Tipe data abstrak, terdapat 5 (lima) bagian yang sebaiknya dipahami : c) antarmuka(interface), d) representasi data, e) implementasi operasi. Pengguna perlu mengetahui bagian a,b dan c saja. Pemrogram harus mampu mengubah “abstraksi data dan operasi” menjadi “representasi data dan implementasi” sesuai dengan bahasa pemrograman yang akan digunakan.
TIPE DATA ABSTRAK ...
29