Algoritma dan Struktur Data

Post on 12-Jan-2016

50 views 0 download

description

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. Tambahkan & sebelum variabel x. - PowerPoint PPT Presentation

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!