Tuesday, December 20, 2016

Bab 4. C++ Untuk Pemula



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