Fungsi (2) Dr. Anto Satriyo Nugroho, M.Eng Web:
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 float konversikeUSD(float rupiah) { float c; c=0.0001; /* 1 USD = 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 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 void naik(void) { static int statX; statX++; printf("Nilai statX dalam fungsi naik : %d\n",statX); } main() { int statX = 100; 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 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 1020 bil1 bil bil1 bil2 SWAP
Contoh 5-A SWAP (cara yang salah) #include 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 caraprint(“%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 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 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 Contohint 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 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); }
#include 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); } Mengirimkan array 2 DIMENSI