Friday, December 23, 2016

Bab 10. C++ Untuk Programer



Bab. 10 Kelas string dan Pemrosesan String


Tujuan Instruksional
      ·         Penugasan dan penyambungan string.
      ·         Membandingkan string.
      ·         Substring.
      ·         Menukar string.
      ·         Karakteristik string.

·         Mencari substring dan karakter di dalam string.
·         Mengganti karakter di dalam string.
·         Menyisipkan karakter ke dalam string.
·         Iterator.






10.1 Introduksi

Template kelas basic_string menyediakan beberapa operasi manipulasi string seperti menyalin, mencari, dan lainnya. Definisi template dan semua fasilitas pendukung didefinisikan di dalam namespace std, yang menyertakan statemen typedef

typedef basic_string< char > string;

yang menciptakan tipe alias string untuk basic_string<char>. Sebuah typedef juga disediakan untuk tipe whcar_t (wstring). Tipe wchar_t1 menyimpan karakter-karakter (karakter dua-byte, karakter empat-byte, dan lainna) untuk mendukung himpunan karakter lain. Untuk menggunakan string, Anda perlu mencantumkan header <string>.

Sebuah objek string dapat diinisialisasi dengan argumen konstruktor seperti

string teks( "Hallo" ); // menciptakan sebuah string dari  const char *

yang menciptakan sebuah string yang memuat karakter-karakter “Hallo”, atau dengan dua argumen konstruktor seperti

string nama( 8, 'x' ); // string yang memuat 8 buah karakter 'x'

yang menciptakan sebuah string yang memuat delapan buah karakter ‘x’. Kelas string juga menyediakan sebuah konstruktor default (yang menciptakan suatu string kosong) dan sebuah konstruktor penyalin. Sebuah string juga dapat diinisialisasi di dalam definisinya seperti

string bulan = "Maret"; // sama dengan: string bulan( "Maret" );

Ingat bahwa = bukanlah penugasan; tetapi merupakan pemanggilan implisit terhadap konstruktor kelas string, yang melakukan konversi.

Kelas string tidak menyediakan konversi dari int atau char ke string di dalam sebuah definisi string. Sebagai contoh, definisi

string error1 = 'c';
string error2( 'u' );
string error3 = 22;
string error4( 8 );

yang akan menghasilkan error sintaks. Penugasan sebuah karakter kepada objek string diijinkan di dalam suatu statemen penugasan seperti

string1 = 'n';

Tidak seperti char * (string versi C), string tidak harus diakhiri dengan karakter null. Panjang sebuah string dapat dicari menggunakan fungsi anggota length dan menggunakan fungsi anggota size. Operator subskript [ ] dapat digunakan bersama string untuk mengakses dan  memodifikasi karakter individual. Seperti string versi-C, string mempunyai subskript pertama 0 dan subskript terakhir length() – 1.

Kebanyakan fungsi anggota di dalam kelas string mengambil sebagai argumen sebuah lokasi subskript awal dan jumlah karakter untuk dioperasikan.

Operator ekstraksi aliran >> dioverload untuk mendukung kelas string. Statemen

string objekString;
cin >> objekString;

mendeklarasikan sebuah objek string dan membaca objek tersebut dari cin. Masukan dipisahkan oleh karakter spasi putih. Ketika pembatas (delimiter) dijumpai, operasi masukan terhenti. Fungsi getline juga dioverload untuk string. Diasumsikan bahwa string1 adalah sebuah objek string, statemen

getline( cin, string1 );

membaca dan menempatkan sebuah objek string dari papanketik ke dalam string1. Masukan dipisahkan atau dibatasi oleh karakter garis-baru (‘\n’), jadi getline dapat membaca sebaris teks dan menempatkannya ke dalam sebuah objek string. Anda bisa menspesifikasi sebuah delimiter opsional sebagai argumen ketiga pada getline.

10.2 Penugasan dan Penyambungan string
Gambar 10.2 mendemonstrasikan penugasan dan penyambungan string. Baris 4 mencantumkan header <string> untuk kelas string. Tiga objek string, string1, string2, dan string3 diciptakan pada baris 9-11. Baris 13 menugaskan nilai dari string1 kepada string2. Setelah penugasan terjadi, string2 menjadi salinan dari string1. Baris 14 menggunakan fungsi anggota copy untuk menyalin string1 ke dalam string3. Kelas string juga menyediakan versi teroverload dari fungsi anggota assign yang menyalin sejumlah karakter, seperti di dalam

stringTarget.assign( stringSumber, awal, jumlahKarakter );

dimana stringSumber adalah objek string yang akan disalin, awal adalah subskript awal dan jumlahKarakter adalah jumlah karakter yang akan disalin.

