Anda di halaman 1dari 15

MODUL PRAKTIKUM

STRUKTUR
DATA
TA. 2020-2021

Laboratorium Jaringan Komputer

dan Struktur Data (Netlab) 2021


BAB 1
POINTER, STRUCT, REKURSIF
1.1 PENGERTIAN POINTER
Pointer dapat didefinisikan sebagai suatu variabel yang menyimpan
alamat memori. Jika kita mempunyai sebuah variabel dengan tipe data
tertentu, maka untuk mendapatkan alamat dari variabel tersebut adalah dengan
menggunakan operator & (Dereference). Alamat inilah yang kemudian akan
disimpan ke dalam variabel yang bertipe pointer. Untuk mendeklarasikan
variabel sebagai pointer, maka hanya menambahkan tanda asterik (*) di depan
nama variabel. Berikut ini bentuk umum dari pendeklarasian variabel yang
bertipe pointer.
Tipe_data *nama_pointer;

Tipe data di atas berguna untuk menyatakan bahwa pointer yang kita
deklarasikan tersebut akan ditempati oleh data dengan tipe tertentu.
Ilustrasi pointer :

Kita memiliki variabel X yang berisi nilai karakter “a”, maka oleh
compiler C++ nilai “a” ini akan disimpan di suatu alamat tertentu di memori.
Sehingga alamat variabel X ini dapat diakses dengan menggunakan statement
&X.
Jika kita ingin menyimpan alamat dari variabel X ini, kita dapat
menggunakan suatu variabel misalnya
int alamat_x = &x;

Maka alamat_x adalah suatu variabel yang berisi alamat dimana nilai X
disimpan. Variabel alamat_x disebut variabel pointer atau sering disebut dengan
pointer saja.

1
Gambar 1.1 Operator Pointer

Gambar 1.2 Perbedaan pointer dengan variabel biasa


A. JENIS TIPE DATA
Tabel 1.1 Jenis Tipe Data
int Bilangan bulat 2 byte -32768 hingga 32768

short Sama dengan int namun 2 byte -32768 hingga 32768


int jangkauanya lebih pendek

long Memiliki jangkauan lebih 4 byte -2147483648 hingga


int panjang dari int 2147483648

bool Tipe data untuk 1 byte 1 atau 0 (True atau False)


menampung nilai
kebenaran (flag)

2
float Bilangan floating point 4 byte 3,4 x 10^-38 hingga 3,4 x
atau koma 10^+38

double Sama dengan float namun 8 byte 1,7 x 10^-308 hingga 1,7
memiliki jangkauan dua x 10^+308
kali dari float

long Sama dengan double 10 3,4 x 10^-4932 hingga


double namun memiliki byte 3,4 x 10^+4932
jangkauan lebih lebar

char Menampung tipe karakter 1 byte -128 hingga 128

Contoh penerapan pointer pada program :


#include <iostream>
using namespace std;
int main()
{
int *a,*b,*c = 0;
int d = 10;

a = &d;
cout<<"Nilai D : "<<d<<" Disimpan pada
alamat "<<a<<endl;
cout<<"Nilai B : "<<b<<" Disebut dangling
praktikum "<<endl;
cout<<"Nilai C : "<<c<<" Disebut null pointer ";

return 0;
}

Tampilan :

Gambar 1.3 Hasil Tampilan Program

3
1.2 POINTER TANPA TIPE DATA
Ada cara khusus untuk membuat pointer yang dideklarasikan tersebut
dapat menunjuk ke semua tipe data, yaitu dengan mendeklarasikan pointer
tersebut sebagai pointer tanpa tipe atau disebut “void pointer”. Bentuk
umumnya adalah :
Void *nama_pointer;
Contoh penerapan pointer pada program :
#include <iostream>
using namespace std;
int main()
{
void *P;
int X=10;
float Y;

P=&X;

cout<<"Nilai X : "<<X<<endl;
cout<<"Nilai P : "<<P<<endl;

P=&Y;
Y =3.5;

cout<<"Nilai Y : "<<Y<<endl;
cout<<"Nilai P : "<<P<<endl;
cout<<"Alamat P : "<<&P<<endl;

return 0;
}

