Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

Fungsi dalam C++ Lingkup Variabel Kelas Penyimpanan Rekursi 1.

Presentasi serupa


Presentasi berjudul: "Fungsi dalam C++ Lingkup Variabel Kelas Penyimpanan Rekursi 1."— Transcript presentasi:

1 Fungsi dalam C++ Lingkup Variabel Kelas Penyimpanan Rekursi 1

2 Fungsi dalam C++ •Pada bahasa pemrograman lain: fungsi = sub-program atau prosedur •Fungsi memiliki tipe. •Jika fungsi tidak harus memiliki nilai balikan, gunakan tipe void. 2

3 Fungsi dalam C++ (lanj.) •Fungsi dalam C++ memiliki runtun parameter. •Parameter: sesuatu yang kita berikan ke fungsi untuk dikerjakan. •Tiap parameter memiliki tipe. •Bisa juga memiliki nol buah parameter. 3

4 Contoh Fungsi int sum2angka(int a, int b) { return(a+b); } 4 Tipe balikan Nama fungsi Parameter Tubuh/ isi fungsi

5 Menggunakan fungsi: Fungsi Library Math •C++ menyediakan library untuk fungsi matematika. •Kita harus tahu cara memanggil masing-masing fungsi sebelum menggunakannya. •Kita harus tahu balikan yang diberikan! •Kita tidak perlu tahu cara kerjanya! 5

6 double sqrt(double) •Ketika memanggil fungsi sqrt, kita harus memasukkan data bertipe double. •Fungsi sqrt memberikan balikan bertipe double. •Contoh x = sqrt(y); x = sqrt(100); 6

7 x = sqrt(y); •Sesuatu yang kita masukkan ke fungsi disebut dengan argumen, dalam hal ini: y •Fungsi dalam C++ tidak dapat mengubah nilai argumen. •Jika sebelum sqrt dipanggil, y bernilai 100, maka setelah sqrt dipanggil, y juga bernilai

8 Data berisi akar kuadrat int i; for (i=1;i<10;i++) cout << sqrt(i) << “\n”; •Parameter sqrt() bukankah bertipe double? •C++ memiliki konversi otomatis untuk fungsi ini. 8

9 Memberitahu kompiler tentang sqrt() •Bagaimana kompiler tahu tentang fungsi sqrt ? •Kita harus memberitahunya: #include 9

10 Fungsi Library Matematika Lainnya ceilfloor cossintan exploglog10pow fabsfmod 10

11 Membuat fungsi •Kita harus menentukan bentuk dari fungsi tersebut: •Tipe balikan •Nama •Tipe parameter (jumlah parameter) •Kita harus menulis tubuh/ isi fungsi (code sesungguhnya) 11

12 Parameter Fungsi •Parameter merupakan variabel lokal dalam tubuh fungsi. •Ketika dipanggil, fungsi harus memiliki nilai yang akan diproses. •Fungsi memperoleh salinan dari nilai yang dimasukkan (nanti kita akan lihat cara memasukkan nilai ke variabel) 12