Gambar 10.1 Mendemonstrasikan Penugasan dan Penyambungan string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// Gambar 10.1: gambar17_1.cpp
// Mendemonstrasikan penugasan dan penyambungan string.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "gadjah" );
  string string2; // diinisialisasi dengan string kosong
  string string3; // diinisialisasi dengan string kosong

  string2 = string1; // menugaskan string1 kepada string2
  string3.assign( string1 ); // menugaskan string1 kepada string3
  cout << "string1: " << string1 << "\nstring2: " << string2
    << "\nstring3: " << string3 << "\n\n";

  // memodifikasi string2 dan string3
  string2[ 0 ] = string3[ 2 ] = 'r';

  cout << "Setelah modifikasi atas string2 dan string3:\n" << "string1: "
    << string1 << "\nstring2: " << string2 << "\nstring3: ";

  // mendemonstrasikan fungsi anggota at
  for ( int i = 0; i< string3.length();++i )
    cout << string3.at( i );

  // mendeklarasikan string4 dan string5
  string string4( string1 + "MADA" ); // penyambungan
  string string5; // diinisialisasi dengan string kosong

  // operator teroverload +=
  string3 += "mada"; // menciptakan "garjahmada"
  string1.append( "Mada" ); // create "gadjahMada"

  // menyambung lokasi subskript 6 sampai akhir dari string1 untuk
  // menciptakan string "Mada" (string5 awalnya kosong)
  string5.append( string1, 6, string1.length() - 6 );

  cout << "\n\nSetelah penyambungan:\nstring1: " << string1
    << "\nstring2: " << string2 << "\nstring3: " << string3
    << "\nstring4: " << string4 << "\nstring5: " << string5 << endl;
} // akhir dari main

string1: gadjah
string2: gadjah
string3: gadjah

Setelah modifikasi atas string2 dan string3:
string1: gadjah
string2: radjah
string3: garjah

Setelah penyambungan:
string1: gadjahMada
string2: radjah
string3: garjahmada
string4: gadjahMADA
string5: Mada

Baris 19 menggunakan operator subskript untuk menugaskan ‘r’ kepada string3[2] (membentuk “garjah”) dan menugaskan ‘r’ kepada string2[0] (membentuk “radjah”). Ketiga objek string kemudian ditampilkan.

Baris 25-26 menampilkan isi string3 satu karakter per unit waktu menggunakan fungsi anggota at. Fungsi anggota at menyediakan akses terperiksa (atau pemeriksaan rentang); pengaksesan terhadap elemen yang melewati akhir dari string akan melempar eksepsi out_of_range. Operator subskript [ ] tidak menyediakan akses terperiksa.

String string4 dideklarasikan pada baris 29 dan diinisialisasi dengan hasil penyambungan dari string1 dan “MADA” menggunakan operator teroverload +, yang untuk kelas string berarti penyambungan. Baris 33 menggunakan operator penugasan penjumlahan, +=, untuk menyambung string3 dan “mada”. Baris 34 menggunakan fungsi anggota append untuk menyambung string1 dan “Mada”.

Baris 38 menyambung string “Mada” untuk mengosongkan string5. Objek string1, subskript awal di dalam string (6), dan jumlah karakter yang akan disambung (nilai balik dari string1.length() – 6) ketiganya dilewatkan kepada fungsi anggota append.

10.3 Membandingkan string
Kelas string menyediakan beberapa fungsi anggota untuk membandingkan objek-objek string. Gambar 10.2 mendemonstrasikan kapabilitas perbandingan dari kelas string.

Gambar 10.2 Mendemonstrasikan Kapabilitas Perbandingan string
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
75
76
77
78
79
80
81
// Gambar 10.2: gambar10_02.cpp
// Mendemonstrasikan kapabilitas perbandingan string.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "Test fungsi perbandingan." );
  string string2( "Hallo" );
  string string3( "Siantar" );
  string string4( string2 );

  cout << "string1: " << string1 << "\nstring2: " << string2
    << "\nstring3: " << string3 << "\nstring4: " << string4 << "\n\n";

  // membandingkan string1 dan string4
  if( string1 == string4 )
    cout << "string1 == string4\n";
  else // string1 != string4
  {
    if( string1 > string4 )
      cout << "string1 > string4\n";
    else // string1 < string4
      cout << "string1 < string4\n";
  } // akhir dari else

  // Membandingkan string1 dan string2
  int hasil = string1.compare( string2 );

  if ( hasil == 0 )
    cout << "string1.compare( string2 ) == 0\n";
  else // hasil != 0
  {
    if ( hasil > 0 )
      cout << "string1.compare( string2 ) > 0\n";
    else // hasil < 0
      cout << "string1.compare( string2 ) < 0\n";
  } // akhir dari else

  // membandingkan string1 (elemen 2-5) dan string3 (elemen 0-5)
  hasil = string1.compare( 2, 5, string3, 0, 5 );

  if ( hasil == 0 )
    cout << "string1.compare( 2, 5, string3, 0, 5 ) == 0\n";
  else // hasil != 0
  {
    if ( hasil > 0 )
      cout << "string1.compare( 2, 5, string3, 0, 5 ) > 0\n";
    else // hasil < 0
      cout << "string1.compare( 2, 5, string3, 0, 5 ) < 0\n";
  } // akhir dari else

  // membandingkan string2 dan string4
  hasil = string4.compare( 0, string2.length(), string2 );

  if ( hasil == 0 )
    cout << "string4.compare( 0, string2.length(), "
      << "string2 ) == 0" << endl;
  else // hasil != 0
  {
    if ( hasil > 0 )
      cout << "string4.compare( 0, string2.length(), "
        << "string2 ) > 0" << endl;
    else // hasil < 0
      cout << "string4.compare( 0, string2.length(), "
        << "string2 ) < 0" << endl;
  } // akhir dari else

  // membandingkan string2 dan string4
  hasil = string2.compare( 0, 3, string4 );

  if ( hasil == 0 )
    cout << "string2.compare( 0, 3, string4 ) == 0" << endl;
  else // hasil != 0
  {
    if ( hasil > 0 )
      cout << "string2.compare( 0, 3, string4 ) > 0" << endl;
    else // hasil < 0
      cout << "string2.compare( 0, 3, string4 ) < 0" << endl;
  } // akhir dari else
} // akhir dari main

