Wednesday, December 21, 2016

Bab 7. C++ Untuk Pemula



Tipe Data Sendiri, Namespace, dan string







Pengantar

Pada Bab 1, Anda telah belajar bahwa tipe data sederhana C++ dibagi ke dalam tiga kategori: integral, titik-mengambang, dan enum. Dalam beberapa bab berikutnya setelah Bab 1, Anda telah menggunakan tipe data integral dan tipe data titik-mengambang. Pada bab ini, Anda akan belajar tentang tipe enum. Selain itu, statemen using namespace std; (yang telah didiskusikan pada Bab 1) dipakai dalam setiap program C++ yang menggunakan file-file header C++ Standar ANSI/ISO. Setengah bagian kedua dari bab ini akan mendiskusikan statemen ini. Anda akan belajar apa mekanisme namespace. Anda juga akan belajar tentang tipe string dan banyak fungsi lain yang dapat Anda pakai untuk secara efektif memanipulasi string.


Tipe Enumerasi

Bab 1 telah mendefinisikan tipe data sebagai himpunan nilai berikut dengan himpunan operasi yang dapat diterapkan pada nilai tersebut. Sebagai contoh, tipe data int memuat integer-integer dari -2,147,483,648 sampai 2,147,483,647 dan himpunan operasi terhadap angka-angka tersebut, sebut saja, operasi-operasi aritmatik (+, -, *, /, dan %). Karena tujuan utama sebuah program adalah untuk memanipulasi data, konsep sebuah tipe data menjadi fundamental dalam sembarang bahasa pemrograman. Dengan menyediakan tipe data, Anda bisa menspesifikasi nilai-nilai apa saja yang legal dan memberitahu pengguna apa jenis operasi yang diijinkan pada nilai-nilai tersebut.

Tipe data yang telah Anda pakai sejauh ini adalah int, bool, char, dan double. Meskipun semua data ini sudah cukup untuk menyelesaikan hampir semua permasalahan, ada beberapa situasi ketika tipe-tipe data ini tidak cukup dalam menyelesaikan permasalahan tertentu. C++ menyediakan sebuah mekanisme bagi pengguna untuk menciptakan tipe datanya sendiri, yang secara signifikan meningkatkan fleksibilitas bahasa pemrograman.

Pada bagian ini, Anda akan belajar bagaimana menciptakan tipe data sederhana sendiri, yang dikenal dengan tipe enumerasi. Pada bab-bab mendatang, Anda akan belajar tentang beberapa teknik lain untuk mencitakan tipe-tipe data kompleks.


Untuk mendefinisikan sebuah tipe enumerasi, Anda memerlukan beberapa item berikut:
·         Sebuah nama untuk tipe data
·         Himpunan nilai untuk tipe data
·         Himpunan operasi untuk nilai-nilai tersebut

C++ membolehkan Anda untuk mendefinisikan sebuah tipe sederhana yang baru dimana Anda dapat menetapkan namanya dan himpunan nilainya, tetapi bukan operasi-operasinya. Pencegahan pengguna dari penciptaan operasinya sendiri dilakukan untuk menghindari potensi kegagalan sistem.

Himpunan nilai yang Anda tetapkan untuk sebuah tipe data haruslah berupa himpunan pengenal.

Sintaks untuk tipe enumerasi adalah:

enum namaTipe {nilai1, nilai2, ...};

dimana nilai1, nilai2, ... masing-masing merupakan pengenal yang dikenal dengan enumerator. Dalam C++, enum merupakan katakunci.

Dengan mengapit nilai-nilai di antara kurung kurawal, Anda menetapkan sebuah pengurutan antar nilai. Yaitu, nilai1 < nilai2 < nilai3 < .... Jadi, tipe enumerasi merupakan himpunan nilai terurut. Selain itu, nilai default yang ditugaskan kepada tiap enumerator adalah 0. Jadi, nilai default yang ditugaskan kepada nilai1 adalah 0, nilai default yang ditugaskan kepada nilai2 adalah 0, dan seterusnya. (Anda dapat menugaskan berbagai nilai, selain nilai default, untuk tiap enumerator ketika Anda mendefinisikan tipe enumerasi). Perhatikan pula bahwa enumerator nilai1, nilai2, ... bukanlah variabel.

Contoh 7.1


Statemen:

enum warna {COKLAT, BIRU, MERAH, HIJAU, KUNING};

mendefinisikan sebuah tipe data baru, yang dinamakan warna, dan nilai-nilai yang berkaitan dengan tipe data ini adalah COKLAT, BIRU, MERAH, HIJAU, dan KUNING.

Contoh 7.2


Statemen:

enum siswa {ANAK_BARU, TAHUN_PERTAMA, JUNIOR, SENIOR};

mendefinisikan siswa sebagai sebuah tipe enumerasi. Nilai-nilai yang berkaitan dengan siswa adalah ANAK_BARU, TAHUN_PERTAMA, JUNIOR, dan SENIOR.

Contoh 7.3


Perhatikan beberapa statemen berikut:

enum nilai {'A', 'B', 'C', 'D', 'F'};    //tipe enumerasi ilegal
enum posisi {1SATU, 2DUA, 3TIGA, 4EMPAT}; // tipe enumerasi ilegal

Keduanya merupakan tipe enumerasi ilegal karena nilai-nilainya bukanlah pengenal yang sah. Berikut adalah tipe enumerasi legal:

enum nilai {A, B, C, D, F};
enum posisi {PERTAMA, KEDUA, KETIGA, KEEMPAT};

Jika sebuah nilai telah digunakan di dalam satu tipe enumerasi, ia tidak dapat digunakan oleh tipe enumerasi yang lain di dalam blok yang sama. Contoh 7.4 mengilustrasikan konsep ini.

Contoh 7.4


Perhatikan beberapa statemen berikut:

enum mahasiswaElektro {JOHN, SANTOS, SINDY, LISA, RORO};
enum mahasiswaKomputer {SUSAN, KATY, JOHN, WILLIAM}; //ilegal

Dimisalkan bahwa kedua statemen ini berada di dalam program yang sama di dalam blok yang sama. Tipe enumerasi kedua, mahasiswaKomputer, tidak diijinkan karena nilai JOHN telah digunakan di dalam tipe enumerasi sebelumnya, mahasiswaElektro.

Mendeklarasikan Variabel
Begitu sebuah tipe data telah didefinisikan, Anda dapat mendeklarasikan variabel bertipe data itu. Sintaks untuk mendeklarasikan sebuah tipe enum sama seperti sebelumnya:

tipeData pengenal, pengenal,...;

Statemen:

enum olahraga {BASKET, BOLAKAKI, RENANG, KARATE, VOLI, LARI};

mendefinisikan sebuah tipe enumerasi yang dinamai olahraga. Statemen:

olahraga olahragaTerkenal, olahragaKu;

mendeklarasikan olahragaTerkenal dan olahragaKu sebagai variabel bertipe olahraga.

Penugasan
Begitu sebuah variabel dideklarasikan, Anda dapat menyimpan nilai-nilai di dalamnya. Diasumsikan digunakan deklarasi sebelumnya, statemen:

olahragaTerkenal = BOLAKAKI;

menyimpan BOLAKAKI di dalam olahragaTerkenal. Statemen:

olahragaKu = olahragaTerkenal;

menyalin nilai dari olahragaTerkenal ke dalam olahragaKu.

Operasi pada Tipe Enumerasi
Operasi aritmatik tidak diijinkan untuk diterapkan pada tipe enumerasi. Jadi statemen-statemen berikut adalah ilegal:

olahragaKu = olahragaTerkenal + 2;       //ilegal
olahragaTerkenal = BOLAKAKI + VOLI;      //ilegal
olahragaTerkenal = olahragaTerkenal * 2; //ilegal

Selain itu, operasi inkremen dan dekremen tidak diijinkan pada tipe enumerasi. Jadi, statemen-statemen berikut adalah ilegal:

olahragaTerkenal++; //ilegal
olahragaTerkenal––; //ilegal

Dimisalkan bahwa Anda ingin menginkremen nilai dari olahragaTerkenal sebesar 1. Anda dapat menggunakan operator cast sebagai berikut:

olahragaTerkenal = static_cast<olahraga>(olahragaTerkenal + 1);

Ketika nama tipe digunakan, kompiler mengasumsikan bahwa pengguna memahami apa yang dia kerjakan. Jadi, setelah statemen tersebut dikompilasi, dan selama eksekusi, ia menggeser nilai dari olahragaTerkenal ke nilai berikutnya di dalam daftar nilai. Perhatikan beberapa statemen berikut:

olahragaTerkenal = BOLAKAKI;
olahragaTerkenal = static_cast<olahraga>(olahragaTerkenal + 1);

Setelah statemen kedua dieksekusi, nilai dari olahragaTerkenal adalah RENANG. Sama halnya, beberapa statemen:

