Tuesday, December 20, 2016

Bab 3. C++ Untuk Pemula



Struktur Kendali







Pengantar

Bab 1 telah mendefinisikan sebuah program sebagai runtun statemen yang bertujuan untuk menuntaskan pekerjaan tertentu. Program-program yang telah disajikan sejauh ini adalah yang sederhana. Untuk memproses sebuah program, kompiler mulai denga statemen pertama yang tereksekusikan dan mengeksekusi statemen-statemen secara berurutan sampai ia menjumpai akhir program. Pada bab ini dan Bab 4, Anda akan belajar bagaimana memberitahu komputer bahwa ia tidak harus mengikuti urutan sekuensial statemen-statemen yang sederhana; komputer dapat pula membuat keputusan dan mengulangi beberapa statemen sampai kondisi tertentu terpenuhi.


Struktur Kendali

Komputer dapat memproses sebuah program dalam salah satu dari beberapa cara berikut: secara berurutan; secara selektif (dengan membuat keputusan); secara repetitif (dengan mengeksekusi statemen berulang-ulang, menggunakan sebuah struktur loop); dengan memanggil sebuah fungsi. Gambar 3.1 mengilustrasikan tiga jenis pertama dari aliran program. (Pada Bab 6, akan ditunjukkan bagaiman pemanggilan fungsi bekerja).



Gambar 3.1 Aliran eksekusi

Beberapa contoh pemrograman pada Bab 1 dan Bab 2 telah menyajikan program-program sekuensial sederhana. Dengan program semacam itu, komputer mulai dari awal dan mengeksekusi setiap statemen secara berurutan. Tidak ada pilihan yang disediakan; tidak ada repetisi. Struktur kendali menyediakan alternatif-alternatif pada eksekusi program dan dapat dipakai untuk mengubah aliran eksekusi. Dua struktur kendali yang paling umum dipakai adakah struktur seleksi dan struktur repetisi. Dalam seleksi, program mengeksekusi statemen-statemen tertentu tergantung dari kondisi spesifik. Dalam repetisi, program mengulang statemen-statemen tertentu dengan jumlah perulangan spesifik berdasarkan pada kondisi yang diinginkan.

Sebelum Anda belajar tentang seleksi dan repetisi, Anda harus memahami apa itu statamen kondisional dan bagaimana menggunakannya. Perhatikan tiga statemen berikut:
1.        if (skor lebih besar dari atau sama dengan 90)
    nilai adalah A

2.        if (jamKerja kurang dari atau sama dengan 40)
    gaji = gajiPerJam * jamKerja
else
    gaji = (gajiPerJam * 40) + 1.5 * (gajiPerJam * (jamKerja – 40))

3.        if (suhu lebih dari 70 derajat dan tidak hujan)
    mainGolf
Ketiga statemen di atas merupakan contoh statemen kondisional. Anda dapat melihat statemen tertentu akan dieksekusi hanya jika kondisi terpenuhi. Kondisi menjadi terpenuhi jika ia dievaluasi menjadi true. Sebagai contoh, pada statemen 1:

skor lebih besar dari atau sama dengan 90

bernilai true jika nilai dari skor lebih dari atau sama dengan 90; bernilai false jika sebaliknya. Sebagai contoh, jika nilai skor adalah 95, maka statemen tersebut akan dievaluasi menjadi true. Sama halnya, nilai dari skor 86, statemen tersebut dievaluasi menjadi false.

Di samping itu, pada beberapa situasi tertentu, hasil evaluasi true atau false atas sebuah statemen dapat bergantung pada lebih dari satu statemen. Sebagai contoh, pada statemen 3, suhu lebih dari 70 derajat dan tidak hujan bernilai true agar dapat pergi bermain golf.

Seperti yang Anda perhatikan, agar komputer dapat membuat keputusan dan mengulangi statemen, ia harus dapat bereaksi terhadap kondisi-kondisi yang ada ketika program dieksekusi. Beberapa bagian ke depan akan mendiskusikan bagaimana merepresentasikan dan mengevaluasi statemen kondisional dalam C++.


Operator-Operator Relasional

Untuk membuat keputusan, Anda harus dapat mengekspresikan kondisi dan membuat perbandingan. Sebagai contoh, suku bunga dan biaya layanan pada akun bank dapat bergantung pada saldo tabungan di akhir bulan. Jika saldo kurang dari saldo minimum, maka bukan hanya suku bunga tabungan menjadi lebih rendah, tetapi juga akan dikenakan biaya layanan. Oleh karena itu, untuk menentukan suku bunga, Anda harus dapat menyatakan saldo minimum dan membandingkan saldo akun dengan saldo minimum (kondisi).

Dalam C++, sebuah kondisi direpresentasikan oleh ekspresi logikal (Boolean). Ekspresi yang memiliki sebuah nilai bernilai true atau false dinamakan dengan ekspresi logikal (Boolean). Selain itu, true dan false dikatakan sebagai nilai logikal (Boolean). Dimisalkan bahwa i dan j keduanya integer. Perhatikan ekspresi:

i > j

Jika ekspresi ini merupakan sebuah ekspresi logikal, maka ia akan memiliki nilai true jika nilai i lebih besar daripada nilai j; sebaliknya, ia akan memiliki nilai false. Simbol > dinamakan dengan operator relasional. Operator relasional memampukan Anda untuk membuat perbandingan di dalam sebuah program.

C++ memuat enam operator relasional, yang memampukan Anda untuk menyatakan kondisi dan membuat perbandingan. Tabel 3.1 mencantumkan semua operator relasional ini.

Tabel 3.1 Operator-operator relasional dalam C++
Operator
Penjelasan
==
sama dengan
!=
tidak sama dengan
< 
kurang dari
<=
kurang dari atau sama dengan
> 
lebih dari
>=
lebih dari atau sama dengan

Setiap operator relasional merupakan operator biner; yaitu, ia memerlukan dua operand. Karena hasil dari sebuah perbandingan adalah true atau false, ekspresi yang menggunakan operator relasional akan dievaluasi menjadi true atau false.

Operator Relasional dan Tipe Data Sederhana
Anda dapat menggunakan operator relasional dengan ketiga tipe data sederhana. Pada contoh berikut, ekspresi-ekspresi menggunakan integer dan angka riil:

Contoh 3.1


Ekspresi
Arti
Nilai
8 < 15
8 kurang dari 15
true
6 != 6
6 tidak sama dengan 6
false
2.5 > 5.8
2.5 lebih dari 5.8
false
5.9 <= 7.5
5.9 kurang dari atau sama dengan 7.5
true

Membandingkan Karakter
Untuk nilai char, ekspresi yang menggunakan operator relasional dievaluasi menjadi true atau false bergantung pada himpunan karakter yang dipakai pada sistem Anda. Berikut adalah himpunan karakter ASCII:


Sekarang, karena 32 < 97, dan ASCII dari ‘ ‘ adalah 32 dan ASCII dari ‘a’ adalah 97, maka dapat dipahami bahwa ‘ ‘ < ‘a’ adalah true. Sama halnya, menggunakan nilai – nilai ASCII:

'R' > 'T' adalah false
'+' < '*' adalah false
'A' <= 'a' adalah true

Perhatikan bahwa nilai perbandingan atas tipe-tipe data yang berbeda dapat memberikan hasil yang tidak diharapkan. Sebagai contoh, ekspresi berikut membandingkan sebuah integer dengan sebuah karakter:

8 < '5'

Pada ekspresi ini, pada mesin tertentu, 8 dibandingkan dengan ‘5’, yang bernilai 53. Jadi, 8 dibandingkan dengan 53, yang memberikan hasil evaluasi true.

Ekspresi seperti 4 < 6 dan ‘R’ > ‘T’ adalah dua contoh ekspresi logikal. Ketika C++ mengevaluasi sebuah ekspresi logikal, ia menghasilkan nilai integer 1 jika ekspresi logikal dievaluasi menjadi true; ia menghasilkan nilai integer 0 jika sebaliknya. Dalam C++, sembarang nilai tak-nol diperlakukan sebagai true.

Operator Relasional dan Tipe string
Operator relasional dapat diterapkan terhadap variabel bertipe string. Variabel bertipe string dapat dibandingkan karakter demi karakter, dimulai dari karakter pertama dan menggunakan himpunan karakter ASCII. Perbandingan karakter-demi-karakter berlanjut sampai ketidakcocokan ditemukan atau sampai karakter terakhir telah dibandingkan. Beberapa contoh berikut menunjukkan bagaimana variabel bertipe string dibandingkan.

Contoh 3.2


Dimisalkan bahwa Anda memiliki beberapa statemen berikut:

string str1 = "Hallo";
string str2 = "Hi";
string str3 = "Air";
string str4 = "Bill";
string str5 = "Big";

Ekspresi-ekspresi berikut menunjukkan bagaimana ekspresi relasional string dievaluasi.

Ekspresi
Nilai/Penjelasan
str1 < str2
true
str1 = "Hallo" and str2 = "Hi". Karakter pertama dari str1 dan str2 sama, tetapi karakter kedua ‘a’ dari str1 bernilai kurang dari karakter kedua ‘i’ dari str2. Oleh karena itu, str1 < str2 bernilai true.

str1 > "Han"
false
str1 = "Hallo".  Dua karakter pertama dari str1 dan str2 sama, tetapi karakter ketiga ‘l’ dari str1 bernilai kurang dari karakter ketiga ‘n’ dari “Han”. Oleh karena itu, str1 > “Han” bernilai false.

str3 < "An"
true
str3 = "Air".  Karakter pertama dari str3 dan “An” sama, tetapi karakter kedua ‘i’ dari “Air” bernilai kurang dari karakter kedua ‘n’ dari “An”. Oleh karena itu, str3 < “An” bernilai true.

str1 == "hallo"
false
str1 = "Hallo".  Karakter pertama ‘H’ dari str1 bernilai kurang dari karakter pertama ‘h’ dari “hallo” karena nilai ASCII dari ‘H’ adalah 72, dan nilai ASCII dari ‘h’ adalah 104. Oleh karena itu, str1 == “hallo” bernilai false.

str3 <= str4
true
str3 = "Air" and str4 = "Bill".  Karakter pertama ‘A’ dari str3 bernilai kurang dari karakter pertama ‘B’ dari str4. Jadi, str3 <= str4 bernilai true.

str2 > str4
true
str2 = "Hi" and str4 = "Bill".  Karakter pertama ‘H’ dari str2 bernilai lebih dari karakter pertama ‘B’ dari str4. Jadi, str2 > str4 bernilai true.


Jika dua string berbeda panjang dibandingkan dan perbandingan karakter-demi-karakter bernilai sama sampai dicapai karakter terakhir dari string yang lebih pendek, maka string yang lebih pendek akan dievaluasi sebagai bernilai kurang dari string yang lebih panjang, seperti ditunjukkan berikut.

Ekspresi
Nilai/Penjelasan
str4 >= "Billy"
false
str4 = "Bill".  Ia memiliki empat karakter, dan “Billy” memiliki lima karakter. Oleh karena itu, str4 merupakan string yang lebih pendek. Keempat karakter dari str4 sama dengan empat karakter pertama dari “Billy”, dan “Billy” adalah string yang lebih panjang. Jadi, str4 >= “Billy” bernilai false.

str5 <= "Bigger"
true
str5 = "Big".

Ia memiliki tiga karakter, dan “Bigger” memuat enam karakter. Jadi, str5 merupakan string yang lebih pendek. Ketiga karakter dari str5 sama dengan tiga karakter pertama dari “Bigger”, dan “Bigger merupakan string yang lebih panjang. Jadi, str5 <= “Bigger” bernilai true.



Operator Logikal dan Ekspresi Logikal

Bagian ini akan menjelaskan bagaimana membentuk dan mengevaluasi ekspresi logikal yang merupakan kombinasi dari beberapa ekspresi logikal lain. Operator logikal (Boolean) memampukan Anda untuk mengkombinasikan beberapa ekspresi logikal. C++ memiliki tiga operator logikal, seperti ditampilkan pada Tabel 3.2.