string1: Test fungsi perbandingan.
string2: Hallo
string3: siantar
string4: Hallo

string1 > string4
string1.compare( string2 ) > 0
string1.compare( 2, 5, string3, 0, 5 ) > 0
string4.compare( 0, string2.length(), string2 ) == 0
string2.compare( 0, 3, string4 ) < 0

Program mendeklarasikan empat objek string (baris 9-12) dan menampilkannya masing-masing pada baris 14-15. Baris 18 menguji string1 terhadap string4 untuk ekualitas menggunakan operator ekualitas teroverload. Jika kondisi bernilai true, maka “string1 = = string4” yang ditampilkan. Jika kondisi bernilai false, maka kondisi pada baris 22 akan diuji. Semua fungsi operator ekualitas dan relasional teroverload pada kelas string menghasilkan nilai bool.

Bari 29 menggunakan fungsi anggota compare untuk membandingkan string1 dengan string2. Variabel hasil ditugasi 0 jika kedua objek string tersebut ekivalen, ditugasi angka positif jika string1 secara leksikografikal lebih besar dari string2, atau ditugasi angka negatif jika string1 secara leksikografikal kurang dari string2. Ketika dikatakan bahwa sebuah objek string secara leksikografikal kurang dari objek string lainnya, ini berarti bahwa metode compare menggunakan nilai-nilai numerik atas karakter tersebut di dalam himpunan karakter ASCII. Karena string yang diawali dengan ‘T’ dipandang secara leksikografikal lebih dari string yang diawali dengan ‘H’, maka hasil akan ditugasi nilai yang lebih besar dari 0, seperti ditegaskan pada keluaran.

Baris 42 membandingkan penggalan dari string1 dengan penggalan dari string3 menggunakan sebuah versi teroverload dari fungsi anggota compare. Dua argumen pertama (2 dan 5) menspesifiksi subskript awal dan panjang penggalan atas string1 (“st fu”) untuk dibandingkan dengan string3. Argumen ketiga adalah string yang akan dibandingkan. Dua argumen terakhir (0 dan 5) adalah subskript awal dan panjang penggalan dari string yang akan dibandingkan, string3  (“siant”). Nilai yang akan ditugaskan kepada hasil adalah lebih dari 0, karena secara leksikografikal penggalan string1 lebih dari penggalan string3.

Baris 55 menggunakan versi teroverload lain dari fungsi compare untuk membandingkan string4 dengan string2. Dua argumen pertama sama, yaitu subskript awal dan panjang string. Argumen terakhir adalah string yang akan dibandingkan. Nilai balik yang dihasilkan juga sama, 0 untuk ekualitas, sebuah angka positif jika string4 secara leksikografikal lebih besar dari string2, atau sebuah angka negatif jika string4 secara leksikografikal kurang dari dari string2. Karena dua string yang sedang dibandingkan identik, hasil ditugasi dengan nilai 0.

Baris 74 memanggil fungsi anggota compare untuk membandingkan 3 karakter pertama di dalam string2 dengan string4. Karena “Hal” kurang dari “Hallo”, nilai negatif ditugaskan kepada hasil.

10.4 Substring
Kelas string menyediakan fungsi anggota substr untuk mengambil substring dari sebuah objek string. Hasil yang didapatkan adalah sebuah objek string baru yang disalin dari objek string sumber. Gambar 10.3 mendemonstrasikan substr. Program mendeklarasikan dan menginisialisasi sebuah objek string pada baris 9. Baris 13 menggunakan fungsi anggota substr untuk mengambil substring dari objek string1. Argumen pertama menspesifikasi subskript awal dari substring yang diinginkan; argumen kedua menspesifikasi panjang substring.

Gambar 10.3 Mendemonstasikan Fungsi Anggota substr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Gambar 10.3: gambar10_03.cpp
// Mendemonstrasikan fungsi anggota substr.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "Pesawat mendarat tepat waktu." );

  // mengambil substring "Pesawat" yang dimulai
  // dari subskript 0 dan memuat 7 karakter
  cout << string1.substr( 0, 7 ) << endl;
} // akhir dari main

Pesawat


10.5 Menukar string
Kelas string menyediakan fungsi anggota swap untuk menukar dua objek string. Gambar 10.4 menukar dua objek string. Baris 9-10 mendeklarasikan dan menginisialisasi dua objek string, pertama dan kedua. Setiap objek string kemudian ditampilkan. Baris 15 menggunakan fungsi anggota swap untuk menukar nilai dari pertama dan kedua. Dua objek string tersebut ditampilkan kembali untuk menegaskan bahwa keduanya sudah ditukar. Fungsi anggota swap berguna untuk mengimplementsikan pengurutan string.

