Tuesday, December 20, 2016

Bab 2. C++ Untuk Pemula



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