300 likes | 489 Views
Array dan Pointer. Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html. Agenda. Memahami program BUBBLE-SORT Array & Pointer Structure. C Program untuk Bubble Sort. void bubble_sort(int x[ ], int datanum) { int i,j; int tmp;
E N D
Array dan Pointer Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/ds.html
Agenda • Memahami program BUBBLE-SORT • Array & Pointer • Structure
C Program untuk Bubble Sort void bubble_sort(int x[ ], int datanum) { int i,j; int tmp; for(i=0;i<datanum-1;i++) for(j=datanum-1;j>i;j--) if( x[j-1] < x[j]) { tmp=x[j]; x[j]=x[j-1]; x[j-1]=tmp; } }
#include <stdio.h> bubble_sort(int x[],int datanum) { int i,j; int tmp; for(i=0;i<datanum-1;i++) for(j=datanum-1;j>i;j--) if( x[j-1] < x[j]) { tmp=x[j]; x[j]=x[j-1]; x[j-1]=tmp; } } int main(void) { int i; int data[10]= {10,3,2,1,4,7,6,9,5,8}; bubble_sort(data,10); for(i=0;i<10;i++){ printf("%d %d\n",i,data[i]); } }
Pointer • Saat komputer melakukan suatu perhitungan atau operasi, data akan disimpan di suatu tempat pada memory • Address: informasi yang menunjukkan dimana data itu berada dalam memory • Pointer: variabel khusus untuk menyimpan address char x; x =100; 1000 100 157 1001 1002 200 Akses ke address x dengan &x printf(“%p”,&x); 1003 1004 1005 memory address
Deklarasi Pointer • Deklarasi pointer: tipe_data *nama_pointer; • Contoh: int *ptr; char *ptr; • Cara penulisan berikut diperbolehkan: int *ptr; int * ptr; int* ptr;
Inisialisasi Pointer • Pointer bertugas menyimpan address, yang harus diset oleh programmer • Cara inisialisasi • Substitusikan address sebuah variabel ke pointer dengan memakai address operator & int x; int *ptr; ptr = &x; • Mensubstitusikan address awal sebuah array ke pointer char t[5]; char *ptr; ptr = t;
Inisialisasi Pointer • Cara inisialisasi (lanjutan) • Mensubstitusikan address salah satu elemen array dengan address operator char t[5]; char *ptr; ptr = &t[3]; • Mensubstitusikan address awal character string ke pointer char char *ptr; ptr = ”jakarta” • Mensubstitusikan NULL pada pointer. NULL ada pointer kosong, menunjukkan suatu status dimana pointer itu belum diinisialisasikan dengan sebuah address tertentu. • Memakai fungsi MALLOC
#include <stdio.h> • int main(void) • { • int x; • int *y; • printf(“masukkan nilai untuk x \n"); • printf("x: "); • scanf("%d",&x); • printf("x: %d\n",x); • printf(“address x : %p\n",&x); • printf(“Address x dimasukkan ke y \n"); • y=&x; • printf(“y berisi address %p\n",y); • printf(“isi *y%d\n",*y); • } Latihan 1
#include <stdio.h> int main(void) { int aa,bb; int *pt; aa = 123; pt = &aa; bb = *pt; printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); pt = &bb; *pt = 999; printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); } Latihan 2
pt 1000 1000 123 aa bb pt = &aa = 1000 bb = *pt = isi address 1000 = 123 1001 1002 1003 1004 1002 address memory
pt 1000 1000 123 aa bb pt = &aa = 1000 bb = *pt = isi address 1000 = 123 1001 1002 123 1003 1004 1002 address memory printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); aa =123 *pt =123 bb=123
pt 1002 1000 123 aa bb pt = &bb = address bb = 1002 *pt = 999; 1001 1002 123 1003 1004 1002 address memory
pt 1002 1000 123 aa bb pt = &bb = address bb = 1002 *pt = 999; 1001 1002 999 1003 1004 1002 address memory printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); aa =123 *pt =999 bb=999
Akses Array dengan Pointer char *p,x; x = 100; p = &x; *p = *(p+1) = *(p+2) = 1000 100 157 1001 1002 200 1003 1004 1002 address memory Akses ke address x dengan &x printf(“%p”,&x);
Latihan 3 #include <stdio.h> int main(void) { int arr[10]={10,9,8,7,6,5,4,3,2,1}; int *ptr_arr; int i; for(i=0;i<10;i++) printf("%d\t%d\n",i,arr[i]); ptr_arr=arr; for(i=0;i<10;i++) printf("%d\t%d\t%d\t%d\t%d\n", i, ptr_arr[i], arr[i], *(ptr_arr+i), *(arr+i)); }
Array vs Struct • Array : penampung sejumlah data sejenis (yang memiliki type data yang sama) dengan menggunakan satu identifier • Elemen array dapat diakses dengan menggunakan index, dari nol sampai n-1 (n: jumlah elemen array) Contoh : int x[5]; printf(“%d”,x[3]);
Array vs Struct • Struct: struktur data yang menggabungkan beberapa data dengan tipe yang berbeda, tetapi berkaitan • Elemen struct dapat diakses dengan menggunakan dot operator dan arrow operator.
Struct Gabungan beberapa variable dengan tipe yang berbeda struct NILAI { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; }; struct NILAI p[10]; 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 nama Nilai math Nilai biology Nilai geography Nilai English Nilai Bhs.Indonesia Nilai rata-rata Deklarasi struct
Struct Gabungan beberapa variable dengan tipe yang berbeda struct NILAI { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; } p[10]; 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 nama Nilai math Nilai biology Nilai geography Nilai English Nilai Bhs.Indonesia Nilai rata-rata
Cara akses ke elemen/field struct Akses langsung ke variable dengan.(dot operator) Akses lewat pointer dengan ->(arrow operator) struct CONTOH { int a; float b; } abcd; struct CONTOH x, *y; y=&x; address x ( &x)dimasukkan ke y Akses data dengan cara: x.a x.b y->a y->b (*y).a(*y).b sama sama y->a adalah singkatan dari (*y).a
Contoh: Program Penghitung Rata-Rata • Selesaikan program penghitung rata-rata nilai matematika & biologi dari 10 anak • Output bukan pada layar, melainkan disimpan dalam file (ingat kembali File I/O) • Average: adalah fungsi menghitung rata-rata nilai tiap anak Source code: http://asnugroho.net/lecture/aldas2009/04-04.c File nilai: http://asnugroho.net/lecture/aldas2009/nilai.txt
Latihan 4 #include <stdio.h> #include <stdlib.h> #define NUM_OF_STUDENT 10 // banyaknya siswa // structure definition struct NILAI { char name[100]; // nama float math; // nilai math float biology; // nilai biology float average; // rata-rata nilai math & biology };
// Loading data void load_data(FILE *fp,struct NILAI x[]) { int i,j; // membaca data dari file baris per baris for(i=0;i<NUM_OF_STUDENT;i++) { if(fscanf(fp,"%s %f %f",&x[i].name,&x[i].math,&x[i].biology)!=3) { printf("banyaknya item tidak sesuai\n"); exit(1); } } }
// menghitung average nilai (nilai math+nilai biology)/2 void average(struct NILAI x[]) { int i; for(i=0;i<NUM_OF_STUDENT;i++) x[i].average= (x[i].math + x[i].biology)/2; }
// Sorting memakai bubble sort void bubble_sort(struct NILAI x[]) { int i,j; struct NILAI tmp; for(i=0;i<NUM_OF_STUDENT-1;i++) for(j=NUM_OF_STUDENT-1;j>i;j--) if( x[j-1].average < x[j].average) { tmp=x[j]; x[j]=x[j-1]; x[j-1]=tmp; } }
// Tampilkan nama, nilai math, nilai biology dan average untuk tiap siswa void print_result(FILE *fp,struct NILAI x[]) { int i; for(i=0;i<NUM_OF_STUDENT;i++) fprintf(fp,"%s\t%f\t%f\t%f\n",x[i].name,x[i].math,x[i].biology,x[i].average); }
// Main • int main() • { • FILE *fpi,*fpo; • char filename[100]; • struct NILAI p[NUM_OF_STUDENT]; • printf("nama file nilai: "); scanf("%s",filename); • if((fpi=fopen(filename,"r"))==NULL) { • printf("File %s tidak dapat dibuka \n",filename); • exit(1); • } • printf("nama file output:"); scanf("%s",filename); • if((fpo=fopen(filename,"w"))==NULL) { • printf("File %s tidak dapat dibuka \n",filename); • exit(1); • }
load_data(fpi,p); // membaca file data nilai • average(p); // menghitung nilai rata-rata • fprintf(fpo,"nilai tiap siswa (sebelum dilakukan sorting)\n"); • print_result(fpo,p); // menampilkan nama, nilai math, nilai biology dan average • fprintf(fpo,"\n\n"); // ganti baris 2 kali • bubble_sort(p); // sorting dilakukan berdasarkan rata-rata nilai tiap siswa • fprintf(fpo,"nilai tiap siswa (sesudah dilakukan sorting)\n"); • print_result(fpo,p); // menampilkan nama, nilai math, nilai biology dan average • fclose(fpi); • fclose(fpo); • return(0); • }