Gambar 10.4 Mendemonstasikan Fungsi Anggota swap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Gambar 10.4: gambar10_04.cpp
// Menggunakan fungsi swap untuk menukar dua objek string.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string pertama( "satu" );
  string kedua( "dua" );

  // menampilkan string
  cout << "Sebelum penukaran:\n pertama: " << pertama << "\nkedua: " << kedua;

  pertama.swap( kedua ); // menukar string

  cout << "\n\nSetelah penukaran:\n pertama: " << pertama
    << "\nkedua: " << kedua << endl;
} // akhir dari main

Sebelum penukaran:
pertama: satu
   kedua: dua

Setelah penukaran:
pertama: dua
 kedua: satu

10.6 Karakteristik string
Kelas string menyediakan beberapa fungsi anggota untuk mengumpulkan informasi tentang ukuran, panjang, kapasitas, panjang maksimum, dan karaktestik lainnya dari sebuah objek string. Ukuran atau panjang sebuah objek string adalah panjang karakter yang saat ini disimpan di dalam objek string tersebut. Kapasitas sebuah objek string adalah jumlah karakter yang dapat disimpan di dalam objek tersebut tanpa harus mengalokasikan memori tambahan. Kapasitas sebuah objek string sedikitnya sama dengan ukuran saat ini dari string. Kapasitas persis dari sebuah objek string bergantung pada implementasi. Ukuran maksimum adalah ukuran terbesar yang mungkin dimiliki oleh sebuah objek string. Jika nilai ini melebihi dari yang diijinkan, maka eksepsi length_error akan dilempar. Gambar 10.5 mendemonstrasikan beberapa fungsi anggota dari kelas string untuk menentukan karakteristik objek string.

Gambar 10.5 Menggunakan Karakteristik string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Gambar 10.5: gambar10_05.cpp
// Mendemonstrasikan fungsi anggota yang berkaitan dengan ukuran dan kapasitas.
#include <iostream>
#include <string>
using namespace std;

void tampilStatistik( const string & );

int main()
{
  string string1; // string kosong

  cout << "Statistik sebelum masukan:\n" << boolalpha;
  tampilStatistik( string1 );

  // hanya membaca sepotong string saja "gadjah" dari "gadjah mada"
  cout << "\n\nMasukkan sebuah string: ";
  cin >> string1; // dibasi dengan karakter spasi putih
  cout << "String yang dimasukkan adalah: " << string1;

  cout << "\nStatistik setelah masukan:\n";
  tampilStatistik( string1 );

  // membaca "mada"
  cin >> string1; // dibatasi dengan karakter spasi putih
  cout << "\n\nSisa string adalah: " << string1 << endl;
  tampilStatistik( string1 );

  // menyambung karakter ke string1
  string1 += "1234567890abcdefghijklmnopqrstuvwxyz1234567890";
  cout << "\n\nstring1 sekarang adalah: " << string1 << endl;
  tampilStatistik( string1 );

  // menambahkan 10 elemen ke dalam string1
  string1.resize( string1.length() + 10 );
  cout << "\n\nStatistik setelah pengubahan ukuran menjadi (length + 10):\n";
  tampilStatistik( string1 );
  cout << endl;
} // akhir dari main

// menampilkan statistik string
void tampilStatistik( const string &stringRef )
{
  cout << "kapasitas: " << stringRef.capacity() << "\nukuran maks: "
    << stringRef.max_size() << "\nukuran: " << stringRef.size()
    << "\npanjang: " << stringRef.length()
    << "\nkosong: " << stringRef.empty();
} // akhir dari tampilStatistik

Statistik sebelum masukan:
kapasitas: 0
ukuran maks: 4294967283
ukuran: 0
panjang: 0
kosong: true

Masukkan sebuah string: gadjah mada
String yang dimasukkan adalah: gadjah
Statistik setelah masukan:
kapasitas: 6

ukuran maks: 4294967283
ukuran: 6
panjang: 6
kosong: false

Sisa string adalah: mada
kapasitas: 4
ukuran maks: 4294967283
ukuran: 4
panjang: 4
kosong: false

string1 sekarang adalah: mada1234567890abcdefghijklmnopqrstuvwxyz1234567890
kapasitas: 50
ukuran maks: 4294967283
ukuran: 50
panjang: 50
kosong: false

Statistik setelah pengubahan ukuran menjadi (length + 10):
kapasitas: 60
ukuran maks: 4294967283
ukuran: 60
panjang: 60
kosong: false

Program mendeklarasikan string kosong string1 (baris 11) dan melewatkannya kepada fungsi tampilStatistik (baris 14). Fungsi tampilStatistik (baris 42-48) mengambil sebuah referensi yang menunjuk ke sebuah const string sebagai argumen dan menampilkan kapasitasnya (menggunakan fungsi anggota capacity), ukuran maksimum (menggunakan fungsi anggota max_size), ukuran (menggunakan fungsi anggota size), panjang (menggunakan fungsi anggota length), dan apakah string kosong atau tidak (menggunakan fungsi anggota empty). Pemanggilan awal terhadap tampilStatistik mengindikasikan bahwa nilai-nilai awal untuk kapasitas, ukuran, dan panjang dari string1 adalah 0.