Tampilan :

Gambar 1.4 Hasil Tampilan Program

4
1.3 ATURAN POINTER
Variabel pointer dapat dideklarasikan dengan tipe data apapun.
Pendeklarasian variabel pointer dengan tipe data tertentu digunakan untuk
menyimpan alamat memori yang berisi data sesuai dengan tipe data yang
dideklarasikan, bukan untuk berisi nilai bertipe data tertentu. Tipe data
digunakan sebagai lebar data untuk alokasi memori (misalnya char berarti
lebar datanya 1 byte, Int 4 Bytes, dst).
Jika suatu variabel pointer dideklarasikan bertipe float, berarti variabel
pointer tersebut hanya bisa digunakan untuk menunjuk alamat memori yang
berisi nilai bertipe float juga.
Namun besaran alokasi memori dari sebuah pointer dapat berbeda
sesuai tipe datanya dan juga kompiler nya. Pada komputer yang menggunakan
32-bit processor, sebuah pointer akan menempati 32 bits atau 4 bytes.
Sedangkan pada komputer yang menggunakan 64-bit processor, pointer akan
menempati 64 bits or 8 bytes. Untuk mengetahui alokasi memori pada setiap
tipe data kalian dapat mencoba menjalankan perintah size of([Tipe Data] *)
contohnya :
#include <iostream>
using namespace std;
int main()
{
cout<<sizeof(char *);
cout<< sizeof(int *);
cout<<sizeof(float *);
cout<<sizeof(double *);
return (0);
}

1.4 ATURAN POINTER


Antar variabel pointer dapat dilakukan operasi assignment.
Contoh 1 : mengisi variabel dengan nilai yang ditunjuk oleh sebuah variabel
pointer.
#include <iostream>
using namespace std;
main()
{
int *x, a = 25, b ;
x = &a;
b = *x;
cout << "Nilai a = "<<a<<" di alamat "<<x<<endl;

5
cout << "Nilai b = "<<b<<" di alamat "<<x<<endl;
}
Tampilan :

Gambar 1.5 Hasil Tampilan Program Contoh 1 Tabel 1.2


Penjabaran Variabel Program Contoh 1

Variabel Data Alamat


a 25 0x6ffe00
b 25 0x6ffe01

Contoh 2 : assignment dan sebuah alamat dapat ditunjuk oleh lebih dari 1
pointer.
#include <iostream>
using namespace std;
main()
{
float a, *x1, *x2 ;
a = 24.4;
x1 = &a;
x2 = x1;
cout << "Nilai yang ditunjuk x1 = "<<a<<" di alamat
"<< &a <<endl;
cout << "Nilai yang ditunjuk x2 = "<<*x2<<" di alamat
"<<x2<<endl;
}
Tampilan :

Gambar 1.6 Hasil Tampilan Program Contoh 2 Tabel 1.3


Penjabaran Variabel Program Contoh 2

Variabel Data Alamat


a 24.4 0x6ffdfc

6
X1 0x6ffdfc 0x6ffe01
X2 0x6ffdfc 0x6ffe02

Contoh 3 : mengoperasikan isi variabel dengan menyebut alamatnya dengan


pointer.
#include <iostream>
using namespace std;
main()
{
double a = 30, b = 15, *x1, *x2 ;
x1 = &a;
x2 = &b;
cout << "Nilai yang ditunjuk x1 = "<<*x1<<" di alamat
"<< x1 <<endl;
cout << "Nilai yang ditunjuk x2 = "<<*x2<<" di alamat
"<<x2<<endl;
*x1 = *x2;
cout << "Nilai yang ditunjuk x1 = "<<*x1<<" di alamat
"<< x1 <<endl;
cout << "Nilai yang ditunjuk x2 = "<<*x2<<" di alamat
"<<x2<<endl;
}
Tampilan :

Gambar 1.7 Hasil Tampilan Program Contoh 3 Tabel 1.4


Penjabaran Variabel Program Contoh 3

Variabel Data Alamat


