Jawaban PR-01 Dr. Anto Satriyo Nugroho, M.Eng Web:
// Tugas pemrograman struktur data ke-01 #include #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; // selesaikan bagian ini 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; // selesaikan bagian ini 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; // selesaikan bagian ini 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 untuk tiap siswa 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 untuk tiap siswa fclose(fpi); fclose(fpo); return(0); }
Pemrograman dalam Bahasa C : POINTER & STRUCT Dr. Anto Satriyo Nugroho, M.Eng Web:
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 memory address char x; x =100; Akses ke address x dengan &x printf(“%p”,&x); Akses ke address x dengan &x printf(“%p”,&x);
Deklarasi Pointer Deklarasi pointer:tipe_data *nama_pointer; Contoh: int *ptr; char *ptr; Cara penulisan berikut diperbolehkan: int *ptr;
Inisialisasi Pointer Pointer bertugas menyimpan address, yang harus diset oleh programmer Cara inisialisasi 1.Substitusikan address sebuah variabel ke pointer dengan memakai address operator & int x; int *ptr; ptr = &x; 2.Mensubstitusikan address awal sebuah array ke pointer char t[5]; char*ptr; ptr = t;
Inisialisasi Pointer Cara inisialisasi (lanjutan) 3.Mensubstitusikan address salah satu elemen array dengan address operator char t[5]; char*ptr; ptr = &t[3]; 4.Mensubstitusikan address awal character string ke pointer char char*ptr; ptr = ”jakarta” 5.Mensubstitusikan NULL pada pointer. NULL ada pointer kosong, menunjukkan suatu status dimana pointer itu belum diinisialisasikan dengan sebuah address tertentu. 6.Memakai fungsi MALLOC
#include 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 2-1
#include 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-2
address memory aa bb pt = &aa = 1000 bb = *pt = isi address 1000 = pt
address memory aa bb pt = &aa = 1000 bb = *pt = isi address 1000 = pt printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); aa =123 *pt =123 bb=123
address memory aa bb pt = &bb = address bb = 1002 *pt = 999; 1002 pt
address memory aa bb pt = &bb = address bb = 1002 *pt = 999; printf(“aa=%d *pt= %d bb=%d \n“, aa, *pt, bb); aa =123 *pt =999 bb= pt
Akses Array dengan Pointer memory address char *p,x; x = 100; p = &x; *p = *(p+1) = *(p+2) = Akses ke address x dengan &x printf(“%p”,&x); Akses ke address x dengan &x printf(“%p”,&x);
#include 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)); } p.133 Latihan 2-3
Manajemen memory dinamis memakai fungsi malloc Cara alokasi memory yang telah dipelajari int a;hanya mengalokasikan sebuah int a[10]; hanya mengalokasikan 10 buah Setelah pemakaian selesai, memory yang dialokasikan tidak dapat dibebaskan Dua fungsi untuk mengatasi masalah tsb: malloc() dan free()
malloc Mampu mengalokasikan tempat di memory hanya pada saat dan pada jumlah yang diperlukan saja Saat dialokasikan, akan diperoleh array kosong Cara pemakaian: void *malloc(unsigned int size) argumen: banyaknya byte yang dialokasikan return value: pointer ke elemen pertama Contoh : alokasi 100 byte dengan pointer p menunjuk ke elemen pertama Jawab: int *p p = malloc(100); int hanya sekedar contoh. Boleh saja memakai float, char, dsb.
free Mampu membebaskan memory yang dialokasikan oleh fungsi malloc, sehingga bisa dipakai untuk tujuan lain Cara pemakaian: void free(void *nama_pointer) argumen: pointer ke memory yang ingin dibebaskan return value: tidak ada (void) Contoh : bebaskan memory yang dialokasikan dengan malloc, dan dimulai dari address yang ditunjukkan oleh pointer p Jawab: free(p);
Contoh pemakaian (1) char *x; x=(char *) malloc(1000*sizeof(char)); proses komputasi free(x); cast alokasi 1000 byte ①②③④ Ruang di memory sebesar 1000 byte→ x[1000]telah dialokasikan ! char 1 byte …
Operator cast dan sizeof Cast Operasi untuk mengubah tipe data float x; int y; y=(int) x; sizeof fungsi untuk menghitung ukuran tipe data pada argumen dalam satuan byte, dan hasilnya menjadi return value sizeof(int) = 4 sizeof(char) = 1
Contoh pemakaian ( 2 ) int *y; y=(int *) malloc(1000*sizeof(int)); proses komputasi free(y); cast alokasi 4000 byte Ruang di memory sebesar 4*1000=4000 byte→ y[1000]telah dialokasikan ! int 4 byte ①②③ …
#include int main(void) { int i; int x[5]; int *y; for(i=0;i<5;i++) x[i]=0; for(i=0;i<5;i++) { printf(“Masukkan %d ",i); scanf("%d",&x[i]); } for(i=0;i<5;i++) printf("%d %d\n",i,x[i]); y=(int *)malloc(5*sizeof(int)); printf(" \n"); for(i=0;i<5;i++) y[i]=x[i]; for(i=0;i<5;i++) printf("%d %d\n",i,y[i]); free(y); } Untuk pemakaian malloc Latihan 2-4
x[0]x[1]x[2]x[3]x[4] y[0]y[1]y[2]y[3]y[4]
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 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 nama Nilai math Nilai biology Nilai geography Nilai English Nilai Bhs.Indonesia Nilai rata-rata struct NILAI { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; }; struct NILAI p[10]; Deklarasi struct
STRUCT Gabungan beberapa variable dengan tipe yang berbeda 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 nama Nilai math Nilai biology Nilai geography Nilai English Nilai Bhs.Indonesia Nilai rata-rata struct NILAI { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; } p[10];
STRUCT: pemakaian typedef Gabungan beberapa variable dengan tipe yang berbeda 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 学籍番号 名前 生年月日 体重 身長 nama Nilai math Nilai biology Nilai geography Nilai English Nilai Bhs.Indonesia Nilai rata-rata typedef struct { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; } nilai_siswa; nilai_siswa p[10];
Cara akses ke elemen/field STRUCT Akses langsung ke variable dengan. (dot operator) Akses lewat pointer dengan -> (arrow operator) 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 y >a adalah singkatan dari ( y).a variabelPointer Deklarasiint a;int *a; Nilaia*a*a address&aa sama
typedef struct { int x; int y; } abcd; void main(){ abcd *p; p=(abcd*)malloc(n*sizeof(abcd)); proses komputasi free(p); } malloc STRUCT Space yang harus dialokasikan sebesar N x (banyaknya byte untuk type data abcd) pointer ke elemen pertama Alokasi untuk p[n]
typedef struct { int x; int y; } abcd; void main(){ abcd *p; p=(abcd*)malloc(n*sizeof(abcd)); if (p==NULL){ printf(“alokasi memory tidak berhasil\n”); exit(1); } proses komputasi free(p); } Pengecekan error untuk malloc STRUCT Kalau alokasi gagal, malloc akan mengembalikan NULL
#include #define NUM 5 struct DATAFISIK { float tinggi; float beratbadan; } ; void tampilkandata(struct DATAFISIK p[],int n) { int i; for(i=0;i<n;i++) printf("No.%2d tinggi: %4.1f berat: %4.1f \n",i,p[i].tinggi,p[i].beratbadan); } Latihan Latihan 2-5
int main(void) { int i; struct DATAFISIK p[NUM]; for(i=0;i<NUM;i++){ printf("No.%d\n",i); printf("\t tinggi : "); scanf("%f",&p[i].tinggi); printf(“\t berat badan : "); scanf("%f",&p[i].beratbadan); } tampilkandata(p,NUM); } Latihan
Ubahlah program pada slide sebelumnya, dengan memakai typedef Ubahlah program pada slide sebelumnya, agar jumlah orang bisa ditentukan oleh user Latihan Latihan 2-6
Hint ! int main(void) { int i, num; struct DATAFISIK *p; printf(“banyaknya data: "); scanf("%d",&num); for(i=0;i<num;i++){ printf("No.%d\n",i); printf("\ttinggi : "); scanf("%f",&p[i].tinggi); printf("\tberatbadan : "); scanf("%f",&p[i].beratbadan); } tampilkandata(p,num); } Pakailah malloc untuk mengalokasikan memory sebanyak num buah, dan masing-masing berukuran sama dengan tipe data DATAFISIK Bebaskan memory yang dialokasikan