Contoh definisi dari struktur adalah - E

advertisement
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
Download