a 30 0x6ffe00
b 15 0x6ffe01
X1 0x6ffe00 0x6ffe02
X2 0x6ffe01 0x6ffe03

1.5 POINTER PADA ARRAY


Array adalah sebuah variabel yang menyimpan sekumpulan data yang
memiliki tipe sama. setiap data tersebut menempati lokasi atau alamat memory

7
yang berbeda-beda dan selanjutnya di sebut dengan element array. Element
array tersebut kemudian dapat kita akses melalui indeks yang terdapat di
dalamnya namun penting sekali untuk di perhatikan bahwa dalam C++, Indeks
array selalu di mualai dari 0, bukan 1.
Pada array, setiap element akan memiliki nilai dan memiliki alamat
memori yang berbeda. Variabel pointer perlu increment. Pehatikan contoh
program dibawah ini!
#include<iostream>
using namespace std;
int main()
{
int i,x;
int nilai[x];
int *almtnilai;
almtnilai = nilai;
cout<<"Masukkan Jumlah Array : ";
cin>>x;
cout<<endl;
for(i=1;i<=x;i++)
{
cout<<"Masukan Nilai "<<i<<" = ";
cin>>nilai[i];
}
cout<<endl;
cout<<"Hasil Pengaksesan Elemen Array Lewat Pointer";
cout<<endl<<endl;
for(i=1;i<=x;i++)
{
cout<<"Elemen "<<i<<". Nilai "<<nilai[i];
cout<<", Menempati Alamat Memori = ";
cout<<&almtnilai[i];
cout<<endl;
}
return 0;
}
Tampilan :

Gambar 1.8 Hasil Program Pointer Pada Array

8
1.6 PENGERTIAN STRUCT
Struct (struktur) adalah kumpulan element-elemen data yang
digabungkan menjadi satu kesatuan. Masing-masing elemen data tersebut
dikenal dengan sebutan field. Field data tersebut dapat memiliki tipe data yang
sama ataupun berbeda. Walaupun field-field tersebut berada dalam satu
kesatuan, masing-masing field tersebut tetap dapat diakses secara individual.
Field-field tersebut digabungkan menjadi satu dengan tujuan untuk
kemudahan dalam operasinya. Misalnya anda ingin mencatat data-data
mahasiswa dan pelajar dalam sebuah program. Untuk membedakannya anda
dapat membuat sebuah struct mahasiswa yang terdiri dari field nama, nim,
program studi, dan ipk. Serta sebuah record pelajar yang terdiri dari field-field
nama, nim, alamat, dan nilai. Dengan demikian akan lebih mudah untuk
membedakan keduanya. Bentuk umum :
struct nama_struct
{
tipe_data1 field1;
tipe_data2 field2;
tipe_dataN fieldN;
};

// Contoh
struct mahasiswa
{
char nim[11], nama[50];
char alamat[100];
float ipk;
};

1.7 PENGGUNAAN DAN PENGAKSESAN ELEMEN TERSTRUKTUR


Untuk menggunakan struktur, tulis nama struktur beserta dengan
fieldnya yang dipisahkan dengan tanda titik (“ . “). Misalnya anda ingin
menulis nim seorang mahasiswa ke layar maka penulisan yang benar adalah
sebagai berikut :
a) Mahasiswa.nim = “1818126”;
b) cout << mahasiswa.nim;
Jika x adalah pointer bertipe mahasiswa* maka field dari x dapat
diakses dengan mengganti tanda titik dengan tanda panah (“ -> “).
cout << mahasiswa->nim;

9
Contoh Program :
#include <iostream>
#include <cstdlib>
using namespace std;

struct mahasiswa
{
char nim[11], nama[50];
char alamat[100];
float ipk;
};
int main()
{
mahasiswa mhs;
cout<<"Masukkan NIM : "; cin>>mhs.nim;
fflush(stdin);
cout<<"Masukkan Nama : "; gets (mhs.nama);
fflush(stdin);
cout<<"Alamat : ";gets ( mhs.alamat );
cout<<"IPK :";cin>>mhs.ipk;
cout<<"================================ \n";
cout<<"NIM : "<<mhs.nim<<endl;
cout<<"Nama : "<<mhs.nama<<endl;
cout<<"Alamat : "<<mhs.alamat<<endl;
cout<<"IPK : "<<mhs.ipk<<endl;
}

