STRUKTUR DATA
POKOK BAHASAN - 5
ABSTRACT DATA TYPE
Oleh :
NAZARUDDIN AHMAD, S.T, M.T
Design By mytemplate 2013
Abstract Data Types
• Pada saat membuat program, biasanya
digunakan untuk mencari solusi suatu
problem
• Problem dalam ‘real life’
– Kompleks
– Perlu mengerti problem dengan baik untuk
memisahkan bagian yang penting dari rinci
yang tidak penting
– Abstraksi
2
Abstract Data Types
Contoh : Penanganan administrasi dalam sebuah
fakultas
Mahasiswa … ?
Pegawai …. ?
Informasi apa yang harus dicatat .. ?
3
Abstract Data Types
Abstraksi menghasilkan model
Model
menaruh fokus pada hal-hal penting pada problem
Mendefiniskan property problem
1. Data yang dipengaruhi
2. Operasi yang teridentifikasi
4
Abstract Data Type (ADT) adalah ...
• Spesifikasi dari sekumpulan data termasuk operasi yang
dapat dilakukan pada data tersebut. (Wikipedia)
• Sekumpulan data dan operasi terhadap data tersebut yang
definisi-nya tidak bergantung pada implementasi tertentu.
(/www.nist.gov/dads/)
• Definisi TYPE dan sekumpulan PRIMITF (operasi dasar) terhadap
TYPE tersebut (Ingriani Liem, ITB)
5
Konsep ADT
ADT membungkus
(encapsulates)
data dan operasi
yang memanipulasi
data tersebut.
Data tersebut juga
hanya bisa diakses
lewat operasi
tersebut.
r
e
p
o data
s n
a
t
i
o
6
Modul ADT
• ADT biasanya diimplementasikan menjadi 2 modul:
– Definisi/Spesifikasi Type dan Primitif (Interface)
• Spesifikasi type sesuai bahasa yang bersangkutan
• Spesifikasi dari primitif sesuai kaidah prosedural:
– Fungsi
– Prosedur
– Body/realisasi dari primitif
• Berupa kode program dalam bahasa yang bersangkutan.
• Agar ADT dapat dites, maka biasanya disertai program
utama yang memanggil setiap fungsi/prosedur. Program
utama ini disebut sebagai driver.
7
Interface
• Spesifikasi Abstract Data Type biasa disebut sebagai interface.
• Interface menyatakan apa yang dapat dilihat dan digunakan oleh
programmer.
• Dalam pemrograman, hal tersebut dinyatakan sebagai public
method.
• Operasi-operasi yang dapat dilakukan pada abstract data type
dituliskan dalam interface dan dinyatakan public.
8
Pemisahan interface dengan implementasi
• Pengguna dari sebuah abstract data type hanya perlu
memikirkan dan mempelajari interface yang diberikan tanpa
perlu mengetahui banyak bagaimana implementasi dilakukan.
(prinsip: enkapsulasi)
• Implementasi dapat saja berubah namun interface tetap.
• Dengan kata lain, implementasi dari sebuah abstract data type
dapat saja berbeda-beda namun selama masih mengikuti
interface yang diberikan maka program yang menggunakan
abstract data type tersebut tidak akan terpengaruh.
9
Struktur data = container
Container
• Sebuah struktur data dapat dipandang
sebagai tempat penyimpanan benda
(container).
• Beberapa hal yang dapat dilakukan:
– Menaruh benda
– Mengambil benda
– Mencari benda tertentu
– Mengosongkannya (atau periksa
apakah kosong)
Contoh Interface struktur data :
Data
void add(Benda x);
void remove(Benda x);
Benda access(Benda x);
void makeEmpty();
boolean isEmpty();
10
ADT: List
Indeks
1
2
3
4
• Sebuah List adalah kumpulan benda di mana setiap benda
memiliki posisi.
• Setiap benda dalam List dapat diakses melalui indeks-nya.
• Contoh paling gampang: array!
Contoh Interface list :
void insert(int indeks, Benda x);
void append(Benda x);
void remove(int indeks);
void remove(Benda x);
Benda get(int indeks);
ADT: Stack
push
• Sebuah Stack adalah kumpulan benda
pop,top
di mana hanya benda yang most
recently inserted dapat diakses.
• Bayangkan setumpuk koran.
• Benda yang paling terakhir
Most
ditambahkan ditaruh di atas tumpukan
recent
(top).
• Operasi pada Stack membutuhkan
waktu konstan (O(1)).
Contoh Interface stack :
Least
recent
void push(Benda x);
Benda pop();
Benda top();
ADT: Queue
enqueue
dequeue
getFront
Most recent
Least recent
• Sebuah Queue adalah kumpulan benda di mana hanya benda yang least
recently inserted dapat diakses.
• Bayangkan antrian printer job pada jaringan.
• Benda yang paling awal ditambahkan berada di depan antrian (front).
• Operasi pada Queue membutuhkan waktu konstan (O(1)).
Contoh Interface queue :
void enqueue(Benda x);
Benda dequeue();
Benda getFront();
ADT: Set
tambah
• Set adalah struktur data yang tidak mengizinkan duplikasi data.
• Bandingkan dengan struktur data lain yang mengizinkan kita
menyimpan dua data yang sama.
• Bayangkan peserta kuliah ini: Setiap peserta unik, tidak ada yang
terdaftar dua kali!
Contoh Interface set :
void add(Benda x);
void remove(Benda x);
boolean isMember(Benda x);
ADT: Map
Nama:
Abdul
Betty
Chairul
Dian
Nilai:
• Map adalah struktur data yang berisi sekumpulan pasangan nama (keys) dan
nilai (values) dari nama tersebut.
• Nama (Keys) harus unik, tapi nilai (values) tidak.
• Bayangkan basis-data yang berisi informasi peserta kuliah. Apa yang menjadi
“nama” (keys)?
Contoh Interface sebuah Map :
void put(Kunci id, Nilai x);
void remove(Kunci id);
Nilai get(Kunci id);
ADT: Priority Queue
insert
deleteMin
findMin
Highest
priority
• Priority Queue adalah struktur data queue yang tiap elemen data dapat miliki
nilai prioritas. Data dengan nilai prioritas tertinggilah yang dapat diakses
terlebih dulu.
• Bayangkan sebuah antrian pada printer jaringan. Misalkan ada sebuah
permintaan cetak untuk 100 halaman hanya beberapa detik lebih awal dari
permintaan cetak selembar halaman.
Contoh Interface sebuah Priority Queue :
void insert(Benda x); (Menambahkan)
void deleteMin(); (menghapus)
Benda findMin(); (meng-akses)
API vs doing it yourself
Jika anda menggunakan framework atau software component,
programmer lain dapat lebih mudah mengadaptasi program
anda.
Jika anda membuat implementasi sendiri, maka programmer lain
belum tentu dapat dengan mudah mempelajari program anda.
Namun demikian, sebagai mahasiswa/i ilmu komputer, perlu
memahami bagaimana data tersusun dalam memory dan perlu
memahami konsep-konsep apa yang mendasarinya.
Tidak menutup kemungkinan untuk meng-extend/meng-implement
Collections
Pemecahan Masalah dengan Tipe Terstruktur
• Untuk memanipulasi data, C menyediakan semua operasi
dasar yang dapat digunakan untuk memecahkan masalah
dengan menggunakan tipe data standar
• Kombinasian type tertentu yang didefinisikan user dengan
sekumpulan operasi-operasi dasar yang membolehkan satu
kebenaran untuk melihat tipe sebagai konsep kesatuan disebut
Abstract Data Type (ADT)
• Contoh tipe data planet_t dan operasi-operasi dasarnya
digambarkan sbb:
Contoh Studi Kasus untuk ADT
• Tipe yang didefinisikan user untuk angka yang komplek
• Analisa:
– Angka yang komplek adalah angka dengan bagian real
dan imaginer
– Contoh : a+bi (a: real, b:imaginer)
– Definisikan fungsi untuk melakukan operasi aritmetika
dasar (penjumlahan, pengurangan, perkalian dan
pembagian)
Desain
• 2 aspek utama dari solusi masalah ini adalah :
– Mendefinisikan struktur dari tipe yang didefinisikan user
– Menentukan nama fungsi, parameter, dan tujuan dari tiap
operasi
Desain (cont..)
• Nama struktur yang didefinisikan sendiri : complex_t
• Fungsi :
–
–
–
–
–
Multiply_complex (untuk perkalian bil. komplek)
Divide_complex (untuk pembagian bil. kompleks
Abs_complex (untuk mendapatkan nilai absolut)
Print_complex (untuk menampilkan hasil)
Scan_complex (untuk melakukan pembacaan thd bil.
Kompleks)
– Add_complex (untuk menjumlahkan bil. Kompleks)
– Substract_complex (untuk mengurangkan bil. Kompleks)
Spesifikasi dari Tipe complex_t dan
operasi-operasi yang berlaku
STRUCTURE: Angka kompleks adalah suatu object dari tipe
complex_t yang terdiri dari sepasang nilai bertipe double
.
OPERATOR:
/*Complex number input fuction returns standard scanning*/
int scan_complex(complex_t *c) /*output-address of complex
variable to fill*/
/*
Complex output fuction displays value as a+bi or a-bi
Displays only a if imaginary part is 0
Display only bi if real part is 0 */
void print_complex(complex_t c) /* input-complex number to
display */
Spesifikasi dari Tipe complex_t dan
operasi-operasi yang berlaku (cont.)
/*Returns sum of complex value c1 and c2*/
complex_t add_complex(complex_t c1,complex_t c2) /*input*/
/*Returns difference c1-c2*/
complex_t subtract_complex(complex_t c1,complex_t c2) /*input*/
/*Returns product of complex values c1 and c2*/
complex_t multiply_complex(complex_t c1,complex_t c2)
/*input*/
/*Returns quotient of complex values(c1/c2)*/
complex-t divide-complex(complex_t c1,complex_t c2) /*input*/
/*Returns absolute value of complex number c*/
abs_complex(complex_t c) /*input*/
Latihan
• Modifikasi kedua program sebelumnya dengan
menggunakan ADT Jam, yang spefisikasinya seperti
berikut:
typedef struct
{
int Jam;
int Menit;
int Detik
} jam;
/* prototype */
int IsJamValid(int j, int m, int d);
/* mengembalikan 1 jika valid dan 0 jika tidak valid */
jam MakeJam(int j, int m, int d);
/* Konstruktor, membentuk jam dari komponen yang valid*/
Latihan (cont.)
void SetJam(jam *J, int j, int m, int d);
/* mengeset jam sesuai dengan parameter input */
void ResetJam(jam *J);
/* mengisi sebuah jam dengan 00:00:00 */
void TulisJam(jam J);
/* menulis sebuah jam */
int JamKeDetik(jam J);
/* konversi jam ke detik */
jam DetikKeJam(int d);
/* konversi dari detik ke jam */
jam JPlus(jam J1, jam J2);
/* menghasilkan J1+J2, dalam bentuk jam */
jam JMinus(jam J1, jam J2);
/* menghasilkan J1-J2, dalam bentuk jam */
Contoh : Titik Koordinat
#include <stdio.h>
#include <math.h>
#include <conio.h>
typedef struct
{
int sumbu_x;
int sumbu_y;
}Titik;
Titik Make_Titik (int x, int y)
{
Titik t;
t.sumbu_x = x;
t.sumbu_y = y;
return t;
}
Contoh : Titik Koordinat (Lanj.)
void Display(Titik T)
// merupakan fungsi untuk menampilkan Titik di layar
{
printf("koordinat x = %d ", T.sumbu_x);
printf("koordinat y = %d \n", T.sumbu_y);
}
float Jarak(Titik T1, Titik T2)
//fungsi untuk menghitung jarak antara dua titik T1 dan T2
{
int A, B;
float jarak;
A = (T2.sumbu_y - T1. sumbu_y);
B = (T2.sumbu_x - T1. sumbu_x);
jarak = sqrt(A*A + B*B);
return jarak;
}
Contoh : Titik Koordinat (Lanj.)
int main()
{
Titik T1; // menciptakan instans dari titik
T1 = Make_Titik(1,1);
Titik T2; // menciptakan titik T2
T2 = Make_Titik(4,3);
Display(T1);
Display(T2);
printf("jarak = %f", Jarak(T1, T2));
getch ();
return 0;
}
Contoh : Titik Koordinat (Lanj.)
Outputnya :