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