210 likes | 392 Views
Fungsi (2). Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/dp.html. Jenis Variable. Variabel Lokal Variabel Eksternal/Global Variabel statis Variabel register. Variabel Lokal. Dideklarasikan dalam suatu fungsi
E N D
Fungsi (2) Dr. Anto Satriyo Nugroho, M.Eng Email: asnugroho@gmail.com Web: http://asnugroho.net/lecture/dp.html
Jenis Variable • Variabel Lokal • Variabel Eksternal/Global • Variabel statis • Variabel register
Variabel Lokal • Dideklarasikan dalam suatu fungsi • Dibentuk ketika fungsi itu dipanggil, dan hilang ketika fungsi selesai dieksekusi • Hanya dikenal oleh fungsi tempat variabel itu dideklarasikan • Tidak ada inisialisasi secara otomatis
Contoh 1 #include <stdio.h> float konversikeUSD(float rupiah) { float c; c=0.0001; /* 1 USD = 10000 rupiah */ return (rupiah*c); } main() { float x; printf(“Masukkan nilai mata uang dalam rupiah: “); scanf(“%f”,&x); printf(“Nilai matauang dalam USD: %f\n",konversikeUSD(x)); } c adalah variabel lokal fungsi konversikeUSD
Variabel Eksternal • Dideklarasikan di luar fungsi • Dapat diakses semua fungsi • Apabila tidak diberi nilai awal, maka akan diinisialisasi dengan nilai nol • Contoh: lihat program 5.4 • Resiko memakai variabel eksternal • Semakin besar program, semakin besar resiko terjadinya error • Sulit melacak kesalahan • Data tidak terjaga dengan baik, karena setiap fungsi dapat mengubah isi variabel eksternal tanpa sepengetahuan fungsi yang lain • Biasakan tidak menggunakan variabel eksternal, melainkan memakai parameter untuk melakukan pengiriman data dari satu fungsi ke fungsi yang lain
Contoh 2 (program 5.4) • #include <stdio.h> • int gNilai=98; • void inkremen(void) • { • gNilai= gNilai*1.05; • } • main() • { • printf("Nilai awal : %d\n",gNilai); • gNilai = gNilai +2; • printf("Nilai sekarang: %d\n",gNilai); • inkremen(); • printf("Nilai sekarang: %d\n",gNilai); • } gNilai adalah variabel eksternal
Variabel Statis • Bisa merupakan variabel lokal maupun global • Jika variabel statis bersifat lokal, hanya dikenal oleh fungsi tempat variabel itu dideklarasikan. Jika variabel statis bersifat global, maka dapat diakses oleh seluruh fungsi • Perbedaan dengan variabel lokal: nilai variabel statis tidak akan hilang setelah keluar dari fungsi. • Inisialisasi hanya dilakukan sekali, pada saat fungsi itu dipanggil. Jika tidak ada inisialisasi, maka variabel statis itu akan diberi nilai nol
Contoh 3 (program 5.5) • #include <stdio.h> • void naik(void) • { • static int statX; • statX++; • printf("Nilai statX dalam fungsi naik : %d\n",statX); • } • main() • { • int statX = 100; • naik(); • naik(); • printf("Nilai statX dalam fungsi main : %d\n",statX); • }
Variabel Register • Variabel yang disimpan dalam register, bukan dalam RAM (Random Access Memory). • Biasanya digunakan untuk variabel yang berfungsi sebagai pengendali loop. • Variabel yang diletakkan di register akan mempunyai kecepatan jauh lebih tinggi daripada variabel yang diletakkan di RAM.
Cara pengiriman parameter/argumen • Call by value • Call by reference
Call by Value • Yang dikirimkan ke fungsi lain adalah NILAI parameter • Nilai parameter aktual akan disalin ke parameter formal. Sehingga kalau pun nilai parameter formal berubah, maka nilai parameter aktual tidak akan berubah.
Contoh 4 (Program 5.7) #include <stdio.h> int jumlahganda(int n1,int n2) { int n3; n3= 2 * (n1+n2); return n3; } main() { int bil1, bil2, bil3; printf(“Bilangan ke-1: “); scanf(“%d”,&bil1); printf(“Bilangan ke-2: “); scanf(“%d”,&bil2); bil3=jumlahganda(bil1,bil2); printf(“Jumlah ganda= %d\n",bil3); } Isi parameter “bil1” disalin ke “n1”, Isi parameter “bil2” disalin ke “n2”. Walau di dalam fungsi jumlahganda, nilai n1 dan n2 diotak-atik sekalipun, nilai “bil1” dan “bil2” pada fungsi main tidak akan terpengaruh !
Contoh 5 SWAP bil1 bil2 10 20 SWAP bil1 bil2 20 10
Contoh 5-A SWAP (cara yang salah) #include <stdio.h> void dataswap(int n1,int n2) { int dummy; dummy=n1; n1=n2; n2=dummy; } main() { int bil1, bil2; printf(“Bilangan ke-1: “); scanf(“%d”,&bil1); printf(“Bilangan ke-2: “); scanf(“%d”,&bil2); dataswap(bil1,bil2); printf(“bil1= %d bil2=%d\n",bil1,bil2); } MENGAPA TIDAK BERHASIL ?
Mengapa GAGAL ? • Call by value : • Isi bil1 disalin ke n1 • Isi bil2 disalin ke n2 • di fungsi dataswap, isi nilai n1 dan n2 ditukarkan, tetapi tidak akan berpengaruh pada isi bil1 dan bil2 • Karena itu, waktu isi bil1 dan bil2 diprint, tidak terlihat ada perubahan • Harus memakai CALL BY REFERENCE
Call by Reference • Yang diserahterimakan bukan nilai parameter, melainkan ADDRESS mereka • Pakailah Call by Reference kalau anda ingin mengubah ISI dari parameter yang dikirimkan ke sebuah fungsi • INGAT : OPERATOR & dan * int x; nilai dari parameter x dapat diakses dengan x, ditampilkan dengan cara print(“%d”,x); ADDRESS dari x dapat diakses dengan &x int *y; nilai dari parameter dapat diakses dengan *y ADDRESS dari data tsb. dapat diakses dengan y
Contoh 5-B SWAP (cara yang benar) #include <stdio.h> void dataswap(int *n1,int *n2) { int dummy; dummy=*n1; *n1=*n2; *n2=dummy; } main() { int bil1, bil2; printf(“Bilangan ke-1: “); scanf(“%d”,&bil1); printf(“Bilangan ke-2: “); scanf(“%d”,&bil2); dataswap(&bil1,&bil2); printf(“bil1= %d bil2=%d\n",bil1,bil2); } MENGAPA TIDAK BERHASIL ?
Contoh 6 #include <stdio.h> void jumlahkali(int a,int b,int *c, int *d) { *c = a+b; *d = a*b; } main() { int x, y,jumlah,kali; printf("x: "); scanf("%d",&x); printf("y: "); scanf("%d",&y); jumlahkali(x,y,&jumlah,&kali); printf("%d+%d=%d %d*%d=%d\n",x,y,jumlah,x,y,kali); }
Call by Reference & mengirimkan array • Mengirimkan array ke suatu fungsi untuk diolah, umumnya memakai teknik Call by Reference • Yang diserahkan ke fungsi adalah address elemen pertama sebuah array • Contoh int x[5]; address yang dikirimkan adalah 1001 dengan cara x &x[0] x[0] 1001 x[1] 1002 x[2] 1003 x[3] 1004 x[4] 1005
Mengirimkan array 1 DIMENSI #include <stdio.h> int arraysum(int y[],int m) { int i,jumlah; jumlah=0; for(i=0;i<m;i++) jumlah = jumlah + y[i]; return jumlah; } main() { int x[5]={1,2,3,4,5}; int sum; sum=arraysum(x,5); printf("sum : %d\n",sum); }
Mengirimkan array 2 DIMENSI #include <stdio.h> void matrix_jumlah(int x[2][3],int y[2][3],int row,int column) { int i,j; for (j=0;j<row;j++) { for(i=0;i<column;i++) { printf(“%d ”,x[j][i]+y[j][i]); } printf(“\n”); } } main() { int ma[2][3]= { {1, 2, 3}, {4, 5, 6} }; int mb[2][3]= { {6, 3, 4}, {5, 1, 2} }; matrix_jumlah(ma,mb,2,3); }