STRUKTUR
DATA
TA. 2020-2021
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
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
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 :
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 :
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);
}
5
cout << "Nilai b = "<<b<<" di alamat "<<x<<endl;
}
Tampilan :
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 :
6
X1 0x6ffdfc 0x6ffe01
X2 0x6ffdfc 0x6ffe02
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 :
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;
};
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:
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 )
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;
12
Tampilan :
13
cout<<"Fibonacci ( "<<bil<<" )
= "<<fibonacci(bil)<<"\n";
}
}
Tampilan :
14