Struct
Tim ALPRO
Overview
• STRUCTURE
• TYPEDEF
• ARRAY OF STRUCTURE
• POINTER & STUCTURES
• STRUCTURE & FUNCTION
3
Struktur
• Kumpulan variabel yang berelasi di bawah satu
nama besar /
aggregate
dan sering digunakan
untuk mendefinisikan object – orang, tempat /
record dalam database / file
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
Lunchbox
Definisikan struktur dg nama
“
Lunchbox
” yg mempunyai
bagian/compartments:
•
fruit
compartment (jumlah)
•
sandwich
compartment (jenis)
•
drink
compartment (liter)
• Struktur adalah sebuah
blueprint
7
Contoh Definisi Struktur
• Anggota yg ditentukan terdiri dari variabel yang
berbeda dari struct
• Contoh:
struct LunchBox
{
int fruit;
float drink;
char sandwich[MAXN];
};
LunchboxDeklarasi 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;
9
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];
Inisialisasi variabel struct
11
struct LunchBox kids[5] =
{
{1, 370.0, “ham” },
{2, 100.0, “roast”},
{0, 0.0, “muffin”},
{1, 300.0, “salad”},
{0, 0.0, “”}
};
0
1
2
3
4
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;
13
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;
Anggota variabel struct
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;
0
1
2
15
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);
Input/Output dr struct
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);
0
1
2
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;
19
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”);
}
Catatan struct
struct StudentRec
{
char lastname[MAXLEN];
float Nilai;
} studA, studB, class[MAXN];
• Kita dapat mendefinisikan struct, dan
mendeklarasikan instan utk struktur tsb
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;
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
Definisi structure Nama alias typedef
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 Constructor : untuk membentuk struct
• Fungsi Selector : untuk mendapatkan nilai elemen/nilai tertentu dari struct • Fungsi Validator : untuk memvalidasi komponen struct
• Fungsi 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);
Fungsi Operator Structure
void print_time(time waktu){ printf("%d:%d:%d\n",
waktu.j, waktu.m, 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))
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); } }
int time_to_seconds(time waktu){ return (waktu.j * 3600) +
(waktu.m * 60) + waktu.d; }
int get_minutes(time waktu){ return waktu.m;
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
• Contoh :
typedef struct pekerja{
int id;
char nama[20];
}emp;
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);
29
Function yg mengembalikan
suatu struct
• “paket” yg berisi beberapa nilai
main()
{
Student studentA;
studentA =
readRecord()
;
}
Student
readRecord ( void )
{
Student newStudent;
printf("Masukan nama dan nilai ");
scanf("%s %f",
newStudent.lastname,&(newStudent.Nilai)
);
return newStudent;
Function yg mengembalikan
suatu struct
Student readRecord
( Student newStudent )
{
printf("Masukan nama dan nilai ");
scanf("%s %f",
newStudent.lastname,&(newStudent.Nilai)
);
return newStudent;
}
main() { Student studentA; studentA =readRecord(studentA);
}Version 2
Pointer & Structure
• Sama seperti fungsi pointer umumnya,
penggunaan pointer pada structure digunakan
untuk mengakses alamat yang ada pada
structure
• Pointer pdata menyimpan alamat dari jumlah
hitung jumlah={10,20,30};
pdata = &jumlah;
int main() { Student studentA; studentA = readRecord(studentA); return 0; }
Student readRecord ( Student newStudent ) {
printf("Masukan nama dan nilai: "); scanf("%s %f", newStudent.lastname, &(newStudent.Nilai) ); return newStudent;
}
Mengirim variabel struct
Mengirim seluruh elemen struct
33
Bagaimana
jika struct
besar ?
Mengirim variabel 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; }
Mengirim pointer struct
Mengirim pointer
ke variabel struct !
lastname: Nilai: studentA:
studentPtr:
35
void readRecord ( Student *studentPtr ) {
/* De-reference pointer disini. */
} int main() { Student studentA; readRecord( &(studentA) ); return 0; }
Mengirim pointer struct
lastname:
Nilai: studentA:
studentPtr: lastname:
utk de-reference pointer ke
struct variable:
Style 1:
Pakai operator
*
void readRecord ( Student *studentPtr ) {
printf("Masukan nama dan nilai: ");
scanf("%s %f",
(*
studentPtr)
.lastname,
&
((*
studentPtr)
.Nilai) );}
Nilais4b.c
Mengirim pointer struct
studentPtr:
Nilai: studentA: lastname:
37
utk de-reference pointer ke struct
variable:
Style 2:
Pakai operator
->
void readRecord ( Student *studentPtr ) {
printf("Masukan nama dan nilai: ");
scanf("%s %f", studentPtr
->
lastname,
&
(studentPtr->
Nilai) ); }Nilais4c.c
Mengirim pointer struct
studentPtr:
Nilai: studentA: lastname:
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
39
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)
Contoh: Student Record
lastname: Nilai:struct StudentRec
{
char lastname[MAXLEN];
float Nilai;
};
41
class
:
lastname: Nilai: lastname: Nilai: lastname: Nilai:Student class[MAXN];
struct StudentRec
{
char lastname[MAXLEN];
float Nilai;
};
typedef struct StudentRec
Student
;Informasi yg diperlukan utk mengelola
daftar kelas:
• Jumlah students dalam kelas
(<= MAXN)
• Subject code
class:
lastname: Nilai: lastname: Nilai: lastname: Nilai:Student class[MAXN];
43
Informasi yg diperlukan utk
mengelola daftar kelas:
• Jumlah students dalam kelas
(<= MAXN)
• Subject code
char subjCode[MAXLEN];
int count;
Student class[MAXN];
count
:class
: lastname: Nilai: lastname: Nilai: lastname: Nilai:subjCode
:struct ClassRec
{
char subjCode[MAXLEN];
int count;
Student class[MAXN];
};
typedef struct ClassRec
ClassList;
Contoh: Class Record (lanj)
count: class: lastname: Nilai: lastname: Nilai: lastname: Nilai: subjCode:
“Encapsulates” data
yg diperlukan utk
mengelola daftar
kelas
45
ClassList subject[MAXSUBJ];
Contoh: Department Database
subject
:
char deptName[MAXLEN];
int count;
ClassList subject[MAXSUBJ];
Contoh: Department Database
(lanj)
subject:
deptName
:count
:47
Contoh: Department Database
(lanj)
subject: deptName: count: struct DatabaseRec { char deptName[MAXLEN]; int count; ClassList subject[MAXSUBJ]; };typedef struct DatabaseRec Database;
“Encapsulates” data
yg diperlukan utk
mengelola daftar
kelas
Mengakses anggota struct
subject: deptName: count:Bagaiman
memasukan
nilai 97.5
disana?
Database
finalNilais;
Misal kita deklarasikan
var struct :
49
Mengakses anggota struct
finalNilais
subject: deptName: count:finalNilais:
Mengakses anggota struct
finalNilais.
subject[1]
subject: deptName: count:finalNilais:
51
Mengakses anggota struct
finalNilais.
subject[1].
list[0]
subject: deptName: count:
finalNilais:
Mengakses anggota struct
finalNilais.
subject[1].
list[0]
.Nilai
= 97.5;
subject: deptName: count: