290 likes | 589 Views
Bab 10. Fungsi. Rekabentuk Atas Bawah. Aturcara C untuk menyelesaikan masalah yang kecil biasanya ditulis dalam satu fungsi sahaja fungsi utama yang dipanggil main
E N D
Bab 10 Fungsi
Rekabentuk Atas Bawah • Aturcara C untuk menyelesaikan masalah yang kecil biasanya ditulis dalam satu fungsi sahaja fungsi utama yang dipanggil main • Masalah yang besar dan kompleks perlu dipecahkan kepada submasalah-submasalah (pemecahan berstruktur) boleh digambarkan dengan carta berstruktur • Dalam carta berstruktur, masalah yang paling besar berada paling atas, manakala submasalah yang paling kecil berada paling bawah rekabentuk atas bawah
Cari & cetak huruf terawal di antara 3 huruf yang diberi huruf_3 huruf_2 huruf_1 huruf_1 huruf_2 huruf_3 huruf_Terawal huruf_1 huruf_2 huruf_Terawal huruf_Terawal huruf_3 huruf_Terawal Baca 3 huruf Cari huruf terawal Cetak keputusan Banding huruf_1 Dengan huruf_2, Simpan yg terawal Dlm huruf_Terawal Banding huruf_3 Dengan huruf_Terawal, Simpan yang terawal Dlm huruf_Terawal 3.1 3.2 Contoh Carta Berstruktur
Rekabentuk Atas Bawah • Setiap masalah dan submasalah dalam carta berstruktur dirujuk sebagai modul yang akan dikodkan sebagai fungsi • Fungsi yang paling atas merupakan fungsi utama (main) • Fungsi main akan memanggil setiap fungsi yang berada di bawahnya, dan setiap fungsi akan memanggil fungsi yang berada di bawahnya dan seterusnya
Fungsi Takrifan Pengguna • Fungsi yang direka, ditulis atau ditakrifkan oleh pengaturcara • Setiap fungsi takrifan pengguna perlu mempunyai takrifan dan prototaip • Setiap fungsi ini juga perlu dipanggil untuk melaksanakan kod-kod yang telah ditakrifkan dalam fungsi tersebut • Dalam aturcara C, prototaip fungsi ditulis sebelum fungsi main, manakala takrifan fungsi ditulis selepas fungsi main
Takrifan Fungsi • Bentuk takrifan fungsi adalah seperti berikut: jenis_data nama_fungsi( senarai_takrifan_parameter ) { pengisytiharan_pembolehubah_setempat; pernyataan; } • Kepala fungsi – pernyataan sebelum tanda ‘{‘ • Badan fungsi – semua penyataan yang berada di antara tanda ‘{‘ dan ‘}’ • Jenis_data – jenis bagi suatu nilai yang dikembalikan oleh fungsi, contohnya int, float, char, dan void digunakan jika fungsi tidak mengembalikan sebarang nilai
Takrifan Fungsi • Nama_fungsi – nama yang diberikan oleh pengaturcara mengikut petua pencam: • Bermula dengan abjad • Tidak melebihi 31 aksara • Hanya terdiri daripada abjad, digit dan tanda ‘_’ sahaja • Senarai_takrifan_parameter – pengisytiharan parameter yang diterima oleh fungsi • Pengistiharan lebih dari satu parameter dipisahkan oleh tanda ‘,’ • ‘Void’ digunakan jika tiada parameter yang terlibat
Takrifan Fungsi • Suatu fungsi boleh mempunyai pembolehubahnya sendiri – pembolehubah setempat yang hanya digunakan dalam fungsi tersebut • Pembolehubah setempat ini ditakrifkan dalam badan fungsi • Contoh takrifan fungsi: void lukis_garissilang(void) { printf(“ /\ \n”); printf(“ / \ \n”); printf(“ / \ \n”); } Fungsi ini tidak menerima sebarang parameter dan tidak memulangkan sebarang nilai
Contoh Takrifan Fungsi • Contoh 2: void lukis_garisdasar( int n ) { int i; for ( i = 1; i<=n; i++) printf(“-”); } • Contoh 3: float kira_luas( int jejari ) { float luas; luas = (22.0/7.0) * jejari * jejari; return luas; }
Prototaip Fungsi • Prototaip fungsi memberitahu pengkompil C maklumat awal tentang parameter yang akan dihantar kepada dan nilai yang akan dikembalikan oleh fungsi tersebut • Sintaks prototaip fungsi: jenis_data nama_fungsi( senarai_takrifan_parameter); • Bentuk ini menyerupai kepala takrifan fungsi • Contoh: int lukisSegiEmpat( int lebar, int tinggi ); • Prototaip di atas boleh juga ditulis seperti berikut: int lukisSegiEmpat( int, int );
Panggilan Fungsi • Sintaks untuk panggilan fungsi: nama_fungsi( senarai_parameter_sebenar ); • Nama_fungsi – nama fungsi yang ingin dipanggil • Senarai_parameter_sebenar – senarai parameter yang ingin dihantar kepada fungsi yang dipanggil • Bilangan parameter sebenar mestilah sama dengan bilangan parameter yang ditakrifkan dalam fungsi • Contoh: lukis_garisdasar(5); • Jika tiada parameter yang terlibat, ruang dibiarkan kosong, contohnya; lukis_garissilang();
Contoh Penggunaan Fungsi (1) • Masalah : • Melukis bangunan • Analisis : • Bangunan boleh dilukis mengikut langkah-lengkah berikut: • Lukis bumbung • Lukis tingkat ( 3 kali ) • Lukis dasar
Lukis bangunan Lukis tingkat Lukis tingkat Lukis tingkat Lukis dasar Lukis bumbung Contoh Penggunaan Fungsi (1) • Carta berstruktur:
Contoh Penggunaan Fungsi (1) /* Melukis bangunan */ #include <stdio.h> void lukis_bumbung(void); void lukis_tingkat(void); void lukis_dasar(void); void main (void) { lukis_bumbung(); lukis_tingkat(); lukis_tingkat(); lukis_tingkat(); lukis_dasar(); } int i; lukis_bumbung(); for (i=0; i<3; i++) lukis_tingkat(); lukis_dasar();
Contoh Penggunaan Fungsi (1) void lukis_bumbung(void) { printf(“ /\ \n”); printf(“ / \ \n”); } void lukis_tingkat(void) { printf(“------\n”); printf(“| | \n”); } void lukis_dasar(void) { printf(“------\n”); }
Fungsi dengan parameter • Terdapat dua istilah yang biasa digunakan untuk merujuk parameter : • Parameter sebenar • Parameter formal • Parameter sebenar merujuk kepada parameter yang disenaraikan dalam pernyataan panggilan fungsi • Parameter formal merujuk kepada parameter yang disenaraikan dalam kepala takrifan fungsi • Bilangan dan jenis parameter sebenar dan parameter formal mesti sepadan • Apabila suatu fuungsi dipanggil, nilai parameter sebenar akan disalin kepada parameter formal • Sebarang perubahan yang berlaku kepada parameter formal tidak akan memberi kesan kepada parameter sebenar
Fungsi yang Mengembalikan Nilai • Fungsi yang mengembalikan nilai mesti mempunyai pernyataan return • Sintaks: return; return <ungkapan>; • Pernyataan return biasanya ditulis sebelum berakhirnya badan fungsi ketika kawalan aturcara dikembalikan kepada fungsi yang memanggil atau aturcara utama • Contoh: return 0; return luas; return (a + b + c);
Fungsi yang Mengembalikan Nilai • Cara panggilan fungsi yang mengembalikan nilai berbeza dengan panggilan fungsi yang lain • Penggilan fungsi adalah dalam bentuk penyataan umpukan • Sintaks panggilan fungsi : pembolehubah = nama_fungsi(senarai_parameter_sebenar); • Jenis pembolehubah haruslah sama dengan jenis nilai yang dikembalikan oleh fungsi tersebut
Contoh Penggunaan Fungsi (2) #include <stdio.h> float kira_luas(int); int main() { int j; float luas_bulatan1; float luas_bulatan2; luas_bulatan1 = kira_luas(5); printf(“Luas bulatan 1 %f”, luas_bulatan1); printf(“Masukkan nilai jejari: “); scanf(“%d”, &j); luas_bulatan2 = kira_luas(j); printf(“Luas bulatan 2 %f”, luas_bulatan2); return 0; }
Contoh Penggunaan Fungsi (2) float kira_luas(int jejari) { float luas; luas = (22.0/7.0) * jejari * jejari; return luas; }
Fungsi Pustaka Dalam C • Bahasa C menyediakan koleksi fungsi pustaka yang boleh digunakan dalam aturcara • Untuk menggunakan fungsi-fungsi ini, pengisytiharan prototaip fungsi yang diisytiharkan secara berkumpulan dalam fail header ( fail .h ) tertentu perlu dipanggil • Contoh fungsi pustaka yang biasa digunakan ialah • printf( ) • scanf( ) • Prototaip printf( ) dan scanf( ) diisytiharkan dalam fail stdio.h
Fungsi Pustaka Dalam C • Antara koleksi fungsi pustaka yang disediakan adalah fungsi untuk manipulasi aritmetik • Prototaip fungsi-fungsi ini kebanyakannya diisytiharkan dalam fail math.h • Fungsi-fungsi ini adalah fungsi yang mengembalikan nilai, contoh menggunakan fungsi sqrt: y = sqrt(x) (pernyataan panggilan fungsi) y – p/ubah yang akan menyimpan nilai yang dikembalikan oleh fungsi x – argumen • Jika nilai argumen x yang dihantar ialah 100, nilai y selepas pernyataan ini dilaksanakan ialah 10
Fungsi Pustaka Dalam C • Fungsi ceil(x) • Memulangkan nombor bulat terkecil yang tidak kurang kurang daripada argumen • Contoh: y = ceil(x); jika x = 45.23, y = 46.0 juga boleh ditulis sebagai : y = ceil(45.23); • Jenis argumen x float/double • Jenis p/ubah y float/doule Sila rujuk Buku Pengaturcaraan C, jadual 10.1
Skop Pembolehubah • Terdapat dua jenis skop pembolehubah: setempat (local) dan sejagat (global) • Pembolehubah setempat: • Hanya boleh dikenali dan dimanipulasi dalam blok di mana ia diisytiharkan • Blok ditandakan dengan ‘{‘ dan ‘}’ • Pembolehubah sejagat • Dikenali dan boleh dimanipulasi oleh keseluruhan aturcara, termasuk fungsi takrifan pengguna • Pembolehubah ini tidak perlu dihantar sebagai argumen kepada fungsi yang akan menggunakannya • Diisytiharkan sebelum fungsi main( )
Skop Pembolehubah (Contoh) x 4 #include <stdio.h> void kuasadua(float, float); int x; int main(void) { float a, b; a = 3; b = 20; x = 2; kuasadua(a, b); printf(“%1.1f kuasadua ialah %2.1%f\n”, a, b ); return 0; } void kuasadua( float i, float j) { j = i *i; x = 4; } main a 3 b 20 kuasadua i 3 j 9
Fungsi Rekursi • Fungsi yang memanggil dirinya sendiri • Fungsi rekursi digunakan untuk menyelesaikan masalah yang boleh dipecahkan kepada submasalah yang menyerupai masalah asal, secara berulang-ulang sehingga dapat diselesaikan • Contohnya, mendapatkan nilai faktorial • Rumus faktorial boleh ditulis sebagai: 1, apabila n = 0 n! = n * (n-1) * … * 2 * 1, apabila n >= 1 • Fungsi faktorial boleh ditulis sebagai: faktorial(n) = n!
Contoh Fungsi Rekursi (Faktorial) • Faktorial(n) = n! = n * (n-1) * (n-2) * … * 2 * 1 = n * (n-1)! = n * faktorial(n-1) • Faktorial(0) = 0! = 1 • Faktorial(1) = 1! = 1 * 1= 1 * 0! • Faktorial(2) = 2! = 2 * 1= 2 * 1! • Faktorial(3) = 3! = 3 * 2 * 1 = 3 * 2! • Faktorial(4) = 4! = 4 * 3 * 2 * 1 = 4 * 3! • Faktorial(5) = 5! = 5 * 4 * 3 * 2 * 1 = 5 * 4!
Contoh Fungsi Rekursi (Faktorial) faktorial(5) y = 5 * faktorial(5-1); 4 * 3 * 2 * 1 faktorial(4) y = 4 * faktorial(4-1); 3 * 2 * 1 faktorial(3) y = 3 * faktorial(3-1); 2 * 1 faktorial(2) y = 2 * faktorial(2-1); 1 faktorial(1) y = 1 * faktorial(1-1);
Implementasi Fungsi Faktorial #include <stdio.h> int main(void) { int n; int faktorial(int); printf(“Masukkan nilai n “); scanf(“%d”, &n); if (n < 0) printf(“n tidak boleh negatif\n”); else printf(“%d! = %d\n”, faktorial(n)); } int faktorial( int n ) { if (n == 0) return 1; else return (n * faktorial(n-1)); }