olahragaTerkenal = BOLAKAKI;
olahragaTerkenal = static_cast<olahraga>(olahragaTerkenal - 1);

menyebabkan penyimpanan BASKET di dalam olahragaTerkenal.

Operator Relasional
Karena enumerasi merupakan sebuah himpunan nilai terurut, maka operator relasional dapat digunakan pada tipe enumerasi. Dimisalkan Anda memiliki tipe enumerasi olahraga dan variabel olahragaTerkenal dan olahragaKu seperti yang telah didefinisikan sebelumnya. Maka:

BASKET <= BOLAKAKI adalah true
VOLI > RENANG adalah true
LARI < BOLAKAKI adalah false

Dimisalkan bahwa:

olahragaTerkenal = BOLAKAKI;
olahragaKu = VOLI;

Maka:

olahragaTerkenal < olahragaKu adalah true

Tipe Enumerasi dan Loop
Ingat bahwa tipe enumerasi merupakan sebuah tipe integral dan bahwa, dengan menggunakan operator cast, Anda dapat menginkremen, mendekreman, membandingkan nilai – nilai tipe enumerasi. Oleh karena itu, Anda dapat menggunakan tipe enumerasi di dalam loop. Dimisalkan bahwa olahragaKu merupakan sebuah variabel seperti yang didefinisikan sebelumnya. Perhatikan loop for berikut:

for (olahragaKu = BASKET; olahragaKu <= VOLI;
     olahragaKu = static_cast<olahraga>(olahragaKu + 1))
    .
    .
    .

Loop for ini memiliki lima iterasi. Penggunaan tipe enumerasi di dalam loop dapat meningkatkan keterbacaan program.

Tipe Enumerasi Masukan/Keluaran
Karena masukan dan keluaran didefinisikan hanya untuk tipe data built-in seperti int, char, double, dan lainnya, tipe enumerasi tidak dapat dipakai untuk masukan atau keluaran (secara langsung). Namun, Anda dapat menggunakannya secara tak langsung. Contoh 7.5 mengilustrasikan konsep ini.

Contoh 7.5


Dimisalkan bahwa Anda memiliki beberapa statemen berikut:

enum kuliah {ALJABAR, BASIC, PASCAL, CPP, PROGRAM, ANALISIS,
             CSHARP, HISTOGRAM};

kuliah sekolah;

Statemen pertama mendefinisikan sebuah tipe enumerasi, kuliah; statemen kedua mendeklarasikan sebuah variabel sekolah bertipe kuliah. Anda dapat membaca (masukan) tipe enumerasi dengan bantuan tipe data char. Perhatikan bahwa Anda dapat membedakan beberapa nilai di dalam tipe enumerasi kuliah hanya dengan membaca karakter pertama dan yang lain dengan membaca dua karakter pertama. Sebagai contoh, Anda dapat membedakan ALJABAR dan BASIC hanya dengan membaca karakter pertama; Anda dapat membedakan ALJABAR dan ANALISIS dengan membaca dua karakter pertama. Untuk membaca nilai-nilai ini dari, katakanlah, papanketik, Anda dapat membaca dua karakter dan kemudian menggunakan sebuah struktur seleksi untuk menugaskan nilai tersebut kepada sekolah. Jadi, Anda perlu mendeklarasikan dua variabel bertipe char.

char ch1, ch2;
cin >> ch1 >> ch2;   //membaca dua karakter

Statemen switch berikut menugaskan nilai yang sesuai kepada variabel sekolah:

switch (ch1)
{
    case 'a':
    case 'A':
        if (ch2 == 'l' || ch2 == 'L')
            sekolah = ALJABAR;
        else
            sekolah = ANALISIS;
        break;
    case 'b':
    case 'B':
        sekolah = BASIC;
        break;
    case 'c':
    case 'C':
        if (ch2 == 's' || ch2 == 'S')
            sekolah = CSHARP;
        else
            sekolah = CPP;
        break;
    case 'h':
    case 'H':
        sekolah = HISTOGRAM;
        break;
    case 'p':
    case 'P':
        if (ch2 == 'a' || ch2 == 'A')
            sekolah = PASCAL;
        else
            sekolah = PROGRAM;
        break;
    default:
        cout << "Masukan ilegal." << endl;
}

Sama halnya, Anda dapat menampilkan tipe enumerasi secara tak langsung:

switch (sekolah)
{
    case ALJABAR:
        cout << "Aljabar";
        break;
    case ANALISIS:
        cout << "Analisis";
        break;
    case BASIC:
        cout << "Basic";
        break;
    case CSHAPR:
        cout << "Csharp";
        break;
    case CPP:
        cout << "CPP";
        break;
    case HISTOGRAM:
        cout << "Histogram";
        break;
    case PASCAL:
        cout << "Pascal";
        break;
    case PROGRAM:
        cout << "Program";
}

Fungsi dan Tipe Enumerasi
Anda dapat melewatkan tipe enumerasi sebagai parameter kepada fungsi sama seperti sembarang tipe data sederhana, yaitu lewat nilai atau lewat referensi. Selain itu, sama seperti tipe data sederhana yang lain, sebuah fungsi dapat menghasilkan nilai balik bertipe enumerasi. Dengan menggunakan fasilitas ini, Anda dapat menggunakan fungsi untuk melakukan operasi masukan dan keluaran terhadap tipe enumerasi.

Fungsi berikut membaca dari papanketik dan menghasilkan sebuah nilai balik bertipe enumerasi. Diasumsikan bahwa tipe enumerasi kuliah didefinisikan seperti sebelumnya:

kuliah bacaKuliah()
{
    kuliah sekolah;

    char ch1, ch2;
   
    cout << "Masukkan dua huruf pertama dari kuliah: "
         << endl;

    cin >> ch1 >> ch2;

    switch (ch1)
    {
    case 'a':
    case 'A':
        if (ch2 == 'l' || ch2 == 'L')
            sekolah = ALJABAR;
        else
            sekolah = ANALISIS;
        break;
    case 'b':
    case 'B':
        sekolah = BASIC;
        break;
    case 'c':
    case 'C':
        if (ch2 == 's' || ch2 == 'S')
            sekolah = CSHARP;
        else
            sekolah = CPP;
        break;
    case 'h':
    case 'H':
        sekolah = HISTOGRAM;
        break;
    case 'p':
    case 'P':
        if (ch2 == 'a' || ch2 == 'A')
            sekolah = PASCAL;
        else
            sekolah = PROGRAM;
        break;
    default:
        cout << "Masukan ilegal." << endl;
    }

    return sekolah;
} //akhir bacaKuliah

Fungsi berikut menampilkan sebuah nilai tipe enumerasi:

void tampilEnum(kuliah sekolah)
{
    switch (sekolah)
    {
    case ALJABAR:
        cout << "Aljabar";
        break;
    case ANALISIS:
        cout << "Analisis";
        break;
    case BASIC:
        cout << "Basic";
        break;
    case CSHAPR:
        cout << "Csharp";
        break;
    case CPP:
        cout << "CPP";
        break;
    case HISTOGRAM:
        cout << "Histogram";
        break;
    case PASCAL:
        cout << "Pascal";
        break;
    case PROGRAM:
        cout << "Program";
    }
}//akhir tampilEnum

Mendeklarasikan Variabel Ketika Mendefinisikan Tipe Enumerasi
Pada beberapa bagian terdahulu, Anda telah mendefinisikan sebuah tipe enumerasi dan kemudian mendeklarasikan variabel bertipe data enumerasi itu. C++ membolehkan Anda untuk menggabungkan kedua langkah ini menjadi satu. Anda dapat mendeklarasikan variabel bertipe enumerasi ketika Anda mendefinisikan sebuah tipe enumerasi. Sebagai contoh, statemen:

enum nilai {A, B, C, D, F} nilaiMtKuliah;

mendefinisikan sebuah tipe enumerasi, nilai, dan mendeklarasikan sebuah variabel nilaiMtKuliah bertipe nilai.

Sama halnya, statemen:

enum koin {PERAK, NIKEL, PERUNGGU, SERIBU, SERATUS} receh, koinRI;

mendefinisikan sebuah tipe enumerasi, koin, dan mendeklarasikan dua variabel, receh dan koinRI bertipe koin.

Tipe Data Anonim
Sebuah tipe data dimana di dalamnya Anda secara langsung menetapkan nilai-nilai di dalam deklarasi variabel dengan tanpa nama tipe dinamakan dengan tipe anonim. Statemen berikut menciptakan sebuah tipe anonim:

enum {BASKET, BOLAKAKI, RENANG, LARI} olahragaKu;

Statemen ini menetapkan nilai – nilai dan mendeklarasikan sebuah variabel olahragaKu, tetapi tidak ada nama yang diberikan pada tipe data tersebut.