Ukuran dan panjang 0 mengindikasikan bahwa tidak terdapat karakter yang disimpan di dalam string. Karena kapasitas awal adalah 0, ketika karakter ditempatkan di dalam string1, memori akan dialokasikan untuk mengakomodasi karakter-karakter baru yang dimasukkan. Ingat bahwa ukuran dan panjang selalu identik. Pada implementasi ini, ukuran maksimum adalah 4294967283. Objek string1 merupakan string kosong, jadi fungsi empty memberikan nilai true.

Baris 18 memasukkan sebuah string. Pada contoh ini, “gadjah mada” dimasukkan. Karena karakter spasi merupakan pembatas (delimiter), maka hanya “gadjah” yang disimpan di dalam string1 dan “ mada” tertinggal di dalam penyangga masukan. Baris 22 memanggil fungsi tampilStatistik untuk menampilkan statistik atas string1. Perhatikan di dalam keluaran bahwa panjang adalah 6 dan kapasitas adalah 6.

Baris 25 membaca “mada” dari penyangga masukan dan menyimpannya ke dalam string1, sehingga menggantikan “gadjah”.  Baris 27 melewatkan string1 kepada tampilStatistik. Baris 30 menggunakan operator teroverload += untuk menyambung string 46-karakter ke dalam string1. Baris 32 melewatkan string1 kepada tampilStatisik. Kapasitas sekarang bertambah menjadi 50 elemen dan panjang sekarang juga menjadi 50. Baris 35 menggunakan fungsi anggota resize untuk menambah panjang string1 sebanyak 10 karakter. Elemen tambahan yang diberikan adalah karakter null. Keluaran menunjukkan bahwa kapasitas dan penjang sekarang menjadi 60.

10.7 Mencari Substring dan Karakter di dalam String
Kelas string menyediakan beberapa fungsi anggota bertipe const untuk mencari substring dan karakter di dalam sebuah objek string. Gambar 10.6 mendemonstrasikan fungsi find. String string1 dideklarasikan dan diinisialisasi pada baris 9. Baris 14 mencoba untuk mencari “malam” di dalam string1 menggunakan fungsi find. Jika “malam” ditemukan, maka subskript dari lokasi awal substring tersebut dijadikan nilai balik. Jika tidak ditemukan, maka nilai balik yang dihasilkan adalah string::npos (sebuah konstanta public static yang didefinisikan di dalam kelas string). Nilai tersebut dijadikan nilai balik oleh find untuk mengindikasikan bahwa substring atau karakter yang dicari tidak ditemukan di dalam string.

Gambar 10.6 Menggunakan Fungsi Anggota find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Gambar 10.6: gambar10_06.cpp
// Mendemonstrasikan fungsi anggota find.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "noon is 12 pm; midnight is not. " );
  int lokasi;

  // mencari "is"
  cout << "String awal:\n" << string1
   << "\n\n(find) \"is\" ditemukan pada: " << string1.find( "is" )
   << "\n(rfind) \"is\" ditemukan pada: " << string1.rfind( "is" );

  // mencari 'o' pada lokasi 1
  lokasi = string1.find_first_of( "misop" );
  cout << "\n\n(find_first_of) ditemukan '" << string1[ lokasi ]
    << "' dari grup \"misop\" pada: " << lokasi;

  // mencari 'o' pada lokasi 28
  lokasi = string1.find_last_of( "misop" );
  cout << "\n\n(find_last_of) ditemukan '" << string1[ lokasi ]
   << "' dari grup \"misop\" pada: " << lokasi;

  // mencari '1' pada lokasi 8
  lokasi = string1.find_first_not_of( "noi spm" );
  cout << "\n\n(find_first_not_of) '" << string1[ lokasi ]
    << "' yang tidak dimuat \"noi spm\" dan ditemukan pada: "
    << lokasi;

  // mencari ';' pada lokasi 13
  lokasi =  string1.find_first_not_of( "12noi spm" );
  cout << "\n\n(find_first_not_of) '" << string1[ lokasi ]
    << "' yang tidak dimuat \"12noi spm\" dan "
    << "ditemukan pada: " << lokasi << endl;

  // mencari karakter di dalam string1
  lokasi = string1.find_first_not_of(
    "noon is 12 pm; midnight is not." );
  cout << "\nfind_first_not_of(\"noon is 12 pm; midnight is not.\")"
    << " dihasilkan: " << lokasi << endl;
 } // akhir dari main

String awal:
noon is 12 pm; midnight is not.
(find) "is" ditemukan pada: 5
(rfind) "is" ditemukan pada: 24

(find_first_of) ditemukan 'o' dari grup "misop" pada: 1

(find_last_of) ditemukan 'o' dari grup "misop" pada: 28

(find_first_not_of) '1' yang tidak dimuat "noi spm" dan ditemukan pada: 8

(find_first_not_of) '.' yang tidak dimuat "12noi spm" dan ditemukan pada: 13

find_first_not_of("noon is 12 pm; midnight is not.") dihasilkan: -1

Baris 15 menggunakan fungsi anggota rfind untuk mencari string1 secara mundur ( kanan-ke-kiri). Jika “is” ditemukan, maka lokasi subskript dijadikan nilai balik. Jika string “is” tidak ditemukan, maka string::npos dijadikan nilai balik.

Baris 18 menggunakan fungsi anggota find_first untuk mencari lokasi kemunculan pertama dari sembarang karakter di dalam “misop” di dalam string1. Pencarian ini dilakukan dari awal string1. Karakter ‘o’ ditemukan pada elemen 1.