Tabel 3.2 Operator-operator logikal dalam C++
Operator
Penjelasan
!
not
&&
and
||
or

Operator logikal hanya memuat nilai-nilai logikal sebagai operand dan hanya menghasilkan nilai-nilai logikal sebagai hasilnya. Operator ! adalah operator unary, jadi ia hanya memiliki satu operand. Operator && dan || merupakan operator biner. Tabel 3.3, 3.4, dan 3.5 mendefinisikan tiap operator logikal ini.

Tabel 3.3 mendefinisikan operator ! (not). Ketika Anda menggunakan operator !, ! true sama dengan false dan ! false sama dengan true. Penempatakn ! di depan sebuah ekspresi logikal akan membalik nilai dari ekspresi logikal tersebut.

Tabel 3.3 Operator ! (not)
Operator
! (Ekspresi)
true (tak-nol)
false (0)
false (0)
true (1)

Contoh 3.3


Ekspresi
Nilai
Penjelasan
!('A' > 'B')
true
Karena ‘A’ > ‘B’ adalah false, !(‘A’ > ‘B’) adalah true.
!(6 <= 7)
false
Karena 6 <= 7 adalah true, !(6 <= 7) adalah false.

Tabel 3.4 mendefinisikan operator && (and). Dari tabel ini, dapat dipahami bahwa Ekspresi1 && Ekspresi2 adalah true jika dan hanya jika kedua Ekspresi1 dan Ekspresi2 adalah true; sebaliknya Ekspresi1 && Ekspresi2 dievaluasi menjadi false.

Tabel 3.4 Operator && (and)

Ekspresi1
Ekspresi2
Ekspresi1 && Ekspresi2
true (tak-nol)
true (tak-nol)
true (1)
true (tak-nol)
false (0)
false (0)
false (0)
true (tak-nol)
false (0)
false (0)
false (0)
false (0)

Contoh 3.4


Ekspresi
Nilai
Penjelasan
(14 >= 5) && ('A' < 'B')
true
Karena (14 >= 5) adalah true, (‘A’ < ‘B’) adalah true, dan true && true adalah true, ekspresi ini dievaluasi menjadi true.

(24 >= 35) && ('A' < 'B')
false
Karena (24 >= 35) adalah false, (‘A’ < ‘B’) dalah true, dan false && true adalah false, ekspresi ini dievaluasi menjadi false.


Tabel 3.5 mendefinisikan operator || (or). Dari tabel ini, dapat dipahami bahwa Ekspresi1 || Ekspresi2 bernilai true jika dan hanya jika sedikitnya salah satu ekspresi, Ekspresi1 atau Ekspresi2 bernilai true; sebaliknya, Ekspresi1 || Ekspresi2 dievaluasi menjadi false.

Tabel 3.5 Operator || (and)

Ekspresi1
Ekspresi2
Ekspresi1 || Ekspresi2
true (tak-nol)
true (tak-nol)
true (1)
true (tak-nol)
false (0)
true (1)
false (0)
true (tak-nol)
true (1)
false (0)
false (0)
false (0)

Contoh 3.5


Ekspresi
Nilai
Penjelasan
(14 >= 5) || ('A' > 'B')
true
Karena (14 >= 5) adalah true, (‘A’ > ‘B’) adalah false, dan true || false adalah true, ekspresi ini dievaluasi menjadi true.

(24 >= 35) || ('A' > 'B')
false
Karena (24 >= 35) adalah false, (‘A’ > ‘B’) adalah false, dan false || false adalah false, ekspresi ini dievaluasi menjadi false.

('A' <= 'a') || (7 != 7)
true
Karena (‘A’ <= ‘a’) adalah true, (7 != 7) adalah false, dan true || false adalah true, ekspresi ini dievaluasi menjadi true.


Urutan Keutamaan
Ekspresi logikal kompleks bisa sulit untuk dievaluasi. Perhatikan ekspresi logikal berikut:

11 > 5 || 6 < 15 && 7 >= 8

Ekspresi logikal ini menghasilkan hasil yang berbeda-beda, tergantung dari apakah || atau && yang dievaluasi lebih dahulu. Jika || dievaluasi lebih dahulu, ekspresi tersebut dievaluasi menjadi false. Jika && dievaluasi lebih dahulu, ekspresi tersebut dievaluasi menjadi true.

Sebuah ekspresi dapat memuat operator aritmatik, relasional, dan logikal, seperti pada ekspresi:

5 + 3 <= 9 && 2 > 3

Untuk bekerja dengan ekspresi logikal kompleks, harus ada skema prioritas dalam mengevaluasi operator-operator yang ada. Tabel 3.6 menunjukkan urutan keutamaan dari beberapa operator C++, termasuk operator aritmatik, relasional, dan logikal.

Tabel 3.6 Keutamaan opertor-operator dalam C++
Operator
Keutamaan
!, +, - (operator unary)
pertama
*, /, %
kedua
+, -
ketiga
<, <=, >=, >
keempat
==, !=
kelima
&&
keenam
||
ketujuh
= (operator penugasan)
terakhir

Menggunakan aturan keutamaan dalam sebuah ekspresi, operator relasional dan logikal dievaluasi dari kiri ke kanan. Karena operator relasional dan logikal dievaluasi dari kiri ke kanan, asosiatifitas dari tiap operator ini dikatakan dari kiri ke kanan.

Contoh 3.6 mengilustrasikan bagaimana ekspresi-ekspresi logikal yang memuat beberapa variabel dievaluasi.

Contoh 3.6


Dimisalkan bahwa Anda memiliki beberapa deklarasi berikut:

bool ditemukan = true;
int usia = 20;
double jam = 45.30;
double jamLembur = 15.00;
int kounter = 20;
char ch = 'B';

Perhatikan ekspresi-ekspresi berikut:

Ekspresi
Nilai/Penjelasan
!ditemukan
false
Karena ditemukan adalah true, ! ditemukan adalah false.

jam > 40.00
true
Karena jam adalah 45.30 dan 45.30 > 40.00 adalah true, ekspresi jam > 40.00 dievaluasi menjadi true.

!usia
false
usia adalah 20, yang merupakan nilai tak-nol, jadi usia adalah true. Oleh karena itu, !usia adalah false.

!ditemukan && (usia >= 18)
false
!ditemukan adalah false; usia > 18 adalah 20 > 18 bernilai true. Jadi, !ditemukan && (usia >= 18) adalah false && true, yang dievaluasi menjadi false.

!(ditemukan && (usia >= 18))
false
Sekarang, ditemukan && (usia >= 18) adalah true && true, yang dievaluasi menjadi true. Oleh karena itu, !(ditemukan && (usia >= 18)) adalah !true, yang dievaluasi menjadi false.

jam + jamLembur <= 75.00
true
Karena jam + jamLebur adalah 45.30 + 15.00 = 60.30  dan 60.30 <= 75.00 bernilai true, berarti bahwa jam + jamLembur <= 75.00 dievaluasi menjadi true.

(kounter >= 0) &&
            (kounter <= 100)
true
Sekarang, kounter adalah 20. Karena 20 >= 0 adalah true, kounter >= 0 bernilai true. Selain itu, 20 <= 100 adalah true, jadi kounter <= 100 bernilai true. Oleh karena itu, (kounter >= 0) && (kounter <= 100)  adalah true && true, yang dievaluasi menjadi true.

('A' <= ch && ch <= 'Z')
true
Di sini, ch adalah ‘B’. Karena ‘A’ <= ‘B’ adalah true, ‘A’ <= ch dievaluasi menjadi true. Selain itu, karena ‘B’ <= ‘Z’ adalah true, ch <= ‘Z’ dievaluasi menjadi true. Oleh karena itu, (‘A’ <= ch && ch <= ‘Z’ dievaluasi menjadi true).


Program berikut mengevaluasi dan menampilkan nilai dari tiap ekspresi logikal. Perhatikan bahwa jika sebuah ekspresi logikal dievaluasi menjadi true, keluarannya ditampilkan sebagai 1; jika ekspresi logikal dievaluasi menjadi false, keluarannya ditampilkan sebagai 0, seperti ditunjukkan pada keluaran program.

//Bab 3 Operator logikal

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    bool ditemukan = true;
    int usia = 20;
    double jam = 45.30;
    double jamLembur = 15.00;
    int kounter = 20;
    char ch = 'B';

    cout << fixed << showpoint << setprecision(2);
    cout << "ditemukan = " << ditemukan << ", usia = " << usia
         << ", jam = " << jam << ", jamLembur = " << jamLembur
         << "," << endl << "kounter = " << kounter
         << ", ch = " << ch << endl << endl;

    cout << "!ditemukan dievaluasi menjadi " << !ditemukan << endl;
    cout << "jam > 40.00 dievaluasi menjadi " << (jam > 40.00) << endl;
    cout << "!usia dievaluasi menjadi " << !usia << endl;
    cout << "!ditemukan && (jam >= 0) dievaluasi menjadi "
         << (!ditemukan && (jam >= 0)) << endl;

    cout << "!(ditemukan && (jam >= 0)) dievaluasi menjadi "
         << (!(ditemukan && (jam >= 0))) << endl;

    cout << "jam + jamLembur <= 75.00 dievaluasi menjadi "
         << (jam + jamLembur <= 75.00) << endl;

    cout << "(kounter >= 0) && (kounter <= 100) dievaluasi menjadi "
         << ((kounter >= 0) && (kounter <= 100)) << endl;

    cout << "('A' <= ch && ch <= 'Z') dievaluasi menjadi "
         << ('A' <= ch && ch <= 'Z') << endl;

    return 0;
}

Keluaran Program:

ditemukan = 1, usia = 20, jam = 45.30, jamLembur = 15.00,
kounter = 20, ch = B

!ditemukan dievaluasi menjadi 0
jam > 40.00 dievaluasi menjadi 1
!usia dievaluasi menjadi 0
!ditemukan && (jam >= 0) dievaluasi menjadi 0
!(ditemukan && (jam >= 0)) dievaluasi menjadi 0
jam + jamLembur <= 75.00 dievaluasi menjadi 1
(kounter >= 0) && (kounter <= 100) dievaluasi menjadi 1
('A' <= ch && ch <= 'Z') dievaluasi menjadi 1

Anda dapat menyisipkan kurung ke dalam sebuah ekspresi untuk mempertegas maknanya. Anda juga dapat menggunakan kurung untuk mendefinisikan-ulang keutamaan operator. Dengan menggunakan urutan keutamaan standar, ekspresi:

11 > 5 || 6 < 15 && 7 >= 8

ekivalen dengan:

11 > 5 || (6 < 15 && 7 >= 8)

Dalam ekspresi ini, 11 > 5 adalah true, 6 < 15 adalah true, dan 7 >= 8 adalah false. Dengan mengganti nilai-nilai ini di dalam ekspresi 11 > 5 || (6 < 15 && 7 >= 8) untuk mendapatkan true || (true && false) = true || false = true. Oleh karena itu, ekspresi 11 > 5 || (6 < 15 && 7 >= 8)  dievaluasi menjadi true.

Dalam C++, ekspresi logikal (Boolean) dapat dimanipulasi atau diproses dalam salah satu dari dua cara: menggunakan variabel int atau menggunakan variabel bool. Beberapa bagian ke depan akan menjelaskan kedua metode ini.

Tipe Data int dan Ekspresi Logikal (Boolean)
Versi C++ awal tidak menyediakan tipe data built-in yang memiliki nilai logikal (Boolean) true dan false. Karena ekspresi logikal dievaluasi menjadi 1 atau 0, nilai dari sebuah ekspresi logikal disimpan di dalam sebuah variabel bertipe data int. Oleh karena itu, Anda dapat menggunakan tipe data int untuk memanipulasi ekspresi logikal (Boolean).


Ingat bahwa nilai tak-nol diperlakukan sebagai true. Sekarang, perhatikan beberapa deklarasi berikut:

int usiaSah;
int usia;

dan statemen penugasan:

usiaSah = 21;

Jika Anda memandang bahwa usiaSah adalah sebuah variabel logikal, nilai dari usiaSah yang ditugaskan oleh statemen ini adalah true.

Statemen penugasan:

usiaSah = (usia >= 21);

menugaskan nilai 1 kepada usiaSah jika nilai usia lebih dari atau sama dengan 21. Statemen tersebut menugaskan nilai 0 jika nilai usia kurang dari 21.

Tipe Data bool dan Ekspresi Logikal (Boolean)
Versi C++ terbaru memuat tipe data built-in, bool, yang memiliki nilai logikal (Boolean) true dan false. Oleh karena itu, Anda dapat memanipulasi ekspresi logikal menggunakan tipe data bool. Ingat bahwa dalam C++, bool, true, dan false adalaha katakunci. Selain itu, pengenal true memiliki nilai 1, dan pengenal false memiliki nilai 0. Sekarang, perhatikan deklarasi berikut:

bool usiaSah;
int usia;

Statemen:

usiaSah = true;

menetapkan nilai dari variabel usiaSah menjadi true. Statemen:

usiaSah = (usia >= 21);

menugaskan nilai true kepada usiaSah jika nilai usia lebih dari atau sama dengan 21. Statemen ini menugaskan nilai false kepada usiaSah jika nilai usia kurang dari 21. Sebagai contoh, jika nilai usia adalah 25, maka nilai yang ditugaskan kepada usiaSah adalah true, yaitu 1. Sama halnya, jika nilai usia adalah 16, maka nilai yang ditugaskan kepada usiaSah adalah false, yaitu 0.


Seleksi: if dan if...else

Meskipun hanya terdapat dua nilai logikal, true dan false, keduanya sangat berguna karena memampukan program untuk membuat keputusan yang bisa mengubah aliran pemrosesan. Sisa bab ini akan mendiskusikan beberapa cara dalam memampukan sebuah program dalam pembuatan keputusan. Dalam C++, ada dua seleksi, atau struktur kendali bercabang: statemen if dan statemen switch. Bagian ini akan mendiskusikan bagaimana statemen if dan if...else dapat dipakai untuk menciptakan seleksi satu-cara, seleksi dua-cara, dan seleksi jamak. Struktur switch akan didiskusikan nanti pada bab ini.

Seleksi Satu-Cara
Sebuah bank akan mengirimkan pemberitahuan kepada seorang pelanggan jika saldo akunnya bernilai di bawah saldo minimum yang disyaratkan. Jadi, jika saldo akun di bawah saldo minimum yang disyaratkan, maka ia harus mengirimkan pemberitahuan kepada pelanggan; jika saldo akun di atas saldo minimum, maka bank tidak melakukannya. Contoh ini melibatan seleksi satu-cara. Dalam C++, seleksi satu-cara dibangun menggunakan statemen if. Sintaks atas seleksi satu-cara adalah:

if (ekspresi)
    statemen

Perhatikan elemen-elemen pada sintaks ini. Ia dimulai dengan katakunci if, diikuti dengan sebuah ekspresi yang diapit oleh kurung, diikuti dengan sebuah statemen. Perhatikan bahwa sepasang kurung yang mengapit ekspresi merupakan bagian dari sintaks. Elemen ekspresi kadangkala disebut dengan pembuat keputusan karena ia memutuskan apakah mengeksekusi statemen atau tidak. Elemen ekspresi biasanya merupakan sebuah ekspresi logikal. Jika nilai dari ekspresi adalah true, maka statemen akan dieksekusi. Jika nilai dari ekspresi adalah false, maka statemen tidak akan dieksekusi dan komputer berlanjut untuk mengeksekusi statemen berikutnya di dalam program. Elemen statemen pada sintaks kadangkala dinamakan dengan statemen aksi. Gambar 3.2 menunjukkan aliran eksekusi dari statemen if (seleksi satu-cara).



Gambar 3.2 Seleksi satu-cara


Contoh 3.7


if (skor >= 60)
    nilai = 'P';

Pada kode ini, jika ekspresi (skor >= 60) dievelasi menjadi true, maka statemen penugasan, nilai = ‘P’;, akan dieksekusi. Jika ekspresi tersebut dievaluasi menjadi false, statemen penugasan itu tidak akan dieksekusi. Sebagai contoh, jika nilai skor adalah 65, maka nilai yang akan ditugaskan kepada variabel nilai adalah ‘P’.

Contoh 3.8


Program C++ berikut mencari nilai absolut dari sebuah integer:

//Program: Nilai absolut atas sebuah integer

#include <iostream>

using namespace std;

int main()
{
    int angka, temp;

    cout << "Baris 1: Masukkan sebuah integer: ";             //Baris 1
    cin >> angka;                                     //Baris 2
    cout << endl;                                      //Baris 3

    temp = angka;                                      //Baris 4

    if (angka < 0)                                     //Baris 5
        angka = -angka;                                //Baris 6
   
       cout << "Baris 7: Nilai absolut atas "
             << temp << " adalah " << angka << endl;   //Baris 7
   
       return 0;
}

Keluaran Program:

Baris 1: Masukkan sebuah integer: -6734

Baris 7: Nilai absolut atas -6734 adalah 6734

Statemen pada baris 1 meminta pengguna untuk memasukkan sebuah integer; statemen pada baris 2 membaca angka ke dalam variabel angka. Statemen pada baris 4 menyalin nilai dari angka ke dalam temp, dan statemen pada baris 5 memeriksa apakah angka adalah negatif. Jika angka adalah negatif, maka statemen pada baris 6 akan mengubah angka menjadi bernilai positif. Statemen pada baris 7 menampilkan angka dan nilai absolutnya. Perhatikan bahwa karena Anda ingin menampilkan kedua angka dan nilai absolutnya, dan jika angka adalah negatif, statemen if akan mengubahnya menjadi positif, maka Anda perlu menyalin angka ke dalam temp pada baris 4.

Contoh 3.9


Perhatikan statemen berikut:

if skor >= 60 //error sintaks
    nilai = 'P';

Statemen ini mengilustrasikan sebuah versi salah dari sebuah statemen if. Sepasang kurung yang mengapit ekspresi logikal diabaikan, yang membangkitkan error sintaks.
Penempatan semikolon (titik-koma) setelah kurung yang mengapit ekspresi di dalam sebuah statemen if merupakan error semantik. Jika semikolon ditempatkan setelah kurung penutup, maka statemen if akan beroperasi pada statemen kosong.

Contoh 3.10


Perhatikan dua statemen C++ berikut:

if (skor >= 60);     //Baris 1
    nilai = 'P';     //Baris 2

Karena terdapat sebuah semikolon di akhir ekspresi (lihat baris 1), statemen if pada baris 1 berhenti. Aksi dari statemen if ini adalah null, dan statemen pada baris 2 bukanlah bagian dari statemen if pada baris 1. Jadi, statemen pada baris 2 akan selalu dieksekusi tanpa memandang bagaimana statemen if dievaluasi.

Seleksi Dua-Cara
Ada banyak situasi pemrograman dimana di dalamnya Anda harus memilih salah satu dari dua alternatif. Sebagai contoh, jika seorang karyawan paruh-waktu bekerja lembur, maka gaji dihitung menggunakan formula penggajian lembur; sebaliknya, gaji akan dihitung menggunakan formula biasa. Ini merupakan sebuah contoh atas seleksi dua-cara. Untuk memilih salah satu dari dua alternatif, atau dengan kata lain untuk mengimplementasikan seleksi dua-cara, C++ menyediakan statemen if...else. Seleksi dua-cara menggunakan sintaks berikut:

if (ekspresi)
    statement1
else
    statement1




Gambar 3.3 Seleksi dua-cara

Anda perlu memberi perhatian pada sintaks ini. Ia diawali dengan katakunci if, diikuti dengan sebuah ekspresi logikal yang diapit oleh sepasang kurung, diikuti dengan sebuah statemen, diikuti dengan katakunci else, dan diikuti dengan statemen kedua. Statemen 1 dan 2 adalah sembarang statemen C++ yang valid. Dalam seleksi dua-cara, jika nilai dari ekspresi adalah true, maka statemen1 akan dieksekusi. Jika nilai dari ekspresi adalah false, maka statemen2 akan dieksekusi. Gambar 3.3 menunjukkan aliran eksekusi dari staetmen if...else (seleksi dua-cara).

Contoh 3.11


Perhatikan beberapa statemen berikut:

if (jam > 40.0)                          //Baris 1
    gaji = 40.0 * gajiPerJam +
    1.5 * gajiPerJam * (jam - 40.0);     //Baris 2
else                                     //Baris 3
    gaji = jam * gajiPerJam;             //Baris 4

Jika nilai dari variabel jam lebih dari 40.0, maka gaji akan mencakup pembayaran lembur. Dimisalkan bahwa jam adalah 50. Ekspresi di dalam statemen if, pada baris 1, dievaluasi menjadi true, jadi statemen pada baris 2 akan dieksekusi. Di sisi lain, jika jam adalah 30 atau sembarang nilai yang kurang dari atau sama dengan 40, maka ekspresi di dalam statemen if, pada baris 1, akan dievaluasi menjadi false. Pada kasus ini, program akan melompati statemen pada baris 2 dan mengeksekusi statemen pada baris 4, yaitu, statemen yang berada setelah katakunci else.

Dalam sebuah statemen seleksi dua-cara, penempatan semikolon (titik-koma) setelah ekspresi dan sebelum statemen1 akan menyebabkan error sintaks. Jika statemen if diakhiri dengan sebuah semikolon, maka statemen1 tidak lagi menjadi bagian dari statemen if, dan elemen else yang menjadi bagian dari statemen if...else akan berdiri sendiri. Tidak ada statemen else yang berdiri sendiri dalam C++. Jadi, ia tidak dapat dipisahkan dari statemen if.

Contoh 3.12


Contoh ini menunjukkan sebuah error sintaks:

if (jam > 40.0);                         //Baris 1
    gaji = 40.0 * gajiPerJam +
    1.5 * gajiPerJam * (jam - 40.0);     //Baris 2
else                                     //Baris 3
    gaji = jam * gajiPerJam;             //Baris 4

Semikolon di akhir statemen if (lihat baris 1) diakhiri dengan statemen if, jadi statemen pada baris 2 memisahkan klausa else dari statemen if. Oleh karena itu, else berdiri sendiri. Karena tidak ada else yang berdiri sendiri dalam C++, kode ini akan membangkitkan error sintaks. Seperti ditunjukkan pada contoh 3.10, dalam seleksi satu-cara, semikolon di akhir statemen if merupakan error logikal, sedangkan yang ditunjukkan pada contoh ini, dalam seleksi dua-cara, ia adalah error sintaks.

Contoh 3.13


Program berikut menentukan gaji mingguan seorang karyawan. Jika jam kerja melebihi 40, maka gaji akan mencakup pembayaran lembur.

//Program: Gaji mingguan

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    double gaji, gajiPerJam, jam;

    cout << fixed << showpoint << setprecision(2); //Baris 1
    cout << "Baris 2: Masukkan jam kerja dan gaji per jam: "; //Baris 2
    cin >> jam >> gajiPerJam; //Baris 3

    if (jam > 40.0) //Baris 4
        gaji = 40.0 * gajiPerJam +
                1.5 * gajiPerJam * (jam - 40.0); //Baris 5

    else //Baris 6
        gaji = jam * gajiPerJam; //Baris 7

    cout << endl; //Baris 8
    cout << "Baris 9: Gaji sebesar Rp." << gaji
         << endl; //Baris 9

    return 0;
}

Keluaran Program:

Baris 2: Masukkan jam kerja dan gaji per jam: 56.45 12.5

Baris 9: Gaji sebesar Rp.808.44