Penciptaan tipe anonim memiliki kekurangan. Pertama, karena tidak ada nama tipe, Anda tidak bisa melewatkan sebuah tipe anonim sebagai parameter kepada sebuah fungsi, dan sebuah fungsi tidak dapat menghasilkan nilai balik bertipe anonim. Kedua, nilai – nilai yang digunakan di dalam satu tipe anonim dapat dipakai di dalam tipe anonim yang lain, tetapi variabel – variabel dari kedua tipe tersebut diperlakukan secara berbeda. Perhatikan beberapa statemen berikut:

enum {ENGLISH, FRENCH, SPANISH, GERMAN, RUSSIAN} bahasa;
enum {ENGLISH, FRENCH, SPANISH, GERMAN, RUSSIAN} bahasaAsing;

Meskipun variabel bahasa dan bahasaAsing memiliki nilai – nilai yang sama, kompiler memperlakukannya sebagai variabel bertipe berbeda. Statemen berikut adalah ilegal:

bahasa = bahasaAsing; //ilegal

Statemen typedef
Dalam C++, Anda dapat menciptakan sinonim atau alias pada tipe data yang telah didefinisikan menggunakan statemen typedef. Sintaks dari statemen typedef adalah:

typedef namaTipeLama namaTipeBaru;

Dalam C++, typedef merupakan katakunci. Perhatikan bahwa statemen typedef tidak menciptakan tipe baru; ia hanya menciptakan nama alias bagi tipe data yang sudah ada.

Contoh 7.6


Statemen:

typedef int integer;

menciptakan sebuah alias, integer, untuk tipe data int. Sama halnya, statemen:

typedef double riil;

menciptakan sebuah alias, riil, untuk tipe data double. Statemen:

typedef double desimal;

menciptakan sebuah alias, desimal, untuk tipe data double.

Dengan menggunakan statemen typedef, Anda dapat menciptakan tipe data Boolean sendiri, seperti ditunjukkan pada contoh 7.7.

Contoh 7.7


Dari Bab 3, ingat bahwa ekspresi logikal (Boolean) di dalam C++ dievaluasi menjadi 1 atau 0, yang merupakan nilai – nilai int. Sebagai nilai logikal, 1 merepresentasikan true dan 0 merepresentasikan false. Perhatikan beberapa statemen berikut:

typedef int Boolean;              //Baris 1
const Boolean BENAR = 1;          //Baris 2
const Boolean SALAH = 0;          //Baris 3
Boolean bendera;                  //Baris 4

Statemen pada baris 1 menciptakan sebuah alias, Boolean, untuk tipe data int. Statemen pada baris 2 dan baris 3 mendeklarasikan dua konstanta bernama BENAR dan SALAH dan menugaskannya dengan 1 dan 0. Statemen pada baris 4 mendeklarasikan bendera sebagai sebuah variabel bertipe Boolean. Karena bendera merupakan sebuah variabel bertipe Boolean, statemen berikut menjadi legal:

bendera = BENAR;


CONTOH PEMROGRAMAN: PERMAINAN BATU, KERTAS, DAN GUNTING

Hampir semua anak sering memainkan permainan batu, kertas, dan gunting. Permainan ini mempunyai dua pemain, masing – masing memilih salah satu dari tiga objek: batu, kertas, atau gunting. Jika pemain 1 memilih batu dan pemain 2 memilih kertas, maka pemain 2 memenangkan permainan karena kertas menutupi batu. Permainan ini dimainkan sesuai dengan beberapa aturan berikut:
·         Jika kedua pemain memilih objek yang sama, permainan seri.
·         Jika salah satu pemain memilih batu dan pemain lainnya memilih gunting, maka pemain yang memilih batu akan memenangkan permainan ini karena batu memecahkan gunting.
·         Jika salah satu pemain memilih batu dan pemain lainnya memilih kertas, maka pemain yang memilih kertas akan memenangkan permainan ini karena kertas menutupi batu.
·         Jika salah satu pemain memilih guntung dan pemain lainnya memilih kertas, maka pemain yang memilih gunting akan memenangkan permainan ini karena gunting memotong kertas.


Tulislah sebuah program interaktif yang membuat dua orang dapat memainkan permainan ini.

Masukan: Program ini memiliki dua jenis masukan:
·         Respon pengguna ketika diminta untuk memainkan permainan.
·         Pilihan para pemain.

Keluaran: Pilihan para pemain dan pemenang setiap permainan. Setelah permainan selesai, total jumlah permainan dan jumlah berapa kali setiap pemain memenangkan permainan akan ditampilkan.

Analisa Masalah dan Perancangan Algoritma
Dua pemain memainkan permainan ini. Pemain memasukkan pilihannya lewat papanketik. Setiap memasukkan B atau b untuk batu, K atau k untuk kertas, atau G atau g untuk gunting. Ketika pemain pertama memasukkan sebuah pilihan, pemain kedua harus menengok ke tempat lain (tidak boleh mengintip). Setelah kedua entri telah dimasukkan, jika kedua entri valid, maka program akan menampilkan pilihan tiap pemain dan mendeklarasikan siapa pemenang permainan. Permainan berlanjut sampai salah satu pemain memutuskan untuk keluar permainan. Setelah permainan berakhir, program menampilkan total jumlah permainan dan berapa kali setiap pemain memenangkan permainan. Diskusi ini bisa diterjemahkan ke dalam algoritma berikut:
1.      Menyediakan penjelasan singkat permainan dan bagaimana memainkannya.
2.      Menanyakan pengguna jika mereka ingin memainkan permainan.
3.      Para pemain memberikan pilihan.
4.      Jika permainan valid, maka program menampilkan permainan dan pemenangnya.
5.      Memperbarui total jumlah permainan dan penghitungan pemain.
6.      Mengulangi langkah 2 sampai langkah 5 ketika pemain ingin bermain kembali.
7.      Menampilkan jumlah permainan dan berapa kali tiap pemenang memenangkan permainan.

Anda akan menggunakan tipe enumerasi untuk mendeskripsikan objek – objek.

enum tipeObjek {BATU, KERTAS, GUNTING};

Variabel
Jelaslah bahwa Anda memerlukan beberapa variabel berikut di dalam fungsi main:

int hitungPermainan;       //variabel untuk menyimpan jumlah permainan
//yang telah dimainkan
int hitungMenang1;         //variabel untuk menyimpan jumlah permainan
//yang dimenangkan oleh pemain 1
int hitungMenang2;         //variabel untuk menyimpan jumlah permainan
//yang dimenangkan oleh pemain 2
int pemenangPermainan;
char respon;               //variabel untuk mendapatkan respon pengguna
char pilihan1;
char pilihan2;

tipeObjek pemain1;         //pilihan pemain 1
tipeObjek pemain2;         //pilihan pemain 2

Program ini dibagi menjadi beberapa fungsi berikut, yang akan dijelaskan secara detil:
·         tampilAturan: Fungsi ini menampilkan penjelasan singkat tentang permainan dan beberapa aturannya.
·         pilihanValid: Fungsi ini memeriksa apakah pilihan pemain valid atau tidak. Pilihan – pilihan yang valid adalah B, b, K, k, G, atau g.
·         ambilPermainan: Karena tipe – tipe enumerasi tidak dapat dibaca secara langsung, fungsi ini mengkonversi pilihan yang dientrikan (B, b, K, k, G, atau g) dan menghasilkan tipe objek yang sesuai.
·         hasilPermainan: Fungsi ini menampilkan pilihan para pemain dan pemenang permainan.
·         konversiEnum: Fungsi ini dipanggil oleh fungsi hasilPermainan untuk menampilkan nilai – nilai tipe enumerasi.
·         objekPemenangan: Fungsi ini menentukan dan menghasilkan objek pemenangan.
·         tampilHasil: Setelah permainan selesai, fungsi ini menampilkan hasil akhir.

Fungsi tampilAturan
Fungsi ini tidak memiliki parameter. Ia hanya memuat beberapa statemen keluaran untuk menjelaskan permainan dan aturan – aturannya. Fungsi ini didefinisikan berikut:

void tampilAturan()
{
    cout << "Selamat datang ke permainan Batu, Kertas, "
         << "dan Gunting." << endl;
    cout << "Ini merupakan sebuah permainan dua pemain. Untuk tiap "
         << "permainan, setiap" << endl;
    cout << " pemain memilih salah satu objek Batu, "
         << "Kertas, atau Gunting." << endl;
    cout << "Beberapa aturan untuk memenangkan permainan adalah: " << endl;
    cout << "1. Jika kedua pemain memilih objek yang sama, permainan "
         << "seri." << endl;
    cout << "2. Batu memecah Gunting: Jadi pemain yang memilih "
         << "Batu akan menang." << endl;
    cout << "3. Kertas menutupi Batu: Jadi pemain yang memilih "
         << "Kertas akan menang." << endl;
    cout << "4. Gunting memotong kertas: Jadi pemain yang memilih "
         << "Gunting akan menang." << endl << endl;
    cout << "Masukkan B atau b untuk Batu, K atau k untuk memilih "
         << "Kertas, dan G atau g untuk memilih Gunting." << endl;
}

