Algoritma dan Struktur Data
description
Transcript of Algoritma dan Struktur Data
Algoritma dan Struktur Data
Pointer Pada Struct
REVIEW POINTER
Memori Komputer
• Komputer menyimpan variabel program di satu atau beberapa slot pada memori
• Tiap slot memori memiliki nomor atau alamat tertentu
Di slot memori nomer berapa sebuah variabel disimpan ?
#include <stdio.h>#include <conio.h>
void main(){
int x;
x = 10; printf("x berada di slot memori nomor : %d", &x); getch();}
Tambahkan &
sebelum variabel x
Eksekusi program
Pointer
• Nomor atau alamat slot memori di mana variabel disimpan dapat disimpan pada variabel lain
• Variabel tersebut dinamakan pointer
• Pointer tidak menyimpan isi variabel, tetapi menyimpan alamat / nomor slot di mana isi variabel berada
Pointer
• Pointer adalah variabel yang menyimpan alamat dari variabel yang lainnya.
• Deklarasi pointer : <type> *ptr_name;• Dua operator yang sering digunakan pada
pointer : * (content of) dan & (address of). • Contoh
Inisialisasi sebuah integer pointer ke data variable: int i, *ptr;ptr = &i;
Untuk merubah isi/nilai yg ditunjuk oleh pointer: *ptr = 5; /* sama artinya dgn i=5 */
8
Contoh
#include <stdio.h>#include <conio.h>
void main(){
int x; int *px;
x = 10; px = &x;
printf("x berada di slot memori nomor : %d", px); getch();}
Eksekusi program
Mengakses nilai variabel
• Nilai sebuah variabel bisa diakses melalui dua caraCara 1 : LangsungCara 2 : Menggunakan pointer
Contoh
#include <stdio.h>#include <conio.h>
void main(){
int x; int *px;
x = 10; px = &x;
printf("nilai x diakses secara langsung : %d\n", x); printf("nilai x diakses melalui pointer : %d", *px); getch();}
Eksekusi program
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
An Illustration
int i = 5, j = 10;
int *ptr; /* declare a pointer-to-integer variable */
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr; /* declare a pointer-to-pointer-to-integer variable */
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable
pptr int ** integer pointer pointer variable
Double Indirection
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i; /* store address-of i to ptr */
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable
*ptr int de-reference of ptr 5
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr; /* store address-of ptr to pptr */
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 5
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*pptr int * de-reference of pptr value of ptr
(address of i)
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 3
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 3
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 10
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of pptr
7
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 10
ptr int * integer pointer variable address of j
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr 10
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable 7
j int integer variable 9
ptr int * integer pointer variable address of j
pptr int ** integer pointer pointer variable address of ptr
**pptr int de-reference of de-reference of pptr
9
An Illustration
int i = 5, j = 10;
int *ptr;
int **pptr;
ptr = &i;
pptr = &ptr;
*ptr = 3;
**pptr = 7;
ptr = &j;
**pptr = 9;
*pptr = &i;
*ptr = -2;
Data Table
Name Type Description Value
i int integer variable -2
j int integer variable 9
ptr int * integer pointer variable address of i
pptr int ** integer pointer pointer variable address of ptr
*ptr int de-reference of ptr -2
• Pointer to pointer adalah variabel yang menyimpan alamat dari pointer yang lainnya.
• Deklarasi pointer : <type> **ptr_ptr ;
• Contoh int i, *ptr, **ptr_ptr ;ptr = &i;ptr_ptr = &ptr;
Untuk merubah nilai variabel i bisa melalui sbb: *ptr = 5; // sama artinya dgn i=5 ;**ptr_ptr = 9; //sama artinya dgn i=9; atau *ptr=9;
24
25
Operasi pada pointer
• Apa arti ptr + 1? Alamat slot sesudahnya!
• Apa arti ptr - 1? Alamat slot sebelumnya!
• Apa arti ptr * 2 and ptr / 2?Invalid operations!!!
Operasi pada pointer
• Apa arti *ptr + 1 ?
• Apa arti *ptr - 1 ?
• Apa arti *ptr * 2 and ptr / 2?
REVIEW
Pass by Value & Pass by Reference
Program tanpa fungsi1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <conio.h>
void main(){
float panjang, lebar, luas;
panjang = 10;
lebar = 20
luas = panjang * lebar;
printf ("Luas persegi = %f\n", luas );
getch();
}
Perhitungan luas diletakkan di bagian terpisah
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <conio.h>
void main(){
float panjang, lebar, luas;
panjang = 10;
lebar = 20
luas = hitungluas(panjang, lebar);
printf ("Luas persegi Anda = %f\n", luas );
getch();
}
Fungsi untuk menghitung luas
1
2
3
4
5
6
float hitungluas(float p, l){
float l;
l = p * l;
return(l);
}
Program menggunakan fungsi
1
2
3
4
5
6
7
8
9
10
11
12
13
void main(){
float panjang, lebar, luas;
…..
luas = hitungluas(panjang, lebar);
….
}
float hitungluas(float p, float l){
float lu;
lu = p * l;
return(l);
}
Latihan
• Variabel atau data untuk main dan hitungluas terletak di bagian memori berbeda
• Keduanya tidak berhubungan
• Gambarkan keadaan memori untuk main dan hitungluas!
Pass by Value
• Jika kita mengubah nilai variabel p di hitungluas, apakah variabel panjang di main nilainya berubah?
Pass by Value
1
2
3
4
5
6
7
float hitungluas(float p, l){
float lu;
lu = p * l;
p = p * 2;
return(lu);
}
Pass by Value• Pada saat main memanggil fungsi hitungluas, isi variabel panjang dan lebar dicopy kemudian
dikirim ke hitungluas• Di fungsi hitungluas, nilai tersebut dimasukkan ke variabel p dan l• Merubah nilai p dan l tidak berakibat apa-apa pada variabel panjang dan luas• Ingat, variabel main dan hitungluas terletak di bagian memori yang berbeda!
Pass by Reference
• Bagaimana cara mengubah nilai variabel panjang pada main dari fungsi hitungluas?
• Pada saat memanggil hitungluas, jangan mengirim nilai panjang• Kirim alamat variabel panjang ke hitung luas• Hitungluas dapat mengakses & mengubah isi variabel panjang
milik main secara indirect
Program menggunakan fungsi1
2
3
4
5
6
7
8
9
10
11
12
13
void main(){
float panjang, lebar, luas;
…..
luas = hitungluas(&panjang, lebar);
….
}
float hitungluas(float *p, float l){
float lu;
lu = (*p) * l;
*p = (*p) * 2;
return(l);
}
Pass by Reference• Variabel v ada di fungsi F• F memanggil fungsi G• G perlu mengubah nilai v di F
• Jangan mengirim nilai v ke G• Kirim alamat v• G dapat mengakses v di F secara indirect• G dapat mengubah nilai v di F
Latihan
• Buatlah fungsi untuk menukar isi dua variabel bertipe float!
Solusi1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <conio.h>
void tukar(float *x, float *y);
void main(){
float bil1, bil2;
bil1 = 10;
bil2 = 15;
printf ("Bilangan 1 = %f , bilangan 2 = %f\n", bil1, bil2 );
tukar(&bil1, &bil2);
printf ("Bilangan 1 = %f , bilangan 2 = %f\n", bil1, bil2 );
getch();
}
void tukar(float *x, float *y){
float temp;
temp = *x;
*x = *y;
*y = temp;
}
Using a Pass by Value • Is like giving someone the
key to your home
• The key can be used by the other person to change the contents of your home!
Additional Terms
• Pass-by-reference is also called . . . – pass-by-address, or– pass-by-location
Can you explain why?
• Contoh : Pengiriman parameter by location
44
#include <stdio.h>void Hitung (int X, int Y, int *P, int *Q) { *P = X + Y; *Q = X * Y; x=0; y=1; printf(“Dalam Fungsi Hitung nilai X: %d ,\n Nilai Y: %d”, X,Y);}
void main() { int X, Y, PA, QA; /*local variabel*/ printf(“ X=”); scanf(“%d”,&X); printf(“ Y=”); scanf(“%d”,&Y); Hitung(X,Y,&PA,&QA); printf(“Dalam Fungsi Main nilai X: %d ,\n Nilai Y: %d”, X,Y); printf(”Nilai PA= %d\n”, PA); printf(”Nilai QA= %d\n”, QA);}
User defined data type Berisi beberapa variabel yang bisa berbeda
tipenya masing-masing disebut elemen yang dikelompokkan menjadi satu dengan sebuah nama baru
Mirip representasi sebuah object beserta properties-nya.
Contoh: struct MHS setidaknya punya elemen untuk NPM, Nama dan Alamat.
46
Syntax:
struct nama_struct {
tipe_data_1 nama_var_1;
tipe_data_2 nama_var_2;
tipe_data_3 nama_var_3;
……
};
47
struct
• Penting untuk implementasi ADT / membuat tipe data baru
• E.g., struct motor {float volts; //voltage of the motor
float amps; //amperage of the motor
int phases; //# of phases of the motor
float rpm; //rotational speed of motor
};
typedef struct motor motor;
struct
• E.g., struct motor {float volts;float amps;int phases;float rpm;
};
typedef struct motor motor;
Name of the type
struct
• E.g., struct motor {float volts;float amps;int phases;float rpm;
};
typedef struct motor motor;
Members of the struct
struct
• Mendefinisikan tipe data baru• E.g.,
struct motor {float volts;float amps;int phases;float rpm;
};typedef struct motor motor;
Agar pada saat deklarasi
variabel cukup dengan
memanggil motor saja
Menggunakan tipe data baru
motor p, q, r;• Mendefinisikan tiga variable – p, q, dan r – masing
masing bertipe data motor
motor M[25];• Mendeklarasikan array M berisi 25 data bertipe
motor
motor *m;• Mendeklarasikan variabel pointer yang menyimpan
alamat slot memori yang berisi data bertipe motor
Mengakses anggota struct
• Deklarasi motor p;motor q[10];
• Makap.volts — is the voltagep.amps — is the amperagep.phases — is the number of phasesp.rpm — is the rotational speed
q[i].volts — is the voltage of the ith motorq[i].rpm — is the speed of the ith motor
Syntax:nama_var_struct . nama_var_elemen;
• Sebuah kondisi dimana di dalam sebuah struct terdapat tipe data berupa struct lagi.
54
• Contoh:
55
• Sebuah struct yang di dalamnya terdapat variable/ elemen yang bertipe array.
56
Contoh:struct data {
char kode [10];char nama [20];char alamat [30];………
}
• Sebuah array yang setiap data elemennya bertipe struct. Umumnya dipakai untuk menyimpan object data yang terstruktur, misal: data mahasiswa, karyawan, buku, barang, dsb.
57
58
Mengakses elemen struct menggunakan pointer
• Deklarasimotor *p;
• Maka(*p).volts — is the voltage of the motor pointed
to by p
(*p).phases — is the number of phases of the
motor pointed to by p
Mengapa memakai () ?
Mengakses elemen struct menggunakan pointer
• Notasi (*p).member kurang nyaman dipakai
• Cara yang lebih singkat– p->member, di mana p merupakan variabel
pointer
Contoh sebelumnya menjadi …
• Deklarasimotor *p;
• Makap -> volts — is the voltage of the motor pointed
to by p
p -> phases — is the number of phases of the
motor pointed to by p
contohstruct motor {
float volts;
float amps;
};
typedef struct motor motor;
void main()
{
motor m1;
motor *pm1;
m1.volts = 100;
m1.amps = 110;
pm1 = &m1;
printf("voltase motor m1 : %f\n", m1.volts);
printf("amps motor m1 : %f\n", m1.amps);
printf("voltase motor m1 : %f\n", pm1->volts);
printf("amps motor m1 : %f", pm1->amps);
getch();
}
Hasil eksekusi program
Operasi pada struct
• Copy/assignstruct motor p, q;p = q;
• Get addressstruct motor p;struct motor *ss = &p;
• Access membersp.volts;s -> amps;
Example
struct item {char *s;struct item *next;
}• Sebuah item dapat berisi alamat item lain…• … yang dapat menunjuk item lain• … yang juga dapat menunjuk item yang lain lagi• … etc.
Dengan demikian membentuk rangkaian item!!!
Yes! This is
legal!