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 :