Fungsi pilihanValid
Fungsi ini memeriksa apakah pilihan pemain valid atau tidak.

jika pilihan adalah 'B' atau 'b' atau 'K' atau 'k' atau 'G' atau 'g',
maka pilihan valid;
selainnya, pilihan tak valid.

Akan dituliskan sebuah statemen switch untuk memeriksa validitas pilihan. Definisi atas fungsi ini adalah:

bool pilihanValid(char pilihan)
{
    switch (pilihan)
    {
        case 'B':
        case 'b':
        case 'K':
        case 'k':
        case 'G':
        case 'g':
            return true;
        default:
            return false;
    }
}

Fungsi ambilPermainan
Karena tipe enumerasi tidak dapat dibaca secara langsung, fungsi ini mengkonversi pilihan yang dientrikan (B, b, K, k, G, atau g) dan menghasilkan tipe objek yang sesuai. Fungsi ini hanya memiliki satu parameter bertipe char. Fungsi ini merupakan sebuah fungsi penghasil nilai dan menghasilkan nilai balik berupa sebuah nilai bertipe tipeObjek. Dalam pseudocode, algoritma fungsi ini adalah:

if pilihan adalah 'B' atau 'b'
    return BATU;
if pilihan adalah 'K' atau 'k'
    return KERTAS;
if pilihan adalah 'G' atau 'g'
    return GUNTING;

Definisi atas fungsi ambilPermainan adalah:

tipeObjek ambilPermainan(char pilihan)
{
    tipeObjek objek;

    switch (pilihan)
    {
        case 'B':
        case 'b':
            objek = BATU;
            break;
        case 'K':
        case 'k':
            objek = KERTAS;
            break;
        case 'G':
        case 'g':
            objek = GUNTING;
    }

    return objek;
}
Fungsi hasilPermainan
Fungsi ini memutuskan apakah sebuah permainan seri atau pemain mana yang memenangkan permainan. Fungsi ini menampilkan pilihan tiap pemain dan pemenang permainan. Jelaslah, fungsi ini memiliki tiga parameter: pilihan pemain 1, pilihan pemain 2, dan sebuah parameter untuk menghasilkan pemenang. Dalam pseudocode, fungsi ini adalah:

a.       jika pemain 1 dan pemain 2 memiliki pilihan sama, maka permainan menjadi seri.
b.      sebaliknya
{
1.      Menentukan objek pemenang. (Memanggil fungsi objekPemenang)
2.      Menampilkan pilihan tiap pemain.
3.      Menentukan pemain yang menang.
4.      Menghasilkan pemain yang menang lewat sebuah parameter referensi ke fungsi main sehingga fungsi main dapat memperbarui jumlah kemenangan dari pemenang.
            }

Definisi atas fungsi ini adalah:

void hasilPermainan(tipeObjek pemain1, tipeObjek pemain2, int& pemenang)
{
    tipeObjek objekPemenang;

    if (pemain1 == pemain2)
    {
        pemenang = 0;
        cout << "Kedua pemain memilih ";
        konversiEnum(pemain1);
        cout << ". Ini adalah permainan seri." << endl;
    }
    else
    {
        objekPemenang = objekPemenangan(pemain1, pemain2);

        //Menampilkan pilihan tiap pemain
        cout << "Pemain 1 memilih ";
        konversiEnum(pemain1);
        cout << " dan pemain 2 memilih ";
        konversiEnum(pemain2);
        cout << ". ";

        //Menentukan pemenang
        if (pemain1 == objekPemenang)
            pemenang = 1;
        else if (pemain2 == objekPemenang)
            pemenang = 2;

        //Menampilkan pemenang
        cout << "Pemain " << pemenang << " memenangkan permainan."
             << endl;
    }
}

Fungsi konversiEnum
Karena tipe enumerasi tidak dapat ditampilkan secara langsung, akan dituliskan fungsi konversiEnum untuk menampilkan objek – objek dari tipeObjek. Fungsi ini memiliki satu parameter, bertipe tipeObjek. Ia menampilkan string yang berkaitan dengan tipeObjek. Dalam pseudocode, fungsi ini adalah:

jika objek adalah BATU
    tampilkan “Batu”
jika objek adalah KERTAS
    tampilkan “Kertas”
jika objek adalah GUNTING
    tampilkan “Gunting”

Definisi atas fungsi konversiEnum adalah:

void konversiEnum(tipeObjek objek)
{
    switch (objek)
    {
        case BATU:
            cout << "Batu";
            break;
        case KERTAS:
            cout << "Kertas";
            break;
        case GUNTING:
            cout << "Gunting";
    }
}

Fungsi objekPemenangan
Untuk menentukan pemenang permainan, Anda perlu melihat pilihan pemain dan kemudian melihat aturan permainan. Sebagai contoh, jika satu pemain memilih BATU dan pemain lain memilih KERTAS, maka pemain yang memilih KERTAS akan memenangkan permainan. Dengan kata lain, objek pemenangan adalah KERTAS. Fungsi objekPemenangan, jika diberikan dua objek, memutuskan dan menghasilkan nilai balik berupa objek pemenangan. Jelaslah bahwa fungsi ini memiliki dua parameter bertipe tipeObjek, dan nilai balik yang dihasilkan oleh fungsi ini juga bertipe tipeObjek. Definisi atas fungsi ini adalah:

tipeObjek objekPemenangan(tipeObjek pemain1, tipeObjek pemain2)
{
    if ((pemain1 == BATU && pemain2 == GUNTING)
          || (pemain2 == BATU && pemain1 == GUNTING))
        return BATU;
    else if ((pemain1 == BATU && pemain2 == KERTAS)
          || (pemain2 == BATU && pemain1 == KERTAS))
        return KERTAS;
    else
        return GUNTING;
}


Fungsi tampilHasil
Setelah permainan berakhir, fungsi ini menampilkan hasil akhir, yaitu total jumlah permainan dan jumlah permainan yang dimenangkan oleh setiap pemain. Total jumlah permainan disimpan di dalam variabel hitungPermainan, jumlah permainan yang dimenangkan oleh pemain 1 disimpan di dalam variabel hitungMenang1, dan jumlah permainan yang dimenangkan oleh pemain 2 disimpan di dalam variabel hitungMenang2. Fungsi ini memiliki tiga parameter yang berkaitan dengan ketiga variabel ini. Definisi atas fungsi ini adalah:

void tampilHasil(int gHitung, int wHitung1, int wHitung2)
{
    cout << "Total jumlah permainan: " << gHitung
         << endl;

    cout << "Jumlah permainan yang dimenangkan oleh pemain 1: "
         << wHitung1 << endl;

    cout << " Jumlah permainan yang dimenangkan oleh pemain 2: "
         << wHitung2 << endl;
}

Program Utuh

//Program: Permainan Batu, Kertas, dan Gunting

#include <iostream>

using namespace std;

enum tipeObjek {BATU, KERTAS, GUNTING};

//Prototipe fungsi
void tampilAturan();
tipeObjek ambilPermainan(char pilihan);
bool pilihanValid(char pilihan);
void konversiEnum(tipeObjek objek);
void hasilPermainan(tipeObjek pemain1, tipeObjek pemain2, int& pemenang);
void tampilHasil(int gHitung, int wHitung1, int wHitung2);
tipeObjek objekPemenangan(tipeObjek pemain1, tipeObjek pemain2);

int main()
{
    int hitungPermainan;   //variabel untuk menyimpan jumlah permainan
                                  //yang telah dimainkan
    int hitungMenang1;     //variabel untuk menyimpan jumlah permainan
                           //yang dimenangkan oleh pemain 1
    int hitungMenang2;     //variabel untuk menyimpan jumlah permainan
                                  //yang dimenangkan oleh pemain 2
    int pemenangPermainan;
    char respon;           //variabel untuk mendapatkan respon pengguna
    char pilihan1;
    char pilihan2;

    tipeObjek pemain1;     //pilihan pemain 1
    tipeObjek pemain2;     //pilihan pemain 2

    //Inisialisasi variabel-variabel
    hitungPermainan = 0;
    hitungMenang1 = 0;
    hitungMenang2 = 0;

    tampilAturan();

    cout << "Masukkan Y/y untuk memainkan permainan: ";
    cin >> respon;
    cout << endl;

    while (respon == 'Y' || respon == 'y')
    {
        cout << "Pemain 1 masukkan pilhan Anda: ";
        cin >> pilihan1;
        cout << endl;

        cout << "Pemain 2 masukkan pilhan Anda: ";
        cin >> pilihan2;
        cout << endl;

       if (pilihanValid(pilihan1)
            && pilihanValid(pilihan2))
       {
            pemain1 = ambilPermainan(pilihan1);
            pemain2 = ambilPermainan(pilihan2);

            hitungPermainan++;

            hasilPermainan(pemain1, pemain2, pemenangPermainan);

            if (pemenangPermainan == 1)
                hitungMenang1++;
            else if (pemenangPermainan == 2)
                hitungMenang2++;
       }//akhir if

        cout << "Masukkan Y/y untuk memainkan permainan: ";
        cin >> respon;
        cout << endl;
       }//akhir while

    tampilHasil(hitungPermainan, hitungMenang1, hitungMenang2);

    return 0;
}//akhir main