Baris 23 menggunakan fungsi anggota find_last_of untuk mencari kemunculan terakhir sembarang karakter di dalam “misop” di dalam string1. Pencarian dilakukan dari akhir string1. Karakter ‘o’ ditemukan pada elemen 28.

Baris 28 menggunakan fungsi anggota find_first_not untuk menemukan karakter pertama di dalam string1 yang tidak memuat sembarang karakter di dalam “nio spm”. Karakter ‘1’ ditemukan pada elemen 8. Pencarian dilakukan dari awal string1.

Baris 34 menggunakan fungsi anggota find_first_not_of untuk menemukan karakter pertama di dalam string1 yang tidak memuat sembarang karakter di dalam “12nio spm”. Karakter ‘;’ ditemukan pada elemen 12. Pencarian dilakukan dari awal string1.

Baris 40-41 menggunakan fungsi anggota find_first_not_of untuk menemukan karakter pertama di dalam string1 yang tidak memuat sembarang karakter di dalam “noon is 12 pm; midnight is not.”. Pada kasus ini, string1 memuat setiap karakter yang dispesifikasi di dalam argumen string. Karena tidak ditemukan, string::npos (yang memiliki nilai -1 pada kasus ini) dijadikan nilai balik.

10.8 Mengganti Karakter di dalam string
Gambar 10.7 mendemonstrasikan beberapa fungsi anggota pada kelas string untuk mengganti dan menghapus karakter. Baris 10-14 mendeklarasikan dan menginisialisasi string1. Baris 20 menggunakan fungsi anggota erase untuk menghapus semuanya dari karakter pada posisi 62 sampai akhir string1. Perhatikan bahwa garis-baru menempati satu karakter di dalam string.

Gambar 10.7 Mendemonstrasikan erase dan replace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Gambar 10.7: gambar10_07.cpp
// Mendemonstrasikan fungsi anggota erase dan replace.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  // kompiler menyambung semua bagian menjadi satu string
  string string1( "Masa kuliah di tahun 90an adalah masa terindah."
    "\nwaktu itu di jogja hampir semua mahasiswa berjalan kaki"
    "\ndan bersepeda. Tidak seperti sekarang kampus dipenuhi"
    "\ndengan emisi kendaraan. Jika bukan mahasiswa yang sayang"
    "\nbumi, lalu siapa lagi yang punya kesadaran itu?" );

  cout << "String awal adalah:\n" << string1 << endl << endl;

  // menghapus semua karakter dari lokasi 62
  // sampai akhir string1
  string1.erase( 62 );

  // menampilkan string baru
  cout << "String awal setelah dihapus:\n" << string1
    << "\n\nSetelah penggantian pertama:\n";

  int posisi = string1.find( " " ); // menemukan spasi pertama

  // mengganti semua spasi dengan titik
  while ( posisi != string::npos )
  {
    string1.replace( posisi, 1, "." );
    posisi = string1.find( " ", posisi + 1 );
  } // akhir dari while

  cout << string1 << "\n\nSetelah penggantian kedua:\n";

  posisi = string1.find( "." ); // mencari titik pertama

  // mengganti semua titik dengan dua titik koma
  // PERHATIKAN: ini akan mengganti karakter
  while ( posisi != string::npos )
  {
    string1.replace( posisi, 2, "xxxxx;;yyy", 5, 2 );
    posisi = string1.find( ".", posisi + 1 );
  } // akhir dari while

  cout << string1 << endl;
} // akhir dari main

String awal adalah:
Masa kuliah di tahun 90an adalah masa terindah.
waktu itu di j

String awal setelah dihapus:
Masa kuliah di tahun 90an adalah masa terindah.
waktu itu di j

Setelah penggantian pertama:
Masa.kuliah.di.tahun.90an.adalah.masa.terindah.
waktu.itu.di.j

Setelah penggantian kedua:
Masa;;uliah;;i;;ahun;;0an;;dalah;;asa;;erindah;;
aktu;;tu;;i;;

Baris 26-33 menggunakan find untuk mencari lokasi kemunculan karakter spasi. Setiap spasi kemudian diganti dengan sebuah titik  dengan memanggil fungsi anggota replace. Fungsi replace memerlukan tiga argumen: subskript karakter dimana penggantian mulai dilakukan, jumlah karakter yang akan diganti, dan string pengganti. Fungsi anggota find menjadikan string::npos menjadi nilai balik ketika karakter yang dicari tidak ditemukan. Pada baris 32, 1 ditambahkan kepada posisi untuk melanjutkan pencarian pada lokasi karakter selanjutnya.

Baris 37-45 menggunakan fungsi find untuk menemukan setiap titik dan fungsi teroverload replace untuk mengganti setiap titik dan karakter setelahnya dengan dua titik-koma. Argumen yang dilewatkan kepada versi replace ini adalah subskript elemen dimana operasi penggantian mulai dilakukan, jumlah karakter yang akan diganti, dan string karakter pengganti dimana di dalamnya sebuah substring dipilih untuk digunakan sebagai karakter-karakter pengganti, elemen di dalam string karakter dimana penggantian dilakukan, dan jumlah karakter di dalam string karakter yang digunakan.