Statemen pada baris 1 menetapkan keluaran dari angka titik-mengambang dalam format desimal tetap, dengan sebuah titik desimal, nol-nol pengekor, dan dua dijit di belakang titik desimal. Statemen pada baris 2 meminta pengguna untuk memasukkan angka dari jam kerja dan gaji per jam. Statemen pada baris 3 membaca kedua nilai ini ke dalam variabel jam dan gajiPerJam. Statemen pada baris 4 memeriksa nilai dari variabel jam apakah ia lebih dari 40.0. Jika jam lebih dari 40.0, maka gaji akan dihitung oleh statemen pada baris 5, yang mencakup pembayaran lembur. Sebaliknya, gaji akan dihitung oleh statemen pada baris 7. Statemen pada baris 9 menampilkan gaji.

Sekarang, akan didiskusikan contoh lain dari sebuah statemen if dan memeriksa beberapa error semantik yang dapat terjadi.

Contoh 3.14


Perhatikan beberapa statemen berikut:

if (skor >= 60)                   //Baris 1
    cout << "Lulus" << endl;      //Baris 2
    cout << "Gagal" << endl;      //Baris 3

Jika ekspresi (skor >= 60) dievaluasi menjadi false, maka statemen keluaran pada baris 2 tidak akan dieksekusi. Jadi, keluaran akan Gagal. Oleh karena itu, himpunan statemen tersebut melakukan aksi yang sama seperti statemen if...else. Sebagai contoh, jika nilai dari skor adalah 50, maka yang akan ditampilkan adalah:

Gagal

Namun, jika ekspresi (skor >= 60) dievaluasi menjadi true, maka program akan mengeksekusi kedua statemen keluaran, yang memberikan hasil yang tidak memuaskan. Sebagai contoh, jika nilai dari skor adalah 70, maka akan ditampilkan keluaran berikut:

Lulus
Gagal

Statemen if mengendalikan eksekusi hanya atas statemen pada baris 2. Statemen pada baris 3 selalu dieksekusi.

Kode yang tepat dalam menampilkan Gagal atau Lulus, bergantung pada nilai skor adalah:

if (skor >= 60)
    cout << "Lulus" << endl;
else
    cout << "Gagal" << endl;

Blok Statemen
Struktur if dan if...else mengendalikan hanya satu statemen pada suatu waktu. Dimisalkan bahwa Anda ingin mengeksekusi lebih dari satu statemen jika ekspresi di dalam if atau if..else dievaluasi menjadi true. Pada kasus ini, C++ menyediakan sebuah struktur yang dinamakan dengan blok statemen. Blok statemen memiliki bentuk berikut:

{
    statemen_1
    statemen_2
    .
    .
    .
    statemen_n
}

Jadi, blok statemen memuat sederet statemen yang diapit oleh sepasang kurung kurawal, { dan }. Dalam struktur if atau if...else, blok statemen berfungsi mengikat sederet statemen menjadi satu entitas. Oleh karena itu, statemen seleksi dua-cara sederhana ini:

if (usia >= 18)
    cout << "Berhak memilih." << endl;
else
    cout << "Tidak berhak memilih." << endl;

dapat Anda gantikan dengan kode dengan blok statemen berikut:

if (usia >= 18)
{
    cout << "Berhak memilih." << endl;
    cout << "Tidak lagi dipandang anak kecil." << endl;
}
else
{
    cout << "Tidak berhak memilih." << endl;
    cout << "Masih anak kecil." << endl;
}

Blok statemen sangat berguna dan akan sering digunakan pada bab ini.

Seleksi Jamak: If Bersarang
Pada beberapa bagian sebelumnya, Anda telah belajar bagaimana mengimplementasikan seleksi satu-cara dan seleksi dua-cara pada sebuah program. Beberapa masalah kadangkala memerlukan implementasi dari lebih dari dua alternatif. Sebagai contoh, dimisalkan bahwa jika saldo akun lebih dari Rp. 50000, maka suku bunga adalah 7%; jika saldo akun di antara Rp. 25000 dan Rp. 49999, maka suku bunga adalah 5%; jika saldo akun di antara Rp. 1000 dan Rp. 24999, maka suku bunga adalah 3%; selainnya, suku bunga adalah 0%. Masalah ini memiliki empat alternatif, dengan alur seleksi jamak. Anda bisa mencantumkan alur seleksi jamak pada sebuah program menggunakan struktur if...else. Jika satu statemen kendali berada di dalam statemen kendali yang lain, maka statemen kendali tersebut dikatakang bersarang di dalam statemen kendali yang lain.

Contoh 3.15 mengilustrasikan bagaimana memanipulasi seleksi jamak menggunakan struktur if...else bersarang.

Contoh 3.15


Dimisalkan bahwa saldo dan sukuBunga bertipe data double. Beberapa statemen berikut menentukan sukuBunga berdasarkan nilai saldo.

if (saldo > 50000.00)             //Baris 1
    sukuBunga = 0.07;             //Baris 2
else                              //Baris 3
    if (saldo >= 25000.00) //Baris 4
        sukuBunga = 0.05;         //Baris 5
    else                          //Baris 6
        if (saldo >= 1000.00)     //Baris 7
            sukuBunga = 0.03;     //Baris 8
        else //Line 9
            sukuBunga = 0.00;     //Baris 10

Sebuah struktur if...else bersarang menuntun jawaban atas pertanyaan penting: Bagaimana Anda mengetahui else mana yang dipasangkan dengan if mana? Ingat bahwa dalam C++, tidak ada statemen else yang berdiri sendiri. Setiap else harus dipasangkan dengan sebuah if. Aturan untuk memasangkan sebuah else dengan sebuah if adalah sebagai berikut:

Pemasangan sebuah else dengan sebuah if: Di dalam sebuah statemen if bersarang, C++ mengaitkan sebuah else dengan if tak-utuh terdekat.

Dengan menggunakan aturan ini, pada contoh 3.15, else pada baris 3 dipasangkan dengan if pada baris 1. Klausa else pada baris 6 dipasangkan dengan if pada baris 4, dan else pada baris 9 dipasangkan dengan if pada baris 7.

Untuk menghindari indentasi yang berlebihan, kode pada contoh 3.15 dapat ditulis-ulang menjadi berikut:

if (saldo > 50000.00)             //Baris 1
    sukuBunga = 0.07;             //Baris 2
else if (saldo >= 25000.00)       //Baris 3
    sukuBunga = 0.05;             //Baris 4
else if (saldo >= 1000.00) //Baris 5
    sukuBunga = 0.03;             //Baris 6
else                              //Baris 7
    sukuBunga = 0.00;             //Baris 8

Beberapa contoh berikut akan menolong Anda dalam memahami pelbagai cara dalam menggunakan struktur if...else bersarang untuk mengimplementasikan seleksi jamak.

Contoh 3.16


Diasumsikan bahwa skor adalah sebuah variabel bertipe int. Berdasarkan nilai skor, kode berikut menampilkan nilai:

if (skor >= 90)
    cout << "Nilai adalah A." << endl;
else if (skor >= 80)
    cout << "Nilai adalah B." << endl;
else if (skor >= 70)
    cout << "Nilai adalah C." << endl;
else if (skor >= 60)
    cout << "Nilai adalah D." << endl;
else
    cout << "Nilai adalah F." << endl;

Contoh 3.17


Diasumsikan bahwa semua variabel dengan benar dideklarasikan, dan perhatikan beberapa statemen berikut:

if (suhu >= 30)                                        //Baris 1
    if (suhu >= 32)                             //Baris 2
        cout << "Hari untuk renang." << endl;          //Baris 3
    else                                               //Baris 4
        cout << "Hari untuk golf." << endl;            //Baris 5

else                                                   //Baris 6
    cout << "Hari untuk bulu tangkis." << endl;        //Baris 7

Dalam kode C++ ini, klausa else pada baris 4 dipasangkan dengan if pada baris 2, dan else pada baris 6 dipasangkan dengan if pada baris 1. Perhatikan bahwa else pada baris 4 tidak dapat dipasangkan dengan if pada baris 1. Jika Anda memasangkan else pada baris 4 dengan if pada baris 1, maka if pada baris 2 akan menjadi bagian statemen aksi dari if pada baris 1, meninggalkan else pada baris 6 menggantung. Selain itu, statemen pada baris 2 sampai baris 5 membentuk bagian statemen dari if pada baris 1. Indentasi tidak menentukan pemasangan, tetapi harus dipakai untuk mengkomunikasikan pemasangan.

Contoh 3.18


Diasumsikan bahwa semua variabel dengan benar dideklarasikan, dan perhatikan beberapa statemen berikut:

if (suhu >= 30)                                        //Baris 1
    if (suhu >= 32)                             //Baris 2
        cout << "Hari untuk renang." << endl;          //Baris 3
    else                                               //Baris 4
        cout << "Hari untuk golf." << endl;            //Baris 5

Pada kode ini, else pada baris 4 dipasangkan dengan if pada baris 2. Perhatikan bahwa untuk else pada baris 4, if tak-utuh terdekat adalah pada baris 2. Pada kode ini, if pada baris 1 tidak memiliki else dan merupakan seleksi satu-cara. Sekali lagi, indentasi tidak menentukan pemasangan, tetapi hanya mengkomunikasikan pemasangan.

Contoh 3.19


Diasumsikan bahwa semua variabel dengan benar dideklarasikan, dan perhatikan beberapa statemen berikut:

if (gender == 'M')                       //Baris 1
    if (usia < 21 )               //Baris 2
        lajuPenuaan = 0.05;              //Baris 3
    else                                 //Baris 4
        lajuPenuaan = 0.035;             //Baris 5
else if (gender == 'F')                  //Baris 6
    if (usia < 21 )               //Baris 7
        lajuPenuaan = 0.04;              //Baris 8
    else                                 //Baris 9
        lajuPenuaan = 0.03;              //Baris 10

Pada kasus ini, else pada baris 4 dipasangkan dengan if pada baris 2. Perhatikan bahwa untuk else pada baris 4, if tak-utuh terdekat adalah if pada baris 2. Klausa else pada baris 6 dipasangkan dengan if pada baris 1. Klausa else pada baris 9 dipasangkan dengan if pada baris 7. Sekali lagi, indentasi tidak menentukan pemasangan, tetapi hanya mengkomunikasikan pemasangan.

Membandingkan Statemen if...else dengan Statemen if
Perhatikan segmen program C++ berikut, yang semuanya mengerjakan tugas sama.

a.       if (bulan == 1)                          //Baris 1
    cout << "Januari" << endl;           //Baris 2
else if (bulan == 2)                     //Baris 3
    cout << "Pebruari" << endl;          //Baris 4
else if (bulan == 3)                     //Baris 5
    cout << "Maret" << endl;             //Baris 6
else if (bulan == 4)                     //Baris 7
    cout << "April" << endl;             //Baris 8
else if (bulan == 5)                     //Baris 9
    cout << "Mei" << endl;        //Baris 10
else if (bulan == 6)                     //Baris 11
    cout << "Juni" << endl;              //Baris 12

b.      if (bulan == 1)                          //Baris 1
    cout << "Januari" << endl;           //Baris 2    
if (bulan == 2)                          //Baris 3
    cout << "Pebruari" << endl;          //Baris 4
if (bulan == 3)                          //Baris 5
    cout << "Maret" << endl;             //Baris 6
if (bulan == 4)                          //Baris 7
    cout << "April" << endl;             //Baris 8
if (bulan == 5)                          //Baris 9
    cout << "Mei" << endl;        //Baris 10
if (bulan == 6)                          //Baris 11
    cout << "Juni" << endl;              //Baris 12

Segmen program (a) ditulis sebagai runtun statemen if...else; segmen program (b) ditulis sebagai runtun statemen if. Kedua segmen program mengerjakan tugas yang sama. Jika bulan bernilai 3, maka kedua segmen program akan menampilkan Maret. Jika bulan bernilai 1, maka pada segmen program (a), ekspresi dalam statemen if pada baris 1 dievaluasi menjadi true. Statemen pada baris 2 yang diasosiasikan dengan if ini dieksekusi; sisa struktur, yang merupakan klausa else dari statemen if ini, dilompati; dan statemen if yang lain tidak dievaluasi. Dalam segmen program (b), komputer harus mengevaluasi ekspresi dalam tiap statemen if karena tidak ada statemen else. Konsekuensinya, segmen program (b) dieksekusi lebih lambat dari segmen program (a).

