Struktur data selain array : Structure, Union, Enumeration Pertemuan ke 12.
Structure: definition Struct(ure) adalah suatu struktur data yang menggabungkan beberapa data yang berbeda (heterogen) tapi saling berkaitan. Contoh: struct penduduk memiliki nama , alamat, usia. nama : bisa didefinisikan sebagai char nama[30]; alamat : bisa didefinisikan sebagai char alamat[50]; usia : bisa didefinisikan sebagai int usia; Ketiga data diatas memiliki tipe data yang berbeda tetapi saling berkaitan
Structure: declaration struct [type_name] { data_type mvar_name[,mvar_name,…]; [data_type mvar_name[,mvar_name,…];] } [svar_name]; type_name = nama tipe struct. mvar_name = nama variabel member dari struct atau field. svar_name = nama variabel struct. Deklarasi variable struct (svar_name) bisa dilakukan pada saat deklarasi tipe struct seperti diatas ATAU secara terpisah seperti dibawah ini (ingat local variable dan global variable): struct type_name svar_name[,svar_name,…];
Structure: Sample struct declaration Variasi ke 1 struct penduduk { char nama[30]; char alamat[50]; int usia; }; Pendefinisian variabelnya: struct penduduk wni, wna; Variasi ke 2 struct { char nama[30]; char alamat[50]; int usia; } wni, wna; Pendefinisian variabelnya: Sudah langsung didefinisikan diatas Variasi ke 3 struct datapenduduk{ char nama[30]; char alamat[50]; int usia; } wni, wna; Pendefinisian variabelnya: Sudah langsung didefinisikan diatas
Structure: inisialisasi dan akses variabel struct #include <stdio.h> #include <conio2.h> struct penduduk { char nama[30]; char alamat[50]; int usia; }; int main() { // inisialisasi struct penduduk wni={"danny","gading serpong",28}; // Akses variable dengan namavariablestruct dot field printf("Nama : %s \n", wni.nama); printf("Alamat : %s \n", wni.alamat); printf("Usia : %d \n", wni.usia); getch(); return 0; }
Structure: scope variable struct Lingkup variable struct maupun tipe data struct seperti jenis variable lainnya yaitu bisa didefinisikan sebagal GLOBAL variable atau LOCAL variable (didalam suatu function). struct bisa didefinisikan bertingkat, artinya didalam field struct bisa berisi struct yang lain.
Structure: scope variable struct (samples) Definisi tipe data struct secara lokal: struct penduduk{ char nama[30]; char alamat[50]; int usia; }; int main() { struct penduduk wni,wna; ... } Definisi tipe data struct secara global dan lokal char nama[30]; char alamat[50]; int usia; struct penduduk wni; //wni global struct variable int main(){ struct penduduk wna; //wna local struct variable
Structure: Structure as parameter to function struct bisa dikirim ke function dengan call by value dan call by reference. Function bisa melakukan return dengan type data struct. // Menghitung jarak dua titik secara modular #include <stdio.h> #include <conio2.h> #include <math.h> struct t_koord { int x, y; }; struct t_koord isikoord(char ch){ struct t_koord t; printf("\nTitik %c:\n“,ch); printf("posisi x dan y ? "); scanf("%d %d“,&t.x,&t.y); return t; } float hjarak(struct t_koord t1,struct t_koord t2){ float jarak; jarak = sqrt(pow((t1.x-t2.x),2)+pow((t1.y-t2.y),2)); return jarak; int main(){ struct t_koord tA, tB; float jarak; tA = isikoord('A'); tB = isikoord('B'); jarak = hjarak(tA,tB); printf("\nJarak A dan B = “); printf(“%.2f unit“,jarak); getch(); return 0; }
Structure: array of structure struct merupakan suatu tipe data, seperti int, char, float maka struct juga bisa digabungkan dengan struktur data array (variable array yang memiliki tipe data struct) array of struct. #include <stdio.h> #include <conio2.h> struct mhs { char nama[30]; float nilai; }; int main() { struct mhs ar_mhs[10], datamhs={"Dian", 5.5}; int i; printf("Nama : "); gets(ar_mhs[0].nama); printf("Nilai : "); scanf("%4.2f",&ar_mhs[0].nilai); ar_mhs[1] = datamhs; for(i=0;i<2;i++) { printf("nama : %s “,ar_mhs[i].nama); printf("nilai : %4.2f\n”,ar_mhs[i].nilai); } getch(); return 1;
Structure: struct within struct (multi level struct) Didalam struct bisa berisi struct yang lain seperti contoh dibawah ini: #include <stdio.h> #include <conio2.h> struct ip { float ips; float ipk; }; struct mhs { char nama[30]; struct ip ipmhs; int main() { struct mhs datamhs; gets(datamhs.nama); scanf("%f",&datamhs.ipmhs.ips); scanf(“%f",&datamhs.ipmhs.ipk); printf(“nama : %s ",datamhs.nama); printf(“ips: %4.2f ",datamhs.ipmhs.ips); printf(“ipk: %4.2f ",datamhs.ipmhs.ipk); getch(); return 0; }
Union Union digunakan untuk sharing memory location. Hal ini memungkinkan satu memory location ditempati oleh dua atau lebih variabel dengan tipe data yang berbeda Jumlah memory yang digunakan adalah size dari data type yang terbesar Kegunaan : menghemat pemakaian system memory. juga berguna untuk low level programming(ie.: direct access to hardware components).
Union: notasi union [type_name] { data_type mvar_name; } [uvar_name]; type_name = nama tipe union. mvar_name = nama-nama variabel yang di-share memorinya, minimal 2 variabel. uvar_name = variabel union.
Union: notasi Memory yang dipakai ditentukan oleh field yang terbesar. Contoh definisi union int dan char union tbil { unsigned int di; unsigned char dc[2]; } bil_x; /* variabel union*/ int = 4 byte dan char = 1 byte ; dalam hal ini yang disediakan 4 byte memory. Akses elemen union dengan format : variabel_union.nama_elemen Contoh : bil_x.di bill_x.dc[0] Addr Isi Var FFEA ? dc[0] di FFEB dc[1] FFEC FFED
Union: sample program di = 321 dc[0] = 65 dc[1] = 1 alamat di = 22FF44 Hasil: di = 321 dc[0] = 65 dc[1] = 1 alamat di = 22FF44 alamat dc[0] = 22FF44 alamat dc[1] = 22FF45 Karena union di = 4 byte (int) sedangkan dc=1 byte (char). Maka memory yang disediakan sebanyak 4 byte = 32 bit. 321 secara binari = 00000001 01000001 di menempati 4 byte dc[0] menempati byte ke 1 dc[1] menempati byte ke 2 Union: sample program #include <stdio.h> #include <conio2.h> int main() { union tbil { unsigned int di; unsigned char dc[2]; } bil_x; /* variabel union*/ bil_x.di = 321; printf("di = %d\n“,bil_x.di); printf("dc[0] = %d\n“,bil_x.dc[0]); printf("dc[1] = %d\n“,bil_x.dc[1]); printf("alamat di = %X\n",&bil_x.di); printf("alamat dc[0] = %X\n",&bil_x.dc[0]); printf("alamat dc[1] = %X\n",&bil_x.dc[1]); getch(); return 0; } [15] [14] [13] [12] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0] 1 Binari 256 64 desimal
Enumeration enum nama_enumerasi {nilai0, nilai1, nilai2,…, nilain}; Enumerasi adalah suatu tipe data yang nilainya telah didefinisikan secara pasti pada saat pembentukan tipe tersebut. Tipe data ini digunakan untuk menyatakan sesuatu yang nilainya sudah pasti seperti nama hari, nama bulan, jenis kelamin, dll. Notasi: enum nama_enumerasi {nilai0, nilai1, nilai2,…, nilain}; Indeks enumerasi normalnya berawal dari 0, tapi bisa didefinisikan sesuai keperluan dengan notasi dibawah ini: enum nama_enumerasi { nilai0 = n, nilai2=n+10,….,nilain = x}; Contoh definisi enumerasi: enum jeniskelamin { pria , wanita }; enum boolean { false, true }; enum namahari { senin, selasa, rabu, kamis, jumat, sabtu, minggu };
Enumeration: sample program #include <stdio.h> #include <conio2.h> #include <string.h> enum jeniskelamin {pria,wanita}; /* indeks pria = 0, wanita = 1; */ int main() { char nama[25]; enum jeniskelamin gender; // definisi variabel gender dengan tipe data jenis kelamin strcpy(nama,"TASYA"); gender = wanita; printf( "Nama : %s \n",nama); printf( "Jenis Kelamin : %d", gender); getch(); return 0; }
Enumeration: sample program(2) Indek dari enum tidak selalu mulai dari 0; bisa dimulai dari indeks tertentu seperti di contoh dibawah ini #include <stdio.h> #include <conio2.h> #include <string.h> enum jeniskelamin {pria = 10,wanita = 20}; /* indeks pria = 10, wanita = 20; */ int main() { char nama[25]; enum jeniskelamin gender; // definisi variabel gender dengan tipe data jenis kelamin strcpy(nama,"TASYA"); gender = wanita; printf( "Nama : %s \n",nama); printf( "Jenis Kelamin : %d", gender); getch(); return 0; }
References : Thompson SN, 2009, Algoritma dan Struktur Data dengan C. Deitel, PJ, HM.Deitel, 2007, C How to Program, 5th Edition.