Tampilan:

Gambar 1.9 Hasil Program Struct


1.8 PENGERTIAN REKURSIF
Rekursif adalah salah satu metode dalam dunia matematika, rekursif
didefinisikan sebagai sebuah fungsi yang mengandung fungsi itu sendiri. Dalam

10
dunia pemrograman, rekursif diimplementasikan dalam sebuah fungsi yang
memanggil dirinya sendiri dan prosesnya terjadi secara berulang-ulang.
Fase dalam rekursif terdiri dari 3 fase yaitu :
A. FASE AWAL
Fase awal merupakan fase dimana fungsi tersebut memanggil
dirinya sendiri.
B. FASE TERMINATE
Terminate merupakan fase dimana fungsi tersebut berhenti
memanggil dirinya sendiri.
C. FASE BALIK
Fase balik merupakan fase mengunjungi kembali kondisi – kondisi
dari fase awal yang telah terbentuk dan mengembalikan nilai yang telah
didapat dari fase terminal.
Contoh penerapan rekursif . Diketahui fungsi rekursif adalah :
Rekursif ( n ) = n + Rekursif ( n - 3 )

Gambar 1.10 Penyelesaian Contoh Fungsi Rekursif

11
1.9 IMPLEMENTASI REKURSIF
A. FAKTORIAL
Dalam matematika, faktorial dari bilangan asli n adalah hasil
perkalian antara bilangan bulat positif yang kurang dari atau sama dengan
n. Faktorial ditulis sebagai n! dan disebut n faktorial. Secara umum dapat
dituliskan sebagai:

Dimana 0! = 1
Contoh : faktorial 4
4! = 4 x 6 = 24
3! = 3 x 2 = 6
2! = 2 x 1 = 2
1!=1
0!=1
Implementasi dari fungsi faktorial :
#include <iostream>
using namespace std;

int faktorial(int angka)


{
if (angka <= 1)
{
return 1;
}
else
{
return angka * faktorial(angka - 1);
}
}
int main ()
{
long bil,c;
cout<<"Mencari nilai faktorial"<<endl;
cout<<"Masukkan bilangan faktorial : ";cin>>c;
for(bil = 0; bil<=c;bil++) {

cout<<"Hasil faktorial "<<bil<<" :


"<<faktorial(bil)<<"\n";
}
}

12
Tampilan :

Gambar 1.11 Hasil Program Faktorial


B. FIBONACCI
Fibonacci adalah kumpulan deret angka seperti berikut ini “1, 1, 2,
3, 5, 8, 13 , 21, 34, 55, ...”. setiap bilangan setelah bilangan kedua
merupakan jumlah dari dua bilangan sebelumnya. Dengan demikian 2 dari
1+1, 3 dari 2+1, 5 dari 3+2, dan demikian seterusnya yang merupakan
definisi rekursif dan secara sistematis dijabarkan sebagai berikut :
Jika n = 0, maka Fn = 0, jika n = 1, maka Fn = 1
Jika n > 1, maka Fn = F(n-1)+F(n-2)
Implementasi dari fungsi fibonacci dari definisi diatas dapat
dinyatakan sebagai berikut : Karena Fn = n untuk n < 2, kita dapat
menyederhanakan dengan pernyataan If. Implementasi dari fungsi
Fibonacci :
#include <iostream>
using namespace std;
int fibonacci(int angka)
{
if (angka<2)
{
return angka;
}
else
{
return fibonacci(angka - 1)+ fibonacci (angka
- 2);
}
}
int main()
{
int bil,c;
cout<<" === Fibonacci === "<<endl;
cout<<"Masukkan bilangan Fibonacci : ";cin>>c;
for(bil=1;bil<=c;bil++)
{

13
cout<<"Fibonacci ( "<<bil<<" )
= "<<fibonacci(bil)<<"\n";
}
}

Tampilan :

Gambar 1.12 Hasil Program Fibonacci

14

Anda mungkin juga menyukai