Evaluasi Jalan-Pintas
Ekspresi logikal dalam C++ dievaluasi menggunakan algoritma efisien tingkat tinggi. Algoritma ini diilustrasikan dengan bantuan beberapa statemen berikut:

(x > y) || (x == 5) //Baris 1
(a == b) && (x >= 7)       //Baris 2

Dalam statemen pada baris 1, dua operand dari operator || adalah ekspresi (x > y) dan (x == 5). Ekspresi ini dievaluasi menjadi true jika salah satu operand (x > y) bernilai true atau operand (x == 5) bernilai true. Dengan evaluasi jalan-pintas, komputer mengevaluasi ekspresi logikal dari kiri ke kanan. Begitu nilai dari keseluruhan ekspresi logikal diketahui, evaluasi berhenti. Sebagai contoh, pada statemen 1, jika operand (x > y) dievaluasi menjadi true, maka keseluruhan ekspresi dievaluasi menjadi true karena true || true adalah true dan true || false adalah true. Oleh karena itu, nilai dari operand (x == 5) tidak memiliki pengaruh pada keluaran.

Sama halnya, dalam statemen pada baris 2, dua operand dari operator && adalah (a == b) dan (x >= 7). Jika operand (a == b) dievaluasi menjadi false, maka keseluruhan ekspresi dievaluasi menjadi false karena false && true adalah false dan false && false adalah false.


Evaluasi jalan-pintas (dari sebuah ekspresi logikal): Sebuah proses dimana di dalamnya komputer mengevaluasi sebuah ekspresi logikal dari kiri ke kanan dan berhenti segera setelah nilai dari ekspresi diketahui.

Contoh 3.20


Perhatikan beberapa ekspresi berikut:

(usia >= 21) || ( x == 5)         //Baris 1
(nilai == 'A') && (x >= 7) //Baris 2

Untuk ekspresi pada baris 1, dimisalkan bahwa nilai dari usia adalah 25. Karena (25 >= 21) adalah true dan operator logikal yang digunakan dalam ekspresi adalah ||, ekspresi tersebut dievaluasi menjadi true. Karena evaluasi jalan-pintas, komputer tidak mengevaluasi ekspresi (x == 5). Sama halnya, untuk ekspresi pada baris 2, dimisalkan bahwa nilai dari nilai adalah ‘B’. Karena (‘B’ == ‘A’) adalah false dan operator logikal yang digunakan di dalam ekspresi adalah &&, ekspresi tersebut dievaluasi menjadi false. Komputer tidak perlu mengevaluasi (x >= 7).

Membandingkan Ekualitas Angka Titik-Mengambang
Perbandingan atas angka-angka titik-mengambang untuk ekualitas tidak seperti yang Anda duga. Sebagai contoh, perhatikan program berikut:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

int main()
{
    double x = 1.0;
    double y = 3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0;

    cout << fixed << showpoint << setprecision(17);

    cout << "3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0 = "
         << 3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0 << endl;

    cout << "x = " << x << endl;
    cout << "y = " << y << endl;

    if (x == y)
        cout << "x dan y sama." << endl;
    else
        cout << "x dan y tidak sama." << endl;

    if (fabs(x - y) < 0.000001)
        cout << "x dan y sama dengan toleransi "
             << "0.000001." << endl;
    else
        cout << " x dan y tidak sama dengan "
             << "toleransi 0.000001." << endl;

    return 0;
}

Keluaran Program:

3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0 = 0.99999999999999989
x = 1.00000000000000000
y = 0.99999999999999989
x dan y tidak sama.
x dan y sama dengan toleransi 0.000001.

Pada program ini, x diinisialisasi dengan 1.0 dan y diinisialisasi dengan 3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0. Sekarang, karena pembulatan, seperti ditunjukkan pada keluaran program, ekspres ini dievaluasi menjadi 0.99999999999999989. Oleh karena itu, ekspresi (x == y) dievaluasi menjadi false. Namun, jika Anda mengevaluasi ekspresi 3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0 dengan analisa manual, maka Anda akan mendapatkan bahwa 3.0 / 7.0 + 2.0 / 7.0 + 2.0 / 7.0 = 1.0. Jadi, nilai dari y seharusnya 1.0.

Program tersebut dan keluarannya menunjukkan bahwa Anda sebaiknya hati-hati ketika membandingkan ekualitas atas angka-angka titik-mengambang. Salah satu cara untuk memeriksa ekualitas angka-angka titik-mengambang adalah dengan memeriksa nilai absolut dari selisihnya dengan toleransi tertentu. Sebagai contoh, dimisalkan bahwa toleransi sebesar 0.000001. Kemudian, x dan y sama jika nilai absolut atas (x – y) kurang dari 0.000001. Untuk mencari nilai absolut, Anda dapat menggunakan fungsi fabs dari file header cmath, seperti ditunjukkan pada program. Oleh karena itu, ekspresi fabs(x – y) < 0.000001 menentukan apakah nilai absolut dari (x – y) kurang dari 0.000001 atau tidak.

Asosiatifitas Operator Relasional
Kadangkala ekspresi logikal tidak berperilaku seperti yang Anda harapkan, seperti ditunjukkan pada program berikut, yang menentukan apakah sebuah angka berada di antara 0 dan 10 atau tidak.

#include <iostream>

using namespace std;

int main()
{
    int angka;

    cout << "Masukkan sebuah integer: ";
    cin >> angka;
    cout << endl;

    if (0 <= angka <= 10)
        cout << angka << " berada dalam rentang 0 dan 10." << endl;
    else
        cout << angka << " tidak berada dalam rentang 0 dan 10." << endl;

    return 0;
}

Keluaran Program 1:

Masukkan sebuah integer: 5

5 berada dalam rentang 0 dan 10.

Keluaran Program 2:

Masukkan sebuah integer: 20

20 berada dalam rentang 0 dan 10.

Keluaran Program 3:

Masukkan sebuah integer: -10

-10 berada dalam rentang 0 dan 10.

Jelaslah, Keluaran Program 1 benar dan Keluaran Program 2 dan 3 tidak benar. Karena statemen if menentukan apakah sebuah integer berada di dalam rentang 0 dan 10, maka masalah pasti ada pada ekspresi di dalam statemen if. Jadi, akan dilihat ekspresi ini kembali:

0 <= angka <= 10

Meskipun statemen ini adalah ekspresi C++ yang sah, Anda tidak mendapatkan hasil yang diinginkan. Akan dievaluasi ekspresi ini untuk beberapa nilai angka. Dimisalkan bahwa angka bernilai 5. Maka:

0 <= angka <= 10
= 0 <= 5 <= 10


= (0 <= 5) <= 10
(Karena operator relasional dievaluasi dari kiri ke kanan)


= 1 <= 10
(Karena 0 <= 5 adalah true, 0 <= 5 dievaluasi menjadi 1)


= 1 (true)


Sekarang, dimisalkan bahwa angka = 20. Maka:

0 <= angka <= 10
= 0 <= 20 <= 10


= (0 <= 20) <= 10
(Karena operator relasional dievaluasi dari kiri ke kanan)


= 1 <= 10
(Karena 0 <= 20 adalah true, 0 <= 20 dievaluasi menjadi 1)


= 1 (true)


Sekarang, Anda dapat melihat mengapa ekspresi dievaluasi menjadi true ketika angka bernilai 20. Jika angka bernilai -10, maka 0 <= angka <= 10 dievaluasi menjadi true. Pada kenyataannya, ekspresi ini akan selalu dievaluasi menjadi true, tidak peduli berapapun nilai angka. Hal ini karena fakta bahwa ekspresi 0 <= angka dievaluasi menjadi 0 atau 1, dan 0 <= 10 bernilai true dan 1 <= 10 bernilai true. Jadi, apa yang salah dengan ekspresi 0 <= angka <= 10? Yaitu, hilangnya operator logikal &&. Cara yang benar untuk ekspresi ini dalam C++ adalah:

0 <= angka && angka <= 10

Anda sebaiknya hati-hati ketika memformulasikan ekspresi logikal. Ketika menciptakan sebuah ekspresi logikal kompleks, Anda perlu menggunakan operator logikal yang sesuai.

Menghindari Salah-Konsep
Proses debugging mengilustrasikan bagaimana memahami dan memperbaiki error sintaks dan error logika. Pada bagian ini, akan diilustrasikan bagaimana menghindari bug akibat teknik dan konsep yang dipahami secara parsial.

Program yang Anda tulis sampai sejauh ini membuktikan bahwa kesalahan kecil seperti pengabaian semikolon di akhir deklarasi variabel atau penggunaan sebuah variabel tanpa mendeklarasikannya dengan benar dapat menyebabkan kegagalan kompilasi program. Ingat bahwa kondisi yang berkaitan dengan sebuah statemen if harus diapit oleh sepasang kurung ( dan ). Oleh karena itu, ekspresi berikut akan mengakibatkan error sintaks:

if skor >= 90

Contoh 3.12 mengilustrasikan bahwa semikolon yang tidak pada tempatnya yang berada setelah kondisi dari statemen if:

if (jam > 40.0);

dapat mencegah keberhasilan kompilasi atau eksekusi yang benar.

Pendekatan yang perlu Anda lakukan dalam menyelesaikan masalah seperti ini adalah memahami konsep dan teknik secara benar; jika tidak, solusi Anda akan tidak efisien. Jika Anda tidak memahami konsep atau teknik secara utuh, maka Anda jangan menggunakannya sampai pemahaman Anda menjadi utuh. Masalah dari pemahaman konsep dan teknik secara parsial dapat diilustrasikan oleh program berikut.

Dimisalkan bahwa Anda ingin menulis sebuah program yang menganalisa IPK mahasiswa. Jika IPK lebih dari atau sama dengan 3.9, maka mahasiswa tersebut akan mendapatkan penghargaan dari Dekan. Jika IPK kurang dari 2.00, maka mahasiswa terkait akan dikirim surat peringatan yang mengindikasikan bahwa IPK tersebut dibawah syarat kelulusan. Jadi, perhatikan program berikut:

//Program IPK dengan bug.

#include <iostream>                                           //Baris 1

using namespace std;                                                 //Baris 2

int main()                                                    //Baris 3
{                                                             //Baris 4
    double ipk;                                               //Baris 5

    cout << "Masukkan IPK: ";                                 //Baris 6
    cin >> ipk;                                               //Baris 7
    cout << endl;                                             //Baris 8

    if (ipk >= 2.0)                                           //Baris 9
        if (ipk >= 3.9)                                       //Baris 10
            cout << "Mendapatkan penghargaan dari Dekan." << endl;   //Baris 11
    else                                                      //Baris 12
        cout << "IPK di bawah persyaratan "
             << "kelulusan. \nTemui pembimbing "
             << "akademik Anda." << endl;                            //Baris 13

    return 0;                                                        //Baris 14
}

Keluaran Program 1:

Masukkan IPK: 3.91

Mendapatkan penghargaan dari Dekan.

Keluaran Program 2:

Masukkan IPK: 3.8

IPK di bawah persyaratan kelulusan.
Temui pembimbing akademik Anda.

Keluaran Program 3:

Masukkan IPK: 1.95

