STRUKTUR DATA Variable Struktur Bagaimana dapat digabungkan data yang jenisnya berbeda beda sebagai satu kesatuan? Array tidak dapat dipakai karena elemen-elemen dari array harus mempunyai tipe yang sama. Yang dapat dipakai adalah struktur. Suatu struktur merupakan kumpulan dari data yang anggota-angotanya dapat mempunyai tipe yang berbeda. Dengan struktur kita dapat membentuk tipe data baru sesuai keinginan kita. Untuk mendefinisikan satu struktur kita harus memakai pemyataan struct. Format dari pernyataan struct adalah: struct nama_struktur // nama struktur, kata struct harus ada { type1 element1; type2 element2; anggota / elemen dari struktur type3 element3; . . } nama_object; // identifier yang digunakan untuk pemanggilan struktur ------------atau--------------struct nama_struktur { type1 element1; type2 element2; type3 element3; . . }; struct nama_struktur nama_object; . Contoh definisi dari struktur adalah: struct mahasiswa { char nama[25]; int umur; float rata2;' }; Struktur tag dari struktur di atas adalah mahasiswa dan mempunyai 3 anggota dengan tipe yang berbeda beda. Kitajuga dapat mendeklarasi variabel struktur pada saat mendefinisi suatu struktur misal: Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA struct mahasiswa { char nama[25]; int umur; float rata2; } mhs= { "Paul Sen Dok Seng", 28, 8.6 }; Pada definisi di atas, mhs adalah suatu variabel struktur yang sekaligus diberi nilai-nilai awal. Disini kita minta kepada C++ untuk menyisihkan sejumlah memori untuk menampung variabel struktur mhs. Cara lain untuk memberi harga awal pada suatu struktur adalah dengan menggunakan dot operator (.). Dengan dot operator kita dapat memberi nilai.awal pada masing-masing anggota dari struktur. Format dan pemakaian dot operator adalah: nama_variabel_struktur.nama_anggota Nama dari variabel struktur harus sebelum dot operator dan nama dari anggota struktur harus sesudah dot operator. Pemakaian dot operator sangat mudah seperti ditunjukkan pada contoh program di bawah ini. Contoh 1: #include <iostream.h> #include <stdio.h> struct mahasiswa { char nama[35], int umur; float rata2; }; main() Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA { struct mahasiswa mhs; cout << "Nama mahasiswa? "; gets(mhs.nama); cout << "Umur mahasiswa? "; cin >> mhs.umur; cout << "Rata-rata mahasiswa? "; cin >> mhs.rata2; // Cetak data cout << "\n\nlnformasi yang anda masukkan:\n"; cout << "Nama :" << mhs.nama << "\n"; cout << "Umur :" << mhs.umur << "\n"; cout << "Rata-rata:" << mhs.rata2 << "\n\n"; return 0; } Pada suatu fungsi, variabel struktur dipassingkan by value jadi berbeda dengan array yang harus dipassingkan by address. Passing by value artinya hanya copy dari struktur yang dipassingkan, bukan struktur yang sebenamya. Jadi bila kita mempassingkan struktur kedalam suatu fungsi, nilai kembalian dari fungsi ini ke fungsi yang memanggil harus berupa struktur yang sama sehingga hasil proses dari fungsi ini dapat dipakai. Contoh program berikut, yang merupakan modifikasi dari program di atas, menjelaskan hal ini. Contoh 2: #include <iostream.h> #include <stdio.h> struct mhs { char nama[25]; int umur; float rata2; }; struct mhs input_data_mhs(struct mhs data_mhs); void tampilkan_data_mhs(struct mhs data_mhs); main() { struct mhs mhs_1, mhs_2; mhs_1 = input_data_mhs(mhs_1); cout << "\n"; mhs_2 = input_data_mhs(mhs_2); // Cetak data cout << "\n\nlnformasi yang anda masukkan:\n" Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA tampilkan_data_mhs(mhs_ 1); tampi]kan_data_mhs(mhs_2); return 0; struct mhs input_data_mhs(struct mhs data_mhs) { cout << "Nama mahasiswa? "; gets(data_mhs.nama); cout << "Umur mahasiswa? "; cin >> data_mhs.umur; cout << "Rata-rata mahasiswa? "; cin >> data_mhs.rata2; return (data_mhs); } void tampilkan_data_mhs(struct mhs data_mhs) { cout << "Nama :" << data_mhs.nama << "\n"; cout << "Umur :" << data_mhs.umur << "\n"; cout << "Rate-rata:" << data_mhs.rata2 << "\n\n"; return; } Suatu struktur dapat bersusun, artinya anggota dari suatu struktur dapat berupa struktur yang lain. Dengan cara ini kita dapat melakukan konsolidasi yaitu memakai definisi struktur yang lama ke dalam struktur yang baru sehingga program yang dihasilkan akan lebih kompak. Perhatikan dua, definisi struktur di bawah ini: struct tanggal { int hari; int bulan; int tahun; }; struct mahasiswa { char nama[25]; Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA struct tanggal tgl_lahir; float rata2; } mhs; Struktur mahasiswa di atas mempunyai anggota denga tipe struktur tanggal sehingga membuat definisi struktur mahasiswa lebih kompak. Bagaimana kita-dapat mengakses anggota-anggota dari struktur tanggal yang ada di dalam struktur mahasiswa ? Caranya dengan memakai dot operator bersusun misalnya: mhs.tgl_lahir.tahun = 1955; Contoh program di bawah ini menjelaskan berbagai hal yang berhubungan dengan stmktur yang bersusun. Contoh 3: #include <iostream.h> #include <stdio.h> #include <string.h> struct tanggal { int hari; int buian; int tahun o }; struct mahasiswa { char nama[25], struct tanggal tgljahir; float rata2; }; struct mahasiswa input_data_mhs(struct mahasiswa data mhs)'; void tampilkan_data_mhs(struct mahasiswa data_mhs); main() { struct mahasiswa mhs; mhs = input_data_mhs(mhs); // Cetak data cout << "\nlnformasi yang anda masukkan:\n"; tampilkan_data_mhs(mhs); Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA return 0; } struct mahasiswa input_data_mhs(struct mahasiswa data_mhs) { // Bersihkan input buffer fflush(stdin); cout << "Nama mahasiswa? "; gets(data_mhs.nama); cout << "Hari lahir? "; cin >> data_mhs.tgl_lahir.hari; cout << "Bulan lahir? ";o cin >> data_mhs.tgl_lahir.bulan; cout << "Tahun lahir? "; cin >> datajnhs.tgljariir.tahun; cout << "Nilai rata-rata? "; cin >> data_mhs.rata2; return (data_mhs); } void tampilkan_data. mhs(struct mahasiswa data_mhs) { char *bln[]= { "nol", "Januari", "Februari", "Maret", "Apnl", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember" }; cout << "Nama : " << data_mhs.nama << "\n"; cout << "Tgl. lahir: " << data_mhs.tgl_lahir.hari << " " << bln[data_mhs.tgl_lahir.bulan] << " " << data_mhs.tgl_lahir.tahun << "\n"; cout << "Rata-rata : " << data_mhs.rata2 << "\n\n"; return; } Telah dibahas bahwa bahwa passing struktur ke suatu fungsi adalah by value artinya copy dari struktur yang dipassingkan. Cara ini mungkin menimbulkan masalah kalau yang dipassingkan adalah suatu array yang elemen elemennya berupa struktur dan array mempunyai ukuran yang besar sehingga memerlukan banyak memori iintuk menampung copy dari array yang dipassingkan. Keadaan ini dapat dihindari dengan melakukan passing pointer ke struktur pada fungsi tersebut, artinya alamat dari struktur yang dipassingkan sehingga elemen-elemennya dapat diakses. Akses ke elemen-elemen ini dilakukan dengan menggunakan pointer operator (->) seperti ditunjukkan oleh program di bawah ini. Contoh 4: #include <iostream.h> #include<string.h> struct test Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA { int a; phar b; char nama[25], }; void isi_struct(stn.ict test *s); main() { struct test r; isi_struct(&r); cout << r.a << "\t" << r.b << "\t" << r.nama; return 0; } void isi_struct(struct test *s) { s->a = 15; s->b = ‘Z'; strcpy(s->nama, "Grup"); } Sebenarnya pointer operator ini dapat pula diganti dengan dot operator perhatikan bahwa: s->nama adalah sama dengan (*s).nama yang terakhir ini memakai dot operator untuk mengakses nama bersama dengan operator *, tanda kurung. diperlukan karena dot operator mempunyai prioritas yang lebih tinggi dari operator *. Tadi telah disinggung bahwa kita dapat membentuk suatu array yang elemen elemennya berupa struktur. Deklarsi dari array ini sangat mudah dan dijelaskan langsung lewat contoh program di bawah ini Contoh 6: #include <iostream.h> #include <stdlib.h> struct ttk Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA { int x, int y; }; main() { int i; struct ttk titik[ 10]; // Beri benih pada random gernerator srand(30); for (i=0; i < 10; ++i) { titik[i].x = rand() % 100; titik[i].y=rand()%100; } for(i=0;i< 10;++i) { cout << titik[i].x << ", " << titik[i].y << "\n"; } return 0; } Pada contoh program di atas sejumlah memori secara ekplisit disisihkan untuk menampung array titik yang mempunyai 10 elemen. Sebenamya alokasi memori ini, hanya yang dibutuhkan saja, dapat dilakukan secara dinamis yaitu dilakukan pada saat run-time, Untuk melakukan hal ini kita perlu array yang elemen elemennya adalah pointer ke suatu struktur seperti dijelaskan pada program di bawah ini. Contoh 7: #include <iostream.h> #include <stdlib.h> struct ttk { int x; int y; }; main() { int i; struct ttk *titik[10], // Beri benih pada random gernerator srand(30); for(i=0;i<10;++i) Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA { // titik[i] = (struct ttk *)malloc(sizeof( struct ttk)); titik[i] = new ttk; titik[i]->x=rand()%100; titik[i]->y = rand() % 100; } for (i=0;i< 10;++i) { cout << titik[i]->x << ", " << titik[i]->y << "\n"; } for(i=0;i< 10;++i) { // free(titik[i]); delete titik[i]; } return 0; } Alokasi memori secara dinamis dilakukan dengan operator new dan dealokasi dilakukan dengan operator delete. Keduanya merupakan operator baru pada C++. Sarji, S.Kom - Struktur Data STMIK AMIKOM YOGYAKARTA