void tampilAturan()
{
    cout << "Selamat datang ke permainan Batu, Kertas, "
         << "dan Gunting." << endl;
    cout << "Ini merupakan sebuah permainan dua pemain. Untuk tiap "
         << "permainan, setiap" << endl;
    cout << "pemain memilih salah satu objek Batu, "
         << "Kertas, atau Gunting." << endl;
    cout << "Beberapa aturan untuk memenangkan permainan adalah: " << endl;
    cout << "1. Jika kedua pemain memilih objek yang sama, permainan "
         << "seri." << endl;
    cout << "2. Batu memecah Gunting: Jadi pemain yang memilih "
         << "Batu akan menang." << endl;
    cout << "3. Kertas menutupi Batu: Jadi pemain yang memilih "
         << "Kertas akan menang." << endl;
    cout << "4. Gunting memotong kertas: Jadi pemain yang memilih "
         << "Gunting akan menang." << endl << endl;
    cout << "Masukkan B atau b untuk Batu, K atau k untuk memilih "
         << "Kertas, dan G atau g untuk memilih Gunting." << endl;
}

tipeObjek ambilPermainan(char pilihan)
{
    tipeObjek objek;

    switch (pilihan)
    {
        case 'B':
        case 'b':
            objek = BATU;
            break;
        case 'K':
        case 'k':
            objek = KERTAS;
            break;
        case 'G':
        case 'g':
            objek = GUNTING;
    }

    return objek;
}

void hasilPermainan(tipeObjek pemain1, tipeObjek pemain2, int& pemenang)
{
    tipeObjek objekPemenang;

    if (pemain1 == pemain2)
    {
        pemenang = 0;
        cout << "Kedua pemain memilih ";
        konversiEnum(pemain1);
        cout << ". Ini adalah permainan seri." << endl;
    }
    else
    {
        objekPemenang = objekPemenangan(pemain1, pemain2);

        //Menampilkan pilihan tiap pemain
        cout << "Pemain 1 memilih ";
        konversiEnum(pemain1);
        cout << " dan pemain 2 memilih ";
        konversiEnum(pemain2);
        cout << ". ";

        //Menentukan pemenang
        if (pemain1 == objekPemenang)
            pemenang = 1;
        else if (pemain2 == objekPemenang)
            pemenang = 2;

        //Menampilkan pemenang
        cout << "Pemain " << pemenang << " memenangkan permainan."
             << endl;
    }
}

void konversiEnum(tipeObjek objek)
{
    switch (objek)
    {
        case BATU:
            cout << "Batu";
            break;
        case KERTAS:
            cout << "Kertas";
            break;
        case GUNTING:
            cout << "Gunting";
    }
}

tipeObjek objekPemenangan(tipeObjek pemain1, tipeObjek pemain2)
{
    if ((pemain1 == BATU && pemain2 == GUNTING)
          || (pemain2 == BATU && pemain1 == GUNTING))
        return BATU;
    else if ((pemain1 == BATU && pemain2 == KERTAS)
          || (pemain2 == BATU && pemain1 == KERTAS))
        return KERTAS;
    else
        return GUNTING;
}

bool pilihanValid(char pilihan)
{
    switch (pilihan)
    {
        case 'B':
        case 'b':
        case 'K':
        case 'k':
        case 'G':
        case 'g':
            return true;
        default:
            return false;
    }
}

void tampilHasil(int gHitung, int wHitung1, int wHitung2)
{
    cout << "Total jumlah permainan: " << gHitung
         << endl;

    cout << "Jumlah permainan yang dimenangkan oleh pemain 1: "
         << wHitung1 << endl;

    cout << "Jumlah permainan yang dimenangkan oleh pemain 2: "
         << wHitung2 << endl;
}

Keluaran Program:

Selamat datang ke permainan Batu, Kertas, dan Gunting.
Ini merupakan sebuah permainan dua pemain. Untuk tiap permainan, setiap
pemain memilih salah satu objek Batu, Kertas, atau Gunting.
Beberapa aturan untuk memenangkan permainan adalah:
1. Jika kedua pemain memilih objek yang sama, permainan seri.
2. Batu memecah Gunting: Jadi pemain yang memilih Batu akan menang.
3. Kertas menutupi Batu: Jadi pemain yang memilih Kertas akan menang.
4. Gunting memotong kertas: Jadi pemain yang memilih Gunting akan menang.

Masukkan B atau b untuk Batu, K atau k untuk memilih Kertas, dan G atau g untuk
memilih Gunting.
Masukkan Y/y untuk memainkan permainan: y

Pemain 1 masukkan pilhan Anda: b

Pemain 2 masukkan pilhan Anda: k

Pemain 1 memilih Batu dan pemain 2 memilih Kertas. Pemain 2 memenangkan permainan.
Masukkan Y/y untuk memainkan permainan: y

Pemain 1 masukkan pilihan Anda: g

Pemain 2 masukkan pilihan Anda: b

Pemain 1 memilih Gunting dan pemain 2 memilih Batu. Pemain 2 memenangkan permainan.
Masukkan Y/y untuk memainkan permainan: y

Pemain 1 masukkan pilhan Anda: k

Pemain 2 masukkan pilhan Anda: g

Pemain 1 memilih Kertas dan pemain 2 memilih Gunting. Pemain 2 memenangkan permainan.
Masukkan Y/y untuk memainkan permainan: y

Pemain 1 masukkan pilhan Anda: G

Pemain 2 masukkan pilhan Anda: B

Pemain 1 memilih Gunting dan pemain 2 memilih Batu. Pemain 2 memenangkan permainan.
Masukkan Y/y untuk memainkan permainan: t

Total jumlah permainan: 4
Jumlah permainan yang dimenangkan oleh pemain 1: 0
Jumlah permainan yang dimenangkan oleh pemain 2: 4


Namespace

Ketika sebuah file header, seperti iostream, dicantumkan di dalam suatu program, semua pengenal global di dalam file header itu menjadi pengenal global di dalam program. Oleh karena itu, jika sebuah pengenal global di dalam program memiliki nama sama dengan nama global di dalam file header, maka kompiler akan menghasilkan error sintaks (seperti “identifier redefined”). Masalah yang sama dapat terjadi jika sebuah program menggunakan pustaka pihak – ketiga. Untuk mengatasi masalah ini, vendor pihak – ketiga dapat mengawali setiap pengenal globalnya menggunakan sebuah simbol spesial. Pada Bab 1, Anda telah belajar bahwa karena vendor kompiler memulai setiap nama pengenal global dengan garis – bawah (_), untuk menghindari error, Anda sebaiknya tidak mengawali nama pengenal di dalam program Anda dengan sebuah garis – bawah (_).

C++ Standar ANSI/ISO mencoba mengatasi permasalahan tumpang – tindihnya nama pengenal global menggunakan mekanisme namespace. Sintaks umum dari statemen namespace adalah:

namespace nama_namespace
{
    anggota-anggota
}

dimana anggota – anggota biasanya merupakan konstanta bernama, deklarasi variabel, fungsi, atau namespace lain. Perhatikan bahwa nama_namespace merupakan sebuah pengenal C++.

Dalam C++, namespace merupakan katakunci.

Contoh 7.8


Statemen:

namespace tipeGlobal
{
    const int N = 10;
    const double LAJU = 7.50;
    int hitung = 0;
    void tampilHasil();
}

mendefinisikan tipeGlobal sebagai sebuah namespace dengan empat anggota: konstanta bernama N dan LAJU, variabel hitung, dan fungsi tampilHasil.

Skop sebuah anggota namespace adalah di dalam namespace tersebut. Anda dapat mengakses anggota namespace di luar namespace dengan dua cara, seperti yang akan dijelaskan berikut.

Sintaks umum dalam mengakses sebuah anggota namespace adalah:

nama_namespace::pengenal

Ingat bahwa dalam C++, :: disebut dengan operator resolusi skop.

Untuk mengakses anggota LAJU dari namespace tipeGlobal, statemen berikut digunakan:

tipeGlobal::LAJU

Untuk mengakses anggota tampilHasil (yang merupakan sebuah fungsi), statemen berikut digunakan:

tipeGlobal::tampilHasil();

Jadi, untuk mengakses sebuah anggota namespace, Anda menggunakan nama_namespace, diikuti dengan operator resolusi skop dan nama anggota.

Untuk menyederhanakan pengaksesan sebuah anggota namespace, C++ Standar ANSI/ISO menyediakan penggunaan statemen using. Sintaks dalam menggunakan statemen using adalah sebagai berikut:
a.       Untuk menyederhanakan pengaksesan semua anggota namespace:

using namespace nama_namespace;

b.      Untuk menyederhanakan pengaksesan anggota tertentu dari sebuah namespace:

using nama_namespace::pengenal;

Sebagai contoh, statemen using:

using namespace tipeGlobal;

menyederhanakan pengaksesan semua anggota dari namespace tipeGlobal. Statemen:

using tipeGlobal::LAJU;

menyederhanakan pengaksesan anggota LAJU dari namespace tipeGlobal.

Dalam C++, using adalah katakunci.

Anda secara umum menempatkan statemen using setelah deklarasi namespace. Untuk namespace tipeGlobal, misalnya, Anda menuliskan kode sebagai berikut:

namespace tipeGlobal
{
    const int N = 10;
    const double LAJU = 7.50;
    int hitung = 0;
    void tampilHasil();
}
using namespace tipeGlobal;

Setelah statemen using, untuk mengakses sebuah anggota namespace, Anda tidak perlu menempatkan nama_namespace dan operator resolusi skop sebelum anggota namespace. Namun, jika sebuah anggota namespace dan sebuah pengenal global di dalam program memiliki nama sama, untuk mengakses anggota namespace ini di dalam program, nama_namespace dan operator resolusi skop harus dipakai mengawali anggota namespace. Sama halnya, jika sebuah anggota namespace dan sebuah pengenal di dalam suatu blok memiliki nama sama, untuk mengakses anggota namespace ini di dalam blok, nama_namespace dan operator resolusi skop harus dipakai mengawali anggota namespace.

Contoh 7.9 sampai contoh 7.12 akan membantu mengklarifikasi mekanisme namespace ini.

Contoh 7.9


Perhatikan kode C++ berikut:

#include <iostream>

using namespace std;
.
.
.
int main()
{
    .
    .
    .
}
.
.
.

Pada contoh ini, Anda dapat mengakses pengenal global di dalam file header iostream, seperti cin, cout, dan endl, tanpa menggunakan prefiks std:: yang ditempatkan sebelum nama pengenal. Pembatasan yang ada adalah bahwa blok (atau fungsi) yang mengakses pengenal global (dari file header iostream) harus tidak memuat sembarang pengenal dengan nama sama dengan pengenal global (dari file header iostream).

Contoh 7.10


Perhatikan kode C++ berikut:

#include <cmath>

int main()
{
    double x = 15.3;
    double y;

    y = std::pow(x, 2);
    .
    .
    .
}

Contoh ini mengakses fungsi pow dari file header cmath.

Contoh 7.11


Perhatikan kode C++ berikut:

#include <iostream>
.
.
.
int main()
{
    using namespace std;
    .
    .
    .
}
.
.
.

Pada contoh ini, fungsi main dapat mengakses pengenal global dari file header iostream tanpa menggunakan prefiks std:: yang ditempatkan sebelum nama pengenal. Statemen using ditempatkan di dalam fungsi main. Oleh karena itu, semua fungsi lain (jika ada) harus menggunakan prefiks std:: sebelum nama pengenal global dari file header iostream kecuali jika fungsi tersebut memiliki statemen using yang sama.

Contoh 7.12


Perhatikan kode C++ berikut:

#include <iostream>

using namespace std;              //Baris 1

int t;                            //Baris 2
double u;                         //Baris 3

namespace ekspN
{
    int x;                        //Baris 4
    char t;                       //Baris 5
    double u;                     //Baris 6
    void tampilHasil();           //Baris 7
}

using namespace ekspN;

int main()
{
    int satu;                     //Baris 8
    double t;                     //Baris 9
    double tiga;                  //Baris 10
    .
    .
    .
}

void ekspN::tampilHasil() //Definisi atas fungsi tampilHasil
{
.
.
.
}

Dalam program C++ ini:
1.      Untuk mengakses variabel t pada baris 2 di dalam main, digunakan operator resolusi skop, ::, karena fungsi main memiliki sebuah variabel bernama t (dideklarasikan pada baris 9). Sebagai contoh, untuk menyalin nilai x ke dalam t, Anda dapat menggunakan statemen  ::t = x;.
2.      Untuk mengakses anggota t (dideklarasikan pada baris 5) dari namespace ekspN di dalam main, digunakan prefiks ekspN::t karena terdapat sebuah variabel global bernama t (dideklarasikan pada baris 2) dan sebuah variabel bernama t di dalam main.
3.      Untuk mengakses anggota u (dideklarasikan pada baris 6) dari namespace ekspN di dala main, digunakan prefiksi ekspN::u karena terdapat sebuah variabel global bernama u (dideklarasikan pada baris 3).
4.      Anda dapat mengakses anggota x (dideklarasikan pada baris 4) dari namespace ekspN di dalam main menggunakan x saja atau ekspN::x karena tidak ada variabel global bernama x dan fungsi main tidak memuat sembarang pengenal yang bernama x.
5.      Definisi atas sebuah fungsi yang merupakan anggota dari sebuah namespace, seperti tampilHasil, biasanya ditulis di luar namespace seperti pada program tersebut. Untuk menulis definisi fungsi tampilHasil, nama fungsi di dalam kepala fungsi bisa tampilHasil saja atau ekspN::tampilHasil (karena tidak ada pengenal global lain yang bernama tampilHasil).


Tipe string

Tipe data string merupakan tipe terdefinisi – programer dan bukan bagian dari bahasa C++; pustaka standar C++yang menyediakannya. Sebelum menggunakan tipe data string, program harus mencantumkan file header string, sebagai berikut:

#include <string>

Ingat bahwa dalam C++, string merupakan sebuah runtun yang memuat nol atau lebih karakter dan diapit oleh tanda kutip ganda.

Statemen:

string nama = "Roro Kusumawardani";

mendeklarasikan nama sebagai sebuah variabel string dan menginisialisasinya dengan “Roro Kusumawardani”. Posisi dari karakter pertama, R, di dalam nama adalah 0; posisi dari karakter kedua, o, adalah 1, dan seterusnya. Jadi, posisi dari karakter pertama di dalam sebuah variabel string dimulai dari 0, bukan dari 1.

Variabel nama dapat menyimpan string dengan panjang sesuka Anda.

Bab 2 telah mendiskusikan beberapa operasi I/O yang diterapkan terhadap tipe string. Bab 3 telah menjelaskan beberapa operasi relasional pada tipe string. Direkomendasikan Anda membaca ulang Bab 2 dan Bab 3 dan meninjau – ulang operasi – operasi relasional dan I/O pada tipe string.

Beberapa operator lain, seperti operator biner + (untuk operasi penyambungan string) dan operator indeks array (subskript) [ ], telah didefinisikan untuk tipe data string. Sekarang, akan didiskusikan bagaimana kedua operator ini diterapkan terhadap tipe data string.

Dimisalkan bahwa Anda memiliki beberapa statemen berikut:

string str1, str2, str3;

Statemen:

str1 = "Hallo Semua";

menyimpan string “Hallo Semua” di dalam str1. Statemen:

str2 = str1;

menyalin nilai dari str1 ke dalam str2. Jika str1 = “Hari”, maka statemen

str2 = str1 + " Cerah";

menyimpan string “Hari Cerah” ke dalam str2.

Dimisalkan bahwa str1 =Hallo” dan str2 =Semua”. Statemen:

str3 = str1 + " " + str2;

menyimpan “Hallo Semua” ke dalam str3. Statemen ini ekivalen dengan statemen:

str3 = str1 + ' ' + str2;

Juga, statemen:

str1 = str1 + " Robert";

memperbarui nilai dari str1 dengan menempelkan string “ Robert” ke nilai lamanya. Oleh karena itu, nilai baru dari str1 adalah “Hallo Robert”.

Jika str1 = “Hallo semua”, maka statemen:

str1[6] = 'S';

mengganti karakter t dengan karakter T. Ingat bahwa posisi dari karakter pertama di dalam sebuah variabel string adalah 0. Oleh karena itu, karena t adalah karakter ketujuh di dalam str1, posisinya adalah 6.

Dalam C++, [ ] disebut dengan operator subskript array.

Seperti diilustrasikan sebelumnya, dengan menggunakan operator subskript array bersamaan dengan posisi karakter, Anda dapat mengakses karakter individu di dalam sebuah string.

Contoh 7.13


Program berikut menunjukkan efek dari beberapa statemen sebelumnya.