13 Contoh Fungsi int sum2angka(int angka1, int angka2 ) { int sum; sum = angka1 + angka2; // untuk me-reset nilai angka1 = 0; angka2 = 0; return(sum); } 13

14 Pengujian sum2angka int main(void) { int y,a,b; cout << "Masukkan 2 bilangan\n"; cin >> a >> b; y = sum2angka(a,b); cout << "a berisi " << a << endl; cout << "b berisi " << b << endl; cout << "y berisi " << y << endl; return(0); } 14

15 Apa yang terjadi? int sum2angka(int a, int b) { a=a+b; return(a); } … int a,b,y; … y = sum2angka(a,b); 15

16 Variabel Lokal •Parameter dan variabel yang dideklarasikan di dalam fungsi bersifat lokal. •Keduanya hanya berlaku di dalam tubuh fungsi. •Ketika fungsi memproses balikan, variabel tidak lagi ada! •Tidak mengapa karena tidak diperlukan lagi 16

17 Variabel Blok •Kita juga dapat mendeklarasikan variabel yang muncul hanya di dalam tubuh suatu blok: { int foo; … … } 17

18 Variabel Global •Kita dapat mendeklarasikan variabel diluar definisi fungsi – variabel ini bersifat global. •Sembarang fungsi dapat mengakses/ mengubah variabel global. 18

19 Lingkup •Lingkup variabel adalah sifat keberadaan variabel dalam program. •Variabel global memiliki lingkup global (unlimited). •Lingkup variabel lokal terbatas pada fungsi yang mendeklarasikan variabel tersebut. •Lingkup variabel blok terbatas pada blok yang mendeklarasikan variabel tersebut. 19

20 Catatan: Lingkup Global vs. Lingkup File •Variabel yang dideklarasikan diluar fungsi dapat diakses siapa saja, namun hanya untuk file tertentu. •Lingkup file disebut juga dengan lingkup global. 20

21 Lingkup Blok int main(void) { int y; { int a = y; cout << a << endl; } } 21 Error – a tidak dikenali diluar block!

22 Nesting •Dalam C++: •Tidak ada nesting (persarangan) untuk fungsi •Kita tidak perlu tahu siapa pemanggil fungsi hanya untuk mengetahui lingkup variabelnya. •Tersedia nesting untuk lingkup variabel dalam blok 22

23 Blok bersarang 23 void foo(void) { for (int j=0;j<10;j++) { int k = j*10; cout << j << “,” << k << endl; { int m = j+k; cout << m << “,” << j << endl; } } } m k j

24 Kelas Penyimpanan •Tiap variabel memiliki kelas penyimpanan. •Untuk menentukan periode lamanya variabel berada dalam memori. •Beberapa variabel dibuat hanya sekali (memori diatur untuk menyimpan nilai variabel) •Variabel global dibuat hanya sekali. •Beberapa variabel lainnya dibuat berulang- ulang. •Variabel lokal dibuat berulang-ulang tiap kali suatu fungsi dipanggil. 24

25 Kelas Penyimpanan •auto – dibuat tiap kali suatu blok diproses. •register – sama seperti auto, namun kompiler diberitahu untuk mengerjakannya dengan segera. •static – dibuat hanya sekali, walaupun sifatnya lokal. •extern – variabel global yang dideklarasikan di tempat lain. 25

26 Menyebutkan Kelas Penyimpanan auto int j; register int i_dengan_segera; static char ingatlah_aku; extern double a_global ; C++ Spring 2000 Functions26

27 Penggunaan Praktis Kelas Penyimpanan •Variabel lokal, umumnya berbentuk auto •Variabel global, umumnya berbentuk static •Mendeklarasikan variabel lokal sebagai static artinya nilai terakhir dari variabel akan selalu diingat (tidak dihapus dan dibuat ulang tiap kali lingkup diproses) 27

28 Contoh static int panggil_hitung(void) { static int hitung = 0; hitung++; return(hitung); } … cout << panggil_hitung() << endl; 28

29 Lingkup Fungsi •Dalam C++, sangat diperhatikan lingkup dari suatu pengenal (nama) •Dapat berupa fungsi atau variabel (atau kelas) •Nama fungsi memiliki lingkup file •Semua yang mengikuti definisi fungsi pada file yang sama dapat menggunakan fungsi. •Kadangkala hal ini tidak tepat •Kita ingin memanggil fungsi di bagian atas dari file dan mendefinisikannya di bagian akhir file. 29

30 Prototip Fungsi •Prototip fungsi dapat digunakan untuk memberitahu kompiler bentuk dari fungsi. •Sehingga dapat diproses meskipun kompiler belum memeriksa definisi fungsi tersebut. •Prototip fungsi menentukan nama fungsi, tipe balikan, dan tipe parameter. 30

31 Contoh prototip double sqrt(double); int sum2angka(int, int ); int hitung(void); 31

32 Menggunakan prototip int hitung(void); int main(void) { cout << hitung() << endl; } int hitung(void) { static int hitung = 0; hitung++; return(hitung); } 32

33 Fungsi yang saling memanggil 33 foo1 … foo2() … foo2 … foo1() …

34 Fungsi Ganda char *ayam(int generasi) { if (generasi == 0) return(“Ayam!"); else return(telur(generasi-1)); } 34 char *telur(int generasi ) { if (generasi == 0) return(“Telur!"); else return(ayam(generasi-1)); }

35 Telur vs Ayam char *telur(int); char *ayam(int); int main(void) { int angkamulai; cout <<“Memulai kelompok ayam mu”<< endl; cin >> angkamulai; cout <<“Ayam mu diawali dengan " << ayam(angkamulai) << endl; return(0); } 35

36 Rekursi •Fungsi yang dapat memanggil dirinya sendiri disebut dengan rekursi. •Rekursi sangat berguna – kadangkala untuk mengekspresikan komputasi rekursif kompleks. 36

37 Ayam Rekursif char *ayam_atau_telur(int gen) { if (gen == 0) return(“Ayam!"); else if (gen == 1) return(“Telur!”); else return(ayam_atau_telur(gen-1)); } 37

38 Contoh lainnya - Perhitungan Faktorial int faktorial(int x) { if (x == 1) return(1); else return(x * faktorial(x-1)); } 38

39 Mendesain Fungsi Rekursif •Definisikan “proses dasar” •Situasi ketika fungsi tidak memanggil dirinya sendiri. •Definisikan “langkah rekursif” •Menghitung nilai balikan bantuan dari fungsi tersebut. 39

40 Proses Dasar Rekursi •Proses dasar berkaitan dengan situasi yang kita dapat ketahui jawabannya (fungsi memberikan nilai balikan dengan cepat) atau dapat dengan mudah menghitung jawabannya. •Jika proses dasar tidak dimiliki, jangan gunakan rekursi! (dan mungkin masalah yang ingin diselesaikan belum dipahami) 40

41 Langkah Rekursi •Gunakan pemanggilan rekursi untuk menyelesaikan sub-masalah. •Parameter harus berbeda (atau pemanggilan rekursi tidak memberikan solusi yang baik) •Kita biasanya harus melakukan sesuatu selain melakukan pemanggilan rekursi. 41

42 Rekursi: Topik Tes yang Menarik •Tuliskan fungsi rekursif C++ yang dapat menghitung area persegi nxn. 42 n n Proses dasar: n=1 area=1 Langkah rekursif: area = n+n-1+area(n-1)

43 Fungsi Area Rekursif int area(int n) { if (n == 1) return(1); else return(n + n area(n-1)); } 43

44 Latihan Rekursif •Tuliskan suatu fungsi yang dapat mencetak segitiga: segitiga(4);segitiga(5); * * *** *** ***** ***** ******* ******* ********* 44

45 /* Program to print the Pascal’s triangle recursively */ #include int pascal(int,int); void space(int,int); main() { int num,i,j; printf(“\nEnter the no. of rows required: “); scanf(“%d”,&num); for(i=1;i<=num;i++) { space(num-i,3); for(j=1;j<=i;j++) { printf(“%3d”,pascal(i,j)); space(1,3); } printf(“\n”); } } int pascal(int row,int column) { if(column==0) // The 0th column element is assumed to 0 return 0; else if(row==1&&column==1) return 1; else if(column>row) // assuming the element is zero (no of columns> no of rows) return 0; else return (pascal(row-1,column-1)+pascal(row-1,column)); } void space(int num,int mul) // for spaces in between elements { int i; num*=mul; for(i=0;i

46 Pemanggilan berdasar nilai vs. Pemanggilan berdasar referensi •Kita telah mempelajari fungsi yang memiliki salinan dari pemanggil yang memasukinya. •Ini merupakan pemanggilan berdasar nilai, karena nilainya yang dimasukkan (nilai dari variabel) •Kita juga dapat mendefinisikan fungsi yang melewatkan referensi ke variabel. •Ini disebut pemanggilan berdasar referensi, fungsi dapat mengubah variabel pemanggil secara langsung. 46

47 Referensi •Variabel referensi adalah nama lain dari variabel. Suatu jalan pintas. •Variabel referensi harus diinisialisasikan untuk merujuk variabel lainnya. •Ketika referensi diinisialisasi, kita dapat memperlakukannya seperti variabel lainnya. 47

48 Deklarasi Variabel Referensi •Untuk mendeklarasikan variabel referensi, awali nama variabel dengan “&” int &foo; double &blah; char &c; 48

49 Contoh Variabel Referensi int hitung; int &sesuatu = hitung; // sesuatu sama dengan variabel hitung hitung = 1; cout <<“sesuatu adalah “<

50 Parameter Referensi •Kita dapat mendeklarasikan parameter referensi. void tambah10(int &x) { x = x+10; } … tambah10(hitung); 50 Parameter merupakan referensi

51 Contoh berguna dari Referensi void tukar(int &x, int &y) { int sementara; sementara = x; x = y; y = sementara; } 51


Download ppt "Fungsi dalam C++ Lingkup Variabel Kelas Penyimpanan Rekursi 1."

Presentasi serupa


Iklan oleh Google