STRUKTUR DATA STRUCT DAN POINTER SULIDAR FITRI, M.Sc STRUCT • Dalam C++, tipe data struktur yang dideklarasikan dengan kata kunci struct, dapat memiliki komponen dengan sembarang tipe data, baik tipe data dasar maupun tipe data turunan, termasuk fungsi. Sehingga, tipe data struktur menjadi sangat berdaya guna. Contoh • Misal : kita ingin membentuk tipe data struktur yang namanya kotak. Maka dapat dideklarasikan sebagai berikut : struct tkotak { double panjang; double lebar; }; tkotak kotak; • Untuk memberi nilai ukuran kotak tersebut, kita dapat menggunakan perintah : kotak.panjang = 10; kotak.lebar = 7; Struktur & Fungsi (1) • Cara lain untuk memberi nilai panjang dan lebar adalah dengan membentuk suatu fungsi. Karena fungsi ini hanya digunakan untuk memberi nilai data panjang dan lebar suatu kotak, tentunya fungsi ini khusus milik objek kotak, sehingga harus dianggap sebagai anggota struktur kotak. • C++ sebagai bahasa pemrograman dapat mendefinisikan anggota tipe struktur yang berupa fungsi. Struktur & Fungsi (2) • Dengan menambah fungsi tersebut, maka struktur kotak menjadi lebih jelas bentuknya, seperti berikut : struct tkotak { double panjang; double lebar; void SetUkuran(double pj, double lb) { panjang = pj; lebar = lb; }; }; tkotak kotak; • Dengan tipe struktur kotak seperti itu, untuk memberi nilai panjang dan lebar hanya dengan memanggil fungsi SetUkuran() : kotak.SetUkuran(10,7); Struktur & Fungsi (3) • Selain punya ukuran panjang dan lebar, kotak juga mempunyai keliling dan luas. Dengan demikian, kita dapat memasukkan fungsi untuk menghitung keliling dan luas ke dalam struktur kotak. • Definisi fungsi yang menjadi anggota struktur dapat ditempatkan di luar tubuh struktur. Struktur & Fungsi (4) • Dengan cara ini maka deklarasi struktur kotak menjadi seperti berikut : struct tkotak { double panjang; double lebar; void SetUkuran(double pj, double lb); double Keliling(); double Luas(); }; tkotak kotak; Struktur & Fungsi - Contoh • Contoh penerapan struktur kotak dapat dilihat dalam program berikut : #include<iostream.h> #include<conio.h> struct tkotak { double panjang; double lebar; void SetUkuran(double pj, double lb); double Keliling(); double Luas(); }; Struktur & Fungsi - Contoh int main() { tkotak kotak; kotak.SetUkuran(10,7); cout<<"Panjang : "<<kotak.panjang<<endl; cout<<"Lebar : "<<kotak.lebar<<endl; cout<<"Keliling : "<<kotak.Keliling()<<endl; cout<<"Luas : "<<kotak.Luas()<<endl; getch(); return 0; } Struktur & Fungsi - Contoh void tkotak::SetUkuran(double pj, double lb) { panjang = pj; lebar = lb; } double tkotak::Keliling() { return 2*(panjang+lebar); } double tkotak::Luas() { return panjang*lebar; } Struktur & Fungsi - Contoh • Tampilan Output : • Panjang • Lebar • Keliling • Luas : 10 :7 : 34 : 70 Struct & Class • Bentuk program di atas, adalah contoh gaya pemrograman berorientasi prosedur (terstruktur). • Dalam pemrograman berorientasi objek, jika kita telah menentukan suatu objek tertentu, maka objek tersebut kita definisikan dalam bentuk tipe baru yang namanya kelas. • Tipe data kelas didefinisikan dengan kata kunci (keyword) class, yang merupakan generalisasi dari pernyataan struct. • Pernyataan struct secara umum digantikan dengan pernyataan class. Jika objek kotak dideklarasikan dalam bentuk kelas, maka deklarasinya mirip dengan struktur. Deklarasi class tkotak { double panjang; double lebar; public: void SetUkuran(double pj, double lb); double Keliling(); double Luas(); }; tkotak kotak; Deklarasi • Dalam deklarasi kelas tersebut, muncul kata public. Data atau fungsi yang dideklarasikan di bawah kata kunci public mempunyai sifat dapat diakses dari luar kelas secara langsung. Dalam deklarasi tersebut, variabel panjang dan lebar tidak bersifat public, sehingga tidak dapat diakses secara langsung dari luar kelas. • Perintah-perintah di bawah ini tidak dapat dijalankan : kotak.panjang = 10; kotak.lebar = 7; cout<<”Panjang : ”<<kotak.panjang<<endl; cout<<”Lebar : “<<kotak.lebar<<endl; Perbedaan Struktur & Kelas • Dalam kelas, masing-masing data dan fungsi anggota diberi sifat tertentu. Jika semua anggota kelas bersifat public, maka kelas sama dengan struktur. • Untuk dapat mengakses data panjang dan lebar pada kelas tkotak harus dilakukan oleh fungsi yang menjadi anggota kelas dan bersifat public. • Pada deklarasi kelas tkotak, satu-satunya jalan untuk memberi nilai panjang dan lebar adalah dengan menggunakan fungsi SetUkuran(). • Untuk mengambil nilai panjang dan lebar juga harus dilakukan oleh fungsi yang menjadi anggota kelas. Misalnya, kita definisikan fungsi GetPanjang() dan GetLebar() untuk mengambil nilai panjang dan lebar. Contoh : //program class #include<iostream.h> #include<conio.h> class tkotak { double panjang; double lebar; public: void SetUkuran(double pj, double lb); double Keliling(); double Luas(); double GetPanjang(); double GetLebar(); }; int main() { tkotak kotak; kotak.SetUkuran(10,7); cout<<"Panjang : "<<kotak.GetPanjang()<<endl; cout<<"Lebar : "<<kotak.GetLebar()<<endl; cout<<"Keliling : "<<kotak.Keliling()<<endl; cout<<"Luas : "<<kotak.Luas()<<endl; getch(); return 0; } Contoh void tkotak::SetUkuran(double pj, double lb) { panjang = pj; lebar = lb; } double tkotak::Keliling() { return 2*(panjang+lebar); } double tkotak::Luas() { return panjang*lebar; } double tkotak::GetPanjang() { return panjang; } double tkotak::GetLebar() { return lebar; } Output • Tampilan Output : • • • • Panjang Lebar Keliling Luas : 10 :7 : 34 : 70 Definisi Kelas • Dapat dilihat dari contoh program, bentuk pendefinisian kelas adalah sebagai berikut : Tipe Nama_Kelas::NamaFungsi() { IsiFungsi } • Untuk mendefinisikan variabel kelas, digunakan deklarasi : Nama_Kelas Nama_Variabel; • Contoh : Tkotak kotak; typedef • Struktur yang didefinisikan dapat menjadi suatu tipe data baru menggunakan perintah “typedef”. • Contoh: • //penggunaan typedef • typedef struct Mahasiswa • { • string nim; • string nama; • float nilai_uts; • float nilai_uas; • } MHS; • • • • • int main() { MHS mhs; mhs.nama="Andi"; cout<<mhs.nama; return 0; } Typedef Pada Array • Pendeklarasian sebuah array bertipe int dapat dilakukan seperti yang terlihat berikut ini. • int x[100] • Alias dari array bertipe int berukuran 100 di atas dapat dilakukan menggunakan typedef sebagai berikut: • Langkah 1: Ganti variabel x dengan nama alias, misalnya Larik sehingga menjadi: • int Larik[100]; • Langkah 2: Tambahkan statemen typedef sehingga menjadi • typedef int Larik[100]; • Langkah 3: Deklarasi variabel dengan tipe Larik ukuran 100 adalah: • Larik a, b, c; POINTER Pengantar mengenai memori komputer • Sebelum berbicara mengenai pointer, diperlukan pengetahuan mengenai memori komputer • Apakah fungsi memori komputer? • Bagaimana hubungan program, variabel, dan memori? Memori komputer • RAM (Random access memory) • Istilah untuk memory yang bersifat volatile (isi memori akan hilang jika catu daya dicabut) • RAM bisa dibaca dan ditulisi data secara cepat • Contoh: DDRAM, SDRAM, cache memory • ROM (Read Only Memory) • Bersifat non volatile (data masih eksis di memori walaupun cata daya dicabut) • ROM bisa dibaca secara cepat, tapi untuk menulisi ROM butuh sekuens/urutan tertentu • Contoh: ROM BIOS • Pada mata kuliah ini, memori yang akan dibahas adalah RAM RAM • Fungsi RAM: • Menyimpan instruksi-instruksi hasil kompilasi program • Menyimpan data-data variabel • Ketika suatu program di-compile, beberapa byte memori dari RAM akan dialokasikan untuk menyimpan instruksi dan menyimpan data variabel • Alamat memori yang dialokasikan ditentukan secara otomatis oleh compiler Ilustrasi penggunaan RAM Alamat memori 0x1000 0x00 Penyimpan variabel a 0x1001 0x02 Penyimpan variabel b 0x1002 0xA2 0x1003 0x33 0x1004 0x12 0x1005 0xF0 0x1006 0x01 Penyimpan instruksi . . . . 0x2000 0x00 0x2001 0x10 Penyimpan variabel address_a Reference Operator (&) • Alamat memori tempat suatu variabel disimpan disebut reference dari variabel tersebut • Reference suatu variabel diakses melalui suatu reference operator (&) • Secara bahasa, operator ‘&’ bisa diartikan menjadi ‘alamat dari’ CONTOH PROGRAM 1 // This program stores the address of a variable in a pointer. #include <iostream.h> void main(void) { int x = 25; int *ptr; ptr = &x; // Store the address of x in ptr cout << "The value in x is " << x << endl; cout << "The address of x is " << ptr << endl; } OUTPUT CONTOH 1 The value in x is 25 The address of x is 0x7e00 ILUSTRASI 1 x 25 ptr 0x7e00 Address of x: 0x7e00 30 Program 2 // This program demonstrates the use of the indirection operator. #include <iostream.h> void main(void) { int x = 25; int *ptr; ptr = &x; // Store the address of x in ptr cout << "Here is the value in x, printed twice:\n"; cout << x << " " << *ptr << endl; *ptr = 100; cout << "Once again, here is the value in x:\n"; cout << x << " } " << *ptr << endl; 31 Program Output Here is the value in x, printed twice: 25 25 Once again, here is the value in x: 100 100 32 Program 3 #include <iostream> void main(void) { int x = 25, y = 50, z = 75; int *ptr; cout << "Here are the values of x, y, and z:\n"; cout << x << " ptr = &x; " << y << " " << z << endl; // Store the address of x in ptr *ptr *= 2; // Multiply value in x by 2 ptr = &y; // Store the address of y in ptr *ptr *= 2; // Multiply value in y by 2 ptr = &z; // Store the address of z in ptr *ptr *= 2; // Multiply value in z by 2 cout << "Once again, here are the values of x, y, and z:\n"; cout << x << " " << y << " " << z << endl; } 33 Program Output Here are the values of x, y, and z: 25 50 75 Once again, here are the values of x, y , and z: 50 100 150 34 Deklarasi tipe data pointer • Contoh : unsigned int *my_pointer; • Deklarasi di atas menyatakan deklarasi variabel my_pointer yang bertipe pointer untuk variabel tipe unsigned int (pointer to unsigned int) • Variable my_pointer digunakan untuk menyimpan suatu alamat memori suatu variabel bertipe unsigned int • Deklarasi suatu pointer diawali dengan tanda ‘*’ sebelum nama variabelnya Modifier unsigned: • dapat diterapkan pada char, int, short, long adalah void dan pointer • range nilai yang bisa dijangkau mempresentasikan bilangan seperti pada angka yang ditunjukkan oleh jumlah kilometer yang telah ditempuh pada mobil atau sepeda motor • Angka tersebut dimulai dari 0000... dan mencapai maksimum 9999..., dan kembali ke 0000... • Jadi dalam unsigned, yang ditampilkan hanyalah bilangan positif keseluruhan dalam range nol sampai ke bilangan maksimum yang dapat diprepresentasikannya. • Tipe data Ukuran memori Jangkauan nilai • • • • unsigned char 1 byte 0 s/d 255 unsigned int 2 byte 0 s/d 32767 unsigned short 2 byte 0 s/d 32.767 unsigned long 4 byte 0 s/d 2.147.438.647 Dereference operator • Selain untuk deklarasi pointer, tanda ‘*’ juga berfungsi untuk dereference operator • Dereference adalah kebalikan reference • Reference operasi melihat alamat suatu variabel • Dereference operasi untuk melihat isi dari suatu alamat memori • Contoh : a = *my_pointer; • Artinya: my_pointer berisi suatu alamat memori, dan variabel a akan berisi data yg tersimpan di alamat memori tsb. Contoh 1 penggunaan pointer unsigned int a, *pointer_a; a = 10; pointer_a = &a; cout << “nilai a : “ << a; cout << “nilai *pointer_a” << *pointer_a; Mengubah nilai variabel • Mengubah nilai variabel secara langsung: a = 250; • Mengubah nilai variabel by-reference (tidak langsung) unsigned int a,*pointer_a; pointer_a=&a; *pointer_a=250; Source: Starting out with C++, 3rd edition Erizal, S.Si, M.Kom/ Struktur dan Kelas