//Contoh operasi-operasi string

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string nama = "Roro Kusumawandari";                //Baris 1
    string str1, str2, str3, str4;                            //Baris 2

    cout << "Baris 3: Nama = " << nama << endl;               //Baris 3

    str1 = "Hallo Semua";                              //Baris 4
    cout << "Baris 5: str1 = " << str1 << endl;               //Baris 5

    str2 = str1;                                       //Baris 6
    cout << "Baris 7: str2 = " << str2 << endl;               //Baris 7

    str1 = "Hari";                                     //Baris 8
    str2 = str1 + " Cerah";                                   //Baris 9
    cout << "Baris 10: str2 = " << str2 << endl;              //Baris 10

    str1 = "Hallo";                                    //Baris 11
    str2 = "Semua";                                    //Baris 12
    str3 = str1 + " " + str2;                          //Baris 13
    cout << "Baris 14: str3 = " << str3 << endl;              //Baris 14

    str3 = str1 + ' ' + str2;                          //Baris 15
    cout << "Baris 16: str3 = " << str3 << endl;              //Baris 16

    str1 = str1 + " Robert";                                  //Baris 17
    cout << "Baris 18: str1 = " << str1 << endl;              //Baris 18

    str1 = "Hallo semua";                              //Baris 19
    cout << "Baris 20: str1[6 ] = " << str1[6 ]
         << endl;                                      //Baris 20

    str1[6] = 'S';                                     //Baris 21
    cout << "Baris 22: str1 = " << str1 << endl;              //Baris 22

    //Operasi-operasi masukan string
    cout << "Baris 23: Masukkan sebuah string "
         << "tanpa spasi: ";                                  //Baris 23
    cin >> str1;                                       //Baris 24

    char ch;                                           //Baris 25
    cin.get(ch); //Membaca karakter garis-baru; Baris 26
    cout << endl;                                      //Baris 27

    cout << "Baris 28: String yang Anda masukkan = "
         << str1 << endl;                              //Baris 28

    cout << "Baris 29: Masukkan sebuah kalimat: ";            //Baris 29
    getline(cin, str2);                                //Baris 30
    cout << endl;                                      //Baris 31

    cout << "Baris 32: Kalimat yang Anda masukkan = " << str2
         << endl;                                      //Baris 32

    return 0;
}

Keluaran Program:

Baris 3: Nama = Roro Kusumawandari
Baris 5: str1 = Hallo Semua
Baris 7: str2 = Hallo Semua
Baris 10: str2 = Hari Cerah
Baris 14: str3 = Hallo Semua
Baris 16: str3 = Hallo Semua
Baris 18: str1 = Hallo Robert
Baris 20: str1[6 ] = s
Baris 22: str1 = Hallo Semua
Baris 23: Masukkan sebuah string tanpa spasi: Pemrograman

Baris 28: String yang Anda masukkan = Pemrograman
Baris 29: Masukkan sebuah kalimat: Menguji operasi-operasi string

Baris 32: Kalimat yang Anda masukkan = Menguji operasi-operasi string

Operasi – Operasi string Lain
Tipe data string memiliki sebuah tipe data, string::size_type, dan sebuah konstanta bernama, string::npos, yang didefinisikan sebagai berikut:

string::size_type
Sebuah tipe integer tak – bertanda.

string::npos
Nilai maksimum dari tipe data string::size_type, yaitu sebuah angka 4294967295 pada kebanyakan mesin.


Tipe data string memuat beberapa fungsi lain untuk manipulasi string. Tabel berikut menjelaskan beberapa fungsi tersebut. Pada tabel ini, diasumsikan bahwa strVar merupakan variabel string dan str merupakan sebuah variabel string, sebuah konstanta string, atau sebuah array karakter (Array akan didiskusikan pada Bab 8).

Tabel 7.1 Beberapa fungsi string
Ekspresi
Penjelasan
strVar.at(indeks)
Menghasilkan elemen pada posisi yang ditentukan oleh indeks.

strVar[indeks]
Menghasilkan elemen pada posisi yang ditentukan oleh indeks.

strVar.append(n, ch)
Menempelkan n salinan dari ch pada strVar, dimana di dalamnya ch merupakan sebuah variabel ch atau sebuah karakter konstanta.

strVar.append(str)
Menempelkan str pada strVar.

strVar.clear()
Menghapus semua karakter di dalam strVar.

strVar.compare(str)
Membandingkan strVar dan str. (Operasi ini didiskusikan pada Bab 3).

strVar.empty()
Menghasilkan true jika strVar kosong; sebaliknya, ia menghasilkan false.

strVar.erase()
Menghapus semua karakter di dalam strVar.

strVar.erase(pos, n)
Menghapus n karakter dari strVar dimulai dari posisi pos.

strVar.find(str)
Menghasilkan indeks dari kemunculan pertama dari str di dalam strVar. Jika str tidak ditemukan, maka nilai spesial str::npos dijadikan nilai balik.

strVar.find(str, pos)
Menghasilkan indeks dari kemunculan pertama dari str yang ditemukan di dalam strVar mulai dari atau setelah pos.

strVar.find_first_of(str, pos)
Menghasilkan indeks dari kemunculan sembarang karakter dari strVar di dalam str. Pencarian dimulai dari pos.

strVar.find_first_not_of(str, pos)
Menghasilkan indeks dari kemunculan sembarang karakter dari str yang tidak ada di dalam strVar. Pencarian dimulai dari pos.

strVar.insert(pos, n, ch);
Menyisipkan n buah karakter ch pada indeks pos di dalam strVar; pos dan n bertipe string::size_type; ch adalah sebuah karakter.

strVar.insert(pos, str);
Menyisipkan semua karakter dari str pada posisi pos di dalam strVar.

strVar.length()
Menghasilkan sebuah nilai bertipe string::size_type, yang merupakan jumlah karakter di dalam strVar.

strVar.replace(pos, n, str);
Dimulai dari indeks pos, mengganti n karakter berikutnya dari strVar dengan semua karakter dari str. Jika n > panjang dari strVar, maka semua karakter sampai akhir strVar akan diganti.

strVar.substr(pos, len)
Menghasilkan sebuah string yang merupakan substring dari strVar dimulai dari pos. Panjang substring paling banyak len karakter. Jika len terlalu besar, maka berarti “sampai akhir” string di dalam strVar.

strVar.size()
Menghasilkan sebuah nilai bertipe string::size_type, yang merupakan jumlah karakter di dalam strVar.

strVar.swap(str1);
Menukar isi dari strVar dan str1, dimana str1 adalah sebuah variabel string.


Selanjutnya, akan ditunjukkan beberapa dari fungsi ini bekerja.

Contoh 7.14


Perhatikan beberapa statemen berikut:

string namaPertama = "Elisabeth";
string nama = namaPertama + " Manurung";
string str1 = "Hari ini cerah.";
string str2 = "";
string str3 = "ilmu komputer";
string str4 = "pemrograman C++.";
string str5 = namaPertama + " mengambil kuliah " + str4;

string::size_type pjg;

Selanjutnya, akan ditunjukkan pengaruh dari fungsi clear, empty, erase, length, dan size.

str3.clear();
str3  = “”;
str1.empty();
Menghasilkan false;
str2.empty();
Menghasilkan true;
str4.erase(11, 4);
str4 = "pemrograman.";
cout << namaPertama.length() << endl;
Menampilkan 9
cout << nama.length() << endl;
Menampilkan 18
cout << str1.length() << endl;
Menampilkan 15
cout << str5.size() << endl;
Menampilkan 43
pjg = nama.length();
Nilai dari pjg adalah 18

Program berikut mengilustrasikan kegunaan dari fungsi length.

//Contoh: Fungsi clear, empty, erase, length, dan size

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string namaPertama = "Elisabeth";                                //Baris 1
    string nama = namaPertama + " Manurung";                  //Baris 2
    string str1 = "Hari ini cerah.";                          //Baris 3
    string str2 = "";                                         //Baris 4
    string str3 = "ilmu komputer";                                   //Baris 5
    string str4 = "pemrograman C++.";                         //Baris 6
    string str5 = namaPertama + " mengambil kuliah " + str4;         //Baris 7

    string::size_type pjg;                                           //Baris 8

    cout << "Baris 9: str3: " << str3 << endl;                //Baris 9
    str3.clear();                                             //Baris 10
    cout << "Baris 11: Setelah clear, str3: " << str3
         << endl;                                             //Baris 11

    cout << "Baris 12: str1.empty(): " << str1.empty()
         << endl;                                             //Baris 12

    cout << "Baris 13: str2.empty(): " << str2.empty()
         << endl;                                             //Baris 13

    cout << "Baris 14: str4: " << str4 << endl;                      //Baris 14
    str4.erase(11, 4);                                        //Baris 15
    cout << "Baris 16: Setelah erase(11, 4), str4: "
         << str4 << endl; //Baris 16

    cout << "Baris 17: Panjang dari \"" << namaPertama << "\" = "
         << static_cast<unsigned int> (namaPertama.length())
         << endl;                                             //Baris 17

    cout << "Baris 18: Panjang dari \"" << nama << "\" = "
         << static_cast<unsigned int> (nama.length())
         << endl;                                             //Baris 18

    cout << "Baris 19: Panjang dari \"" << str1 << "\" = "
         << static_cast<unsigned int> (str1.length())
         << endl;                                             //Baris 19

    cout << "Baris 20: Ukuran dari \"" << str5 << "\" = "
         << static_cast<unsigned int> (str5.size())
         << endl;                                             //Baris 20

    pjg = nama.length();                                      //Baris 21

    cout << "Baris 22: pjg = "
         << static_cast<unsigned int> (pjg) << endl;          //Baris 22

    return 0; //Baris 23
}

