Repetisi
Pada Bab 3, Anda telah melihat
bagaimana keputusan dilakukan pada sebuah program. Pada bab ini, Anda akan
belajar bagaimana repetisi direalisasikan pada sebuah program.
Mengapa Repetisi Diperlukan?
Dimisalkan bahwa Anda ingin menambahkan
5 angka untuk mencari reratanya. Dari apa yang Anda pelajari sejauh ini, Anda
dapat memprosesnya sebagai berikut (diasumsikan bahwa semua variabel telah
dideklarasikan dengan benar):
cin >> angka1 >> angka2 >> angka3 >> angka4
>> angka5;
jum = angka1 + angka2 + angka3 + angka4 + angka5;
rerata = jum / 5; //mencari rerata
Tetapi dimisalkan Anda ingin
menambahkan dan mereratakan 100, 1000, atau lebih angka. Anda harus
mendeklarasikan banyak sekali variabel dan mencantumkannya dalam statemen cin dan, bisa saja, dalam statemen cout. Hal ini akan memakan memori dan
waktu. Selain itu, jika Anda ingin menjalankan program ini dengan nilai-nilai
berbeda atau dengan jumlah nilai yang berbeda, maka Anda harus menulis-ulang
program.
Dimisalkan bahwa Anda ingin menambahkan
beberapa angka berikut:
5 3 7 9 4
Perhatikan beberapa statemen berikut,
dimana di dalamnya jum dan angka adalah dua variabel bertipe int:
1.
jum = 0;
2.
cin >> angka;
3.
jum = jum + angka;
Statemen pertama menginisialisasi jum dengan 0. Statemen 2 menyimpan 5 ke
dalam angka; statemen 3 memperbarui
nilai dari jum dengan menambahkan angka padanya. Setelah statemen 3
dieksekusi, nilai dari jum adalah 5.
Selanjutnya, statemen 2 dan statemen 3
dieksekusi kembali. Setelah statemen 2 dieksekusi (setelah kode pemrograman
membaca angka berikutnya):
angka = 3;
Setelah statemen 3 dieksekusi:
jum = jum + angka = 5 + 3 = 8
Pada titik ini, jum memuat penjumlahan dari dua angka pertama. Sekali lagi,
statemen 2 dan 3 dieksekusi kembali (ketiga kalinya). Setelah statemen 2
(setelah kode pemrograman membaca angka berikutnya):
angka = 7;
Setelah statemen 3 dieksekusi:
jum = jum + angka = 8 + 7 = 15
Sekarang, jum memuat penjumlahan dari tiga angka pertama. Sekali lagi, jika
statemen 2 dan 3 dieksekusi dua kali lagi, maka jum akan memuat penjumlahan dari semua lima angka.
Jika Anda ingin menambahkan 10 angka,
Anda dapat mengulangi eksekusi terhadap statemen 2 dan 3 sebanyak sepuluh kali.
Dan jika Anda ingin menambahkan 100 angka, maka Anda mengulangi eksekusi
terhadap statemen 2 dan 3 sebanyak seratus kali. Pada kedua kasus, Anda tidak
perlu mendeklarasikan variabel-variabel tambahan, seperti pada kode pertama.
Anda dapat menggunakan kode C++ ini untuk menambahkan sembarang banyak angka,
sedangkan pada kode yang pertama mengharuskan Anda untuk secara drastis
mengubah kode.
Ada banyak situasi dimana sangat
diperlukan untuk mengulangi eksekusi terhadap sekumpulan statemen. Sebagai
contoh, untuk setiap mahasiswa di dalam sebuah kelas, formula untuk menentukan
nilai matakuliah adalah sama. C++ memiliki tiga struktur repetisi, atau
perulangan (looping) yang memampukan
Anda mengulangi eksekusi sampai kondisi tertentu terpenuhi. Bab ini akan
mengenalkan ketiga struktur repetisi ini. Bagian selanjutnya akan mendiskusikan
struktur repetisi pertama, loop while.
Strukur Repetisi while
Pada bagian terdahulu, Anda melihat
bahwa kadangkala diperlukan untuk mengulangi eksekusi terhadap sekumpulan
statemen beberapa kali. Salah satu cara untuk melakukannya adalah dengan
mengetikkan sekumpulan statemen tersebut di dalam sebuah program berulang kali.
Sebagai contoh, jika Anda ingin mengulangi eksekusi terhadap sekumpulan
statemen sebanyak 100 kali, maka Anda dapat mengetikkan sekumpulan statemen
tersebut sebanyak 100 kali di dalam program. Namun, solusi ini sangat tidak
praktis, jika tidak memungkinkan. Untunglah, ada cara yang lebih baik dalam
mengulangi eksekusi terhadap sekumpulan statemen. C++ memiliki tiga struktur
repetisi yang memampukan Anda untuk mengulangi eksekusi terhadap sekumpulan
statemen sampai kondisi tertentu terpenuhi. Bagian ini akan mendiskusikan
struktur repetisi pertama, yang dinamakan dengan repetisi while.
Bentuk umum dari statemen while adalah:
while (ekspresi)
statemen
Dalam C++, while adalah katakunci. Tentu, statemen dapat berupa sebuah
statemen atau sekumpulan statemen (atau blok statemen). Elemen ekspresi berperan
sebagai pembuat keputusan dan biasanya berupa sebuah ekspresi logikal. Elemen statemen
dikenal sebagai tubuh loop. Perhatikan bahwa sepasang kurung yang mengapit ekspresi adalah bagian dari sintaks.
Gambar 4.1 menunjukkan aliran eksekusi dari struktur repetisi loop.
Gambar 4.1 Loop while
Elemen ekspresi memberikan kondisi entri. Jika ekspresi awalnya dievaluasi menjadi true, maka statemen akan
dieksekusi. Kondisi loop, ekspresi,
kemudian dievaluasi-ulang. Jika ia kembali dievaluasi menjadi true, maka statemen akan dieksekusi kembali. Elemen statemen (tubuh loop) berlanjut dieksekusi sampai ekspresi tidak lagi bernilai true. Sebuah loop yang dieksekusi tanpa henti dinamakan dengan loop
tak-terhingga. Untuk menghindari loop tak-terhingga, Anda perlu memastikan
bahwa tubuh loop memuat statemen (atau beberapa statemen) yang menjamin bahwa
kondisi berhenti, yaitu elemen ekspresi
di dalam while, pada akhirnya
bernilai false.
Contoh 4.1
|
|
Perhatikan segmen program C++ berikut.
(Diasumsikan bahwa i adalah sebuah
variabel int).
i = 0; //Baris
1
while (i <= 20) //Baris 2
{
cout << i <<
" "; //Baris 3
i = i + 5; //Baris 4
}
cout << endl;
Keluaran Program:
0 5 10 15 20
Pada baris 1, variabel i ditetapkan menjadi 0. Elemen ekspresi di dalam statemen while (pada baris 2), i <= 20, dievaluasi. Karena ekspresi
i <= 20 dievaluasi menjadi true, tubuh loop while selanjutnya akan dieksekusi. Tubuh loop while memuat beberapa statemen pada baris 3 dan 4. Statemen pada
baris 3 menampilkan nilai i, yaitu
0. Statemen pada baris 4 mengubah nilai i
menjadi 5. Setelah statemen pada baris 3 dan 4 dieksekusi, elemen ekspresi di dalam loop while (baris 2) akan dievaluasi
kembali. Karena i adalah 5, ekspresi
i <= 20 dievaluasi menjadi true dan tubuh loop while dieksekusi kembali. Proses
pengevaluasian elemen ekspresi dan
pengeksekusian tubuh loop while
berlanjut sampai ekspresi, i <= 20
(baris 2), tidak lagi dievaluasi menjadi true.
Variabel i (pada baris 2, contoh 4.1) di dalam elemen ekspresi disebut dengan variabel
kendali loop. Perhatikan hal-hal penting berikut dari contoh 4.1:
a. Di dalam loop, i menjadi 25 tetapi tidak ditampilkan
karena kondisi entri adalah false.
b. Jika Anda
mengabaikan statemen:
i = i + 5;
dari tubuh
loop, maka Anda akan mendapatkan sebuah loop tak-terhingga, yang secara
kontinyu menampilkan baris-baris nol.
c. Anda harus
menginisialisasi variabel kendali loop i
sebelum Anda mengeksekusi loop. Jika statemen:
i = 0;
(pada baris 1)
diabaikan, maka loop tidak akan bisa dieksekusi sama sekali. (Ingat bahwa
variabel dalam C++ tidak secara otomatis diinisialisasi).
d.
Pada contoh 4.1, jika dua statemen
di dalam tubuh loop disaling-tukarkan, maka hal itu akan mengubah hasil secara
drastis. Sebagai contoh, perhatikan beberapa statemen berikut:
i = 0;
while (i <= 20)
{
i = i + 5;
cout << i
<< " ";
}
cout << endl;
Di sini,
keluarannya adalah:
5
10 15 20 25
Secara umum, ini merupakan error
semantik karena Anda sangat jarang menginginkan sebuah kondisi menjadi true untuk i <= 20 tetapi memberikan hasil untuk i > 20.
e.
Jika Anda menempatkan sebuah
semikolon (titik-koma) di akhir loop while,
(ditempatkan setelah ekspresi logikal), maka aksi dari loop while akan kosong atau null. Sebagai
contoh, aksi dari loop while berikut
adalah kosong:
i = 0;
while (i <= 20);
{
i = i + 5;
cout << i <<
" ";
}
cout << endl;
Statemen-statemen yang diapit oleh
sepasang kurung-kurawal ({ dan }) tidak membentuk tubuh loop while.
Merancang
Loop while
Seperti pada contoh 5.1, tubuh loop while dieksekusi hanya ketika elemen
ekspresi, dalam statemen while,
dievaluasi menjadi true. Secara umum, elemen ekspresi memeriksa
apakah sebuah variabel (atau beberapa variabel), dinamakan dengan variabel
kendali loop (VKL), memenuhi kondisi tertentu. Sebagai contoh, pada contoh
4.1, elemen ekspresi dalam statemen
while memeriksa apakah i <= 20. VKL harus diinisialisasi dengan benar
sebelum loop while dieksekusi, dan
ia harus dipastikan akan membuat elemen ekspresi
dievaluasi menjadi false pada
akhirnya. Anda melakukan hal ini dengan memperbarui atau menginisialisasi-ulang
VKL di dalam tubuh loop while. Oleh
karena itu, secara umum, loop while
dituliskan dalam bentuk berikut:
//inisialisasi variabel kendali loop (VKL)
while (ekspresi) //ekspresi menguji VKL
{
.
.
.
//memperbarui VKL
.
.
.
}
Sebagai contoh, pada contoh 4.1,
statemen pada baris 1 menginisialisasi VKL dengan 0. Ekspresi, i <= 20, pada baris 2, memeriksa
apakah i kurang dari atau sama
dengan 20, dan statemen pada baris 4 memperbarui nilai i.
Contoh 4.2
|
|
Perhatikan segmen program C++ berikut:
i = 20; //Baris
1
while (i < 20) //Baris 2
{
cout << i <<
" "; //Baris 3
i = i + 5; //Baris 4
}
cout << endl; //Baris 5
Adalah sangat mudah memeriksa perbedaan
antara contoh ini dengan contoh 4.1. Pada contoh ini, pada baris 1, i ditetapkan menjadi 20. Karena i adalah 20, ekspresi i < 20 di dalam statemen while (baris 2) dievaluasi menjadi false. Karena awalnya kondisi entri
loop, i < 20, adalah false, tubuh loop while tidak akan pernah diseksekusi. Oleh karena itu, tidak ada
nilai yang ditampilkan, dan nilai i
tetap 20.
Bagian ke depan akan menjelaskan
perbagai bentuk loop while.
Kasus
1: Loop while Terkendali-Kounter
Dimisalkan bahwa Anda mengetahui secara
persis berapa kali beberapa sattemen tertentu perlu dieksekusi. Sebagai contoh,
dimisalkan bahwa Anda secara persis mengetahui berapa banyak potong data (atau
entri) perlu dibaca. Pada kasus semacam itu, loop while mengasumsikan bentuk dari sebuah loop while terkendali-kounter. Dimisalkan bahwa sekumpulan statemen
perlu dieksekusi sebanyak N kali. Anda dapat menetapkan sebuah kounter (diinisialisasi dengan 0
sebelum statemen while dieksekusi)
untuk menjejak berapa banyak item yang telah dibaca. Sebelum pengeksekusian
tubuh statemen while, kounter dibandingkan dengan N. Jika kounter < N, maka tubuh statemen while akan dieksekusi. Tubuh loop
berlanjut dieksekusi sampai nilai dari kounter
>= N. Oleh karena itu, di dalam tubuh statemen while, nilai dari kounter
diinkremen setelah ia membaca item baru. Pada kasus ini, loop while akan tampak seperti berikut:
kounter = 0; //inisialisasi variabel kendali loop
while (kounter < N) //menguji variabel kendali loop
{
.
.
.
kounter++; //memperbarui
variabel kendali loop
.
.
.
}
Jika N merepresentasikan
jumlah item data di dalam sebuah file, maka nilai N dapat ditentukan dalam
beberapa cara. Program dapat meminta Anda untuk menetapkan jumlah item di dalam
file; sebuah statemen masukan dapat membaca nilai tersebut; atau Anda dapat
menetapkan item pertama di dalam file sebagai jumlah item di dalam file,
sehingga Anda tidak perlu mengingat jumlah item. Ini berguna jika seseorang,
selain programer si pembuat program, memasukkan data. Perhatikan contoh 4.3.
Contoh 4.3
|
|
Dimisalkan masukan
adalah:
8 9 2 3 90 38 56 8 23 89 7 2
Dimisalkan bahwa Anda
ingin menjumlahkan semua angka ini dan mencari reratanya. Perhatikan program
berikut:
//Program: Loop terkendali-kounter
#include
<iostream>
using namespace
std;
int main()
{
int batas; //menyimpan jumlah item data
int angka; //variabel untuk menyimpan angka
int jum; //variabel untuk menyimpan jumlah
int kounter; //variabel kendali loop
cout
<< "Baris 1: Masukkan jumlah "
<< "integer di dalam daftar: "; //Baris 1
cin >>
batas; //Baris
2
cout
<< endl; //Baris
3
jum = 0; //Baris
4
kounter = 0;
//Baris
5
cout
<< "Baris 6: Masukkan
" << batas
<< " buah integer." << endl; //Baris 6
while (kounter < batas) //Baris 7
{
cin
>> angka; //Baris
8
jum =
jum + angka; //Baris
9
kounter++; //Baris
10
}
cout
<< "Baris 11: Penjumlahan
atas " << batas
<< " angka =
" << jum << endl; //Baris
11
if (kounter != 0) //Baris 12
cout
<< "Baris 13: Rerata =
"
<< jum / kounter << endl; //Baris
13
else //Baris 14
cout
<< "Baris 15: Tidak ada
masukan." << endl; //Baris 15
return 0; //Baris 16
}
Keluaran Program:
Baris 1: Masukkan jumlah integer di dalam daftar: 12
Baris 6: Masukkan 12 buah integer.
8 9 2 3 90 38 56 8 23 89 7 2
Baris 11: Penjumlahan atas 12 angka = 335
Baris 13: Rerata = 27
Program ini bekerja
sebagai berikut. Statemen pada baris 1 meminta pengguna untuk memasukkan jumlah
item data. Statemen pada baris 2 membaca baris masukan berikutnya dan
menyimpannya di dalam variabel batas.
Nilai batas mengindikasikan jumlah item dalam daftar. Statemen-statemen pada
baris 4 dan 5 menginisialisasi variabel jum
dan kounter dengan 0. (Variabel kounter merupakan variabel kendali
loop). Statemen pada baris 6 meminta pengguna untuk memasukkan angka-angka
(semua item data). Pada kasus ini, pengguna diminta untuk memasukkan 12
integer. Statemen while pada baris 7
memeriksa nilai kounter untuk
menentukan berapa banyak item telah dibaca. Jika kounter bernilai kurang dari batas,
maka loop while akan berlanjut ke
iterasi berikutnya. Statemen pada baris 8 membaca angka berikutnya dan
menyimpannya dalam variabel angka.
Statemen pada baris 9 memperbarui nilai jum
dengan menambahkan nilai angka pada
nilai sebelumnya, dan statemen pada baris 10 menginkremen nilai kounter sebesar 1. Statemen pada baris
11 menampilkan penjumlahan dari angka-angka yang dibaca; statemen-statemen pada
baris 12 sampai baris 15 menampilkan rerata.
Perhatikan bahwa jum diinisialisasi dengan 0 pada baris
4 dalam program. Pada baris 9, setelah membaca sebuah angka pada baris 8,
program menambahkannya pada penjumlahan dari semua angka yang telah dibaca
sebelum angka sekarang. Angka pertama yang dibaca akan dijumlahkan dengan nol
(karena jum diinisialisasi dengan 0), memberikan penjumlahan angka pertama yang
tepat. Untuk menemukan rerata, Anda membagi jum dengan kounter. Jika
kounter bernilai 0, maka pembagian
dengan nol akan menghentikan program dan Anda akan mendapatkan pesan error.
Oleh karena itu, sebelum membagi jum
dengan kounter, Anda harus memeriksa
apakah kounter bernilai 0 atau
tidak.
Perhatikan bahwa pada
program ini, statemen pada baris 5 menginisialisasi VKL kounter dengan 0. Ekspresi kounter
< batas pada baris 7 dievaluasi untuk menentukan apakah kounter bernilai kurang dari batas.
Statemen pada baris 10 memperbarui nilai kounter.
Kasus
2: Loop while Terkendali-Sentinel
Anda tidak selalu
mengetahui berapa banyak data (entri) yang perlu dibaca, tetapi Anda mungkin
mengetahui bahwa entri terakhir adalah sebuah nilai spesial, yang dinamakan
dengan sentinel. Pada kasus ini, Anda
membaca item pertama sebelum statemen while
dieksekusi. Jika item ini tidak sama dengan sentinel, maka tubuh statemen while akan dieksekusi. Loop while berlanjut dieksekusi sepanjang
program belum membaca sentinel. Loop while
semacam itu dinamakan dengan loop while
terkendali-sentinel. Pada kasus ini, loop while
tampak seperti berikut:
cin >> varibel; //inisialisasi
variabel kendali loop
while (variabel != sentinel) //menguji variabel kendali loop
{
.
.
.
cin >> variabel; //memperbarui variabel kendali loop
.
.
.
}
Contoh 4.4
|
|
Dimisalkan bahwa Anda
ingin membaca beberapa integer negetif dan mereratakannya, tetapi Anda tidak
mengetahui jumlah item data. Dimisalkan bahwa angka -999 menandai akhir data.
Anda mempelajari kode C++ berikut:
//Program: Loop terkendali-sentinel
#include
<iostream>
using namespace
std;
const int
SENTINEL = -999;
int main()
{
int angka; //variabel untuk menyimpan
angka
int jum = 0; //variabel untuk menyimpan
jum
int hitung = 0; //variabel untuk
menyimpan total
//membaca
angka-angka
cout
<< "Baris 1: Masukkan
integer-integer diakhiri dengan "
<< SENTINEL << endl; //Baris 1
cin >>
angka; //Baris 2
while (angka != SENTINEL) //Baris 3
{
jum =
jum + angka; //Baris 4
hitung++;
//Baris 5
cin
>> angka; //Baris 6
}
cout
<< "Baris 7: Penjumlahan dari
" << hitung
<< " angka-angka
adalah " << jum << endl; //Baris 7
if (hitung != 0) //Baris 8
cout
<< "Baris 9: Rerata adalah
"
<< jum / hitung << endl; //Baris 9
else //Baris 10
cout
<< "Baris 11: Tidak ada
masukan." << endl; //Baris 11
return 0;
}
Keluaran Program:
Baris 1: Masukkan integer-integer diakhiri dengan -999
34 23 9 45 78 0 77 8 3 5 -999
Baris 7: Penjumlahan dari 10 angka-angka adalah 282
Baris 9: Rerata adalah 28
Program ini bekerja
sebagai berikut. Statemen pada baris 1 meminta pengguna untuk memasukkan
beberapa angka yang diakhiri dengan -999. Statemen pada baris 2 membaca angka
pertama dan menyimpannya di dalam angka.
Statemen while pada baris 3
memeriksa apakah angka tidak sama
dengan SENTINEL. (Variabel angka
merupakan variabel kendali loop). Jika angka
tidak sama dengan SENTINEL, maka tubuh loop while akan dieksekusi. Statemen pada baris 4 memperbarui nilai jum dengan menambahkan angka pada jum. Statemen pada baris 5 menginkremen nilai hitung sebesar 1; statemen pada baris 6 membaca dan menyimpan angka
berikutnya ke dalam angka.
Statemen-statemen pada baris 4 sampai baris 6 dieksekusi secara berulang sampai
program membaca SENTINEL. Statemen pada baris 7 menampilkan penjumlahan atas
angka-angka yang dibaca, dan statemen-statemen pada baris 8 sampai baris 10
menampilkan reratanya.
Perhatikan bahwa statemen
pada baris 2 menginisialisasi variabel kendali loop (VKL) angka. Ekspresi angka !=
SENTINEL pada baris 3 memeriksa apakah nilai angka tidak sama dengan SENTINEL. Statemen pada baris 6
menginisialisasi-ulang VKL angka.
Selanjutnya, perhatikan
contoh lain dari sebuah loop while
terkendali-sentinel. Pada contoh ini, pengguna diminta untuk memasukkan nilai
yang akan diproses. Jika pengguna ingin menghentikan program, ia dapat
memasukkan sentinel.
Contoh 4.5
|
|
Dijit-Dijit Telepon
Program berikut membaca
kode-kode huruf A sampai Z dan menampilkan dijit telepon terkait. Program ini
menggunakan sebuah loop while
terkendali-sentinel. Untuk menghentikan program, pengguna diminta untuk
memasukkan sentinel, yang merupakan sebuah #.
Ini juga merupakan sebuah contoh struktur kendali bersarang, dimana di dalamnya
if...else, switch, dan loop while bersarang.
//******************************************************************
// Program:
Dijit-dijit telepon
// Ini merupakan
sebuah contoh dari loop terkendali-sentinel.
// Program ini
mengkonversi huruf besar menjadi dijit telepon
// terkati.
//******************************************************************
#include <iostream>
using namespace std;
int main()
{
char
huruf; //Baris
1
cout << "Program untuk mengkonversi huruf besar "
<< "menjadi dijit telepon "
<< "terkait." << endl; //Baris
2
cout << "Untuk menghentikan program tekan #."
<< endl; //Baris 3
cout << "Masukkan sebuah huruf: "; //Baris 4
cin >> huruf; //Baris 5
cout << endl; //Baris 6
while
(huruf != '#') //Baris
7
{
cout << "Huruf yang Anda masukkan adalah: "
<< huruf << endl; //Baris 8
cout << "Dijit telepon terkait "
<< "adalah: "; //Baris 9
if
(huruf >= 'A' && huruf <= 'Z') //Baris
10
switch (huruf) //Baris
11
{
case 'A':
case 'B':
case 'C':
cout << 2
<<endl; //Baris 12
break; //Baris
13
case 'D':
case 'E':
case 'F':
cout << 3 <<
endl; //Baris 14
break; //Baris 15
case 'G':
case 'H':
case 'I':
cout << 4 <<
endl; //Baris 16
break; //Baris
17
case 'J':
case 'K':
case 'L':
cout << 5 <<
endl; //Baris 18
break; //Baris
19
case 'M':
case 'N':
case 'O':
cout << 6 <<
endl; //Baris 20
break; //Baris
21
case 'P':
case 'Q':
case 'R':
case 'S':
cout << 7 <<
endl; //Baris 22
break; //Baris
23
case 'T':
case 'U':
case 'V':
cout << 8 <<
endl; //Baris 24
break; //Baris
25
case 'W':
case 'X':
case 'Y':
case 'Z':
cout << 9 << endl; //Baris 26
}
else
//Baris
27
cout << "Masukan tak-valid." << endl;
//Baris 28
cout << "\nMasukkan huruf besar lain "
<< "untuk menamukan dijit "
<< "telepon terkait."
<< endl; //Baris
29
cout << "Untuk menghentikan program tekan #."
<< endl; //Baris
30
cout << "Masukkan sebuah huruf: "; //Baris
31
cin >> huruf; //Baris
32
cout << endl; //Baris
33
}//akhir while
return
0;
}
Keluaran Program:
Program untuk mengkonversi huruf besar menjadi dijit
telepon terkait.
Untuk menghentikan program tekan #.
Masukkan sebuah huruf: A
Huruf yang Anda masukkan adalah: A
Dijit telepon terkait adalah: 2
Masukkan huruf besar lain untuk menamukan dijit
telepon terkait.
Untuk menghentikan program tekan #.
Masukkan sebuah huruf: D
Huruf yang Anda masukkan adalah: D
Dijit telepon terkait adalah: 3
Masukkan huruf besar lain untuk menamukan dijit
telepon terkait.
Untuk menghentikan program tekan #.
Masukkan sebuah huruf: #
Program ini bekerja
sebagai berikut. Statemen-statemen pada baris 2 dan 3 memberitahu pengguna apa
yang harus dilakukan. Statemen pada baris 4 meminta pengguna untuk memasukkan
sebuah huruf; statemen pada baris 5 membaca dan menyimpan huruf tersebut ke dalam
variabel huruf. Loop while pada baris 7 memeriksa apakah
huruf tersebut adalah #. Jika huruf yang dimasukkan pengguna oleh pengguna
bukan #, tubuh loop while akan
dieksekusi. Statemen pada baris 8 menampilkan huruf yang dimasukkan oleh
pengguna. Statemen if pada baris 10
memeriksa apakah huruf yang dimasukkan pengguna adalah huruf besar. Elemen statemen dari if adalah statemen switch
(baris 11). Jika huruf yang dimasukkan oleh pengguna adalah huruf besar, elemen
ekspresi pada statemen if (pada baris 10) dievaluasi menjadi true dan statemen switch akan dieksekusi; jika huruf yang dimasukkan oleh pengguna
bukan huruf besar, maka statemen else
(baris 27) akan dieksekusi. Statemen-statemen pada baris 12 sampai 26
menentukan dijit telepon terkait.
Begitu huruf sekarang
diproses, statemen-statemen pada baris 29 dan 30 kembali menginformasikan
pengguna apa yang akan dilakukan selanjutnya. Statemen pada baris 31 meminta
pengguna untuk memasukkan sebuah huruf; statemen pada baris 32 membaca dan
menyimpan huruf tersebut ke dalam variabel huruf.
(Perhatikan bahwa statemen pada baris 29 sama dengan statemen pada baris 2 dan
bahwa statemen-statemen pada baris 30 sampai 33 sama dengan statemen-statemen
pada baris 3 sampai baris 6). Setelah statemen pada baris 33 (di akhir loop while) dieksekusi, kendali program
kembali ke awal loop while dan
proses yang sama diulangi kembali. Ketika pengguna memasukkan #, program akan
berhenti.
Perhatikan bahwa pada
program ini, variabel huruf
merupakan variabel kendali program. Pertama, ia diinisialisasi pada baris 5
oleh statemen masukan, dan kemudian ia diperbarui pada baris 32. Ekspresi pada
baris 7 memeriksa apakah huruf
adalah #.
Kasus 3: Loop while Terkendali-Bendera
Sebuah loop while terkendali-bendera menggunakan
variabel bool untuk mengendalikan
loop. Dimisalkan bahwa ditemukan
adalah sebuah variabel bool. Loop while terkendali-bendera mempunyai
bentuk berikut:
ditemukan = false; //inisialisasi
variabel kendali loop
while (!ditemukan) //menguji variabel kendali loop
{
.
.
.
if (ekspresi)
ditemukan = true; //memperbarui variabel kendali
loop
.
.
.
}
Variabel ditemukan, yang dipakai untuk
mengendalikan eksekusi atas loop while,
dikenal dengan variabel bendera.
Contoh 4.6 lebih lanjut
mengilustrasikan kegunaan dari loop while
terkendali-bendera.
Contoh 4.6
|
|
Permainan Tebak Angka
Program berikut secara
acak membangkitkan sebuah integer yang lebih besar dari atau sama dengan 0 dan
kurang dari 100. Program kemudian meminta pengguna untuk menebak angka. Jika
pengguna menebak angka secara benar, maka program akan menampilkan sebuah
pesan. Sebaliknya, program memeriksa angka yang ditebak kurang dari angka acak.
Jika angka yang ditebak kurang dari angka acak yang dibangkitkan oleh komputer,
maka program akan menampilkan pesan “Tebakan
Anda kurang dari angka. Tebak lagi!”. Sebaliknya, program akan menampilkan
pesan “Tebakan Anda lebih dari angka.
Tebak lagi!”. Program kemudian meminta pengguna untuk memasukkan angka
lain. Pengguna diminta untuk menebak angka acak sampai pengguna memasukkan
angka yang tepat.
Untuk membangkitkan
sebuah angka acak, Anda dapat menggunakan fungsi rand dari file header cstdlib.
Sebagai contoh, ekspresi rand()
menghasilkan sebuah nilai int yang
bernilai antara 0 dan 32767. Oleh karena itu, statemen:
cout << rand() << ", "
<< rand() << endl;
akan menampilkan dua
angka yang tampak seperti acak. Namun, setiap kali program dijalankan, statemen
ini akan menampilkan angka-angka acak yang sama. Ini karena fungsi rand menggunakan sebuah algoritma yang
menghasilkan runtun angka acak yang sama setiap kali program dieksekusi pada
sistem yang sama. Untuk menghasilkan angka-angka acak yang berbeda setiap kali
program dieksekusi, Anda juga dapat menggunakan fungsi srand dari file header cstdlib.
Fungsi srand mengambil sebuah nilai unsigned int sebagai masukan, yang
berperan sebagai biji tunas untuk algoritma. Dengan menspesifikasi nilai biji
yang berbeda, setiap kali program dieksekusi, fungsi srand akan membangkitkan
runtun angka acak yang berbeda. Untuk menspesifikasi tunas yang berbeda, Anda
dapat menggunakan fungsi time dari
file header ctime, yang menghasilkan
jumlah detik sejak 1 Januari 1970. Sebagai contoh, perhatikan beberapa statemen
berikut:
srand(time(0));
num = rand() % 100;
Statemen pertama
menetapkan tunas, dan statemen kedua membangkitkan sebuah angka acak yang lebih
dari atau sama dengan 0 dan bernilai kurang dari 100. Perhatikan bagaimana
fungsi time digunakan. Fungsi ini
digunakan dengan sebuah argumen, yaitu 0.
Program menggunakan
variabel bool, apaTertebak, untuk mengendalikan loop. Variabel bool, apaTertebak, diinisialisasi dengan false. Hal ini dimaksudkan agar ia dapat ditetapkan menjadi true ketika pengguna menebak angka yang
tepat.
//Loop while terkendali-bendera.
//Permainan tebak angka.
#include
<iostream>
#include
<cstdlib>
#include
<ctime>
using namespace
std;
int main()
{
//mendeklarasikan variabel-variabel
int angka; //variabel untuk menyimpan
//angka acak
int tebak; //variabel untuk menyimpan angka
//yang ditebak oleh pengguna
bool apaTertebak; //variabel bool untuk
//mengendalikan loop
srand(time(0)); //Baris
1
angka =
rand() % 100; //Baris
2
apaTertebak
= false; //Baris 3
while (!apaTertebak) //Baris 4
{ //Baris
5
cout
<< "Masukkan sebuah integer
yang lebih"
<< " dari atau sama
dengan 0 dan "
<< "kurang dari 100:
"; //Baris 6
cin
>> tebak; //Baris
7
cout
<< endl; //Baris
8
if (tebak == angka) //Baris 9
{ //Baris
10
cout
<< "Anda menebak "
<< "angka yang tepat."
<< endl; //Baris 11
apaTertebak = true; //Baris 12
} //Baris
13
else if (tebak < angka) //Baris 14
cout
<< "Tebakan Anda kurang dari
"
<< "angka.\n Tebak lagi!"
<< endl; //Baris
15
else //Baris
16
cout
<< "Tebakan Anda lebih dari
"
<< "angka.\n Tebak lagi!"
<< endl; //Baris
17
} //akhir
while //Baris
18
return 0;
}
Keluran Program:
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
45
Tebakan Anda lebih dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
20
Tebakan Anda kurang dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
35
Tebakan Anda lebih dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
28
Tebakan Anda kurang dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
32
Tebakan Anda lebih dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
30
Tebakan Anda lebih dari angka.
Tebak lagi!
Masukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 100:
29
Anda menebak angka yang tepat.
Program berikut bekerja
sebagai berikut: Statemen pada baris 2 menciptakan sebuah integer yang lebih
dari atau sama dengan 0 dan kurang dari 100 dan menyimpan angka ini ke dalam
variabel angka. Statemen pada baris
3 menetapkan variabel bool, apaTertebak, menjadi false. Elemen ekspresi pada loop while
pada baris 4 mengevaluasi ekspresi !apaTertebak.
Jika apaTertebak bernilai false, maka !apaTertebak bernilai true
dan tubuh loop while akan
dieksekusi; jika apaTertebak
bernilai true, maka !apaTertebak bernilai false, dan loop while akan berhenti.
Statemen pada baris 6
meminta pengguna untuk memasukkan sebuah integer yang lebih dari atau sama
dengan 0 dan kurang dari 0. Statemen pada baris 7 menyimpan angka yang
dimasukkan pengguna di dalam variabel tebak.
Elemen ekspresi pada statemen if pada baris 9 menentukan apakah nilai
tebak sama dengan angka, yaitu, apakah pengguna menebak
angka dengan tepat. Jika nilai tebak
sama dengan angka, maka statemen
pada baris 11 akan menampilkan pesan: Anda
menebak angka yang tepat.
Statemen pada baris 12
menetapkan variabel apaTertebak
menjadi true. Kendali program
kemudian kembali ke baris 3. Karena apaTertebak
bernilai true, maka !apaTertebak menjadi false dan loop while berhenti. Jika ekspresi pada baris 9 dievaluasi menjadi false, maka statemen else pada baris 14 menentukan apakah
nilai tebak bernilai kurang dari
atau sama dengan angka dan
menampilkan pesan yang sesuai.
Kasus 4: Loop while Terkendali-EOF
Jika file data sering
dimodifikasi (misalnya, jika data sering dihapus atau ditambah), maka hal
terbaik yang perlu dilakukan adalah tidak membaca data menggunakan nilai
sentinel. Seseorang bisa secara tidak sengaja menghapus nilai sentinel atau
menambahkan data di depan sentinel (jika nilai sentinel berada di awal file),
khususnya jika program dan petugas pemasuk data adalah orang yang berbeda.
Selain itu, adalah hal yang sulit untuk memilih nilai sentinel yang baik. Pada
situasi semacam itu, Anda dapat menggunakan loop while terkendali-EOF (end-of-file).
Sampai sekarang, Anda
telah menggunakan sebuah variabel aliran masukan, seperti cin, dan operator ekstraksi, >>,
untuk membaca dan menyimpan data ke dalam variabel. Namun, variabel aliran
masukan dapat pula menghasilkan sebuah nilai setelah pembacaan data, sebagai
berikut:
1. Jika
program telah meraih akhir data masukan, maka variabel aliran masukan akan
menghasilkan nilai logikal false.
2. Jika
program membaca data bermasalah (seperti sebuah nilai char dibaca ke dalam variabel int),
maka aliran masukan memasuki keadaan gagal. Begitu sebuah aliran memasuki
keadaan gagal, semua operasi I/O yang menggunakan aliran itu dianggap sebagai
operasi null; yaitu, tidak akan berpengaruh apapun. Sayangnya, komputer tidak
menghentikan program. Ia hanya melanjutkan eksekusi atas program, secara diam
mengabaikan semua operasi yang menggunakan aliran tersebut. Pada kasus ini,
variabel aliran masukan menghasilkan nilai false.
3.
Pada kasus selain (1) dan (2),
variabel aliran masukan menghasilkan nilai logikal true.
Anda dapat menggunakan
nilai yang dihasilkan oleh variabel aliran masukan untuk menentukan apakah
program telah meraih akhir data masukan atau tidak. Karena variabel aliran
masukan menghasilkan nilai logikal true
atau false, pada sebuah loop while, ia dapat dipandang sebagai
ekspresi logikal.
Berikut merupakan sebuah
contoh dari loop while
terkendali-EOF.
cin >> variabel; //inisialisasi
variabel kendali loop
while (cin) //menguji variabel
kendali loop
{
.
.
.
cin >> variabel; //memperbarui variabel kendali loop
.
.
.
}
Perhatikan bahwa di sini, variabel cin berperan sebagai variabel kendali loop.
Fungsi eof
Selain untuk memeriksa nilai dari sebuah variabel aliran
masukan, seperti cin, untuk menentukan apakah akhir file telah diraih atau
tidak, C++ menyediakan sebuah fungsi yang dapat Anda pakai dengan variabel
aliran masukan untuk menentukan status EOF. Fungsi ini dinamakan eof. Seperti fungsi I/O, seperti get, ignore, dan peek, yang
didiskusikan pada Bab 2, fungsi eof
merupakan anggota dari tipe data istream.
Sintaks dalam menggunakan fungsi eof adalah:
istreamVar.eof()
dimana di dalamnya istreamVar
merupakan sebuah variabel aliran masukan, seperti cin.
Dimisalkan bahwa Anda memiliki deklarasi:
ifstream infile;
Selanjutnya, dimisalkan bahwa Anda membuka sebuah file
menggunakan variabel infile.
Perhatikan ekspresi berikut:
infile.eof()
Ini merupakan sebuah ekspresi logikal (Boolean). Nilai dari
ekspresi ini adalah true jika
program telah membaca melewati akhir dari file masukan, infile; sebaliknya, nilai dari ekspresi ini adalah false.
Metode ini, yang menentukan status EOF (menggunakan fungsi
eof), dapat bekerja dengan baik jika masukan adalah teks.
Dimisalkan bahwa Anda memiliki deklarasi:
ifstream infile;
char
ch;
infile.open("inputDat.dat");
Loop while
berikut berlanjut dieksekusi sepanjang program belum meraih akhir file.
infile.get(ch);
while (!infile.eof())
{
cout << ch;
infile.get(ch);
}
Sepanjang program belum meraih akhir file, ekspresi:
infile.eof()
bernilai false
dan jadi ekspresi:
!infile.eof()
pada statemen while
bernilai true. Ketika program
membaca melampaui akhir file masukan, ekspresi:
infile.eof()
menjadi true, jadi ekspresi:
!infile.eof()
pada statemen while
menjadi false dan loop berhenti.
Contoh 4.7
|
|
Kode berikut menggunakan sebuah loop while terkendali-EOF untuk menemukan penjumlah atas sederet angka:
int jum = 0;
int angka;
cin >> angka;
while (cin)
{
jum = jum + angka; //Menambahkan angka pada jum
cin >> num; //Mendapatkan angka berikutnya
}
cout << "Jum = " << jum <<
endl;
Contoh 4.8
|
|
Dimisalkab bahwa Anda diberikan sebuah file yang memuat
nama-nama mahasiswa dan skor ujian masing-masing, sebuah angka antara 0 dan
100. Setiap baris di dalam file memuat nama seorang mahasiswa yang diikuti oleh
skor ujiannya. Anda ingin sebuah program yang menampilkan nama tiap mahasiswa
yang diikuti dengan skor ujian yang diikuti dengan nilai. Program juga perlu
menampilkan rerata skor ujian untuk kelas. Perhatikan program berikut:
// Program ini membaca data dari sebuah file yang
memuat nama-nama
// mahasiswa dan skor ujian masing-masing. Program
menampilkan nama
// tiap mahasiswa yang diikuti oleh skor ujian yang
diikuti oleh nilai.
// Program juga menampilkan rerata skor ujian untuk
semua mahasiswa.
#include
<iostream> //Baris
1
#include
<fstream> //Baris
2
#include
<string> //Baris
3
#include
<iomanip> //Baris
4
using namespace
std; //Baris
5
int main() //Baris
6
{ //Baris
7
//Mendeklarasikan variabel-variabel untuk memanipulasi data
string namaPertama; //Baris 8
string namaAkhir; //Baris
9
double skorUjian; //Baris
10
char nilai = ' '; //Baris 11
double jum = 0; //Baris 12
int hitung = 0; //Baris 13
//Mendeklarasikan variabel-variabel aliran
ifstream
inFile; //Baris
14
ofstream
outFile; //Baris
15
//Membuka
file masukan
inFile.open("Bab5Data.txt");
//Baris 16
if (!inFile) //Baris 17
{ //Baris
18
cout
<< "Tidak dapat membuka file
masukan. "
<< "Program berhenti!"
<< endl; //Baris 19
return 1; //Baris 20
} //Baris
21
//Membukan
file keluaran
outFile.open("Bab5Data.out");
//Baris 22
outFile
<< fixed << showpoint << setprecision(2); //Baris 23
inFile
>> namaPertama >> namaAkhir; //membaca nama //Baris 24
inFile
>> skorUjian; //membaca skor ujian //Baris
25
while (inFile) //Baris 26
{ //Baris
27
jum =
jum + skorUjian; //memperbarui jum //Baris
28
hitung++; //menginkremen hitung //Baris
29
//menentukan nilai
switch (static_cast<int> (skorUjian) / 10) //Baris 30
{ //Baris
31
case 0: //Baris 32
case 1: //Baris 33
case 2: //Baris 34
case 3: //Baris 35
case 4: //Baris 36
case 5: //Baris 37
nilai = 'F'; //Baris
38
break; //Baris
39
case 6: //Baris 40
nilai = 'D'; //Baris
41
break; //Baris 42
case 7: //Baris 43
nilai = 'C'; //Baris
44
break; //Baris
45
case 8: //Baris 46
nilai = 'B'; //Baris
47
break; //Baris
48
case 9: //Baris 49
case 10: //Baris 50
nilai = 'A'; //Baris
51
break; //Baris
52
default: //Baris 53
cout << "Skor
tak-valid." << endl; //Baris
54
}//akhir
switch //Baris
55
outFile
<< left << setw(12) << namaPertama
<< setw(12) << namaAkhir
<< right << setw(4) << skorUjian
<< setw(2) << nilai << endl; //Baris 56
inFile
>> namaPertama >> namaAkhir; //membaca nama //Baris 57
inFile
>> skorUjian; //membaca skor ujian //Baris
58
}//akhir
while //Baris
59
outFile
<< endl; //Baris
60
if (hitung != 0) //Baris
61
outFile
<< "Rerata kelas: "
<< jum / hitung
<<endl; //Baris
62
else //Baris
63
outFile
<< "Tidak ada data."
<< endl; //Baris 64
inFile.close(); //Baris
65
outFile.close(); //Baris
66
return 0; //Baris 67
}
Keluaran Program:
File Masukan:
Lilis Cecilia 89
Patricia Siahaan 91.5
Gerard Siahaan 85.5
Jody Pratama 76.5
Rico Chandra 73
Hamzan Wadi 88.5
File Keluaran:
Lilis
Cecilia 89.00 B
Patricia
Siahaan 91.50 A
Gerard
Siahaan 85.50 B
Jody
Pratama 76.50 C
Rico
Chandra 73.00 C
Hamzan
Wadi 88.50 B
Rerata kelas: 84.00
Program tersebut bekerja sebagai berikut. Statemen-statemen
pada baris 8 sampai 13 mendeklarasikan dan menginisialisasi variabel-variabel
yang diperlukan program. Statemen pada baris 14 dan 15 mendeklarasikan inFile sebagai sebuah variabel ifstream dan outFile sebagai sebuah variabel ofstream. Statemen pada baris 16 membuka file masukan menggunakan
variabel inFile. Jika file masukan
tidak ada, maka statemen-statemen pada baris 17 sampai 21 akan menampilkan
sebuah pesan yang sesuai dan menghentikan program. Statemen pada baris 22
membuka file keluaran menggunakan outFile.
Statemen pada baris 23 menetapkan keluaran dari angka-angka
titik-mengambang dalam dua dijit di
belakang titik desimal dengan format tetap dan nol-nol pengekor.
Statemen-statemen pada baris 24 dan 25 dan loop while pada baris 26 membaca nama
pertama, nama akhir, dan skor ujian tiap mahasiswa dan menampilkan nama diikuti
oleh skor ujian yang diikuti oleh nilai. Secara spesifik, statemen-statemen
pada baris 24 dan 27 membaca nama pertama dan nama akhir; statamen pada baris
25 dan 58 membaca skor ujian. Statemen pada baris 28 memperbarui nilai jum. (Setelah membaca semua data, nilai
jum menyimpan penjumlahan atas semua
skor ujian). Statemen pada baris 29 memperbarui nilai hitung. (Variabel hitung menyimpan jumlah mahasiswa di dalam
kelas). Statemen switch dari baris
30 sampai 55 menentukan nilai dari skorUjian
dan menyimpannya di dalam variabel nilai.
Statemen pada baris 56 menampilkan nama pertama, nama akhir, skor ujian, dan
nilai tiap mahasiswa.
Statemen if...else
pada baris 61 sampai 64 menampilkan rerata kelas dan statemen-statemen pada
baris 65 dan 66 menutup file-file.
Sekali Lagi, Ekspresi pada Statemen while
Pada beberapa contoh terdahulu, ekspresi pada statemen while cukup sederhana. Dengan kata
lain, loop while dikendalikan oleh
sebuah variabel tunggal. Namun, ada beberapa situasi ketika ekspresi pada
statemen while bisa lebih kompleks.
Sebagai contoh, program pada contoh 4.6 menggunakan sebuah
loop while terkendali-bendera untuk mengimplementasikan permainan menebak
angka. Namun, program memberikan kesempatan sebanyak mungkin kepada pengguna
untuk menebak angka dengan tepat. Dimisalkan bahwa Anda ingin memberikan
kesempatan tidak lebih dari lima kali percobaan kepada pengguna dalam menebak
angka. Jika pengguna tidak dapat menebak angka dengan benar dalam lima kali
percobaan, maka program akan menampilkan angka acak yang dibangkitkan program
berikut dengan sebuah pesan yang mengindikasikan bahwa Anda telah kalah dalam
permainan. Pada kasus ini, Anda dapat menuliskan loop while sebagai berikut (diasumsikan bahwa jlhTebakan merupakah sebuah variabel int yang diinisialisasi dengan 0):
while ((jlhTebakan < 5) && (!apaTertebak))
{
cout << "Masukkan sebuah integer yang lebih dari
atau sama "
<< "dengan 0 dan kurang 100: ";
cin >> tebakan;
cout << endl;
jlhTebakan++;
if (tebakan == angka)
{
cout << "Menang!.
Anda menebak angka dengan tepat."
<< endl;
apaTertebak = true;
}
else if (guess < num)
cout << "Tebakan Anda kurang dari angka.\n"
<< "Tebak lagi!" << endl;
else
cout << " Tebakan Anda lebih dari angka.\n"
<< " Tebak lagi!" << endl;
}//akhir while
Anda juga memerlukan kode berikut untuk dicantumkan yang
ditempatkan setelah loop while untuk
mengantisipasi ketika pengguna tidak dapat menebak angka dengan tepat dalam
lima kali percobaan.
if (!apaTertebak)
cout << "Kalah! Angka yang tepat adalah " << angka << endl;
Seperti yang dapat Anda lihat dari loop while tersebut, ekspresi pada sebuah statemen while bisa dibuat kompleks. Tujuan utama dari loop while adalah untuk mengulangi eksekusi
terhadap statemen (beberapa statemen) sampai kondisi tertentu terpenuhi.
CONTOH PEMROGRAMAN: Bilangan
Fibonacci
Sejauh ini, Anda telah melihat beberapa contoh loop. Ingat
bahwa dalam C++, loop while dipakai
ketika statemen (atau beberapa statemen) tertentu dieksekusi secara berulang
sampai kondisi tertentu terpenuhi. Berikut adalah sebuah program C++ yang
menggunakan sebuah loop while untuk
menemukan bilangan Fibonacci.
Perhatikan runtun angka berikut:
1, 1, 2, 3, 5, 8, 13, 21, 34, ....
Jika diberikan dua angka pertama dari runtun (katakanlah,
dan
), maka angka ke-n
n >=
3, dari runtun ini diberikan oleh:
Jadi:
dan seterusnya.
Runtun semacam itu dinamakan dengan runtun Fibonacci. Dalam
runtun tersebut,
dan
. Namun, jika diberikan
sembarang dua angka pertama, dengan menggunakan proses ini, maka Anda dapat
menentukan angka ke-n,
n >=
3, dari runtun. Angka yang ditentukan dengan cara ini dinamakan dengan
bilangan Fibonacci. Dimisalkan bahwa
dan
.
Maka:
Selanjutnya, Anda bisa menulis sebuah program yang
menentukan angka Fibonacci ke-n bila diberikan dua angka pertama.
Masukan: Dua angka Fibonacci pertama dan angka Fibonacci yang
diinginkan.
Keluaran: Angka Fibonacci ke-n.
Analisa
Masalah dan Perancangan Algoritma
Untuk menemukan, katakanlah, angka Fibonacci kesepuluh dari
sebuah runtun, Anda harus terlebih dahulu mencari
dan
, yang mensyaratkan Anda
untuk menemukan
dan
, dan seterusnya. Oleh
karena itu, untuk menemukan
, Anda terlebih dahulu
menemukan
,
,
, ...,
. Diskusi ini kemudian
diterjemahkan ke dalam algoritma berikut:
1.
Mendapatkan
dua angka Fibonacci pertama.
2.
Mendapatkan
angka Fibonacci yang diinginkan. Yaitu, mendapatkan posisi, n, dari angka Fibonacci di dalam
runtun.
3.
Menghitung
angka Fibonacci berikutnya dengan menambahkan dua elemen sebelumnya dari runtun
Fibonacci.
4.
Mengulangi
langkah 3 sampai angka Fibonacci ke-n ditemukan.
5. Menampilkan angka Fibonacci ke-n.
Perhatikan bahwa program mengasumsikan bahwa angka pertama dari
runtun Fibonacci bernilai kurang dari atau sama dengan angka kedua dari runtun
Fibonacci, dan kedua angka bernilai tak-negatif. Selain itu, program juga mengasumsikan bahwa
pengguna memasukkan sebuah nilai valid (integer positif) untuk posisi dari angka
yang diperlukan dalam runtun Fibonacci.
Variabel
Karena dua angka terakhir harus diketahui untuk menemukan
angka Fibonacci sekarang, Anda perlu variabel-variabel berikut: dua variabel,
yaitu sebelumnya1 dan sebelumnya2 untuk memuat dua angka
sebelumnya dari runtun Fibonacci; dan satu variabel, sekarang, untuk menampung angka Fibonacci sekarang. Jumlah berapa
kali algoritma mengulangi langkah 3 bergantung pada posisi dari angka Fibonacci
yang Anda hitung. Sebagai contoh, jika Anda ingin menghitung angka Fibonacci
kesepuluh, maka Anda harus mengeksekusi langkah 3 delapan kali. Ingat bahwa
pengguna memberikan dua angka pertama dari runtun Fibonacci. Oleh karena itu,
Anda memerlukan sebuah variabel untuk menyimpan jumlah berapa kali langka 3
perlu dieksekusi. Anda juga memerlukan sebuah variabel untuk menjejak jumlah
berapa kali langkah 3 telah dieksekusi, variabel kendali loop. Oleh karena itu,
Anda memerlukan lima variabel untuk manipulasi data:
int sebelumnya1; //variabel untuk
menyimpan angka Fibonacci pertama
int sebelumnya2;
//variabel untuk menyimpan angka
Fibonacci kedua
int sekarang;
//variabel untuk menyimpan angka
Fibonacci
//sekarang
int kounter; //variabel
kendali loop
int fibonacciKe_n; //variabel untuk memuat
angka Fibonacci
//yang
diinginkan
Untuk menghitung angka Fibonacci ketiga, Anda perlu
menambahkan nilai sebelumnya1 dan sebelumnya2 dan menyimpan hasilnya di
dalam sekarang. Untuk menghitung
angka Fibonacci keempat, Anda perlu menjumlahkan nilai dari angka Fibonacci
kedua (sebelumnya2) dan nilai dari
angka Fibonacci ketiga (sekarang).
Jadi, ketika angka Fibonacci keempat dihitung, Anda tidak lagi memerlukan angka
Fibonacci pertama. Daripada harus mendeklarasikan variabel-variabel tambahan,
yang akan menjadi terlalu banyak, setelah menghitung sebuah angka Fibonacci
dalam menentukan angka Fibonacci berikutnya, sekarang akan menjadi sebelumnya2
dan sebelumnya2 menjadi sebelumnya1. Oleh karena itu, Anda
dapat menggunakan sekarang untuk
menyimpan angka Fibonacci berikutnya. Proses ini diulangi sampai angka
Fibonacci yang diinginkan selesai dihitung. Awalnya, sebelumnya1 dan sebelumnya2
merupakan dua elemen pertama dari runtun, yang disediakan oleh pengguna. Dari
diskusi ini, dapat dipahami bahwa Anda membutuhkan kelima variabel tersebut.
Algoritma
Utama
1.
Meminta
pengguna untuk memasukkan dua angka pertama, yaitu sebelumnya1 dan sebelumnya2.
2.
Membaca
dua angka pertama ke dalam sebelumnya1
dan sebelumnya2.
3.
Menampilkan
dua angka Fibonacci pertama.
4.
Meminta
pengguna untuk memasukkan posisi dari angka Fibonacci yang diinginkan.
5.
Membaca
posisi dari angka Fibonacci yang diinginkan ke dalam fibonacciKe_n.
6.
a. if (fibonacciKe_n == 1)
angka Fibonacci yang diinginkan adalah
angka Fibonacci pertama.
b. else
if (fibonacciKe_n == 2)
angka Fibonacci yang diinginkan adalah
angka Fibonacci kedua. Nilai
sebelumnya2
disalin ke sekarang.
c. else menghitung angka Fibonacci yang
diinginkan sebagai berikut:
Karena
Anda telah mengetahui dua angka Fibonacci pertama dari runtun, maka angka
Fibonaci ketiga yang mulai dihitung.
i.
Menginisialisasi
kounter dengan 3 untuk menjejak
angka Fibonacci yang telah dihitung.
ii.
Menghitung
angka Fibonacci berikutnya, sebagai berikut: sekarang = sebelumnya2 + sebelumnya1.
iii.
Menugaskan
nilai sebelumnya2 kepada sebelumnya1.
iv.
Menugaskan
nilai sekarang kepada sebelumnya2.
v.
Menginkremen
kounter.
Mengulangi langkah ii sampai v sampai angka Fibonacci yang
diinginkan selesai dihitung.
Loop while
berikut mengeksekusi langkah ii sampai v dan menentukan angka Fibonacci ke-n.
while (kounter <= fibonacciKe_n)
{
sekarang = sebelumnya2 + sebelumnya1;
sebelumnya1 = sebelumnya2;
sebelumnya2 = sekarang;
sekarang++;
}
7. Menampilkan angka fibonacciKe_n, yang merupakan nilai sekarang.
//***************************************************************
// Program: angka
Fibonacci ke-n.
// Jika diberikan
dua angka pertama dari runtun Fibonacci, maka
// program ini
menentukan dan menampilkan angka yang diinginkan
// dari runtun
Fibonacci.
//***************************************************************
#include <iostream>
using namespace std;
int main()
{
//Mendeklarasikan variabel-variabel
int
sebelumnya1;
int
sebelumnya2;
int
sekarang;
int
kounter;
int
fibonacciKe_n;
cout << "Masukkan dua angka Fibonacci
"
<< "pertama: "; //Langkah
1
cin >> sebelumnya1 >>
sebelumnya2; //Langkah 2
cout << endl;
cout << "Dua angka Fibonacci pertama adalah "
<< sebelumnya1 << " and " << sebelumnya2
<< endl; //Langkah 3
cout << "Masukkan posisi dari angka "
<< "Fibonacci yang diinginkan:
"; //Langkah 4
cin >> fibonacciKe_n; //Langkah 5
cout << endl;
if (fibonacciKe_n == 1) //Langkah 6.a
sekarang = sebelumnya1;
else
if (fibonacciKe_n == 2) //Langkah 6.b
sekarang = sebelumnya2;
else
//Langkah
6.c
{
kounter = 3; //Langkah 6.c.i
//Langkah 6.c.ii - 6.c.v
while
(kounter <= fibonacciKe_n)
{
sekarang = sebelumnya2 +
sebelumnya1; //Langkah 6.c.ii
sebelumnya1 = sebelumnya2; //Langkah 6.c.iii
sebelumnya2 = sekarang; //Langkah 6.c.iv
kounter++; //Langkah 6.c.v
}//akhir while
}//akhir else
cout << "Angka Fibonacci pada posisi ke "
<< fibonacciKe_n << "
adalah " << sekarang
<< endl; //Langkah 7
return
0;
}//akhir main
Keluaran Program 1:
Masukkan dua angka Fibonacci pertama: 12 16
Dua angka Fibonacci pertama adalah 12 and 16
Masukkan posisi dari angka Fibonacci yang diinginkan:
10
Angka Fibonacci pada posisi ke 10 adalah 796
Keluaran Program 2:
Masukkan dua angka Fibonacci pertama: 1 1
Dua angka Fibonacci pertama adalah 1 and 1
Masukkan posisi dari angka Fibonacci yang diinginkan:
15
Angka Fibonacci pada posisi ke 15 adalah 610
Struktur Repetisi for
Loop while yang
didiskusikan pada bagian sebelumnya merupakan mekanisme yang cukup dalam
mengimplementasikan repetisi. Struktur repetisi for dalam C++ yang didiskusikan di sini merupakan bentuk
terspesialisasi dari loop while.
Tujuan utamanya adalah menyederhanakan penulisan loop terkendali-kounter.
Karena alasan ini, loop for umumnya dikenal dengan loop for
berindeks.
Bentuk umum dari statemen for adalah:
for (statemen awal; kondisi loop; statemen
pembaruan)
statemen
Gambar 4.2 Loop for
Elemen statemen awal,
kondisi loop, dan statemen pembaruan (dinamakan pula
sebagai statemen kendali loop) yang diapit di dalam kurung bertugas untuk
mengendalikan tubuh (statemen) dari
statemen for. Gambar 4.2 menunjukkan
aliran eksekusi pada sebuah loop for.
Loop for dieksekusi
sebagai berikut:
1.
Elemen
statemen awal dieksekusi.
2.
Elemen
kondisi loop dievaluasi. Jika kondisi loop dievaluasi menjadi true:
i.
Elemen
statemen loop for dieksekusi.
ii.
Elemen
statemen pembaruan dieksekusi
(ekspresi ketiga di dalam kurung).
3.
Langkah
2 diulangi sampai kondisi loop dievaluasi menjadi false.
Elemen statemen awal biasanya bertugas untuk
menginisialisasi sebuah variabel (dinamakan dengan variabel kendali loop for atau variabel berindeks loop for).
Dalam C++, for
merupakan katakunci.
Contoh 4.9
|
|
Loop for berikut menampilkan 10 integer tak-negatif pertama:
for (i = 0; i < 10; i++)
cout << i <<
" ";
cout << endl;
Elemen statemen awal,
i = 0, menginisialisasi variabel int, i, dengan 0. Selainjutnya, elemen kondisi loop, i < 10,
dievaluasi. Karena 0 < 10 bernilai true,
statemen untuk menampilkan dieksekusi dan menampilkan 0. Elemen statemen pembaruan, i++, kemudian dieksekusi, yang
menetapkan nilai i menjadi 1. Sekali
lagi, kondisi loop dieksekusi, yang
masih bernilai true, dan seterusnya.
Ketika i menjadi 10, kondisi loop dievaluasi menjadi false, loop for berhenti, dan statemen yang mengikuti loop for dieksekusi.
Sebuah loop for
dapat memiliki statemen sederhana tunggal atau statemen gabungan (blok
statemen). Contoh berikut lebih lanjut mengilustrasikan bagaimana sebuah loop for dieksekusi.
Contoh 4.10
|
|
1. Loop for
berikut menampilkan Hallo! dan
sebuah bintang (pada baris terpisah) sebanyak lima kali:
for (i = 1; i <= 5; i++)
{
cout << "Hallo!" << endl;
cout << "*" << endl;
}
2. Perhatikan loop for berikut:
for (i = 1; i <= 5; i++)
cout << "Hallo!" << endl;
cout << "*" << endl;
Loop ini menampilkan Hallo!
sebanyak lima kali dan bintang sebanyak sekali saja. Perhatikan bahwa loop for mengendalikan hanya statemen
keluaran pertama karena kedua statemen keluaran tidak dijadikan statemen
gabungan (blok statemen). Oleh karena itu, statemen keluaran pertama dieksekusi
sebanyak lima kali karena tubuh loop for
dieksekusi lima kali. Setelah loop for
dieksekusi, statemen keluaran kedua dieksekusi hanya sekali.
Contoh 4.11
|
|
Loop for berikut
mengeksekusi lima statemen kosong:
for (i = 0; i < 5; i++); //Baris
1
cout << "*" << endl; //Baris 2
Semikolon (titik-koma) di akhir statemen for (sebelum statemen keluaran pada
baris 1) menghentikan loop for. Aksi
untuk loop for ini adalah kosong,
atau null.
Beberapa contoh terdahulu menunjukkan bahwa kehati-hatian
diperlukan dalam memanfaatkan loop for
untuk melakukan aksi yang diinginkan.
Berikut adalah beberapa poin pada loop for:
·
Jika
kondisi loop awalnya false, tubuh
loop tidak akan pernah dieksekusi.
·
Elemen
statemen pembaruan, ketika
dieksekusi, akan mengubah nilai dari variabel kendali loop (diinisialisasi oleh
statemen awal), yang pada akhirnya
akan menetapkan nilai dari kondisi loop
menjadi false. Tubuh loop for dieksekusi dengan tak-terhingga
banyaknya jika kondisi loop selalu
bernilai true.
·
Meskipun
C++ membolehkan Anda untuk menggunakan nilai pecahan untuk variabel kendali
loop dengan tipe double (atau
sembarang tipe data riil). Karena sistem komputer yang berbeda dapat memberikan
hasil berbeda dari variabel kendali loop, disarankan Anda menghindari
penggunaan variabel semacam itu.
·
Semikolon
di akhir statemen for (tepat sebelum
tubuh loop) merupakan error semantik. Pada kasus ini, aksi dari loop for adalah kosong.
·
Pada
statemen for, jika kondisi loop diabaikan, maka ia
diasumsikan bernilai true.
·
Pada
statemen for, Anda dapat mengabaikan
ketiga statemen, yaitu statemen awal,
kondisi loop, dan statemen pembaruan. Berikut adalah loop
for yang legal:
for (;;)
cout << "Hallo" <<
endl;
Ini
merupakan sebuah loop for
tak-terhingga, yang secara kontinyu akan menampilkan kata Hallo.
Berikut merupakan contoh-contoh lain dari loop for.
Contoh 4.12
|
|
Anda dapat menghitung mundur menggunakan sebuah loop for jika ketiga statemen kendali loop
for ditetapkan dengan benar. Sebagai contoh, perhatikan loop for berikut:
for (i = 10; i >= 1; i--)
cout << " "
<< i;
cout << endl;
Keluarannya adalah:
10 9 8 7 6 5
4 3 2 1
Pada loop for
ini, variabel i diinisialisasi
dengan 10. Setelah tiap iterasi loop dilakukan, i didekremen sebesar 1. Loop terus dieksekusi sepanjang i >= 1.
Contoh 4.13
|
|
Anda dapat menginkremen (atau mendekremen) variabel kendali
loop for sebesar sembarang integer.
Pada loop for berikut, variabel i diinisialisasi dengan 1; di akhir
loop for, i diinkremen sebesar 2. Loop for
ini menampilkan 10 integer ganjil pertama.
for (i = 1; i <= 20; i = i + 2)
cout << " "
<< i;
cout << endl;
Contoh 4.14
|
|
Dimisalkan bahwa i
merupakan sebuah variabel int.
1. Perhatikan loop for berikut:
for (i = 10; i <= 9; i++)
cout << i <<
" ";
cout << endl;
Pada loop for
ini, statemen awal menetapkan i
menjadi 10. Karena awalnya kondisi loop (i
<= 9) bernilai false, maka
tidak ada apapun yang terjadi.
2. Perhatikan loop for berikut:
for (i = 9; i >= 10; i--)
cout << i <<
" ";
cout << endl;
Pada loop for
ini, statemen awal menetapkan i
menjadi 9. Karena awalnya kondisi loop (i
>= 10) bernilai false, maka
tidak ada apapun yang terjadi.
3. Perhatikan loop for berikut:
for (i = 10; i <= 10; i++) //Baris
1
cout << i <<
" "; //Baris 2
cout << endl; //Baris
3
Pada loop for
ini, statemen awal menetapkan i
menjadi 10. Kondisi loop (i <= 10)
dievaluasi menjadi true, jadi statemen
keluaran pada baris 2 dieksekusi, yang menampilkan 10.
Selanjutnya, statemen pembaruan menginkremen nilai i sebesar 1, sehingga nilai i menjadi 11. Sekarang, kondisi loop
dievaluasi menjadi false dan loop for berhenti. Perhatikan bahwa statemen
keluaran pada baris 2 dieksekusi hanya sekali.
4. Perhatikan loop for berikut:
for (i = 1; i <= 10; i++); //Baris
1
cout << i <<
" "; //Baris 2
cout << endl; //Baris
3
Loop for ini
tidak memiliki pengaruh apapun pada statemen keluaran pada baris 2. Semikolon
di akhir statemen for menghentikan
loop for; aksi dari loop for ini adalah kosong. Statemen
keluaran berdiri sendiri dan dieksekusi hanya sekali.
5. Perhatikan loop for berikut:
for (i = 1; ; i++)
cout << i <<
" ";
cout << endl;
Pada loop for
ini, karena kondisi loop diabaikan dari statemen for, kondisi loop selalu bernilai true. Ini merupakan sebuah loop tak-terhingga.
Contoh 4.15
|
|
Pada contoh ini, sebuah loop for membaca lima angka dan mencari penjumlahan dan reratanya.
Perhatikan kode program C++ berikut, dimana i, angkaBaru, jum, dan rerata adalah variabel int.
jum = 0;
for (i = 1; i <= 5; i++)
{
cin >> angkaBaru;
jum = jum + angkaBaru;
}
rerata = jum / 5;
cout << "Penjumlahan
adalah " << jum << endl;
cout << "Rerata adalah " << rerata
<< endl;
Pada loop for
tersebut, setelah membaca sebuah angkaBaru,
nilai ini ditambahkan pada penjumlahan atas semua angka yang telah dibaca
sebelumnya (sebelum angka sekarang). Variabel jum diinisialisasi dengan 0
sebelum loop for dieksekusi. Jadi, setelah program membaca angka pertama dan
menambahkannya pada nilai jum,
variabel jum memuat penjumlahan atas
angka pertama.
Contoh 4.16
|
|
Contoh Pemrograman: Angka Fibonacci yang telah diberikan pada bagian terdahulu
menggunakan sebuah loop while untuk
menentukan angka Fibonacci yang diinginkan. Anda dapt mengganti loop while tersebut dengan loop for ekivalen sebagai berikut:
for (kounter = 3; kounter <= fibonacciKe_n; kounter++)
{
sekarang = sebelumnya2 + sebelumnya1;
sebelumnya1 = sebelumnya2;
sebelumnya2 = sekarang;
kounter++;
}//akhir for
Pada program C++ berikut, Anda direkomendasikan untuk
menjejaknya langkah demi langkah.
Contoh 4.17
|
|
Program C++ berikut menghitung penjumlahan atas n integer positif pertama.
//Program untuk menentukan penjumlahan atas n integer
positif pertama.
#include
<iostream>
using namespace
std;
int main()
{
int kounter; //variabel kendali loop
int jum; //variabel untuk menyimpan penjumlahan
int n; //variabel
untuk menyimpan jumlah angka
//positif yang akan dijumlahkan
cout
<< "Baris 1: Masukkan jumlah
integer "
<< "positif yang akan
ditambahkan: "; //Baris
1
cin >>
n; //Baris
2
jum = 0; //Baris
3
cout
<< endl; //Baris
4
for (kounter = 1; kounter <= n;
kounter++) //Baris 5
jum =
jum + kounter; //Baris
6
cout
<< "Baris 7: Penjumlahan atas
" << n
<< " integer positif
pertama adalah " << jum
<< endl; //Baris
7
return 0;
}
Keluaran Program:
Baris 1: Masukkan jumlah integer positif yang akan
ditambahkan: 100
Baris 7: Penjumlahan atas 100 integer positif pertama
adalah 5050
Statemen pada baris 1 meminta pengguna untuk memasukkan
sejumlah angka positif untuk dijumlahkan. Statemen pada baris 2 menyimpan angka
yang dimasukkan oleh pengguna di dalam n,
dan statemen pada baris 3 menginisialisasi jum dengan 0. Loop for pada baris 5 dieksekusi sebanyak n kali. Pada loop for, kounter
diinisialisasi dengan 1 dan diinkremen sebesar 1 setiap kali iterasi loop. Oleh
karena itu, kounter mempunyai
rentang dari 1 sampai n. Setiap kali
loop beriterasi, nilai kounter
ditambahkan pada jum. Variabel jum sebelumnya diinisialisasi dengan 0,
kounter memiliki rentang 1 sampai n, dan nilai sekarang dari kounter ditambahkan pada jum. Oleh karena itu, setelah loop for selesai dieksekusi, jum akan memuat
penjumlahan atas n nilai (integer
positif) pertama.
CONTOH PEMROGRAMAN: Klasifikasi
Angka
Program ini membaca sejumlah integer dan kemudian
menampilkan jumlah integer ganjil dan jumlah integer genap. Ia juga menampilkan
jumlah nol.
Program akan membaca 20 integer, tetapi Anda dapat dengan
mudah memodifikasinya untuk membaca sejumlah integer. Anda dapat memodifikasi
program sehingga ia pertama-tama meminta pengguna untuk menetapkan berapa
banyak integer yang akan dibaca.
Masukan: 20 integer, yaitu positif, negatif, atau nol.
Keluaran: Jumlah nol, jumlah genap, dan jumlah ganjil.
Analisa
Masalah dan Perancangan Algoritma
Setelah membaca sebuah angka, Anda perlu memeriksa apakah ia
genap atau ganjil. Dimisalkan bahwa
nilai tersebut disimpan di dalam angka.
Anda membagi angka dengan 2 untuk
memeriksa sisa pembagian. Jika sisa 0, maka angka genap. Anda selanjutnya menginkremen kounter genap dan
kemudian memeriksa apakah angka
adalah 0. Jika ya, Anda menginkremen kounter nol. Jika sisa bukan 0, makan
kounter ganjil diinkremen.
Program menggunakan sebuah statemen switch untuk memutuskan apakah angka
gajil atau genap. Dimisalkan bahwa angka
adalah ganjil. Pembagian dengan 2 akan menghasilkan sisa pembagian 1 jika angka positif dan angka -1 jika ia negatif. Jika angka genap, maka pembagian dengan 2
menghasilkan sisa 0, tidak memandang apakah angka positif atau negatif. Anda dapat menggunakan operator mod, %, untuk menemukan sisa pembagian.
Sebagai contoh,
6 % 2 = 0; -4 % 2 = 0; -7 % 2 = -1; 15 % 2 = 1
Proses yang sama diulangi untuk menganalisa sebuah angka
pada daftar. Diskusi ini dapat diterjemahkan ke dalam algoritma berikut:
1.
Untuk
tiap angka di dalam daftar:
a. Mendapatkan angka.
b. Menganalisa angka.
c. Menginkremen kounter tertentu.
2. Menampilkan hasil.
Variabel
Karena Anda ingin menghitung jumlah nol, jumlah angka genap,
dan jumlah angka ganjil, Anda memerlukan tiga variabel int, yaitu nol, genap, dan ganjil. Anda juga akan memerlukan sebuah variabel, yaitu angka, untuk membaca dan menyimpan
angka yang akan dianalisa dan sebuah variabel lain, kounter, untuk menghitung angka-angka yang telah dianalisa. Oleh
karena itu, Anda memerlukan variabel-variabel berikut di dalam program.
int kounter; //variabel
kendali loop
int angka; //variabel untuk
menyimpan angka yang dibaca
int nol; //variabel untuk
menyimpang jumlah angka nol
int genap; //variabel untuk
menyimpang jumlah angka genap
int ganjil; //variabel untuk
menyimpang jumlah angka ganjil
Jelaslah bahwa Anda harus menginisialisasi variabel nol, genap, dan ganjil dengan
0. Anda dapat menginisialisasinya ketika mendeklarasikannya.
Algoritma
Utama
1.
Menginisialisasi
variabel-variabel.
2.
Meminta
pengguna memasukkan 20 angka.
3.
Untuk
tiap angka di dalam daftar:
a. Membaca angka.
b. Menampilkan angka yang dibaca.
c. Jika angka genap:
i.
Menginkremen
jumlah angka genap.
ii.
Jika
angka nol, maka penghitungan nol diinkremen.
sebaliknya
Menginkremen jumlah angka ganjil.
4.
Menampilkan
hasil.
Sebelum menuliskan program C++, Anda perlu menjelaskan
langkah 1 – 4 dengan lebih detil. Hal ini untuk memudahkan Anda ketika
menuliskan instruksi-instruksi dalam C++.
1.
Menginisialisasi
variabel-variabel. Anda dapat menginisialisasi variabel nol, genap, dan ganjil ketika mendeklarasikannya.
2.
Menggunakan
sebuah statemen keluaran untuk meminta pengguna memasukkan 20 angka.
3. Untuk langkah 3, Anda dapat
menggunakan sebuah loop for dalam memproses dan menganalisa 20 angka. Dalam pseudocode, langkah ini ditulis sebagai
berikut:
for (kounter = 1; kounter <= 20; kounter++)
{
membaca angka;
menampilkan angka;
switch (angka % 2) // memeriksa sisa pembagian
{
case 0:
menginkremen genap;
if (number == 0)
menginkremen nol;
break;
case 1:
case –1:
menginkremen ganjil;
}//akhir switch
}//akhir for
4.
Menampilkan
hasil. Menampilkan nilai dari variabel nol,
genap, dan ganjil.
Program
Utuh
//************************************************************
// Program:
Menghitung, jumlah angka nol, ganjil, dan genap
// Program ini
menghitung jumlah angka ganjil dan angka genap.
// Program juga
menghitung angka nol.
//************************************************************
#include <iostream>
#include <iomanip>
using namespace std;
const int N = 20;
int main()
{
//Mendeklarasikan variabel-variabel
int
kounter; //variabel kendali loop
int
angka; //variabel untuk menyimpan
angka baru
int
nol = 0; //Langkah
1
int
ganjil = 0; //Langkah
1
int
genap = 0; //Langkah
1
cout << "Silahkan masukkan " << N << " buah integer, "
<< "positif, negatif, atau nol."
<< endl; //Langkah 2
cout << "Angka-angka yang Anda masukkan adalah:" << endl;
for
(kounter = 1; kounter <= N; kounter++) //Langkah
3
{
cin >> angka; //Langkah
3a
cout << angka << "
"; //Langkah
3b
//Langkah 3c
switch
(angka % 2)
{
case 0:
genap++;
if (angka == 0)
nol++;
break;
case 1:
case -1:
ganjil++;
} //akhir switch
} //akhir loop for
cout << endl;
//Langkah 4
cout << "Ada " << genap << " angka genap, "
<< "yang termasuk "
<< nol << " nol."
<< endl;
cout << "Jumlah angka ganjil adalah: " << ganjil
<< endl;
return
0;
}
Keluaran Program:
Silahkan masukkan 20 buah integer, positif, negatif,
atau nol.
Angka-angka yang Anda masukkan adalah:
0 0 -2 -3 -5 7 8 6 -4 0 0 0 3 4 5 -3 -5 -6 8 7
0 0 -2 -3 -5 7 8 6 -4 0 0 0 3 4 5 -3 -5 -6 8 7
Ada 12 angka genap, yang termasuk 5 nol.
Jumlah angka ganjil adalah: 8
Struktur Repetisi do...while
Bagian ini akan menjelaskan tipe ketiga dari struktur
repetisi, yang dinamakan dengan loop do...while. Bentuk umum dari sebuah
statemen do...while sebagai berikut:
do
statemen
while (ekspresi);
Tentu, statemen dapat berupa sebuah statemen sederhana
tunggal atau statemen gabungan (blok statemen). Jika ia berupa statemen
gabungan, maka ia harus diapit oleh sepasang kurung kurawal. Gambar 4.3
menunjukkan aliran eksekusi atas sebuah loop do...while.
Gambar 4.3 Loop do...while
Dalam C++, do
merupakan katakunci.
Elemen statemen
dieksekusi terlebih dahulu, dan kemudian ekspresi
dievaluasi. Jika ekspresi dievaluasi
menjadi true, maka statemen akan dieksekusi kembali.
Sepanjang ekspresi pada statemen do...while bernilai true, elemen statemen akan dieksekusi. Untuk menghindari loop tak-terhingga, Anda harus
memastikan bahwa tubuh loop memuat sebuah statemen yang membuat ekspresi menjadi false.
Contoh 4.18
|
|
i = 0;
do
{
cout << i <<
" ";
i = i + 5;
}
while (i <= 20);
Keluaran dari kode ini adalah:
0 5 10 15 20
Setelah 20 ditampilkan, statemen:
i = i + 5;
akan mengubah nilai dari i menjadi 25 dan sehingga i
< = 20 menjadi false, yang
menghentikan loop.
Pada sebuah loop while
dan for, kondisi loop dievaluasi
sebelum tubuh loop dieksekusi. Oleh karena itu, loop while dan for dinamakan dengan loop pra-uji. Di sisi lain, kondisi loop pada loop do...while dievaluasi
setelah tubuh loop selesai dieksekusi. Oleh karena itu, loop do...while dinamakan
dengan loop pasca-uji.
Karena loop while
dan for memiliki kondisi entri,
kedua jenis loop ini bisa jadi tidak pernah dieksekusi. Loop do...while, di sisi lain, memiliki
kondisi eksit dan oleh karena itu selalu dieksekusi setidaknya sekali.
Contoh 4.19
|
|
Perhatikan dua loop berikut:
a. i = 11;
while (i <= 10)
{
cout << i <<
" ";
i = i + 5;
}
cout << endl;
b. i = 11;
do
{
cout << i <<
" ";
i = i + 5;
}
while (i <= 10);
cout << endl;
Pada (a), loop while
tidak menghasilkan apa-apa. Pada (b), loop do...while
menampilkan angka 11 dan juga mengubah nilai dari i menjadi 16.
Loop do...while
dapat dipakai untuk validasi masukan. Dimisalkan bahwa sebuah program meminta
pengguna untuk memasukkan sebuah skor ujian, yang harus lebih dari atau sama
dengan 0 dan kurang dari atau sama dengan 50. Jika pengguna memasukkan skor
ujian kurang dari 0 atau lebih dari 50, pengguna akan diminta untuk memasukkan
kembalik skor ujian. Loop do...while
berikut dapat dipakai untuk melakukan tujuan ini:
int skor;
do
{
cout << "Masukkan sebuah skor antara 0 dan 50:
";
cin >> skor;
cout << endl;
}
while (skor
< 0 || skor > 50);
Contoh 4.20
|
|
Uji
Divisibilitas oleh 3 dan 9
Dimisalkan bahwa
dan
adalah integer dan
adalah tak-nol. Kemudian
disebut dengan pembagi dari
jika
dimana
adalah sebuah integer; sehingga ketika
membagi
, sisa pembagian adalah
0.
Dimisalkan bahwa
. Dimisalkan pula bahwa
merupakan penjumlahan dari setiap dijit dari
. Diketahui bahwa
adalah divisibel (dengan sisa pembagian nol)
oleh 3 dan 9 jika
divisibel oleh 3 dan 9. Dengan kata lain,
sebuah integer divisibel oleh 3 dan 9 jika dan hanya jika penjumlahan dari tiap
dijitnya divisibel oleh 3 dan 9.
Sebagai contoh, dimisalkan bahwa n = 27193257. Maka s = 2 + 7 + 1 + 9 + 3 + 2 + 5 + 7 = 36. Karena 36 adalah divisibel oleh 3 dan 9, dapat dimengerti
bahwa 27193257 divisibel oleh 3 dan
9.
Selanjutnya, Anda akan menuliskan sebuah program yang
menentukan apakah sebuah integer positif divisibel oleh 3 dan 9 dengan terlebih
dahulu mencari penjumlahan atas setiap dijitnya dan kemudian memeriksa apakah
penjumlahannya divisibel oleh 3 dan 9 atau tidak.
Untuk mencari penjumlahan atas setiap dijit dari sebuah
integer positif, Anda perlu mengekstrak setiap dijit dari angka. Perhatikan
angka 951372. Perhatikan bahwa 951372 % 10 = 2, yang merupakan dijit terakhir
dari 951372. Selain itu, perhatikan bahwa 951372 / 10 = 95137; yaitu, ketika
angka dibagi dengan 10, hal ini akan menghapus dijit terakhir pada angka
tersebut. Selanjutnya, proses ini akan diulangi pada angka 95137.
Dimisalkan bahwa jum
dan angka adalah variabel int dan integer positif disimpan di
dalam angka. Algoritma berikut
dipakai untuk mencari penjumlahan atas setiap dijit dari sebuah integer
positif.
jum = 0;
do
{
jum = jum + angka % 10; //mengekstrak
dijit terakhir
//dan
menambahkannya pada jum
angka = angka / 10; //menghapus dijit terakhir
}
while (angka
> 0);
Dengan menggunakan algoritma ini, Anda dapat menuliskan
program berikut yang menggunakan sebuah loop do...while untuk mengimplementasikan algoritma pengujian
divisibilitas.
//Program: Uji divisibilitas oleh 3 dan 9
#include
<iostream >
using namespace
std;
int main()
{
int angka, temp, jum;
cout
<< "Masukkan sebuah integer
positif: ";
cin >>
angka;
cout
<< endl;
temp =
angka;
jum = 0;
do
{
jum =
jum + angka % 10; //mengekstrak dijit terakhir
//dan
menambahkannya pada jum
angka =
angka / 10; //menghapus dijit
terakhir
}
while (angka > 0);
cout
<< "Penjumlahan dari tiap
dijit = " << jum << endl;
if (jum % 3 == 0)
cout
<< temp << " divisibel
oleh 3" << endl;
else
cout
<< temp << " tidak
divisibel oleh 3" << endl;
if (jum % 9 == 0)
cout
<< temp << " divisibel
oleh 9" << endl;
else
cout
<< temp << " tidak
divisibel oleh 9" << endl;
return 0;
}
Keluaran Program 1:
Masukkan sebuah integer positif: 27193257
Penjumlahan dari tiap dijit = 36
27193257 divisibel oleh 3
27193257 divisibel oleh 9
Keluaran Program 2:
Masukkan sebuah integer positif: 609321
Penjumlahan dari tiap dijit = 21
609321 divisibel oleh 3
609321 tidak divisibel oleh 9
Keluaran Program 3:
Masukkan sebuah integer positif: 161905102
Penjumlahan dari tiap dijit = 25
161905102 tidak divisibel oleh 3
161905102 tidak divisibel oleh 9
Statemen break dan continue
Statemen break,
ketika dieksekusi pada sebuah struktur switch,
menyediakan jalan keluar dari struktur switch.
Sama halnya, Anda dapat menggunakan statemen break pada loop while, for, dan do...while. Ketika statemen break
dieksekusi pada sebuah struktur repetisi, hal ini menyebabkan kendali program
keluar dari struktur tersebut. Statemen break
secara umum dipakai untuk dua tujuan:
·
Untuk
keluar dengan segera dari sebuah loop.
·
Untuk
melompati sisa dari struktur switch.
Setelah statemen break
dieksekusi, program berlanjut mengeksekusi statemen pertama yang berada setelah
struktur repetisi. Kegunaan dari statemen break
pada sebuah loop dapat mengeliminasi penggunaan variabel (bendera) tertentu.
Segmen kode C++ berikut mengilustrasikan ide ini. (Diasumsikan bahwa semua
variabel dideklarasikan dengan benar).
jum = 0;
apaNegatif = false;
cin >> angka;
while (cin && ! apaNegatif)
{
if (angka < 0) //jika
angka negatif, maka hentikan loop
//setelah
iterasi ini
{
cout << "Angka negatif ditemukan dalam data."
<< endl;
apaNegatif = true;
}
else
{
jum = jum + angka;
cin >> angka;
}
}
Loop while ini
dimaksudkan untuk mencari penjumlahan atas sekumpulan angka positif. Jika
himpunan data memuat sebuah angka negatif, maka loop akan berhenti dengan
menampilkan sebuah pesan tertentu. Loop while
ini menggunakan variabel bendera apaNegatif
untuk memberikan hasil yang diinginkan. Variabel apaNegatif diinisialisasi dengan false sebelum loop while
dieksekusi. Sebelum menjumlahkan angka
dan jum, angka diperiksa apakah negatif atau tidak. Jika angka negatif, maka pesan error akan
ditampilkan pada layar dan apaNegatif
akan ditetapkan menjadi true. Pada
iterasi berikutnya, ketika ekspresi pada statemen while dievaluasi, ia dievaluasi menjadi false karena !apaNegatif
bernilai false. (Perhatikan bahwa
karena apaNegatif adalah true, !apaNegatif adalah false).
Loop while
berikut ditulis tanpa menggunakan variabel apaNegatif:
jum = 0;
cin >> angka;
while (cin)
{
if (angka < 0) //jika angka negatif, maka
hentikan loop
{
cout << "Angka negatif ditemukan dalam data."
<< endl;
break;
}
jum = jum + angka;
cin >> angka;
}
Pada bentuk while
ini, ketika sebuah negatif ditemukan, ekspresi pada statemen if dievaluasi menjadi true; setelah menampilkan pesan
tertentu, statemen break akan
menghentikan loop. (Setelah statemen break
dieksekusi pada sebuah loop, stateme-statemen yang tersisa (yang ditempatkan
sesudah statemen break di dalam
sebuah loop) akan dibuang.
Statemen continue
digunakan pada loop while, for, dan do...while. Ketika statemen continue
dieksekusi pada sebuah loop, ia akan menempati sisa statemen-statemen (yang
ditempatkan sesudah statemen continue
di dalam sebuah loop) dan berlanjut ke iterasi berikutnya pada loop. Pada
struktur while dan do...while, elemen ekspresi dievaluasi segera setelah statemen continue dieksekusi. Pada struktur for, statemen pembaruan
dieksekusi setelah statemen continue
dieksekusi, dan kemudian kondisi loop
dieksekusi.
Jika segmen program sebelumnya menjumpai sebuah angka
negatif, maka loop while akan
berhenti. Jika Anda ingin membuang angka negatif tersebut dan membaca angka
berikutnya, bukan menghentikan loop, dan menggantikan statemen break dengan statemen continue, seperti ditunjukkan pada
contoh berikut:
jum = 0;
cin >> angka;
while (cin)
{
if (angka < 0)
{
cout << "Angka negatif ditemukan dalam data."
<< endl;
continue;
}
jum = jum + angka;
cin >> angka;
}
Struktur Kendali Bersarang
Pada bagian ini, akan diberikan beberapa contoh yang
mengilustrasikan bagaimana menggunakan loop bersarang untuk memproses data.
Contoh 4.21
|
|
Dimisalkan bahwa Anda ingin menciptakan pola berikut:
*
**
***
****
*****
Jelaslah terlihat bahwa Anda ingin menampilkan lima baris
bintang. Pada baris pertama, Anda ingin menampilkan satu bintang, pada baris
kedua, dua bintang, dan seterusnya. Karena lima baris akan ditampilkan, akan
dimulai dengan statemen for berikut:
for
(i = 1; i <= 5; i++)
Nilai dari i pada
iterasi pertama adalah 1, pada iterasi kedua ia adalah 2, dan seterusnya. Anda
dapat menggunakan nilai i sebagai
kondisi pembatas pada loop for
bersarang lain yang ditempatkan di dalam loop ini untuk mengendalikan jumlah
bintang pada sebuah baris. Sedikit modifikasi bisa menghasilkan kode berikut:
for (i = 1; i <= 5; i++) //Baris
1
{ //Baris
2
for (j = 1; j <= i; j++) //Baris
3
cout << "*"; //Baris 4
cout << endl; //Baris 5
} //Baris 6
Penjejak atas kode ini menunjukkan bahwa loop for pada baris 1 diawali dengan i = 1. Ketika i bernilai 1, loop for
sebelah dalam pada baris 3 menampilkan satu bintang dan titik penyisipan
berpindah ke baris selanjutnya. Kemudian i
menjadi 2, loop for sebelah dalam
menampilkan dua bintang, dan statemen keluaran pada baris 5 memindahkan titik
penyisipan ke baris berikutnya, dan seterusnya. Proses ini berlanjut sampai i
menjadi 6 dan loop berhenti.
Pola apa yang dihasilkan kode ini jika Anda mengganti
statemen for pada baris 1 dengan
berikut?
for
(i = 5; i >= 1; i--)
Contoh 4.22
|
|
Dimisalkan bahwa Anda ingin menciptakan tabel perkalian
berikut:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12
15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
Tabel perkalian tersebut mempunyai lima baris. Oleh karena
itu, seperti pada contoh 4.21, Anda menggunakan sebuah statemen for untuk menampilkan kelima baris
tersebut sebagai berikut:
for (i = 1; i <= 5; i++)
//menampilkan baris yang memuat
angka-angka
Pada baris pertama, Anda ingin menampilkan tabel perkalian
dari satu, pada baris kedua Anda ingin menampilkan tabel perkalian dari dua,
dan seterusnya. Perhatikan bahwa baris pertama diawali dengan 1 dan ketika
baris ini ditampilkan, i adalah 1.
Sama halnya, baris kedua diawali dengan 2 dan ketika baris ini ditampilkan,
nilai i adalah 2, dan seterusnya.
Jika i adalah 1, maka i * 1 adalah 1, jika i adalah 2, maka i * 2 adalah 2, dan seterusnya. Oleh karena itu, untuk menampilkan satu
baris yang memuat angka-angka, Anda dapat menggunakan nilai i sebagai angka awal dan 10 sebagai
nilai pembatas. Jadi, perhatikan loop for
berikut:
for (j = 1; j <= 10; j++)
cout << setw(3) << i * j;
Tengok lebih dekat pada loop for ini. Dimisalkan bahwa i
adalah 1. Kemudian, Anda menampilkan baris pertama pada tabel perkalian. Selain
itu, j bernilai dari 1 sampai 10,
jadi loop for ini menampilkan angka
1 sampai 10, yang merupakan baris pertama pada tabel perkalian. Sama halnya,
jika i adalah 2, Anda menampilkan
baris kedua pada tabel perkalian. Selain itu, j bernilai dari 1 sampai 10, sehingga loop for ini menampilkan baris kedua pada tabel perkalian, dan
seterusnya.
Dengan sedikit pemikiran akan menghasilkan loop bersarang
berikut untuk menampilkan tabel yang diinginkan.
for (i = 1; i <= 5; i++) //Baris
1
{ //Baris
2
for (j = 1; j <= 10; j++) //Baris
3
cout << setw(3)
<< i * j; //Baris 4
cout << endl; //Baris 5
}
Contoh 4.23
|
|
Perhatikan data berikut:
65 78 65 89 25 98 -999
87 34 89 99 26 78 64 34 -999
23 99 98 97 26 78 100 63 87 23 -999
62 35 78 99 12 93 19 -999
Angka -999 di akhir setiap baris berperan sebagai sentinel
dan oleh karena itu bukan menjadi bagian dari data. Tujuan utamanya di sini
adalah untuk mencari penjumlahan atas angka-anga pada tiap baris dan
menampilkannya. Selain itu, diasumsikan bahwa data ini dibaca dari sebuah file,
katakanlah, contoh4_23.txt.
Diasumsikan bahwa file masukan telah dibuka menggunakan variabel aliran masukan
infile.
Data ini memiliki empat baris masukan. Jadi, Anda dapat
menggunakan sebuah loop for atau
sebuah loop while terkendali-kounter
untuk memproses setiap baris data. Di sini, digunakan sebuah loop while untuk memproses keempat baris
tersebut. Loop while ini memiliki bentuk berikut:
kounter = 0; //Baris
1
while (kounter < 4) //Baris 2
{ //Baris
3
//memproses baris //Baris 4
//menampilkan penjumlahan
kounter++;
}
Sekarang, Anda perlu berkonsentrasi pada pemrosesan sebuah
baris. Setiap baris memiliki jumlah data yang bervariasi. Sebagai contoh, baris
pertama mempunyai enam angka, baris kedua mempunyai delapan angka, dan
seterusnya. Karena setiap baris diakhiri dengan -999, Anda dapt menggunakan
sebuah loop while
terkendali-sentinel untuk mencari penjumlahan atas tiap angka pada setiap
baris. Perhatikan loop while
berikut:
jum = 0; //Baris
4
infile >> angka; //Baris
5
while (angka != -999) //Baris 6
{ //Baris 7
jum = jum + angka; //Baris 8
infile >> angka; //Baris 9
} //Baris 10
Statemen pada baris 4 menginisialisasi jum dengan 0, dan statemen pada baris 5 membaca dan menyimpan
angka pertama pada baris tertentu ke dalam angka. Ekspresi Boolean angka != -999 pada baris 6 memeriksa
apakah angka adalah -999. Jika angka bukan -999, maka
statemen-statemen pada baris 8 dan 9 akan dieksekusi. Statemen pada baris 8
memperbarui nilai jum; statemen pada
baris membaca dan menyimpan angka berikutnya ke dalam angka. Loop berlanjut dieksekusi sepanjang angka bukan -999.
Sekarang dapat dipahami bahwa loop bersarang dipakai untuk
memproses data sebagai berikut. (Diasumsikan bahwa semua variabel
dideklarasikan dengan benar).
kounter = 0; //Baris
1
while (kounter < 4) //Baris
2
{ //Baris
3
jum = 0; //Baris 4
infile >> angka; //Baris 5
while (angka != -999) //Baris
6
{ //Baris 7
jum = jum + angka; //Baris 8
infile >> angka; //Baris 9
} //Baris 10
cout << "Baris " << kounter + 1
<< ": Jum = " << jum <<
endl; //Line 11
kounter++; //Line 12
} //Line 13
No comments:
Post a Comment