Fungsi
Pada Bab 1, Anda telah belajar bahwa
sebuah program C++ merupakan koleksi yang terdiri-dari fungsi-fungsi. Salah
satu fungsi adalah main. Program
pada Bab 1 sampai Bab 4 hanya menggunakan fungsi main; instruksi-instruksi pemrograman dipaketkan ke dalam satu
fungsi. Teknik ini hanya baik untuk program pendek. Untuk program yang besar,
hal ini tidak praktis (meskipun memungkinkan) untuk menempatkan keseluruhan
instruksi pemrograman ke dalam satu fungsi, seperti yang sebentar lagi Anda
temui. Anda harus belajar memecahkan permasahalan menjadi potongan-potongan
terkelolakan (manageable). Bab ini
pertama-tama akan mendiskusikan beberapa fungsi yang sebelumnya telah
didefinisikan dan kemudian mendiskusikan beberapa fungsi terdefinisi-pengguna.
Fungsi Pustaka (Terpradefinisi)
Sebelum secara formal mendiskusikan
fungsi-fungsi pustaka (terpradefinisi) dalam C++, akan ditinjau-ulang sebuah
konsep dari matakuliah aljabar. Dalam aljabar, sebuah fungsi dapat dipandang
sebagai suatu arutan atau hubungan antar nilai (argumen fungsi). Jadi, jika f(x) = 2x + 5, maka f(1) = 7, f(2) = 9, dan f(3) = 11,
dimana 1, 2, dan 3 adalah argumen-argumen dari f, dan 7, 9, dan 11 adalah nilai-nilai dari fungsi f.
Dalam C++, konsep sebuah fungsi, baik
terpradefinisi atau terdefinisi-pengguna, sama dengan fungsi pada aljabar.
Sebagai contoh, setiap fungsi mempunyai nama dan, bergantung pada nilai-nilai
yang dispesifikasi oleh pengguna, ia melakukan komputasi. Bagian ini
mendiskusikan perbagai fungsi pustakan C++.
Beberapa fungsi matematik
terpradefinisi dalam C++ adalah pow(x,
y), sqrt(x), dan floor(x).
Fungsi pemangkatan, pow(x, y), menghitung
; yaitu, nilai dari pow(x, y) =
. Sebagai contoh, pow(2, 3) =
= 8.0 dan pow(2.5, 3) =
= 15.625. Karena nilai dari pow(x, y) bertipe double, Anda bisa mengatakan bahwa fungsi pow bertipe double atau
bahwa fungsi pow menghasilkan sebuah nilai bertipe double. Selain itu, x
dan y disebut dengan parameter (atau
argumen) dari fungsi pow. Fungsi pow memiliki dua parameter.
Fungsi akar kuadrat, sqrt(x), menghitung akar kuadrat
tak-nagatif atas x untuk x >= 0.0. Sebagai contoh, sqrt(2.25) = 1.5. Fungsi sqrt bertipe double dan hanya memiliki satu parameter.
Fungsi floor(x) menghitung pembulatan ke bawah atas x. Sebagai contoh, floor(48.79)
adalah 48.0. Fungsi floor bertipe double dan hanya memiliki satu
parameter.
Dalam C++, fungsi-fungsi terpradefinisi
(pustaka) diorganisir menjadi beberapa pustaka terpisah. Sebagai contoh, file
header iostream memuat fungsi-fungsi
I/O, dan file header cmath memuat
fungsi-fungsi matematik. Tabel 5.1 mencantumkan beberapa fungsi terpradefinisi,
nama file header dimana tiap spesifikasi fungsi ditempatkan, dan tipe data dari
tiap parameter, dan tipe fungsi. Tipe fungsi merupakan tipe data dari nilai
akhir yang dihasilkan fungsi.
Tabel 5.1 Fungsi-Fungsi terpradefinisi
Fungsi
|
File header
|
Tujuan
|
Tipe parameter
|
Hasil
|
abs(x)
|
<cmath>
|
Menghasilkan
nilai absolut dari argumennya: abs(-7) = 7.
|
int
(double)
|
int
(double)
|
ceil(x)
|
<cmath>
|
Menghasilkan
pembulatan ke atas atas x: ceil(56.34) = 57.0
|
double
|
double
|
cos(x)
|
<cmath>
|
Menghasilkan
kosinus dari sudut x: cos(0.0) = 1.0.
|
double
(radian)
|
double
|
exp(x)
|
<cmath>
|
Menghasilkan
|
double
|
double
|
fabs(x)
|
<cmath>
|
Menghasilkan
nilai absolut dari argumennya: fabs(-5.67) = 5.67.
|
double
|
double
|
floor(x)
|
<cmath>
|
Menghasilkan
pembulatan ke atas terhadap x: floor(45.67) = 45.00.
|
double
|
double
|
islower(x)
|
<cctype>
|
Menghasilkan true jika x adalah huruf kecil; sebaliknya, ia menghasilkan false; islower(‘h’) adalah true.
|
int
|
int
|
isupper(x)
|
<cctype>
|
Menghasilkan true jika x adalah huruf besar; sebaliknya, ia menghasilkan false; isupper(‘K’) adalah true.
|
int
|
int
|
pow(x, y)
|
<cmath>
|
Menghasilkan
|
double
|
double
|
sqrt(x)
|
<cmath>
|
Menghasilkan
akar kuadrat tak-negatif atas x; x harus tak-negatif: sqrt(4.0) = 2.0.
|
double
|
double
|
tolower(x)
|
<cctype>
|
Menghasilkan
nilai huruf kecil dari x jika x adalah huruf besar; sebaliknya, ia
menghasilkan x.
|
int
|
int
|
toupper(x)
|
<cctype>
|
Menghasilkan
nilai huruf besar dari x jika x adalah huruf kecil; sebaliknya, ia
menghasilkan x.
|
int
|
int
|
Untuk menggunakan fungsi terpradefinisi
dalam sebuah program, Anda harus mencantumkan file header yang memuat
spesifikasi fungsi melalui statemen include.
Sebagai contoh, untuk menggunakan fungsi pow,
program harus mencantumkan:
#include <cmath>
Contoh 5.1 menunjukkan pada Anda
bagaiman menggunakan fungsi-fungsi terpradefinisi.
Contoh 5.1
|
|
//Bagaimana menggunakan fungsi terpradefinisi.
#include
<iostream>
#include
<cmath>
#include
<cctype>
using namespace
std;
int main()
{
int x;
double u, v;
cout
<< "Baris 1: Huruf besar a
adalah "
<< static_cast<char>(toupper('a'))
<< endl; //Baris
1
u = 4.2; //Baris
2
v = 3.0; //Baris
3
cout
<< "Baris 4: "
<< u << " dipangkat
dengan "
<< v << " =
" << pow(u, v) << endl; //Baris
4
cout
<< "Baris 5: 5.0 dipangkat
dengan 4 = "
<< pow(5.0, 4) << endl; //Baris
5
u = u +
pow(3.0, 3); //Baris
6
cout
<< "Baris 7: u = "
<< u << endl; //Baris
7
x = -15; //Baris
8
cout
<< "Baris 9: Nilai absolut
dari " << x
<< " = " << abs(x) << endl; //Baris 9
return 0;
}
Keluaran Program:
Baris 1: Huruf besar a adalah A
Baris 4: 4.2 dipangkat dengan 3 = 74.088
Baris 5: 5.0 dipangkat dengan 4 = 625
Baris 7: u = 31.2
Baris 9: Nilai absolut dari -15 = 15
Program ini bekerja sebagai berikut.
Statemen pada baris 1 menampilkan huruf besar yang berkaitan dengan ‘a’, yaitu
A. Perhatikan bahwa fungsi toupper
menghasilkan sebuah nilai int. Oleh
karena itu, nilai dari ekspresi toupper(‘a’)
adalah 65, yang merupakan sebuah nilai ASCII dari ‘A’. Untuk menampilkan A,
bukan 65, Anda perlu menerapkan operator cast,
seperti yang ditunjukkan pada statemen pada baris 1. Pada statemen pada baris
4, fungsi pow dipakai untuk
menampilkan
. Dalam terminologi C++, dikatakan bahwa fungsi pow dipanggil dengan parameter u
dan v. Pada kasus ini, nilai u dan v dilewatkan kepada fungsi pow.
Statemen-statemen lain mempunyai makna yang sama. Perhatikan bahwa program
mencantumkan file header cctype dan cmath, karena ia menggunakan
fungsi-fungsi terpradefinisi toupper,
pow, dan abs dari kedua file header tersebut.
Fungsi Terdefinisi-Pengguna
Seperi yang diilustrasikan pada contoh
5.1, penggunaan fungsi pada sebuah program sangat membantu keterbacaan program
karena hal itu dapat mereduksi kompleksitas dari fungsi main. Selain itu, begitu Anda menulis dan secara tepat menjejaknya
dengan hati-hati, Anda dapat menggunakannya di dalam program (atau
program-program lain) secara berulang kali tanpa harus menulis-ulang kode yang
sama secara berulang. Sebagai contoh, pada contoh 5.1, fungsi pow digunakan lebih dari sekali.
Karena C++ tidak menyediakan setiap
fungsi yang Anda butuhkan dan para perancang C++ mungkin tidak mengetahui
kebutuhan spesifik pengguna, maka Anda harus belajar menulis fungsi Anda
sendiri.
Fungsi terdefinisi-pengguna dalam C++
diklasifikasikan ke dalam dua kategori:
·
Fungsi pengembali-nilai
atau fungsi penghasil-nilai, yaitu fungsi yang memiliki tipe
nilai balik. Fungsi ini menghasilkan (mengembalikan) sebuah nilai dengan tipe
data tertentu menggunakan statemen return.
·
Fungsi kosong, yaitu fungsi
yang tidak memiliki tipe nilai balik. Fungsi ini tidak menggunakan statemen return.
Sisa dari bab ini akan mendiskusikan
fungsi-fungsi penghasil-nilai. Banyak konsep yang didiskusikan di sini yang
berkaitan dengan fungsi penghasil-nilai dapat pula diterapkan terhadap fungsi
kosong. Bab 6 akan menjelaskan tentang fungsi kosong.
Fungsi Penghasil-Nilai
Bagian sebelumnya telah mengenalkan
beberapa fungsi C++ terpradefinisi seperti pow,
abs, islower, dan toupper.
Masing-masing fungsi tersebut merupakan fungsi penghasil-nilai. Untuk
menggunakannya di dalam program Anda, Anda harus mengetahui nama file header
yang memuat spesifikasi fungsi. Anda perlu mencantumkan file header ini di
dalam program Anda menggunakan statemen include
dan mengetahui setiap item berikut:
1. Nama fungsi.
2. Jumlah
parameter, jika ada.
3. Tipe data tiap
parameter.
4. Tipe data dari
nilai yang dihitung (nilai balik), yaitu nilai yang dihasilkan atau
dikembalikan oleh fungsi. Tipe nilai
balik ini juga disebut dengan tipe fungsi.
Karena nilai yang dijadikan nilai balik
oleh sebuah fungsi penghasil nilai adalah unik, berikut adalah beberapa hal
yang Anda lakukan terhadap nilai tersebut:
·
Menyimpan nilai balik tersebut untuk
perhitungan yang lain.
·
Menggunakan nilai balik tersebut
untuk perhitungan yang lain.
·
Menampilkan nilai balik tersebut.
Hal ini mengindikasikan bahwa sebuah
fungsi penghasil nilai digunakan:
·
Di dalam statemen penugasan.
·
Sebagai parameter dalam pemanggilan
fungsi.
·
Di dalam statemen keluaran.
Sebelum memeriksa sintaks dari fungsi
penghasil nilai yang didefinisikan pengguna, lebih dahulu akan didiskusikan
beberapa hal yang berkaitan dengan fungsi semacam ini. Selain keempat watak
yang telah dijelaskan sebalumnya, satu hal lagi berkaitan dengan fungsi (baik
fungsi penghasil nilai maupun fungsi kosong):
5.
Kode yang diperlukan untuk
mengerjakan tugas tertentu.
Empat watak pertama membentuk apa yang dinamakan dengan
kepala fungsi (juga dikenal dengan header fungsi); watak
kelima dinamakan dengan tubuh fungsi. Kelima watak ini membentuk apa yang
dinamakan dengan definisi fungsi. Sebagai contoh, untuk fungsi abs, kepala
fungsi akan tampak seperti ini:
int abs(int angka)
Sama halnya, fungsi abs akan memiliki definisi berikut:
int abs(int angka)
{
if (angka < 0)
angka = -angka;
return angka;
}
Variabel yang dideklarasikan di dalam
kepala fungsi abs disebut dengan parameter formal dari fungsi abs. Jadi, parameter formal dari abs adalah angka.
Program pada contoh 5.1 memuat beberapa
statemen yang menggunakan fungsi pow.
Yaitu, dalam terminologi C++, fungsi pow
dipanggil beberapa kali. Nanti pada bab ini, akan didiskusikan apa yang terjadi
ketika sebuah fungsi dipanggil.
Dimisalkan bahwa kepala fungsi pow adalah:
double
pow(double basis, double eksponen)
Dari kepala fungsi pow, dapat dipahami bahwa parameter-parameter formal dari pow adalah basis dan eksponen.
Perhatikan beberapa statemen berikut:
double u = 2.5;
double v = 3.0;
double x, y;
x = pow(u, v); //Baris
1
y = pow(2.0, 3.2) + 5.1; //Baris
2
cout << u << "
dipangkat dengan 7 = " <<
pow(u, 7) << endl; //Baris 3
Pada baris 1, fungsi pow dipanggil dengan parameter u dan v. Pada kasus ini, nilai dari u
dan v dilewatkan kepada fungsi pow. Sebenarnya, nilai u disalin ke dalam basis, dan nilai v
disalin ke dalam eksponen. Variabel u dan v yang ada pada pemanggilan fungsi pow pada baris 1 disebut dengan parameter
aktual dari pemanggilan tersebut. Pada baris 2, fungsi pow dipanggil dengan parameter 2.0 dan 3.2. Pada pemanggilan ini,
nilai 2.0 disalin ke basis, dan 3.2
disalin ke eksponen. Selain itu,
pada pemanggilan fungsi pow ini,
parameter aktual adalah 2.0 dan 3.2. Sama halnya, pada baris 3,
parameter-parameter aktual dari fungsi pow
adalah u dan 7; nilai u disalin ke basis, dan 7 disalin ke eksponen.
Anda dapat secara formal memberikan dua
definisi berikut:
Parameter formal: Sebuah variabel yang
dideklarasikan pada kepala fungsi.
Parameter aktual: Sebuah variabel atau
ekspresi pada pemanggilan fungsi.
Untuk fungsi terpradefinisi, Anda hanya
perlu fokus pada keempat watak. Perusahaan perangkat lunal tidak memberikan
kode sumber, yang merupakan tubuh fungsi.
Sintaks:
Fungsi Penghasil-Nilai
Sintaks dari sebuah fungsi
penghasil-nilai adalah:
tipeFungsi namaFungsi(daftar parameter
formal)
{
statemen-statemen
}
dimana statemen-statemen merupakan statemen deklarasi dan/atau statemen
tereksekusikan. Pada sintaks ini, tipeFungsi
merupakan tipe nilai balik yang dihasilkan fungsi. tipeFungsi juga dikenal dengan tipe data atau tipe nilai balik.
Perhatikan bahwa statemen-statemen diapit oleh sepasang kurung kurawal.
Sintaks:
Daftar Parameter Formal
Sintaks dari daftar parameter formal
adalah:
tipeData pengenal, tipeData pengenal, ...
Pemanggilan
Fungsi
Sintaks untuk memanggil sebuah fungsi
penghasil-nilai adalah:
namaFungsi(daftar parameter aktual)
Sintaks:
Daftar Parameter Aktual
Sintaks dari daftar parameter aktual
adalah:
ekspresi atau variabel, ekspresi atau variabel, ...
(Pada sintaks ini, ekspresi dapat berupa nilai konstanta tunggal). Jadi, untuk
memanggil sebuah fungsi penghasil nilai, Anda perlu menyebutkan nama fungsi,
dengan parameter-parameter aktualnya (jika ada) yang diapit oleh sepasang
kurung.
Daftar parameter formal pada fungsi
bisa kosong. Namun, jika daftar parameter formal kosong, kurung tetap
dibutuhkan. Kepala fungsi dari fungsi penghasil nilai mempunyai bentuk berikut
(jika daftar parameter kosong):
tipeFunsi
namaFungsi()
Jika daftar parameter formal dari
sebuah fungsi penghasil nilai adalah kosong, maka parameter aktual juga kosong
pada pemanggilan fungsi. Pada kasus ini ( dengan daftar parameter formal
kosong), kurung kosong pada pemanggilan fungsi masih diperlukan. Jadi,
pemanggilan terhadap sebuah fungsi penghasil nilai dengan daftar parameter
formal kosong adalah:
namaFungsi()
Pada sebuah pemanggilan fungsi, jumlah
paramete aktual dan tipe data tiap parameternya harus cocok dengan
parameter-parameter formal dengan urutan yang sesuai. Yaitu, parameter aktual
dan parameter formal memiliki relasi satu-ke-satu.
Seperti disebutkan sebelumnya, fungsi
penghasil nilai dipanggil pada sebuah ekspresi. Ekspresi dapat menjadi bagian
dari sebuah statemen penugasan atau statemen keluaran, atau dapat pula sebagai
sebuah parameter pada suatu pemanggilan fungsi. Pemanggilan fungsi pada sebuah
program menyebabkan tubuh dari fungsi terpanggil dieksekusi.
Statemen
return
Setelah fungsi penghasil nilai selesai
melakukan komputasi, fungsi tersebut mengembalikan nilai balik melalui statemen
return.
Sintaks:
Statemen return
Statemen return memiliki sintaks
berikut:
return ekspr;
dimana di dalamnya ekspr merupakan sebuah variabel, nilai konstanta, atau ekspresi. ekspr dievaluasi, dan nilainya
dijadikan nilai balik. Tipe data yang dievaluasi dari ekspr harus cocok dengan tipe fungsi.
Dalam C++, return merupakan katakunci.
Ketika statemen return dieksekusi pada sebuah fungsi, fungsi tersebut berhenti
dengan segera dan kendali program kembali kepada pemanggil. Selain itu,
statemen pemanggilan fungsi digantikan oleh nilai balik yang diberikan oleh statemen
return. Ketika statemen return
dieksekusi pada fungsi main, program
langsung berhenti.
Untuk merealisasikan ide ini, akan
dituliskan sebuah fungsi yang menentukan nilai terbesar dari dua angka. Karena
fungsi ini membandingkan dua angka, dapat dipahami bahwa fungsi ini mempunyai
dua parameter dan bahwa kedua parameter tersebut adalah angka. Diasumsikan
bahwa tipe data tiap angka tersebut adalah titik-mengambang (desimal),
katakanlah, double. Karena nilai
terbesar bertipe double, maka tipe
fungsi harus juga double.
Diasumsikan fungsi ini dinamai dengan terbesar.
Sekarang, yang perlu Anda lakukan adalah menuliskan tubuh fungsi. Jadi, dengan
mengikuti sintaks sebuah fungsi, Anda dapat menuliskan fungsi ini sebagai
berikut:
double terbesar(double x, double y)
{
double maks;
if (x >= y)
maks = x;
else
maks = y;
return maks;
}
Perhatikan bahwa fungsi terbesar
mensyaratkan bahwa Anda menggunakan variabel lain, maks, (dinamakan dengan deklarasi lokal, dimana maks merupakan variabel lokal di dalam
fungsi terbesar). Gambar 5.1
menjelaskan beberapa bagian fungsi terbesar.
Gambar 5.1 Beberapa bagian dari fungsi terbesar
Dimisalkan bahwa angka, angka1, dan angka2 merupakan variabel double. Dimisalkan pula bahwa angka1 = 45.75 dan angka2 = 35.50. Gambar 5.2 menunjukkan beberapa pemanggilan
terhadap fungsi terbesar.
Gambar 5.2 Beberapa pemanggilan terhadap fungsi terbesar
Anda dapat menulis definisi fungsi terbesar sebagai berikut:
double terbesar(double x, double y)
{
if (x >= y)
return x;
else
return y;
}
Karena eksekusi terhadap sebuah
statemen return pada sebuah fungsi
akan menghentikan fungsi tersebut, fungsi terbesar
juga dapat dituliskan (tanpa katakunci else)
sebagai:
double terbesar(double x, double y)
{
if (x >= y)
return x;
return y;
}
Perhatikan bahwa kedua bentuk fungsi terbesar tidak mensyaratkan Anda untuk
mendeklarasikan sembarang variabel lokal.
Contoh 5.2
|
|
Karena fungsi terbesar telah ditulis, kode C++ berikut mengilustrasikan bagaimana
menggunakannya.
double satu = 13.00;
double dua = 36.53;
double angkaMaks;
Perhatikan beberapa statemen berikut:
cout << "Yang terbesar
dari 5 dan 6 adalah " << terbesar(5, 6)
<< endl; //Baris
1
cout << "Yang terbesar
dari " << satu << " dan " << dua
<< " adalah "
<< terbesar(satu, dua) << endl; //Baris
2
cout << " Yang
terbesar dari " << satu << " dan 29 adalah "
<< terbesar(satu, 29)
<< endl; //Baris
3
angkaMaks = terbesar(38.45,
56.78); //Baris
4
·
Ekspresi terbesar(5, 6) pada baris 1 merupakan sebuah pemanggilan fungsi,
dan 5 dan 6 adalah parameter aktual. Ketika ekspresi terbesar(5, 6) dieksekusi, 5 disalin ke dalam x, dan 6 disalin ke dalam y.
Oleh karena itu, statemen pada baris 1 menampilkan yang terbesar dari 5 dan 6.
·
Ekspresi terbesar(satu, dua) pada baris 2 merupakan sebuah pemanggilan
fungsi. Di sini, satu dan dua adalah parameter aktual. Ketika
ekspresi terbesar(satu, dua)
dieksekusi, nilai dari satu disalin
ke dalam x, dan nilai dari dua disalin ke dalam y. Oleh karena itu, statemen pada baris
2 menampilkan yang terbesar dari satu
dan dua.
·
Ekspresi terbesar(satu, 29) pada baris 3 juga merupakan sebuah pemanggilan
fungsi. Ketika ekspresi terbesar(satu,
29) dieksekusi, nilai dari satu
disalin ke dalam x, dan 29 disalin
ke dalam y. Oleh karena itu,
statemen pada baris 3 menampilkan yang terbesar dari satu dan 29.
·
Ekspresi terbesar(38.45, 56.78) pada baris 4 merupakan sebuah pemanggilan
fungsi. Pada pemanggilan ini, parameter-parameter aktual adalah 38.45 dan
56.78. Pada statemen ini, nilai balik yang dihasilkan oleh fungsi terbesar ditugaskan kepada variabel angkaMaks.
Setelah sebuah fungsi ditulis, Anda
dapat menggunakannya di mana saja di dalam program. Fungsi terbesar membandingkan dua angka dan menghasilkan yang terbesar
dari dua angka. Sekarang akan dituliskan fungsi lain yang menggunakan fungsi
ini dalam menentukan yang terbesar dari
tiga angka. Fungsi ini dinamai dengan bandingTiga.
double bandingTiga(double x, double y, double z)
{
return terbesar(x, terbesar(y, z));
}
Pada kepala fungsi, x, y,
dan z adalah parameter formal.
Amati ekspresi berikut:
terbesar(x, terbesar(y, z))
di dalam definisi fungsi bandingTiga. Ekspresi ini mempunyai dua
pemanggilan terhadap fungsi terbesar. Parameter-parameter aktual dari
pemanggilan terluar adalah x dan terbesar(y, z); Parameter-parameter
aktual dari pemanggilan terdalam adalah y
dan z. Dapat dipahami bahwa
pertama-tama, ekspresi terbesar(y, z)
dievaluasi; yaitu, pemanggilan terdalam dieksekusi terlebih dahulu, yang
memberikan hasil terbesar dari y dan
z. Dimisalkan bahwa terbesar(y, z) dievaluasi menjadi,
katakanlah, t. (Perhatikan bahwa t bisa y atau z). Selanjutnya,
pemanggilan terluar menentukan yang terbesar dari x dan t. Terakhir,
statemen return menghasilkan angka
yang terbesar dari tiga angka yang dibandingkan. Jadi, dapat dipahami bahwa
untuk mengeksekusi pemanggilan fungsi, parameter-parameter dieksekusi terlebih
dahulu. Sebagai contoh, parameter aktual terbesar(y,
z) dari pemanggilan terluar dieksekusi terlebih dahulu.
Prototipe
Fungsi
Karena Anda telah mengetahui bagaimana
menuliskan dan menggunakan fungsi pada sebuah program, pertanyaan berikutnya
berkaitan dengan urutan kemunculan fungsi-fungsi terdefinisi-pengguna di dalam
program. Sebagai contoh, apakah Anda menempatkan fungsi terbesar sebelum atau sesudah fungsi main? Dengan mengikuti aturan bahwa Anda harus mendeklarasikan
sebuah pengenal sebelum menggunakannya dan dengan mengetahui bahwa fungsi main menggunakan pengenal terbesar,
secara logis Anda harus menempatkan terbesar
sebelum main.
Pada kenyataannya, programer C++
biasanya menempatkan fungsi main sebelum fungsi-fungsi terdefinisi-pengguna.
Namun, pengorganisasian ini dapat menyebabkan error kompilasi karena
fungsi-fungsi dikompilasi dengan urutan kemunculannya di dalam program. Sebagai
contoh, jika fungsi main ditempatkan
sebelum fungsi terbesar, maka
pengenal terbesar tidak dikenali
atau tidak terdefinisi ketika fungsi main
dikompilasi. Untuk mengatasi masalah ini, Anda dapat menempatkan prototipe
fungsi sebelum sembarang definisi fungsi (termasuk definisi main).
Prototipe fungsi: Kepala fungsi tanpa
tubuh fungsi.
Sintaks:
Prototipe Fungsi
Sintaks umum prototipe fungsi dari
sebuah fungsi penghasil nilai adalah:
tipeFungsi namaFungsi(daftar
parameter);
(Perhatikan bahwa prototipe fungsi
diakhiri dengan semikolon (titik-koma)). Untuk fungsi terbesar, prototipenya adalah:
double terbesar(double x, double y);
Program
Akhir
Anda sekarang telah cukup mengetahui
bagaimana menuliskan keseluruhan program, mengkompilasinya, dan menjalankannya.
Program berikut menggunakan fungsi terbesar,
bandingTiga dan main dalam menentukan yang terbesar dari dua atau tiga angka.
//Program: Terbesar dari tiga angka
#include
<iostream>
using namespace
std;
double terbesar(double
x, double y);
double bandingTiga(double
x, double y, double z);
int main()
{
double satu, dua; //Baris
1
cout
<< "Baris 2: Yang terbesar
dari 5 dan 10 adalah "
<< terbesar(5, 10) << endl; //Baris
2
cout
<< "Baris 3: Masukkan dua
angka: "; //Baris 3
cin >>
satu >> dua; //Baris
4
cout
<< endl; //Baris 5
cout
<< "Baris 6: Yang terbesar
dari " << satu
<< " dan "
<< dua << " adalah
"
<< terbesar(satu, dua) << endl; //Baris 6
cout
<< "Baris 7: Yang terbesar
dari 43.48, 34.00, "
<< "dan 12.65 adalah
"
<< bandingTiga(43.48, 34.00, 12.65)
<< endl; //Baris
7
return 0;
}
double terbesar(double
x, double y)
{
double maks;
if (x >= y)
maks =
x;
else
maks =
y;
return maks;
}
double bandingTiga(double
x, double y, double z)
{
return terbesar(x, terbesar(y, z));
}
Keluaran Program:
Baris 2: Yang terbesar dari 5 dan 10 adalah 10
Baris 3: Masukkan dua angka: 25.6 73.85
Baris 6: Yang terbesar dari 25.6 dan 73.85 adalah
73.85
Baris 7: Yang terbesar dari 43.48, 34.00, dan 12.65
adalah 43.48
Fungsi
Penghasil Nilai: Beberapa Keanehan
Sebuah fungsi penghasil nilai harus
menghasilkan sebuah nilai. Perhatikan fungsi berikut, rahasia, yang mengambil sebuah parameter sebuah nilai int. Jika nilai parameter, x, lebih dari 5, maka ia menghasilkan
dua kali dari nilai x; sebaliknya,
nilai x tetap tidak berubah.
int rahasia(int x)
{
if (x > 5) //Baris
1
return 2 * x; //Baris 2
}
Karena ini merupakan sebuah fungsi
penghasil nilai bertipe int, ia
harus menghasilkan nilai bertipe int.
Dimisalkan bahwa x adalah 10. Maka
ekspresi x > 5 pada baris 1
dievaluasi menjadi true. Jadi,
statemen return pada baris 2
menghasilkan nilai 20. Sekarang dimisalkan bahwa x adalah 3. Ekspresi x > 5 pada baris 1 sekarang
dievaluasi menjadi false. Statemen if gagal, dan statemen return pada baris 2 tidak dieksekusi.
Namun, tidak ada statemen lain yang akan dieksekusi di dalam tubuh fungsi. Pada
kasus ini, fungsi menghasilkan sebuah nilai aneh. Dapat dipahami bahwa jika
nilai x kurang dari atau sama dengan
5, fungsi tidak memuat sembarang statemen return
yang valid untuk menghasilkan nilai balik.
Definisi yang benar dari fungsi rahasia adalah:
int rahasia(int x)
{
if (x > 5) //Baris
1
return 2 * x; //Baris 2
return x; //Baris
3
}
Di sini, jika nilai x kurang dari atau sama dengan 5,
statemen return pada baris 3 akan
dieksekusi, yang menghasilkan nilai x.
Di sisi lain, jika nilai x lebih dari 5, maka statemen return pada baris 2 akan dieksekusi,.
Ingat bahwa pada suatu fungsi penghasil
nilai, statemen return mengembalikan
atau menghasilkan nilai. Perhatikan statemen return berikut:
return
x, y; //hanya nilai y yang dijadikan nilai balik
Ini merupakan statemen return yang sah. Anda mungkin berpikir
bahwa statemen return ini
menghasilkan nilai balik x dan y. Namun, Anda salah. Ingat, statemen return hanya menghasilkan satu nilai,
bahkan jika statemen return memuat
lebih dari satu ekspresi. Jika statemen return
memuat lebih dari satu ekspresi, maka hanya nilai dari ekspresi terakhir yang
dijadikan nilai balik. Oleh karena itu, pada kasus statemen return tersebut, nilai y yang dijadikan nilai balik. Program
berikut lebih lanjut mengilustrasikan konsep ini.
// Program ini mengilustrasikan bahwa sebuah fungsi
penghasil nilai
// hanya menghasilkan satu nilai, bahkan jika statemen
return
// memuat lebih dari satu ekspresi.
#include
<iostream>
using namespace
std;
int fungsiRet1();
int fungsiRet2(int z);
int main()
{
int num = 4;
cout
<< "Baris 1: Nilai balik yang
dihasilkan oleh funcRet1: "
<< fungsiRet1() << endl; //
Baris 1
cout
<< "Baris 2: Nilai balik yang
dihasilkan oleh funcRet2: "
<< fungsiRet2(num) << endl; //
Baris 2
return 0;
}
int fungsiRet1()
{
int x = 45;
return 23, x; //hanya nilai x yang
dijadikan nilai balik
}
int fungsiRet2(int z)
{
int a = 2;
int b = 3;
return 2 * a + b, z + b; //hanya nilai
dari z + b yang dijadikan nilai balik
}
Keluaran Program:
Baris 1: Nilai balik yang dihasilkan oleh funcRet1: 45
Baris 2: Nilai balik yang dihasilkan oleh funcRet2: 7
Beberapa
Contoh Lain dari Fungsi Penghasil Nilai
Contoh 5.3
|
|
Pada contoh ini, Anda akan menuliskan
definisi fungsi nilaiKuliah. Fungsi
ini mengambil sebuah nilai int
sebagai parameter, yang menspesifikasi skor matakuliah dan menghasilkan nilai
bertipe char. (Diasumsikan bahwa
skor ujian bernilai di antara 0 dan 100).
char nilaiKuliah(int skor)
{
switch (skor / 10)
{
case 0:
case 1:
case 2:
case
3:
case 4:
case 5:
return 'F';
case 6:
return 'D';
case 7:
return 'C';
case 8:
return 'B';
case 9:
case 10:
return 'A';
}
}
Anda dapat juga menuliskan definisi
ekivalen dari fungsi nilaiKuliah
yang menggunakan statemen struktur if...else
dalam menentukan nilai matakuliah.
Contoh 5.4
|
|
Pada contoh ini, Anda akan menuliskan
sebuah fungsi yang melemparkan sepasang dadu sampai penjumlahan keduanya
menjadi angka tertentu. Anda juga akan mengetahui berapa kali dadu dilemparkan
untuk mendapatkan hasil penjumlahan yang diinginkan.
Angka terkecil pada tiap dadu adalah 1,
dan angka terbesar adalah 6. Jadi penjumlahan terkecil atas sepasang dadu
adalah 2, dan penjumlahan terbesarnya adalah 12. Dimisalkan bahwa Anda memiliki
beberapa deklarasi berikut:
int dadu1;
int dadu2;
int jum;
int hitungLemparan
= 0;
Anda akan menggunakan pembangkit
bilangan, yang didiskusikan pada Bab 4, untuk secara acak membangkitkan sebuah
angka antara 1 dan 6. Kemudian, statemen berikut secara acak membangkitkan
sebuah angka antara 1 dan 6 dan menyimpan angka itu ke dalam dadu1, yang menjadi angka hasil
pelemparan dadu1.
dadu1 = rand() % 6 + 1;
Sama halnya, statemen berikut secara
acak membangkitkan sebuah angka antara 1 dan 6 dan menyimpan angka itu ke dalam
dadu2, yang menjadi angka hasil
pelemparan dadu2.
dadu2 = rand() % 6 + 1;
Jadi, penjumlahan atas dua angka hasil
pelemparan dua dadu adalah:
jum = dadu1 + dadu2;
Selanjutnya, Anda akan memutuskan
apakah jum memuat hasil penjumlahan
yang diinginkan atas sepasang dadu. Jika jum
tidak memuat hasil penjumlahan yang diinginkan, maka Anda melemparkan dadu
kembali. Ini dapat dilakukan menggunakan loop do...while. (Diasumsikan bahwa variabel int, angka, memuat hasil
penjumlahan yang diinginkan).
do
{
dadu1 = rand() % 6 + 1;
dadu2 = rand() % 6 + 1;
jum = dadu1 + dadu2;
hitungLemparan++;
}
while (jum
!= angka);
Anda sekarang dapat menuliskan fungsi lemparDadu yang mengambil hasil
penjumlahan yang diinginkan atas sepasang dadu sebagai parameter dan
menghasilkan jumlah pelemparan yang dilakukan untuk mendapatkan hasil
penjumlahan yang diinginkan.
int lemparDadu(int angka)
{
int dadu1;
int dadu2;
int jum;
int hitungLemparan = 0;
srand(time(0));
do
{
dadu1 = rand() % 6 + 1;
dadu2= rand() % 6 + 1;
jum = dadu1 + dadu2;
hitungLemparan++;
}
while (jum != angka);
return hitungLemparan;
}
Program berikut menunjukkan bagaimana
menggunakan fungsi lemparDadu pada
sebuah program.
//Program: Melempar dadu
#include
<iostream>
#include
<cstdlib>
#include
<ctime>
using namespace
std;
int lemparDadu(int
num);
int main()
{
cout
<< "Jumlah pelemparan dadu
untuk "
<< "mendapatkan hasil
penjumlahan 10 = " << lemparDadu(10) << endl;
cout
<< "Jumlah pelemparan dadu
untuk "
<< "mendapatkan hasil
penjumlahan 6 = " << lemparDadu(6) << endl;
return 0;
}
int lemparDadu(int
angka)
{
int dadu1;
int dadu2;
int jum;
int hitungLemparan = 0;
srand(time(0));
do
{
dadu1 =
rand() % 6 + 1;
dadu2=
rand() % 6 + 1;
jum =
dadu1 + dadu2;
hitungLemparan++;
}
while (jum != angka);
return hitungLemparan;
}
Keluaran Program:
Jumlah pelemparan dadu untuk mendapatkan hasil
penjumlahan 10 = 1
Jumlah pelemparan dadu untuk mendapatkan hasil penjumlahan
6 = 10
Contoh 5.5
|
|
Pada contoh ini, sebuah fungsi, apaAngkaPalindrome, dirancang sehingga
menghasilkan true jika sebuah
integer tak-negatif merupakan sebuah palindrome dan menghasilkan false jika tidak. Sebuah integer
tak-negatif dikatakan palindrome jika ia dibaca maju dan mundur dengan hasil
yang sama. Sebagai contoh, integer 5, 44, 434, 1881, dan 789656987 adalah
palindrome.
Dimisalkan bahwa angka adalah sebuah integer tak-negatik. Jika angka < 10, maka ia adalah sebuah palindrome, sehingga fungsi
harus menghasilkan true. Dimisalkan
bahwa angka >= 10. Untuk menentukan apakah angka adalah sebuah
palindrome, pertama-tama dijit pertama dan dijit terakhir dari angka dibandingkan. Jika dijit pertama
dan dijit terakhir dari angka tidak
sama, maka ia bukanlah palindrome, sehingga fungsi menghasilkan false. Jika dijit pertama dan dijit
terakhir dari angka sama, maka dijit
pertama dan dijit terakhir dari angka
akan dihapus dan proses yang sama akan diulangi kembali terhadap angka baru,
yang didapatkan dari angka setelah
dijit pertama dan dijit terakhirnya dihapus. Proses ini diulangi sepanjang angka > = 10.
Sebagai contoh, dimisalkan bahwa
masukan adalah 18281. Karena dijit pertama dan dijit terakhir dari 18281 sama,
maka dijit pertama dan dijit terakhir tersebut dihapus untuk mendapatkan angka
baru 828. Proses ini diulangi, yang menghasilkan angka baru 2, yang bernilai
kurang dari 10. Jadi, 18281 merupakan sebuah palindrome.
Untuk menghapus dijit pertama dan dijit
terakhir dari angka, Anda
pertama-tama menemukan pangkat 10 tertinggi yang membagi angka dan menamainya pangkat.
Pangkat 10 tertinggi yang membagi 18281 adalah 4, jadi pangkat = 4. Sekarang, 18281 %
= 8281, jadi dijit pertama telah
terhapus. Selain itu, karena 8281 / 10 = 828, dijit terakhir telah terhapus
pula. Oleh karena itu, untuk menghapus dijit pertama, Anda bisa menggunakan
operator mod, dimana pembaginya adalah
. Untuk menghapus dijit terakhir, Anda bisa menggunakan pembagian dengan
10. Anda kemudian mendekremen pangkat
sebesar 2 untuk iterasi berikutnya. Algoritma berikut mengimplementasikan
diskusi ini:
1. Jika angka < 10, maka ia adalah sebuah
palindrome, jadi fungsi menghasilkan true.
2. Dimisalkan
bahwa angka adalah sebuah integer
dan angka >= 10. Untuk mengetahui
apakah angka adalah sebuah palindrome:
a.
Temukan pangkat tertinggi dari 10
yang membagi angka dan menamainya pangkat. Sebagai contoh, pangkat
tertinggi dari 10 yang membagi 434 adalah 2; pangkat tertinggi dari 10 yang
membagi 789656987 adalah 8.
b.
Ketika angka lebih dari atau sama dengan 10, bandingkan dijit pertama dan
dijit terakhir dari angka.
i.
Jika dijit pertama dan dijit
terakhir dari angka tidak sama, maka angka bukan sebuah palindrome.
ii.
Jika dijit pertama dan dijit terakhir
dari angka sama:
1 Hapus
angka pertama dan angka terakhir dari angka.
2 Dekremen
pangkat sebesar 2.
c.
Jadikan true sebagai nilai balik.
Fungsi berikut mengimplementasikan
algoritma ini:
bool apaAngkaPalindrome(int angka)
{
int pangkat = 0;
if (angka < 10) //Langkah 1
return
true;
else
//Langkah
2
{
//Langkah 2.a
while
(angka / static_cast<int>(pow(10.0,
pangkat)) >= 10)
pangkat++;
while
(angka >= 10) //Langkah
2.b
{
int pangkatSepuluh = static_cast<int>(pow(10.0, pangkat));
if ((angka / pangkatSepuluh) != (angka % 10))
return false; // Langkah 2.b.i
else //Langkah
2.b.ii
{
angka = angka % pangkatSepuluh;
//Langkah 2.b.ii.1
angka = angka / 10; //Langkah 2.b.ii.1
pangkat = pangkat - 2; //Langkah 2.b.ii.2
}
}//akhir while
return
true;
}//akhir else
}
CONTOH PEMROGRAMAN: Angka Terbesar
Pada contoh pemrograman ini, fungsi
terbesar dipakai untuk menentukan angka terbesar dari sederet angka. Demi
kepentingan ilustrasi, program ini menentukan angka terbesar dari 10 angka.
Anda dapat dengan mudah memperbaiki program untuk mengakomodasi sembarang
banyaknya angka.
Masukan: Himpunan angka yang memuat 10 angka.
Keluaran: Angka terbesar dari 10 angka.
Analisa
Masalah dan Perancangan Algoritma
Dimisalkan bahwa data masukan adalah:
15 20 7 8 28
21 43 12 35 3
Anda perlu membaca data pertama dari
himpunan data tersebut. Karena ia merupakan satu-satunya data yang terbaca
sejauh ini, Anda bisa mengasumsikan bahwa ia merupakan angka terbesar sejauh
ini dan menamainya maks.
Selanjutnya, Anda membaca angka kedua dan memanggilnya angka. Sekarang, Anda membandingkan maks dan angka dan
menyimpan angka yang lebih besar ke dalam maks.
Sekarang, maks memuat angka terbesar
dari dua angka pertama. Anda kemudian membaca angka ketiga. Anda membandingkannya
dengan maks dan menyimpan angka yang
lebih besar ke dalam maks. Pada
titik ini, maks memuat angka
terbesar dari tiga angka pertama. Anda mengulangi proses ini untuk tiap data
yang tersisi. Di akhir, maks akan
memuat angka terbesar di dalam himpunan data tersebut. Diskusi ini kemudian
diterjemahkan ke dalam algoritma berikut:
1. Membaca angka
pertama. Karena ini merupakan satu-satunya angka yang dibaca sejauh ini, ia
merupakan angka terbesar. Angka tersebut disimpan ke dalam sebuah variabel yang
dinamai maks.
2. Untuk
angka-angka lain di dalam himpunan data:
a.
Membaca angka berikutnya.
Menyimpannya di dalam variabel yang dinamai dengan angka.
b.
Membandingkan angka dan maks. Jika maks < angka, maka angka adalah angka terbesar yang baru,
jadi nilai dari maks diperbarui
dengan menyalin angka ke dalam maks. Jika maks >= angka, maka angka
dibuang.
3.
Karena maks sekarang memuat angka terbesar, ia ditampilkan.
Program
Utuh
//********************************************************
// Program ini mencari angka terbesar dari himpunan
data
// yang memuat 10 angka.
//********************************************************
#include
<iostream>
using namespace
std;
double terbesar(double
x, double y);
int main()
{
double angka; //variabel untuk memuat
angka terkini
double maks; //variabel untuk memuat
angka terbesar
int hitung; //variabel kendali loop
cout
<< "Masukkan 10 angka."
<< endl;
cin >>
angka; //Langkah
1
maks =
angka; //Langkah
1
for (hitung = 1; hitung < 10; hitung++)
//Langkah 2
{
cin
>> angka; //Langkah
2a
maks =
terbesar(maks, angka); //Langkah
2b
}
cout
<< "Angka terbesar adalah
" << maks
<< endl; //Langkah
3
return 0;
}//akhir main
double terbesar(double
x, double y)
{
if (x >= y)
return x;
else
return y;
}
Keluaran Program:
Masukkan 10 angka.
10 56 47 78 89 87 37 236 26272 363
Angka terbesar adalah 26272
No comments:
Post a Comment