Você está na página 1de 5

Modul 1

Abstract Data Type (ADT)


I. Tujuan
1. Memahami konsep dan implementasi ADT dalam bahasa C.
2. Memahami penggunaan ADT sederhana dan majemuk dalam aplikasi sehari-hari.

II. Dasar Teori


Tipe data merupakan sebuah abstraksi yang digunakan sebagai template untuk
data yang akan disimpan. Tipe data digunakan untuk memodelkan sekumpulan data
tertentu. Tipe data dibedakan menjadi dua jenis, yaitu:

Tipe data dasar: tipe data yang sudah ada pada bahasa pemrograman yang
digunakan, seperti bilangan bulat (integer), bilangan real presisi tunggal
(float), bilangan real presisi ganda (double), karakter (char), dan kosong
(void).

Tipe data bentukan: tipe data yang didefinisikan sendiri oleh programmer,
misalnya saat menemui kebutuhan tertentu yang tidak dapat hanya diwakilkan
oleh satu tipe data dasar. Tipe data bentukan merupakan gabungan dari satu
atau lebih tipe data dasar. Tipe data bentukan memiliki dua struktur utama,
yaitu nama tipe data baru dan record (satu atau lebih tipe data dasar yang
didefinisikan).

ADT adalah sebuah entitas dengan sejumlah atribut dan sekumpulan operasi yang
didefinisikan pada atribut-atribut tersebut. ADT terdiri atas dua bagian, yaitu:

Spesifikasi (What): terdiri dari nama ADT, deskripsi domain tipe data, dan
daftar operasi yang diterapkan pada contoh tipe data.

Implementasi (How): berisi badan dari setiap operasi yang disediakan.

ADT dapat berupa tipe data dasar namun diberi nama baru atau berupa kumpulan
tipe data berbeda yang diberi nama baru. Kumpulan data penyusun ADT dapat berupa
tipe data dasar maupun ADT lain. Untuk pembuatan ADT pada bahasa C menggunakan
keyword typedef. Contoh pendefinisian ADT yang merupakan tipe data dasar namun
diberi nama baru:

typedef struct
{
int jumlah;
}Quantity;

Quantity adalah ADT yang memiliki satu tipe data dasar, yaitu integer (bilangan bulat).
Contoh ADT yang mengandung beberapa tipe data dasar adalah Point (titik) yang
tergambar pada Diagram Cartesius. Dalam ADT ini terdapat dua atribut, yaitu absis
(sumbu x) dan ordinat (sumbu y) yang keduanya bertipe data integer. ADT tersebut dapat
didefinisikan sebagai berikut:
typedef struct
{
int absis;
int ordinat;
}Point;

Selain kedua jenis ADT di atas, terdapat pula ADT yang terdiri dari ADT lain.
Misalnya ADT Line (garis) yang mengandung ADT lain, yaitu Point. Sebuah garis lurus
terbentuk dari dua buah titik, yaitu titik awal (start) dan titik akhir (end), sehingga ADT
Line dapat didefinisikan sebagai berikut:
typedef struct
{
Point start;
Point end;
}Line;

Setelah ADT didefinisikan, lalu dibuat pendeklarasian variabelnya, misalnya pada


ADT Point yang telah dibuat, maka dapat dibuat variabel P dengan cara:
Point P;

Cara membaca pendeklarasian variabel di atas: Point adalah tipe data dan P adalah
variabel dari tipe data Point.
Atribut di dalam ADT dapat diakses dengan tanda titik, misalnya untuk
mengakses nilai absis pada titik koordinat, maka syntax yang digunakan adalah P.absis
atau untuk mengakses nilai ordinat pada titik koordinat maka syntax yang digunakan
adalah P.ordinat. Contoh cara mengakses nilai ordinat titik awal pada variabel L yang
bertipe data Line adalah dengan L.start.ordinat.
ADT berbeda dengan record. ADT terdiri dari record beserta operasi-operasinya,
tidak seperti record yang merupakan bagian dari ADT dan hanya sebatas pendefinisian
tipe data baru saja. Misalnya pada ADT Point, terdapat record Point yang didefinisikan