Anda perlu melihat dengan jelas beberapa contoh keluaran program tersebut. Jelaslah, keluaran pada Keluaran Program 1 benar. Pada Keluaran Program 2, masukan adalah 3.8 dan keluaran mengindikasikan bahwa IPK ini di bawah syarat kelulusan. Namun, seseorang dengan IKP 3.8 akan lulus dengan sangat memuaskan. Jadi, keluaran pada Keluaran Program 2 tidak benar. Pada Keluaran Program 3, masukan adalah 1.95, dan keluaran tidak menunjukkan pesan peringatan apapun. Oleh karena itu, keluaran pada Keluaran Program 3 juga tidak benar. Ini berarti bahwa statemen pada baris 9 sampai baris 13 adalah tidak benar. Akan diperiksa kembali statemen-statemen tersebut:

    if (ipk >= 2.0)                                           //Baris 9
        if (ipk >= 3.9)                                       //Baris 10
            cout << "Mendapatkan penghargaan dari Dekan." << endl;   //Baris 11
    else                                                      //Baris 12
        cout << "IPK di bawah persyaratan "
             << "kelulusan. \nTemui pembimbing "
             << "akademik Anda." << endl;                            //Baris 13

Dengan mematuhi aturan pemasangan sebuah else dengan sebuah if, else pada baris 12 dipasangkan dengan if pada baris 10. Dengan kata lain, dengan penggunaan indentasi yang benar, kode tersebut menjadi:

    if (ipk >= 2.0)                                           //Baris 9
        if (ipk >= 3.9)                                       //Baris 10
            cout << "Mendapatkan penghargaan dari Dekan." << endl;   //Baris 11
        else                                                  //Baris 12
            cout << "IPK di bawah persyaratan "
                 << "kelulusan. \nTemui pembimbing "
                 << "akademik Anda." << endl;                 //Baris 13

Sekarang, Anda dapat melihat jika statemen if pada baris 9 merupakan sebuah seleksi satu-cara. Oleh karena itu, jika masukan bernilai kurang dari 2.0, tidak ada aksi yang terjadi, dimana tidak ada pesan peringatan yang akan ditampilkan. Sekarang, dimisalkan bahwa masukan adalah 3.8. Kemudian, ekspresi pada baris 9 dievaluasi menjadi true, sehingga ekspresi pada baris 10 akan dievaluasi menjadi false. Ini berarti bahwa statemen keluaran pada baris 13 akan dieksekusi, memberikan hasil yang tidak diharapkan.

Seharusnya, program menampilkan pesan peringatan hanya jika IPK bernilai kurang dari 2.0, dan ia harus menampilkan pesan:

Mendapatkan penghargaan dari Dekan

jika IPK lebih dari atau sama dengan 3.9.

Untuk mendapatkan hasil yang diinginkan, else pada baris 12 perlu dipasangkan dengan if pada baris 9. Untuk memasangkan else pada baris 12 dengan if pada baris 9, Anda perlu menggunakan statemen gabungan (blok statemen), seperti berikut:

    if (ipk >= 2.0)                                           //Baris 9
    {
        if (ipk >= 3.9)                                       //Baris 10
            cout << "Mendapatkan penghargaan dari Dekan." << endl;   //Baris 11
    }
    else                                                      //Baris 12
        cout << "IPK di bawah persyaratan "
             << "kelulusan. \nTemui pembimbing "
             << "akademik Anda." << endl;                            //Baris 13

Program yang benar adalah sebagai berikut:

//Program IPK tanpa bug.

#include <iostream>                                           //Baris 1

using namespace std;                                                 //Baris 2

int main()                                                    //Baris 3
{                                                             //Baris 4
    double ipk;                                               //Baris 5

    cout << "Masukkan IPK: ";                                 //Baris 6
    cin >> ipk;                                               //Baris 7
    cout << endl;                                             //Baris 8

    if (ipk >= 2.0)                                           //Baris 9
    {
        if (ipk >= 3.9)                                       //Baris 10
            cout << "Mendapatkan penghargaan dari Dekan." << endl;   //Baris 11
    }
    else                                                      //Baris 12
        cout << "IPK di bawah persyaratan "
             << "kelulusan. \nTemui pembimbing "
             << "akademik Anda." << endl;                            //Baris 13

    return 0;                                                        //Baris 14
}

Keluaran Program 1:

Masukkan IPK: 3.91

Mendapatkan penghargaan dari Dekan.

Keluaran Program 2:

Masukkan IPK: 3.8

Keluaran Program 3:

Masukkan IPK: 1.95

IPK di bawah persyaratan kelulusan.
Temui pembimbing akademik Anda.

Pada kasus seperti ini, aturan umumnya adalah bahwa Anda tidak bisa melihat di dalam sebuah blok (yaitu, yang diapit sepasang kurung kurawal) untuk memasangkan sebuah else dengan sebuah if. Klausa else pada baris 14 tidak dapat dipasangkan dengan if pada baris 11 karena statemen if pada baris 11 diapit dengan sepasang kurung kurawal, dan else pada baris 14 tidak dapat melihat ke dalam kurung kurawal tersebut. Oleh karena itu, else pada baris 14 dipasangkan dengan if pada baris 9.

Kegagalan Masukan dan Statemen if
Pada Bab 2, Anda telah melihat bahwa percobaan pembacaan data tak-valid dapat menyebabkan aliran masukan memasuki keadaan gagal. Begitu aliran masukan memasuki keadaan gagal, semua statemen masukan yang berkaitan dengan aliran masukan tersebut akan diabaikan, dan komputer akan berlanjut mengeksekusi program, yang akan menyebabkan hasil yang tidak diharapkan. Anda dapat menggunakan statemen if untuk memeriksa status dari sebuah variabel aliran masukan.

Selain pembacaan data tak-valid, kenjadian lain dapat menyebabkan aliran masukan memasuki keadaan gagal. Dua penyebab yang sering menyebabkan kegagalan masukan adalah sebagai berikut:
·         Mencoba membuka sebuah file masukan yang tidak ada.
·         Mecoba membaca di luar batas akhir sebuah file masukan.

Satu cara untuk menyelesaikan penyebab kegagalan masukan ini adalah memeriksa status variabel aliran masukan. Anda dapat melakukannya dengan menggunakan variabel aliran masukan di dalam ekspresi pada statemen if. Jika masukan terakhir berhasil, variabel aliran masukan dievaluasi menjadi true; jika masukan terakhir gagal, maka ia akan dievaluasi menjadi false.

Statemen:

if (cin)
           cout << "Masukan OK." << endl;

menampilkan:

       Masukan OK.

jika masukan terakhir dari divais masukan standar berhasil dilakukan. Sama halnya, jika infile merupakan sebuah variabel ifstream, maka statemen:

if (!infile)
    cout << "Masukan gagal." << endl;

menampilkan:

       Masukan gagal.

jika masukan terakhir yang diasosiasikan dengan variabel aliran infile gagal.

Dimisalkan bahwa sebuah variabel aliran masukan mencoba untuk membuka sebuah file dan membaca data ke dalam sebuah program. Jika file masukan tidak ada, maka Anda dapat menggunakan nilai dari variabel aliran masukan tersebut untuk menghentikan program (berkaitan dengan statemen return).

Ingat bahwa statemen terakhir yang dicantumkan di dalam fungsi main adalah:

return 0;

Statemen ini menghasilkan sebuah nilai 0 yang diberikan kepada sistem operasi ketika program berhenti. Nilai 0 mengindikasikan bahwa program berhenti secara normal dan tidak ada error yang terjadi selama eksekusi program. Nilai bertipe int selain 0 dapat pula diberikan kepada sistem operasi melalui statemen return. Nilai balik selain 0 mengindikasikan bahwa sesuatu yang salah telah terjadi selama eksekusi program.

Statemen return dapat ditempatkan di mana saja di dalam program. Kapan saja statemen return dieksekusi, ia dengan segera keluar dari fungsi dimana di dalamnya ia berada. Pada kasus fungsi main, program akan berhenti ketika statemen return dieksekusi. Anda dapat menggunakan watak dari statemen return ini untuk menghentikan fungsi main kapanpun aliran masukan gagal. Teknik ini berguna ketika sebuah program mencoba membuka sebuah file masukan. Perhatikan beberapa statemen berikut:

ifstream infile;
infile.open("inputdat.dat"); //membuka inputdat.dat
if (!infile)
{
    cout << "Tidak dapat membuka file masukan. "
         << "Program berhenti." << endl;

    return 1;
}

Dimisalkan bahwa file inputdat.dat tidak ada. Operasi untuk membuka file ini gagal, menyebabkan aliran masukan memasuki keadaan gagal. Sebagai sebuah ekspresi logikal, variabel aliran masukan infile kemudian dievaluasi menjadi false. Karena infile bernilai false, maka ekspresi !infile (dalam statemen if) dievaluasi menjadi true, dan tubuh statemen if akan dieksekusi. Pesan:

Tidak dapat membuka file masukan. Program berhenti.

ditampilkan pada layar, dan statemen return menghentikan program dengan mengembalikan nilai 1 kepada sistem operasi.

Perhatikan program berikut:

//Program untuk menghitung rerata skor ujian.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

int main()
{
    ifstream inFile;       //variabel aliran masukan
    ofstream outFile;      //variabel aliran keluaran

    double test1, test2, test3, test4, test5;
    double rerata;

    string namaPertama;
    string namaAkhir;

    inFile.open("test.txt"); //membuka file masukan

    if (!inFile)
    {
        cout << "Tidak dapat membuka file masukan. "
             << "Program berhenti." << endl;

        return 1;
    }

    outFile.open("testavg.out"); //membuka file keluaran

    outFile << fixed << showpoint;
    outFile << setprecision(2);

    cout << "Pemrosesan data" << endl;

    inFile >> namaPertama >> namaAkhir;
    outFile << "Nama mahasiswa: " << namaPertama
            << " " << namaAkhir << endl;

    inFile >> test1 >> test2 >> test3
           >> test4 >> test5;
    outFile << "Skor ujian: " << setw(4) << test1
            << setw(4) << test2 << setw(4) << test3
            << setw(4) << test4 << setw(4) << test5
            << endl;

    rerata = (test1 + test2 + test3 + test4 + test5) / 5.0;

    outFile << "Rerata skor ujian: " << setw(6)
            << rerata << endl;

    inFile.close();
    outFile.close();

    return 0;
}

Keluaran Program: Jika file masukan test.txt tidak ada, maka ditampilkan:

Tidak dapat membuka file masukan.
Program berhenti.

Keluaran Program: File masukan test.txt yang diberikan:



maka dihasilkan file keluaran:




Kebingungan antaran Operator Ekualitas (==) dan Operator Penugasan (=)
Ingat bahwa jika ekspresi pembuat-keputusan di dalam statemen if dievaluasi menjadi true, maka bagian statemen dari statemen if akan dieksekusi. Selain itu, ekspresi biasanya merupakan sebuah ekspresi logikal. Namun, C++ membolehkan Anda untuk menggunakan sembarang ekspresi yang dapat dievaluasi menjadi true atau false sebagai sebuah ekspresi di dalam statemen if. Perhatikan statemen berikut:



if (x = 5)
    cout << "Nilai adalah lima." << endl;

Elemen ekspresi, pembuat keputusan, di dalam statemen if adalah x = 5. Ekspresi x = 5 disebut dengan ekspresi penugasan karena operator = muncul di dalam ekspresi dan tidak ada semikolon di akhirnya.

Ekspresi ini dievaluasi sebagai berikut. Pertama, sisi kanan dari operator = dievaluasi, yang dievaluasi menjadi 5. Nilai 5 ini kemudian ditugaskan kepada x. Selain itu, nilai 5, yang merupakan nilai baru dari x, juga menjadi nilai ekspresi di dalam statemen if, yang merupakan nilai dari ekspresi penugasan. Karena 5 adalah tak-nol, ekspresi di dalam statemen if dievaluasi menjadi true, jadi bagian statemen dari statemen if akan menampilkan: Nilai adalah lima.

Tidak peduli seberapa berpengalaman seorang programer, hampir setiap orang membuat kesalahan menuliskan = menggantikan == pada suatu waktu. Salah satu alasan mengapa kedua operator ini sering membingungkan adalah bahwa kebanyakan bahasa pemrograman menggunakan = sebagai operator ekualitas. Jadi, pengalaman dengan beberapa bahasa pemrograman dapat membuat kebingungan.