10.9 Menyisipkan Karakter ke dalam string
Kelas string menyediakan beberapa fungsi anggota untuk menyisipkan karakter ke dalam sebuah string. Gambar 10.8 mendemonstrasikan kapabilitas fungsi anggota insert.

Program mendeklarasikan, menginisialisasi, kemudian menampilkan string1, string2, string3, dan string4. Baris 19 mengggunakan fungsi anggota insert untuk menyisipkan isi dari string2 ke posisi sebelum elemen 10 di dalam string1.

Baris 22 menggunakan insert untuk menyisipkan string4 ke posisi sebelum elemen 3 di dalam string3. Dua argumen terakhir menspesifikasi elemen awal dan elemen terakhir dari string4 yang harus disisipkan. Penggunaan string::npos menyebabkan keseluruhan string disisipkan.

Gambar 10.8 Mendemonstrasikan insert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Gambar 10.8: gambar10_08.cpp
// Mendemonstrasikan fungsi anggota insert.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "permulaan akhir" );
  string string2( "tengah " );
  string string3( "12345678" );
  string string4( "xx" );

  cout << "String awal:\nstring1: " << string1
    << "\nstring2: " << string2 << "\nstring3: " << string3
    << "\nstring4: " << string4 << "\n\n";

  // menyisipkan "jogja" pada lokasi 10 di dalam string1
  string1.insert( 10, string2 );

  // menyisipkan "xx" pada lokasi 3 di dalam string3
  string3.insert( 3, string4, 0, string::npos );

  cout << "String setelah penyisipan:\nstring1: " << string1
    << "\nstring2: " << string2 << "\nstring3: " << string3
    << "\nstring4: " << string4 << endl;
} // akhir dari main

String awal:
string1: permulaan akhir
string2: tengah
string3: 12345678
string4: xx

String setelah penyisipan:
string1: permulaan tengah akhir
string2: tengah
string3: 123xx45678
string4: xx

10.10 Konversi Menjadi char *
Kelas string menyediakan beberapa fungsi untuk mengkonversi objek kelas string menjadi string berbasis pointer versi-C. Tidak seperti string berbasis pointer, objek string tidak diakhiri dengan karakter null. Fungsi-fungsi konversi ini berguna ketika fungsi yang diberikan memerlukan string berbasis pointer sebagai argumen. Gambar 10.9 mendemonstrasikan konversi objek string menjadi string berbasis pointer.

Gambar 10.9 Mengkonversi Menjadi string Versi-C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Gambar 10.9: gambar10_09.cpp
// Menkonversi menjadi string versi-C.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "STRINGS" ); // konstruktor string dengan argumen char*
  const char *ptr1 = 0; // menginisialisasi *ptr1
  int panjang = string1.length();
  char *ptr2 = new char[ panjang + 1 ]; // termasuk karakter null

  // menyalin karakter dari string1 ke memori yang dialokasikan
  string1.copy( ptr2, panjang, 0 ); // menyalin string1 ke ptr2 char*
  ptr2[ panjang ] = '\0'; // menambahkan karakter null

  cout << "string string1 adalah " << string1
    << "\nstring1 dikonversi menjadi string versi-C adalah "
    << string1.c_str() << "\nptr1 adalah ";

  // menugaskan kepada pointer ptr1 sebuah const char * yang dijadikan nilai
  // balik oleh fungsi data(). PERHATIKAN: ini penugasan yang berbahaya.
  // Jika string1 dimodifikasi, pointer ptr1 dapat
  // menjadi tak-valid.
  ptr1 = string1.data();

  // menampilkan setiap karakter menggunakan pointer
  for ( int i = 0; i < panjang; ++i )
    cout << *( ptr1 + i ); // menggunakan aritmatika pointer

  cout << "\nptr2 adalah " << ptr2 << endl;
  delete [] ptr2; // membebaskan memori yang dialokasikan secara dinamis
} // akhir dari main

String string1 adalah STRINGS
string1 dikonversei menjadi string versi-C adalah STRINGS
ptr1 adalah STRINGS
ptr2 adalah STRINGS

Program mendeklarasikan sebuah objek string, sebuah int, dan dua pointer char (baris 8-12). Objek string1 diinisialisasi dengan “STRINGS”, ptr1 diinisialisasi dengan 0, dan panjang diinisialisasi dengan panjang dari string1. Memori yang cukup untuk menampung string berbasis pointer (yang ekivalen dengan objek string1) dialokasikan secara dinamis dan ditunjuk oleh pointer char, ptr2.

Baris 15 menggunakan fungsi anggota copy untuk menyalin objek string1 ke dalam array char yang ditunjuk oleh ptr2. Baris 16 secara manual menempatkan karakter null di akhir array yang ditunjuk oleh ptr2.

Baris 20 menggunakan fungsi c_str untuk mendapatkan sebuah pointer const char * yang menunjuk ke string versi-C dengan konten sama dengan string1. Pointer tersebut dilewatkan kepada operator penyisipan aliran untuk ditampilkan.

Baris 26 menugaskan kepada const char * ptr1 sebuah pointer yang dijadikan nilai balik oleh fungsi anggota data (dari kelas string). Fungsi anggota ini menghasilkan nilai balik berupa array karakter versi-C yang tidak diakhiri dengan karakter null. Jika string1 dimodifikasi (memori dinamis mengubah alamatnya karena pemanggilan fungsi seperti string1.insert(0, “abcd”);), maka ptr1 menjadi tak-valid.

