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