Wednesday, December 21, 2016

Bab 5. C++ Untuk Pemula



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  dimana e = 2.718: exp(1.0) = 2.71828.

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 ; jika x bernilai negatif, maka y dibulatkan.

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