Keluaran Program:

Baris 9: str3: ilmu komputer
Baris 11: Setelah clear, str3: ilmu komputer
Baris 12: str1.empty(): 0
Baris 13: str2.empty(): 1
Baris 14: str4: pemrograman C++.
Baris 16: Setelah erase(11, 4), str4: pemrograman.
Baris 17: Panjang dari "Elisabeth" = 9
Baris 18: Panjang dari "Elisabeth Manurung" = 18
Baris 19: Panjang dari "Hari ini cerah." = 15
Baris 20: Ukuran dari "Elisabeth mengambil kuliah pemrograman C++." = 43
Baris 22: pjg = 18

Contoh 7.15


Dimisalkan bahwa str1 dan str2 keduanya bertipe string. Berikut adalah beberapa pemanggilan valid terhadap fungsi find.

str1.find(str2)
str1.find("apa")
str1.find('a')
str1.find(str2 + "xyz")
str1.find(str2 + 'b')

Perhatikan beberapa statemen berikut:

string kalimat = "Hari ini sedikit berawan dan lembab.";
string str = "berawan";

string::size_type posisi;

Selanjutnya, akan ditunjukkan efek dari fungsi find.

cout << kalimat.find("se") << endl;
Menampilkan 9
cout << kalimat.find('i') << endl;
Menampilkan 3
cout << kalimat.find(str) << endl;
Menampilkan 17
cout << kalimat.find("xyz") << endl;
Menampilkan nilai dari str::npos
cout << kalimat.find('d', 6) << endl;
Menampilkan 11
position = kalimat.find("lembab");
Menugaskan 29 kepada posisi

Perhatikan bahwa pencarian bersifat case sensitive, dimana huruf besar berbeda dari huruf kecil.

Program berikut mengevaluasi beberapa statemen sebelumnya.

//Contoh: fungsi find

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string kalimat = "Hari ini sedikit berawan dan lembab."; //Baris1
    string str = "berawan";                                          //Baris 2

    string::size_type posisi;                                 //Baris3

    cout << "Baris 4: kalimat = \"" << kalimat
         << "\"" << endl;                                     //Baris 4

    cout << "Baris 5: Posisi dari \"se\" di dalam kalimat = "
         << static_cast<unsigned int> (kalimat.find("se"))
         << endl;                                             //Baris 5

    cout << "Baris 6: Posisi dari 'i' di dalam kalimat = "
         << static_cast<unsigned int> (kalimat.find('i'))
         << endl;                                             //Baris 6

    cout << "Baris 7: Posisi dari \"" << str
         << "\" di dalam kalimat = "
         << static_cast<unsigned int> (kalimat.find(str))
         << endl;                                             //Baris 7

    cout << "Baris 8: Posisi dari \"xyz\" di dalam kalimat = "
         << static_cast<unsigned int> (kalimat.find("xyz"))
          << endl;                                            //Baris 8

    cout << "Baris 9: Kemunculan pertama dari \'d\' di dalam "
         << "kalimat \n setelah posisi 6 = "
         << static_cast<unsigned int> (kalimat.find('d', 6))
         << endl;                                             //Baris 9

    posisi = kalimat.find("lembab");                                 //Baris 10

    cout << "Baris 11: " << "Posisi = "
         << posisi << endl;                                          //Baris 11

    return 0;                                                        //Baris 12
}

Keluaran Program:

Baris 4: kalimat = "Hari ini sedikit berawan dan lembab."
Baris 5: Posisi dari "se" di dalam kalimat = 9
Baris 6: Posisi dari 'i' di dalam kalimat = 3
Baris 7: Posisi dari "berawan" di dalam kalimat = 17
Baris 8: Posisi dari "xyz" di dalam kalimat = 4294967295
Baris 9: Kemunculan pertama dari 'd' di dalam kalimat
 setelah posisi 6 = 11
Baris 11: Posisi = 29

Contoh 7.16


Program berikut mendemonstrasikan fungsi insert dan replace.

//Contoh: Fungsi insert dan replace

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string stringPertama = "Berawan dan hangat.";                          //Baris 1
    string stringKedua = "Hallo semua"; //Baris 2
    string stringKetiga = "Robert mengambil kuliah pemrograman I."; //Baris 3
    string str1 = " sangat ";                                        //Baris 4
    string str2 = "Foster";                                                //Baris 5

       cout << "Baris 6: stringPertama = " << stringPertama
         << endl;                                                    //Baris 6

    stringPertama.insert(11, str1);                                        //Baris 7

    cout << "Baris 8: Setelah insert; stringPertama = "
         << stringPertama << endl;                                         //Baris 8

    cout << "Baris 9: stringKedua = " << stringKedua
         << endl;                                                    //Baris 9

    stringKedua.insert(11, 5, '!');                                        //Baris 10

    cout << "Baris 11: Setelah insert; stringKedua = "
         << stringKedua << endl;                                     //Baris 11

    cout << "Baris 12: stringKetiga = " << stringKetiga
         << endl;                                                    //Baris 12

    stringKetiga.replace(0, 6, str2);                                //Baris 13

    cout << "Baris 14: Setelah replace, stringKetiga = "
         << stringKetiga << endl;                                    //Baris 14

    return 0;                                                              //Baris 15
}

Keluaran Program:

Baris 6: stringPertama = Berawan dan hangat.
Baris 8: Setelah insert; stringPertama = Berawan dan sangat  hangat.
Baris 9: stringKedua = Hallo semua
Baris 11: Setelah insert; stringKedua = Hallo semua!!!!!
Baris 12: stringKetiga = Robert mengambil kuliah pemrograman I.
Baris 14: Setelah replace, stringKetiga = Foster mengambil kuliah pemrograman I.

Contoh 7.17


Program berikut mendemonstrasikan fungsi substr.

//Contoh: Fungsi substr

#include <iostream>
#include <string>

using namespace std;

int main()
{

    string kalimat;                                           //Baris 1
    string str;                                              //Baris 2

    kalimat = "Hari ini berawan dan hangat.";                 //Baris 3

    cout << "Baris 4: substr(0, 5) di dalam \""
         << kalimat << "\" = \""
         << kalimat.substr(0, 5) << "\"" << endl;                    //Baris 4

    cout << "Baris 5: substr(6, 6) di dalam \""
         << kalimat << "\" = \""
         << kalimat.substr(6, 6) << "\"" << endl;                    //Baris 5

    cout << "Baris 6: substr(6, 16) di dalam \""
         << kalimat << "\" = " << endl
         << " \"" << kalimat.substr(6, 16)
         << "\"" << endl;                                     //Baris 6

    cout << "Baris 7: substr(17, 10) di dalam \""
         << kalimat << "\" = \""
         << kalimat.substr(17, 10) << "\"" << endl;                  //Baris 7

    cout << "Baris 8: substr(3, 6) di dalam \""
         << kalimat << "\" = \""
         << kalimat.substr(3, 6) << "\"" << endl;                    //Baris 8

    str = kalimat.substr(0, 8);                               //Baris 9

    cout << "Baris 10: " << "str = \"" << str
         << "\"" << endl; //Baris 10

    str = kalimat.substr(2, 10);                              //Baris 11

    cout << "Baris 12: " << "str = \"" << str
         << "\"" << endl;                                     //Baris 12

    return 0;
}

Keluaran Program:

Baris 4: substr(0, 5) di dalam "Hari ini berawan dan hangat." = "Hari "
Baris 5: substr(6, 6) di dalam "Hari ini berawan dan hangat." = "ni ber"
Baris 6: substr(6, 16) di dalam "Hari ini berawan dan hangat." =
 "ni berawan dan h"
Baris 7: substr(17, 10) di dalam "Hari ini berawan dan hangat." = "dan hangat"
Baris 8: substr(3, 6) di dalam "Hari ini berawan dan hangat." = "i ini "
Baris 10: str = "Hari ini"
Baris 12: str = "ri ini ber"





















No comments:

Post a Comment