250 likes | 684 Views
BAB7 : FUNGSI (Pengaturcaraan Bermodular ). FUNGSI. Terdapat 2 kategori fungsi: Fungsi piawai perpustakaan C main() printf() scanf() dll Fungsi takrifan pengguna direkabentuk dan ditulis sendiri oleh pengaturcara. Mengapa perlu fungsi?. Struktur mudah difahami
E N D
FUNGSI • Terdapat 2 kategori fungsi: • Fungsi piawai perpustakaan C • main() • printf() • scanf() dll • Fungsi takrifan pengguna • direkabentuk dan ditulis sendiri oleh pengaturcara
Mengapa perlu fungsi? • Struktur mudah difahami • aturcara mudah dibaca dan difahami kerana kumpulan suruhan2 yg melakukan kerja tertentu dikumpulkan dalam beberapa bahagian. • juga memudahkan proses debug • Jimat masa/ruang dan guna semula • fungsi hanya perlu ditulis sekali shj dan boleh digunakan berulang2 dgn memanggil nama fungsi tersebut. • Menggalakkan aturcara bermodular • masalah yg besar dipecahkan kpd masalah yg kecil(pendekatan atas-bawah)
Fungsi (sambungan) • Secara ringkasnya melibatkan : • Takrifan fungsi • Mengistiharkan Prototaip fungsi (*perlu jika fungsi slps main() ) • Panggilan fungsi
Format Fungsi • Takrifan fungsi • Bentuk Asas: jenis_pulangan nama_fungsi (parameter_masuk) { badan_fungsi; return (nilai); } Contoh : float kira_luas (float l, float p) { float A; A = p*l; return(A); }
Contoh Fungsi void cetak_mesej (void) { printf("Hi\n"); } int campur (int x, int y) { return(x+y); }
/* cari luas bulatan */ #include <stdio.h> int main ( ) { float luas, jejari; printf(“\nmasukkan nilai jejari:“); scanf(“ %lf “, &jejari); luas = 3.14159 * jejari * jejari; printf(“\nLuas bulatan %lf”,luas); return 0; } #include <stdio.h> float luas_bulat(float jari) { return ( 3.1415*jari*jari ); } int main ( ) { float luas, jejari; printf(“\nmasukkan nilai jejari:“); scanf(“ %lf “, &jejari); luas = luas_bulat(jejari); printf(“\nLuas bulatan%lf”,luas); return 0; } Takrifan fungsi luas bulatan
PROTOTAIP FUNGSI • Contoh sblm (fungsi sebelum main( )) tidak perlu prototaip fungsi. • Jika fungsi takrifan pengguna terletak selepas fungsi main( ) perlu prototaip fungsi • Format prototaip fungsi • Sama spt baris pertama takrifan fungsi & ditmb ; • nama fungsi, bilangan, susunan & jenis parameter mesti sama • Nama parameter boleh ditinggalkan
#include <stdio.h> float luas_bulat (float); int main ( ) { : scanf(“ %lf “, &jejari); luas = luas_bulat(jejari); : } float luas_bulat (float jari) { return ( 3.1415*jari*jari ); } Contoh prototaip fungsi Prototaip fungsi
Parameter sebenar Parameter formal Parameter dalam fungsi #include <stdio.h> float luas_bulat (float); int main ( ) { : scanf(“ %lf “, &jejari); luas = luas_bulat(jejari); : } float luas_bulat (float jari) { return ( 3.1415*jari*jari ); }
Panggilan & Pulangan fungsi • Boleh dipanggil oleh fungsi luar atau dalam fungsi yg sama (rekursif). • 3 perkara penting • Nama fungsi – mesti sama dengan nama fungsi yang ditakrifkan. • Data yg dihantar – jenis, bilangan & turutan mesti sama. • Pulangan fungsi – jenis mesti sama
Panggilan fungsi Pulangan fungsi #include <stdio.h> float luas_bulat (float); int main ( ) { float luas, jejari; : scanf(“ %lf “, &jejari); luas = luas_bulat(jejari); : } float luas_bulat (float jari) { return ( 3.1415*jari*jari ); } Contoh1 panggilan & pulangan fungsi
Contoh 2 panggilan & pulangan fungsi Panggilan fungsi #include <stdio.h> float luas_bulat (float); int main ( ) { : cetak1( ); scanf(“ %lf “, &jejari); luas = luas_bulat(jejari); : } void cetak1 (void) { printf(“\nmasukkan nilai jejari:“); }
Penghantaran Nilai kepada Fungsi • 2 cara : • penghantaran nilai sebenar (call by value) • penghantaran alamat nilai (call by reference) • Penghantaran nilai sebenar • Nilai sebenar akan diumpukan kpd parameter formal pada fungsi yang memanggil. • Nilai dihantar kpd sesuatu fungsi dlm bentuk satu arah. • sebarang perubahan nilai berlaku hanya didalam fungsi sahaja • perubahan keatas nilai didalam fungsi tidak dapat “dilihat” oleh pemanggil
Contoh penghantaran nilai sebenar luas tpk tg void main( ){ : tpk = 9.0; tg = 4.0; luas = luas_segi3 ( tpk, tg ); printf(“%f , %f ,%f ”,tpk, tg, luas); } float luas_segi3 (float tapak, float tinggi) { float luas3; tapak=tapak+1; tinggi=tinggi+1; luas3 =(tapak*tinggi)/2.0; return ( luas3 ); } tapak tinggi luas3
Penghantaran alamat nilai • setiap pembolehubah disimpan pada suatu alamat didalam ingatan (RAM) &pembolehubah • Alamat tersebut dihantar kpd parameter formal pada fungsi yang memanggil. (bukannya nilai) • sebarang perubahan keatas kandungan alamat (nilai) yang dilakukan di dalam fungsi dapat dilihat oleh pemanggil • Nilai pembolehubah yg distorkan di dlm alamat boleh dirujuk dgn penunding *pembolehubah • Nilai dihantar kpd sesuatu fungsi dlm bentuk dua arah. • ‘Return’ tidak diperlukan. (kalau guna pun tak salah) • parameter sebenar (pemanggil), bermula dengan simbol &. • parameter formal (dipanggil), bermula dengan *.
Contoh penghantaran alamat nilai void main( ){ : tpk = 9.0; tg = 4.0;luas=0.0; luas_segi3 ( &tpk, &tg, &luas); printf(“%f, %f, %f ”, tpk, tg, luas); } float luas_segi3(float *tapak,float *tinggi, float*luas3) { *tapak=*tapak+1; *tinggi=*tinggi+1; *luas3 =(*tapak*(*tinggi))/2.0; } luas tpk tg tapak tinggi luas3
void main() { int x=10, y=10, z=25, campur, tolak; Kiraan(x, &y, z, &campur, &tolak); Printf(“\nNilai x, y, z = %d%d%d”,x, y, z); printf(“\nNilai bagi campur ialah %d ”, campur); printf(“\nNilai bagi tolak ialah %d “,tolak); return; } void Kiraan(int a, int *b, int c, int *tambah, int *kurang) { a = a+3; *b = *b+2; *tambah = a + *b + c; *kurang = a - *b - c; } latihan
Skop Pembolehubah • Pembolehubah setempat • Diistiharkan dalam sesuatu fungsi • Hanya boleh digunakan/ dicapai/ dicam dalam fungsi tersebut sahaja • Hanya wujud semasa fungsi tersebut aktif • Pembolehubah sejagat • Diistiharkan diluar fungsi • Boleh digunakan/ dicapai/ dicam oleh semua fungsi kecuali jika namanya sama dgn pembolehubah setempat
Contoh skop pembolehubah void main() { float j; : luas_segi4 (); luas = luas_bulat(j); } #include <stdio.h> float luas= 0; void luas_segi4 (void) { float pjg=2, lbr=4; luas = pjg*lbr; } float luas_bulat (float jejari) { float luas; luas = 3.1415*jejari*jejari; return(luas); }
Skop prototaip • Sama seperti skop pembolehubah
#include <stdio.h> void menu (void); float luas_segi4 (void); void main() { float luas_segi3 (float, float); : menu(); luas = luas_segi4 (); luas = luas_segi3 (tpk, tg); } float luas_segi4 (void) { float luas_bulat (float jejari); : luas = luas_bulat (j); : } float luas_segi3 (float tapak, float tinggi) { : } float luas_bulat (float jejari) { menu(); : } void menu (void) { : }
Pembolehubah automatik dan statik • Pembolehubah automatik • nilai bagi pembolehubah automatik wujud apabila memasuki fungsi/blok dimana pembolehubah tersebut diistiharkan dan akan terhapus apabila keluar. • Format : auto float x, y; • secara default, pembolehubah yang digunakan adalah berjenis auto. format diatas jarang digunakan • Pembolehubah statik • nilai yang terdapat dalam pembolehubah ini akan kekal walaupun telah keluar daripada fungsi/blok dimana ia distiharkan • Format : static int count;
void a(void) { int y = 25; printf(“y dalam fungsi a = %d”, y); ++y; printf(“y dalam fungsi a = %d”, y); } void b (void) { static int z = 40; printf(“z dalam fungsi b = %d”, z); ++z; printf(“z dalam fungsi b = %d”, z); } #include <stdio.h> void a(void); void b(void); void c( void); main( ) { a( ); b( ); a( ); b( ); }