Meskipun fakta bahwa sebuah ekspresi penugasan dapat dipakai sebagai sebuah ekspresi, penggunaan operator penugasan menggantikan operator ekualitas dapat menyebabkan masalah serius dalam sebuah program. Sebagai contoh, dimisalkan bahwa diskon pada sebuah asuransi mobil didasarkan pada rekam jejak pengendara yang diasuransikan. Rekam jejak 1 berarti bahwa pengendara bebas-kecelakaan dan meneriman 25 % diskon dari asuransi. Statemen:

if (kodePengendara == 1)
    cout << "Diskon asuransi sebesar 25%." << endl;

menampilkan:

Diskon asuransi sebesar 25%.

hanya jika nilai dari kodePengendara adalah 1. Namun, statemen:

if (kodePengendara = 1)
    cout << " Diskon asuransi sebesar 25%." << endl;

akan selalu menampilkan:

Diskon asuransi sebesar 25%.

karena sisi kanan dari ekspresi penugasan dievaluasi menjadi 1, yang bernilai tak-nol dan oleh karena itu dievaluasi menjadi true. Jadi, ekspresi di dalam statemen if dievaluasi menjadi true, menampilkan baris teks berikut: Diskon asuransi sebesar 25%. Selain itu, nilai 1 ditugaskan kepada variabel kodePengendara. Dimisalkan bahwa sebelum statemen if dieksekusi, nilai dari variabel kodePengendara adalah 4. Setelah statemen if dieksekusi, tidak hanya keluaran salah, tetapi juga nilai baru akan menggantikan nilai kodePengendara yang lama.

Kemunculan dari = menggantikan == mirip seperti pembunuh bisu. Secara sintaks benar, jadi kompiler tidak memeringatkan Anda, karena ia merupakan error logikal.

Kemunculan dari operator ekualitas menggantikan operator penugasan juga dapat menyebabkan error dalam sebuah program. Sebagai contoh, dimisalkan bahwa x, y, dan z adalah variabel int. Statemen:

x = y + z;

menugaskan nilai dari ekspresi y + z kepada x. Statemen:

x == y + z;

membandingkan nilai dari ekspresi y + z dengan nilai dari x; nilai dari x tetap sama. Oleh karena itu, Anda harus menggunakan kehati-hatian ekstra ketika bekerja dengan operator ekualitas dan operator penugasan.

Operator Kondisional (?:)
Statemen if...else dapat ditulis dengan cara yang lebih singkat dengan menggunakan operator kondisional C++. Operator kondisional, ditulis dengan ?:, merupakan operator ternary, yang berarti bahwa ia mengambil tiga argumen. Sintaks dalam menggunakan operator kondisional adalah:

ekspresi1 ? ekspresi2 : ekspresi3

Tipe statemen ini dinamakan dengan ekspresi kondisional. Ekspresi kondisional dievaluasi sebagai berikut: Jika ekspresi1 dievaluasi menjadi sebuah integer tak-nol (yaitu, menjadi true), maka hasil dari ekspresi kondisional adalah ekspresi2. Sebaliknya, hasil dari ekspresi kondisional adalah ekspresi3.

Perhatikan beberapa statemen berikut:

if (a >= b)
    maks = a;
else
    maks = b;

Anda dapat menggunakan operator kondisional untuk menyederhanakan statemen if...else sebagai berikut:

maks = (a >= b) ? a : b;


Menggunakan Pseudocode

Ada beberapa cara dalam mengembangkan sebuah program. Salah satu metode melibatkan penggunaan campuran dari C++ dan bahasa sehari-hari, yang dinamakan dengan pseudocode atau pseudo saja. Pseudo menyediakan cara yang berguna dalam memberikan garis-besar sebuah program sebelum menjadikannya sebagai kode C++ formal. Ketika Anda mengkonstrukso program yang melibatkan struktur kendali bersarang yang kompleks, pseudo dapat menolong Anda agar mengembangkan struktur program yang benar dan terhindar dari kesalahan umum.

Berikut adalah segmen program yang menentukan yang terbesar dari dua integer. Jika x dan y adalah integer, dengan menggunakan pseudo, maka Anda dapat menuliskan pseudo berikut:

a.        jika (x > y) maka x terbesar
b.        jika (y > x) maka y terbesar
Jika statemen pada (a) bernilai true, maka x adalah yang terbesar. Jika statemen pada (b) bernilai true, maka y yang terbesar. Namun, agar kode ini dapat bekerja dalam menentukan yang terbesar dari dua integer, komputer perlu mengevaluasi kedua ekspresi:

(x > y) dan (y > x)

bahkan jika statemen pertama adalah true. Pengevaluasian kedua ekspresi merupakan pemborosan waktu komputasi.

Sekarang pseudo ini ditulis-ulang sebagai berikut:

jika (x > y) maka
    x terbesar
sebaliknya
    y terbesar

Di sini, hanya satu kondisi yang perlu dievaluasi. Kode ini tampak OK, jadi akan dikonversi menjadi kode C++.

#include <iostream>

using namespace std;