sebagai tipe data baru, lalu diikuti dengan adanya berbagai operasi yang dikenakan pada
tipe data Point, seperti menginisialisasi nilai-nilai atribut dalam Point, mengubah nilainilai atribut dalam Point, mencetak nilai-nilai atribut dalam Point, dan sebagainya. Bentuk
dari operasi-operasi tersebut adalah fungsi. Ada tiga macam fungsi dalam ADT, antara
lain:

Constructor: fungsi untuk menginisialisasi suatu variabel dari sebuah ADT


dengan mendefinisikan nilai atribut-atributnya dengan nilai awal tertentu.

Mutator: fungsi untuk mengubah nilai atribut yang dimiliki oleh suatu variabel
dari sebuah ADT.

Accessor: fungsi untuk mengakses suatu informasi yang berkaitan dengan


nilai atribut tertentu suatu variabel dari sebuah ADT.

III. Demo
Ketikkan code program di bawah ini, amati hasilnya, dan pahami cara kerjanya!
header.h
//FILE INI BERISI SPESIFIKASI ADT YANG DIGUNAKAN
#include <stdio.h>
#include <conio.h>
#include <math.h>
//Mendefinisikan sebuah ADT baru dengan nama "Point"
typedef struct
{
int absis;
int ordinat;
}Point;
//Mendefinisikan sebuah ADT baru dengan nama "Line"
typedef struct
{
Point start;
Point end;
}Line;
//Daftar operasi yang diterapkan pada ADT
void initPoint(Point *P, int absis, int ordinat); //Constructor untuk
ADT Point
void initLine(Line *L, Point start, Point end); //Constructor untuk ADT
Line
void movePointDiagonally(Point *P); //Mutator untuk menggeser sebuah
titik secara diagonal ke kanan atas sejauh satu satuan terhadap sumbu x
dan sumbu y
double getLineLength(Line L); //Accessor untuk mendapatkan panjang garis
dari ADT Line
void printPoint(Point P); //Accessor untuk mencetak koordinat sebuah
titik dari ADT Point

source.cpp
//FILE INI BERISI IMPLEMENTASI ADT YANG DIGUNAKAN
#include "header.h"
void initPoint(Point *P, int absis, int ordinat)
{
(*P).absis=absis;
(*P).ordinat=ordinat;
}
void initLine(Line *L, Point start, Point end)
{
(*L).start=start;
(*L).end=end;
}
void movePointDiagonally(Point *P)
{
(*P).absis++;
(*P).ordinat++;
}
double getLineLength(Line L)
{
double deltaX,deltaY;
deltaX=L.end.absis-L.start.absis;
deltaY=L.end.ordinat-L.start.ordinat;
return sqrt(deltaX*deltaX+deltaY*deltaY); //Rumus Phytagoras
}
void printPoint(Point P)
{
printf("(%d,%d)",P.absis,P.ordinat);
}

main.cpp
//FILE INI BERISI BADAN UTAMA PROGRAM YANG MENGGUNAKAN ADT
#include "header.h"
void main()
{
int x1, y1, x2, y2;
Point P1, P2;
Line L;
printf("Masukkan
printf("Masukkan
printf("Masukkan
printf("Masukkan

koordinat
koordinat
koordinat
koordinat

titik
titik
titik
titik

pertama sumbu x: ");scanf("%d",&x1);


pertama sumbu y: ");scanf("%d",&y1);
kedua sumbu x : ");scanf("%d",&x2);
kedua sumbu y : ");scanf("%d",&y2);

initPoint(&P1,x1,y1);
initPoint(&P2,x2,y2);
initLine(&L,P1,P2);
printf("\nKoordinat titik pertama: ");printPoint(P1);
printf("\nKoordinat titik kedua : ");printPoint(P2);
printf("\n\nPanjang garis: %.2lf",getLineLength(L));
movePointDiagonally(&P1);
movePointDiagonally(&P2);

printf("\n\nKoordinat titik pertama setelah digeser diagonal ke kanan


atas: ");printPoint(P1);
printf("\nKoordinat titik kedua setelah digeser diagonal ke kanan
atas : ");printPoint(P2);
getch();
}