1.15k likes | 2.18k Views
Fungsi dalam C++. Lingkup Variabel Kelas Penyimpanan Rekursi. 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. Fungsi dalam C++ (lanj.).
E N D
Fungsi dalam C++ Lingkup Variabel Kelas Penyimpanan Rekursi
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.
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.
Contoh Fungsi Tipe balikan Parameter int sum2angka(int a, int b) { return(a+b); } Nama fungsi Tubuh/ isi fungsi
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!
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);
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 sqrtdipanggil, y bernilai 100, maka setelah sqrtdipanggil, y juga bernilai 100.
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.
Memberitahu kompiler tentang sqrt() • Bagaimana kompiler tahu tentang fungsi sqrt ? • Kita harus memberitahunya: #include <math.h>
Fungsi Library Matematika Lainnya ceil floor cos sin tan exp log log10 pow fabs fmod
Membuat fungsi • Kita harus menentukan bentuk dari fungsi tersebut: • Tipe balikan • Nama • Tipe parameter (jumlah parameter) • Kita harus menulis tubuh/ isi fungsi (code sesungguhnya)
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)
Contoh Fungsi int sum2angka(int angka1, int angka2 ) { int sum; sum = angka1 + angka2; // untuk me-reset nilai angka1 = 0; angka2 = 0; return(sum); }
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); }
Apa yang terjadi? int sum2angka(int a, int b) { a=a+b; return(a); } … int a,b,y; … y = sum2angka(a,b);
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
Variabel Blok • Kita juga dapat mendeklarasikan variabel yang muncul hanya di dalam tubuh suatu blok: { int foo; … … }
Variabel Global • Kita dapat mendeklarasikan variabel diluar definisi fungsi – variabel ini bersifat global. • Sembarang fungsi dapat mengakses/ mengubah variabel global.
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.
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.
Lingkup Blok int main(void) { int y; { int a = y; cout << a << endl; } cout << a << endl; } Error – a tidak dikenali diluar block!
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
Blok bersarang 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; } } } j k m
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.
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.
Menyebutkan Kelas Penyimpanan auto int j; register int i_dengan_segera; static char ingatlah_aku; extern double a_global; C++ Spring 2000 Functions
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)
Contoh static int panggil_hitung(void) { static int hitung = 0; hitung++; return(hitung); } … cout << panggil_hitung() << endl; cout << panggil_hitung() << endl; cout << panggil_hitung() << endl;
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.
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.
Contoh prototip double sqrt(double); int sum2angka(int , int ); int hitung(void);
Menggunakan prototip int hitung(void); int main(void) { cout << hitung() << endl; cout << hitung() << endl; cout << hitung() << endl; } int hitung(void) { static int hitung = 0; hitung++; return(hitung); }
Fungsi yang saling memanggil foo1 … foo2() … foo2 … foo1() …
Fungsi Ganda char *ayam(int generasi) { if (generasi == 0) return(“Ayam!"); else return(telur(generasi-1)); } • char *telur(int generasi ) { • if (generasi == 0) • return(“Telur!"); • else • return(ayam(generasi-1)); • }
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); }
Rekursi • Fungsi yang dapat memanggil dirinya sendiri disebut dengan rekursi. • Rekursi sangat berguna – kadangkala untuk mengekspresikan komputasi rekursif kompleks.
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)); }
Contoh lainnya - Perhitungan Faktorial int faktorial(int x) { if (x == 1) return(1); else return(x * faktorial(x-1)); }
Mendesain Fungsi Rekursif • Definisikan “proses dasar” • Situasi ketika fungsi tidak memanggil dirinya sendiri. • Definisikan “langkah rekursif” • Menghitung nilai balikan bantuan dari fungsi tersebut.
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)
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.
n n Rekursi: Topik Tes yang Menarik • Tuliskan fungsi rekursif C++ yang dapat menghitung area persegi nxn. Proses dasar: n=1 area=1 Langkah rekursif: area = n+n-1+area(n-1)
Fungsi Area Rekursif int area(int n) { if (n == 1) return(1); else return(n + n - 1 + area(n-1)); }
Latihan Rekursif • Tuliskan suatu fungsi yang dapat mencetak segitiga: segitiga(4); segitiga(5); * * *** *** ***** ***** ******* ******* *********
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.
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.
Deklarasi Variabel Referensi • Untuk mendeklarasikan variabel referensi, awali nama variabel dengan “&” int &foo; double &blah; char &c;
Contoh Variabel Referensi int hitung; int &sesuatu = hitung; // sesuatu sama dengan variabel hitung hitung = 1; cout <<“sesuatu adalah “<<sesuatu<< endl; sesuatu++; cout << “hitung adalah “ <<hitung<< endl;
Parameter Referensi • Kita dapat mendeklarasikan parameter referensi. void tambah10(int &x) { x = x+10; } … tambah10(hitung); Parameter merupakan referensi
Contoh berguna dari Referensi void tukar(int &x, int &y) { int sementara; sementara = x; x = y; y = sementara; }