410 likes | 607 Views
Jawaban PR-01. Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net. // Tugas pemrograman struktur data ke-01 #include <stdio.h> #include <stdlib.h> #define NUM_OF_STUDENT 10 // banyaknya siswa // structure definition struct NILAI {
E N D
Jawaban PR-01 Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net
// Tugas pemrograman struktur data ke-01 #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; // 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 Email: asnugroho@gmail.com Web: http://asnugroho.net
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 2-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-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);
p.133 #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)); } Latihan 2-3
Manajemen memory dinamismemakai 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) cast char *x; x=(char *) malloc(1000*sizeof(char)); proses komputasi free(x); alokasi 1000 byte char 1 byte … ① ② ③ ④ Ruang di memory sebesar 1000 byte→ x[1000]telah dialokasikan!
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) cast int *y; y=(int *) malloc(1000*sizeof(int)); proses komputasi free(y); alokasi 4000 byte int 4 byte … ① ② ③ Ruang di memory sebesar 4*1000=4000 byte→ y[1000]telah dialokasikan!
#include <stdio.h> #include <stdlib.h> 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); } Latihan 2-4 Untuk pemakaian malloc
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 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
STRUCT: pemakaian typedef Gabungan beberapa variable dengan tipe yang berbeda typedef struct { char nama[100]; float math; float biology; float geography; float english; float bi; float ratarata; } nilai_siswa; nilai_siswa 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) y=&x; address x ( &x)dimasukkan ke y Akses data dengan cara: x.a x.b y->a y->b (*y).a(*y).b struct CONTOH { int a; float b; } abcd; struct CONTOH x, *y; sama sama y->a adalah singkatan dari (*y).a
malloc STRUCT typedef struct { int x; int y; } abcd; void main(){ abcd *p; p=(abcd*)malloc(n*sizeof(abcd)); proses komputasi free(p); } pointer ke elemen pertama Space yang harus dialokasikan sebesar N x (banyaknya byte untuk type data abcd) Alokasi untuk p[n]
Pengecekan error untuk malloc STRUCT 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); } Kalau alokasi gagal, malloc akan mengembalikan NULL
Latihan Latihan 2-5 #include <stdio.h> #include <stdlib.h> #define NUM 5 struct DATAFISIK { float tinggi; float beratbadan; } ; void tampilkandata(struct DATAFISIKp[],int n) { int i; for(i=0;i<n;i++) printf("No.%2d tinggi: %4.1fberat: %4.1f \n",i,p[i].tinggi,p[i].beratbadan); }
Latihan 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(“\tberat badan : "); scanf("%f",&p[i].beratbadan); } tampilkandata(p,NUM); }
Latihan Latihan 2-6 • Ubahlah program pada slide sebelumnya, dengan memakai typedef • Ubahlah program pada slide sebelumnya, agar jumlah orang bisa ditentukan oleh user
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