int main()
{
           if (x > y)

Tunggu...begitu Anda mulai menerjemahkan pseudo menjadi sebuah program C++, Anda seharusnya memperhatikan bahwa tidak ada tempat untuk menyimpan x atau y. Kedua variabel tersebut belum dideklarasikan, yang merupakan kesalahan umum yang terjadi pada para programer baru. Jika Anda memeriksa pseudo tersebut, Anda akan melihat bahwa program memerlukan tiga variabel. Sekarang, akan dituliskan kode program C++:

#include <iostream>

using namespace std;

int main()
{
    int angka1, angka2, terbesar;        //Baris 1

    if (angka1 > angka2);                //Baris 2; error
        terbesar = angka1;               //Baris 3
    else                                 //Baris 4
        terbesar = angka2;               //Baris 5

    return 0;
}

Pengkompilasian program ini akan menyebabkan error sintaks yang sering terjadi (baris 2). Ingat bahwa sebuah semikolon tidak dapat ditempatkan setelah ekspresi di dalam statemen if...else. Bahkan jika Anda memperbaiki error sintaks ini, program masih tidak akan memberikan hasil yang diharapkan karena ia akan mencoba menggunakan pengenal yang tidak mempunyai nilai. Variabel-variabel belum diinisialisasi, yang merupakan error yang umum dijumpai. Selain itu, karena tidak ada statemen keluaran, Anda tidak akan bisa melihat hasil program.

Karena tidak ada banyak kesalahan di dalam program, Anda sebaiknya memeriksa program dengan rentang nilai-nilai yang lebih luas dalam mengevaluasi program pada pelbagai situasi. Sebagai contoh, apakah program ini bisa dijalankan jika satu angka nol, jika satu angka negatif dan angka lainnya positif, jika kedua angka negatif, atau jika kedua angka sama? Dengan memeriksa program, Anda dapat melihat bahwa ia tidak memeriksa apakah kedua angka sama. Dengan mempertimbangkan diskusi ini, Anda dapat menulis-ulang program sebagai berikut:

//Program: Membandingkan angka-angka
//Program ini membandingkan dua integer dan menampilkan yang terbesar.

#include <iostream>

using namespace std;

int main()
{
    int angka1, angka2;

    cout << "Masukkan dua integer: ";
    cin >> angka1 >> angka2;
    cout << endl;

    cout << "Dua integer yang dimasukkan adalah " << angka1
         << " dan " << angka2 << endl;

    if (angka1 > angka2)
        cout << "Angka terbesar adalah " << angka1 << endl;
    else if (angka2 > angka1)
        cout << "Angka terbesar adalah " << angka2 << endl;
    else
        cout << "Kedua angka sama." << endl;

    return 0;
}

Keluaran Program:

Masukkan dua integer: 78 90

Dua integer yang dimasukkan adalah 78 dan 90
Angka terbesar adalah 90

Satu hal yang dapat Anda pelajari dari program tersebut adalah bahwa Anda pertama-tama mengembangkan sebuah program menggunakan kertas dan pulpen. Meskipun program yang ditulis di atas kertas tidak dijamin berhasil pada percobaan pertama, langkah ini merupakan awal yang bagus. Di atas kertas, Anda lebih mudah mengidentifikasi error dan memperbaiki program, khususnya program berukuran besar.


Struktur switch

Ingat bahwa ada dua struktur seleksi, atau cabang, dalam C++. Struktur seleksi pertama, yang diimplementasikan dengan statemen if dan if...else, biasanya mensyaratkan evaluasi atas sebuah ekspresi logikal. Struktur seleksi kedua, yang tidak mensyaratkan evaluasi atas sebuah ekspresi logikal, dikenal dengan struktur switch. Struktur switch dalam C++ memberikan kemampuan kepada komputer untuk memilih dari banyak alternatif.

Sintaks umum atas statemen switch adalah:

switch (ekspresi)
{
    case nilai1:
        statemen_1
        break;
    case nilai2:
        statemen_2
        break;
    .
    .
    .
    case nilain:
        statemen_n
        break;
    default:
        statemen
}

Dalam C++, switch, case, break, dan default merupakan katakunci. Dalam struktur switch, pertama-tama ekspresi dievaluasi. Nilai dari ekspresi kemudian digunakan untuk melakukan aksi-aksi yang dispesifikasi oleh statemen (atau beberapa statemen) yang terletak setelah katakunci case.

Meskipun tidak harus, ekspresi biasanya berupa sebuah pengenal. Apakah ia sebuah pengenal atau sebuah ekspresi, nilai dari ekspresi harus berupa tipe integral. Elemen ekspresi kadangkala dikenal dengan selektor atau pemilih. Nilainya menentukan statemen mana yang akan diseleksi untuk dieksekusi. Nilai case tertentu hanya boleh muncul sekali. Satu atau lebih statemen dapat ditempatkan setelah sebuah label case, jadi Anda tidak harus menggunakan kurung-kurawal untuk mengikat beberapa statemen menjadi satu entitas. Statemen break bisa (tetapi tidak harus) muncul sesudah tiap statemen. Gambar 3.4 menunjukkan aliran eksekusi dari statemen switch.





Gambar 3.4 Statemen switch


Statemen switch dieksekusi dengan aturan-aturan berikut:
1.      Ketika nilai dari ekspresi cocok dengan nilai case (juga dikenal dengan label), statemen (atau beberapa statemen) dieksekusi sampai ditemui statemen break atau sampai akhir struktur switch diraih.
2.      Jika nilai dari ekspresi tidak cocok dengan salah satu dari nilai case, statemen (atau beberapa statemen) yang ada setelah label default akan dieksekusi. Jika struktur switch tidak mempunyai label default dan jika nilai dari ekspresi tidak cocok dengan salah satu nilai case, maka keseluruhan statemen switch akan dilompati.
3.      Statemen break menyebabkan kendali program keluar dari struktur switch.

Contoh 3.21


Perhatikan beberapa statemen berikut, dimana di dalamnya nilai adalah sebuah variabel bertipe char.

switch (nilai)
{
    case 'A':
        cout << "Nilai kredit adalah 4.0.";
        break;
    case 'B':
        cout << " Nilai kredit adalah 3.0.";
        break;
    case 'C':
        cout << " Nilai kredit adalah 2.0.";
        break;
    case 'D':
        cout << " Nilai kredit adalah 1.0.";
        break;
    case 'F':
        cout << " Nilai kredit adalah 0.0.";
        break;
    default:
        cout << " Nilai kredit tidak valid.";
}

Pada contoh ini, ekspresi di dalam statemen switch merupakan sebuah pengenal variabel. Variabel nilai adalah bertipe char, yang merupakan tipe integral. Beberapa nilai dari nilai yang mungkin adalah ‘A’, ‘B’, ‘C’, ‘D’, dan ‘F’. Setiap label case menspesifikasi sebuah aksi yang berbeda yang akan dilakukan bergantung pada nilai dari nilai. Jika nilai dari nilai adalah ‘A’, maka keluarannya adalah:

Nilai kredit adalah 4.0.

Contoh 3.22


Program berikut mengilustrasikan pengaruh dari statemen break. Program ini meminta pengguna untuk memasukkan sebuah angka yang bernilai antara 0 dan 10.

//Program: pengaruh dari statemen break pada struktur switch

#include <iostream>

using namespace std;

int main()
{
    int angka;

    cout << "Masukkan sebuah integer antara 0 dan 7: ";              //Baris 1
    cin >> angka;                                             //Baris 2
    cout << endl;                                             //Baris 3
    cout << "Angka yang Anda masukkan adalah " << angka
         << endl;                                             //Baris 4

    switch(angka)                                             //Baris 5
       {
        case 0:                                               //Baris 6
        case 1:                                               //Baris 7
            cout << "Belajar menggunakan ";                          //Baris 8
        case 2:                                               //Baris 9
            cout << "struktur switch ";                       //Baris 10
        case 3:                                               //Baris 11
            cout << "C++." << endl;                                  //Baris 12
            break;                                            //Baris 13
        case 4:                                               //Baris 14
            break;                                            //Baris 15
        case 5:                                               //Baris 16
            cout << "Program ini menunjukkan pengaruh ";             //Baris 17
        case 6:                                               //Baris 18
        case 7:                                               //Baris 19
            cout << "dari statemen break." << endl;                  //Baris 20
            break;                                            //Baris 21
        default:                                              //Baris 22
            cout << "Angka ini di luar rentang." << endl;            //Baris 23
       }

    cout << "Di luar struktur switch." << endl;                      //Baris 24

    return 0;                                                        //Baris 25
}

Keluaran Program 1:

Masukkan sebuah integer antara 0 dan 7: 0

Angka yang Anda masukkan adalah 0
Belajar menggunakan struktur switch C++.
Di luar struktur switch.

Keluaran Program 2:

Masukkan sebuah integer antara 0 dan 7: 2

Angka yang Anda masukkan adalah 2
struktur switch C++.
Di luar struktur switch.

Keluaran Program 3:

Masukkan sebuah integer antara 0 dan 7: 4

Angka yang Anda masukkan adalah 4
Di luar struktur switch.

Keluaran Program 4:

Masukkan sebuah integer antara 0 dan 7: 5

Angka yang Anda masukkan adalah 5
Program ini menunjukkan pengaruh dari statemen break.
Di luar struktur switch.

Keluaran Program 5:

Masukkan sebuah integer antara 0 dan 7: 7

Angka yang Anda masukkan adalah 7
dari statemen break.
Di luar struktur switch.


Keluaran Program 6:

Masukkan sebuah integer antara 0 dan 7: 8

Angka yang Anda masukkan adalah 8
Angka ini di luar rentang.
Di luar struktur switch.

Penjejakan program, menggunakan beberapa nilai tertentu dari ekspresi switch, angka, dapat menolong Anda memahami bagaimana statemen break bekerja. Jika nilai dari angka adalah 0, maka nilai dari ekspresi switch cocok dengan nilai case 0. Semua statemen yang mengikuti case 0: akan dieksekusi sampai ditemukan statemen break.

Statemen break pertama muncul pada baris 13, tepat sebelum nilai case 4. Meskipun nilai dari ekspresi switch tidak cocok dengan salah satu dari nilai-nilai case ini (yaitu 1, 2, atau 3), semua statemen yang ditempatkan sesudah semua nilai ini akan dieksekusi.

Ketika nilai dari ekspresi switch cocok dengan sebuah nilai case, semua statemen akan dieksekusi sampai sebuah break dijumpai. Sama halnya, jika nilai dari angka adalah 3, maka ia cocok dengan nilai case 3, dan semua statemen yang ditempatkan setelah label ini akan dieksekusi sampai dijumpai statemen break pada baris 13. Jika nilai dari angka adalah 4, maka ia cocok dengan nilai case 4. Pada situasi ini, aksi adalah kosong karena hanya terdapat statemen break pada baris 15.

Contoh 3.23


Meskipun nilai-nilai case (label-label) dari sebuah struktur switch terbatas, statemen ekspresi pada switch dapat dibuat sekompleks mungkin. Sebagai contoh, perhatikan statemen switch berikut:

switch (skor / 10)
{
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        nilai = 'F';
        break;
    case 6:
        nilai = 'D';
        break;
    case 7:
        nilai = 'C';
        break;
    case 8:
        nilai = 'B';
        break;
    case 9:
    case 10:
        nilai = 'A';
        break;
    default:
        cout << "Skor ujian tak-valid." << endl;
}
Diasumsikan bahwa skor adalah sebuah variabel int dengan nilai di antara 0 dan 100. Jika skor adalah 75, maka skor / 10 = 75 / 10 = 7, dan nilai yang ditugaskan adalah ‘C’. Jika nilai dari skor adalah antara 0 dan 59, nilai adalah ’F’. Jika skor bernilai di antara 0 dan 59, maka skor / 10 adalah 0, 1, 2, 3, 4, atau 5. Setiap nilai ini berkaitan dengan ‘F’.

Oleh karena itu, pada struktur switch ini, statemen-statemen aksi dari case 0, case 1, case 2, case 3, case 4, dan case 5 semuanya sama. Daripada harus menulis statemen nilai = ‘F’; diikuti dengan statemen brean untuk tiap nilai case dari 0, 1, 2, 3, 4, dan 5, Anda dapat menyederhanakan pemrograman dengan terlebih dahulu menspesifikasi semua nilai case (seperti ditunjukkan) dan kemudian menspesifikasi statemen aksi yang diinginkan. Nilai-nilai case dari 9 dan 10 mengikuti alur pemikiran yang sama.

Di samping sebagai pengenal variabel atau ekspresi kompleks, ekspresi switch dapat pula dievaluasi menjadi sebuah nilai logikal. Perhatikan beberapa statemen berikut:

switch (usia >= 18)
{
    case 1:
        cout << "Cukup umur untuk kuliah." << endl;
        cout << "Cukup umur untuk memilih." << endl;
        break;
    case 0:
        cout << "Tidak cukup umur untuk kuliah." << endl;
        cout << "Tidak cukup umur untuk memilih." << endl;
}

Jika nilai dari usia adalah 25, ekspresi usia >= 18 dievaluasi menjadi 1, yaitu true. Jika ekspresi dievaluasi menjadi 1, maka statemen-statemen yang terletak setelah label case 1 akan dieksekusi. Jika nilai dari usia adalah 14, maka ekspresi usia >= 18 akan dievaluasi menjadi 0, yaitu false, dan statemen-statemen yang terletak setelah label case 0 akan dieksekusi.

Anda dapat menggunakan true dan false, menggantikan 1 dan 0, pada label-label case, dan menuliskan-ulang statemen switch sebelumnya sebagai berikut:

switch (usia >= 18)
{
    case true:
        cout << "Cukup umur untuk kuliah." << endl;
        cout << "Cukup umur untuk memilih." << endl;
        break;
    case false:
        cout << "Tidak cukup umur untuk kuliah." << endl;
        cout << "Tidak cukup umur untuk memilih." << endl;
}

Seperti yang dapat Anda lihat dari beberapa contoh sebelumnya, statemen switch merupakan sebuah cara elegan dalam mengimplementasikan seleksi jamak. Meskipun tidak ada aturan yang dapat diterapkan untuk memutuskan apakah perlu menggunakan struktur if...else atau struktur switch dalam mengimplementasikan seleksi jamak, pertimbangan-pertimbangan berikut sebaiknya diingat. Jika seleksi jamak melibatkan suatu rentang nilai, Anda sebaiknya menggunakan struktur if...else atau struktur switch, dimana di dalamnya Anda mengkonversi setiap rentang menjadi sebuah himpunan nilai terbatas.

Sebagai contoh, pada contoh 3.23, nilai dari nilai bergantung pada nilai dari skor. Jika skor berada di antara 0 dan 59, maka nilai adalah ‘F’. Karena skor adalah sebuah variabel int, 60 nilai berkaitan dengan nilai ‘F’. Jika Anda mencantumkan semua 60 nilai sebagai nilai-nilai case, statemen switch akan menjadi sangat panjang. Namun, dengan membaginya dengan 10 akan mereduksi 60 nilai ini menjadi hanya 6 nilai: 0, 1, 2, 3, 4, dan 5.

Menghindari Pemahaman Parsial atas Konsep
Pada awal bab ini, telah didiskusikan bagaimana pemahaman parsial atas konsep atau teknik dapat mengakibatkan error dalam sebuah program. Pada bagian ini, akan diberikan contoh lain untuk mengilustrasikan permasalahan pemahaman parsial ini. Pada contoh 3.23, diilustrasikan bagaimana menugaskan sebuah nilai berdasarkan suatu skor test di antara 0 dan 100. Selanjutnya, perhatikan program berikut yang menugaskan sebuah nilai berdasarkan pada sebuah skor test.

//Program dengan bug

#include <iostream>                                           //Baris 1

using namespace std;                                                 //Baris 2

int main() //Baris 3
{                                                             //Baris 4
    int skorTest;                                             //Baris 5

    cout << "Masukkan skor test: ";                                  //Baris 6
    cin >> skorTest;                                                 //Baris 7
    cout << endl;                                             //Baris 8

    switch (skorTest / 10)                                    //Baris 9
    {                                                         //Baris 10
        case 0:                                               //Baris 11
        case 1:                                               //Baris 12
        case 2:                                               //Baris 13
        case 3:                                               //Baris 14
        case 4:                                               //Baris 15
        case 5:                                               //Baris 16
            cout << "Nilai adalah F." << endl;                //Baris 17
        case 6:                                               //Baris 18
            cout << "Nilai adalah D." << endl;                //Baris 19
        case 7:                                               //Baris 20
            cout << "Nilai adalah C." << endl;                //Baris 21
        case 8:                                               //Baris 22
            cout << "Nilai adalah B." << endl;                //Baris 23
        case 9:                                               //Baris 24
        case 10:                                              //Baris 25
            cout << "Nilai adalah A." << endl;                //Baris 26
        default:                                              //Baris 27
            cout << "Skor test tak-valid." << endl;                  //Baris 28
    } //Baris 29

    return 0; //Baris 30
}

Keluaran Program 1:

Masukkan skor test: 110

Skor test tak-valid.

Keluaran Program 2:

Masukkan skor test: -70

Skor test tak-valid.

Keluaran Program 3:

Masukkan skor test: 75

Nilai adalah C.
Nilai adalah B.
Nilai adalah A.
Skor test tak-valid.

Dari beberapa contoh keluaran program, dapat dipahami bahwa jika nilai dari skorTest kurang dari 0 atau lebih dari 100, maka program akan memberikan hasil yang tepat, tetapi jika skorTest bernilai di antara 0 dan 100, katakanlah 75, maka program memberikan hasil yang tidak tepat. Dapatkah Anda menjelaskan mengapa?

Seperti pada Keluaran Program 3, dimisalkan bahwa nilai dari skorTest adalah 75. Kemudian, skorTest % = 7, dan nilai ini cocok dengan label case 7. Jadi, ia seharusnya menampilkan Nilai adalah C. Tetapi, keluarannya adalah:

Nilai adalah C.
Nilai adalah B.
Nilai adalah A.
Skor test tak-valid.

Tetapi mengapa? Jelas terlihat bahwa paling banyak ada satu statemen cout yang berkaitan dengan setiap label case. Masalah di sini adalah akibat pemahaman parsial atas bagaimana struktur switch bekerja. Seperti yang dapat Anda lihat, statemen switch tidak mencantumkan sembarang statemen break. Oleh karena itu, setelah mengeksekusi statemen yang berkaitan dengan label case yang cocok, eksekusi berlanjut dengan statemen yang berkaitan dengan label case berikutnya, yang menyebabkan keluaran yang tidak diinginkan.

Untuk menampilkan hasil dengan benar, struktur switch harus mencantumkan sebuah statemen break yang ditempatkan sesudah tiap statemen cout, kecuali pada statemen cout terakhir.







No comments:

Post a Comment