Baris 29-30 menggunakan aritmatika pointer untuk menampilkan array karakter yang ditunjuk oleh ptr1. Pada baris 32-33, string versi-C yang ditunjuk oleh ptr2 ditampilkan dan memori yang dialokasikan untuk ptr2 dibebaskan untuk menghindari kebocoran memori.

10.11 Iterator
Kelas string menyediakan beberapa iterator untuk penjelajahan maju dan mundur atas objek string. Semua iterator tersebut menyediakan akses terhadap karakter secara individual dengan sintaks yang sama dengan operasi pointer. Rentang iterator tidak secara otomatis diperiksa. Gambar 10.10 mendemonstrasikan iterator.

Gambar 10.9 Mengkonversi Menjadi string Versi-C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Gambar 10.10: gambar10_10.cpp
// Menggunakan sebuah iterator untuk menampilkan sebuah string.
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string string1( "Menguji iterator" );
  string::const_iterator iterator1 = string1.begin();

  cout << "string1 = " << string1
    << "\n(Menggunakan iterator iterator1) string1 adalah: ";

  // menjelajahi string
  while ( iterator1 != string1.end() )
  {
    cout << *iterator1; // mendereferensi iterator untuk mendapatkan char
    ++iterator1; // menginkremen iterator ke char berikutnya
  } // akhir dari while

  cout << endl;
} // akhir dari main

string1 = Menguji iterator
(Menggunakan iterator iterator1) string1 adalah: Menguji iterator

Baris 9-10 mendeklarasikan string string1 dan string::const_iterator iterator1. const_iterator merupakan sebuah iterator yang tidak bisa memodifikasi objek string, pada kasus ini hanya digunakan untuk menjelajahi string. Iterator iterator1 diinisialisasi dengan awal dari string1 menggunakan fungsi anggota begin. Ada dua versi begin, satu yang menjadikan nilai balik sebuah iterator yang beriterasi melalui non-const string dan satu lagi yang menjadikan nilai balik sebuah const_iterator yang beriterasi melalui const_string.

Baris 16-20 menggunakan iterator1 untuk menjelajahi string1. Fungsi anggota end dari kelas string menjadikan nilai balik sebuah iterator (atau const_iterator) untuk posisi satu elemen melewati elemen terakhir dari string1. Setiap elemen ditampilkan dengan mendereferensi iterator seperti mendereferensi sebuah pointer.

Kesimpulan
*        Tidak seperti char * (string versi C), string tidak harus diakhiri dengan karakter null. Panjang sebuah string dapat dicari menggunakan fungsi anggota length dan menggunakan fungsi anggota size. Operator subskript [ ] dapat digunakan bersama string untuk mengakses dan  memodifikasi karakter individual. Seperti string versi-C, string mempunyai subskript pertama 0 dan subskript terakhir length() – 1.
*        Kelas string juga menyediakan versi teroverload dari fungsi anggota assign yang menyalin sejumlah karakter.
*        Kelas string menyediakan beberapa fungsi anggota untuk membandingkan objek-objek string.
*        Kelas string menyediakan fungsi anggota substr untuk mengambil substring dari sebuah objek string. Hasil yang didapatkan adalah sebuah objek string baru yang disalin dari objek string sumber.
*        Kelas string menyediakan fungsi anggota swap untuk menukar dua objek string.
*        Kelas string menyediakan beberapa fungsi anggota untuk mengumpulkan informasi tentang ukuran, panjang, kapasitas, panjang maksimum, dan karaktestik lainnya dari sebuah objek string. Ukuran atau panjang sebuah objek string adalah panjang karakter yang saat ini disimpan di dalam objek string tersebut. Kapasitas sebuah objek string adalah jumlah karakter yang dapat disimpan di dalam objek tersebut tanpa harus mengalokasikan memori tambahan. Kapasitas sebuah objek string sedikitnya sama dengan ukuran saat ini dari string. Kapasitas persis dari sebuah objek string bergantung pada implementasi. Ukuran maksimum adalah ukuran terbesar yang mungkin dimiliki oleh sebuah objek string. Jika nilai ini melebihi dari yang diijinkan, maka eksepsi length_error akan dilempar.
*         Kelas string menyediakan beberapa fungsi anggota insert untuk menyisipkan karakter ke dalam sebuah string.

Latihan
1)      Tuliskan sebuah program yang memasukkan satu kelimat dan yang menghitung jumlah palindrome di dalamnya. Palindrome adalah sebuah kata, yang bila dibaca maju dan mundur akan memberikan hasil sama. Sebagai contoh, pohon bukan sebuah palindrome, tetapi katak adalah sebuah palindrome.
2)      Tulislah sebuah program yang menghitung jumlah konsonan di dalam suatu kalimat. Tampilkan frekuensi kemunculan setiap konsonan.
3)      Tulislah sebuah program yang menyisipkan karakter-karakter “******” di tengah-tengah sebuah objek string.
4)      Tulislah sebuah program yang menghapus “yang” dan “YANG” dari suatu objek string.

5)      Tulislah sebuah program yang membaca sebaris kalimat dan menampilkannya secara mundur. Gunakan iterator pada solusi Anda.


No comments:

Post a Comment