Jawaban PR-01

1 / 41

# Jawaban PR-01 - PowerPoint PPT Presentation

Jawaban PR-01. Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net. // Tugas pemrograman struktur data ke-01 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define NUM_OF_STUDENT 10 // banyaknya siswa // structure definition struct NILAI {

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about ' Jawaban PR-01' - anjolie-tate

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

### 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

};

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

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

memory

pt

1000

1000

123

aa

bb

pt = &aa = 1000

bb = *pt = isi address 1000 = 123

1001

1002

123

1003

1004

1002

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

memory

pt

1002

1000

123

aa

bb

pt = &bb = address bb = 1002

*pt = 999;

1001

1002

999

1003

1004

1002

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

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（１）

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;

} ;

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);

}

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);

}

tampilkandata(p,num);

}

Pakailah malloc untuk mengalokasikan memory

sebanyak num buah, dan masing-masing berukuran

sama dengan tipe data DATAFISIK

Bebaskan memory yang dialokasikan