450 likes | 751 Views
Fungsi. Pertemuan 0 8. Dasar Pemrograman Komputer 20 10. Learning Outcomes. Pada akhir pertemuan ini , diharapkan mahasiswa akan mampu : Mendemonstrasikan penggunaan fungsi serta pengiriman parameter. Outline Materi. Pemrograman Modular Library Function vs user-defined function
E N D
Fungsi Pertemuan08 DasarPemrogramanKomputer 2010
Learning Outcomes Padaakhirpertemuanini, diharapkanmahasiswa akanmampu : • Mendemonstrasikanpenggunaanfungsisertapengirimanparameter
Outline Materi PemrogramanModular Library Function vs user-defined function Prototipefungsi Jangkauan identifier Pengiriman parameter Iterasivsrekursif
Pemrograman Modular Program dibagi-bagimenjadiModul-Modul Moduldalambahasa C di-implementasikandenganFungsi Fungsidibentukdenganmengelompokkansejumlahperintahuntukmenyelesaikantugastertentu. Moduldiperlukanjikakelompokperintahtersebutkerap kali digunakanditempat lain dalam program Modulseringdisebutjugadengan Sub-Program
Pemrograman Modular • Rancangan Top - down denganteknik Sub goal, program besardapatdibagimenjadimodul-modul yang lebihkecil. • Dapatdikerjakanolehlebihdarisatuorangdengankoordinasi yang relatifmudah. • Mencarikesalahanrelatiflebihmudahkarenaalurlogikalebihjelas, dankesalahandapatdilokalisirdalamsatumodul. • Modifikasidapatdilakukan, tanpamenggangu program secarakeseluruhan • Mempermudahdokumentasi • Keuntunganmenggunakanmodul :
Pemrograman Modular Program Utama SubProgram SubProgram SubProgram SubProgram SubProgram Bahasa C melengkapifasilitas modular denganmenggunakanfungsipadasetiapSubProgram. Contohpembagian program menjadibeberapa subprogram.
Pemrograman Modular • Sifat-sifatmodul yang baikadalah : • Fan-In yang tinggi, yaitumakinseringsuatumoduldipanggilolehpengguna, makintingginilai fan-in. • Fan-Out yang rendah, makinsedikittugas yang dilakukanolehsuatumodulmakinrendahnilai fan-out. Dengandemikian, makinspesifiktugas yang dikerjakanolehmodultersebut. • Self-Contained, ataumemenuhikebutu-hannyasendiri.
Library vs User-Defined Function • Fungsidalamabahasa C terbagidalamduajenis : • Library function • User-defined function • Library function, adalahfungsi-fungsi standard yang sudahdisediakanolehbahasa C. Fungsi-fungsitersebutdideklarasikandalam file header (.h), contohnyaclrscr() adadi file conio.h, sqrt() dalammath.h, printf() dalamstdio.h • User-define function, adalahfungsi yang didefinisikansendiriolehpemrogram.
Library vs User-Defined Function Contoh Program yang menggunakan Standard Library Function : printfdansqrt #include<stdio.h> #include<math.h> int main() { inti; for(i=0; i<6; i++) printf(“%d %f”,i,sqrt(i)); return 0; }
KonstruksiFungsi • Konstruksifungsi return-value-type function-name( parameter-list ) { statements; } • return-value-type:tipe data yang dikembalikanolehfungsi • Jikatidakdiisimakadianggaptipenya integer (default int) • Jikareturn-value-typediganti void makafungsitidakmengembalikannilai • Parameter-list:berisidaftarnilai yang dikirimkandarifungsipemanggil
KonstruksiFungsi formal parameter Fungsi intmaksimum (intx, inty){ intmaks = x; if ( y > maks) maks = y; returnmaks; } Pemanggil void main () { inta,b; printf("Input 2 bilanganbulat : "); scanf("%d %d", &a, &b); printf("Bilanganyglebihbesar : %d\n",maksimum(a,b)); } Actual parameter Contoh :
PrototipeFungsi • Penulisanfungsipadabahasa C padadasarnyadiletakkandiataspemanggil (blokmain, ataublokfungsilainnya). Namunadakalanyablokfungsidiletakkansetelahblokpemanggil. Padakondisitersebutperludigunakanprototipefungsi. • Tujuandariprototipefungsi : • Meyakinkansebuahfungsidikenalolehpemanggilnya • Compilerakanmemvalidasi parameter • Sintaks return-value-type function-name( parameter-list );
PrototipeFungsi #include<stdio.h> intmaksimum (int x, int y){ intmaks = x; if ( y > maks) maks = y; return maks } void main () { inta,b; printf("Input 2 bilanganbulat : "); scanf("%d %d", &a, &b); printf("Bilanganyglebihbesar : %d\n",maksimum(a,b)); } Karenafungsimaksimumdiletakkandiataspemanggilnya (main program), makatidakperluprototipefungsi Contoh :
PrototipeFungsi Prototipe Fungsi #include<stdio.h> intmaksimum(int, int); void main () { inta,b; printf("Input 2 bilanganbulat : "); scanf("%d %d", &a, &b); printf("Bilanganyglebihbesar : %d\n",maksimum(a,b)); } intmaksimum (int x, int y){ intmaks = x; if ( y > maks) maks = y; return maks } Karenafungsimaksimumdiletakkandibawahpemanggilnya (main), makaperludiletakkanprototipefungsidiatas,supayadikenalolehpemanggilnya Contoh :
PrototipeFungsi • PenulisanPrototipeFungsisepertidiatasbisaditambahnamaparameternyasbb : intmaksimum(int a, int b); • Yang dipentingkandalamprototipefungsiadalahtipe parameter, jumlah parameter danurutannya.
Lingkup Identifier • Lingkup identifier meliputibagian-bagian program dimanasebuah identifier masihbisadiakses. • Lingkup identifier meliputi : • Local • Global • Local identifier • Identifier yang dideklarasikandidalamfungsi, termasukdaftar parameter. • Lingkupnya terbataspadafungsi tempat dideklarasikan.
Lingkup Identifier • Global identifier • Identifier yang dideklarasikandiluarfungsi. • Ruang lingkupnya meliputiseluruhprogram. • Identifier global, dapatdigunakanuntuk identifier lokal. • Disarankantidakbanyakmenggunakanidentifier global karena: • Jika program semakinbesar, kecenderungan errorsemakinbesar . • Sulitmelacakbila terjadi kesalahan. • Data tidakterjagadenganbaik, setiapfungsi dapatmengubahnilai variabeltanpasepengetahuanfungsi lainnya.
scope darivariabelx int x; fungsi1(){ - - } scope darivariabel y int y; fungsi2(){ int z; - } z dan y hanyadikenalolehmain() z dimain()berbedadgndi fungsi2() y di main() berbeda dgn di fungsi2() main(){ int z,y; - } Jangkauan Identifier Contoh :
Parameter Fungsi • Pengiriman nilai data antar fungsi dapat dilakukan melalui penggunaan parameter fungsi. • Parametermerupakan ‘interface’ antara suatufungsi denganfungsi lain. • Pengirimannilai data melalui parameter dapat berupa: • By-Value Yang dikirimkefungsi lain adalahnilai datanya. • By Location / by reference Yang ditransferkefungsi lain adalahalamat memorinya.
Pengiriman Parameter #include <stdio.h> void Garis (char x) { //x sbg Parameter Formal {inti; // i, x adalah Local Variabel for (i = 1; i<=10; i++) printf(“%c”,x); } /*Program Utama*/ void main() {char A= ’-’; Garis(A);// A disebut Parameter Aktual } Contoh : Pengiriman parameter by value
Pengiriman Parameter #include <stdio.h> void Hitung (int X, int Y, int *P, int *Q) {*P = X + Y; *Q = X * Y; } void main() {intX, Y, P, Q; /*local variabel*/ printf(“ X=”); scanf(“%d”,&X); printf(“ Y=”); scanf(“%d”,&Y); Hitung(X,Y,&P,&Q); printf(”X + Y = %d\n”, P); printf(”X * Y = %d\n”, Q); } Contoh : Pengiriman parameter by location
Array Dimensi-1 Sebagai Parameter #include <stdio.h> void cetak_array(int index, int *A) { printf(“A[%d]=%d\n”,index, A[index]); } void main() { int A[ ]={1,6,2,8,12}; cetak_array(2, A); } • Contohdiatas: A padafungsi main adalah pointer constant, sedangkan A padafungsicetak_arrayadalah pointer variable. Jika array digunakansebagai parameter dalamsuatufungsi, maka passing parameter harus by location. Contoh:
Array Dimensi-2 sbg Parameter • Deklarasifungsinyadapatberupa: void isimatriks(inta[10][10], int b, int k) atau void isimatriks(int a[][10], int b, int k) • tetapiTIDAKbisaberupa: void isimatriks(inta[10][], int b, int k) atau void isimatriks(inta[][], int b, int k)
Array Dimensi-2 sbg Parameter • Contoh: #include <stdio.h> void cetak(int A[3][4]) {introw,col; for(row=0; row<3; row++){ for(col=0; col<4; col++) printf("X[%d][%d]=%d",row,col,A[row][col]); printf("\n"); } } int main() {int x[3][4]={{1,2,3,4},{8,7,6,5},{9,10,11,12}}; cetak(x); return(0); }
Pengiriman Parameter int main() {char ss[20]="KASUR"; balik(ss); printf("%s\n",ss); getch(); return(0); } Untuk string pada formal parameter bisa : char[ ] atau char * void balik( char ss[ ] ) {intc,i,j; for(i=0, j=strlen(ss)-1; i<j; i++, j--){ c=ss[i]; ss[i]=ss[j]; ss[j]=c; } } void balik( char *ss) {intc,i,j; for(i=0, j=strlen(ss)-1; i<j; i++, j--){ c=ss[i]; ss[i]=ss[j]; ss[j]=c; } }
FungsiRekursif • Fungsirekursifadalahfungsi yang didalamnyaterdapat statement yang memanggildirinyasendiri. • Fungsirekursif, sangatbergunadalampemecahanmasalahyang dapatdidefinisikansecararekursif pula. • Contoh : Faktorial (n)atau n! didefinisikansebagaiberikut : n! = 1, untuk n = 0; n! = n * (n-1)!, untuk n > 0 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1* 0! 0! = 1 Biladitelusurmundur : 4! = 1*2*3*4 = 24
FungsiRekursif 5! (5 * 4!) (5 * (4 *3!)) (5 * (4 * (3 * 2!))) (5 * (4 * (3 * (2 * 1!)))) (5 * (4 * (3 * (2 * (1 * 0!))))) (5 * (4 * (3 * (2 * (1 * 1))))) (5 * (4 * (3 * (2 * 1)))) (5 * (4 * (3 * 2))) (5 * (4 * 6 )) (5 * 24) 120 Contohperhitungan 5 faktorial
FungsiRekursif • Fungsirekursifmempunyaiduakomponenyaitu: • Base case: mengembalikannilaitanpamelakukanpemanggilanrekursiberikutnya. • Reduction step: menghubungkanfungsidisuatunilai input kefungsi yang dievaluasidinilai input yang lain. Sekuennilai input haruskonvergenke base case. • Fungsifaktorial • Base case: n = 0 • Reduction step: f(n) = n * f(n-1)
FungsiRekursifvsIterasi • Faktorial - Rekursif • long faktor (int n) • {if(n==0) return (1); • else return(n * faktor(n-1)); • } • Faktorial - Iteratif • long faktor(int n) • {long i, fak = 1; • for(i=1; i<=n; i++) fak *= i; • return (fak); • } Contoh
KekuranganRekursif Apakah stack ? • Meskipunpenulisan program dengancararekursifbisalebihpendek, namunfunction rekursifmemerlukan : • Memori yang lebihbanyak, karenaperlutambahanuntukmengaktifkan Stack. • Waktulebih lama, karenaperlumenjejakisetiappemanggilanrekursifmelalui stack.
KapanMenggunakanRekursif? • Secaraumum, gunakanpenyelesaiansecararekursif, hanyajika : • Penyelesaiansulitdilaksanakansecaraiteratif • Efisiensidengancararekursifsudahmemadai • Efisiensibukanmasalahdibandingkandengankejelasanlogika program • Tidakmempertimbangkanfaktorpenghematanmemoridankecepataneksekusi program • Pertimbanganantaraaspekkecepatandanpenghematanmemori menggunakaniteratif, dibandingperancanganlogika yang baikmenggunakanrekursif
Bilangan Fibonacci • Urutanbilangan 0, 1, 1, 2, 3, 5, 8, 13 … disebutbilanganFibonacci. Hubunganantarasatuangkadenganangkaberikutnyadidefinisikansecararekursifsebagaiberikut : • Fib(N) = N jikaN = 0 atau 1 • Fib(N) = Fib(N-2) + Fib(N-1) jika N >= 2
Bilangan Fibonacci int Fib(int n) { int f; if(n==0) f = 0; else if(n==1) f = 1; else f = Fib(n-2) + Fib(n-1); return f; } Fungsi fib() di-sampingditulissecararekursidandisebutsebagaislow_Fib() tulislahfast_Fib() menggunakaniterasi. Contoh :
Bilangan Fibonacci FIB (4) FIB (3) FIB (2) FIB (2) FIB (1) FIB (1) FIB (0) FIB (1) FIB (0) Contoh : Skemafibonaccijika N=4
Function Parameter Declaration int fungsi1(a) int a; { a++; return a; } int fungsi2(b) int b; { b = b * b; return b; } #include <stdio.h> int main() {intx; x=fungsi1(3); printf("x=%d\n",x); x=fungsi2(13); printf("x=%d\n",x); return(0); } • ClassicFunction Parameter declaration • Contoh:
Function Parameter Declaration #include <stdio.h> int main() {intx; x=fungsi1(3); printf("x=%d\n",x); x=fungsi2(13); printf("x=%d\n",x); return(0); } int fungsi1(int a) { a++; return a; } int fungsi2(intb) { b = b * b; return b; } • ModernFunction Parameter declaration • Contoh:
Latihan • Buatlah program denganfungsisbb: • Fungsiuntukmeng-input 10 bilangankedalam array • Fungsiuntukmencaribilanganterbesardalam array tersebut • Fungsiuntukmencaribilanganterkecildalam array tersebut • Fungsiuntukmenampilkan : • 10 bilangantersebut • Bilanganterbesardanterkecil
Latihan void Tukar(char A, char B ) { char C ; C = A; A = B, B = C; } void main() { char X, Y ; X = ‘S’; Y = ‘D’; Tukar(X, Y); printf(“X = %c Y= %c”, X, Y); } Perbaiki program berikutsehinggabisadigunakanuntukmenukar 2 buahkarakter
Latihan Fungsitidakmengembalikannilai Fungsi yang mengembalikannilai Jelaskanapaperbedaan keyword return yang adapadafungsibagidenganreturn yang adapadafungsi div ? #include <stdio.h> void bagi(float x, int y, float *z) { if(y==0) return; *z=x/y; } float div(float x, int y) { if(y!=0) return(x/y); } void main() { float f,a=12.75; int b=5; bagi(a,b,&f); printf("%f dibagi %d = %f\n",a,b,f); b=3; f=div(a,b); printf("%f dibagi %d = %f\n",a,b,f); }
Latihan • Bolehkahpadafungsibagitidakmenggunakan keyword return, jikabolehsilahkanprogramnyadirubah ? • Bolehkanpadafungsi div tidakmenggunakan keyword return ? #include <stdio.h> void bagi(float x, int y, float *z) { if(y==0) return; *z=x/y; } float div(float x, int y) { if(y!=0) return(x/y); } void main() { float f,a=12.75; int b=5; bagi(a,b,&f); printf("%f dibagi %d = %f\n",a,b,f); b=3; f=div(a,b); printf("%f dibagi %d = %f\n",a,b,f); }
Latihan PerhatikanLingkupvariabel x pada program disamping. Apa output dari program disamping ? #include <stdio.h> int main() { intx,y; for(x=1; x<=3; x++) { intx=5; printf("x=%d ",x++); for(y=0; y<x; y++) { int x=20; printf("x=%d ",x++); } printf("\n"); } return 0; }
Pilar Kiri Pilar Kanan Tengah Pilar 1 2 3 4 Latihan • Menara Hanoi
Latihan • Pindahkan n-piringandaripilar-kirikepilar-kanandenganpilar-tengahsebagaiantara. Piringan yang beradadipilarkiritersusunsedemikianrupasehinggamenyerupaimenara, yaitupiringan yang lebihkecilselaluberadadiataspiringan yang lebihbesar. Padaprosespemindahanpiringan-piringantersebut, polasusunanmenaraharusselaludijaga. • Alurpemecahansecararekursif : 1. Pindahkan (n-1) piringan-piringanataskepilarantara. 2. Pindahkanpiringanterakhirkepilartujuan. 3. Ulangi 2 dan 3, hinggaselesai.
Latihan • Simulasikanpemindahandengan : • 3 piringan • 4 piringan • 5 piringan • Buatprogramnyasecararekursif