BAB V
FUNGSI
Dengan menggunakan pow ekspresi (2, 3), main memanggil fungsi pow, memintanya
untuk menghitung pangkat 23. Fungsi main untuk sementara ditangguhkan. Instruksi dari fungsi
pow mengeksekusi dan menghitung hasilnya. Fungsi pow mengembalikan hasilnya (yaitu, nilai
8) kembali ke main, dan fungsi main melanjutkan eksekusi (lihat Gambar 5.1).
Fungsi-129
Pemrograman C++
Ketika fungsi lain memanggil fungsi pow, ia menyediakan "input", seperti ekspresi 2 dan
3 pada pow (2, 3). Ungkapan ini disebut argumen. Terminologi ini menghindari kebingungan
dengan input lain, seperti yang dipandu oleh pengguna manusia. Demikian pula, "output" yang
dihitung fungsi pow disebut nilai pengembalian (return value). Fungsi dapat memiliki banyak
argumen, namun hanya memiliki satu nilai pengembalian. Perhatikan bahwa nilai pengembalian
suatu fungsi dikembalikan ke fungsi pemanggil, tidak ditampilkan di layar. Misalnya, program
Anda berisi pernyataan:
double z = pow(2, 3);
Argumen dipasok saat sebuah fungsi dipanggil. nilai kembalian adalah hasil
yang dihitung fungsi.
Ketika fungsi pow mengembalikan hasilnya, nilai kembalian disimpan dalam variabel z.
Jika kita ingin nilai ditampilkan, Anda perlu menambahkan pernyataan seperti cout << z.
Fungsi-130
Pemrograman C++
Pada titik ini, kita mungkin bertanya-tanya bagaimana fungsi pow melakukan tugasnya.
Sebagai contoh, bagaimana pow (2, 3) menghitung bahwa 23 adalah 8? Dengan mengalikan 2 × 2
× 2? Dengan logaritma? Untungnya, sebagai pengguna fungsi, kita tidak perlu tahu bagaimana
fungsi diimplementasikan. Kita hanya perlu mengetahui spesifikasi fungsinya: Jika kita
memberikan argumen x dan y, fungsi mengembalikan xy. Insinyur menggunakan istilah kotak
hitam (black boxes) untuk perangkat dengan spesifikasi tertentu namun tidak diketahui
implementasinya. Kita bisa menganggap pow sebagai kotak hitam, seperti yang ditunjukkan
pada Gambar 5.2.
Bila kita merancang fungsi kita sendiri, kita akan ingin menjadikannya sebagai kotak
hitam untuk programmer lainnya. Mereka programmer ingin menggunakan fungsi kita tanpa
mengetahui apa yang terjadi di dalam. Bahkan jika kita adalah satu-satunya orang yang
mengerjakan sebuah program, membuat setiap fungsi menjadi kotak hitam terbayar: ada sedikit
rincian yang perlu kita ingat.
Fungsi-131
Pemrograman C++
Meski termostat biasanya berwarna putih, Anda bisa menganggapnya sebagai kotak
hitam. Masukannya adalah suhu yang diinginkan, dan outputnya adalah sinyal pemanas atau AC.
Masukkan semua informasi ini bersama-sama untuk membentuk baris pertama definisi
fungsi:
double volume_kubus(double panjang_sisi)
Selanjutnya, tentukan badan fungsi: pernyataan yang dieksekusi saat fungsi dipanggil.
Saat menentukan sebuah fungsi, Anda memberi nama untuk fungsi tersebut, sebuah
variabel untuk setiap argumen, dan jenis untuk hasilnya.
Fungsi-132
Pemrograman C++
Volume sebuah kubus dari sisi panjang s adalah s × s × s. Namun, untuk kejelasan yang
lebih besar, variabel parameter kita disebut panjang_sisi, bukan s, jadi kita perlu menghitung
panjang_sisi * panjang_sisi * panjang_sisi.
Kita akan menyimpan nilai ini dalam variabel yang disebut volume:
double volume = panjang_sisi * panjang_sisi* panjang_sisi;
Tubuh sebuah fungsi tertutup dalam kurung kurawal. Berikut adalah fungsi yang lengkap:
double volume_kubus (double panjang_sisi)
{
double volume = panjang_sisi * panjang_sisi* panjang_sisi;
return volume;
}
atau
double volume_kubus (double panjang_sisi)
{
return panjang_sisi * panjang_sisi* panjang_sisi;
}
Mari kita gunakan fungsi ini. Kami akan menyediakan fungsi utama yang memanggil
fungsi volume_kubus dua kali.
int main ()
{
double hasil1 = volume_kubus (2);
double hasil2 = volume_kubus (10);
cout << "Sebuah kubus dengan panjang sisi 2 memiliki volume" << hasil1 << endl;
cout << "Sebuah kubus dengan panjang sisi 10 memiliki volume" << hasil2 <<
endl;
return 0;
}
Bila fungsi dipanggil dengan argumen yang berbeda, fungsi mengembalikan hasil yang
berbeda. Perhatikan panggilan volume_kubus (2). Argumen 2 sesuai dengan variabel parameter
panjang_sisi. Oleh karena itu, dalam panggilan ini, panjang_sisi adalah 2. Fungsi menghitung
Fungsi-133
Pemrograman C++
Contoh:
// Program latihan 5-1.cpp, Program fungsi
// Program yang terdiri dari 2 fungsi data konstanta
// program menghitung isi kubus
#include <iostream>
#include <iomanip>
using namespace std;
/* menghitung volume sebuah kubus.
@parameter panjang_sisi adalah panjang sisi kubus
@return volume */
Fungsi-134
Pemrograman C++
return volume;
// return panjang_sisi * panjang_sisi * panjang_sisi;
}
// Fungsi utama atau fungsi main
int main()
{
double hasil1 = volume_kubus(2);
double hasil2 = volume_kubus(10);
double hasil3 = volume_kubus(5);
cout << "\n\t Program Menghitung Volume Kubus\n" << endl;
cout << "\tKubus panjang sisi 2 memiliki volume : " << setw(4) << hasil1 << endl;
cout << "\tKubus panjang sisi 10 memiliki volume: " << setw(4) << hasil2 << endl;
cout << "\tKubus panjang sisi 5 memiliki volume : " << setw(4) << hasil3 << endl;
cout << “\n\t”;
system("PAUSE");
return 0;
}
Jalan program :
Contoh latihan 5-1a dibawah dengan 3 data yang berbeda yaitu panjang, lebar dan tinggi.
Contoh:
// program latihan5-1-1.cpp
// Program fungsi
// Program yang terdiri dari 2 fungsi variable lebih dari 1
// program menghitung isi ruang ruang
#include <iostream>
#include <iomanip>
using namespace std;
/* menghitung volume sebuah ruang.
@parameter panjang, lebar, tinggi
@return volume */
Fungsi-135
Pemrograman C++
int main()
{
double hasil1=0, hasil2=0, hasil3=0;
hasil1 = volume_ruang (5,2,3);
hasil2 = volume_ruang (10,7,4);
hasil3 = volume_ruang (7,5,3);
cout << "\n\tMenghitung Volume Ruangan" << endl;
cout << "\tDimensi adalah Panjang, Lebar, Tinggi\n" << endl;
cout << "\tRuang dengan dimensi 5,2,3 memiliki volume : " << setw(4) << hasil1
<< endl;
cout << "\tRuang dengan dimensi 10,7,4 memiliki volume : " << setw(4) << hasil2
<< endl;
cout << "\tRuang dengan dimensi 7,5,3 memiliki volume : " << setw(4) << hasil3
<< endl;
cout << “\n\t”;
system("PAUSE");
return 0;
}
Jalan program :
Gaya dokumentasi khusus ini dipinjam dari bahasa pemrograman Java. Ini banyak
didukung oleh alat C++. Baris pertama dari komentar tersebut menggambarkan tujuan fungsi.
Setiap klausa @parameter menjelaskan parameter varibel dan klausa @return menggambarkan
Fungsi-136
Pemrograman C++
nilai pengembalian.
Perhatikan bahwa komentar fungsi tidak mendokumentasikan pelaksanaannya
(bagaimana fungsinya melakukan apa yang dilakukannya) melainkan desainnya (fungsinya,
masukan, dan hasilnya). Komentar tersebut memungkinkan pemrogram lain untuk
menggunakan fungsi tersebut sebagai "kotak hitam".
Fungsi komentar menjelaskan tujuan fungsi, arti dari variabel parameter dan nilai
kembali, serta persyaratan khusus.
Gambar 5.5. Resep untuk pai buah bisa dikatakan menggunakan jenis buah apapun. Di sini,
"buah" adalah contoh dari variabel parameter. Apel dan ceri adalah contoh argumen.
Fungsi-137
Pemrograman C++
Variabel parameter diinisialisasi dengan nilai argumen yang dilewatkan dalam panggilan.
Fungsi return. Semua variabelnya dihapus. Nilai kembalian ditransfer ke pemanggil, yaitu
Fungsi-138
Pemrograman C++
Sekarang perhatikan apa yang terjadi dalam volume_kubus panggilan berikutnya (10).
Variabel parameter baru dibuat. (Ingat bahwa variabel parameter sebelumnya telah dihapus saat
panggilan pertama ke volume_kubus dikembalikan.) Diinisialisasi dengan argumen 10, dan
pengulangan proses. Setelah pemanggilan fungsi kedua selesai, variabel-variabelnya akan
dihapus lagi.
Seperti variabel lainnya, variabel parameter hanya dapat disetel ke nilai tipe yang
kompatibel. Sebagai contoh, variabel parameter panjang_sisi dari fungsi volume_kubus memiliki
tipe double. Hal ini berlaku untuk memanggil volume_kubus (2.0) atau volume_kubus (2).
Dalam panggilan terakhir, bilangan bulat 2 secara otomatis dikonversi ke nilai ganda 2.0.
Namun, sebuah panggilan volume_kubus ("dua") tidak legal.
Jika fungsi dipanggil dengan nilai negatif untuk panjang_sisi, maka fungsi return 0 dan
sisa fungsinya tidak dieksekusi (Lihat gambar 5.7).
Fungsi-139
Pemrograman C++
Contoh:
// program latihan5-2.cpp
// Program fungsi data dibatasi yang benar saja yang di proses
// Program yang teridiri dari 2 fungsi
// program menghitung isi kubus input nilai negatif
#include <iostream>
#include <iomanip>
using namespace std;
/* menghitung volume sebuah kubus.
@parameter panjang_sisi adalah panjang sisi kubus
@return volume */
Fungsi-140
Pemrograman C++
cout << "\tKubus dengan panjang sisi -2 memiliki volume : " << setw(5) << hasil1
<< endl;
cout << "\tKubus dengan panjang sisi 10 memiliki volume : " << setw(5) << hasil2
<< endl;
cout << "\tKubus dengan panjang sisi -5 memiliki volume : " << setw(5) << hasil3
<< endl;
cout << "\n\t";
system("PAUSE");
return 0;
}
Jalan program :
Contoh latihan 5-2a dibawah dengan 3 data yang berbeda yaitu panjang, lebar dan tinggi.
Contoh:
// program latihan5-2-1.cpp
// Program fungsi
// Program yang teridiri dari 2 fungsi
// program menghitung isi ruang nilai negatif
#include <iostream>
#include <iomanip>
using namespace std;
/* menghitung volume sebuah ruang.
@parameter panjang, lebar, tinggi
@return volume */
Fungsi-141
Pemrograman C++
{
if (panjang <0 || lebar <0 || tinggi <0)
{
return 0;
}
double volume = panjang * lebar * tinggi;
return volume;
//return panjang * lebar * tinggi;
}
Jalan program :
Jika Anda lebih memilih pendekatan ini, silakan menggunakannya di program Anda.
Anda hanya perlu menyadari satu kelemahan. Kapan pun Anda mengubah nama fungsi atau
salah satu jenis parameter, Anda harus memperbaikinya di kedua tempat: dalam deklarasi dan
definisi.
Penting agar setiap cabang fungsi mengembalikan nilai. Perhatikan fungsi yang salah berikut ini:
double volume_kubus (double panjang_sisi)
{
Fungsi-142
Pemrograman C++
if (panjang_sisi> = 0)
{
return panjang_sisi * panjang_sisi * panjang_sisi;
} // Kesalahan
}
Misalkan Anda memanggil volume_kubus dengan nilai negatif untuk panjang sisi. Tentu
saja, Anda tidak seharusnya menyebutnya, tapi mungkin itu akibat kesalahan pengkodean.
Karena jika kondisi tidak benar, pernyataan return tidak dijalankan. Namun, fungsinya harus
mengembalikan sesuatu.
Contoh:
// Program latihan5-2-2.cpp, Program fungsi
// Program yang teridiri dari 2 fungsi
// program menghitung isi kubus dengan nilai yang salah
#include <iostream>
#include <iomanip>
using namespace std;
Fungsi-143
Pemrograman C++
Jalan program :
Bergantung pada situasinya, compiler mungkin menandai ini sebagai kesalahan, atau
fungsinya bisa mengembalikan nilai acak. Melindungi terhadap masalah ini dengan
mengembalikan beberapa nilai aman:
double volume_kubus (double panjang_sisi)
{
If (panjang_sisi> = 0)
{
return panjang_sisi * panjang_sisi * panjang_sisi;
}
return 0;
}
Pernyataan terakhir dari setiap fungsi seharusnya berupa pernyataan return_s. Hal ini
memastikan bahwa beberapa nilai akan kembali saat fungsi mencapai akhir.
Untuk data variabel maka program latihan 5-2 atas dapat diubah seperti program
latihan5-2-3 dibawah:
Contoh:
// program latihan5-2-3.cpp
// Program fungsi data dibatasi yang benar saja yang di proses
// Program yang terdiri dari 2 fungsi data variabel
// program menghitung isi kubus
#include <iostream>
#include <iomanip>
using namespace std;
/*menghitung volume sebuah kubus.
@parameter panjang_sisi adalah panjang sisi kubus
@return volume */
Fungsi-144
Pemrograman C++
return 0;
}
double volume = panjang_sisi * panjang_sisi * panjang_sisi;
return volume;
}
// Fungsi utama atau fungsi main
int main()
{
double sisi1=0, sisi2=0, sisi3=0;
char ulang;
do
{
system("cls");
cout << "\tPROGRAM MENGHITUNG VOLUME KUBUS" << endl << endl;
cout << "\t===============================" << endl;
cout << "\tMasukan sisi kubus 1 : "; cin >> sisi1;
cout << "\tMasukan sisi kubus 2 : "; cin >> sisi2;
cout << "\tMasukan sisi kubus 3 : "; cin >> sisi3;
double hasil1 = volume_kubus(sisi1);
double hasil2 = volume_kubus(sisi2);
double hasil3 = volume_kubus(sisi3);
cout << fixed << setprecision (1);
cout << "\tKubus dengan panjang sisi " << setw(5) << sisi1
<< " memiliki volume : " << setw(8) << hasil1 << endl;
cout << "\tKubus dengan panjang sisi " << setw(5) << sisi2
<< " memiliki volume : " << setw(8) << hasil2 << endl;
cout << "\tKubus dengan panjang sisi " << setw(5) << sisi3
<< " memiliki volume : " << setw(8) << hasil3 << endl;
cout << "\n\n\tIngin Kembali ke Menu pilihan lagi? (Y/T)";
cin >> ulang;
}
while(ulang=='Y' || ulang=='y');
cout << "\n\t";
system("PAUSE");
return 0;
}
Untuk data variabel maka program latihan 5-2a atas dapat diubah seperti program
latihan5-2-4 dibawah:
// program latihan5-2-4.cpp
// Program fungsi data dibatasi yang benar saja yang di proses
// Program yang teridiri dari 2 fungsi
// program menghitung isi ruang
#include <iostream>
#include <iomanip>
using namespace std;
/* menghitung volume sebuah ruang.
@parameter panjang, lebar, tinggi adalah panjang, lebar, tinggi ruang
@return volume */
Fungsi-145
Pemrograman C++
Fungsi-146
Pemrograman C++
Inilah contoh khas. Tugas kita adalah mencetak string di dalam kotak, seperti ini:
---------
|Hello|
---------
Namun, string yang berbeda bisa diganti untuk kata Hello. Fungsi untuk tugas ini bisa jadi
didefinisikan sebagai berikut:
void string_kotak (string str)
Sekarang kita mengembangkan fungsi tubuh dengan cara yang biasa, dengan merumuskan
metode umum untuk menyelesaikan tugas.
• Cetak baris yang berisi karakter - sebanyak n+2 kali, di mana n adalah panjang string.
• Cetak sebuah baris berisi string, dikelilingi dengan sebuah ! ke kiri dan kanan
• Cetak baris lain yang berisi karakter – sebanyak n+2 kali.
Perhatikan bahwa fungsi ini tidak menghitung nilai apapun. Ini melakukan beberapa
tindakan dan kemudian kembali ke pemanggil. (Lihat contoh program ch05 / box.cpp.) Karena
Fungsi-147
Pemrograman C++
tidak ada nilai pengembalian, Anda tidak dapat menggunakan box_string dalam sebuah ekspresi.
Anda bisa memanggil:
string_kotak ("Hello");
Contoh:
//program latihan5-3.cpp
// program tanpa nilai return
// program membuat string
#include <iostream>
#include <string>
using namespace std;
/* mencetak sebuah string dalam sebuah kotak.
@parameter str adalah string untuk dicetak */
void string_kotak(string kata)
{
int n = kata.length();
cout << "\t";
for (int i = 0; i < n + 4; i++)
{ cout << "-"; }
cout << endl;
cout << "\t| " << kata << " |" << endl;
cout << "\t";
for (int i = 0; i < n + 4; i++)
{ cout << "-"; }
cout << endl;
}
Jalan program :
Fungsi-148
Pemrograman C++
Contoh:
// program latihan5-3a.cpp
// program tanpa nilai return
// program membuat string
// menggunakan escape sequence
#include <iostream>
#include <string>
using namespace std;
/* mencetak sebuah string dalam sebuah kotak.
@parameter str adalah string untuk dicetak */
Jalan program :
Fungsi-149
Pemrograman C++
Contoh:
//program latihan5-3b.cpp
// program membuat string
// program tanpa nilai return
// menggunakan escape sequence
#include <iostream>
#include <string>
using namespace std;
/* mencetak sebuah string dalam sebuah kotak.
@parameter str adalah string untuk dicetak */
void string_kotak(string kata)
{
int panjang_kata = kata.length();
if (panjang_kata==0)
{
return;
}
cout << "\n\t\xDA";
for (int i = 0; i < panjang_kata+2; i++) { cout << "\xC4"; }
cout << "\xBF"; cout << endl;
cout << "\t\xB3 " << kata << " \xB3" << endl;
cout << "\t\xC0";
for (int i = 0; i < panjang_kata+2; i++) { cout << "\xC4"; }
cout << "\xD9"; cout << endl;
}
//Fungsi utama/main()
int main()
{
char pilih, ulang;
do
{
// Input - pilihan
system("cls");;
cout << "\n";
cout << "\n\tJika ingin hanya menampilkan salah satu";
cout << "\n\tPROGRAM KOTAK";
cout << "\n\t1. Kotak Hello";
Fungsi-150
Pemrograman C++
Jika kita ingin kembali dari fungsi void sebelum mencapai akhir, Anda menggunakan
pernyataan pengembalian tanpa nilai. Sebagai contoh,
void string_kotak(string kata)
{
int panjang_kata = kata.length();
if (panjang_kata == 0)
{
return; // segera kembali
}
...
}
Fungsi-151
Pemrograman C++
Setiap variabel volume didefinisikan dalam fungsi terpisah, dan cakupannya tidak tumpang
tindih.
Gambar 5.8. Dengan cara yang sama bahwa ada jalan bernama "Jalan Utama/
Main Street" di berbagai kota, program C ++ dapat memiliki banyak variabel
dengan nama yang sama.
Fungsi-152
Pemrograman C++
Tidaklah sah untuk menentukan dua variabel dengan nama yang sama dalam lingkup
yang sama. Misalnya, berikut ini tidak legal:
int main()
{
double volume = volume_kubus(2);
double volume = volume_kubus(10);
// ERROR: tidak dapat menentukan variabel volume lain dalam lingkup ini
...
}
Namun, kita dapat menentukan variabel lain dengan nama yang sama di blok bertingkat.
Di sini, kita mendefinisikan dua variabel yang disebut jumlah.
double penarikan(double saldo, double jumlah)
{
if (...)
{
double jumlah = 10; // variabel lain bernama jumlah
...
}
...
}
Ruang lingkup variabel parameter jumlah adalah keseluruhan fungsi, kecuali di dalam
blok nested blok/ blok bersarang. Di dalam blok bersarang, jumlah mengacu pada variabel yang
didefinisikan di blok tersebut. Kita mengatakan bahwa variabel didalam blok membayangi
variabel yang didefinisikan di blok luar. Kita harus menghindari situasi yang berpotensi
membingungkan ini dalam fungsi yang kita tulis, cukup dengan mengganti nama salah satu
variabel.
Sebuah variabel dalam bayangan nested block adalah variabel dengan nama
yang sama di blok luar.
Variabel yang didefinisikan di dalam fungsi disebut variabel lokal. C++ juga
mendukung variabel global: variabel yang didefinisikan di luar fungsi. Variabel global dapat
dilihat oleh semua fungsi yang ditentukan setelahnya. Misalnya, header <iostream>
mendefinisikan variabel global cin dan cout.
Variabel lokal didefinisikan di dalam sebuah fungsi, variabel global
didefinisikan di luar fungsi.
Fungsi-153
Pemrograman C++
Ruang lingkup variable saldo membentang pada fungsi fungsi penarikan dan fungsi
utama. Umumnya, variabel global bukanlah ide bagus. Ketika beberapa fungsi memperbarui
variabel global, hasilnya bisa sulit diprediksi. Terutama dalam program yang lebih besar yang
dikembangkan oleh banyak program, sangat penting bahwa efek dari masing-masing fungsi
menjadi jelas dan mudah dipahami. Kita harus menghindari variabel global dalam program
kita.
Hindari variabel global dalam program.
Fungsi-154
Pemrograman C++
Contoh:
//Program latihan5-4.cpp
// program tabungan
// menggunakan fungsi
#include <iostream>
using namespace std;
Fungsi-155
Pemrograman C++
Jalan program :
Mari kita berjalan melalui fungsi call tarikan (tabungan_harry, 100) -lihat Gambar 5.9.
Ketika fungsi dimulai, parameter variabel saldo dibuat dan isi ke nilai yang sama dengan
tabungan_harry, dan jumlah diisi ke 100 . Kemudian saldo dimodifikasi . Tentu saja,
modifikasi itu tidak berpengaruh pada tabungan_harry, karena saldo adalah variabel terpisah.
Ketika fungsi return, saldo dilupakan, dan tidak ada uang yang ditarik dari tabungan_harry
.
Fungsi-156
Pemrograman C++
Parameter variabel saldo disebut parameter nilai, karena diinisialisasi dengan nilai
argumen yang diberikan. Semua fungsi yang telah kita tulis sejauh ini menggunakan parameter
nilai. Dalam situasi ini, kita hanya tidak ingin saldo memiliki nilai yang sama dengan
tabungan_harry. Kita menginginkan saldo untuk mengacu pada variabel tabungan_harry
aktual (atau tabungan_joe atau variabel apa pun yang disertakan dalam panggilan tersebut). Isi
variabel itu harus diperbarui.
Kita menggunakan parameter referensi saat kita ingin memperbarui variabel yang
diberikan dalam pemanggilan fungsi. Ketika kita membuat saldo menjadi parameter referensi,
maka saldo bukanlah variabel baru namun mengacu pada variabel yang ada. Perubahan saldo
sebenarnya adalah perubahan pada variabel yang mengacu pada panggilan itu.
Fungsi-157
Pemrograman C++
Untuk menunjukkan parameter referensi, Anda menempatkan sebuah & setelah jenis
variabel.
void tarikan(double& saldo, double jumlah)
Tipe double& dibaca "referensi ke double" atau, disingkat, "double ref". Fungsi
tarikan sekarang memiliki dua variabel parameter: satu dari tipe "double ref" dan parameter
nilai lainnya tipe double. Tubuh fungsi tidak berubah. Yang telah berubah adalah arti dari tugas
ke variabel saldo.
Tugas
saldo = saldo - jumlah;
Fungsi-158
Pemrograman C++
tarikan(tabungan_harry,100); saldo =
jumlah=
Misalnya, panggilan
tarikan (tabungan_harry, 100);
Ubahlah variabel tabungan_harry, dan panggil.
tarikan (tabungan_sally, 150);
Fungsi-159
Pemrograman C++
Argumen untuk parameter referensi harus selalu berupa variabel. Ini akan menjadi
kesalahan untuk memasok bilangan:
tarikan (1000, 500); // Error: argumen untuk parameter referensi harus berupa variabel
Contoh:
//program latihan5-4a.cpp
// program tabungan
// menggunakan fungsi
#include <iostream>
using namespace std;
Fungsi-160
Pemrograman C++
Jalan program :
Jika kita ingin penarikan tabungan berdasarkan input yang kita berikan maka
program diatas dapat dimodifikasi seperti contoh berikut ini.
Contoh:
//program latihan5-4b.cpp
// program tabungan
// menggunakan fungsi dengan input variabel
#include <iostream>
using namespace std;
/** penarikan jumlah dari saldo yang diberikan, atau penarikan
adalah sebuah hukuman/pinalti jika saldo tidak mencukupi.
@parameter saldo adalah saldo untuk melakukan penarikan
@parameter jumlah adalah jumlah untuk penarikan */
void tarikan(double& saldo, double jumlah)
{
const double PENALTY = 10;
if (saldo >= jumlah)
{
Fungsi-161
Pemrograman C++
Fungsi-162
Pemrograman C++
Contoh:
// Program latihan5-5a.cpp
// Program menggunakan fungsi, input dan proses di fungsi luas()
// Program menghitung luas bujursangkar
Fungsi-163
Pemrograman C++
#include <iostream>
using namespace std;
// Fungsi menentukan luas bujur sangkar Nama fungsi luas()
double luas()
{
double sisi;
cout << "\n\tMasukkan sisi = ";
cin >> sisi;
return(sisi*sisi);
}
// Fungsi main ()
int main()
{
double luas_bs, sisi_bs;
char ulang;
do
{
system("cls");
cout << "\n\tProgram menghitung luas bujursangkar";
cout << "\n\t====================================\n\n";
// Menghitung luas bujursangkar
luas_bs=luas();
cout << "\n\n\tLuas Bujursangkar = " << luas_bs;
cout << "\n\n\tIngin menghitung lagi?(Y/T): ";
cin >> ulang;
cout << endl; cout << endl;
}
while(ulang=='Y' || ulang=='y');
system("PAUSE");
return 0;
}
Untuk input variable yang lebih dari satu (dua, tiga dan sebagainya) maka contoh
program berikut dapat kita pelajari:
Contoh:
// program latihan 5-6.cpp
// Program menggunakan fungsi, input di fungsi main() dan
// proses di fungsi luas()
// Program menghitung luas segiempat
#include <iostream>
using namespace std;
// Fungsi menentukan luas segiempat Nama Fungsi luas()
double luas(double panjang, double lebar)
{
return(panjang*lebar);
}
// fungsi main()
main()
Fungsi-164
Pemrograman C++
{
double panjang_segiempat,lebar_segiempat,luas_segiempat;
double panjang_segiempat2,lebar_segiempat2,luas_segiempat2;
double panjang_segiempat3,lebar_segiempat3,luas_segiempat3;
char ulang;
do
{
system("cls");
cout << "\n\tProgram menghitung luas segiempat\n";
cout << "\t=================================\n\n";
// Input panjang dan lebar segiempat */
cout << "\tPanjang 1: ";
cin >> panjang_segiempat; cout << endl;
cout << "\tLebar 1: ";
cin >> lebar_segiempat;
cout << "\tPanjang 2: ";
cin >> panjang_segiempat2; cout << endl;
cout << "\tLebar 2: ";
cin >> lebar_segiempat2;
cin >> panjang_segiempat3; cout << endl;
cout << "\tLebar 3: ";
cin >> lebar_segiempat3;
// Menghitung luas segiempat
luas_segiempat=luas(panjang_segiempat,lebar_segiempat);
luas_segiempat2=luas(panjang_segiempat2,lebar_segiempat2);
luas_segiempat3=luas(panjang_segiempat3,lebar_segiempat3);
Contoh:
// Program latihan5-6a.cpp
// Program menggunakan fungsi, input dan proses di fungsi luas()
// Program menghitung luas segiempat */
#include <iostream>
using namespace std;
// Fungsi menentukan luas segiempat Nama Fungsi luas()
double luas()
{
double panjang=0, lebar=0;
Fungsi-165
Pemrograman C++
Contoh:
// Program latihan5-6b.cpp
// Program menggunakan fungsi, input di fungsi main() dan
// proses di fungsi luas
// Program menghitung luas segiempat */
#include <iostream>
#include <iomanip>
using namespace std;
// Fungsi menentukan luas segiempat Nama Fungsi luas()
double luas(double panjang , double lebar)
{
return(panjang*lebar);
}
// fungsi main()
main()
{
Fungsi-166
Pemrograman C++
double panjang_segiempat,lebar_segiempat,luas_segiempat;
double panjang_segiempat2,lebar_segiempat2,luas_segiempat2;
char ulang;
do
{
system("cls");
cout << "\n\tProgram menghitung luas 2 segiempat";
cout << "\n\t===================================";
// Input panjang dan lebar segiempat */
cout << "\n\n\tPanjang segiempat 1 = ";
cin >> panjang_segiempat;
cout << "\tLebar segiempat 1 = ";
cin >> lebar_segiempat;
cout << "\n\n\tPanjang segiempat 2 = ";
cin >> panjang_segiempat2;
cout << "\tLebar segiempat 2 = ";
cin >> lebar_segiempat2;
// Menghitung luas segiempat
luas_segiempat=luas(panjang_segiempat,lebar_segiempat);
luas_segiempat2=luas(panjang_segiempat2,lebar_segiempat2);
Fungsi-167
Pemrograman C++
[][]
[][][]
[][][][]
Segitiga yang diberikan di atas dicetak dengan memanggil cetak_segitiga (4). Untuk
melihat bagaimana rekursi membantu, perhatikan bagaimana sebuah segitiga dengan panjang sisi
4 dapat diperoleh dari segitiga dengan panjang sisi 3.
[]
[][]
[][][]
[][][][]
Hanya ada satu masalah dengan ide ini. Bila panjang sisi adalah kecil dari 1, kita tidak
mau memanggil cetak_segitiga (0), cetak_segitiga(-1), dan seterusnya. Solusinya hanya untuk
Fungsi-168
Pemrograman C++
memperlakukan ini sebagai kasus khusus, dan jangan sampai mencetak apapun ketika
panjangnya kurang dari 1.
void cetak_segitiga(int panjang_sisi)
{
if (panjang_sisi < 1)
{
return;
}
cetak_segitiga (panjang_sisi - 1);
for (int i = 0; i < panjang_sisi; i++)
{
cout << "[]";
}
cout << endl;
}
Lihatlah fungsi cetak_segitiga sekali lagi dan perhatikan betapa masuk akalnya itu. Jika
panjang sisi adalah 0, tidak ada yang perlu dicetak. Bagian selanjutnya sama masuk akal. Cetak
segitiga yang lebih kecil dan jangan pikirkan mengapa hal itu berhasil. Kemudian cetak deretan
[]. Yang jelas, hasilnya adalah segitiga dari ukuran yang diinginkan.
Ada dua persyaratan utama untuk memastikan bahwa rekursi berhasil:
• Setiap panggilan rekursif harus menyederhanakan tugas dengan cara tertentu.
• Harus ada kasus khusus untuk menangani tugas yang paling sederhana secara langsung.
Fungsi cetak_segitiga memanggil dirinya sendiri lagi dengan panjang sisi yang lebih kecil
dan lebih kecil. Akhirnya panjang sisi harus mencapai 0, dan fungsi berhenti memanggil dirinya
sendiri.
Inilah yang terjadi saat kita mencetak segitiga dengan panjang sisi 4.
• Panggil cetak_segitiga(4) panggil cetak_segitiga(3).
• Panggil cetak_segitiga(3) panggil cetak_segitiga(2).
• Panggil cetak_segitiga(2) panggil cetak_segitiga(1).
• Panggil cetak_segitiga(1) panggil cetak_segitiga(0).
• Panggil cetak_segitiga(0) kembali, tidak melakukan apapun.
• Panggil cetak_segitiga(1) cetak [].
• Panggil cetak_segitiga(2) cetak [] [].
• Panggil cetak_segitiga(3) cetak [] [] [].
Fungsi-169
Pemrograman C++
Pola panggilan fungsi rekursif terlihat rumit, dan kunci sukses desain fungsi rekursif
bukan untuk memikirkannya.
Contoh:
// Program Latihan 5-9.cpp
// Program menggunakan fungsi rekursif
// Program segitiga
#include <iostream>
using namespace std;
Fungsi-170
Pemrograman C++
Jalan program :
Rekursi tidak terlalu diperlukan untuk mencetak bentuk segitiga. Anda dapat
menggunakan loop bersarang, seperti ini:
for (int i = 0; i <panjang_sisi; i ++)
{
for (int j = 0; j <=i; j ++)
{
cout << "[]";
}
cout << endl;
}
Contoh:
// Program Latihan 5-9a.cpp
// Program menggunakan fungsi dengan nested for
// Program segitiga
#include <iostream>
using namespace std;
/* cetak segitiga dengan memberikan panjang sisi
@parameter panjang_sisi adalah panjang sisi (jumlah dari [] sebagai dasar) */
Fungsi-171
Pemrograman C++
//fungsi utama/main()
int main()
{
char ulang;
do
{
system("cls");
cout << "\n\tPROGRAM CETAK SEGITIGA";
cout << "\n\t======================\n";
cout << "\n\tMasukkan Panjang Sisi : ";
int input;
cin >> input;
cout << "\n";
cetak_segitiga(input);
cout << "\n\tIngin menghitung lagi?(Y/T): ";
cin >> ulang;
cout << endl; cout << endl;
}
while(ulang=='Y' || ulang=='y');
cout << "\n\t";
system("PAUSE");
return 0;
}
Jalan program :
Namun, pasangan loop ini agak rumit. Banyak orang menganggap solusi rekursif lebih
sederhana untuk dipahami.
Fungsi-172