Operasi Masukan/Keluaran
Divais I/O Standar dan Aliran I/O
Sebuah program melakukan tiga operasi
dasar: membaca data, memanipulasi data, dan menampilkan hasil. Pada Bab 1, Anda
telah belajar bagaimana memanipulasi data numerik menggunakan operasi-operasi
aritmatik. Pada bab-bab mendatang, Anda akan belajar bagaimana memanipulasi
data tak-numerik. Karena penulisan program untuk I/O cukup kompleks, C++
menawarkan dukungan ekstensif untuk operasi-operasi I/O dengan menyediakan
beberapa operasi I/O terpradefinisi, dimana beberapa di antaranya telah Anda
jumpai pada Bab 1. Pada bab ini, Anda akan belajar tentang beragam operasi I/O
yang dapat meningkatkan fleksibilitas program Anda.
Dalam C++, I/O merupakan sebuah runtun
byte, yang dinamakan dengan aliran (stream),
dari sumber ke tujuan atau destinasi. Byte-byte biasanya berupa karakter,
kecuali jika program memerlukan tipe informasi lain, seperti citra atau suara
digital. Oleh karena itu, aliran merupakan runtun karakter dari sumber ke
tujuan. Ada dua jenis aliran:
Aliran masukan: Runtun karakter dari sebuah divais masukan menuju ke
komputer.
Aliran keluaran: Runtun karakter dari komputer menuju ke sebuah divais
keluaran.
Ingat bahwa divais masukan standar
biasanya adalah papanketik, dan divais keluaran standar biasanya adalah layar
komputer. Untuk menerima data dari papanketik dan mengirim keluaran ke layar,
setiap program C++ harus menggunakan file header iostream. File header ini memuat, di samping yang lain,
definisi-definisi atas dua tipe data, istream (aliran masukan) dan ostream (aliran keluaran). File header ini juga memuat dua
deklarasi variabel, satu untuk cin, yang merupakan singkatan dari common
input, dan satu lagi untuk cout, yang merupakan singkatan dari common
output.
Kedua deklarasi variabel ini sama
dengan statemen C++ berikut:
istream cin;
ostream cout;
Untuk menggunakan cin dan cout, setiap program C++ harus menggunakan direktif praprosesor:
#include <iostream>
Variabel bertipe istream dinamakan variabel aliran masukan; variabel bertipe ostream dinamakan dengan variabel aliran keluaran. Variabel aliran dapat berupa variabel
aliran masukan atau variabel aliran keluaran.
Karena cin dan cout telah didefinisikan dan memiliki makna spesifik bagi kompiler, untuk
menghindari kebingungan, Anda sebaiknya jangan pernah mendefinisikannya-ulang
di dalam program.
Variabel cin memiliki akses terhadap
operator-operator dan fungsi-fungsi yang dapat dipakai untuk mengekstrak data
dari divais masukan standard. Anda telah menggunakan operator ekstraksi
>> untuk membaca data dari divais masukan standard. Bagian selanjutnya
menjelaskan secara detil bagaimana operator ekstraksi >> bekerja. Pada
bagian-bagian mendatang, Anda akan belajar bagaimana menggunakan fungsi get, ignore, peek, dan putback untuk membaca data dengan cara
spesifik.
cin
dan Operator Ekstraksi >>
Pada Bab 1, Anda telah melihat
bagaimana membaca data dari divais masukan standar menggunakan cin dan operator ekstraksi >>. Dimisalkan bahwa besarGaji adalah sebuah variabel double. Perhatikan statemen C++
berikut:
cin >> besarGaji;
Ketika komputer mengeksekusi statemen
ini, ia memasukkan (membaca) angka yang diketikkan pada papanketik dan menyimpa
angka itu di dalam besarGaji. Oleh
karena itu, jika pengguna mengetikkan 15.50, maka nilai yang disimpan di dalam besarGaji adalah 15.50.
Operator ekstraksi >> merupakan operator biner, jadi ia mempunyai dua operand.
Operand sisi-kiri harus berupa sebuah variabel aliran masukan, seperti cin. Karena tujuan dari statemen
masukan adalah untuk membaca dan menyimpan nilai di dalam suatu lokasi memori
dan karena hanya variabel yang merujuk ke lokasi memori, maka operand
sisi-kanan adalah sebuah variabel.
Sintaks atas statemen masukan
menggunakan cin dan operator
ekstraksi >> adalah:
cin >>
variabel >> variabel...;
Seperti yang dapat Anda
lihat pada sintaks tersebut, statemen masukan tunggal dapat membaca lebih dari
satu item data dengan menggunakan operator >> beberapa kali. Setiap
kemunculan >> akan mengekstrak item data berikutnya dari aliran masukan.
Sebagai contoh, Anda dapat membaca besarGaji
dan jamKerja lewat statemen masukan
tunggal menggunakan kode berikut:
cin >> besarGaji >> jamKerja;
Tidak ada perbedaan
antara statemen masukan tersebut dengan dua statemen masukan berikut. Bentuk
mana yang Anda gunakan menjadi gaya yang Anda pilih sendiri.
cin >>
besarGaji;
cin >> jamKerja;
Bagaimana operator
ekstraksi >> bekerja? Ketika memindai masukan berikutnya, >>
melompati semua karakter spasi-putih. Ingat bahwa karakter spasi-putih memuat
spasi dan beberapa karakter tak-tercetak, seperti tab dan karakter garis-baru.
Jadi, kapanpun Anda memisah data masukan dengan baris atau spasi, operator
ekstraksi >> akan mengabaikannya dan mencari data masukan berikutnya di
dalam aliran masukan. Sebagai contoh, dimisalkan bahwa besarGaji dan jamKerja
adalah dua variabel double.
Perhatikan statemen masukan berikut:
cin >> besarGaji
>> jamKerja;
Opsi masukan yang dapat
Anda berikan adalah:
15.50 48.30
atau:
15.50 48.30
atau:
15.50
48.30
dimana statemen masukan
tersebut akan menyimpan 15.50 di dalam besarGaji dan 48.30 di dalam jamKerja.
Perhatikan bahwa masukan pertama dipisahkan oleh satu spasi, masukan kedua dipisahkan
oleh sebuah tab, dan masukan ketiga dipisahkan oleh sebuah baris.
Sekarang dimisalkan bahwa
masukan adalah 2. Bagaimana operator ekstraksi >> membedakan antara
karakter 2 dan angka 2? Operand sisi-kanan dari operator ekstraksi >>
yang membedakan ini. Jika operand sisi-kanan adalah sebuah variabel bertipe
data char, maka masukan 2
diperlakukan sebagai karakter 2 dan, pada kasus ini, nilai ASCII dari 2
disimpan. Jika operand sisi-kanan adalah sebuah variabel bertipe int atau double, maka masukan 2 akan diperlakukan sebagai angka 2.
Selanjutnya, perhatikan
masukan 25 dan statemen:
cin >> a;
dimana a adalah sebuah variabel bertipe
sederhana. Jika a adalah tipe data char,
maka hanya karakter tunggal 2 yang disimpan di dalam a. Jika adalah tipe data int,
maka 25 akan disimpan di dalam a.
Jika a adalah tipe data double, masukan 25 akan dikonversi
menjadi angka desimal 25.0. Tabel 2.1 menyimpulkan diskusi ini dengan
menunjukkan masukan valid untuk sebuah variabel bertipe data sederhana.
Tabel 2.1 Masukan valid untuk sebuah variabel bertipe data sederhana
Tipe data dari a
|
Masukan valid untuk a
|
char
|
Satu karakter yang dapat ditampilkan kecuali spasi-putih
(spasi, tab, dan garis-baru)
|
int
|
Sebuah integer, yang dapat diawali dengan tanda + atau -.
|
double
|
Sebuah angka desimal, yang dapat diawali dengan tanda + atau -. Jika masukan data
adalah sebuah integer, maka masukan akan dikonversi menjadi angka desimal
dengan bagian desimal nol.
|
Ketika membaca data ke
dalam sebuah variabel char, setelah
mengabaikan sembarang karakter spasi-putih yang ada di depan, operator
ekstraksi >> menemukan dan menyimpan karakter; pembacaan berhenti setelah
sebuah karakter tunggal dibaca. Untuk membaca data ke dalam variabel int atau double, setelah mengabaikan sembarang karakter spasi-putih di depan
dan membaca tanda plus atau minus (jika ada), operator ekstraksi >>
membaca dijit-dijit angka, termasuk titik desimal untuk variabel
titik-mengambang, dan berhenti membaca ketika operator ekstraksi menemukan
sebuah karakter spasi-putih atau sebuah karakter selain dijit.
Contoh 2.1
|
|
Dimisalkan bahwa Anda
memiliki beberapa deklarasi variabel berikut:
int a, b;
double z;
char
ch;
Statemen-statemen berikut
menunjukkkan bagaimana operator ekstraksi bekerja.
|
Statemen
|
Masukan
|
Nilai yang disimpan di
dalam memori
|
1
|
cin >> ch;
|
A
|
ch = 'A'
|
2
|
cin >> ch;
|
AB
|
ch = 'A', 'B' ditahan untuk masukan berikutnya
|
3
|
cin >> a;
|
48
|
a = 48
|
4
|
cin >> a;
|
46.35
|
a = 46, .35 ditahan untuk masukan berikutnya
|
5
|
cin >> z;
|
74.35
|
z = 74.35
|
6
|
cin >> z;
|
39
|
z = 39.0
|
7
|
cin >> z >> a;
|
65.78 38
|
z = 65.78, a = 38
|
8
|
cin >> a >> b;
|
4 60
|
a = 4, b = 60
|
9
|
cin >> a >> z;
|
46 32.4
68
|
a = 46, z = 32.4, 68 is
ditahan untuk masukan berikutnya
|
Contoh 2.2
|
|
Dimisalkan bahwa Anda
memiliki beberapa deklarasi variabel berikut:
int a;
double z;
char
ch;
Statemen-statemen berikut
menunjukkkan bagaimana operator ekstraksi bekerja.
|
Statemen
|
Masukan
|
Nilai yang disimpan di
dalam memori
|
1
|
cin >> a >> ch >> z;
|
57 A 26.9
|
a = 57, ch = 'A',
z = 26.9
|
2
|
cin >> a >> ch
>> z;
|
57 A
26.9
|
a = 57, ch = 'A',
z = 26.9
|
3
|
cin >> a >> ch
>> z;
|
57
A
26.9
|
a = 57, ch = 'A',
z = 26.9
|
4
|
cin >> a >> ch
>> z;
|
57A26.9
|
a = 57, ch = 'A',
z = 26.9
|
Perhatikan bahwa pada statemen
1 sampai statemen 4, statemen-statemen masukan sama; namun, data yang
dimasukkan berbeda. Untuk statemen 1, data yang dimasukkan ada pada baris yang
sama yang dipisahkan oleh spasi. Untuk statemen 2, data yang dimasukkan pada
dua baris; dua nilai masukan pertama dipisahkan oleh spasi, dan masukan ketiga
ada pada baris berikutnya. Untuk statemen 3, ketiga nilai masukan dipisahkan
oleh baris, dan untuk statemen 4, ketiga nilai masukan ada pada baris yang
sama, tetapi tidak ada spasi yang memisahkan di antara tiap nilai masukan.
Perhatikan bahwa masukan kedua adalah sebuah karakter tak-numerik. Semua
statemen ini bekerja sebagai berikut.
Statemen 1, 2, dan 3
sangat mudah dipahami. Akan didiskusikan statemen 4. Pada statemen 4, operator
ekstraksi >> pertama-tama mengekstrak 57 dari aliran masukan dan
menyimpannya di dalam a. Kemudian,
operator ekstraksi >> mengekstrak karakter ‘A’ dari aliran masukan dan menyimpannya di dalam ch. Selanjutnya, 26.9 diekstrak dan
disimpan di dalam z.
Perhatikan bahwa statemen
1, 2, dan 3 mengilustrasikan bahwa tanpa memandang apakah masukan dipisahkan
oleh spasi atau oleh baris, operator ekstraksi >> selalu mencari masukan
berikutnya.
Contoh 2.3
|
|
Dimisalkan bahwa Anda
memiliki beberapa deklarasi variabel berikut:
int a, b;
double z;
char
ch, ch1, ch2;
Statemen-statemen berikut
menunjukkkan bagaimana operator ekstraksi >> bekerja.
|
Statemen
|
Masukan
|
Nilai yang disimpan di
dalam memori
|
1
|
cin >> z >> ch >> a;
|
36.78B34
|
z = 36.78, ch = 'B',
a = 34
|
2
|
cin >> z >> ch
>> a;
|
36.78
B34
|
z = 36.78, ch = 'B',
a = 34
|
3
|
cin >> a >> b
>> z;
|
11 34
|
a = 11, b = 34,
komputer menunggu angka berikutnya
|
4
|
cin >> a >> z;
|
78.49
|
a = 78, z = 0.49
|
5
|
cin >> ch >> a;
|
256
|
ch = '2', a = 56
|
6
|
cin >> a >> ch;
|
256
|
a = 256, komputer menunggu
nilai masukan untuk ch
|
7
|
cin >> ch1 >>
ch2;
|
A B
|
ch1 = 'A', ch2 = 'B'
|
Pada statemen 1, karena
operad sisi-kanan dari >> adalah z,
yang merupakan sebuah variabel double,
36.78 diekstrak dari aliran masukan, dan nilai 36.78 disimpan di dalam z. Selanjutnya, ‘B’ diekstrak dan disimpan di dalam ch. Terakhir, 34 diekstrak dan disimpan di dalam a. Statemen 2 bekerja dengan cara yang
sama.
Pada statemen 3, 11
disimpan di dalam a, dan 34 disimpan
di dalam b, tetapi aliran masukan
tidak memiliki data masukan yang cukup untuk mengisi setiap variabel. Pada
kasus ini, komputer menunggu (dan menunggu...dan menunggu...) untuk masukan
berikutnya dari pengguna. Komputer tidak melanjutkan eksekusi sampai nilai
berikutnya dimasukkan.
Pada statemen 4, operand
sisi-kanan pertama dari operator ekstraksi >> adalah sebuah variabel
bertipe int, dan masukan adalah
78.49. Pada kasus variabel-variabel int,
setelah membaca dijit-dijit angka, pembacaan berhenti pada karakter spasi-putih
pertama atau pada karakter selain dijit. Oleh karena itu, operator >>
menyimpan 78 ke dalam a. Operand
sisi-kanan berikutnya dari >> adalah variabel z, yang bertipe double.
Oleh karena itu, operator >> menyimpan nilai .49 sebagai 0.49 ke dalam z.
Pada statemen 5, operand
sisi-kanan pertama dari operator ekstraksi >> adalah sebuah variabel char, jadi karakter tak spasi-putih
pertama, ‘2’, diekstrak dari aliran
masukan. Karakter ‘2’ disimpan di dalam variabel ch. Operand sisi-kanan berikutnya dari operator ekstraksi >>
adalah sebuah variabel int, jadi nilai
masukan berikutnya, 56, diekstrak dan disimpan di dalam a.
Pada statemen 6, operand
sisi-kanan pertama dari operator ekstraksi >> adalah sebuah variabel int, jadi item data pertama, 256,
diekstrak dari aliran masukan dan disimpan di dalam a. Sekarang komputer menunggu untuk item data berikutnya untuk
variabel ch.
Pada statemen 7, ‘A’ disimpan ke dalam ch1. Operator ekstraksi >>
kemudian melompati spasi, dan ‘B’
disimpan di dalam ch2.
Apa yang terjadi jika
aliran masukan memiliki lebih banyak item data dari yang diperlukan oleh
program? Setelah program berhenti, sembarang nilai yang tertinggal di dalam
aliran masukan akan dibuang. Ketika Anda memasukkan data untuk pemrosesan,
nilai data harus terkait dengan tipe data dari variabel di dalam statemen
masukan.
Operator ekstraksi,
ketika memindai untuk masukan berikutnya di dalam aliran masukan, melompati
sembarang spasi-putih seperti spasi, tab, dan garis-baru. Namun, ada beberapa
situasi ketika karakter-karakter itu harus disimpan dan diproses. Sebagai
contoh, jika Anda memproses teks utuh dengan gaya baris-demi-baris, maka Anda
harus mengetahui di mana di dalam aliran masukan karakter garis-baru berada.
Tanpa mengidentifikasi posisi karakter garis-baru, program tidak akan
mengetahui dimana satu baris berakhir dan mulai. Beberapa bagian ke depan akan
mengajari Anda bagaimana membaca data ke dalam sebuah program menggunakan
fungsi-fungsi masukan, seperti get, ignore, putback, dan peek. Setiap
fungsi ini berkaitan dengan tipe data istream dan dinamakan fungsi-fungsi
anggota istream. Fungsi-fungsi I/O,
seperti get, umumnya dinamakan
dengan fungsi anggota aliran atau fungsi aliran.
Sebelum Anda dapat
belajar tentang fungsi masukan get, ignore, putback, peek dan fungsi
I/O lainnya yang digunakan pada bab ini, Anda lebih dahulu perlu memahami apa
itu fungsi dan bagaimana ia bekerja. Anda akan belajar tentang fungsi secara
detil dan belajar bagaimana menulis fungsi sendiri.
Menggunakan Fungsi Terdefinisi
Seperti dijelaskan pada
Bab 1, sebuah fungsi, yang juga dinamakan dengan subprogram, merupakan
sekumpulan instruksi. Ketika sebuah fungsi dieksekusi, ia menyelesaikan
sesuatu. Fungsi main, seperti yang
Anda lihat pada Bab 1, dieksekusi secara otomatis ketika Anda menjalankan
program Anda. Fungsi-fungsi lain dieksekusi hanya ketika diaktivasi atau
dipanggil. C++ memuat banyak fungsi terdefinisi, yang telah ditulis. Pada
bagian ini, Anda akan belajar bagaimana menggunakan beberapa fungsi terdefinisi
yang disediakan sebagai bagian dari sistem C++. Nanti pada bab ini, Anda akan
belajar menggunakan fungsi-fungsi aliran untuk melakukan operasi I/O tertentu.
Ingat dari Bab 1 bahwa
fungsi-fungsi terpradefinisi diorganisir sebagai sebuah koleksi pustaka, yang
dinamakan dengan file header. File header tertentu memuat beberapa fungsi. Oleh
karena itu, untuk menggunakan fungsi tertentu, Anda perlu mengetahui nama
fungsi dan beberapa hal lain, yang akan dijelaskan nanti.
Sebuah fungsi yang sangat
berguna, pow, merupakan fungsi pemangkatan, yang dapat dipakai untuk menghitung
di dalam sebuah
program. Yaitu, pow(x, y) =
. Sebagai contoh, pow (2.0, 3.0) =
= 8.0 dan pow (4.0,
0.5) =
=
= 2.0. Angka x dan y yang Anda gunakan di dalam fungsi pow dinamakan argumen atau parameter dari fungsi pow. Sebagai contoh, di dalam pow(2.0, 3.0), parameternya adalah 2.0
dan 3.0.
Sebuah ekspresi seperti pow(2.0, 3.0) disebut dengan
pemanggilan fungsi, yang menyebabkan kode yang melekat dengan fungsi terpradefinisi
pow dieksekusi dan, pada kasus ini, menghitung
. File header cmath
memuat spesifikasi dari fungsi pow.
Untuk menggunakan sebuah
fungsi terpradefinisi di dalam program, Anda perlu mengetahui nama file header
yang memuat spesifikasi fungsi dan mencantumkan file header di dalam program.
Selain itu, Anda perlu mengetahui nama fungsi, jumlah parameter yang diambil,
dan tipe dari tiap parameter. Anda juga harus mengetahui apa yang dilakukan
fungsi itu. Sebagai contoh, untuk menggunakan fungsi pow, Anda harus mencantumkan file header cmath. Fungsi pow
mempunyai dua parameter, yang berupa angka desimal. Fungsi ini menghitung
pemangkatan (parameter pertama dipangkat dengan parameter kedua).
Program pada contoh
berikut mengilustrasikan bagaimana menggunakan fungsi-fungsi terpradefinisi di
dalam sebuah program. Lebih spesifik lagi, Anda dapat menggunakan beberapa
fungsi math dari file header cmath, dan fungsi length dari file
header string. Perhatikan bahwa
fungsi length menentukan panjang
sebuah string.
Contoh 2.4
|
|
// Bagaimana menggunakan fungsi-fungsi terpradefinisi.
#include
<iostream>
#include
<cmath>
#include
<string>
using namespace std;
int main()
{
double u, v;
string str;
cout
<< "Baris 1: 2 dipangkat
dengan 6 = "
<<
static_cast<int>(pow(2.0,
6.0))
<< endl; //Baris
1
u = 12.5; //Baris 2
v = 3.0; //Baris 3
cout
<< "Baris 4: "
<< u << " dipangkat
dengan "
<< v << " =
" << pow(u, v) << endl; //Baris 4
cout
<< "Baris 5: akar kuadrat
dari 24 = "
<< sqrt(24.0) << endl; //Baris
5
u = pow(8.0,
2.5); //Baris 6
cout
<< "Baris 7: u = "
<< u << endl; //Baris 7
str = "Pemrograman dengan C++"; //Baris 8
cout
<< "Baris 9: Panjang dari str
= "
<< str.length() << endl; //Baris
9
return 0;
}
Keluaran Program:
Baris 1: 2 dipangkat dengan 6 = 64
Baris 4: 12.5 dipangkat dengan 3 = 1953.13
Baris 5: akar kuadrat dari 24 = 4.89898
Baris 7: u = 181.019
Baris 9: Panjang dari str = 22
Program tersebut bekerja
sebagai berikut: Statemen pada baris 1 menggunakan fungsi pow untuk menentukan dan menampilkan
. Statemen pada baris 2 menetapkan u menjadi 12.5, dan statemen pada baris 3 menetapkan v menjadi 3.0.
Statemen pada baris 4 menentukan dan menampilkan
. Statemen pada baris 5 menggunakan fungsi sqrt, dari file header cmath, untuk menentukan dan menampilkan
akar kuadrat dari 24.0. Statemen pada baris 6 menentukan dan menugaskan
kepada u. Statemen pada baris 7 menampilkan
nilai dari u.
Statemen pada baris 8
menyimpan string “Pemrograman dengan C++”
di dalam str. Statemen pada baris 9
menggunakan fungsi length untuk
menentukan dan menampilkan panjang dari str.
Perhatikan bagaimana fungsi length
digunakan. Nanti pada bab ini, akan dijelaskan makna ekspresi seperti str.length().
Karena I/O adalah hal
yang fundamental dalam bahasa pemrograman dan karena penulisan instruksi untuk
melakukan operasi I/O spesifik bukanlah pekerjaan yang mudah dilakukan, setiap
bahasa pemrograman menyediakan himpunan fungsi untuk melakukan operasi-operasi
I/O spesifik. Pada bab ini juga, Anda akan belajar bagaimana menggunakan
beberapa fungsi ini di dalam sebuah program. Sebagai seorang programer, Anda
harus memberikan perhatian pada bagaimana
fungsi-fungsi ini digunakan sehingga Anda dapat memanfaatkannya. Fungsi
pertama yang akan Anda pelajari di sini adalah fungsi get.
cin
dan Fungsi get
Seperti yang Anda telah
lihat, operator ekstraksi melompati semua karakter spasi-putih yang di depan ketika
memindai nilai masukan berikutnya. Perhatikan deklarasi berikut:
char ch1, ch2;
int angka;
dan masukan:
A 25
Sekarang, perhatikan
statemen berikut:
cin >> ch1 >> ch2 >> angka;
Ketika komputer
mengeksekusi statemen ini, ‘A’
disimpan di dalam ch1, spasi
dilompati oleh operator ekstraksi >>,
karakter ‘2’ disimpan di dalam ch2, dan 5 disimpan di dalam angka. Namun, bagaimana jika Anda
bermaksud untuk menyimpan ‘A’ di
dalam ch1, spasi di dalam ch2, dan 25 di dalam angka? Jelaslah bahwa Anda tidak dapat menggunakan
operator ekstraksi >> untuk membaca data ini.
Seperti dijelaskan
sebelumnya, kadangkala Anda perlu memproses keseluruhan masukan, termasuk
karakter spasi-putih, seperti spasi, tab, dan garis-baru. Sebagai contoh,
dimisalkan bahwa Anda ingin memproses data yang dientri pada basis
baris-demi-baris. Karena operator ekstraksi >> melompati karakter
garis-baru dan kecuali jika program menangkap karakter garis-baru, komputer
tidak akan mengetahui dimana baris berakhir dan berawal.
Variabel cin dapat mengakses fungsi aliran get, yang dipakai untuk membaca data
karakter. Fungsi get membaca setiap
karakter berikutnya, termasuk karakter spasi-putih, dari aliran masukan dan
menyimpannya di dalam lokasi memori yang diindikasikan oleh argumennya. Fungsi get memiliki banyak bentuk.
Selanjutnya, akan didiskusikan salah satu bentuk fungsi get yang dipakai untuk membaca sebuah karakter.
Sintaks dari cin, bersama dengan fungsi get untuk membaca sebuah karakter,
adalah sebagai berikut:
cin.get(varChar);
Pada statemen cin.get, varChar merupakan sebuah variabel char. varChar, yang
muncul di dalam kurung setelah nama fungsi, dinamakan argumen atau parameter
dari fungsi. Pengaruh statemen tersebut dipakai untuk menyimpan karakter
masukan berikutnya di dalam variabel varChar.
Sekarang, perhatikan
masukan berikut:
A 25
Untuk menyimpan ’A’ di dalam ch1, spasi di dalam ch2,
dan 25 di dalam angka, Anda dapat
secara efektif menggunakan fungsi get
sebagai berikut:
cin.get(ch1);
cin.get(ch2);
cin >> angka;
Karena bentuk fungsi get ini hanya memiliki satu argumen dan
hanya membaca satu karakter dan Anda perlu membaca dua karakter dari aliran
masukan, Anda perlu memanggil fungsi ini dua kali. Perhatikan bahwa Anda tidak
dapat menggunakan fungsi get untuk
membaca data ke dalam variabel angka
karena angka adalah sebuah variabel int. Bentuk fungsi get tersebut hanya
membaca nilai dari tipe data char
saja.
Tiga statemen tersebut
ekivalen dengan berikut:
cin >>
ch1;
cin.get(ch2);
cin >> angka;
cin
dan Fungsi ignore
Ketika Anda ingin
memproses hanya sebagian data atau data parsial (misalnya, dalam sebuah baris),
Anda dapat menggunakan fungsi aliran ignore
untuk membuang potongan masukan. Sintaks dalam menggunakan fungsi ignore adalah:
cin.ignore(intEksp, chEksp);
Di sini, intEksp merupakan sebuah ekspresi
integer yang menghasilkan nilai integer, dan chEksp merupakan sebuah ekspresi char yang menghasilkan nilai char.
Nilai dari ekspresi intEksp
menspesifikasi jumlah karakter maksimum yang akan diabaikan pada sebuah baris.
Dimisalkan bahwa intEksp menghasilkan sebuah nilai,
katakanlah 100. Statemen ini akan mengabaikan 100 karakter berikutnya dari
masukan sampai ia menjumpai karakter yang dispesifikasi oleh chEksp. Agar lebih spesifik, perhatikan
statemen berikut:
cin.ignore(100, '\n');
Ketika statemen ini
dieksekusi, ia mengabaikan 100 karakter berikutnya atau semua karakter sampai
karakter garis-baru ditemukan. Sebagai contoh, jika 120 karakter pertama tidak
memuat karakter garis-baru, maka hanya 100 karakter pertama yang dibuang dan
data masukan berikutnya adalah karakter ke-101. Namun, jika karakter ke-75
adalah karakter garis-baru, maka 75 karakter pertama akan dibuang dan data masukan
berikutnya adalah karakter ke-76. Sama halnya, eksekusi atas statemen:
cin.ignore(100, 'A');
akan mengabaikan 100
karakter pertama atau semua karakter sampai karakter ‘A’ ditemukan.
Contoh 2.5
|
|
Perhatikan deklarasi:
int a, b;
dan masukan:
25 67 89 43
72
12 78 34
Sekarang, perhatikan
beberapa statemen berikut:
cin >> a;
cin.ignore(100, '\n');
cin >> b;
Statemen pertama, cin >> a;, menyimpan 25 ke dalam a. Statemen kedua, cin.ignore(100, ‘\n’);, membuang semua angka yang tersisa di dalam
baris pertama. Statemen ketiga, cin
>> b;, menyimpan 12 (dari baris berikutnya) di dalam b.
Contoh 2.6
|
|
Perhatikan deklarasi:
char ch1, ch2;
dan keluaran:
Hallo semua.
Nama saya Jozen.
a. Perhatikan
beberapa statemen berikut:
cin >>
ch1;
cin.ignore(100,
'.');
cin >>
ch2;
Statemen pertama, cin >> ch1;, menyimpan ‘H’ Statemen kedua, cin.ignore(100, ‘.’);, membuang semua karakter sampai ditemukan
titik. Statemen ketiga, cin >>
ch2;, menyimpan karakter ‘N’
(pada baris yang sama) di dalam ch2.
(Ingat bahwa operator ekstraksi melompati semua karakter spasi-putih yang ada
di depan. Jadi, operator ekstraksi melompati spasi yang berada sesudah titik
(.) dan menyimpan ‘N’ di dalam ch2).
b. Dimisalkan
bahwa statemen berikut:
cin >>
ch1;
cin.ignore(5,
'.');
cin >> ch2;
Statemen pertama, cin >> ch1;, menyimpan ‘H’ di dalam ch1. Statemen kedua, cin.ignore(5,
‘.’);, membuang lima karakter berikutnya, sampai s. Statemen ketiga, cin
>> ch2;, menyimpan karakter ‘s’
(pada baris yang sama) di dalam ch2.
Ketika fungsi ignore digunakan tanpa argumen, maka ia
hanya akan melompati karakter berikutnya. Sebagai contoh, statemen berikut akan
melompati karakter berikutnya:
cin.ignore();
Statemen ini secara umum
dipakai untuk melompati karakter garis-baru.
Fungsi
putback dan peek
Dimisalkan bahwa Anda
sedang memproses data yang merupakan campuran dari angka dan karakter. Di
samping itu, angka-angka harus dibaca dan diproses sebagai angka bukan
karakter. Anda juga harus melihat banyak sampel data dan tidak bisa menentukan
apakah masukan berikutnya adalah sebuah karakter atau sebuah angka. Anda dapat
membaca keseluruhan data karakter demi karakter dan memeriksa apakah karater
tertentu sebuah dijit atau bukan. Jika dijit ditemukan, maka Anda kemudian dapat membaca dijit-dijit
dari angka tersebut dan mengkonversinya menjadi angka. Kode pemrograman ini
akan cukup kompleks. Untungnya, C++ menyediakan dua fungsi aliran yang sangat
berguna yang dapat dipakai secara efektif pada situasi semacam ini.
Fungsi aliran putback memampukan Anda untuk
menempatkan karakter terakhir, yang diekstrak dari aliran masukan menggunakan
fungsi get, kembali ke aliran
masukan. Fungsi aliran peek
mengintip aliran masukan dan memberitahu Anda apa karakter berikutnya, tanpa
menghapusnya dari aliran masukan. Dengan memanfaatkan kedua fungsi ini, setelah
menentukan bahwa masukan berikutnya adalah sebuah angka, Anda dapat membacanya
sebagai angka. Anda tidak harus membaca dijit-dijit angka sebagai karakter dan
kemudian mengkonversi karakter-karakter tersebut kembali menjadi angka.
Sintaks dalam menggunakan
fungsi putback adalah:
istreamVar.putback(ch);
Di sini, istreamVar merupakan sebuah variabel aliran
masukan, seperti cin, dan ch adalah sebuah variabel ch.
Fungsi peek menghasilkan karakter berikutnya
dari aliran masukan tetapi tidak menghapus karakter tersebut dari aliran.
Dengan kata lain, fungsi peek
mengintip aliran masukan dan memeriksa identitas dari karakter masukan
berikutnya. Selain itu, setelah memeriksa karakter masukan berikutnya di dalam
aliran masukan, ia dapat menyimpan karakter ini di dalam lokasi memori yang
ditentukan tanpa harus menghapusnya dari aliran masukan. Jadi, ketika Anda
menggunakan fungsi peek, karakter
masukan berikutnya tetap ada di tempat yang sama, meskipun Anda telah
mengetahui identitasnya.
Sintaks dalam menggunakan
fungsi peek adalah:
ch = istreamVar.peek();
Di sini, istreamVar merupakan sebuah variabel
aliran masukan, seperti cin, dan ch adalah sebuah variabel char.
Perhatikan bagaimana
fungsi peek digunakan. Pertama-tama,
fungsi peek dipakai di dalam sebuah
statemen penugasan. Kedua, fungsi peek
tidak memiliki parameter. Sampai Anda menjadi familiar dalam menggunakan sebuah
fungsi dan belajar menulis fungsi sendiri, Anda harus memberikan atensi pada
bagaimana menggunakan fungsi terpradefinisi.
Contoh berikut
mengilustrasikan bagaimana menggunakan fungsi peek dan putback.
Contoh 2.7
|
|
//Fungsi peek dan putback
#include
<iostream>
using namespace std;
int main()
{
char ch;
cout
<< "Baris 1: Masukkan sebuah
string: "; //Baris 1
cin.get(ch);
//Baris 2
cout
<< endl; //Baris
3
cout
<< "Baris 4: Setelah
cin.get(ch) pertama; "
<< "ch = "
<< ch << endl; //Baris
4
cin.get(ch);
//Baris 5
cout
<< "Baris 6: Setelah
cin.get(ch) kedua; "
<< "ch = "
<< ch << endl; //Baris
6
cin.putback(ch);
//Baris
7
cin.get(ch);
//Baris 8
cout
<< "Baris 9: Setelah putback
dan kemudian "
<< "cin.get(ch); ch =
" << ch << endl; //Baris
9
ch =
cin.peek(); //Baris
10
cout
<< "Baris 11: Setelah
cin.peek(); ch = "
<< ch << endl; //Baris
11
cin.get(ch);
//Baris 12
cout
<< "Baris 13: Setelah
cin.get(ch); ch = "
<< ch << endl; //Baris
13
return 0;
}
Keluaran Program:
Baris 1: Masukkan sebuah string: abcd
Baris 4: Setelah cin.get(ch) pertama; ch = a
Baris 6: Setelah cin.get(ch) kedua; ch = b
Baris 9: Setelah putback dan kemudian cin.get(ch); ch
= b
Baris 11: Setelah cin.peek(); ch = c
Baris 13: Setelah cin.get(ch); ch = c
Masukan pengguna, abcd, membuat Anda dapat melihat
pengaruh fungsi get, putback, dan peek pada program tersebut. Statemen pada baris 1 meminta pengguna
untuk memasukkan sebuah string. Pada baris 2, statemen cin.get(ch); mengekstrak karakter pertama dari aliran masukan dan
menyimpannya di dalam variabel ch.
Jadi, setelah baris 2 dieksekusi, nilai dari ch adalah ‘a’.
Statemen cout pada baris 4 menampilkan nilai
dari ch. Statemen cin.get(ch); pada baris 5 mengekstrak
karakter berikutnya dari aliran masukan, yaitu ‘b’, dan menyimpannya di dalam ch.
Pada titik ini, nilai dari ch adalah
‘b’.
Statemen cout pada baris 6 menampilkan nilai
dari ch. Statemen cin.putback(ch); pada baris 7
menempatkan karakter yang sebelumnya diekstrak oleh fungsi get, yaitu ‘b’, kembali
ke dalam aliran masukan. Oleh karena itu, karakter berikutnya yang akan
diekstrak dari aliran masukan adalah ‘b’.
Statemen cin.get(ch); pada baris 8 mengekstrak
karakter berikutnya dari aliran masukan, yaitu ‘b’, dan menyimpannya di dalam ch.
Sekarang, nilai dari ch adalah ‘b’. Statemen cout pada baris 9 menampilkan nilai dari ch sebagai ‘b’.
Pada baris 10, statemen ch = cin.peek(); memeriksa karakter
berikutnya di dalam aliran masukan, yaitu ‘c’,
dan menyimpannya di dalam ch. Nilai
dari ch adalah ‘c’. Statemen cout pada
baris 11 menampilkan nilai dari ch.
Statemen cin.get(ch); pada baris 12
mengekstrak karakter berikutnya dari aliran masukan dan menyimpannya di dalam ch. Statemen cout pada baris 13 menampilkan isi dari ch, yaitu ‘c’.
Perhatikan bahwa statemen
ch = cin.peek(); pada baris 10 tidak
menghapus karakter ‘c’ dari aliran
masukan; ia hanya mengintip aliran masukan. Keluaran dari baris 11 dan 13
mendemonstrasikan fungsionalitas ini.
Notasi
Dot antara Variabel Aliran I/O dan Fungsi I/O
Pada beberapa bagian
terdahulu, Anda telah belajar bagaimana memanipulasi aliran masukan untuk
mendapatkan data ke dalam program. Anda juga telah belajar bagaimana
menggunakan fungsi get, ignore, peek, dan putback. Hal
penting diingat adalah bahwa Anda harus menggunakan fungsi-fungsi tersebut
seperti yang telah ditunjukkan. Sebagai contoh, untuk mendapatkan fungsi get, Anda menggunakan
statemen-statemeen seperti berikut:
cin.get(ch);
Pengabaian dot, yaitu
titik di antara variabel cin dan
nama fungsi get, akan menyebabkan
error sintaks. Sebagai contoh, di dalam statemen:
cin.get(ch);
cin dan get
adalah dua pengenal terpisah yang dipisahkan oleh sebuah titik. Di dalam
statemen:
cinget(ch);
cinget menjadi pengenal yang baru. Jika Anda menggunakan cinget(ch); di dalam sebuah program,
maka kompiler akan mencoba mencari pengenal tak-terdeklarasi tersebut, yang
akan mengakibatkan error. Sama halnya, pengabaian kurung, seperti pada cin.getch;, akan menyebabkan error
sintaks. Selain itu, ingat bahwa Anda harus menggunakan fungsi masukan
bersamaan dengan variabel aliran masukan. Jika Anda mencoba menggunakan salah
satu fungsi masukan tanpa disertai variabel aliran masukan, maka kompiler akan
memberikan pesan error seperti “undeclared
identifier”. Sebagai contoh, statemen get(ch);
akan menyebabkan error sintaks.
Kegagalan Masukan
Banyak hal dapat menjadi
masalah selama eksekusi program. Sebuah program yang secara sintaks benar bisa
jadi menghasilkan hasil yang tidak diharapkan. Sebagai contoh, dimisalkan bahwa
gaji seorang karyawan paruh-waktu dihitung menggunakan formula berikut:
gaji = gajiPerJam * jamKerja;
Jika Anda secara tidak
sengaja mengetikkan + menggantikan *, maka gaji yang terhitung menjadi tidak
benar, meskipun statemen tersebut secara sintaks benar.
Bagaimana dengan bila
Anda mencoba membaca data yang tak-valid? Sebagai contoh, apa yang akan terjadi
jika Anda mencoba membaca sebuah huruf ke dalam suatu variabel int? Jika data masukan tidak cocok
dengan variabel terkait, maka program akan bermasalah. Sebagai contoh,
pembacaan sebuah huruf ke dalam sebuah variabel int atau double akan
menyebabkan kegagalan pembacaan. Perhatikan statemen-statemen berikut:
int a, b, c;
double
x;
Jika masukan adalah:
W 54
maka statemen:
cin >> a >> b;
akan menyebabkan
kegagalan pembacaan, karena Anda mencoba membaca karakter ‘W’ ke dalam variabel int.
Jika masukan adalah:
35 67.93 48
maka statemen masukan:
cin >> a >> x > >b;
akan menyebabkan
penyimpanan 35 di dalam a, 67.93 di
dalam x, dan 48 di dalam b.
Sekarang, perhatikan
statemen pembacaan dengan masukan sebelumnya (masukan dengan tiga nilai):
cin >> a >> b >> c;
Statemen ini akan
menyimpan 35 ke dalam a dan 67 ke
dalam b. Pembacaan berhenti pada
titik (titik desimal). Karena variabel berikutnya c adalah bertipe int,
komputer mencoba membaca . ke dalam c,
yang merupakan error. Aliran masukan kemudian memasuki sebuah keadaan yang
dikenal dengan keadaan gagal.
Apa yang akan terjadi
ketika aliran masukan memasuki keadaan gagal? Begitu aliran masukan memasuki
keadaan gagal, semua statemen I/O yang menggunakan aliran itu akan diabaikan.
Sayangnya, program akan berlanjut mengeksekusi menggunakan nilai-nilai apapun
yang ada di dalam variabel dan menghasilkan hasil yang tidak tepat. Program
pada contoh 2.8 mengilustrasikan sebuah kegagalan masukan. Program ini pada
sistem Anda bisa jadi memberikan hasil yang berbeda.
Contoh 2.8
|
|
//Program kegagalan masukan
#include
<iostream>
using namespace std;
int main()
{
int a = 10; //Baris 1
int b = 20; //Baris 2
int c = 30; //Baris 3
int d = 40; //Baris 4
cout
<< "Baris 5: Masukkan empat
integer: "; //Baris 5
cin >>
a >> b >> c >> d; //Baris
6
cout
<< endl; //Baris
7
cout
<< "Baris 8: Angka-angka yang
Anda masukkan:"
<< endl; //Baris
8
cout
<< "Baris 9: a = "
<< a << ", b =
" << b
<< ", c = "
<< c << ", d =
" << d << endl; //Baris
9
return 0;
}
Keluaran Program 1:
Baris 5: Masukkan empat integer: 34 K 67 28
Baris 8: Angka-angka yang Anda masukkan:
Baris 9: a = 34, b = 20, c = 30, d = 40
Statemen pada baris 1, 2,
3, dan 4 mendeklarasikan dan menginisialisasi variabel a, b, c, dan d dengan 10, 20, 30, dan 40. Statemen pada baris 5 meminta pengguna
untuk memasukkan empat integer; statemen pada baris 6 membaca keempat integer
ke dalam variabel a, b, c,
dan d.
Pada contoh keluaran
program ini, nilai masukan kedua adalah karakter ‘K’. Statemen cin mencoba membaca karakter ini ke
dalam variabel b. Namun, karena b adalah sebuah variabel int, aliran masukan menjadi dalam
keadaan gagal. Perhatikan bahwa nilai dari b,
c dan d tidak berubah, seperti yang ditunjukkan oleh keluaran dari
statemen baris 9.
Keluaran Program 2:
Baris 5: Masukkan empat integer: 37 653.89 23 76
Baris 8: Angka-angka yang Anda masukkan:
Baris 9: a = 37, b = 653, c = 30, d = 40
Pada contoh keluaran
program ini, statemen cin pada baris 7 membaca 37 ke dalam a dan 653 ke dalam b dan
kemudian mencoba membaca titik desimal ke dalam c. Karena c adalah
sebuah variabel int, titik desimal
dipandang sebagai sebuah karakter, jadi aliran masukan memasuki keadaan gagal.
Pada contoh keluaran ini, nilai dari c
dan d tidak berubah, seperti yang
ditunjukkan oleh keluaran dari statemen pada baris 9.
Fungsi clear
Ketika sebuah aliran
masukan memasuki keadaan gagal, sistem akan mengabaikan semua I/O yang
menggunakan aliran tersebut. Anda dapat menggunakan fungsi aliran clear untuk memulihkan aliran masukan
agar kembali menjadi keadaan baik.
Sintaks dalam menggunakan
fungsi clear adalah:
istreamVar.clear();
Di sini, istreamVar merupakan variabel aliran
masukan, seperti cin.
Setelah menggunakan
fungsi clear untuk mengembalikan
aliran masukan menjai keadaan baik, Anda masih perlu membersihkan sampah yang
tersisa dari aliran masukan. Ini dapat dicapai dengan menggunakan fungsi ignore. Contoh 2.9 mengilustrasikan
situasi ini.
Contoh 2.9
|
|
//Kegagalan masukan dan fungsi clear
#include
<iostream>
using namespace std;
int main()
{
int a = 23; //Baris 1
int b = 34; //Baris 2
cout
<< "Baris 3: Masukkan sebuah
angka diikuti"
<< " dengan sebuah
karakter: "; //Baris 3
cin >>
a >> b; //Baris 4
cout
<< endl << "Baris 5: a
= " << a
<< ", b = "
<< b << endl; //Baris
5
cin.clear();
//Memulihkan aliran masukan; Baris 6
cin.ignore(200,'\n'); //Membersihkan penyangga; Baris 7
cout
<< "Baris 8: Masukkan dua
angka: "; //Baris 8
cin >>
a >> b; //Baris
9
cout
<< endl << "Baris 10: a
= " << a
<< ", b = "
<< b << endl; //Baris
10
return 0;
}
Keluaran Program:
Baris 3: Masukkan sebuah angka diikuti dengan sebuah
karakter: 78 d
Baris 5: a = 78, b = 34
Baris 8: Masukkan dua angka: 65 88
Baris 10: a = 65, b = 88
Statemen pada baris 1 dan
2 mendeklarasikan dan menginisialisasi variabel a dan b dengan 23 dan
34. Statemen pada baris 3 meminta pengguna untuk memasukkan sebuah angka yang
diikuti dengan sebuah karakter; statemen pada baris 4 membaca angka ini ke
dalam variabel a dan kemudian
mencoba karakter ke dalam variabel b.
Karena b adalah variabel int, percobaan pembacaan sebuah
karakter ke dalam b menyebabkan
aliran masukan memasuki keadaan gagal. Nilai dari b tidak berubah, seperti ditunjukkan oleh keluaran dari statemen
pada baris 5.
Statemen pada baris 6
memulihkan aliran masukan dengan menggunakan fungsi clear, dan statemen pada baris 7 mengabaikan sisa masukan. Statemen
pada baris 8 kembali meminta pengguna untuk memasukkan dua angka; statemen pada
baris 9 menyimpan kedua angka tersebut ke dalam a dan b. Selanjutnya,
statemen pada baris 10 menampilkan nilai dari a dan b.
Keluaran dan Formatnya
Selain menulis program
yang efisien, menampilkan keluaran dengan format yang diinginkan merupakan
prioritas tertinggi programer. Bab 1 secara singkat telah mengenalkan proses
yang terlibat dalam menampilkan keluaran pada divais keluaran standar. Lebih
tepatnya, Anda telah belajar bagaimana menggunakan operator penyisipan << dan manipulator endl untuk menampilkan hasil pada
divais keluaran standar.
Namun, masih banyak hal
lain yang perlu Anda ketahui selain hanya sekadar menampilkan hasil.
Kadangkala, angka titik-mengambang harus ditampilkan dengan cara tertentu.
Sebagai contoh, gaji harus ditampilkan dengan dua dijit di belakang titik
desimal, sedangkan hasil dari eksperimen ilmiah mungkin memerlukan angka
titik-mengambang ditampilkan dengan enam atau tujuh dijit di belakang titik
desimal. Selain itu, Anda mungkin suka menyejajarkan angka-angka dalam kolom
tertentu atau mengisi spasi kosong di antara string dan angka dengan sebuah
karakter menggantikan spasi kosong.
Ingat bahwa sintaks dari cout ketika digunakan bersamaan dengan
operator penyisipan << adalah:
cout << ekspresi
atau manipulator << ekspresi atau manipulator...;
Di sini, ekspresi dievaluasi, nilainya
ditampilkan, dan manipulator dipakai
untuk memformat keluaran. Manipulator tersederhana yang telah Anda gunakan
sejauh ini adalah endl, yang dipakai
untuk memindahkan titik penyisipan ke awal baris berikutnya.
Manipulator keluaran lain
yang penting mencakup adalah setprecision,
fixed, showpoint, dan setw.
Beberapa bagian ke depan akan menjelaskan tiap manipulator ini.
Manipulator
setprecision
Anda menggunakan
manipulator setprecision untuk mengendalikan angka titik-mengambang. Biasanya,
keluaran default dari angka titik-mengambang adalah notasi ilmiah. Beberapa IDE
(integrated development environment)
telah menggunakan enam dijit maksimal di belakang titik desimal sebagai
keluaran default dari angka titik-mengambang. Namun, ketika gaji seorang
karyawan ditampilkan, keluaran yang diinginkan adalah maksimum dua dijit di
belakang titik desimal. Untuk menampilkan angka titik-mengambang dengan dua
dijit di belakang titik desimal, Anda bisa menggunakan manipulator setprecision untuk menetapkan
kepresisian menjadi 2.
Sintaks umum atas
manipulator setprecision adalah:
setprecision(n)
dimana n adalah jumlah dijit di belakang titik
desimal.
Anda menggunakan
manipulator setprecision dengan cout dan operator penyisipan. Sebagai contoh,
statemen:
cout << setprecision(2);
memformat keluaran dari
angka desimal menjadi dua dijit di belakang titik desimal. Hal ini berlaku
sampai terdapat statemen lain yang mengubah kepresisian tersebut. Perhatikan
bahwa jumlah dijit di belakang titik desimal atau nilai kepresisian dilewatkan
sebagai argumen kepada setprecision.
Untuk menggunakan
manipulator setprecision, program harus mencantumkan file header iomanip. Jadi,
statemen berikut diperlukan:
#include <iomanip>
Manipulator
fixed
Untuk lebih lanjut
mengendalikan angka titik-mengambang, Anda dapat menggunakan manipulator lain.
Untuk menampilkan angka titik-mengambang dalam format desimal tetap, Anda bisa
menggunakan manipulator fixed.
Statemen berikut menetapkan keluaran dari angka titik-mengambang dalam format
desimal tetap pada divais keluaran standar:
cout << fixed;
Setelah statemen tersebut
dieksekusi, semua angka titik-mengambang akan ditampilkan dalam format desimal
tetap sampai manipulator fixed
dinon-aktifkan. Anda dapat menon-aktifkan manipulator fixed dengan menggunakan fungsi anggota aliran unsetf. Sebagai contoh, untuk menon-aktifkan manipulator fixed pada divais aliran standar, Anda
bisa menggunakan statemen:
cout.unsetf(ios::fixed);
Setelah manipulator fixed dinon-aktifkan, keluaran dari
angka titik-mengambang kembali menjadi pengaturan defaultnya. Manipulator scientific dipakai untuk menampilkan
angka titik-mengambang dalam format ilmiah.
Contoh berikut
menunjukkan bagaimana manipulator scientific
dan fixed bekerja tanpa menggunakan
manipulator setprecision.
Contoh 2.10
|
|
//Contoh: scientific dan fixed
#include
<iostream>
using namespace std;
int main()
{
double jam = 35.45;
double laju = 15.00;
double toleransi = 0.01000;
cout
<< "jam = " <<
jam << ", laju = "
<< laju
<< ", gaji =
" << jam * laju
<< ", toleransi =
" << toleransi << endl << endl;
cout
<< scientific;
cout
<< "Notasi ilmiah: "
<< endl;
cout
<< "jam = " <<
jam << ", laju = "
<< laju
<< ", gaji = " << jam * laju
<< ", toleransi =
" << toleransi << endl << endl;
cout
<< fixed;
cout
<< "Notasi desimal tetap:
" << endl;
cout
<< "jam = " <<
jam << ", laju = "
<< laju
<< ", gaji =
" << jam * laju
<< ", toleransi = " << toleransi << endl << endl;
return 0;
}
Keluaran Program:
jam = 35.45, laju = 15, gaji = 531.75, toleransi =
0.01
Notasi ilmiah:
jam = 3.545000e+001, laju = 1.500000e+001, gaji =
5.317500e+002, toleransi = 1.0
00000e-002
Notasi desimal tetap:
jam = 35.450000, laju = 15.000000, gaji = 531.750000,
toleransi = 0.010000
Contoh keluaran
menunjukkan bahwa ketika nilai dari laju
dan toleransi ditampilkan tanpa
penetapan manipulator scientific
atau fixed, nol-nol di ekor tidak ditampilkan
dan, pada kasus laju, titik desimal
juga tidak ditampilkan. Setelah penetapan kedua manipulator, nilai-nilai
ditampilkan dengan enam dijit di belakang titik desimal. Pada bagian
selanjutnya, akan dijelaskan manipulator showpoint
untuk memaksa sistem sehingga menampilkan titik desimal dan nol pengekor.
Kemudian, akan diberikan sebuah contoh untuk menunjukkan bagaimana menggunakan
manipulator setprecision, fixed, dan showpoint sehingga mendapatkan keluaran yang diinginkan.
Manipulator
showpoint
Dimisalkan bahwa bagian
desimal dari sebuah angka desimal adalah nol. Pada kasus ini, ketika Anda
menginstruksikan komputer untuk menampilkan titik desimal dalam format desimal
tetap, keluaran tidak akan menunjukkan titik desimal dan bagian desimal. Untuk memaksa
sistem agar menampilkan titik desimal dan nol pengekor, Anda bisa menggunakan
manipulator showpoint. Statemen
berikut menetapkan keluaran dari angka desimal dengan sebuah titik desimal dan
nol-nol pengekor pada divais keluaran standar:
cout << showpoint;
Tentu saja, statemen
berikut menetapkan keluaran dari sebuah angka titik-mengambang dalam format
desimal tetap dengan titik desimal dan nol-nol pengekor pada divais keluaran
standar:
cout << fixed << showpoint;
Program pada contoh 2.11
mengilustrasikan bagaimana menggunakan manipulator setprecision, fixed, dan
showpoint.
Contoh 2.11
|
|
//Contoh: setprecision, fixed, showpoint
#include
<iostream> //Baris
1
#include
<iomanip> //Baris
2
using namespace std; //Baris
3
const double PI
= 3.14159265; //Baris 4
int main() //Baris
5
{ //Baris 6
double radius = 12.67; //Baris 7
double tinggi = 12.00; //Baris 8
cout
<< fixed << showpoint; //Baris
9
cout
<< setprecision(2)
<< "Baris 10: setprecision(2)"
<< endl; //Baris 10
cout
<< "Baris 11: radius =
" << radius << endl; //Baris 11
cout
<< "Baris 12: tinggi = "
<< tinggi << endl; //Baris 12
cout
<< "Baris 13: volume =
"
<< PI * radius * radius * tinggi << endl; //Baris 13
cout
<< "Baris 14: PI = "
<< PI << endl << endl; //Baris 14
cout
<< setprecision(3)
<< "Baris 15:
setprecision(3)" << endl; //Baris
15
cout
<< "Baris 16: radius =
" << radius << endl; //Baris 16
cout
<< "Baris 17: tinggi =
" << tinggi << endl; //Baris 17
cout
<< "Baris 18: volume =
"
<< PI * radius * radius * tinggi << endl; //Baris 18
cout
<< "Baris 19: PI = "
<< PI << endl << endl; //Baris 19
cout
<< setprecision(4)
<< "Baris 20:
setprecision(4)" << endl; //Baris
20
cout
<< "Baris 21: radius = "
<< radius << endl; //Baris 21
cout
<< "Baris 22: tinggi =
" << tinggi << endl; //Baris 22
cout
<< "Baris 23: volume =
"
<< PI * radius * radius * tinggi << endl; //Baris 23
cout << "Baris 24: PI = " << PI << endl << endl;
//Baris 24
cout
<< "Baris 25: "
<< setprecision(3) << radius << ", "
<< setprecision(2) << tinggi << ", "
<< setprecision(5) << PI << endl; //Baris 25
return 0; //Baris 26
}
Keluaran Program:
Baris 10: setprecision(2)
Baris 11: radius = 12.67
Baris 12: tinggi = 12.00
Baris 13: volume = 6051.80
Baris 14: PI = 3.14
Baris 15: setprecision(3)
Baris 16: radius = 12.670
Baris 17: tinggi = 12.000
Baris 18: volume = 6051.797
Baris 19: PI = 3.142
Baris 20: setprecision(4)
Baris 21: radius = 12.6700
Baris 22: tinggi = 12.0000
Baris 23: volume = 6051.7969
Baris 24: PI = 3.1416
Baris 25: 12.670, 12.00, 3.14159
Pada program ini,
statemen pada baris 2 mencantumkan file header iomanip, dan statemen pada baris 4 mendeklarasikan konstanta
bernama PI dan menetapkan nilainya
dengan delapan dijit di belakang titik desimal. Statemen pada baris 7 dan 8
mendeklarasikan dan menginisialisasi variabel radius dan tinggi untuk
menyimpan radius dasar dan tinggi sebuah silinder. Statemen pada baris 10
menetapkan keluaran dari angka titik-mengambang dalam format desimal tetap
dengan sebuah titik desimal dan nol-nol pengekor.
Statemen pada baris 11,
12, 13, dan 14 menampilkan nilai dari radius,
tinggi, volume, dan PI dalam dua
dijit di belakang titik desimal.
Statemen pada baris 16,
17, 18, dan 19 menampilkan nilai dari radius,
tinggi, volume, dan PI dalam
tiga dijit di belakang titik desimal.
Statemen pada baris 21,
22, 23, dan 24 menampilkan nilai dari radius,
tinggi, volume, dan PI dalam
empat dijit di belakang titik desimal.
Statemen pada baris 25
menampilkan nilai dari radius dalam
tiga dijit di belakang titik desimal, nilai dari tinggi dalam dua dijit di belakang titik desimal, dan nilai dari PI dalam lima dijit di belakang titik
desimal.
Perhatikan bagaimana
nilai dari radius ditampilkan pada
baris 11, 16, dan 21. Nilai dari radius
ditampilkan pada baris 16 memuat sebuah 0 pengekor. Ini karena nilai yang
disimpan di dalam radius hanya
memiliki dua dijit di belakang titik desimal. Sebuah 0 ditampilkan pada dijit
ketiga di belakang titik desimal. Dengan cara yang sama, nilai dari tinggi ditampilkan pada baris 12, 17,
dan 22.
Selain itu, perhatikan
bagaimana statemen pada baris 13, 18, dan 23 menghitung dan menampilkan volume dalam dua, tiga, dan empat dijit
di belakang titik desimal.
Perhatikan bahwa nilai
dari PI ditampilkan pada baris 24
mengalami pembulatan.
Statemen pada baris 25
pertama-tama menetapkan keluaran dari angka titik-mengambang menjadi tiga dijit
di belakang titik desimal dan kemudian menampilkan nilai dari radius dalam tiga dijit di belakang
titik desimal. Setelah menampilkan nilai dari radius, statemen pada baris 25 menetapkan keluaran dari angka
titik-mengambang dalam dua dijit di belakang titik desimal dan kemudian
menampilkan keluaran dari tinggi
dalam dua dijit di belakang titik desimal. Selanjutnya, ia menetapkan keluaran
dari angka titik-mengambang dalam lima dijit di belakang titik desimal dan
kemudian menampilkan nilai dari PI
dalam empat dijit di belakang titik desimal.
Jika Anda mengabaikan
statemen pada baris 9 dan mengkompilasi-ulang dan menjalankan program, Anda
akan melihat keluaran default atas angka desimal. Lebih spesifik lagi, nilai
dari ekspresi yang menghitung volume
akan ditampilkan dalam notasi ilmiah.
Manipulator
setw
Manipulator setw dipakai untuk menampilkan nilai
dari sebuah ekspresi dalam sejumlah kolom tertentu. Nilai dari ekspresi dapat
berupa sebuah string atau angka. Ekspresi setw(n)
menampilkan nilai dari ekspresi berikutnya dalam n kolom. Keluaran disejajarkan ke kanan. Jadi, jika Anda
menspesifikasi jumlah kolom menjadi 8, misalnya, dan keluaran hanya memerlukan
4 kolom, maka empat kolom pertama akan kosong (diisi spasi). Selain itu, jika
jumlah kolom yang dispesifikasi kurang dari jumlah kolom yang diperlukan oleh
keluaran, maka keluaran secara otomatis mengekspansi menjadi jumlah kolom yang
diperlukan; keluaran tidak dipotong. Sebagai contoh, jika x adalah sebuah variabel int,
statemen berikut menampilkan nilai dari x
dalam lima kolom pada divais keluaran standar:
cout <<
setw(5) << x << endl;
Untuk menggunakan
manipulator setw, program harus mencantumkan file header iomanip. Jadi, statemen include
berikut diperlukan:
#include <iomanip>
Tidak seperti setprecision, yang mengendalikan
keluaran dari semua angka titik-mengambang sampai ia dinon-aktifkan, setw hanya mengendalikan keluaran dari
ekspresi berikutnya.
Contoh 2.12
|
|
//Contoh: setw
#include
<iostream>
#include
<iomanip>
using namespace std;
int main()
{
int x = 19; //Baris 1
int a = 345; //Baris 2
double y = 76.384; //Baris 3
cout
<< fixed << showpoint; //Baris
4
cout
<< "12345678901234567890"
<< endl; //Baris 5
cout
<< setw(5) << x << endl; //Baris
6
cout << setw(5) << a <<
setw(5) << "Hi"
<< setw(5) << x << endl << endl; //Baris 7
cout
<< setprecision(2); //Baris
8
cout
<< setw(6) << a << setw(6) << y
<< setw(6) << x << endl; //Baris 9
cout
<< setw(6) << x << setw(6) << a
<< setw(6) << y << endl
<< endl; //Baris 10
cout
<< setw(5) << a << x << endl; //Baris 11
cout
<< setw(2) << a << setw(4) << x << endl; //Baris 12
return 0;
}
Keluaran Program:
12345678901234567890
19
345 Hi
19
345
76.38 19
19 345 76.38
34519
345 19
Statemen pada baris 1, 2,
dan 3 mendeklarasikan variabel x, a, dan y dan menginisialisasi ketiga variabel ini dengan 19, 345, dan
76.384. Statemen pada baris 4 menetapkan keluaran dari angka titik-mengambang
dalam format desimal tetap dengan sebuah titik desimal dan nol-nol pengekor.
Keluaran dari statemen pada baris 5 menunjukkan posisi-posisi kolom ketika
nilai-nilai tertentu di tampilkan; ia merupakan baris pertama pada keluaran.
Statemen pada baris 6
menampilkan nilai dari x dalam lima
kolom. Karena x hanya mempunyai du
dijit, hanya dua kolom yang diperlukan untuk menampilkan nilainya. Oleh karena
itu, tiga kolom pertama diisi dengan spasi pada baris kedua keluaran. Statemen
pada baris 7 menampilkan nilai dari a
dalam lima kolom pertama, string “Hi”
dalam lima kolom berikutnya, dan kemudian nilai dari x dalam lima kolom selanjutnya. Karena string “Hi” hanya memuat dua karakter dan lima kolom ditetapkan untuk
menampung dua karakter ini, tiga kolom pertama diisi dengan spasi. Lihat baris
ketiga pada keluaran. Baris keempat pada keluaran adalah kosong karena
manipulator endl muncul dua kali
pada baris 7.
Statemen pada baris 8
menetapkan keluaran dari angka titik-mengambang dengan dua dijit di belakang
titik desimal. Statemen pada baris 9 menampilkan nilai dari a dalam enam kolom pertama, y dalam enam kolom berikutnya, dan x dalam enam kolom selanjutnya, yang
menciptakan baris kelima pada keluaran. Keluaran dari statemen pada baris 10
(yang merupakan baris keenam pada keluaran) sama dengan keluaran dari statemen
pada baris 9. Perhatikan bagaimana angka-angka disejajarkan. Baris ketujuh pada
keluaran adalah kosong karena manipulator endl
muncul dua kali pada baris 10.
Statemen pada baris 11
menampilkan pertama-tama nilai dari a
dalam lima kolom dan kemudian nilai dari x.
Perhatikan bahwa manipulator setw
dalam statemen pada baris 11 hanya mengendalikai keluaran dari a. Jadi, setelah nilai dari a ditampilkan, nilai dari x ditampilkan pada posisi kursor
sekarang (lihat baris kedelapan pada keluaran).
Dalam statemen cout pada baris 12, hanya dua kolom
yang disediakan untuk menampilkan nilai dari a. Namun, nilai dari a
memiliki tiga dijit, jadi keluaran diekspansi menjadi tiga kolom. Nilai dari x kemudian ditampilkan dalam empat
kolom. Karena nilai dari x hanya
memuat dua dijit, hanya dua kolom yang diperlukan untuk menampilkan nilai dari x. Oleh karena itu, karena empat kolom
dialokasikan untuk menampilkan nilai dari x,
dua kolom pertama adalah kosong (lihat baris kesembilan pada keluaran).
Perangkat Pemformatan Keluaran
Lain
Dalam bagian sebelumnya,
Anda telah belajar bagaimana menggunakan manipulator setprecision, fixed, dan
showpoint untuk mengendalikan
keluaran dari angka titik-mengambang dan bagaimana menggunakan manipulator setw untuk menampilkan keluaran dalam
kolom tertentu. Meskipun semua manipulator ini sudah cukup untuk menghasilkan
tampilan keluaran yang elegan, dalam beberapa situasi, Anda mungkin
menginginkan yang lebih. Pada bagian ini, Anda akan belajar beberapa perangkat
pemformatan lain yang memberikan kendali keluaran tambahan bagi Anda.
Manipulator
setfill
Ingat bahwa dalam
manipulator setw, jika jumlah kolom
yang dispesifikasi melebihi jumlah kolom yang dibutuhkan oleh ekspresi, maka
keluaran dari ekspresi akan disejajarkan ke kanan dan kolom-kolom yang tidak
terpakai akan diisi dengan spasi. Variabel aliran keluaran dapat menggunakan
manipulator setfill untuk mengisi kolom-kolom tak terpakai dengan sebuah
karakter selain spasi.
Sintaks dalam menggunakan
manipulator setfill adalah:
ostreamVar
<< setfill(ch);
dimana ostreamVar merupakan sebuah variabel
aliran keluaran dan ch adalah sebuah
karakter. Sebagai contoh, statemen:
cout << setfill('#');
menetapkan karakter
pengisi ‘#’ pada divais keluaran
standar. Untuk menggunakan manipulator setfill,
program harus mencantumkan file header iomanip.
Program pada contoh 2.13
mengilustrasikan pengaruh penggunaan setfill
pada sebuah program.
Contoh 2.13
|
|
//Contoh: setfill
#include
<iostream>
#include
<iomanip>
using namespace std;
int main()
{
int x = 15; //Baris 1
int y = 7634; //Baris 2
cout
<< "12345678901234567890"
<< endl; //Baris 3
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 4
cout
<< setfill('*'); //Baris
5
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 6
cout
<< setw(5) << x << setw(7) << setfill('#')
<< y << setw(8) << "Alam" << endl; //Baris
7
cout
<< setw(5) << setfill('@') << x
<< setw(7) << setfill('#') << y
<< setw(8) << setfill('^') << "Alam"
<< endl; //Baris 8
cout
<< setfill(' '); //Baris
9
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 10
return 0;
}
Keluaran Program:
12345678901234567890
15 7634
Alam
***15***7634****Alam
***15###7634####Alam
@@@15###7634^^^^Alam
15 7634
Alam
Statemen pada baris 1 dan
2 mendeklarasikan dan menginisialisasi variabel x dan y dengan 15 dan
7634. Keluaran dari statemen pada baris 3, bari pertama pada keluaran, menunjukkan
posisi kolom ketika statemen-statemen berikutnya menampilkan nilai tiap
variabel. Statemen pada baris 4 menampilkan nilai dari x dalam lima kolom, nilai dari y
dalam tujuh kolom, dan string “Alam”
dalam delapan kolom. Pada statemen ini, karakter pengisi adalah karakter spasi,
seperti ditampilkan pada baris kedua keluaran.
Statemen pada baris 5
menetapkan karakter pengisi menjadi *.
Statemen pada baris 6 menampilkan nilai dari x dalam lima kolom, nilai dari y
dalam tujuh kolom, dan string “Alam”
dalam delapan kolom. Karena x
merupakan sebuah angka dua-dijit dan lima kolom dialokasikan untuk menampilkan
nilainya, tiga kolom pertama tidak dipakai oleh x dan, oleh karena itu, diisi oleh karakter pengisi *. Untuk menampilkan nilai y, tujuh kolom dialokasikan; y merupakan sebuah angka empat-dijit,
jadi, karakter pengisi mengisi tiga kolom pertama. Sama halnya, untuk
menampilkan nilai string “Alam”,
delapan kolom dialokasikan; string “Alam”
hanya memuat empat karakter, jadi, karakter pengisi mengisi empat kolom
pertama. Lihat baris ketiga pada keluaran program.
Keluaran dari statemen
pada baris 7, baris keempat pada keluaran program, sama dengan keluaran dari
statemen pada baris 6, kecuali bahwa karakter pengisi untuk y dan string “Alam” adalah #. Dari keluaran
statemen pada baris 8 (baris kelima pada keluaran program), karakter pengisi
untuk x adalah @, karakter pengisi untuk y
adalah #, dan karakter pengisi untuk
string “Alam” adalah ^. Manipulator setfill menetapkan
ketiga karakter pengisi tersebut.
Statemen pada baris 9
menetapkan karakter pengisi menjadi spasi. Statemen pada baris 10 menampilkan
nilai x, y, dan string “Alam”
menggunakan karakter pengisi spasi, seperti ditunjukkan pada baris keenam
keluaran program.
Manipulator
left dan right
Ingat bahwa jika jumlah
kolom yang dispesifikasi pada manipulator setw melebihi jumlah kolom yang
diperlukan oleh ekspresi berikutnya, maka keluaran default akan disejajarkan ke
kanan. Kadangkala, Anda ingin keluaran disejajarkan ke kiri. Untuk menyejajarkan
keluaran ke kiri, Anda bisa menggunakan manipulator left.
Sintaks dalam menetapkan
manipulator left adalah:
ostreamVar
<< left;
dimana ostreamVar adalah variabel aliran
keluaran. Sebagai contoh, statemen berikut menetapkan keluaran disejajarkan ke
kiri pada divais keluaran standar:
cout << left;
Anda dapat menon-aktifkan
manipulator left menggunakan fungsi
aliran unsetf. Sintaks dalam
menon-aktifkan manipulator left
adalah:
ostreamVar.unsetf(ios::left);
dimana ostreamVar adalah variabel aliran
keluaran. Penon-aktifan manipulator left
akan mengembalikan keluaran menjadi pengaturan defaultnya. Sebagai contoh,
statemen berikut menon-aktifkan manipulator left pada divais keluaran standar:
cout.unsetf(ios::left);
Sintaks dalam menetapkan
manipulator right adalah:
ostreamVar
<< right;
dimana ostreamVar adalah variabel aliran
keluaran. Sebagai contoh, statemen berikut menetapkan keluaran disejajarkan ke
kanan pada divais keluaran standar:
cout << right;
Program pada contoh 2.14
mengilustrasikan pengaruh dari manipulator left
dan right.
Contoh 2.14
|
|
//Contoh: penyejajaran kiri
#include
<iostream>
#include
<iomanip>
using namespace
std;
int main()
{
int x = 15; //Baris 1
int y = 7634; //Baris 2
cout
<< left; //Baris
3
cout
<< "12345678901234567890"
<< endl; //Baris 4
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 5
cout
<< setfill('*'); //Baris
6
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 7
cout
<< setw(5) << x << setw(7) << setfill('#')
<< y << setw(8) << "Alam" << endl; //Baris
8
cout
<< setw(5) << setfill('@') << x
<< setw(7) << setfill('#')
<< y
<< setw(8) << setfill('^')
<< "Alam"
<< endl; //Baris
9
cout
<< right; //Baris
10
cout
<< setfill(' '); //Baris
11
cout
<< setw(5) << x << setw(7) << y
<< setw(8) << "Alam"
<< endl; //Baris 12
return 0;
}
Keluaran Program:
12345678901234567890
15 7634 Alam
15***7634***Alam****
15***7634###Alam####
15@@@7634###Alam^^^^
15 7634
Alam
Masukan/Keluaran dan Tipe string
Anda dapat menggunakan
sebuah variabel aliran masukan, seperti cin,
dan operator ekstraksi >> untuk membaca sebuah string ke dalam suatu
variabel bertipe data string.
Sebagai contoh, jika masukan adalah string “Shelly”, kode berikut menyimpan masukan ini ke dalam variabel string, nama:
string nama; //deklarasi
variabel
cin >> nama; //statemen pembacaan
Ingat bahwa operator
ekstraksi akan melompati sembarang karakter spasi yang ada di depan dan bahwa
ia akan berhenti membaca pada sebuah karakter spasi. Sebagai konsekuensinya,
Anda tidak dapat menggunakan operator ekstraksi untuk membaca string yang memuat
spasi-putih. Sebagai contoh, dimisalkan bahwa variabel nama didefinisikan seperti sebelumnya. Jika masukan adalah:
Jozen Balige
maka setelah statemen:
cin >> nama;
dieksekusi, nilai dari
variabel nama adalah “Jozen”.
Untuk membaca sebuah
string yang memuat spasi, Anda dapat menggunakan fungsi getline. Sintaks dalam menggunakan fungsi getline adalah:
getline(istreamVar,
strVar);
dimana istreamVar merupakan sebuah variabel
aliran masukan dan strVar adalah
sebuah variabel string. Pembacaan
dibatasi oleh karakter garis-baru ‘\n’.
Fungsi getline membaca sampai ia menemukan
akhir dari baris sekarang. Karakter garis-baru juga dibaca tetapi tidak
disimpan di dalam variabel string.
Perhatikan statemen berikut:
string stringKu;
Jika masukan memuat 29
karakter:
ssssssHallo semua. Apa kabar?
dimana s merepresentasikan sebuah spasi,
setelah statemen:
getline(cin,
stringKu);
nilai dari stringKu adalah:
stringKu
= " Hallo semua. Apa
kabar?"
Semua 29 karakter,
termasuk enam spasi kosong, disimpan ke dalam stringKu.
Sama halnya, Anda dapat
menggunakan sebuah variabel aliran keluaran, seperti cout, dan operator penyisipan << untuk menampilkan isi sebuah
variabel bertipe data string.
Memahami Error Logika
Pada Bab 1, telah
diilustrasikan bagaimana memahami dan mengoreksi error sintaks. Seperti yang
Anda lihat, error sintaks dilaporkan oleh kompiler, dan kompiler tidak hanya
melaporkan error sintaks, tetapi juga memberikan penjelasan tentang error
tersebut. Di sisi lain, error logika umumnya tidak ditangkap oleh kompiler
kecuali seperti kasus seperti penggunaan sebuah variabel yang tidak
diinisialisasi secara benar. Pada bagian ini, akan diilustrasikan bagaimana
menemukan dan mengoreksi error logika menggunakan statemen cout. Dimisalkan bahwa Anda ingin menuliskan sebuah program yang
mengambil suhu dalam Fahrenheit sebagai masukan dan menampilkan suhu ekivalen
dalam Celcius. Formula dalam mengkonversi suhu adalah: Celcius = 5 / 9 * (Fahrenheit – 32). Jadi, perhatikan program
berikut:
#include
<iostream> //Baris
1
using namespace
std; //Baris
2
int main() //Baris
3
{ //Baris
4
int fahrenheit; //Baris 5
int celsius; //Baris 6
cout
<< "Masukkan suhu dalam Fahrenheit:
"; //Baris 7
cin >>
fahrenheit; //Baris
8
cout
<< endl; //Baris
9
celsius = 5
/ 9 * (fahrenheit - 32); //Baris
10
cout
<< fahrenheit << " derajat
F = "
<< celsius << " derajat
C. " << endl; //Baris
11
return 0; //Baris 12
} //Baris
13
Keluaran Program 1:
Masukkan suhu dalam Fahrenheit: 32
32 derajat F = 0 derajat C.
Keluaran Program 2:
Masukkan suhu dalam Fahrenheit: 110
110 derajat F = 0 derajat C.
Hasil yang ditunjukkan
pada perhitungan pertama tampak benar. Namun, hasil pada perhitungan kedua
jelas tidak benar meskipun formula yang sama dipakai, karena 110 derajat
Fahrenheit sama dengan 43 derajat Celcius. Ini berarti nilai dari celcius yang dihitung pada baris 10
tidak benar. Sekarang, nilai celcius
diberikan oleh ekspresi 5 / 9 *
(fahrenheit – 32). Jadi, Anda sebaiknya memeriksa ekspresi ini lebih dekat
lagi. Untuk melihat efek dari ekspresi ini, Anda dapat secara terpisah
menampilkan nilai-nilai dari dua ekspresi 5
/ 9 dan fahrenheit – 32. Ini
dapat dilakukan dengan secara temporer menyisipkan sebuah statemen keluaran
seperti yang ditunjukkan pada program berikut:
#include
<iostream> //Baris
1
using namespace
std; //Baris
2
int main() //Baris
3
{ //Baris
4
int fahrenheit; //Baris 5
int celsius; //Baris 6
cout
<< "Masukkan suhu dalam
Fahrenheit: "; //Baris
7
cin >>
fahrenheit; //Baris
8
cout
<< endl; //Baris
9
cout
<< "5 / 9 = "
<< 5 / 9
<< "; fahrenheit - 32
= "
<< fahrenheit - 32 << endl; //Baris
9a
celsius = 5
/ 9 * (fahrenheit - 32); //Baris
10
cout
<< fahrenheit << " derajat
F = "
<< celsius << " derajat
C. " << endl; //Baris
11
return 0; //Baris 12
} //Baris
13
Keluaran Program:
Masukkan suhu dalam Fahrenheit: 110
5 / 9 = 0; fahrenheit - 32 = 78
110 derajat F = 0 derajat C.
Sekarang Anda lihat
keluaran program. Anda melihat bahwa nilai dari 5 / 9 = 0 dan nilai dari fahrenheit
– 32 = 78. Karena fahrenheit = 110,
nilai dari ekspresi fahrenheit – 32
adalah benar. Sekarang tengok ekspresi 5
/ 9. Nilai dari ekspresi ini adalah 0. Karena kedua operand, 5 dan 9, dari
operator / adalah integer,
penggunaan pembagian integer menyebabkan nilai ekspresi menjadi 0. Jadi, nilai
dari ekspresi 5 / 9 = 0 juga
dihitung dengan benar. Oleh karena itu, nilai dari ekspresi 5 / 9 * (fahrenheit – 32) akan selalu 0
tanpa memandang nilai fahrenheit.
Masalahnya terletak pada pembagian integer. Anda dapat menggantikan ekspresi 5 / 9 dengan 5.0 / 9. Pada kasus ini, nilai dari ekspresi 5.0 / 9 * (fahrenheit – 32) menjadi sebuah angka desimal. Karena fahrenheit dan celcius adalah variabel int,
Anda dapat menggunakan operator cast
untuk mengkonversi nilai ini menjadi sebuah integer, jadi, Anda menggunakan
ekpresi berikut:
celsius = static_cast<int> (5.0 / 9 * (fahrenheit - 32) +
0.5);
(Perhatikan bahwa dalam
ekspresi tersebut, Anda menambahkan 0.5 untuk membulatkan angka menjadi integer
terdekat).
Program yang telah
direvisi adalah:
#include
<iostream> //Baris
1
using namespace
std; //Baris
2
int main() //Baris
3
{ //Baris
4
int fahrenheit; //Baris 5
int celsius; //Baris 6
cout
<< "Masukkan suhu dalam
Fahrenheit: "; //Baris
7
cin >>
fahrenheit; //Baris
8
cout
<< endl; //Baris
9
celsius =
static_cast<int>
(5.0 / 9 * (fahrenheit - 32) + 0.5); //Baris
10
cout
<< fahrenheit << " derajat
F = "
<< celsius << " derajat
C. " << endl; //Baris
11
return 0; //Baris 12
} //Baris
13
Keluaran Program:
Masukkan suhu dalam Fahrenheit: 110
110 derajat F = 43 derajat C.
File Masukan/Keluaran
Beberapa bagian
sebelumnya telah mendiskusikan beberapa detil tentang bagaimana membaca masukan
dari papanketik (divais masukan standar) dan mengirimkan keluaran pada layar
(divais keluaran standar). Namun, pembacaan masukan dari papanketik dan
pengiriman keluaran ke layar memiliki beberapa keterbatasan. Pembacaan data
dalam sebuah program dari papanketik sangat berguna sepanjang jumlah masukan
sangat kecil. Pengiriman keluaran ke layar bekerja dengan baik jika jumlah data
kecil (tidak lebih besar dari ukuran layar).
Jika jumlah data masukan
besa, maka sangat tidak efisien untuk mengetikkannya pada papanketik setiap
kali Anda menjalankan sebuah program. Selain itu, pengetikan masukan dapat
menyebabkan kesalahan yang tidak disengaja. Anda harus mempunyai cara lain
dalam membaca data ke dalam program dari sumber lain. Dengan menggunakan sumber
data alternatif, Anda dapat mempersiapkan data sebelum menjalankan sebuah
program, dan program dapat mengakses data setiap kali ia dijalankan.
Dimisalkan bahwa Anda
ingin menyajikan keluaran program pada sebuah rapat. Pendistribusian salinan
dari keluaran program merupakan pendekatan yang lebih baik daripada hanya
ditampilkan pada sebuah monitor. Sebagai contoh, Anda ingin memberikan laporan
tercetak kepada setiap anggota panitia sebelum rapat dimulai. Selain itu,
keluaran kadangkala harus disimpan sehingga keluaran yang dihasilkan oleh
sebuah program dapat dipakai sebagai masukan bagi program lain.
Bagian ini akan mendiskusikan
bagaimana membaca data dari divais masukan lain, seperti disk (yaitu
penyimpanan sekunder), dan bagaimana menyimpan keluaran di dalam sebuah disk.
C++ memampukan sebuah program untuk membaca data secara langsung dari dan
menyimpan keluaran secara langsung ke penyimpanan sekunder. Sebuah program
dapat menggunakan I/O file dan membaca data dari atau menuliskan data ke dalam
sebuah file. Secara formal, sebuah file didefinisikan sebagai berikut:
File: Sebuah area di dalam penyimpanan sekunder yang
dipakai untuk menyimpan informasi.
File header I/O standar,
iostream, memuat beberapa tipe data dan variabel yang bisa dipakai hanya untuk
pembacaan data dari divais masukan standar dan untuk menampilkan (mengirim
keluaran) pada divais keluaran standar. Di samping itu, C++ menyediakan sebuah
file header yang dinamakan dengan fstream, yang bisa dipakai untuk I/O file.
Selain itu, file header fstream memuat definisi atas dua tipe data: ifstream, yang berarti pembacaan aliran
file dan sama seperti istream, dan ofstream, yang berarti menghasilkan
keluaran berupa aliran file dan sama dengan ostream.
Variabel cin dan cout telah didefinisikan dan diasosiasikan dengan divais
masukan/keluaran standar. Selain itu, >>,
get, ignore, putback, peek, dan seterusnya dapat dipakai
dengan cin, sedangkan <<, setfill, dan lainnya dapat dipakai dengan cout. Semua operator dan fungsi tersebut dapat pula dipakai untuk
I/O file, tetapi file header fstream
tidak mendeklarasikan variabel untuk menggunakannya. Anda harus mendeklarasikan
variabel yang dinamakan dengan variabel
aliran file, yang mencakup variabel ifstream
untuk pembacaan dan variabel ofstream
untuk pengiriman keluaran. Anda kemudian menggunakan variabel-variabel ini
bersama dengan <<, >>, atau fungsi-fungsi lain untuk I/O. Ingat
bahwa C++ tidak secara otomatis menginisialisasi variabel yang didefinisikan
oleh pengguna. Begitu Anda mendeklarasikan variabel fstream, maka Anda harus mengasosiasikan variabel-variabel file ini
dengan sumber masukan/keluaran.
I/O File adalah proses
lima-langkah:
1. Mencantumkan
file header fstream di dalam program.
2. Mendeklarasikan
variabel-varaibel aliran file.
3. Mengasosiasikan
variabel-variabel aliran file dengan sumber masukan/keluaran.
4. Menggunakan
variabel-variabel aliran file dengan <<, >>, atau fungsi-fungsi
masukan/keluaran.
5.
Menutup file.
Sekarang, akan dijelaskan
kelima langkah ini secara detil. Program garis-besar berikut menunjukkan
bagaimana kelima langkah ini di dalam sebuah program.
Langkah 1 mensyaratkan bahwa file header fstream dicantumkan di dalam program. Statemen berikut menuntaskan
pekerjaan ini:
#include <fstream>
Langkah 2 mensyaratkan Anda untuk mendeklarasikan
variabel-variabel aliran file. Perhatikan dua statemen berikut:
ifstream inData;
ofstream outData;
Statemen pertama
mendeklarasikan inData sebagai
sebuah variabel aliran file masukan. Statemen kedua mendeklarasikan outData sebagai sebuah variabel aliran
file keluaran.
Langkah 3 mengharuskan Anda untuk mengasosiasikan
variabel-variabel aliran file dengan sumber masukan/keluaran. Langkah ini dinamakan dengan langkah
pembukaan file. Fungsi anggota aliran open
dipakai untuk membuka file. Sintaks untuk membuka sebuah file adalah:
variabelAliranFile.open(namaSumber);
Di sini, variabelAliranFile merupakan sebuah
variabel aliran file, dan namaSumber
adalah nama dari file masukan/keluaran.
Dimisalkan bahwa Anda
telah melakukan pendeklarasikan pada langkah 2 di dalam sebuah program.
Selanjutnya, dimisalkan bahwa data masukan disimpan di dalam sebuah file yang
dinamakan prog.dat. Statemen-statemen
berikut mengasosiasikan inData
dengan prog.dat dan outData dengan prog.out. Yaitu, file prog.dat
dibuka untuk pembacaan data, dan file prog.out
dibuka untuk penulisan data.
inData.open("prog.dat"); //membuka
file masukan; Baris 1
outData.open("prog.out");
//membuka file keluaran; Baris 2
Langkah 4 secara umum bekerja sebagai berikut. Anda menggunakan
variabel-variabel aliran file dengan <<, >>, atau fungsi-fungsi
masukan/keluaran yang lain. Sintaks dalam menggunakan >> atau << dengan
variabel-variabel aliran file sama persis dengan sintaks dalam menggunakan cin dan cout. Anda dapat menggunakan nama variabel aliran file. Sebagai
contoh, statemen:
inData >> besarGaji;
membaca data dari file prog.dat dan menyimpannya di dalam
variabel besarGaji. Statemen:
outData << "Besar gaji adalah: Rp. " << gaji << endl;
menyimpan keluaran, yaitu
Besar gaji adalah: Rp. 565.78, di
dalam file prog.out. Statemen ini
mengasumsikan bahwa gaji adalah
sebesar 565.78.
Begitu I/O selesai,
langkah 5 mengharuskan penutupan file. Penutupan sebuah file berarti bahwa
variabel-variabel aliran file tidak lagi dikaitkan dengan area penyimpanan dan
dibebaskan. Setelah variabel-variabel tersebut dibebaskan, ia dapat
digunakan-ulang untuk I/O file lain. Selain itu, penutupan sebuah file
memastikan bahwa keseluruhan keluaran berhasil dikirim ke file; dan penyangga
akan dikosongkan. Anda menutup file menggunakan fungsi aliran close. Sebagai contoh, diasumsikan
bahwa program telah mendeklarasikan apa yang diharuskan pada langkah 2 dan
langkah 3, statemen-statemen untuk menutup file adalah:
inData.close();
outData.close();
Dalam bentuk garis-besar,
sebuah program yang menggunakan I/O file biasanya memiliki format berikut:
#include <fstream>
//Menambahkan
beberapa file header yang diperlukan
using namespace std;
int main()
{
//Mendeklarasikan variabel-variabel aliran
file
ifstream inData;
ofstream outData;
.
.
.
//Membuka file
inData.open("prog.dat"); //membuka file masukan
outData.open("prog.out"); //membuka file keluaran
//Kode untuk mamanipulasi data
//Menutup file
inData.close();
outData.close();
return
0;
}
CONTOH
PEMROGRAMAN: Penjualan Tiket dan Donasi
Sebuah film pada suatu
studio teater sedang digemari. Untuk menolong donasi pada yayasan sosial
tertentu, pemiliki studio memutuskan untuk menyumbangkan sebagian keuntungan
kotor dari film tersebut. Contoh ini merancang dan mengimplementasikan sebuah
program yang meminta pengguna untuk membaca nama film, harga tiket dewasa,
harga tiket anak, jumlah tiket dewasa terjual, jumlah tiket anak terjual, dan
persentase keuntungan kotor yang akan didonasikan. Keluaran program tampak
sebagai berikut:
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Nama Film:
..................................Air Force One
Jumlah Tiket Terjual: ............................. 2650
Keuntungan Kotor:
.......................... Rp. 9150.00
Persentase Keuntungan Kotor
Didonasikan: 10.00%
Jumlah Didonasikan:
......................... Rp. 915.00
Penjualan Bersih: ..........................Rp. 8235.00
Perhatikan bahwa string,
seperti “Nama Film: “, pada kolom
pertama disejajarkan ke kiri, angka-angka di kolom kanan disejajarkan ke kanan,
dan angka-angka desimal ditampilkan dengan dua dijit di belakang titik desimal.
Masukan: Masukan pada program memuat nama film, harga tiket
dewasa, harga tiket anak, jumlah tiket dewasa terjual, jumlah tiket anak
terjual, dan persentase keuntungan kotor yang akan didonasikan.
Keluaran: Seperti yang ditampilkan.
Analisa Masalah dan Desain Algoritma
Untuk menghitung jumlah
yang akan didonasikan pada yayasan tertentu dan penjualan bersih, Anda
pertama-tama perlu menentukan keuntungan kotor. Untuk menghitung keuntungan
kotor, Anda mengalikan jumlah tiket dewasa terjual dengan harga tiket dewasa,
mengalikan jumlah tiket anak terjual dengan harga tiket anak, dan kemudian
menambahkan kedua hasil itu. Yaitu:
keuntunganKotor = hargaTiketDewasa * jlhTiketDewasaTerjual
+ hargaTiketAnak * jlhTiketAnakTerjual;
Selanjutnya, Anda
menentukan pesentase dari jumlah uang yang akan didonasikan kepada yayasan sosial
dan kemudian menghitung penjualan bersih dengan mengurangkan jumlah donasi dari
keuntungan kotor. Formula untuk menghitung jumlah donasi dan keuntungan bersih
diberikan nanti. Analisa ini menghasilkan algoritma berikut:
1. Mendapatkan
nama film.
2. Mendapatkan
harga tiket dewasa.
3. Mendapatkan
harga tiket anak.
4. Mendapatkan
jumlah tiket dewasa yang terjual.
5. Mendapatkan
jumlah tiket anak yang terjual.
6. Mendapatkan
persentase dari keuntungan kotor yang akan didonasikan kepada yayasan sosial.
7. Menghitung
keuntungan kotor menggunakan formula berikut:
keuntunganKotor
= hargaTiketDewasa * jlhTiketDewasaTerjual
+ hargaTiketAnak * jlhTiketAnakTerjual;
8. Menghitung
jumlah donasi kepada yayasan sosial menggunakan formula:
jumlahDonasi = keuntunganKotor
* persenDonasi / 100;
9. Menghitung
penjualan bersih menggunakan formula berikut:
penjualanBersih =
keuntunganKotor – jumlahDonasi;
Variabel
Dari diskusi sebelumnya,
dapat dipahami bahwa Anda memerlukan beberapa variabel untuk menyimpan nama
film, harga tiket dewasa, harga tiket anak, jumlah tiket dewasa terjual, jumlah
tiket anak terjual, persentase keuntungan kotor yang akan didonasikan ke
yayasan sosial, keuntungan kotor, jumlah donasi, dan jumlah penjualan bersih.
Oleh karena itu, variabel-variabel berikut dibutuhkan:
string namaFilm;
double hargaTiketDewasa;
double hargaTiketAnak;
int JlhTiketDewasaTerjual;
int JlhTiketAnakTerjual;
double persenDonasi;
double keuntunganKotor;
double jumlahDonasi;
double penjualanBersih;
Karena namaFilm dideklarasikan sebagai
variabel string, Anda perlu mencantumkan file header string. Oleh karena itu, program memerlukan, di samping yang lain,
statemen include:
#include <string>
Pemformatan Keluaran
Pada keluaran, kolom
pertama disejajarkan ke kiri dan angka-angka pada kolom kedua disejajarkan ke
kanan. Oleh karena itu, ketika menampilkan sebuah nilai pada kolom pertama,
manipulator left digunakan; sebelum
menampilkan sebuah nilai pada kolom kedua, manipulator right digunakan. Ruang kosong di antara kolom pertama dan kolom
kedua diisi dengan titik; program menggunakan manipulator setfill untuk melakukan tujuan ini. Pada baris-baris yang
menampilkan keuntungan kotor, jumlah donasi, dan penjualan bersih, ruang di
antara Rp. dan angka diisi dengan spasi.
Oleh karena itu, sebelum menampilkan rupiah, program menggunakan manipulator setfill untuk menetapkan karakter
pengisi menjadi spasi. Statemen-statemen berikut menghasilkan keluaran yang
diinginkan.
cout <<
"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
<<
"-*-*-*-*-*-*-*-*-*-*-*-*-*" << endl;
cout <<
setfill('.') << left << setw(35) << "Nama Film: "
<< right << " "
<< namaFilm << endl;
cout << left
<< setw(35) << "Jumlah
Tiket Terjual: "
<< setfill(' ') << right
<< setw(10)
<< JlhTiketDewasaTerjual + JlhTiketDewasaTerjual
<< endl;
cout <<
setfill('.') << left << setw(35) << "Keuntungan Kotor: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << keuntunganKotor
<< endl;
cout <<
setfill('.') << left << setw(35)
<< "Persen Keuntungan Kotor Didonasikan: "
<< setfill(' ') << right
<< setw(9) << persenDonasi
<< '%' << endl;
cout <<
setfill('.') << left << setw(35) << "Jumlah Didonasikan: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << jumlahDonasi
<< endl;
cout <<
setfill('.') << left << setw(35) << "Penjualan Bersih: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << penjualanBersih
<< endl;
Algoritma Utama
Pada beberapa bagian
terdahulu, telah dianalisa masalah dan ditentukan formula untuk melakukan
beberapa perhitungan. Anda juga telah menentukan beberapa variabel dan beberapa
konstanta bernama yang perlu. Sekarang, algoritma sebelumnya akan diekspansi
untuk menyelesaikan permasalahan yang diberikan di awal contoh pemrograman ini.
1. Mendeklarasikan
variabel-variabel.
2. Menetapkan
keluaran dari angka-angka titik-mengambang dalam dua dijit di belakang titik
desimal dengan format desimal tetap dengan sebuah titik desimal dan nol-nol
pengekor. Mencantumkan file header iomanip.
3. Meminta
pengguna untuk memasukkan nama film.
4. Membaca
nama film. Karena nama film akan memuat lebih dari satu kata (dan, oleh karena
itu, memuat beberapa spasi), program menggunakan fungsi getline untuk membaca nama film.
5. Meminta
pengguna untuk memasukkan harga tiket dewasa.
6. Membaca
harga tiket dewasa.
7. Meminta
pengguna untuk memasukkan harga tiket anak.
8. Membaca
harga tiket anak.
9. Meminta
pengguna untuk memasukkan jumlah tiket dewasa yang terjual.
10. Membaca
jumlah tiket dewasa yang terjual.
11. Meminta
pengguna untuk memasukkan jumlah tiket anak yang terjual.
12. Membaca
jumlah tiket anak yang terjual.
13. Meminta
pengguna untuk memasukkan persentase keuntungan kotor yang didonasikan.
14. Membaca
persentase keuntungan kotor yang didonasikan.
15. Menghitung
keuntungan kotor.
16. Menghitung
jumlah donasi.
17. Menghitung
jumlah penjualan bersih.
18. Menampilkan
hasil.
Kode Program Utuh
//************************************************************
// Program:
Penjualan Tiket Film
// Program ini
menentukan uang yang akan didonasikan kepada
// sebuah
yayasan. Ia meminta pengguna untuk memasukkan nama
// film, harga
tiket dewasa, harga tiket anak, jumlah tiket
// dewasa
terjual, jumlah tiket anak terjual, dan persentase
// keuntungan
kotor yang akan didonasikan kepada yayasan.
//************************************************************
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
//Langkah 1
string
namaFilm;
double
hargaTiketDewasa;
double
hargaTiketAnak;
int
JlhTiketDewasaTerjual;
int
JlhTiketAnakTerjual;
double
persenDonasi;
double
keuntunganKotor;
double
jumlahDonasi;
double
penjualanBersih;
cout << fixed << showpoint
<< setprecision(2); //Langkah
2
cout << "Masukkan nama film: "; //Langkah
3
getline(cin, namaFilm); //Langkah 4
cout << endl;
cout << "Masukkan harga tiket dewasa: "; //Langkah 5
cin >> hargaTiketDewasa; //Langkah 6
cout << endl;
cout << "Masukkan harga tiket
anak: "; //Langkah
7
cin >> hargaTiketAnak; //Langkah 8
cout << endl;
cout << "Masukkan jumlah tiket
dewasa "
<< "terjual: ";
//Langkah 9
cin >> JlhTiketDewasaTerjual;
//Langkah 10
cout << endl;
cout << "Masukkan jumlah tiket
anak "
<< "terjual: ";
//Langkah 11
cin >> JlhTiketAnakTerjual; //Langkah
12
cout << endl;
cout << "Masukkan persentase
donasi: "; //Langkah 13
cin >> persenDonasi; //Langkah 14
cout << endl << endl;
//Langkah 15
keuntunganKotor = hargaTiketDewasa *
JlhTiketDewasaTerjual +
hargaTiketAnak * JlhTiketAnakTerjual;
//Langkah 16
jumlahDonasi = keuntunganKotor *
persenDonasi / 100;
penjualanBersih = keuntunganKotor -
jumlahDonasi; //Langkah 17
//Langkah 18: Output results
cout <<
"-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*"
<<
"-*-*-*-*-*-*-*-*-*-*-*-*-*" << endl;
cout << setfill('.') << left
<< setw(35) << "Nama Film: "
<< right << " "
<< namaFilm << endl;
cout << left << setw(35)
<< "Jumlah Tiket Terjual: "
<< setfill(' ') << right <<
setw(10)
<< JlhTiketDewasaTerjual +
JlhTiketDewasaTerjual
<< endl;
cout << setfill('.') << left
<< setw(35) << "Keuntungan Kotor: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << keuntunganKotor
<< endl;
cout << setfill('.') << left
<< setw(35)
<< "Persen Keuntungan Kotor
Didonasikan: "
<< setfill(' ') << right
<< setw(9) << persenDonasi
<< '%' << endl;
cout << setfill('.') << left
<< setw(35) << "Jumlah Didonasikan: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << jumlahDonasi
<< endl;
cout << setfill('.') << left
<< setw(35) << "Penjualan Bersih: "
<< setfill(' ') << right
<< " Rp. "
<< setw(8) << penjualanBersih
<< endl;
return 0;
}
Keluaran Program:
Masukkan nama film: Air Force One
Masukkan harga tiket dewasa: 4.50
Masukkan harga tiket anak: 3.00
Masukkan jumlah tiket dewasa terjual: 800
Masukkan jumlah tiket anak terjual: 1850
Masukkan persentase donasi: 10
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Nama Film: ........................ Air Force One
Jumlah Tiket Terjual: ............. 1600
Keuntungan Kotor: ................. Rp. 9150.00
Persen Keuntungan Kotor Didonasikan: 10.00%
Jumlah Didonasikan: ............... Rp. 915.00
Penjualan Bersih: ................. Rp. 8235.00
No comments:
Post a Comment