Struct
Tim ALPRO Teknik Informatika
Overview • • • • •
STRUCTURE TYPEDEF ARRAY OF STRUCTURE POINTER & STUCTURES STRUCTURE & FUNCTION
Struktur • Kumpulan variabel yang berelasi di bawah satu nama besar /aggregate dan sering digunakan untuk mendefinisikan object – orang, tempat /
record dalam database / file
• Dapat berisi berbagai macam tipe variabel.
3
Cara Menggunakan Struktur 1. Definisi Struktur 2. Deklarasi/Inisialisasi instan Struktur 3. Mengakses Anggota dari instan Struktur
Mendefinisikan Struktur • Proses awal dalam membuat structure adalah mendefinisikannya menggunakan struct • Keyword struct digunakan untuk mendefinisikan koleksi variable dari bermacam type yang disebut structure • Dalam penulisan program, keyword struct diikuti oleh brace (“{ }”) dengan variable individual didalamnya (member) struct hitung{ int x,y; };
Latihan Definisi Struktur • Struktur adalah sebuah blueprint • Contoh:
Lunchbox
Definisikan struktur dg nama “Lunchbox” yg mempunyai bagian/compartments: • fruit compartment (jumlah) • sandwich compartment (jenis) • drink compartment (liter)
6
Contoh Definisi Struktur • Anggota yg ditentukan terdiri dari variabel yang berbeda dari struct • Contoh:
Lunchbox
struct LunchBox { int fruit; float drink; char sandwich[MAXN]; }; 7
Deklarasi Variabel Struktur • Ketika mendefinisikan structure menggunakan struct, memory belum dialokasikan untuk structure, sampai deklarasi variable dibuat • Contoh : struct hitung{ int x,y; }; struct hitung Jumlah; Variable Jumlah dengan type data hitung
Variabel Struktur • Instan Struktur: urutan actual yg berdekatan dalam penyimpanan di lokasi memori
struct LunchBox kyle; struct LunchBox stan, cartman, kenny; struct LunchBox kids[5]; 9
Inisialisasi variabel struct
struct LunchBox kyle = { 1, 370.0, “ham”};
10
Inisialisasi variabel struct 0
1
2
3
struct LunchBox kids[5] = { {1, 370.0, “ham” }, {2, 100.0, “roast”}, {0, 0.0, “muffin”}, {1, 300.0, “salad”}, {0, 0.0, “”} };
4
11
Mengakses Struktur Member • Akses pada member memudahkan dalam inisialisasi nilai • Prosedurnya adalah nama variable diikuti oleh operator dot ( . ) dan nama member • Contoh : struct hitung{ int x; int y; }; struct hitung Jumlah; Jumlah.x=10; Jumlah.y=20;
Anggota variabel struct struct LunchBox stan, kenny; stan.drink = 0.0; stan.fruit = 0; strcpy(stan.sandwich,“fruit cake”); kenny.fruit = 1; strcpy(kenny.sandwich, “muffin”); kenny.drink = 300.0;
13
Anggota variabel struct
0
1
struct LunchBox kids[3]; int index = 1; kids[0].drink = 370.0; kids[0].fruit = 1; strcpy(kids[2].sandwich, “ham”); kids[index].fruit = 2;
2 14
Input/Output struct • Library functions printf() dan scanf() tidak memiliki format conversion specifiers untuk struct • Input/Output hanya untuk anggota saja struct LunchBox cartman; scanf(“%d”, &(cartman.fruit)); scanf(“%f”, &(cartman.drink)); scanf(“%s”, cartman.sandwich);
printf(“%d, %f\n”, cartman.fruit, cartman.drink); printf(“%s\n”, cartman.sandwich); 15
Input/Output dr struct 0
1
2
struct LunchBox kids[3]; int i = 0; for (i=0; i < 3; i++) { scanf(“%d %f %s”, &(kids[i].fruit),&(kids[i].drink), kids[i].sandwich); } for (i=0; i < 3; i++) { printf(“%d, %f, %s\n”, kids[i].fruit, kids[i].drink, kids[i].sandwich); } 16
Catatan Struct • Kesalahan Umum struct hitung{ int x,y; };
Semicolon disini jangan lupa
Catatan struct • Inisialisasi vs. Assignment struct StudentRec studA = {“Fermat”, 90}; struct StudentRec studA; studA = {“Fermat”, 90};
18
Catatan struct • Var struct tidak dapat di bandingkan • Kita hanya dapat membandingkan anggotanya saja if (studA == studB) { printf(“Duplikasi data.\n”); } if (strcmp(studA.lastname, studB.lastname) == 0 && (studA.Nilai == studB.Nilai) ) { printf(“Duplikasi data.\n”); } 19
Catatan struct • Kita dapat mendefinisikan struct, dan mendeklarasikan instan utk struktur tsb struct StudentRec { char lastname[MAXLEN]; float Nilai; } studA, studB, class[MAXN];
Instan
20
Typedef • Statement typedef membuat identifer sama dengan tipe yg ditentukan • Dalam deklarasi variable dari sebuah structure, harus menyertakan keyword struct. • Typedef merupakan alternative dalam deklarasi variable tanpa harus menyertakan struct struct hitung{ int x,y; }; struct hitung Jumlah; struct hitung Kali;
struct hitung{ int x,y; }; typedef struct hitung operasi; operasi Jumlah; operasi Kali;
Prosedur Penggunaan Typedef • Letakkan typedef pada awal definisi structure • Pada akhir definisi structure, letakkan nama alias untuk melengkapi pendefinisian menggunakan typedef typedef struct hitung operasi typedef
Definisi structure Nama alias
type data operasi
Fungsi Operator Structure • Setelah mendeklarasikan sebuah Structure, yang tidak kalah pentingnya adalah membuat fungsi operator (fungsi untuk mengoperasikan struct). • Fungsi operator bisa dikategorikan menjadi 4 macam: • • • •
•
Fungsi Fungsi Fungsi Fungsi
Constructor : untuk membentuk struct Selector : untuk mendapatkan nilai elemen/nilai tertentu dari struct Validator : untuk memvalidasi komponen struct Manipulator : untuk melakukan operasi-operasi tambahan pada struct
Contoh: time make_time(int j, int m, int d); int get_minutes(time waktu);
int time_valid(time waktu); time add_time(time waktu1, time waktu2);
Fungsi Operator Structure time make_time(int j,int m,int d) { time waktu; waktu.j = j; waktu.m = m; waktu.d = d; if(time_valid(waktu)){ return waktu; } else { return make_time(0, 0, 0); } }
void print_time(time waktu){ printf("%d:%d:%d\n", waktu.j, waktu.m, waktu.d); } int get_minutes(time waktu){ return waktu.m; }
int time_to_seconds(time waktu){ return (waktu.j * 3600) + (waktu.m * 60) + waktu.d; }
int time_valid(time waktu){ return ((waktu.j < 24) && waktu.j > 0) && (waktu.m < 60) && waktu.m > 0) && (waktu.d < 60) && waktu.d > 0)) }
Array of Structure • Proses pembuatan dan kerja array of structure prinsipnya sama dengan kerja array yang didalamnya terdapat tipe data seperti integer, character, float • Proses pembuatan array of structure menentukan jumlah elemen array yang diletakkan setelah definisi structure typedef struct pekerja{ • Contoh : int id; char nama[20];
}emp; emp data[2];
Contoh typedef struct pekerja{ int id; char nama[20]; }emp; main(){ emp data[2]; strcpy(data[0].nama, “Maxidena”); data.id = 0001; strcpy(data[1].nama, “Rhyne”); data.id = 0002; int x; for(x=0;x<3;x++){ printf(“%d %c”, data[x].id,data[x].nama); } }
Structure & Functions • Melewatkan sebuah struktur untuk menjadi parameter sebuah fungsi dapat dilakukan sama dengan pengiriman parameter berupa variabel biasa. • Pengiriman dapat dilakukan baik secara nilai (pass by value) maupun secara acuan (pass by reference).
Mengirim struct ke Function • Seperti biasa, parameter formal di copy ke aktual parameter void printRecord ( Student item ) { printf("Nama: %s\n", item.lastname); printf(“Nilai: %.1f\n\n", item.Nilai); }
main() { Student studentA = {“Gauss”, 99.0}; printRecord(studentA); } 28
Function yg mengembalikan suatu struct • “paket” yg berisi beberapa nilai Student readRecord ( void ) { Student newStudent; printf("Masukan nama dan nilai "); scanf("%s %f", newStudent.lastname,&(newStudent.Nilai)); return newStudent; }
Version 1
main() { Student studentA; studentA = readRecord(); } 29
Function yg mengembalikan suatu struct • “paket” yg berisi beberapa nilai Student readRecord ( Student newStudent ) { printf("Masukan nama dan nilai "); scanf("%s %f", newStudent.lastname,&(newStudent.Nilai)); return newStudent; }
Version 2
main() { Student studentA; studentA = readRecord(studentA); } 30
Pointer & Structure • Sama seperti fungsi pointer umumnya, penggunaan pointer pada structure digunakan untuk mengakses alamat yang ada pada structure hitung jumlah={10,20,30}; pdata = &jumlah;
• Pointer pdata menyimpan alamat dari jumlah
Mengirim variabel struct Mengirim seluruh elemen struct
Student readRecord ( Student newStudent ) { printf("Masukan nama dan nilai: "); scanf("%s %f", newStudent.lastname, &(newStudent.Nilai) ); return newStudent; }
int main() { Student studentA; studentA = readRecord(studentA); return 0; }
32
Mengirim variabel struct Bagaimana jika struct besar ?
Student readRecord ( Student newStudent ) { printf("Masukan nama dan nilai: "); scanf("%s %f", newStudent.lastname, &(newStudent.Nilai) ); return newStudent; }
int main() { Student studentA; studentA = readRecord(StudentA); return 0; }
33
Mengirim pointer struct Mengirim pointer ke variabel struct !
studentPtr:
studentA: lastname: Nilai:
34
Mengirim pointer struct studentPtr: void readRecord ( Student *studentPtr ) { /* De-reference pointer disini. */ } int main() { Student studentA; readRecord( &(studentA) ); return 0; }
studentA: lastname: lastname: Nilai:
35
Mengirim pointer struct studentPtr:
studentA: lastname:
utk de-reference pointer ke struct variable: Style 1: Pakai operator *
Nilai:
void readRecord ( Student *studentPtr ) { printf("Masukan nama dan nilai: "); scanf("%s %f", (*studentPtr).lastname,
&((*studentPtr).Nilai)
);
}
Nilais4b.c
36
Mengirim pointer struct studentPtr:
studentA: lastname:
utk de-reference pointer ke struct variable: Style 2: Pakai operator ->
Nilai:
void readRecord ( Student *studentPtr ) { printf("Masukan nama dan nilai: "); scanf("%s %f", studentPtr->lastname,
&(studentPtr->Nilai)
);
}
Nilais4c.c
37
Contoh typedef struct pekerja{ int id; char nama[20]; }emp; main(){ emp data={0,0}; emp *pdata; //create a pointer of structure type pdata=&data; //assign address to pointer of structure type strcpy(pdata->nama, “Maxidena”); pdata->id = 0001; printf(“%d %s”, pdata->id,pdata->nama) }
Operator -> digunakan untuk mengakses member dalam structure
Structs Dalam Structs • Struct dapat menjadi anggota struct lainnya • Contoh: – Student record berisi Nama, Nilai (ID Number, alamat dll) – Daftar Class adalah kumpulan record student (jumlah students, subject code, dll) – Departmental database adalah kumpulan daftar kelas (department name, jumlah subjects, dsb) 39
Contoh: Student Record struct StudentRec { char lastname[MAXLEN]; float Nilai; };
lastname: Nilai:
typedef struct StudentRec Student;
40
Contoh: Class Record struct StudentRec { char lastname[MAXLEN]; float Nilai; }; typedef struct StudentRec Student;
class:
lastname:
Nilai:
lastname: Nilai:
Student class[MAXN]; lastname: Nilai:
41
Contoh: Class Record (lanj) Informasi yg diperlukan utk mengelola daftar kelas: • Jumlah students dalam kelas (<= MAXN) • Subject code
class:
lastname:
Nilai:
lastname: Nilai:
Student class[MAXN]; lastname: Nilai:
42
Contoh: Class Record (lanj) Informasi yg diperlukan utk mengelola daftar kelas: • Jumlah students dalam kelas (<= MAXN) • Subject code
subjCode: count: class:
lastname:
Nilai:
lastname:
char subjCode[MAXLEN]; int count; Student class[MAXN];
Nilai:
lastname: Nilai:
43
Contoh: Class Record (lanj) “Encapsulates” data yg diperlukan utk mengelola daftar kelas struct ClassRec { char subjCode[MAXLEN]; int count; Student class[MAXN]; }; typedef struct ClassRec ClassList;
subjCode: count: class:
lastname: Nilai:
lastname:
Nilai:
lastname: Nilai:
44
Contoh: Department Database subject:
ClassList subject[MAXSUBJ]; 45
Contoh: Department Database (lanj) subject: deptName:
count:
char deptName[MAXLEN]; int count; ClassList subject[MAXSUBJ]; 46
Contoh: Department Database (lanj) subject:
deptName: count:
struct DatabaseRec { char deptName[MAXLEN]; int count; ClassList subject[MAXSUBJ]; };
“Encapsulates” data yg diperlukan utk mengelola daftar kelas
typedef struct DatabaseRec Database;
47
Mengakses anggota struct subject:
deptName: count:
Misal kita deklarasikan var struct : Database finalNilais;
Bagaiman memasukan nilai 97.5 disana? 48
Mengakses anggota struct finalNilais: subject:
deptName: count:
finalNilais
49
Mengakses anggota struct finalNilais: subject:
deptName: count:
finalNilais.subject[1]
50
Mengakses anggota struct finalNilais: subject:
deptName: count:
finalNilais.subject[1].list[0]
51
Mengakses anggota struct finalNilais: subject:
deptName: count:
finalNilais.subject[1].list[0].Nilai = 97.5;
52
Terimakasih