Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
MODUL VIII Prosedur Bagian 2 TUJUAN 1. Memahami konsep parameter secara lebih mendalam 2. Memahami konsep variable lokal 3. Memahami konsep passing parameter, by value dan by reference TEORI Prosedur yang Menghasilkan Efek Netto Prosedur yang direkomendasikan adalah prosedur yang menghasilkan efek netto (nett effect procedure). Prosedur nett effect adalah yang tidak menggunakan standard device untuk input dan outputnya, alias tidak ada printf dan scanf dalam prosedur tersebut. Satu-satunya prosedur yang masih bisa diterima, meskipun menggunakan standard device adalah prosedur CETAK, yaitu yang menggunakan printf untuk mencetak informasi ke layar. Parameter Parameter adalah variabel yang digunakan untuk mengirim nilai dari program pemanggil ke prosedur atau sebaliknya. Ada 2 tipe parameter yaitu : 1. Parameter Aktual Adalah parameter yang dipakai ketika melakukan pemanggilan terhadap prosedur. Tambah1(&C,D); Perlu diingat di sini, karena variabel A mendapat tambahan „*‟, maka didalam pemanggilan tersebut parameter actual harus didahului dengan „&‟ 2. Parameter Formal Adalah parameter yang dipakai dalam pendefinisian prosedur. Parameter ini sifatnya optional. void Tambah1(int *A, int B) { ...... } Perlu diingat di sini, karena parameter formal A mendapat tambahan „*‟, maka didalam prsedur tersebut variabel A harus ditulis seperti ini : (*A) Berdasarkan maksud penggunaannya, terdapat 3 jenis parameter formal, yaitu : 1. Parameter input adalah parameter yang nilainya berlaku sebagai masukkan untuk prosedur. Penggunaan parameter ini sering disebut sebagai passing parameter by value. Di dalam assignment di body prosedur, parameter ini biasanya di sebelah KANAN „sama dengan‟. Parameter ini harus sudah ada ISInya (sudah jelas) supaya dapat dipakai dalam prosedur. Value parameter input tidak berubah, dari sebelum masuk sampai sesudah keluar dari prosedur. 2. Parameter output adalah parameter yang menampung keluaran yang dihasilkan prosedur. Parameter ini mengalami perubahan dan efek netto dari prosedur. Di dalam assignment di body prosedur, parameter ini biasanya di sebelah KIRI „sama dengan‟. 3. Parameter input/output adalah parameter yang berfungsi sebagai masukkan sekaligus keluaran bagi prosedur tersebut. Penggunaan parameter ini sering disebut passing parameter by reference. Pemanggilan Karena prosedur bukan program yang dapat berdiri sendiri, maka prosedur harus dipanggil oleh program lain dengan ketentuan sebagai berikut : 1. Dilakukan dari program lain yang menyatakan prosedur sebagai bagian dari program tersebut. 2. Prosedur diakses dengan memanggil nama prosedur dari program pemanggil. 3. Prototipe prosedur harus dideklarasikan dalam kamus program pemanggil. Hal yang penting dalam pemanggilan prosedur adalah antara parameter formal dan aktual harus ada kesesuaian dalam hal function signature yaitu: 1. Jumlah parameter 2. Urutan parameter 3. Tipe data parameter Contoh: deklarasi prosedur void Tambah1(int *A, int B); definisi prosedur void Tambah1(int *A, int B) { ..... ..... } pemanggilan prosedur Tambah1(&A,B); Keterangan : - Hilangkan keyword „void‟ - Hilangkan tipe data di daftar parameter - Pada parameter aktual, variabel input/output yang di passing di depannya diberi tanda „&‟ - Sesuaikan tipe data antara parameter aktual dam formal. Variabel Lokal VS Parameter Ada banyak kerancuan yang dialami mahasiswa, yaitu tentang kapan harus menggunakan parameter input dan kapan cukup dengan menggunakan variable local saja untuk kasus-kasus tertentu. Ada kunci yang dapat dipakai untuk memecahkan masalah ini, yaitu dengan pertanyaan: apakah variable tersebut secara natural diperlukan prosedur dari pihak luar prosedur? Jika jawabannya adalah perlu, maka harus dijadikan parameter input dan oleh karenanya harus sudah diset valuenya di luar prosedur. Jika jawabannya tidak perlu, maka harus dijadikan variable local. Ingat, variable local tidak akan berisi apaapa sampai diinisialisasi, makanya biasanya statemen pertama terhadap variable local setelah deklarasi adalah inisialisasi. Contoh 1: void swap(int *a, int *b) { int temp; temp=*a; *a=*b; *b=temp; } ATAU void swap(int *a, int *b, int temp) { temp=*a; *a=*b; *b=temp; } mana yang benar? Jelaskan jawaban anda. Contoh 2: void naikGaji(double *Gaji, double kenaikan) { (*Gaji)=(*Gaji)+kenaikan; } ATAU void naikGaji(double *G) { double kenaikan; (*Gaji)=(*Gaji)+kenaikan; } mana yang benar? Jelaskan jawaban anda. Pemanggilan prosedur oleh prosedur lain Prosedur dapat dipanggil darimana saja, dari main() function, dari fungsi lain, atau dari prosedur lain. Berikut diberikan cara memanggil prosedur dari prosedur lain. Dipunyai prosedur akumulasi, seperti berikut: void akumulasi(double *Hasil, double delta) //IS: Hasil sudah ada isinya, hendak diakumulasikan dengan delta. // delta sudah terdefinisi dan ada isinya. //FS: Hasil akan ketambahan sebesar delta. delta tetap valuenya. { (*Hasil)=(*Hasil)+delta; } Lalu kita membutuhkan prosedur kenaikanGaji yang mengharuskan terjadinya akumulasi nilai gaji dengan kenaikannya. Hanya saja dalam prosedur kenaikanGaji, diberikan gaji dan persentase kenaikan dalam persen. Misalkan gajinya 5juta, lalu kenaikannya 10 persen, maka gajinya akan berubah menjadi 5.5juta. void kenaikanGaji(double *gaji, double persenKenaikan) //IS: gaji sudah ada isinya, hendak diakumulasikan dengan // persenKenaikan dikalikan gaji. persenKenaikan sudah // terdefinisi dan ada isinya. //FS: gaji akan ketambahan sebesar persenKenaikan dikalikan gaji. // persenKenaikan tetap valuenya. { double kenaikan; kenaikan=(persenKenaikan/100.0)*(*gaji); (*gaji)=(*gaji)+kenaikan; } Perhatikan code dalam prosedur kenaikanGaji, di situ terdapat proses yang sama persis dengan akumulasi, yaitu mengakumulasikan gaji dengan kenaikannya. Hal ini dapat dikerjakan dengan memanggil prosedur akumulasi. Prosedur berubah menjadi: void kenaikanGaji(double *gaji, double persenKenaikan) //IS: gaji sudah ada isinya, hendak diakumulasikan dengan // persenKenaikan dikalikan gaji. persenKenaikan sudah // terdefinisi dan ada isinya. //FS: gaji akan ketambahan sebesar persenKenaikan dikalikan gaji. // persenKenaikan tetap valuenya. { double kenaikan; kenaikan=(persenKenaikan/100.0)*(*gaji); akumulasi(&(*gaji),kenaikan); //pemanggilan proc akumulasi di sini } DEMO #include <stdio.h> #include <conio.h> void Tambah1(int *A, int B); //A:input/output, B:input /* I = A dan B terdefinisi O = A menampung hasil penjumlahan A + 1, nilai B tidak berubah */ void Tambah1(int *A, int B) { *A = *A + 1; B = B + 1; } void main() { int a, b; printf(“Masukkan nilai a : ”); scanf(“%d”, &a); printf(“Masukkan nilai b : ”); scanf(“%d”, &b); Tambah1(&b,a); //pemanggilan prosedur printf(“\nHasil a = %d, b = %d”,a,b); getch(); } !!! INGAT SELALU!!! Untuk Parameter input output : 1. Pada parameter formal, didepan variabel input/output tersebut diberi tanda „*‟ void Tambah1(int *A, int B) 2. Pada parameter aktual, variabel input/output yang di passing di depannya biberi tanda „&‟. Tambah1(&b,a); 3. Pemanggilan parameter harus berdiri sendiri sebagai sebuah statemen merdeka, tidak boleh ditempelkan pada statemen lain. Tambah1(&b,a); //BENAR printf(“%d\n”,Tambah(&b,a)); //SALAH GUIDED Buatlah isi prosedur pangkat di bawah ini! #include <conio.h> #include <stdio.h> //deklarasi prosedur void Pangkat(int *a, int *b); /* IS : nilai a dan b terdefinisi tidak kosong FS : nilai a dan b dipangkatkan 2 */ //program utama int main() { int x,y; printf("Masukkan nilai x : "); scanf("%d", &x); printf("Masukkan nilai y : "); scanf("%d", &y); printf("\nnilai x dan y sebelum pemanggilan prosedur Pangkat : "); printf("\nx : %d",x); printf("\ny : %d\n\n",y); //pemanggilan prosedur pangkat Pangkat(&x,&y); printf("nilai x dan y sesudah pemanggilan prosedur Pangkat : "); printf("\nx : %d",x); printf("\ny : %d",y); getch(); return 0; }