BAB 8
FUNGSI
•
8.1 Pendahuluan
Dalam C+ + , program merupakan kumpulan dari fungsi-fungsi, baik itu yang didefinisikan langsung dalam program maupun yang disimpan dalah suatu file header. C/C + + sendiri mempunyai fungsi utama yang disebut fungsi main(). Fungsi main ( ) ini selalu ada dalam setiap program C/C + + dan kompiler akan menjalankan program melalui perintah-perintah yang terdapat dalam fungsi ini. Berikut ini gambar yang akan mengilustrasikan keberadaan fungsi dalam sebuah program.
Program intmainO { FungsilO' Statement; Fnno«i'7 C\' Statemen2; return 0; } Fungsil return Fungsil Fun£si30' return Fungsi3 return Bab 8: Fungsi
Fungsi merupakan subprogram dan berguna untuk menjadikan program dapat lebih bersifat modular sehingga akan mudah dipahami dan dapat digunakan kembali, baik untuk program itu sendiri maupun untuk program lain yang memiliki proses yang sama. Dalam C+ + , fungsi dibedakan menjadi dua, yaitu
user-defined function dan built-in function. User-user-defined function adalah
fungsi-fungsi yang didefinisikan sendiri, sedangkan built-in function adalah fungsi-fungsi 'siap pakai' yang telah disediakan oleh kompiler.
Pada bagian ini kita akan membahas lebih jauh mengenai pembuatan fungsi dalam C++ dan hal-hal yang terkandung di dalamnya.
8.2 Fungsi Tanpa Nilai Balik
C++ tidak mengenai istilah prosedur seperti pada saat kita melakukan pemrograman dengan menggunakan bahasa PASCAL. Dalam bahasa PASCAL sendiri, prosedur didefinisikan sebagai suatu proses yang tidak mengembalikan nilai. Untuk melakukan hal ini di dalam C+ + , maka kita harus membuat suatu fungsi dengan tipe void, yang berarti tidak memiliki nilai balik (return value). Adapun bentuk umum dari pembuatan fungsi tanpa nilai balik ini adalah seperti vano terlihat di bawah ini.
?id nama_fungs± (parameter!, parameters, ...) { Statemen_yang_akan_dilakukan;
Sedangkan bentuk umum untuk pemanggilan sebuah fungsi yang sebelumnya telah didefinisikan adalah seperti berikut.
nama__fungsi(nilai_parameterl, nilai_parameter2, ,,.) t '
Sebagai contoh penggunaannya, di sini kita akan membuat sebuah fungsi yang dapat menuliskan teks "Aku sangat menyukai C+ + " sebanyak 10 kali. Adapun sintaks programnya adalah sebagai berikut:
Kode Program 8-1
#include <iostream> using nam
Pemrograman
;// Membuat fungsi dengan nama TulislOKali
void TulislOKali(} {
for (int C=0; C<10; C++) {
: cout«"Aku sangat menyukai C++"«endl;
// Fungsi utama dalam program C++ int mainO {
// Memanggil fungsi TulislOKali untuk dieksekusi TulislOKaliO ;
return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut : Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat Aku sangat menyukai C+ + menyukai C+ + menyukai C + + menyukai C+ + menyukai C+ + menyukai C + + menyukai C + + menyukai C+ + menyukai C + + menyukai C + +
8.3 Fungsi dengan Nilai Balik
Berbeda dengan fungsi yang bertipe void, fungsi ini berguna untuk melakukan suatu proses yang dapat mengembalikan sebuah nilai. Dalam membuat fungsi ini kita harus mendefinisikan tipe data dari nilai yang akan dikembalikan. Berikut ini adalah bentuk umum dari pembuatan fungsi yang memiliki nilai balik.
tipe_data nama_fungsi (parairilflrl, parameter2, . . . ) { Statemen_yang_akan_dilakukan;
return nilai_yang_akan_dikembalikan;
Sedangkan untuk pemanggilannya sama seperti pada fungsi yang tidak mempunyai nilai balik. Untuk dapat lebih memahami cara pembuatannya, perhatikan contoh-contoh program di bawah ini.
8.3.1 Fungsi yang Mengembalikan Tipe String
Kode Program 8-2
fInclude <iostream> using namespace std;
// Membuat fungsi sederhana yang mengembalikan tipe string char* TestFungsiStringC) {
return "Ini adalah nilai dari fungsi";
./'/ Fungsi utama int m a i n ( ) {
// Memanggil dan menampilkan hasil fungsi cout«TestFunflSiStr inu
return 0;
•HH^^H
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Ini adalah nilai dari fungsi
8.3.2 Fungsi yang Mengembalikan Tipe Bilangan
Kode Program 8-3
#include <iostream> using namespace std;
// Membuat fungsi dengan nilai kembalian bertipe double double TestFungsiBilanganO {
return (3.14 * 2) ;
// Fungsi utama int main ( ) {
Pemrograman
cout«"Nilai yang terdapat dalam fungsi : "; cout«TestFungsiBilangan() ;
return 0;:
Hasil yang akan diberikan oleh program di atas adalah sebagai berikut :
Nilai yang terdapat dalam fungsi: 6.28
8.4 Fungsi dengan Parameter
Sejauh ini kita masih membuat fungsi yang tidak memiliki parameter sehingga setiap kali pemanggilan fungsi tersebut, hasil yang didapatkan selalu bernilai tetap. Sekarang, kita akan membuat fungsi dengan parameter sehingga hasil yang diberikan dapat bersifat dinamis, tentunya tergantung dari nilai parameter yang dimasukkan.
Secara teori, parameter yang terdapat pada pendefinisian sebuah fungsi disebut dengan parameter formal, sedangkan parameter yang terdapat pada saat pemanggilan disebut dengan parameter
aktual. Jumlah serta tipe data antara parameter formal dan
parameter aktual haruslah sesuai, jika tidak maka kompiler akan menampilkan pesan kesalahan. Sebagai tambahan, sebelum kita melanjutkan ke pembahasan lebih yang lebih jauh, Anda harus mengenal lebih baik jenis-jenis dari parameter itu sendiri.
8.4.1 Jenis Parameter
Terdapat tiga buah jenis parameter yang dapat dilewatkan pada sebuah fungsi dalam C+ + , yaitu parameter masukan, keluaran dan
masukan/keluaran.
a. Parameter Masukan
Sesuai dengan namanya, parameter ini akan digunakan sebagai nilai masukan dalam sebuah fungsi. Nilai tersebut
kemudian akan diproses oleh fungsi untuk menghasilkan sebuah nilai kembalian (return value). Berikut ini contoh program yang di dalamnya terdapat sebuah fungsi dengan parameter yang bertipe masukan.
Kode Program 8-4
liriciude <lostream> using namespace std;
//Membuat fungsi dengan parameter bertipe masukan int TambahSatu(int X) { int hasil}. hasil = X + 1; return hasilj • int main() {
/* Mendeklarasikan variabel yang akan digunakan sei
/* nilai parameter pada saat pemanggilan */
int Bilangan, HASIL;
cout« "Masukkan sebuah bilangan bulat : "«endl; cin»Bilangan;
HASIL = TambahSatu(Bilangan};
// Menampilk.au nilai setelah diproses di dalam func cout«"Nilai akhir : "«HASI1
Contoh hasil yang akan diberikan oleh program di atas adalah sebagai berikut:
Masukkan sebuah bilangan bulat: 10 Nilai akhir : 11
Sebagai catatan, variabel X di atas berfungsi sebagai parameter masukan.
Pemrograman C++
b. Parameter Keluaran
Parameter keluaran adalah parameter yang berfungsi untuk menampung nilai yang dihasilkan dari proses di dalam fungsi. Parameter keluaran pada umumnya digunakan di dalam fungsi void (fungsi yang tidak mengembalikan nilai). Dengan kata lain, parameter tersebut berguna sebagai nilai keluaran dari sebuah fungsi. Maka dari itu, parameter keluaran ini harus dilewatkan berdasarkan alamat atau referensinya, yaitu dengan menggunakan pointer atau
reference. Berikut ini contoh program yang di dalamnya
terdapat sebuah fungsi yang mengandung parameter keluaran.
Kode Program 8-5
#inelude :<iostream> using namespace std;
// Parameter X sebagai masukan
//dan parameter hasil sebagai keluaran
void TambahSatu{int X, int *hasil) { *hasil = X + 1;
}
int main() {
int Bilangan, HASIL;
cout«"Masukkan sebuah bilangan bulat cin»Bilangan;
// Menampilkan nilai setelah diproses di dalam fungsi cout«"Nilai akhir : "«TambahSatu(Bilangan, &HASIL) return 0
Perhatikan parameter hasil di atas, parameter tersebut adalah parameter formal yang berupa pointer sehingga pada saat pemanggilan fungsi, parameter aktualnya juga harus berupa pointer. Oleh karena kita akan menyimpan hasil perhitungan ke dalam variabel HASIL, maka kita pun harus melewatkan alamat dari variabel HASIL ke dalam fungsi tersebut, yaitu dengan menuliskan &HASIL. Berikut ini contoh hasil yang akan diberikan dari program di atas.
Masukkan sebuah bilangan bulat: 10 Nilai akhir : 11
Parameter Masukan/Keluaran
Jenis parameter ini adalah parameter yang digunakan sebagai masukan dan juga keluaran. Artinya, mula-mula nilai dari parameter ini akan digunakan sebagai masukan untuk proses di dalam fungsi, setelah proses selesai maka hasilnya akan disimpan kembali ke dalam parameter tersebut sebagai nilai keluaran. Berikut ini contoh program yang mempunyai sebuah fungsi dengan parameter yang bertipe masukan/ keluaran.
Kode Program 8-6 #include <iostream>
using namespace std;
// Parameter X sebagai masukan dan juga sebagai keluaran
// Fungsi utama int main() {
int Bilangan;
cout«"Masukkan sebuah bilangan bulat : " ; cin»Bilangan;
// Menampilkan nilai setelah diproses di dalam fungsi cout«"Nilai akhir : "«TambahSatu(&Bilangan) ; return 0;
Contoh hasil yang akan diberikan oleh program di atas adalah sebagai berikut:
Masukkan sebuah bilangan bulat: 10 Nilai akhir : 11
Pemrograman C++
8.4.2 Melewatkan Parameter Berdasarkan Nilai (Pass
By Value)
Terdapat dua buah cara untuk melewatkan parameter di dalam sebuah fungsi, yaitu berdasarkan nilai (pass by value) dan berdasarkan alamat (pass by reference). Pada bagian ini kita hanya akan membahas mengenai pass by value, sedangkan pass by
reference akan kita bahas pada sub bab berikutnya.
Sesuai dengan namanya, fungsi ini akan melewatkan nilai parameter ke dalam sebuah fungsi untuk digunakan sesuai proses yang terdapat di dalam fungsi tersebut. Jika kita melewatkan parameter dengan cara ini maka nilai yang dihasilkan oleh fungsi tidak akan mempengaruhi nilai yang terdapat pada program (di luar fungsi tersebut). Hal ini disebabkan karena pada saat pemanggilan fungsi, kompiler hanya akan membuat salinan (copy) dari nilai yang terdapat pada parameter aktual ke parameter formal. Dengan kata lain, yang akan berubah adalah nilai di dalam fungsi saja. Untuk lebih memahaminya, perhatikan program di bawah ini.
Kode Program 8-7
#include <iostream> using namespace std;
// Membuat fungsi dengan melewatkan nilai X ke dalamnya void Kali2(int X) {
X = X * 2;
cout«"Nilai di dalarn fungsi : "«X«endl;
// Fungsi utama int main(} {
int Bilangan;
cout«"Masukkan sebuah bilangan bulat cin»Bilangan;
cout«endl;
// Menampilkan nilai awal
cout«"Nilai awal : "«Bilangan«endl; // Memanggil fungsi Kali2
Kali2(Bilangan);
// Menampilkan nilai akhir
cout«"Nilai awal : "«Bilangan«endl; Bab 8: Fungsi
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Masukkan sebuah bilangan bulat: 10 Nilai awal
Nilai di dalam fungsi Nilai akhir
10 20 10
Jika kita amati hasil program di atas, maka kasus tersebut dapat diilustrasikan dengan gambar di bawah ini.
Nilai awal
Bilangan = 10 di-copy ke variabel X
:=io
dilewatkan ke fungsi dipanggii kembali Proses di dalam fungsi Kali2
Bilangan = 10
menghasilkan = 20
Nilai akhir Nilai di dalam fuiiesi
Pada kasus di atas, variabel Bilangan dan variabel X menempati alamat memori yang berbeda sehingga pada saat pemanggilan fungsi, nilai dari keduanya tentu akan berbeda. Di sini, yang berubah hanya nilai dari variabel X, sedangkan variabel Bilangan bernilai tetap karena kita memang tidak melakukan apa-apa terhadap variabel tersebut. Berikut ini contoh lain yang memperlihatkan pengiriman parameter dengan berdasarkan nilai.
#ihclude <iostream> using namespace std;
// Mendefinisikan fungsi untuk menukarkan dua buah bilangan void TukarBilangan(int X, int. Y)...{.
Pemrograman
C-// Menampilkan bilangan yang terdapat di dalam fungsi cout«"Di dalam fungsi"«endl;
cout« "Bilangan ke-1 : *«x«endl; cout«"Bilangan ke-2 : "«Y«endl; cout«endl ;
// Fungsi utama int main{) {
// Mendeklarasikan variabel Bilanganl dan Bilangan2 int Bilanganl, Bilangan2;
,cout«"Masukkan bilangan pertama cout«"Masukkan bilangan kedua
cin»Bilanganl; • cin»Bilangan2, // Menampilkan nilai awal
cout«"Keadaan awal"«endl;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : "«Bilangan2«endl; cout<<endl;
// Memanggil fungsi TukarBilangan TukarBilangan(Bilanganl, Bilangan2);
// Menampilkan nilai akhir setelah pemanggilan fungsi tukar cout«"Keadaan akhir "«endl;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : "«Bilangan2«endl; cout«endl;
return 0;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Masukkan bilangan pertama : 21 Masukkan bilangan kedua : 78 Keadaan awal Bilangan ke-1 : 21 Bilangan ke-2 : 78 Di dalam fungsi Bilangan ke-1 : 78 Bilangan ke-2 : 21 Bab 8: Fungsi
Keadaan akhir Bilangan ke-1 : 21 Bilangan ke-2 : 78
Dari hasil di atas dapat disimpulkan bahwa fungsi tersebut tidak dapat mengubah (dalam hal ini menukarkan) bilangan-bilangan yang dimaksud karena nilai yang terdapat di dalam fungsi tidak mempengaruhi nilai luar.
8.4.3 Melewatkan Parameter Berdasarkan Alamat
(Pass By Reference)
Untuk dapat mempelajari bagian ini, Anda dianggap telah mengetahui arti dari alias atau reference (lihat bab 6, Pointer). Berbeda dengan pass by value, pass by reference adalah melewatkan parameter ke sebuah fungsi berdasarkan alamatnya. Kita tahu bahwa jika kita membuat alias dari sebuah variabel maka alamat dari variabel dan alias tersebut adalah sama. Hal inilah yang menjadi konsep dasar pengiriman parameter berdasarkan alamat. Melewatkan parameter dengan cara seperti ini akan menyebabkan nilai yang terdapat di dalam fungsi akan sama persis dengan nilai yang terdapat pada program (di luar fungsi). Hal ini tentunya disebabkan karena alamat dari variabel yang berperan sebagai parameter formal sama dengan alamat dari variabel yang berperan sebagai parameter aktual. Untuk lebih memahaminya, perhatikan program di bawah ini.
Kode Program 8-9
# include <iostream> using namespace std;
// Mendefinisikan fungsi yang melewatkan parameternya
// berdasarkan alamat
void Kali2(int& X) { // Gunakan tanda &
// untuk membuat alias atau referen
X = X * 2;
cout«"Nilai di dalam fungsi : "«x«endl;
int main ( ) { int Bilangan;
Pemrograman C++
cout«"Masukkan sebuah bilangan bulat : ",- cin»Bilang cout«endl ;
// Menampilkan nilai awal cout«Bilangan«endl ;
Kali2(Bilangan); // Memanggil fungsi Kali2
// Menampilkan nilai akhir
cout«Bilangan«endl ; return 0;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :
Masukkan sebuah bilangan bulat: 10 Nilai awal : 10
Nilai di dalam fungsi: 20 Nilai akhir : 20
-Kenapa demikian? Jawabnya adalah karena X bukanlah sebuah variabel melainkan sebuah alias (nama lain) atau reference dari variabel Bilangan. Maka dari itu, alias X dan variabel Bilangan tentu mempunyai alamat yang sama karena keduanya sebenarnya merupakan objek yang sama. Dengan demikian, jika nilai X berubah, maka nilai yang terdapat pada variabel Bilangan pun akan ikut berubah. Berikut ini gambar yang akan mengilustrasikan kasus tersebut. Nilai awal Bilangan i Bilan — v — i n
I alias X dilewatkan ke fungsi
> rTO dipanggil kembali
r
jan — 70 ^....
Nilai akhir
ses di dalam fungsi Kali2
menghasilkan
+ X = 20 Nilai di dalam fimesi
Berbeda dengan pass by value, di sini nilai X dan nilai yang terdapat pada variabel Bilangan akan saling mempengaruhi. Berikut ini contoh lain yang menggambarkan penggunaan pass by
reference.
Kode Program 8-10
# include <iostream> using namespace std;
// Mendefinisikan fungsi untuk menukarkan dua buah bilangan void TukarBilangan (int& X, int& Y) {
int Z = X; X = Y;
Y = Z;
/ Menampilkan bilangan yang terdapat di dalam fungsi cout«"Di dalam fungsi "«endl;
cout« "Bilangan ke-1 : "«X«endl; cout« "Bilangan ke-2 : "«Y«endl; cout«endl;
// Fungsi utama int main ( ) {
// Mendeklarasikan variabel Bilanganl dan Bilangan2 int Bilanganl, Bilangan2;
cout«"Masukkan bilangan pertama cout«"Masukkan bilangan kedua // Menampilkan nilai awal cout«"Keadaan awal"«endl;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : "«Bilangan2«endl; cout«endl;
// Memanggil fungsi TukarBilangan TukarBilangan(Bilanganl, Bilangan2);
// Menampilkan nilai akhir setelah pemanggilan fungsi tuJcaj cout«"Keadaan akhir"«endl ;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : "«Bilangan2«endl ; cout«endl;
return 0
Pemrograman
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Masukkan bilangan pertama : 21 Masukkan bilangan kedua : 78 Keadaan awal Bilangan ke-1 : 21 Bilangan ke-2 : 78 Di dalam fungsi Bilangan ke-1 : 78 Bilangan ke-2 : 21 Keadaan akhir Bilangan ke-1 : 78 Bilangan ke-2 : 21
Selain menggunakan alias atau reference, kita juga dapat menggunakan pointer untuk melewatkan parameter berdasarkan alamat. Namun perlu untuk diperhatikan, pada saat pemanggilan fungsi tersebut, kita harus memanggil alamat dari parameter aktual, yaitu dengan menggunakan operator &. Sebagai contoh kita akan melakukan modifikasi program di atas dengan menggunakan parameter yang bertipe pointer. Adapun sintaksnya seperti di bawah ini.
using namespace std;
// Mendefinisikan fungsi dengan parameter bertipe pointer void TukarBilangan (int *X, int *Y) {
int Z = *X; *X = *Y; *Y = Z;
// Menampilkan bilangan yang terdapat di dalam fungsi cout«"Di dalam fungsi"«endl;
cout« "Bilangan ke~l : "«*X«endl; cout« "Bilangan ke-2 : w«*Y«endl;
cout«endl ?
// Fungsi utama int main{) {
// Mendeklarasikan variabel Bilanganl dan Bilangan2 int Bilanganl, Bilangan2;
cin»Bilanganl ; cin»Bilangan2 cout« "Masukkan bilangan pertama
cout«"Masukkan bilangan kedua // Menampi1kan nilai awal cout«"Keadaan awal"«endl;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : w«Bilangan2«endl;
cout«endl ;
// Memanggil fungsi TukarBilangan
// Ingat, gunakan operator &
TukarBilangan(&Bilanganl, &Bilangan2) ;
// MenampiIkan nilai akhir setelah pemanggilan fungsi tuka cout«"Keadaan akhir"«endl;
cout«"Bilangan ke-1 : "«Bilanganl«endl; cout«"Bilangan ke-2 : "«Bilangan2«endl; cout«endl ;
return 0;
Hasil yang didapatkan dari program di atas akan sama seperti pada program sebelumnya.
8.4.4 Melewatkan Parameter Bertipe Array
Array dapat juga dijadikan sebagai parameter dalam sebuah fungsi. Sebagai contoh, di sini kita akan membuat dua buah fungsi yang memiliki parameter bertipe array. Adapun sintaks programnya adalah seperti yang terlihat di bawah ini.
Kode Program 8-12
#include <iostream> using namespace std;
// Mendefinisikan fungsi untuk proses input array void InputArray (int A[] , int N) {
for (int C=0; C<N; C++) {
cout«" Masukkan nilai A["«C«"] : "; cin»A[C]
// Mendefinisikan fungsi untuk menghitung jumlah (sum)
// dari semua el emen array
long Jumlah { int :A[ ]/ int N) {
Pemrograman
long jml = 0;
-// Menjumlahkan semua elemen for (int C=0; C<N; C++) {
jml += A[C]; return jml;
// Fungsi utama int main() {
int X[100]; // Elemen maksimal adalah 100 int BanyakElemen;
long HASIL;
cout«"Masukkan banyaknya elemen yang diinginkan cin»BanyakElemen;
cout«endl ;
// Memanggil fungsi InputArray InputArray(X, BanyakElemen);
// Memanggil fungsi Jumlah dan menampung hasilny^
// ke variabel HASIL
HASIL = JumlahfX, BanyakElemen); // Menampilkasn hasil
cout«" \nHasilnya = "«HASIL; retun 0;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Masukkan banyaknya elemen array yang diinginkan : 5 Masukkan nilai A[0] : 10
Masukkan nilai A[l] : 20 :30 :40 :50 Masukkan nilai A[2] Masukkan nilai A[3] Masukkan nilai A[4] Hasilnya =150
Pada prakteknya, dalam program C++ parameter yang bertipe array ini sering diganti dengan parameter yang bertipe pointer. Berikut ini contoh program yang memperlihatkan bahwa parameter dengan tipe array dapat diganti dengan tipe pointer. Adapun program ini merupakan program modifikasi dari program sebelumnya.
Kode Program 8-13
tinclude <iostream>
using namespace std;
// Mendefinisikan fungsi untuk proses input array
// dengan parameter A bertipe pointer
void InputArray { int *A, int N) { for (int C=Q? C<N; C++) {
cout«"Masukkan nilai A["«C«"] : "; cin»A[C]
// Mendefinisikan fungsi untuk menghitung jumlah (sum)
// dari semua elemen array
long Jumlah {int *A, int N) { long jml = 0;
// Men jumlah kan semua el emen array
for {int C=0; C<N; C++) { jml += A[C] ; } return jml; // Fungsi utama int main() {
int X[100]; // Elemen maksimal adalah 100 int BanyakElemen;
long HASIL;
:Cout«"Masukkan banyaknya elemen yang dilnginkan : c in»BanyakEleinen ;
cout«endl;
// Memanggil fungsi InputArray InputArray(X, BanyakE1emen);
// Memanggil fungsi Jumlah dan menampung hasilnya
// ke varlabel HASIL
HASIL = Jumlah{X, BanyakElemen);
.-// Menampilkan hasil
cout«" \nHasilnya = "«HASIL;
Hasil yang akan didapatkan adalah sama seperti program sebelumnya.
Pemrograman
C-8.4.5 Melewatkan Parameter yang Bersifat Konstan
Sejauh ini kita hanya membuat fungsi dengan parameter-parameter yang dapat diubah nilainya. Sekarang, kita akan mempelajari bagaimana parameter sebuah fungsi dapat bersifat tetap. Artinya, di dalam fungsi nilai parameter tidak dapat diubah. Untuk melakukan hal ini, kita hanya menambahkan kata kunci const di depan parameter tersebut. Berikut ini contoh penggunaannya di dalam program.
Kode Program 8-14
#include <iostream>
using namespace std;
// Mendefinisikan fungsi untuk menghitung keliling lingkaran double KelilingLingkaran(const float PI, int jari_jari) {
return (2*PI*jari_jari);
m
// Fungsi utama int main{) { int R; double HASIL;cout«"Masukkan panjang jari-jari lingkaran
// Memanggil fungsi KelilingLingkaran JHASIL = KelilingLingkaran(3.14, R);
// Menampilkan hasil yang didapatkan cout«"Kelilingnya = "«HASIL; return 0;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
cin»R
Masukkan panjang jari-jari lingkaran : 1 Kelilingnya = 6.28
Untuk membuktikan bahwa parameter konstan tidak dapat diubah nilainya, perhatikan potongan sintaks program di bawah ini.
int TambahSatu(const int X) {
X *> X + If // SALAH, Compiler tidak akan mengizinkan
// karena X bersifat tetap
return X/
8.4.6 Mengeset Parameter dengan Nilai Default
Nilai dari parameter yang terdapat dalam sebuah fungsi dapat kita set dengan nilai default, artinya jika kita tidak mendefinisikannya pada saat pemanggilan, maka nilai yang akan digunakan oleh fungsi adalah nilai default. Untuk melakukan hal ini kita hanya perlu mengisikan nilai parameter bersangkutan pada saat kita mendefinisikan fungsi. Adapun bentuk umum dari pembuatan fungsi yang menggunakan nilai default pada parameternya adalah seperti yang tampak di bawah ini.
tipe_data jnama_fungsi (tlpe_data parameter! « n±lai_default,
return nilai__kembalian; }
Berikut ini contoh program yang di dalamnya terdapat sebuah fungsi dengan nilai default.
#include <iostream ising namespac
kan fungsi untuk menghitung volume balok
long VolumeBalokdnt panjang, int lebai
Mendeklarasikan variabel P dengan nilai 50 Mendeklarasikan variabel L dengan nilai 10 Mendeklarasikan variabel T dengan nilai 2
int main(
int P = 50; int L = 10; int T = 2;
ylong HASIL;
;••// Memanggil fungsi dengan tiga parameter HASIL = VolumeBalok(P, L, T ) ;
cout«"Volume Balok = tt«HASIL<endl; ''/ Memanggil fungsi dengan dua parameter
HASIL = VolumeBalok(P, L) ;
cout«"Volume Balok = "«HASIL<endl; // Memanggil fungsi dengan satu parameter HASIL = VolumeBalok(P);
;:,cout«" Volume Balok = w«HASIL<endl;
return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut :
Volume Balok = 1000 Volume Balok = 2500 Volume Balok = 5000
8.5 Pointer Ke Fungsi
Meskipun fungsi bukan sebuah variabel, namun fungsi masih merupakan objek yang memiliki lokasi fisik di memori. Hal ini menunjukkan bahwa nilai dari sebuah fungsi dapat kita ambil melalui pointer. Perlu sekali untuk diperhatikan bahwa cara untuk mendapatkan alamat dari sebuah fungsi adalah dengan menyebutkan nama fungsi tersebut tanpa tanda kurung maupun parameter. Sebagai contoh, kita mempunyai pointer P yang menunjuk ke tipe int dan kita juga memilik fungsi Tambah ( ) yang mengembalikan tipe int. Kemudian kita akan memerintahkan pointer P untuk menunjuk ke alamat dari fungsi Tambah ( ) . Maka contoh sintaks yang dapat dituliskan adalah sebagai berikut:
Kode Program 8-16
tinclude <iostream> using namespace std;
// Mendefinisikan fungsi tambah int Tambah (int X, int Y) {
return (X + Y) ;
// Fungsi utama int main { ) {
// Mendeklarasikan pointer ke fungsi Tambah () // dengan parameter (int, int)
int (*P) (int, int);
int HASIL; int a=20, b =5;
// VariaJbel untuk menampung nilai balik // Variabel yang akan digunakan
// sebagai parameter
// Memanggil fungsi tambah dan menyimpan nilainya // ke variabel HASIL
•
// Memerintahkan P untuk menunjuk alamat dari fungsi Tambah ()= Tambah;
// Menampilkan hasil melalui pointer P
cout«"Nilai (*P)(20,5) : "« (*P) (a,b) «endl; // Menampilkan hasil melalui variabel HASIL cout«"Nilai HASIL : n«HASIL«endl;
// Menampilkan alamat yang ditunjuk oleh pointer cout«"Nilai P : "«p«endl;
// Menampilkan alamat dari fungsi Tambah cout<<"Nilai Tambah : "«Tambah«endl; return 0;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut: Nilai (*P)(20,5) Nilai HASIL Nilai P Nilai Tambah :25 :25 :00401150 :00401150
8.6 Penimpaan Fungsi (Function Overloading)
Salah satu kelebihan C + + dibandingkan bahasa C adalah karena C++ mendukung fungsi overload. Fungsi overload didefinisikan sebagai fungsi-fungsi dengan nama yang sama tetapi memiliki parameter berbeda. Kata 'berbeda' di sini dapat dilihat dari tiga segi, yaitu dari segi jumlah, tipe data, dan gabungan dari keduanya. Dalam fungsi overload, pada saat kita melakukan pemanggilan fungsi, kompiler akan memilih fungsi yang parameter aktualnya sesuai dengan parameter formalnya. Berikut ini contoh program yang menunjukkan penggunaan fungsi overload.a. Fungsi overload dengan jumlah parameter berbeda
Kode Program 8-17
#include <iostream> using namespace std;
Pemrograman C++
// Mendefinisikan fungsi Tulis dengan satu parameter void Tulis(char* S) {
cout«S«endl ;
// Mendefinisikan fungsi Tulis dengan dua parameter void Tulis(char* SI, char* S2) {
cout«Sl«" "«S2«endl; }
// Mendefinisikan fungsi Tulis dengan tiga paramete\ void Tulis(char* SI, char* 52, char* S3) {
cout«Sl«" "«S2«" "«S3«endl;
// Fungsi utama int main() {
// Melakukan pemanggilan fungsi Tulis Tulis ("Budi")
,-Tulis("Penerbit", "INFORMATIKA"); Tulis("Mengungkap", "Rahasia", "C++") return 0;
Hasil yang akan diberikan dari program diatas adalah sebagai berikut:
Budi
Penerbit INFORMATIKA Mengungkap Rahasia C+ +
Fungsi overload dengan tipe data parameter berbeda
Kode Program 8-18 #include <iostreain>
using namespace std;
// Mendefinisikan fungsi Tulis dengan parameter hertipe
// char*
void Tulis(char* X) { cout«X«endl ;
// Mendefinisikan fungsi Tulis dengan parameter bertipej // int
void Tulis(int X) { cout«X«endl;
// Mendefinisikan fungsi Tu // double
void Tulis(double X) { cout«X«endl ;
engan parameter bertipe
// Fungsi utama int main() {
// Melakukan pemanggilan fungsi Tulis
\ Tulis("C++");
I Tulis(lOO); ' Tulis(21.0378);
return 0; }
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
C+ + 100 21.0378
c. Fungsi overload dengan jumlah dan tipe data parameter berbeda
Kode Program 8-19 #include <iostream>
using namespace std;
// Mendefinisikan fungsi Tulis dengan parameter berjumlah
// 1 dan bertipe int
void Tulis (int X) { cout«X«endl ;
// Mendefinisikan fungsi Tulis dengan parameter berjumlah
// 2 dan bertipe char*
void Tulis (char* SI, char* S2) { cout«Sl«" "«S2«endl;
// Fungsi utama int main ( ) {
// Melakukan pemanggilan fungsi Tulis
Tulis (100) ; : | IHHHHJJII
uli s("Penerbi t", return 0;
1INFORMATIKA"
1
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
100
Penerbit INFORMATIKA
8.7 Mengembalikan Nilai Bertipe Pointer
Dalam C+ + , kita dapat membuat fungsi yang mengembalikan nilai berupa pointer. Untuk melakukan hal ini tentu kita harus mendeklarasikan tipe data dari nilai kembalian dengan pointer. Berikut ini contoh program yang di dalamnya mengandung fungsi yang mengembalikan pointer ke tipe char.
Kode Program 8-20
finclude <iostream> using namespace std;
// Mendefinisikan fungsi untuk mengembalikan string
// dari karakter yang dicari
char *CariKarakter(char K, char *S) {
// Selama K tidak sama dengan *S dan *S masih ada
I
while '((K != *S)'&& (*S)) {S++; // Carl di alamat berikutn return S;
// Fungsi utama int main() {
char *P; // Pointer untuk menampung nilai kembalian func. char* STRING = "Mengungkap Rahasia C++";
;char Karakter = XC';
":// Memanggil fungsi CariKarakter
P = CariKarakter(Karakter, STRING);
if // Jika ditemukan
cout«"Karakter n«Karakter«" ditemukan pada "«P;
else // Jika tidak ditemukan
cout«"Karakter "«Karakter«" tidak ditemukan"; return
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Karakter C ditemukan pada C + +
8.8 Membuat Prototype Fungsi
Dalam C + + , fungsi-fungsi dapat dideklarasikan terlebih dahulu sebelum dilakukan pendefinisian. Definisi fungsi baru dibuat setelah pembuatan fungsi utama. Hal ini disebut dengan istilah prototype. Prototype akan mempermudah kita dalam mengenali daftar fungsi yang tersedia atau akan didefinisikan di dalam program. Adapun bentuk umum dari pembuatan prototype fungsi adalah seperti tarnpak di bawah ini.
r«uneter2, ...;
Berikut ini contoh program yang di dalamnya terdapat prototype fungsi.
tinclude <iostream> using namespace :std;
// Membuat prototype (pendeklarasian fungsi)
int Kali(int X, int Y) ; // Mendeklarasikan fungsi Kali void Tulis(int:S); // Mendeklarasikan fungsi Tulis
// Fungsi Utama
' nt main() {
K
nt Bilanganl, Bilangan2, HASIL; out«"Masukkan bilangan pertama .out« "Masukkan bilangan kedua cout«endl ;cin»Bilanganl; cin»Bilangan2;
// Menggunakan fungsi Kali
HASIL = Kali(Bilanganl, Bilangan2)
Pemrograman C++
// Menggunakan fungsi Tulis Tulis(HASIL); •
return 0;
// Membuat definisi fungsi Kali int Kali (int X, int Y) {
return (X * Y) ;
// Membuat definisi fungsi Tulis void Tulis (int S) {
cout«S«endl;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :
Masukkan bilangan pertama : 10 Masukkan bialngan kedua : 25
250
8.9 Fungsi Inline (Inline Function)
Pada saat kita mendefinisikan sebuah fungsi, kompiler akan membuat satu set statemen di dalam memori. Ketika pemanggilan fungsi tersebut, eksekusi program akan meloncat ke statemen-statemen tersebut. Kemudian setelah fungsi mengembalikan nilai, maka eksekusi program akan kembali meloncat ke baris selanjutnya (baris setelah pemanggilan fungsi). Jika kita melakukan pemanggilan fungsi tersebut sebanyak 5 kali, maka kompiler juga akan melakukan proses tersebut sebanyak 5 kali. Apabila fungsi yang kita definisikan hanya terdiri dari sedikit statemen (misalnya satu atau dua baris), hal ini tentu akan mengurangi efisiensi program karena kompiler harus meloncat keluar masuk untuk melakukan proses tersebut. Kata 'efisien' bagi seorang programmer tentu akan dihubungkan dengan masalah 'kecepatan' eksekusi sebuah program. Untuk menghindari hal ini, C + + menyediakan fitur yang disebut dengan fungsi inline (inline function), yaitu dengan menggunakan kata kunci inline.
Konsep dasar dari inline function adalah proses penyalinan (copy) baris yang terdapat pada definisi fungsi ke baris pada saat kita melakukan pemanggilan fungsi tersebut. Artinya, jika kita membuat fungsi inline, kompiler tidak menyimpannya ke dalam memori melainkan hanya akan membuat salinan kode dari fungsi tersebut. Hal ini tentu tidak membutuhkan proses peloncatan statemen seperti pada saat kita membuat fungsi biasa sehingga proses eksekusinya akan lebih cepat. Berikut ini program yang menunjukkan pembuatan fungsi inline.
Kode Program 8-22
Mnclude <iostrearn> using namespace std;
// Mendefinisikan fungis inline yang mengalikan bilangan dengan // 2
inline int Kali2(int X) {
return X * 2;
// Fungsi utama int main() {
int HASIL;
//Melakukan pemanggilan fungsi inline untuk pertama kalil
HASIL = Kali2 (10) ; ;" cout« "Hasil = "«HASIL«endl;
//Melakukan pemanggilan fungsi inline untuk kedua kali
HASIL = Kali2 (20) ; ; cout«"Hasil = u«HASIL«endl; ;
//Melakukan pemanggilan fungsi inline untuk ketiga kali
HASIL = Kali2(30); • cout«"Hasil = "«HASlL«endl;
return 0;
}: . ,,:;.;;;:^:si,,:, , ,wto -, -- :. :
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Hasil = 20 Hasil = 40 Hasil = 60
Pemrograman
Jika kita amati cara kerjanya, sebenarnya kompiler menerjemahkan program di atas seperti sintaks berikut. akan
Kode Program 8-23
tinclude <iostream> using namespace std;
// Mendefinisikan fungis inline yang mengalikan bilangan dene
// 2
inline int Kali2(int X) {
return X * 2; // yang dicetak tebal adalah statemen
// yang akan disalin (di-copy)
// Fungsi utama
int main() { int HASIL;
//Melakukan pemanggilan fungsi inline untuk pertama kal
jHASIL = 10 * 2; // Melakukan penyalinan statemen untuk cout« "Hasil = "«HASIL«endl;
10
//Melakukan pemanggilan fungsi inline untuk kedua kali
HASIL = 20 * 2; // Melakukan penyalinan statemen untuk X = 20 COUt« "Hasil = "«HASIL«endl;
//Melakukan pemanggilan fungsi inline untuk ketiga kali
HASIL = 30 * 2; // Melakukan penyalinan statemen untuk X = 30 cout« "Hasil = "«HASIL«endl;
return 0;
8.10 Rekursi
Rekursi adalah fungsi yang pada saat pendefinisiannya memanggil dirinya sendiri untuk melakukan proses di dalamnya. Contoh paling sederhana untuk menunjukkan proses rekursi adalah pada saat kita membuat program untuk menghitung nilai faktorial dari sebuah bilangan bulat. Adapun sintaks programnya adalah seperti yang tampak di bawah ini.
Kode Program 8-24
#include <iostream> using namespace std;
// Mendef-inisikan fungsi Faktorial int Faktorial (int X) {
if (x==l) return(l);
return X * Faktorial ( X- 1 ) ; // Memanggil dirinya sendiri // Fungsi utama
int m a i n ( ) {
int Bilangan, HASIL;
cout«"Masukkan bilangan yang akan dihitung cin»Bilangan;
]// Memanggil fungsi Faktorial HASIL = F a k t o r i a l ( B i l a n g a n ) ;
// Menampilkan hasil
cout«Bilangan«" ! = "«HASIL; return 0 ;
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut :
Masukkan bilangan yang akan dihitung : 5 5! = 120
Jika fungsi di atas dituliskan dengan fungsi non-rekursi, maka sintaksnya adalah sebagai berikut.
int Faktorial(int X) { hasil = 1; for (int C=l; C<=X; C++) { hasil = hasil * C; } return hasil; Pemrograman C++
BAB 9
INPUT/OUTPUT DALAM
C++
9.1 Pendahuluan
Sejauh ini kita telah banyak menggunakan cout (dibaca si out) untuk menuliskan ke layar dan cin (dibaca si in) untuk membaca nilai dari keyboard tanpa membahas lebih detil mengenai kegunaannya. Pada bagian ini kita akan membahasnya secara terinci melalui contoh-contoh program. Selain itu, sebagai tambahan bagi Anda, di sini akan diberikan juga pengenalan mengenai operasi input dan output (I/O) yang terdapat dalam file. Sistem input dan output yang terdapat di dalam C++ sangatlah kompleks, maka dari itu di sini kita hanya akan membahas pengenalan atau dasar-dasarnya saja.
Secara umum, hirarki kelas dalam C++ yang digunakan untuk proses input dan output adalah sebagai berikut :
Kode Program 8-24
tinclude <iostream> using namespace std;
// Mendefinisikan fungsi Faktorial int Faktorial(int X) {
if (X==l) return(1);
return X * Faktorial(X-l); // Memanggil dirinya sendiri
// Fungsi utama
int main() {
int Bilangan, HASIL;
cout«"Masukkan bilangan yang akan dihitung cin»Bilangan;
// Memanggil fungsi Faktorial HASIL = Faktorial(Bilangan); // Menampilkan hasil
cout«Bilangan«" ! = "«HASIL return
Contoh hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Masukkan bilangan yang akan dihitung : 5 5! = 120
Jika fungsi di atas dituliskan dengan fungsi non-rekursi, maka sintaksnya adalah sebagai berikut.
int Faktorial(int X) { hasil = 1; for ( i n t 01; C<=X; C + O { hasil = hasil * C; ret iasil; Pemrograman C+^
BAB 9
INPUT/OUTPUT DALAM
C++
9.1 Pendahuluan
Sejauh ini kita telah banyak menggunakan cout (dibaca si out) untuk menuliskan ke layar dan cin (dibaca sj in) untuk membaca nilai dari keyboard tanpa membahas lebih detil mengenai kegunaannya. Pada bagian ini kita akan membahasnya secara terinci melalui contoh-contoh program. Selain itu, sebagai tambahan bagi Anda, di sini akan diberikan juga pengenalan mengenai operasi input dan output (I/O) yang terdapat dalam file. Sistem input dan output yang terdapat di dalam C++ sangatlah kompleks, maka dari itu di sini kita hanya akan membahas pengenalan atau dasar-dasarnya saja.
Secara umum, hirarki kelas dalam C++ yang digunakan untuk proses input dan output adalah sebagai berikut:
Pada gambar di atas dapat kita lihat bahwa ios merupakan kelas dasar (virtual base class) yang berisi fasilitas untuk proses input dan output data. Di dalam kelas ini juga didefinisikan anggota-anggota yang dapat digunakan untuk proses pengesetan format data dalam proses input maupun output. Pembahasan mengenai pengesetan format ini akan kita ungkap lebih detil lagi pada sub bab selanjutnya di dalam buku ini. Kelas ios ini dijadikan sebagai kelas dasar dari kelas 1st ream (singkatan dari input stream) dan ostream (singkatan dari output stream).
Kelas istream adalah kelas yang dibuat khusus untuk menangani masalah-masalah input dengan meng-ekstrak fasilitas-fasilitas input yang terdapat pada kelas ios dan tentunya juga melalui penambahan-penambahan yang lainnya. Sedangkan kelas ostream digunakan untuk mengani masalah-masalah output. Dari kedua kelas tersebut, kemudian dibuat lagi sebuah kelas baru yang dinamakan iostream. Oleh karena diturunkan dari dua buah induk, maka kelas iostream ini otomatis dapat menangani masalah-masalah yang bisa ditangani oleh kelas 1st ream dan kelas ostream. Hal inilah yang menyebabkan kita menggunakan iostream sebagai standar untuk melakukan operasi input dan output (I/O) data.
9.2 Stream
Stream adalah suatu peralatan logika (logical device) yang berguna untuk mendapatkan atau memberikan informasi. Stream ini akan dihubungkan dengan peralatan fisik (seperti keyboard, screen (layar) maupun printer) melalui sistem I/O. Semua stream Pemrograman C++
mempunyai kelakuan yang sama, sehingga apabila suatu fungsi I/O dapat dioperasikan ke peralatan fisik yang berbeda. Sebagai contoh, jika kita akan melakukan penulisan data, maka cara yang digunakan untuk menuliskan ke layar maupun ke printer adalah sama. Dalam bahasa C, untuk melakukan hal-hal yang berhubungan dengan proses input dan output data digunakan library standar, yaitu stdio. Namun dalam C+ + , library standar yang digunakan adalah iostream.
Pada saat program C + + memulai proses eksekusi, terdapat empat buah stream yang secara otomatis akan terbuka, yaitu seperti yang terlihat pada tabel di bawah ini.
Nama Stream cin cout cerr clog Kegunaan Input standar Output standar
Kesalahan output standar
cerr yang ter-buffer melalui file log
Peralatan standar Keyboard
Layar (screen) Layar (screen) Layar (screen)
Stream cin, cout dan cerr di dalam C++ ini berkoresponden dengan stdin, stdout dan stderr di dalam bahasa C.
9.3 Input Menggunakan cin
Seperti yang telah dikemukakan sebelumnya bahwa cin adalah suatu stream yang akan merespon proses input yang dilakukan. Stream ini hanya tersedia jika kita memasukkan file header
iostream.h (untuk C + + lama) atau <iostream> (untuk C + +
standar) di dalam program yang kita buat. Sebagai contoh, berikut ini contoh program yang menunjukkan penggunaan stream cin.
Kode Program 9-1
finclude <iostream> using namespace std; int mainf) {
// Mendeklarasikan sebuah variabel yang bertipe int int X;
// Memberikan informasi kepada user untuk melakukan input cout«"Masukkan sebuah bilangan bulat : ";
// Menggunakan cin untuk merespon input yang akan dilakuka: cin»X;
-// Menampilkan nilai X cout« "Nilai X : "«X; 'return 0;
Pada program di atas terdapat penggunaan stream cout, namun untuk sementara ini kita belum perlu mempedulikannya. Di sini, kita hanya akan fokus ke statemen yang melakukan input, yaitu cin»X;. Statemen tersebut akan menyebabkan input yang dilakukan oleh user melalui keyboard akan disimpan ke dalam variabel X. Pada penggunaan stream cin digunakan pula operator ». Operator ini telah di-overload sehingga dapat berguna untuk berbagai jenis parameter, seperti int, char, f l o a t dan sebagainya. Oleh karena di sini kita menggunakan variabel X yang bertipe int, maka fungsi yang akan dipanggil adalah sebagai berikut :
istreait* operator» (int &)
Hal inilah yang berarti jika kita memasukkan nilai 12 melalui
keyboard, maka nilai tersebut akan disimpan ke dalam variabel X.
Sebagai bukti, berikut ini contoh hasil yang diberikan dari program di atas.
Masukkan sebuah bilangan bulat: 12 Nilai X : 12
Dengan menggunakan operator », kita dapat melakukan input dengan satu penulisan cin. Maksud dai pernyataan ini adalah kita dapat melakukan penyingkatan penulisan dalam proses input yang akan dilakukan. Sebagai contoh, terdapat sintaks seperti di bawah ini. int X, Y, Z; cout«"Masukkan nilai X : "; cin»X,• cout«"Masukkan nilai Y : "? cin»Y; Masukkan nilai Z I Pemrograman
Maka sintaks tersebut dapat disingkat penulisannya dengan menggunakan sintaks berikut :
int: X, Y, cout« "Masuk cin»X»Y»Z
Hasil yang akan diberikan dari program di atas adalah sama. Artinya, input pertama akan disimpan ke dalam variabel X, input kedua akan disimpan ke dalam variabel Y dan input ketiga akan disimpan ke dalam variabel Z. Untuk membuktikannya, perhatikan dua contoh program berikut.
9.3.1 Menggunakan Cara Pertama
Kode Program 9-2Mnclude <iostream> using namespace std; int main() {
// Mendeklarasikan variabel X, Y dan Z
// yang mas ing-mas ing bertipe int
int X, Y, Z;
cout« "Masukkan nilai X .- w;
cin»X;
cout«"Masukkan nilai Y cin»Y;
cout«"Masukkan nilai Z : "; cin»Z;
// Menampilkan nilai X, Y dan Z cout«"Nilai X : "«X«endl; cout«"Nilai Y : "«Y«endl; cout«"Nilai Z : M«z«endl
return
Contoh hasil yang akan diberikan dari program di
Masukkan nilai X : 10 Masukkan nilai Y : 20 Masukkan nilai Z : 30 Nilai X : 10 Nilai Y : 20 Nilai Z : 30
9.3.2 Menggunakan cara Kedua
Kode Program 9-3tinclude <iostream> using namespace std; int main() {
//. Mendeklarasikan variabel X, Y dan Z
// yang masing-masing bertipe int
int X, Y, Z;
cout« "Masukkan nilai X, Y dan Z : ";
icin»X»Y»Z;
// Menampilkan nils: cout«"Nilai X : "<« cout« "Nilai Y : ---"<-cout«"Nilai Z : "<<
Apabila dijalankan, program di atas akan menyimpan hasil input ke dalam variabel-variabel tersebut (X, Y dan Z) sehingga contoh hasilnya adalah sebagai berikut:
Masukkan nilai X, Y dan Z : 10 20 30 Nilai X : 10 Nilai Y : 20 Nilai Z : 30 Pemrograman
9.4 Output Menggunakan cout
Dalam C + + , untuk melakukan output ke peralatan standar, yaitu layar (screen) adalah dengan cara menggunakan stream cout. Adapun operator yang digunakan adalah operator «. Operator ini juga telah di-overload sehingga dapat digunakan untuk berbagai macam tipe data. Berikut ini contoh penggunaan cout pada variabel tunggal dalam sebuah program.
Kode Program 9-4
ttinclude <iostream> using namespace std; int main() {
int X = 100;
// Melakukan output terhadap nilai X cout«X;
return 0;
Sama seperti cin, cout juga dapat melakukan output secara beruntun. Artinya, satu penulisan cout dapat diikuti oleh banyak operator «. Berikut ini contoh program yang menunjukkan hal tersebut.
#include <iostream> using namespace std; int main() {
int X = 100, Y = 200, Z = 300;
// Melakukan output terhadap nilai X, Y dan Z cout«X«' V«Y«' V«Z;
return 0;
Perlu Anda perhatikan bahwa program di atas menggunakan kutip tunggal (") untuk menuliskan sebuah karakter spasi. Hal ini karena spasi adalah sebuah karakter, bukanlah string. Walaupun demikian
kita juga dapat menggunakan kutip ganda ("") untuk menuliskan sebuah spasi, namun hal ini berarti kita menganggap spasi tersebut sebagai string, bukan sebagai karakter. Adapun hasil yang akan diberikan dari program di atas adalah sebagai berikut:
100 200 300
9.5 Mengatur Format Input/Output
C + + mengizinkan kita untuk mengeset format dari operasi-operasi I/O yang dilakukan. Sebagai contoh, kita dapat mengeset lebar kolom dari data yang akan kita tampilkan ke layar, menentukan berapa digit angka di belakang koma dan yang lainnya. Dalam C+ + , terdapat dua buah cara untuk mengeset operasi I/O. Pertama, kita dapat mengakses secara langsung anggota-anggota dari kelas
ios dan yang kedua adalah dengan menggunakan fungsi-fungsi
khusus yang disebut dengan manipulator yang dimasukkan sebagai bagian dari ekspresi I/O. Adapun pembahasan mengenai kedua cara tersebut dapat Anda lihat di bawah ini.
9.5.1 Menggunakan Anggota dari Kelas ±
IOSKelas ios mempunyai sebuah tipe enumerasi yang disebut dengan
fmtflags dimana nilai-nilainya digunakan untuk melakukan
pengesetan format data. Adapun nilai-nilai yang dimaksud adalah seperti yang terlihat di bawah ini.
adjustfield fixed left showbase unitbuf basefield floatfield oct showpoint uppercase boolalpha hex right showpos dec internal scientific skipws
Ketika flag oct diset, maka output akan ditampilkan dalam bilangan oktal (basis 8). Begitupun apabila flag hex diset, maka output akan ditampilkan dalam bentuk bilangan heksadesimal Pemrograman C++
(basis 16). Sedangkan untuk mengembalikan ke bilangan desimal (basis 10), maka lakukan pengesetan terhadap flag dec. Berdasarkan keadaan default, suatu bilangan akan ditampilkan dalam bentuk bilangan desimal. Pengesetan terhadap flag l e f t akan menyebabkan output ditampilkan rapat kiri, begitupun dengan flag right akan menyebabkan output ditampilkan rapat kanan. Sedangkan flag internal berguna untuk memasukkan sebuah karakter di antara karakter dasarnya. Namun, apabila tidak ada satupun dari flag-flag tersebut ( l e f t , right dan internal) yang diset, maka secara default output akan ditampilkan rapat kanan. Apabila flag showbase diset, maka ini akan menyebabkan ditampilkannya basis dari bilangan tersebut. Sebagai contoh, jika terdapat bilangan IF (dalam heksadesimal), maka output yang akan ditampilkan adalah OxlF. Flag uppercase yang terdapat di atas akan menyebabkan karakter-karakter output ditampilkan dalam huruf kapital (besar).
Pengesetan flag showpos akan menyebabkan penambahan tanda + (plus) di depan bilangan positif. Sedangkan flag showpoint akan menyebabkan penambahan nol di belakang koma pada setiap bilangan floating-point. Pada saat flag fixed diset, maka bilangan floating-point akan ditampilkan dalam notasi normal. Sedangkan apabila flag s c i e n t i f i c diset, maka bilangan floating-point akan ditampilkan dalam notasi scientific.
Flag unitbuf akan menyebabkan dibuangnya buffer setiap selesai operasi insert. Sedangkan flag skipws berguna untuk membuang karakter white-space (tab, spasi dan baris baru) ketika menjalankan input ke stream.
Flag boolalpha digunakan untuk melakukan input dengan menggunakan tipe boolean, yaitu true dan false. Flag oct, dec dan hex dapat diwakili oleh flag basefield. Begitu juga dengan flag l e f t , right dan internal juga dapat diwakili oleh flag a d j u s t f i e l d . Dan yang terakhir, flag fixed dan s c i e n t i f i c juga dapat diwakili oleh flag f l o a t f i e l d .
Setelah mengetahui kegunaan masing-masing flag tersebut, maka sekarang kita akan membahas cara umum untuk mengeset flag-flag tersebut, yaitu dengan menggunakan fungsi setf (). Adapun bentuk umum penulisannya adalah sebagai berikut :
setf(fmtflags flags);
Untuk dapat lebih memahaminya, berikut ini satu contoh program yang menunjukkan cara melakukan pengesetan terhadap format data dalam operas! I/O dalam C+ + .
Kode Program 9-6
#include <iostream> using namespace std? int main() {
// Melakukan pengesetan terhadap flag uppercase cout.set f(ios::uppercase} ;
cout«"Mengungkap Rahasia C++"«endl;
// Melakukan pengesetan terhadap flag showpos cout.set f(ios::showpos);
cout«12; return 0;
Apabila program di atas dijalankan, maka akan memberikan hasil seperti yang tampak di bawah ini.
MENGUNGKAP RAHASIA C+ + + 12
Seperti yang terlihat di atas bahwa teks "Mengungkap Rahasia C+ + " akan diampilkan dalam huruf kapital. Sedangkan bilangan 12 akan ditampilkan dengan + 12 yang menandakan bahwa bilangan tersebut adalah bilangan positif.
9.5.2 Menggunakan Manipulator
Setelah mengetahui pengesetan menggunakan cara pertama, maka sekarang kita akan membahas cara pengesetan dengan menggunakan cara yang lainnya, yaitu dengan menggunakan
manipulator. Dalam C+ + , terdapat beberapa manipulator yang
merupakan fitur baru yang ditambahkan. Hal ini berarti bahwa kompiler C++ lama tidak mendukung adanya manipulator. Adapun Pemrograman C++
manipulator yang dimaksud di sini adalah seperti
pada tabel di bawah ini.
yang terlihat Manipulator boolalpha dec endl ends fixed flush hex internal left noboolalpha noshowbase noshowpoint noshowpos noskipws nounitbuf nouppercase oct resetiosf lags (fmtflags f) right scientific setbase(int base) setfilKint oh) setiosf lags (fmtflags f) setprecision ( int P) setw(int w) showbase Kegunaan
Mengaktifkan flag boolalpha Mengaktifkan flag dec Menampilkan baris baru dan membuang stream
Menampilkan null Mengaktifkan flag fixed Membuang stream Mengaktifkan flag hex Mengaktifkan flag internal Mengaktifkan flag left Mematikan flag boolalpha Mematikan flag showbase Mematikan flag showpoint Mematikan flag showpos Mematikan flag skipws Mematikan flag unitbuf Mematikan flag uppercase Mengaktifkan flag oct
Mematikan flag yang dituliskan (/) Mengaktifkan flag right Mengaktifkan flag scientific Mengeset nomor basis ke base Mengisi karakter dengan ch Mengaktifkan flag yang dituliskan (f) Mengeset presisi digit
Mengeset lebar kolom ke w Mengaktifkan flag showbase
Operasi Input/Output Input/Output Output Output Output Output Input/Output Output Output Input/Output Output Output Output Input Output Output Input/Output Input/Output Output Output Input/Output Output Input/Output Output Output Output
showpoint showpos skipws unitbuf uppercase ws
Mengaktifkan flag showpoint Mengaktifkan flag showpos Mengaktifkan flag skipws Mengaktifkan flag unitbuf Mengaktifkan flag uppercase Tidak memperdulikan white-space
Output Output Input Output Output Input
Untuk menggunakan manipulator yang tercantum di atas kita harus memasukkan file header iomanip.h. (untuk C + + lama) atau
<iomanip> (untuk C++ standar) Berikut ini contoh penggunaan
salah satu manipulator di atas adalah sebuah program. Kode Program 9-7
#include <iostream> #include <iomanip> using namespace std; int main{) {
// Menggunakan flag set fill, setw dan endl cout«setfill( ' * ' )«setw(8)«12«endl;
V Menggunakan flag oct dan endl :out«oct«64«endl ;
// Menggunakan flag hex
:out«hex«16«endl ;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
100 10
Pemrograman
9.6 Input dan Output pada File
Dalam membuat program kadang kala kita sering menjumpai kasus yang berhubungan dengan proses input dan output file. Sebenarnya bentuk ini adalah bentuk penyederhanaan dari sitem I/O general, karena yang diolah hanyalah file. Di dalamnya telah didefinisikan fungsi-fungsi khusus untuk proses pemanipulasiannya. Maka dari itu, pada bagian ini kita akan membahas dasar-dasar yang terkandung di dalamnya.
9.6.1 Kelas yang Berhubungan dengan File
Seperti yang telah dikemukakan sebelumnya bahwa untuk menjalankan operasi I/O kita harus memasukkan file header
lost ream, h atau <iostream>. Terdapat beberapa buah kelas
yang didefinisikan di dalamnya, yaitu if stream, of stream dan
f stream. Kelas-kelas ini merupakan turunan dari kelas istream, ostream dan iostream. Seperti yang kita ketahui bahwa 1st ream, ostream dan iostream adalah kelas turunan dari
kelas ios. Hal ini tentu akan menyebabkan kelas if stream,
of stream dan f stream juga dapat mengakses data-data dan
semua operasi yang terdapat pada kelas ios.
9.6.2 Membuka dan Menutup File
Di dalam bahasa C + + , kita membuka file dengan menghubungkannya ke sebuah stream. Ini berarti bahwa sebelum kita dapat membuka file, kita harus mendapatkan stream terlebih dahulu. Seperti yang telah kita bahas di atas bahwa terdapat tiga macam stream, yaitu stream untuk proses input (if stream), untuk proses output (of stream) dan untuk proses input/output ( f stream). Maka dari itu, jika kita ingin membuat variabel stream untuk proses input, maka harus kita deklarasikan dengan tipe if stream. Begitu juga dengan variabel stream untuk proses output dan input/output, masing-masing harus dideklarasikan sebagai ofstream dan fstream. Berikut ini contoh yang menunjukkan pendeklarasian variabel-variabel stream tersebut.
ifstream input; // variabel stream untuk proses input ofstream output; // variabel stream untuk proses output fstream InOut; // variabel stream untuk proses input/output
Setelah mendeklarasikan variabel stream tersebut, maka langkah selanjutnya adalah menghubungkannya ke file yaitu dengan cara memanggil fungsi open ( ) . Fungsi ini merupakan anggota dari masing-masing stream di atas. Berikut ini prototype dari fungsi open ( ) dalam masing-masing stream tersebut.
void ifstream::open(const char* filename,
ios::openmode mode = i o s : : i n ) ; void ofstream: :open(const char* filename,
ios::openmode mode = ios::out ios::trunc);
void fstream::open(const char* filename,
ios::openmode mode = ios::in
Parameter f i 1 ename di atas tidak lain adalah nama file yang akan dibuka, termasuk lokasinya (path-nya). Sedangkan mode adalah menandakan bagaimana file tersebut akan dibuka. Seperti yang kita lihat pada prototype di atas bahwa kita dapat melakukan kombinasi dari nilai-nilai mode tersebut dengan melakukan operasi OR (menggunakan operator | ) terhadapnya. Untuk lebih lengkapnya, berikut ini nilai-nilai dari mode di atas.
ios::app, yang akan menyebabkan output dari file tersebut
menjadi ditambahkan (append) pada bagian akhir baris. ios: : ate, akan menyebabkan pencarian ke akhir file ketika file tersebut dibuka.
ios: : in menandakan file tersebut mempunyai kapabilitas untuk input. Sedangkan ios::out adalah untuk output.
ios: : binary akan menyebabkan file yang akan dibuka tersebut
dalam mode biner. Namun secara default, file yang dibuka berada dalam mode teks.
ios: : trunc akan menyebabkan isi file dengan nama yang sama
dengan file yang telah dibuka, akan dipotong atau dibuang sehingga lebarnya menjadi nol.
Berikut ini contoh sintaks di dalam C++ yang berguna untuk membuka suatu file untuk proses output.
// Membuat atau mendeklarasikan variabel stream // untuk proses output
ofstream output;
// Memanggil fungsi open() output.open(wmyf ile", ios s:out)?
Pemrograman C++
Kita dapat melakukan pencegahan jika ternyata file yang akan kita buka tidak ada atau terdapat kesalahan lainnya. Maka dari itu sebaiknya kita menambahkan suatu handler pada sintaks di atas dengan menggunakan sintaks di bawah ini.
if a output) { MB. JHHHHB,
cout«"File tidak dapat dibuka"/
} :i"^^
Setelah mengetahui cara untuk membuka file, maka di dalam program, kita tentu akan menutup file tersebut. Adapun cara yang digunakan untuk melakukan hal tersebut adalah dengan menggunakan fungsi close ( ) . Tidak seperti fungsi open ( ) , fungsi close () ini tidak mempunyai parameter. Sebagai contoh, apabila kita telah menghubungkan file dengan stream yang bernama mystream, maka kita akan menutupnya dengan perintah berikut :
mystream.close()
9.6.3 Membaca dan Menuliskan Teks ke File £
Ol
Membaca dan menuliskan teks ke file sama mudahnyavSe
melakukan input dan output ke terhadap I/O console, yaififctfengan' menggunakan operator « dan ». Perbedaannya di sini kita tidak menggunakan stream cout dan cin, melainkan menggunakan stream yang kita deklarasikan sendiri dan telah terhubung dengan sebuah file. Berikut ini contoh program yang akan membuat sebuah file sebagai output.
Kode Program 9-8 #include <iostream>
#include <fstream> using namespace std; int m a i n ( ) {
/ Mendeklarasikan stream untuk proses output ofstream output;
o u t p u t . o p e n ( " D : / C O B A . T X T " ) ;
I
// Melakukan pencegahan terhadap terjadinya error if ( ! o u t p u t ) {cout«"File tidak dapat dibuka"«endl; Bab 9: Input/Output dalam C+^
return 1;
// Menuliskan teks ke dalam file tersebut output« "Mengungkap Rahasia C++"«endl; output«"0leh : Budi Raharjo"«endl ;
output«"Penerbit INFORMATIKA Bandung "«endl // Menutup file
output.close(); return. 0;
Apabila program di atas dijalankan, maka kita akan melihat terbentuknya sebuah file bam bernama COBA.TXT di dalam drive D. Adapun isi file tersebut adalah sebagai berikut:
Mengungkap Rahasia C+ + Oleh : Budi Raharjo
Penerbit INFORMATIKA Bandung
Sekarang kita akan melakukan pembuatan program yang melakukan proses input ke dalam sebuah variabel. Adapun sintaks programnya adalah seperti yang terlihat di bawah ini.
Kode Program 9-9
tinclude <iostream> tinclude <fstream> using namespace std; int main() {
// Mendeklarasikan stream untuk proses input ifstream input;
// Membuka file yang dibuat pada program di atas input.open{"D:/COBA.TXT");
if (!input) {
cout«"File tidak dapat dibuka"«endl; return 1; char S[100]; input»S; cout«S«endl ; input»S; ; cout«S«en^l input»S; '?! cout«S«en<H; • : // Menutup file input .close ( ) ; return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut :
Mengungkap Rahasia
C + +
Hasil di atas menunjukkan bahwa kita telah melakukan input terhadap variabel S dengan nilai teks yang pertama kali di dalam file. Selanjutnya S diganti lagi nilainya dengan teks kedua di dalam file, begitu juga untuk nilai S yang ketiga. Hal inilah yang menyebabkan nilai S berubah-ubah pada saat ditampilkan ke layar.
9.7 Fungsi put ( ) dan get ( )
Fungsi put ( ) dan get ( ) dapat juga digunakan untuk proses penulisan dan pembacaan data. Lebih tepatnya, untuk menuliskan data kita menggunakan fungsi put ( ) dan untuk membaca data kita menggunakan fungsi get ( ) . Adapun bentuk umum dari penggunaan kedua buah fungsi ini adalah seperti yang terlihat di
bawah ini. ^^_______
ostream &put(char ch); istream &get(char& ch);
Berikut ini contoh program yang menujukkan penggunaan fungsi
p u t ( ) .
Kode Program 9-10
#include :<iostream> #include <fstream> using namespace std;
int main() { ofstream output output.open("D:/TES
.f {!output) {
cout«"File tidak dapat dibuka"«endl; return 1; int C=65; while (char(C) <= XZ') output.put(char(C)); C++; return 0;
Apabila program di atas dijalankan, maka akan terbentuk sebuah file baru yang bernama TEST.TXT di dalam drive D. Selanjutnya apabila kita buka file tersebut, maka isinya adalah sebagai berikut:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Setelah mengetahui penggunaan dari fungsi put ( ) , maka selanjutnya kita akan menuliskan program yang akan menunjukkan penggunaan fungsi get ( ) . Di sini, kita akan menggunakan file yang telah dibentuk sebelumnya, yaitu file TEST.TXT. Adapun sintaks programnya dapat dilihat di bawah ini.
ttinclude <iostream> #include <fstream> using namespace std; ;.nt main () { ifstream input; input.Open("D:/TEST.TXT"); Pemrograman C++ char C; while (input) input.get(C); if (input) COut«C; ama. be1 um
Hasil yang akan ditampilkan di layar adalah sebagai berikut ABCDEFGHIJKLMNOPQRSTUVWXYZ
Hasil di atas menunjukkan bahwa data yang tersimpan dalam file TEST.TXT (yang berbentuk karakter-karakter) satu per satu (melalui proses pengulangan) akan disimpan ke dalam variabel C dengan menggunakan fungsi get(). Selanjutnya nilai C tersebut ditampilkan ke layar dengan menggunakan perintah cout.
9.8 Fungsi write (j dan readQ
Selain cara-cara yang telah disebutkan sebelumnya, terdapat cara lain untuk melakukan proses penulisan dan pembacaan data ke/dari dalam file, yaitu dengan menggunakan fungsi w r i t e ( ) dan read ( ) . Fungsi-fungsi ini kebanyakan digunakan untuk file biner. Dari namanya kita tentu telah mengetahui bahwa fungsi write ( ) itu digunakan untuk proses penulisan data. Sedangkan fungsi read ( ) digunakan untuk membaca data. Berikut ini bentuk umum dari penggunaan kedua buah fungsi tersebut.
ostream &write(const char **>u£, streamsize n)/ istream &read(const char *buf, streamsize n);
Di sini, fungsi w r i t e ( ) akan menulis n buah karakter untuk dimasukkan ke stream dari buffer yang ditunjuk oleh pointer buf. Sedangkan fungsi read ( ) akan membaca n buah karakter dari stream untuk ditempatkan ke buffer yang ditunjuk oleh pointer buf, Untuk lebih memahaminya, berikut ini contoh program yang menunjukkan penggunaan fungsi write ( ) dan read ( ) .
Kode Program 9-12
int main() {
// Mendeklarasikan variabel S bertipe SISNA SISWA S;
|
I// Mengisikan nilai ke dalam variabel S IstrcpyfS.NIM, "DQG96549");
IstrcpyfS.Nama, "Budi Raharjo"); Jstrcpy(S.Kota, "Bandung"); IS.Usia = 25;
I w
// Mendeklarasikan stream untuk proses output Jofstream OUTPUT;
•.OUTPUT, open ("D:/DATA", ios:;OUt [ ios::trunc | ios::bin* I if {! OUTPUT) i
cout«"Fiie uiddK dapat. dibuka"«endl; ceturn 1;
I / , - Menuliskan ke s'To^m
OUTPUT.write((char • «S, sizeof(S)}; j OUTPUT.closeO ;
// Mendeklarasikan stream untuk proses input ifstream INPUT;
INPUT.open("D:/DATA", ios::in ios::binary); if (!INPUT) {
cout«"File tidak dapat dibuka"«endl; returnurn 1;
Pemrograman
// Membaca dari stream ke buffer INPUT.read((char *) &S, s i z e o f ( S ) ) // Menampilkan data cout«S. NlM«endl ; cout«S. Nama«endl ; cout«S. Kota«endl ; cout«S. Usia«endl ; INPUT.close( return 0;
Apabila program di atas dijalankan, maka Anda akan melihat hasil sebagai berikut:
DOG96549 Budi Raharjo Bandung 25
Hasil di atas merupakan hasil dari pengambilan data yang terdapat pada file DATA, yaitu file biner yang sebelumnya dibentuk di dalam
drive D. Adapun apabila kita lihat isi dari file biner tersebut (dengan
memakai program atau aplikasi tertentu), maka contoh hasil yang akan diberikan adalah seperti yang tampak di bawah ini.
DOG96549 Budi Raharjo 0yt hOxObBandung A D ^ A pt