Friday, December 23, 2016

Bab 11. C++ Untuk Programer



Bab.11 Bit, Karakter, C-String, dan struct

Tujuan Instruksional
       ·         Definisi struct.
       ·         typedef.
       ·         Operator bitwise.
       ·         Bidang bit.
       ·         Pustaka karakter.

·         Fungsi manipulasi-string.
·         Fungsi konversi-string.
·         Pustaka string.






11.1 Introduksi

Sekarang akan didiskusikan tentang struktur, yang ekivalen dengan kelas, dan manipulasi bit, karakter, dan string C-sytle. Banyak dari teknik yang disajikan di sini diberikan bagi para programer C dan C++.

Perancang C++ mengevolusi struktur menjadi kelas. Seperti kelas, struktur di dalam C++ dapat memuat penspesifikasi akses, fungsi anggota, konstruktor dan destruktor. Pada kenyataannya, satu-satunya perbedaan antara struktur dan kelas di dalam C++ adalah bahwa anggota struktur default adalah public dan anggota kelas default adalah private ketika tidak ada penspesifikasi yang digunakan  dan bahwa pewarisan default untuk struktur adalah pewarisan public sedangkan pewarisan default untuk kelas adalah private.

11.2 Definisi Struktur
Perhatikan definisi struktur berikut:

struct Kartu
{
  string muka;
  string jenis;
}; // akhir struct Kartu

Katakunci struct mengintroduksi definisi struktur Kartu. Pengenal Kartu adalah nama struktur dan digunakan di dalam C++ untuk mendeklarasikan variabel bertipe struktur (di dalam C, nama tipe struktur ini adalah struct Kartu). Data (dan bisa saja fungsi, sama dengan kelas) dideklarasikan yang diapit oleh separang kurung kurawal di dalam definisi struktur adalah anggota-anggota struktur. Definisi Kartu memuat dua anggota string, muka dan jenis.

Tiga deklarasi berikut

Kartu satuKartu;
Kartu tumpukan[ 52 ];
Kartu *kartuPtr;

mendeklarasikan satuKartu menjadi sebuah variabel struktur bertipe Kartu, tumpukan menjadi sebuah array dengan 52 elemen bertipe Kartu, dan kartuPtr menjadi suatu pointer yang menunjuk ke sebuah struktur Kartu. Variabel-variabel bertipe struktur dapat pula dideklarasikan dengan nama-nama variabel yang dipisahkan koma. Tiga deklarasi di atas dapat pula digabungkan ke definisi struktur Kartu sebagai berikut:

struct Kartu
{
  string muka;
  string jenis;
} satuKartu, tumpukan[52], *kartuPtr;

11.3 typedef
Katakunci typedef menyediakan suatu mekanisme untuk menciptakan sinonim (nama alias) untuk tipe data yang didefinisikan. Nama untuk tipe struktur seringkali didefinisikan dengan typedef untuk menciptakan nama tipe yang lebih sederhana dan pendek. Sebagai contoh, statemen

typedef Kartu *KartuPtr;

mendefinisikan nama tipe baru KartuPtr sebagai sinonim untuk Kartu *. Penciptaan nama dengan typedef tidak sama dengan menciptakan tipe baru; typedef hanya menciptakan nama tipe baru yang dapat digunakan di dalam program sebagai nama alias.

11.4 Contoh: Simulasi Mengacak dan Menangani Kartu
Program pengacakan dan penanganan kartu akan didemonstrasikan pada Gambar 11.1 – 11.3. Program ini merepresentasikan setumpuk kartu sebagai sebuah vector yang memuat struktur-struktur dan menggunakan algoritma penanganan dan pengacakan.

Gambar 11.1 Definisi Kelas SetumpukKartu

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
// Gambar 11.1: SetumpukKartu.h
// Definisi kelas SetumpukKartu yang
// merepresentasikan setumpuk kartu.
#include <string>
#include <vector>
using namespace std;

// Definisi struktur Kartu
struct Kartu
{
  string muka;
  string jenis;
}; // akhir dari struktur Kartu

// Definisi kelas SetumpukKartu
class SetumpukKartu
{
public:
  static const int jumlahKartu = 52;
  static const int muka2 = 13;
  static const int jenis2 = 4;

  SetumpukKartu(); // konstruktor untuk menginisialisasi tumpukan kartu
  void acak(); // mengacak kartu
  void tangani() const; // menangani kartu

private:
  vector< Kartu > tumpukan; // merepresentasikan tumpukan kartu
}; // akhir dari kelas SetumpukKartu

Konstruktor (baris 12-32 pada Gambar 11.2) menginisialisasi vector sesuai dengan urutan string karakter yang merepresentasikan Ace sampai King untuk setiap jenis kartu. Fungsi acak mengimplementasikan algoritma pengacakan tingkat-tinggi. Fungsi ini mengiterasi melalui semua 52 kartu  (subskript 0 sampai 51). Untuk setiap kartu, angka 0 sampai 51 dipilih secara acak. Selanjutnya Kartu sekarang dan Kartu yang dipilih secara acak dipertukarkan di dalam vector. Terdapat 52 pertukaran kartu terjadi di dalam suatu pass dari keseluruhan vector, dan vector akhirnya menjadi acak.

Gambar 11.2 Definisi Fungsi Anggota Kelas SetumpukKartu

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
// Gambar 11.2: SetumpukKartu.cpp
// Definisi fungsi-anggota untuk kelas SetumpukKartu yang mensimulasikan
// penanganan dan pengacakan setumpuk kartu.
#include <iostream>
#include <iomanip>
#include <cstdlib> // prototipe untuk rand dan srand
#include <ctime> // prototipe untuk time
#include "SetumpukKartu.h" // definisi kelas SetumpukKartu
using namespace std;

// konstruktor SetumpukKartu tanpa-argumen menginisialisasi tumpukan
SetumpukKartu::SetumpukKartu()
  : tumpukan( jumlahKartu )
{
  // menginisialisasi array jenis
  static string jenis[ jenis2 ] =
    { "Hearts", "Diamonds", "Clubs", "Spades" };

  // menginisialisasi array muka
  static string muka[ muka2 ] =
    { "Ace", "Deuce", "Three", "Four", "Five", "Six", "Seven",
    "Eight", "Nine", "Ten", "Jack", "Queen", "King" };

  // menetapkan nilai-nilai untuk tumpukan 52 Kartu
  for ( int i = 0; i < jumlahKartu; ++i )
  {
    tumpukan[ i ].muka = muka[ i % muka2 ];
    tumpukan[ i ].jenis = jenis[ i / jenis2 ];
  } // akhir dari for

  srand( time( 0 ) ); // pembangkit angka acak
} // akhir dari konstruktor SetumpukKartu tanpa-argumen

// mengacak kartu di dalam tumpukan
void SetumpukKartu::acak()
{
  // mengacak kartu
  for ( int i = 0; i < jumlahKartu; ++i )
  {
    int j = rand() % jumlahKartu;
    Kartu temp = tumpukan[ i ];
    tumpukan[ i ] = tumpukan[ j ];
    tumpukan[ j ] = temp;
  } // akhir dari for
} // akhir dari fungsi acak

// menangani kartu di dalam tumpukan
void SetumpukKartu::tangani() const
{
  // menampilkan setiap muka dan jenis kartu
  for ( int i = 0; i < jumlahKartu; ++i )
  cout <<  right << setw( 5 ) << tumpukan[ i ].muka << " dari "
    <<  left << setw( 8 ) << tumpukan[ i ].jenis
    << ( ( i + 1 ) % 2 ? '\t' : '\n' );
} // akhir dari fungsi tangani

Gambar 11.3 Program Mengacak dan Menangani Kartu

1
2
3
4
5
6
7
8
9
10
// Gambar 11.3: gambar11_3.cpp
// Program mengacak dan menangani kartu.
#include "SetumpukKartu.h" // definisi kelas SetumpukKartu

int main()
{
  SetumpukKartu setumpukKartu; // menciptakan objek SetumpukKartu
  setumpukKartu.acak(); // mengacak kartu di dalam tumpukan
  setumpukKartu.tangani(); // menangani kartu di dalam tumpukan
} // akhir dari main

King dari Clubs
Ten dari Diamonds
Five dari Diamonds
Jack dari Clubs
Seven dari Spades
Five dari Clubs
Three dari Spades
King dari Hearts
Ten dari Clubs
Eight dari Spades
Eight dari Hearts
Six dari Hearts
Nine dari Diamonds
Nine dari Clubs
Three dari Diamonds
Queen dari Hearts
Six dari Clubs
Seven dari Hearts
Seven dari Diamonds
Jack dari Diamonds
Jack dari Spades
King dari Diamonds
Deuce dari Diamonds
Four dari Clubs
Three dari Clubs
Five dari Hearts
Seven dari Clubs
Queen dari Clubs
Deuce dari Clubs
Queen dari Spades
Three dari Hearts
Five dari Spades
Deuce dari Hearts
Jack dari Hearts
Four dari Hearts
Ace dari Diamonds
Nine dari Spades
Four dari Diamonds
Ace dari Spades
Six dari Diamonds
Four dari Spades
King dari Spades
Eight dari Clubs
Ace dari Hearts
Deuce dari Spades
Ace dari Clubs
Ten dari Spades
Eight dari Diamonds
Ten dari Hearts
Six dari Spades
Queen dari Diamonds
Nine dari Hearts

11.5 Operator Bitwise
C++ menyediakan beberapa kapabilitas manipulas-bit. Sistem operasi, perangkat lunak untuk perangkat keras, perangkat lunak jaringan, dan lainnya mensyaratkan bahwa Anda berkomunikasi “secara langsung” dengan perangkat keras.

Di sini akan dikenalkan setiap operator bitwise C++ dan akan didiskusikan bagaimana menghemat memori menggunakan bidang data. Semua data direpresentasikan secara internal sebagai runtun bit. Setiap bit diasumsikan memiliki nilai 0 atau 1. Pada kebanyakan sistem, suatu runtun delapan bit membentuk sebuah byte, yang merupakan unit standard penyimpanan untuk variabel bertipe char. Beberapa tipe data lain disimpan dengan jumlah byte yang lebih besar. Operator bitwise digunakan untuk memanipulasi bit-bit dari operand-operand integral (char, short, int, dan long; untuk signed dan unsigned).

Gambar 11.4 Operator-Operator Bitwise

Operator
Nama
Penjelasan
&

|

^

<< 

>> 

~
AND bitwise


OR bitwise


exculsive OR bitwise


geser kiri


geser kanan


komplemen bitwise
menetapkan setiap bit hasil menjadi 1 jika kedua bit operand adalah 1

menetapkan setiap bit hasil menjadi 1 jika salah satu atau kedua bit operandnya adalah 1

menetapkan setiap bit hasil 1 jika salah satu (tidak keduanya) bit operand adalah 1

Operator geser kiri menggeser bit-bit dari operand kiri ke kiri sejumlah bit yang dispesifikasi di dalam operand kanan

menggeser bit-bit dari operand kiri ke kanan sejumlah bit yang dispesifikasi di dalam operand kanan

menetapkan semua bit 0 di dalam operandnya menjadi bit 1 di dalam bit hasil dan menetapkan semua bit 1 menjadi bit 0 di dalam bit hasil



Operator-operator bitwise adalah AND bitwise (&), OR bitwise (|), exclusive OR (^) bitwise, geser kiri (<<), geser kanan (>>), dan komplemen bitwise ataua komplemen 1 (~). Operator AND bitwise, exclusive OR bitwise, dan OR bitwise membandingkan dua operandnya bit demi bit. Operator AND bitwise menetapkan setiap bit hasil menjadi 1 jika kedua bit operand adalah 1. Operator OR bitwise menetapkan setiap bit hasil menjadi 1 jika salah satu atau kedua bit operandnya adalah 1. Operator exclusive OR menetapkan setiap bit hasil 1 jika salah satu (tidak keduanya) bit operand adalah 1. Operator geser kiri menggeser bit-bit dari operand kiri ke kiri sejumlah bit yang dispesifikasi di dalam operand kanan. Operator geser kanan menggeser bit-bit dari operand kiri ke kanan sejumlah bit yang dispesifikasi di dalam operand kanan. Operator komplemen bitwise menetapkan semua bit 0 di dalam operandnya menjadi bit 1 di dalam bit hasil dan menetapkan semua bit 1 menjadi bit 0 di dalam bit hasil. Diskusi detil tentang setiap operator bitwise akan diberikan pada beberapa contoh ke depan. Operator-operator bitwise disimpulkan pada Gambar 11.4.

Menampilkan Representasi Biner atas Sebuah Nilai Bertipe Integral
Ketika menggunakan operator bitwise, adalah hal yang berguna untuk mengilustrasikan representasi biner setiap tipe integral di dalam C++. Program pada Gambar 11.5 menampilkan sebuah integer unsigned yang direpresentasikan dalam grup-grup delapan bit.

Gambar 11.5 Menampilkan unsigned integer di dalam Bit

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
// Gambar 11.5: gambar11_5.cpp
// Menampilkan sebuah unsigned integer di dalam bit.
#include <iostream>
#include <iomanip>
using namespace std;

void tampilBit( unsigned ); // prototipe

int main()
{
  unsigned nilaiMasukan; // nilai integral untuk ditampilkan dalam biner

  cout << "Masukkan sebuah unsigned integer: ";
  cin >> nilaiMasukan;
  tampilBit( nilaiMasukan );
} // akhir dari main

// menampilkan bit atas sebuah nilai unisigned integer
void tampilBit( unsigned nilai )
{
  const int GESER = 8 * sizeof( unsigned ) - 1;
  const unsigned MASK = 1 << GESER;

  cout << setw( 10 ) << nilai << " = ";

  // menampilkan bit
  for ( unsigned i = 1; i <= GESER + 1; ++i )
  {
    cout << ( nilai & MASK ? '1' : '0' );
    nilai <<= 1; // menggeser nilai ke kiri sejauh 1

    if ( i % 8 == 0 ) // menampilkan spasi setelah 8 bit
      cout << ' ';
  } // akhir dari for
  cout << endl;
} // akhir dari fungsi tampilBit

Masukkan sebuah unsigned integer: 65000
   65000 = 00000000 00000000 11111101 11101000

Masukkan sebuah unsigned integer: 29
      29 = 00000000 00000000 00000000 00011101

Fungsi tampilBit (baris 19-37) menggunakan operator AND bitwise untuk mengkombinasikan variabel nilai dengan konstanta MASK menggunakan &. Seringkali operator AND bitwise digunakan dengan sebuah operand yang dikenal dengan mask, yang merupakan suatu nilai integer dengan beberapa bit ditetapkan 1. Pada tampilBit, baris 22 menugaskan nilai 1<<GESER kepada konstanta MASK. Nilai dari konstanta GESER dikalkulasi pada baris 21 dengan ekspresi

8 * sizeof( unsigned ) - 1

dimana jumlah byte memori yang diperlukan oleh suatu objek unisigned dikalikan dengan 8 untuk mendapatkan total jumlah bit yang dibutuhkan dalam menyimpan sebuah objek unsigned, kemudian dikurangi dengan 1. Representasi bit atas 1<<GESER pada suatu komputer yang merepresentasikan objek unsigned dalam empat byte memori adalah

10000000 00000000 00000000 00000000

Gambar 11.6 Hasil Pengkombinasian Dua Bit Menggunakan Operator AND Bitwise

Bit1
Bit2
Bit1 & Bit2
0

1

0

1
0

0

1

1
0

0

0

1

Operator geser-kiri menggeser nilai 1 dari bit orde-rendah (paling-kanan) ke bit orde-tinggi (paling-kiri) di dalam MASK, dan mengisi bit-bit 0 dari kanan. Baris 29 menampilkan 1 atau 0 untuk bit paling-kiri dari variabel nilai. Diasumsikan bahwa variabel nilai memuat 65000 (00000000 00000000 11111101 11101000). Ketika nilai dan MASK dikombinasikan menggunakan &, semua bit kecuali bit orde-tinggi di dalam variabel nilai tersembunyi, karena sembarang bit yang diAND dengan 0 akan menghasilkan 0. Jika bit paling-kiri adalah 1, maka hasil evaluasi atas nilai & MASK adalah

00000000  00000000  11111101  11101000 (nilai)
10000000  00000000  00000000  00000000 (MASK)
--------------------------------------
00000000 00000000  00000000 00000000 (nilai & MASK)

yang diinterpretasikan sebagai false, dan 0 ditampilkan. Kemudian baris 30 menggeser variabel nilai ke kiri sejauh satu dengan ekspresi nilai <<= 1 (nilai = nilai << 1). Langkah-langkah ini diulangi untuk setiap bit variabel nilai. Pada bagian akhir repetisi, manipulasi bit yang didapatkan adalah sebagai berikut:

11111101  11101000  00000000  00000000 (nilai)
10000000  00000000  00000000  00000000 (MASK)
-----------------------------------
10000000 00000000  00000000 00000000 (nilai & MASK)

Gambar 11.6 menyimpulkan hasil pengkombinasian dua bit menggunakan operator AND bitwise. Program pada Gambar 11.7 mendemonstrasikan operator AND bitwise, operator OR bitwise,  operator exclusive OR bitwise, operator komplemen bitwise.

Gambar 11.7 Operator AND, OR, XOR, dan Komplemen Bitwise

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
7
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// Gambar 11.7: gambar11_7.cpp
// Operator AND, OR,
// exclusive OR, dan komplemen bitwise.
#include <iostream>
#include <iomanip>
using namespace std;

void tampilBit( unsigned ); // prototipe

int main()
{
  unsigned angka1;
  unsigned angka2;
  unsigned mask;
  unsigned setBit;

  // mendemonstrasikan & bitwise
  angka1 = 2179876355;
  mask = 1;
  cout << "Hasil pemngkombinasian berikut\n";
  tampilBit( angka1 );
  tampilBit( mask );
  cout << "menggunakan operator AND bitwise & adalah\n";
  tampilBit( angka1 & mask );

  // mendemonstrasikan | bitwise
  angka1 = 15;
  setBit = 241;
  cout << "\nHasil pemngkombinasian berikut\n";
  tampilBit( angka1 );
  tampilBit( setBit );
  cout << "menggunakan operator OR bitwise | adalah\n";
  tampilBit( angka1 | setBit );

  // mendemonstrasikan exclusive OR bitwise
  angka1 = 139;
  angka2 = 199;
  cout << "\nHasil pemngkombinasian berikut\n";
  tampilBit( angka1 );
  tampilBit( angka2 );
  cout << "menggunakan operator exclusive OR bitwise ^ adalah\n";
  tampilBit( angka1 ^ angka2 );

  // mendemonstasikan komplemen bitwise
  angka1 = 21845;
  cout << "\nKomplemen satu dari\n";
  tampilBit( angka1 );
  cout << "adalah" << endl;
  tampilBit( ~angka1 );
} // akhir dari main

// menampilkan bit atas sebuah nilai unisigned integer
void tampilBit( unsigned nilai )
{
   const int GESER = 8 * sizeof( unsigned ) - 1;
   const unsigned MASK = 1 << GESER;

   cout << setw( 10 ) << nilai << " = ";

   // menampilkan bit
   for ( unsigned i = 1; i <= GESER + 1; ++i )
   {
     cout << ( nilai & MASK ? '1' : '0' );
     nilai <<= 1; // menggeser nilai ke kiri sejauh 1

     if ( i % 8 == 0 ) // menampilkan spasi setelah 8 bit
       cout << ' ';
   } // akhir dari for
   cout << endl;
} // akhir dari fungsi tampilBit

Hasil dari pengkombonasian berikut
2179876355 = 10000001 11101110 01000110 00000011
         1 = 00000000 00000000 00000000 00000001
menggunakan operator AND bitwise & adalah
         1 = 00000000 00000000 00000000 00000001

Hasil dari pengkombonasian berikut
        15 = 00000000 00000000 00000000 00001111
       241 = 00000000 00000000 00000000 11110001
menggunakan operator OR bitwise | adalah
       255 = 00000000 00000000 00000000 11111111

Hasil dari pengkombonasian berikut
       139 = 00000000 00000000 00000000 10001011
       199 = 00000000 00000000 00000000 11000111
menggunakan operator exclusive OR bitwise ^ adalah
        76 = 00000000 00000000 00000000 01001100

Komplemen satu atas
     21845 = 00000000 00000000 01010101 01010101
adalah
4294945450 = 11111111 11111111 10101010 10101010

Operator AND Bitwise (&)
Pada Gambar 11.7, baris 18 menugaskan 2179876355 (10000001 11101110 01000110 00000011) kepada variabel angka1, dan baris 19 menugaskan (00000000 00000000 00000000 00000001) kepada variabel mask. Ketika mask dan angka1 dikombinasikan menggunakan operator AND bitwise (&) di dalam ekspresi angka1 & mask (baris 24), hasilnya adalah 00000000 00000000 00000000 00000001. Semua bit kecuali bit orde-rendah di dalam variabel angka1 “disembunyikan” karena pengANDan dengan konstanta MASK.

Operator OR Bitwise (|)
Operator OR bitwise digunakan untuk menetapkan bit-bit spesifik menjadi 1 di dalam suatu operand. Gambar 11.7 menugaskan 15 (00000000 00000000 00000000 00001111) kepada variabel angka1, dan baris 28 menugaskan 241 (00000000 00000000 00000000 11110001) kepada variabel setBit. Ketika angka1 dan setBit dikombinasikan menggunakan operator OR bitwise di dalam ekspresi angka1 | setBit (baris 33), hasil yang didapatkan adalah 255 (00000000 00000000 00000000 11111111). Gambar 20.8 menyimpulkan hasil pengkombinasian dua bit menggunakan operator OR bitwise.

Gambar 11.8 Hasil Pengkombinasian Dua Bit Menggunakan Operator OR Bitwise

Bit1
Bit2
Bit1 | Bit2
0

1

0

1
0

0

1

1
0

1

1

1

Operator exclusive OR Bitwise (^)
Operator exclusive OR (^) menetapkan setiap bit di dalam hasil menjadi 1 jika hanya terdapat satu buah bit di dalam kedua operandnya yang bernilai 1. Pada Gambar 11.8, baris 36-37 menugaskan nilai 139 (00000000 00000000 00000000 10001011) dan nilai 199 (00000000 00000000 00000000 11000111) kepada variabel angka1 dan angka2. Ketika kedua variabel tersebut dikombinasikan menggunakan operator exclusive OR di dalam ekspresi angka1 ^ angka 2 (baris 42), hasil yang diperoleh adalah 00000000 00000000 00000000 01001100. Gambar 11.9 menyimpulkan hasil pengkombinasian dua bit menggunakan operator exclusive OR bitwise.

Gambar 11.9 Hasil Pengkombinasian Dua Bit Menggunakan Operator Exclusive OR Bitwise

Bit1
Bit2
Bit1 ^ Bit2
0

1

0

1
0

0

1

1
0

1

1

0

Operator Komplemen Bitwise (~)
Operator komplemen bitwise (~) menetapkan semua bit 1 di dalam operandnya menjadi bit 0 di dalam hasil dan menetapkan bit 0 di dalam operandnya menjadi bit 1 di dalam hasil. Pada Gambar 11.7, baris 45 menugaskan nilai 21845 (00000000 00000000 01010101 01010101) kepada variabel angka1. Ketika ekspresi ~angka1 dievaluasi, hasil yang diperoleh adalah (11111111 11111111 10101010 10101010).

Gambar 11.10 mendemonstrasikan operator geser-kiri (<<) dan operator geser-kanan (>>). Fungsi tampilBit (baris 27-45) menampilkan nilai-nilai unsigned integer.

Gambar 11.10 Menggunakan Operator Geser Bitwise

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
// Gambar 11.10: gambar11_10.cpp
// Menggunakan operator geser bitwise.
#include <iostream>
#include <iomanip>
using namespace std;

void tampilBit( unsigned ); // prototipe

int main()
{
  unsigned angka1 = 960;

  // mendemonstrasikan geser-kiri bitwise
  cout << "Hasil dari penggeseran kiri\n";
  tampilBit( angka1 );
  cout << "sejauh 8 bit menggunakan operator geser-kiri adalah\n";
  tampilBit( angka1 << 8 );

  // mendemonstrasikan geser-kanan bitwise
  cout << "\nHasil dari penggeseran kanan\n";
  tampilBit( angka1 );
  cout << "sejauh 8 bit menggunakan operator geser-kanan adalah\n";
  tampilBit( angka1 >> 8 );
} // akhir dari main

// menampilkan bit atas sebuah nilai unisigned integer
void tampilBit( unsigned nilai )
{
   const int GESER = 8 * sizeof( unsigned ) - 1;
   const unsigned MASK = 1 << GESER;

   cout << setw( 10 ) << nilai << " = ";

   // menampilkan bit
   for ( unsigned i = 1; i <= GESER + 1; ++i )
   {
     cout << ( nilai & MASK ? '1' : '0' );
     nilai <<= 1; // menggeser nilai ke kiri sejauh 1

     if ( i % 8 == 0 ) // menampilkan spasi setelah 8 bit
       cout << ' ';
  } // akhir dari for
   
  cout << endl;
} // akhir dari fungsi tampilBit

Hasil dari penggeseran kiri
          960 = 00000000 00000000 00000011 11000000
sejauh 8 bit menggunakan operator geser-kiri adalah
      245760 = 00000000 00000011 11000000 00000000
Hasil dari penggeseran kanan
          960 = 00000000 00000000 00000011 11000000
sejauh 8 bit menggunakan operator geser-kanan adalah
           3 = 00000000 00000000 00000000 00000011

Operator Geser_Kiri (<<)
Operator geser-kiri (<<) menggeser bit-bit operand kiri ke kiri sejumlah bit yang dispesifikasi di dalam operand kanannya. Bit-bit yang ditinggalkan akibat penggeseran diganti dengan 0; bit-bit yang digeser ke kiri yang melampaui bit paling kiri dibuang. Pada Gambar 11.10, baris 11 menugaskan nilai 960 (00000000 00000000 00000011 11000000) kepada variabel angka1. Hasil dari penggeseran-kiri atas variabel angka1 sejauh 8 bit di dalam ekspresi angka1 << 8 (baris 7) adalah 245760 (00000000 00000011 11000000 00000000).



Operator Geser_Kanan (<<)
Operator geser-kiri (<<) menggeser bit-bit operand kiri ke kanan sejumlah bit yang dispesifikasi di dalam operand kanannya. Bit-bit yang ditinggalkan akibat penggeseran diganti dengan 0; bit-bit yang digeser ke kanan yang melampaui bit paling kanan dibuang. Pada Gambar 11.10, hasil dari penggeseran-kanan atas variabel angka1 sejauh 8 bit di dalam ekspresi angka1 >> 8 (baris 7) adalah 3 (00000000 00000000 00000000 00000011).

Operator Penugasan Bitwise
Setiap operator bitwise (kecuali operator komplemen bitwise) memiliki suatu operator penugasan bitwise. Operator-operator penugasan ditampilkan pada Gambar 11.11;

Gambar 11.11 Operator Penugasan Bitwise

Operator Penugasan Bitwise
&=

|=

^=

<<=

>>=
Operator penugasan AND bitwise.

Operator penugasan OR bitwise.

Operator penugasan exclusive OR bitwise.

Operator penugasan geser-kiri.

Operator penugasan geser-kanan.

11.6 Bidang Bit
C++ menyediakan kemampuan untuk menspesifikasi jumlah bit dimana di dalamnya suatu tipe integral atau tipe enum anggota suatu kelas atau suatu struktur disimpan. Anggota semacam itu dikenal dengan bidang bit. Bidang bit memampukan utilisasi memori secara lebih baik dengan menyimpan data dalam jumlah bit minimum. Anggota bidang data harus dideklarasikan sebagai sebuah tipe integral atau suatu tipe enum.

Perhatikan definisi struktur sebagai berikut:

struct KartuBit
{
  unsigned muka : 4;
  unsigned jenis : 2;
  unsigned warna : 1;
}; // akhir dari struct KartuBit

Definisi di atas memuat tiga bidang bit unsigned, yaitu muka, jenis, dan warna, yang digunakan untuk merepresentasikan setumpuk kartu (52 kartu). Sebuah bidang data dideklarasikan dengan mencantumkan sebuah tipe integral atau enum dengan titik dua (:) dan sebuah konstanta integer yang merepsentasikan lebar bidang data (jumlah bit dimana di dalamnya anggota disimpan). Lebar harus berupa konstanta integer.

Definisi struktur tersebut mengindikasikan bahwa anggota muka disimpan dalam empat bit, anggota jenis dalam dua bit, dan anggota warna dalam satu bit. Jumlah bit didasarkan pada rentang nilai yang diinginkan untuk setiap anggota struktur. Anggota muka menyimpan nilai antara 0 (Ace) sampai 12 (King), karena empat bit dapat menyimpan suatu nilai antara 0 sampai 15. Anggota jenis menyimpan nilai antara 0 dan 3 (0 = Diamonds, 1 = Hearts, 2 = Clubs, 3 =Spades), karena dua bit dapat menyimpan suatu nilai antara 0 sampai 3. Anggota warna menyimpan 0 (Merah) atau 1 (Hitam), karena satu bit dapat menyimpan 0 atau 1. 

Program pada Gambar 11.12 - 11.14 menciptakan vector tumpukan yang memuat struktur KartuBit (baris 27 pada Gambar 11.12). Konstruktor menyisipkan 52 kartu ke dalam vector tumpukan, dan fungsi tangani menampilkan 52 kartu tersebut. Perhatikan bahwa bidang bit diakses seperti layaknya anggota struktur (baris 15-17 dan baris 26-31 pada Gambar 11.13). Anggota warna dicantumkan sebagai cara untuk mengindikasikan warna kartu.

Gambar 11.12 Definisi Kelas SetumpukKartu1

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
// Gambar 11.12: SetumpukKartu1.h
// Definisi kelas SetumpukKartu yang
// merepresentasikan setumpuk kartu.
#include <vector>
using namespace std;

// Definisi struktur KartuBit dengan bidang-bidang bit
struct KartuBit
{
  unsigned muka : 4; // 4 bit; 0-15
  unsigned jenis : 2; // 2 bit; 0-3
  unsigned warna : 1; // 1 bit; 0-1
}; // akhir dari struct KartuBit

// Definisi kelas SetumpukKartu
class SetumpukKartu1
{
public:
  static const int muka2 = 13;
  static const int warna2 = 2; // hitam dan merah
  static const int jumlahKartu = 52;

  SetumpukKartu1(); // konstruktor menginisialisasi tumpukan
  void tangani(); // menangani kartu di dalam tumpukan

private:
  vector< KartuBit > tumpukan; // merepresentasikan tumpukan kartu
}; // akhir dari kelas SetumpukKartu

Gambar 11.13 Definisi Fungsi Anggota untuk Kelas SetumpukKartu1

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
// Gambar 11.13: SetumpukKartu1.cpp
// Mendefinisikan fungsi anggota untuk kelas SetumpukKartu1 yang
// mensimulasikan pengacakan setumpuk kartu.
#include <iostream>
#include <iomanip>
#include "SetumpukKartu1.h" // Definisi kelas SetumpukKartu1
using namespace std;

// Konstruktor SetumpukKartu1 tanpa-argumen menginisialisasi tumpukan
SetumpukKartu1::SetumpukKartu1()

{
  for ( int i = 0; i < jumlahKartu; ++i )
  {
    tumpukan[ i ].muka = i % muka2;
    tumpukan[ i ].jenis = i / muka2;
    tumpukan[ i ].warna = i / ( muka2 * warna2 );
  } // akhir dari for
} // akhir dari konstruktor SetumpukKartu1 tanpa-argumen

// menangani kartu di dalam tumpukan
void SetumpukKartu1::tangani()
{
  for ( int k1 = 0, k2 = k1 + jumlahKartu / 2;
    k1 < jumlahKartu / 2 - 1; ++k1, ++k2 )
    cout << "Kartu:" << setw( 3 ) << tumpukan[ k1 ].muka
      << " Jenis:" << setw( 2 ) << tumpukan[ k1 ].jenis
      << " Warna:" << setw( 2 ) << tumpukan[ k1 ].warna
      << " " << "Kartu:" << setw( 3 ) << tumpukan[ k2 ].muka
      << " Jenis:" << setw( 2 ) << tumpukan[ k2 ].jenis
      << " Warna:" << setw( 2 ) << tumpukan[ k2 ].warna << endl;
} // akhir dari fungsi tangani

Gambar 11.14 Program Menguji Kelas SetumpukKartu1

1
2
3
4
5
6
7
8
9
// Gambar 11.14: gambar11_14.cpp
// Program menguji pengacakan dan penanganan kartu.
#include "SetumpukKartu1.h" // definisi kelas SetumpukKartu1

int main()
{
  SetumpukKartu1 setumpukKartu1; // menciptakan objek SetumpukKartu1
  setumpukKartu1.tangani(); // menangani kartu di dalam tumpukan
} // akhir dari main

Kartu: 0 Jenis: 0 Warna: 0           Kartu: 0 Jenis: 2 Warna: 1
Kartu: 1 Jenis: 0 Warna: 0           Kartu: 1 Jenis: 2 Warna: 1
Kartu: 2 Jenis: 0 Warna: 0           Kartu: 2 Jenis: 2 Warna: 1
Kartu: 3 Jenis: 0 Warna: 0           Kartu: 3 Jenis: 2 Warna: 1
Kartu: 4 Jenis: 0 Warna: 0           Kartu: 4 Jenis: 2 Warna: 1
Kartu: 5 Jenis: 0 Warna: 0           Kartu: 5 Jenis: 2 Warna: 1
Kartu: 6  Jenis: 0  Warna: 0           Kartu: 6 Jenis: 2 Warna: 1
Kartu: 7 Jenis: 0 Warna: 0           Kartu: 7 Jenis: 2 Warna: 1
Kartu: 8 Jenis: 0 Warna: 0           Kartu: 8 Jenis: 2 Warna: 1
Kartu: 9 Jenis: 0 Warna: 0           Kartu: 9 Jenis: 2 Warna: 1
Kartu: 10          Jenis: 0 Warna: 0           Kartu: 10          Jenis: 2 Warna: 1
Kartu: 11          Jenis: 0 Warna: 0           Kartu: 11          Jenis: 2 Warna: 1
Kartu: 12          Jenis: 0 Warna: 0           Kartu: 12          Jenis: 2  Warna: 1
Kartu: 0  Jenis: 1 Warna: 0           Kartu: 0 Jenis: 3 Warna: 1
Kartu: 1  Jenis: 1 Warna: 0           Kartu: 1 Jenis: 3 Warna: 1
Kartu: 2 Jenis: 1 Warna: 0           Kartu: 2 Jenis: 3 Warna: 1
Kartu: 3 Jenis: 1 Warna: 0           Kartu: 3 Jenis: 3 Warna: 1
Kartu: 4 Jenis: 1 Warna: 0           Kartu: 4 Jenis: 3 Warna: 1
Kartu: 5 Jenis: 1 Warna: 0           Kartu: 5 Jenis: 3 Warna: 1
Kartu: 6 Jenis: 1 Warna: 0           Kartu: 6 Jenis: 3 Warna: 1
Kartu: 7 Jenis: 1 Warna: 0           Kartu: 7 Jenis: 3 Warna: 1
Kartu: 8 Jenis: 1 Warna: 0           Kartu: 8 Jenis: 3 Warna: 1
Kartu: 9 Jenis: 1 Warna: 0           Kartu: 9 Jenis: 3 Warna: 1
Kartu: 10          Jenis: 1 Warna: 0           Kartu: 10          Jenis: 3 Warna: 1
Kartu: 11          Jenis: 1 Warna: 0           Kartu: 11          Jenis: 3 Warna: 1
Kartu: 12          Jenis: 1 Warna: 0           Kartu: 12          Jenis: 3 Warna: 1

Adalah hal mungkin untuk menspesifikasi suatu bidang bit tak-bernama, dimana bidang bit itu digunakan untuk melakukan pengganjalan bit di dalam struktur. Sebagai contoh, definisi struktur berikut menggunakan bidang tiga-bit tak-bernama (tidak ada yang bisa disimpan di dalam tiga bit tersebut).

struct Contoh
{
  unsigned a : 13;
  unsigned   : 3
  unsigned b : 4;
}; // akhir dari struct Contoh

Bidang bit tak-bernama dengan lebar bidang 0 digunakan untuk menyejajarkan ke bidang bit berikutnya pada batas unit-penyimpanan baru. Sebagai contoh, definisi struktur

struct Contoh
{
  unsigned a : 13;
  unsigned   : 0
  unsigned b : 4;
}; // akhir dari struct Contoh

menggunakan sebuah bidang 0-bit tak-bernama untuk melompati bit-bit sisa pada unit penyimpanan dimana di dalamnya a disimpan dan menyejajarkan b pada batas unit-penyimpanan berikutnya.

11.7 Pustaka Karater
Kebanyakan data yang dimasukkan ke komputer adalah berupa karakter, termasuk huruf, angka, dan berbagai simbol. Pada bagian ini akan didiskusikan kapabilitas C++ dalam memeriksa dan memanipulasi karakter secara individual.

Pustaka karakter mencakup beberapa fungsi yang dapat melakukan beberapa pengujian dan pemanipulasian data karakter. Setiap fungsi meneriman sebuah karakter, yang direprensentasikan sebagai sebuah int. Karakter seringkali dimanipulasi seperti integer. Ingat bahwa EOF normalnya memiliki nilai -1 dan beberapa arsitek perangkat keras tidak mengijinkan nilai negatif untuk disimpan di dalam variabel char. Oleh karena itu, fungsi pustaka karakter memanipulasi karakter sebagai integer. Gambar 11.15 menyimpulkan fungsi-fungsi pustaka karakter. Ketika menggunakan pustaka karakter, Anda harus mencantumkan header <cctype>.

Gambar 20.15 Fungsi Pustaka Karakter

Prototipe
Penjelasan
int isdigit(int c)

int isalpha(int c)

int isalnum (int c)

int isxdigit(int c)


int islower(int c)

int isupper(int c)

int tolower(int c)


int toupper(int c)



int isspace(int c)


int iscntrl(int c)



int ispunct(int c)

int isprint(int c)

int isgraph(int c)
mengembalikan 1 jika c adalah dijit dan jika tidak mengembalikan 0.

mengembalikan 1 jika c adalah huruf dan jika tidak mengembalikan 0.

mengembalikan 1 jika c adalah dijit atau huruf dan jika tidak mengembalikan 0.

mengembalikan 1 jika c adalah karakter dijit heksadesimal dan jika tidak mengembalikan 0.

mengembalikan 1 jika c adalah huruf kecil dan jika tidak mengembalikan 0.

mengembalikan 1 jika c adalah huruf besar dan jika tidak mengembalikan 0.

jika c adalah huruf besar, tolower mengembalikan c sebagai huruf kecil, jika c tidak huruf besar, tolower mengembalikan argumen yang tidak berubah.

jika c adalah huruf kecil, toupper mengembalikan c sebagai huruf besar, jika c tidak huruf kecil, toupper mengembalikan argumen yang tidak berubah.

mengembalikan 1 jika c adalah karakter spasi-putih, yaitu garis-baru (‘\n’), spasi (‘ ‘), carriage return (‘\r’), tab horisontal (‘\t’), atau tab vertikal (‘\v’). Jika c bukan spasi-putih, isspace mengembalikan 0.

mengembalikan 1 jika c adalah karakter kontrol, yaitu garis-baru (‘\n’), form feed (‘\f’), carriage return (‘\r’), tab horisontal (‘\t’), tab vertikal (‘\v’), alert (‘\a’), atau backspace (‘\b). Jika c bukan karakter kontrol, iscntrl mengembalikan 0.
mengembalikan 1 jika c adalah karakter printing selain spasi, dijit, atau huruf. Jika selain itu, ispunct mengembalikan 0.

mengembalikan 1 jika c adalah karakter printing termasuk spasi (‘ ‘) dan mengembalikan 0 jika c bukan karakter printing.

mengembalikan 1 jika c adalah karakter printing selain spasi (‘ ‘) dan sebaliknya mengembalikan 0.


Gambar 11.16 mendemonstrasikan fungsi isdigit, isalpha, isalnum, dan isxdigit. Fungsi isdigit menentukan apakah argumennya sebuah dijit (0-9) atau tidak. Fungsi isalpha menentukan apakah argumennya sebuah huruf (A-Z, a-z) atau tidak. Fungs isalnum menentukan apakah argumennya sebuah huruf atau dijit (0-9, A-Z, a-z) atau tidak. Fungsi isxdigit menentukan apakah argumennya sebuah dijit heksadesimal (A-F, a-f, 0-9).

Gambar 11.16 Beberapa Fugsi Pustaka Karakter

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
// Gambar 11.16: gambar11_16.cpp
// Fungsi pustaka karakter isdigit, isalpha, isalnum dan isxdigit.
#include <iostream>
#include <cctype> // character-handling function prototypes
using namespace std;

int main()
{
  cout << "Menurut isdigit:\n"
    <<( isdigit( '8' ) ?"8 adalah" : "8 bukan" ) << " dijit\n"
    <<( isdigit( '#' ) ?"# adalah" : "# bukan" ) << " dijit\n";

  cout << "\nMenurut isalpha:\n"
    <<( isalpha( 'A' ) ?"A adalah" : "A bukan" ) << " huruf\n"
    <<( isalpha( 'b' ) ?"b adalah" : "b bukan" ) << " huruf\n"
    <<( isalpha( '&' ) ?"& adalah" : "& bukan" ) << " huruf\n"
    <<( isalpha( '4' ) ?"4 adalah" : "4 bukan" ) << " huruf\n";

  cout << "\nMenurut isalnum:\n"
    <<( isalnum( 'A' ) ?"A adalah" : "A bukan" )
    << " dijit atau huruf\n"
    <<( isalnum( '8' ) ?"8 adalah" : "8 bukan" )
    << " dijit atau huruf\n"
    <<( isalnum( '#' ) ?"# adalah" : "# bukan" )
    << " dijit atau huruf\n";

  cout << "\nMenurut isxdigit:\n"
    <<( isxdigit( 'F' ) ?"F adalah" : "F bukan" )
    << " dijit heksadesimal\n"
    <<( isxdigit( 'J' ) ?"J adalah" : "J bukan" )
    << " dijit heksadesimal\n"
    <<( isxdigit( '7' ) ?"7 adalah" : "7 bukan" )
    << " dijit heksadesimal\n"
    <<( isxdigit( '$' ) ?"$ adalah" : "$ bukan" )
    << " dijit heksadesimal\n"
    <<( isxdigit( 'f' ) ?"f adalah" : "f bukan" )
    << " dijit heksadesimal" << endl;
 } // akhir dari main

Menurut isdigit:
8 adalah dijit
# bukan dijit

Menurut isalpha:
A adalah huruf
b adalah huruf
& bukan huruf
4 bukan huruf

Menurut isalnum:
A adalah dijit atau huruf
8 adalah dijit atau huruf
# bukan dijit atau huruf

Menurut isxdigit:
F adalah dijit heksadesimal
J bukan dijit heksadesimal
7 adalah dijit heksadesimal
$ bukan dijit heksadesimal
f adalah dijit heksadesimal

Gambar 11.16 menggunakan operator kondisional (?:) dengan setiap fungsi untuk menentukan apakah string “adalah” atau string “bukan” yang harus ditampilkan pada keluaran untuk setiap karakter yang diuji. Sebagai contoh, baris 10 mengindikasikan bahwa jika ‘8’ adalah dijit, yaitu jika isdigit mengembalikan true, maka string “8 adalah“ yang ditampilkan. jika ‘8’ bukan dijit, yaitu jika isdigit mengembalikan 0, maka string “8 bukan“ yang ditampilkan.

Gambar 11.17 mendemonstrasikan fungsi islower, isupper, tolower, dan toupper. Fungsi islower menentukan apakah argumennya adalah huruf kecil (a-z) atau tidak. Fungsi isupper menentukan apakah argumennya huruf besar (A – Z) atau tidak. Fungsi tolower mengkonversi huruf besar menjadi huruf kecil dan menjadikan huruf kecil sebagai nilai balik. Jika argumennya tidak huruf besar, fungsi ini mengembalikan argumennya sebagai nilai balik. Fungsi toupper mengkonversi huruf kecil menjadi huruf besar dan menjadikan huruf besar sebagai nilai balik. Jika argumennya tidak huruf kecil, fungsi ini mengembalikan argumennya sebagai nilai balik.

Gambar 11.17 Beberapa Fugsi Lain Pustaka Karakter

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
// Gambar 11.17: gambar11_17.cpp
// Fungsi pustaka karakter islower, isupper, tolower dan toupper.
#include <iostream>
#include <cctype> // prototipe fungsi pustaka karakter
using namespace std;

int main()
{
  cout << "Menurut islower:\n"
    <<( islower( 'p' ) ?"p adalah" : "p bukan" )
    << " huruf kecil\n"
    <<( islower( 'P' ) ?"P adalah" : "P bukan" )
    << " huruf kecil\n"
    <<( islower( '5' ) ?"5 adalah" : "5 bukan" )
    << " huruf kecil\n"
    <<( islower( '!' ) ?"! adalah" : "! bukan" )
    << " huruf kecil\n";

  cout << "\nMenurut isupper:\n"
    <<( isupper( 'D' ) ?"D adalah" : "D bukan" )
    << " huruf besar\n"
    <<( isupper( 'd' ) ?"d adalah" : "d bukan" )
    << " huruf besar\n"
    <<( isupper( '8' ) ?"8 adalah" : "8 bukan" )
    << " huruf besar\n"
    <<( isupper( '$' ) ?"$ adalah" : "$ bukan" )
    << " huruf besar\n";

  cout << "\nu dikonversi menjadi huruf besar adalah "
    << static_cast< char >( toupper( 'u' ) )
    << "\n7 dikonversi menjadi huruf besar adalah "
    << static_cast< char >( toupper( '7' ) )
    << "\n$ dikonversi menjadi huruf besar adalah "
    << static_cast< char >( toupper( '$' ) )
    << "\nL dikonversi menjadi huruf kecil adalah "
    << static_cast< char >( tolower( 'L' ) ) << endl;
} // akhir dari main

Menurut islower:
p adalah huruf kecil
P bukan huruf kecil
5 bukan huruf kecil
! bukan huruf kecil

Menurut isupper:
D adalah huruf besar
d bukan huruf besar
8 bukan huruf besar
$ bukan huruf besar

u dikonversi menjadi huruf besar adalah U
7 dikonversi menjadi huruf besar adalah 7
$ dikonversi menjadi huruf besar adalah $
L dikonversi menjadi huruf kecil adalah l

Gambar 11.18 mendemonstrasikan fungsi isspace, iscntrl, ispunct, isprint dan isgraph. Fungsi isspace menentukan apakah argumennya merupakan karakter spasi, seperti garis-baru (‘\n’), spasi (‘ ‘), carriage return (‘\r’), tab horisontal (‘\t’), atau tab vertikal (‘\v’). Fungsi iscntrl menentukan apakah argumennya berupa karakter kontrol, seperti garis-baru (‘\n’), form feed (‘\f’), carriage return (‘\r’), tab horisontal (‘\t’), tab vertikal (‘\v’), alert (‘\a’), atau backspace (‘\b). Fungsi ispunct menentukan apakah argumennya karakter printing selain spasi, dijit, atau huruf. Fungsi isprint menentukan apakah argumennya berupa karakter yang bisa ditampilkan pada layar (termasuk spasi). Fungsi isgraph menguji sama dengan isprint, tetapi karakter spasi di sini tidak disertakan.

Gambar 11.18 Menggunakan Fungsi isspace, iscntrl, ispunct, isprint, dan isgraph

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 11.18: gambar11_18.cpp
// Menggunakan isspace, iscntrl, ispunct, isprint dan isgraph.
#include <iostream>
#include <cctype> // prototipe fungsi pustaka karakter
using namespace std;

int main()
{
  cout << "Menurut isspace:\nGaris-baru "
    <<( isspace( '\n' ) ?"adalah" : "bukan" )
    << " karakter spasi-putih\nTab horisontal "
    <<( isspace( '\t' ) ?"adalah" : "bukan" )
    << " karakter spasi-putih\n"
    <<( isspace( '%' ) ?"% adalah" : "% bukan" )
    << " karakter spasi-putih\n";

  cout << "\nMenurut iscntrl:\nGaris-baru "
    <<( iscntrl( '\n' ) ?"adalah" : "bukan" )
    << " karakter kontrol\n"
    <<( iscntrl( '$' ) ?"$ adalah" : "$ bukan" )
    << " karakter kontrol\n";

  cout << "\nMenurut ispunct:\n"
    <<( ispunct( ';' ) ?"; adalah" : "; bukan" )
    << " karakter tanda-baca\n"
    <<( ispunct( 'Y' ) ?"Y adalah" : "Y bukan" )
    << " karakter tanda-baca\n"
    <<( ispunct( '#' ) ?"# adalah" : "# bukan" )
    << " karakter tanda-baca\n";

  cout << "\nMenurut isprint:\n"
    <<( isprint( '$' ) ?"$ adalah" : "$ bukan" )
    << " karakter printing\nAlert "
    <<( isprint( '\a' ) ?"adalah" : "bukan" )
    << " karakter printing\nSpasi "
    <<( isprint( ' ' ) ?"adalah" : "bukan" )
    << " karakter printing\n";

  cout << "\nMenurut isgraph:\n"
    <<( isgraph( 'Q' ) ?"Q adalah" : "Q bukan" )
    << " karakter printing selain spasi\nSpasi "
    <<( isgraph( ' ' ) ?"adalah" : "bukan" )
    << " karakter printing selain spasi" << endl;
} // akhir dari main

Menurut isspace:
Garis-baru adalah karakter spasi-putih
Tab horisontal adalah karakter spasi-putih
% bukan karakter spasi-putih

Menurut iscntrl:
Garis-baru adalah karakter kontrol
$ bukan karakter kontrol

Menurut ispucnt:
; adalah karakter tanda-baca
Y bukan karakter tanda-baca
# adalah karakter tanda-baca

Menurut isprint:
$ adalah karakter printing
Alter bukan karakter printing
Spasi adalah karakter printing

Menurut isgraph:
Q adalah karakter printing selain spasi
Spasi bukan karakter printing selain spasi

11.8 Fungsi Pemanipulsi String Berbasis Pointer
Pustaka string menyediakan beberapa fungsi untuk memanipulasi data string, membandingkan string, mencari string, dan lain-lain. Bagian ini menyajikan beberapa fungsi pemanipulasi string yang umum digunakan. Fungsi-fungsi tersebut disimpulkan pada Gambar 11.19; kemudian setiap fungsi digunakan di dalam contoh kode. Prototipe fungsi-fungsi tersebut dilokasikan di dalam header <cstring>.

Gambar 11.19 Fungsi Pemanipulasi String di dalam Pustaka String

Prototipe Fungsi
Penjelasan Fungsi
char *strcpy( char *s1, const char *s2 );
                                                       Menyalin string s2 ke array karakter s1. Nilai s1 yang dijadikan nilai
                                                       balik.

char *strncpy( char *s1, const char *s2, size_t n );
                                                       Menyalin sebanyak-banyaknya n karakter dari string s2 ke array
                                                       karakter s1. Nilai s1 yang dijadikan nilai balik.

char *strcat( char *s1, const char *s2 );
                                                       Menyambung string s2 ke string s1. Karakter pertama dari s2
                                                       menindih karakter null dari s1. Nilai s1 yang dijadikan nilai balik.

char *strncat( char *s1, const char *s2, size_t n );
                                                       Menyambung sebanyak-banyaknya n karakter dari string s2 ke string
                                                       s1. Karakter pertama dari s2 menindih karakter null dari s1. Nilai s1
                                                       yang dijadikan nilai balik.

int strcmp( const char *s1, const char *s2 );
                                                       Membandingkan string s1 dengan string s2. Fungsi ini
                                                       mengembalikan sebuah nilai nol, kurang dari nol, atau lebih dari nol
                                                       jika s1 sama dengan, kurang dari, atau lebih dari s2.

int strncmp( const char *s1, const char *s2, size_t n );
                                                       Membandingkan sampai dengan n karakter dari string s1 dengan
                                                       string s2. Fungsi ini mengembalikan sebuah nilai nol, kurang dari nol,
                                                       atau lebih dari nol jika n karakter penggalan dari s1 sama dengan,
                                                       kurang dari, atau lebih dari n karakter penggalan dari s2.

char *strtok( char *s1, const char *s2 );
Sederet pemanggilan terhadap strtok akan memecah string s1 menjadi token-token, potongan logis atas suatu kata di dalam sebaris teks. String s1 dipecah sesuai dengan karakter di dalam string s2. Sebagai contoh, jika akan dipecah string “danau:toba:siantar” menjadi token-token berdasarkan karakter ‘:’, maka token yang dihasilkan adalah “danau”, “toba”, dan “siantar”. Fungsi strtok memberikan nilai balik berupa satu token per unit waktu. Pemanggilan pertama memuat s1 sebagai argumen, dan pemanggilan selanjutnya akan melanjutkan pentokenan string yang sama.

size_t strlen( const char *s );
Menentukan panjang suatu string s. Jumlah karakter yang berada sebelum karakter null yang akan dijadikan nilai balik.

Beberapa fungsi pada Gambar 11.19 memuat parameter dengan tipe data size_t. Tipe ini didefinisikan di dalam header <cstring> yang merupakan tipe integral unsigned seperti unsigned int, unsigned long, dan seterusnya.

Menyalin String dengan strcpy dan strncpy
Fungsi strcpy menyalin argumen keduanya, sebuah string, ke dalam argumen pertamanya, sebuah array karakter yang cukup besar untuk menyimpan string pada argumen kedua dan karakter nullnya (yang juga disalin). Fungsi strncpy sangat mirip dengan strcpy, kecuali bahwa strncpy menspesifikasi jumlah karakter yang akan disalin dari string ke array karakter. Fungsi strncpy tidak harus selalu menyalin karakter null dari argumen keduanya, karena karakter null hanya disalin jika jumlah karakter yang akan disalin setidaknya lebih besar satu dari panjang string. Sebagai contoh, jika “binjai ” adalah argumen kedua, maka karakter null akan disalin jika argumen ketiga dari strncpy sedikitnya memiliki panjang 7 karakter (6 karakter di dalam “binjai ” ditambah satu karakter null).

Gambar 11.20 menggunakan strcpy (baris 13) untuk menyalin keseluruhan string di dalam array x ke dalam array y dan menggunakan strncpy (baris 19) untuk menyalin 14 karakter pertama di dalam array x ke dalam array z. Baris 20 menambahkan sebuah karakter null (‘\0’) ke dalam array z, karena pemanggilan terhadap strncpy di dalam program tidak menyalin karakter null. (Argumen ketiga kurang dari panjang string pada argumen kedua ditambah satu).

Gambar 11.20 Menggunakan strcpy dan strncpy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Gambar 11.20: gambar11_20.cpp
// Menggunakan strcpy dan strncpy.
#include <iostream>
#include <cstring> // prototipe untuk strcpy dan strncpy
using namespace std;

int main()
{
  char x[] = "Selamat Ulang Tahun ya!"; // panjang string 23
  char y[ 25 ];
  char z[ 15 ];

  strcpy( y, x ); // menyalin isi x ke y

  cout << "String di dalam array x adalah: " << x
    << "\nString di dalam array y adalah: " << y << '\n';

  // menyalin 14 karakter pertama dari x ke z
  strncpy( z, x, 14 ); // tidak menyalin karakter null
  z[ 14 ] = '\0'; // menyambung '\0' ke isi z

  cout << "String di dalam array z adalah: " << z << endl;
} // akhir dari main

String di dalam array x adalah: Selamat Ulang Tahun ya!
String di dalam array y adalah: Selamat Ulang Tahun ya!
String di dalam array z adalah: Selamat Ulang

Menyambung String dengan strcat dan strncat
Fungsi strcat menyambung argumen keduanya (sebuah string) ke argumen pertamanya (sebuah array karakter yang memuat string). Karakter pertama pada argumen kedua menggantikan karakter null (‘\0’) di dalam argumen kedua. Anda harus memastikan bahwa array yang dipakai untuk menyimpan string pertama harus cukup besar untuk menampung penggabungan atas string pertama, string kedua dan karakter null (karakter null yang disalin dari string kedua). Fungsi strncat menyambung sejumlah karakter tertentu dari string kedua ke string pertama dan menyambung sebuah karakter null kepada hasil. Program pada Gambar 11.21 mendemonstrasikan fungsi strcat (baris 15 dan 25) dan fungsi strncat (baris 20).

Gambar 11.21 Menggunakan strcat dan strncat
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
// Gambar 11.21: gambar11_21.cpp
// Using strcat and strncat.
#include <iostream>
#include <cstring> // prototipe untuk strcat dan strncat
using namespace std;

int main()
{
  char s1[ 20 ] = "Selamat "; // panjang 8
  char s2[] = "Tahun Baru "; // panjang 11
  char s3[ 40 ] = "";

  cout << "s1 = " << s1 << "\ns2 = " << s2;

  strcat( s1, s2 ); // menyambung s2 ke s1 (panjang 19)

  cout << "\n\nSetelah strcat(s1, s2):\ns1 = " << s1 << "\ns2 = " << s2;

  // menyambung 8 karakter pertama dari s1 ke s3
  strncat( s3, s1, 8 ); // menempatkan '\0' setelah karakter terakhir

  cout << "\n\nSetelah strncat(s3, s1, 8):\ns1 = " << s1
    << "\ns3 = " << s3;

  strcat( s3, s1 ); // menyambung s1 ke s3
  cout << "\n\nSetelah strcat(s3, s1):\ns1 = " << s1
    << "\ns3 = " << s3 << endl;
} // akhir dari main

S1 = Selamat
s2 = Tahun Baru

Setelah strcat(s1, s2):
s1 = Selamat Tahun Baru
s2 = Tahun Baru

Seteleh strncat(s3, s1, 8):
s1 = Selamat Tahun Baru
s3 = Selamat

Setelah strcat(s3, s1)
s1 = Selamat Tahun Baru
s3 = Selamat Selamat Tahun Baru

Membandingkan String dengan strcmp dan strncmp
Gambar 11.22 membandingkan dua string menggunakan strcmp (baris 15-17) dan strncmp (baris 20-22). Fungsi strcmp membandingkan argumen string pertamanya dengan argumen string keduanya karakter demi karakter. Fungsi ini menghasilkan nol jika kedua string sama sama, nilai negatif jika string pertama kurang dari string kedua, dan nilai positif jika string pertama lebih dari string kedua. Fungsi strncmp ekivalen dengan strcmp, kecuali bahwa strncmp membandingkan sampai sejumlah karakter tertentu. Fungsi strncmp akan berhenti membandingkan karakter jika ia mencapai karakter null di dalam salah satu argumen stringnya. Program kemudian menampilkan nilai integer yang dihasilkan oleh tiap pemanggilan fungsi.

Gambar 11.22 Menggunakan strcmp dan strncmp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Gambar 11.22: gambar11_22.cpp
// Using strcmp and strncmp.
#include <iostream>
#include <iomanip>
#include <cstring> // prototipe untuk fungsi strcmp dan strncmp
using namespace std;

int main()
{
  char *s1 = "Selamat Ulang Tahun";
  char *s2 = "Selamat Ulang Tahun";
  char *s3 = "Selamat Berlibur";

  cout << "s1 = " << s1 << "\ns2 = " << s2 << "\ns3 = " << s3
    << "\n\nstrcmp(s1, s2) = " << setw( 2 ) << strcmp( s1, s2 )
    << "\nstrcmp(s1, s3) = " << setw( 2 ) << strcmp( s1, s3 )
    << "\nstrcmp(s3, s1) = " << setw( 2 ) << strcmp( s3, s1 );

  cout << "\n\nstrncmp(s1, s3, 6) = " << setw( 2 )
    << strncmp( s1, s3, 6 ) << "\nstrncmp(s1, s3, 9) = " << setw( 2 )
    << strncmp( s1, s3, 9 ) << "\nstrncmp(s3, s1, 9) = " << setw( 2 )
    << strncmp( s3, s1, 9 ) << endl;
} // akhir dari main

s1 = Selamat Tahun Baru
s2 = Selamat Tahun Baru
s3 = Selamat Berlibur

strcmp(s1, s2) = 0
strcmp(s1, s3) = 19
strcmp(s3, s1) = -19

strncmp(s1, s3, 6) = 0
strncmp(s1, s3, 7) = 19
strncmp(s3, s1, 7) = -19

Mentokenkan String dengan strtok
Fungsi strtok memecah suatu string menjadi beberapa token. Token merupakan suatu runtun karakter yang dipisahkan oleh karakter-karakter pembatas (biasanya spasi atau tanda baca). Sebagai contoh, dalam sebaris teks, setiap kata dipandang sebagai token dan spasi yang memisahkan setiap kata dipandang sebagai karakter pembatas.

Pemanggilan berkali-kali terhadap strtok dibutuhkan untuk memecah sebuah string menjadi beberapa token (diasumsikan string memuat lebih dari satu token). Pemanggilan pertama terhadap strtok memuat dua argumen, sebuah string yang akan ditokenkan dan sebuah string yang memuat karakter yang memisahkan antar token (delimiter atau pembatas). Baris 16 pada Gambar 11.23 menugaskan suatu pointer yang menunjuk ke token pertama (di dalam kalimat) kepada tokenPtr. Argumen kedua, “ “, mengindikasikan bahwa token-token di dalam kalimat dipisahkan oleh spasi. Fungsi strtok mencari karakter pertama di dalam kalimat yang tidak merupakan karakter pembatas (spasi). Ini merupakan token pertama. Fungsi ini kemudian mencari karakter pembatas pertama di dalam string dan menggantikannya dengan karakter null (‘\0’). Ini menghentikan token sekarang. Fungsi strtok menyimpan (di dalam sebuah variabel static) suatu pointer yang menunjuk ke karakter berikutnya setelah token pertama di dalam kalimat.

Pemanggilan berkali-kali terhadap strtok akan melanjutkan pentokenan kalimat yang memuat NULL sebagai argumen pertama (baris 22). Argumen NULL mengindikasikan bahwa pemanggilan terhadap strtok harus berlanjut mulai dari lokasi di dalam kalimat yang disimpan oleh pemanggilan terakhir terhadap strtok. Fungsi strtok melakukan hal ini meski Anda tidak menyadarinya. Jika tidak ada lagi token yang tersisa ketika strtok dipanggil, maka strtok menghasilkan nilai balik NULL. Program pada Gambar 11.23 menggunakan strtok untuk mentokenkan string “Ini adalah sebuah kalimat dengan 7 token”. Program kemudian menampilkan setiap token pada baris yang terpisah. Baris 25 menampilkan kalimat setelah tokenisasi. Perhatikan bahwa strtok memodifikasi string masukan; oleh karena itu, salinan dari string asli harus diciptakan jika program memerlukannya setelah pemanggilan strtok. Ketika kalimat ditampilkan setelah tokenisasi, hanya kata “Ini” yang tertampil, karena strtok mengganti setiap spasi di dalam kalimat dengan sebuah karakter null (‘\n’) selama proses tokenisasi.

Gambar 11.23 Menggunakan strtok untuk Menokenkan 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
// Gambar 11.23: gambar11_23.cpp
// Menggunakan strtok untuk mentokenkan sebuah string.
#include <iostream>
#include <cstring> // prototipe untuk strtok
using namespace std;

int main()
{
  char kalimat[] = "Ini adalah sebuah kalimat dengan 7 token";
  char *tokenPtr;

  cout << "String yang akan ditokenkan adalah:\n" << kalimat
   << "\n\nToken-token tersebut adalah:\n\n";

  // mulai tokenisasi kalimat
  tokenPtr = strtok( kalimat, " " );

  // melanjutkan tokenisasi kalimat sampai tokenPtr menjadi NULL
  while ( tokenPtr != NULL )
  {
    cout << tokenPtr << '\n';
    tokenPtr = strtok( NULL, " " );// mendapatkan token berikutnya
  } // akhir dari while

  cout << "\nSetelah strtok, kalimat = " << kalimat << endl;
} // akhir dari main

String yang akan ditokenkan adalah:
Ini adalah sebuah kalimat dengan 7 token

Token-token tersebut adalah:
Ini
adalah
sebuah
kalimat
dengan
7 token

Setelah strtok, kalimat = Ini


Menentukan Panjang String
Fungsi strlen mengambil sebuah string sebagai argumen dan menjadikan jumlah karakter di dalam string sebagai nilai balik, dimana karakter null tidak dihitung. Program pada Gambar 11.24 mendemonstrasikan fungsi strlen.

Gambar 11.24 Menggunakan strlen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Gambar 11.24: gambar11_24.cpp
// Menggunakan strlen.
#include <iostream>
#include <cstring> // prototipe untuk strlen
using namespace std;

int main()
{
  char *string1 = "abcdefghijklmnopqrstuvwxyz";
  char *string2 = "empat";
  char *string3 = "Surabaya";

  cout << "Panjang dari \"" << string1 << "\" adalah " << strlen( string1 )
    << "\nPanjang dari \"" << string2 << "\" adalah " << strlen( string2 )
    << "\nPanjang dari \"" << string3 << "\" adalah " << strlen( string3 )
    << endl;
} // akhir dari main

Panjang dari “abcdefghijklmnopqrstuvwxyz” adalah 26
Panjang dari “empat” adalah 4
Panjang dari “Surabaya” adalah 8

11.9 Fungsi Konversi String Berbasis Pointer
Sebelumnya telah didiskusikan beberapa fungsi pemanipulasi string yang paling populer di dalam C++. Sekarang, akan didiskusikan fungsi-fungsi untuk mengkonversi string menggunakan utilitas <cstdlib>. Fungsi-fungsi ini mengkonversi string berbasis pointer menjadi integer dan nilai pecahan. Pada Gambar 11.25 disimpulkan beberapa fungsi konversi string berbasis pointer. Ketika menggunakannya, Anda perlu mencantumkan header <cstdlib>.

Gambar 11.25 Fungsi Pengkonversi String di dalam Pustaka String

Prototipe Fungsi
Penjelasan Fungsi
double atof( const char *nPtr );
Mengkonversi string nPtr menjadi double. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik.

int atoi( const char *nPtr )
Mengkonversi string nPtr menjad int. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik.

long atol( const char *nPtr )
Mengkonversi string nPtr menjad long int. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik.

double strtod( const char *nPtr, char **endPtr )
Mengkonversi string nPtr menjadi double. endPtr merupakan alamat sebuah pointer ke sisa string setelah double. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik.

long strtol( const char *nPtr, char **endPtr, int base )
Mengkonversi string nPtr menjadi long. endPtr merupakan alamat sebuah pointer ke sisa string setelah long. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik. Parameter base adalah parameter yang mengindikasikan basis bilangan yang akan dikonversi. (8 untuk oktal, 10 untuk desimal, atau 16 untuk heksadesimal). Default adalah desimal.

unsigned long strtoul( const char *nPtr, char **endPtr, int base )
Mengkonversi string nPtr menjadi unsigned long. endPtr merupakan alamat sebuah pointer ke sisa string setelah long. Jika string tidak dapat dikonversi, 0 diberikan sebagai nilai balik. Parameter base adalah parameter yang mengindikasikan basis bilangan yang akan dikonversi. (8 untuk oktal, 10 untuk desimal, atau 16 untuk heksadesimal). Default adalah desimal.

Fungsi atof (Gambar 11.26 pada baris 9) mengkonversi argumennya, sebuah string yang merepresentasikan suatu angka pecahan, menjadi nilai double. Fungsi ini menghasilkan nilai balik double. Jika string tidak dapat dikonversi, misalnya jika karakter pertama string bukan suatu dijit, maka fungsi atof menghasilkan nol.

Gambar 11.26 Menggunakan atof
1
2
3
4
5
6
7
8
9
10
11
12
13
// Gambar 11.26: gambar11_26.cpp
// Menggunakan atof.
#include <iostream>
#include <cstdlib> // prototipe atof
using namespace std;

int main()
{
  double d = atof( "99.0" ); // mengkonversi string ke double

  cout << "String \"99.0\" dikonversi ke double menjadi " << d
    << "\nNilai terkonversi dibagi 2 adalah " << d / 2.0 << endl;
} // akhir dari main

String “99.0” dikonversi ke double menjadi 99
Nilai terkonversi dibagi 2 adalah 49.5

Fungsi atoi (Gambar 11.27 pada baris 9) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu integer, menjadi suatu nilai int. Fungsi ini menghasilkan nilai int sebagai nilai balik. Jika string tidak dapat dikonversi, fungsi atoi menghasilkan nol.

Gambar 11.27 Menggunakan atoi
1
2
3
4
5
6
7
8
9
10
11
12
13
// Gambar 11.27: gambar11_27.cpp
// Menggunakan atoi.
#include <iostream>
#include <cstdlib> // prototipe atoi
using namespace std;

int main()
{
  int i = atoi( "2593" ); // mengkonversi string menjadi int

  cout << "String \"2593\" dikonversi ke int menjadi " << i
    << "\nNilai terkonversi dikurangi 593 adalah " << (i - 593) << endl;
} // akhir dari main

String “2593” dikonversi ke int menjadi 2593
Nilai terkonversi dikurangi 593 adalah 2000

Fungsi atol (Gambar 11.28 pada baris 9) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu long integer, menjadi suatu nilai long. Fungsi ini menghasilkan nilai long sebagai nilai balik. Jika string tidak dapat dikonversi, fungsi atol menghasilkan nol. Jika int dan long keduanya disimpan dalam empat byte, maka fungsi atoi dan atol akan memberikan hasil yang identik.

Gambar 11.28 Menggunakan atol
1
2
3
4
5
6
7
8
9
10
11
12
13
// Gambar 11.28: gambar11_28.cpp
// Menggunakan atol.
#include <iostream>
#include <cstdlib> // prototipe atol
using namespace std;

int main()
{
  long x = atol( "1000000" ); // mengkonversi string menjadi long

  cout << "String \"1000000\" dikonversi ke long menjadi " << x
    << "\nNilai terkonversi dibagi 2 adalah " << x/2 << endl;
} // akhir dari main

String “1000000” dikonversi ke long menjadi 1000000
Nilai terkonversi dibagi 2 adalah 500000

Fungsi strtod (Gambar 11.29) mengkonversi sebuah runtun karakter yang merepresentasikan suatu nilai pecahan menjadi double. Fungsi strtod menerima dua argumen, sebuah string (char *) dan alamat dari sebuah pointer char * (yaitu char **). String tersebut memuat runtuk karakter yang akan dikonversi menjadi double. Argumen kedua memampukan strtod untuk memodifikasi sebuah pointer char * di dalam fungsi pemanggil, sehingga pointer itu menunjuk ke lokasi dari karakter pertama setelah sepenggal string yang dikonversi.  Baris 13 mengindikasikan bahwa d ditugasi nilai double yang dikonversi dari string dan bahwa stringPtr ditugasi alamat dari karakter pertama setelah nilai terkonversi (51.2) di dalam string.

Gambar 11.29 Menggunakan strtod
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Gambar 11.29: gambar11_29.cpp
// Menggunakan strtod.
#include <iostream>
#include <cstdlib> // prototipe strtod
using namespace std;

int main()
{
  double d;
  const char *string1 = "51.2% mahasiswa adalah perempuan";
  char *stringPtr;

  d = strtod( string1, &stringPtr ); // mengkonversi karakter menjadi double

  cout << "String \"" << string1
    << "\" dikonversi ke \nnilai double " << d
    << " dan string \"" << stringPtr << "\"" << endl;
} // akhir dari main

String “51.2% mahasiswa adalah perempuan” dikonversi ke
nilai double 51.2 dan string “% mahasiswa adalah perempuan”

Fungsi strtol (Gambar 11.30) mengkonversi ke long dari sebuah runtun karakter yang merepresentasikan sebuah integer. Fungsi menerima sebuah string (char *), alamat pointer char *, dan sebuah integer. Argumen string memuat runtun karakter yang akan dikonversi. Argumen kedua ditugasi lokasi karakter pertama yang ditempatkan setelah penggalan string yang dikonversi. Argumen integer menspesifikasi basis nilai yang sedang dikonversi. Baris 13 mengindikasikan bahwa x ditugasi nilai long yang dikonversi dari string dan bahwa sisaPtr ditugasi lokasi karakter pertama yang ditempatkan setelah nilai terkonversi (-1234567) di dalam string1. Penggunaan pointer null untuk argumen kedua menyebabkan sisa string diabaikan. Argumen ketiga, 0, mengindikasikan bahwa nilai yang dikonversi dapat berupa bilangan oktal (basis 8), desimal (basis 10), atau heksadesimal (basis 16). Ini ditentukan oleh karakter awal di dalam string, dimana 0 mengindikasikan bilangan oktal, 0x mengindikasikan heksadesimal, dan suatu angka dari 1 sampai 9 mengindikasikan desimal.

Gambar 11.30 Menggunakan strtol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Gambar 11.30: gambar11_30.cpp
// Menggunakan strtol.
#include <iostream>
#include <cstdlib> // prototipe strtol
using namespace std;

int main()
{
  long x;
  const char *string1 = "-1234567abc";
  char *sisaPtr;

  x = strtol( string1, &sisaPtr, 0 ); // mengkonversi karakter menjadi long

  cout << "String awal adalah \"" << string1
    << "\"\nNilai terkonversi adalah " << x
    << "\nSisa dari string asli adalah \"" << sisaPtr
    << "\"\nNilai terkonversi plus 567 adalah " << (x + 567) << endl;
} // akhir dari main

String asli adalah "-1234567abc"
Nilai terkonversi adalah -1234567
Sisa dari string asli adalah "abc"
Nilai terkonversi plus 567 adalah -1234000

Di dalam suatu pemanggilan fungsi strtol, basis dapat dispesifikasi sebagai nol atau sembarang nilai di antara 2 dan 36. Representasi numerik atas integer dari basis 11 sampai 36 menggunakan karakter A – Z untuk merepresentasikan nilai dari 10 sampai 35. Sebagai contoh, nilai-nilai heksadesimal dapat memuat dijit 0 sampai 9 dan karakter A sampai F. Suatu integer basis 11 dapat memuat dijit 0 sampai 9 dan karakter A. Suatu integer basis 24 dapat memuat dijit 0 sampai 9 dan karakter A sampai N. Suatu integer basis 36 dapat memuat dijit 0 sampai 9 dan karakter A sampai Z.

Fungsi strtoul (Gambar 11.31) mengkonversi ke unsigned long dari suatu runtun karakter yang merepresentasikan sebuah integer unsigned long. Fungsi ini bekerja secara identik dengan strtol. Baris 14 mengindikasikan bahwa x ditugasi nilai unsigned long yang dikonversi dari string dan bahwa sisaPtr ditugasi lokasi karakter pertama yang ditempatkan setelah nilai terkonversi (1234567) di dalam string1. Argumen ketiga, 0, mengindikasikan bahwa nilai yang dikonversi dapat berupa bilangan oktal, desimal, atau heksadesimal.

Gambar 11.31 Menggunakan strtoul
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Gambar 11.31: gambar11_31.cpp
// Menggunakan strtoul.
#include <iostream>
#include <cstdlib> // prototipe strtoul
using namespace std;

int main()
{
  long x;
  const char *string1 = "1234567abc";
  char *sisaPtr;

  // mengkonversi runtun karakter menjadi unsigned long
  x = strtoul( string1, &sisaPtr, 0 );

  cout << "String awal adalah \"" << string1
    << "\"\nNilai terkonversi adalah " << x
    << "\nSisa dari string asli adalah \"" << sisaPtr
    << "\"\nNilai terkonversi minus 567 adalah " << (x - 567) << endl;
} // akhir dari main

String asli adalah "1234567abc"
Nilai terkonversi adalah 1234567
Sisa dari string asli adalah "abc"
Nilai terkonversi plus 567 adalah 1234000

11.10 Fungsi Pencarian Pada Pustaka String
Bagian ini menyajikan beberapa fungsi string yang bisa dipakai untuk mencari karakter dan string di dalam suatu string. Fungsi-fungsi tersebut disimpulkan pada Gambar 11.32. Fungsi strcspn dan strspn menspesifikasi tipe size_t. Tipe size_t merupakan sebuat tipe yang didefinisikan sebagai tipe integral standard yang dijadikan nilai balik oleh operator sizeof. Fungsi strchr mencari kemunculan pertama dari sebuah karakter di dalam suatu string. Jika karakter ditemukan, maka strchr memberikan nilai balik berupa suatu pointer yang menunjuk ke karakter tersebut di dalam string; sebaliknya, strchr menghasilkan suatu pointer null. Program pada Gambar 11.33 menggunakan strchr (baris 14 dan 22) untuk mencari kemunculan pertama dari ‘a’ dan ‘z’ di dalam string “Ini adalah sebuah test”.

Gambar 11.32 Fungsi Pencarian di dalam Pustaka String

Prototipe Fungsi
Penjelasan Fungsi
char *strchr( const char *s, int c );
Mencari lokasi kemunculan pertama dari karakter c di dalam string s. Jika c ditemukan, maka sebuah pointer yang menunjuk ke c di dalam s dijadikan nilai balik. Sebaliknya, sebuah pointer null yang dijadikan nilai balik.

char *strrchr( const char *s, int c )
Mencari dimulai dari ujung akhir string s dan melokasi kemunculan terakhir dari karakter c di dalam string s. Jika c ditemukan, maka sebuah pointer yang menunjuk ke c di dalam s dijadikan nilai balik. Sebaliknya, sebuah pointer null yang dijadikan nilai balik.

size_t strspn( const char *s1, const char *s2 )
Menentukan dan menjadikan nilai balik panjang segmen awal string s1 yang hanya memuat karakter-karakter yang dimuat di dalam string s2.

char *strpbrk( const char *s1, const char *s2 )
Mencari lokasi kemunculan pertama dari sembarang karakter di dalam string s2 di dalam string s1. Jika suatu karakter dari string s2 ditemukan, maka pointer yang menunjuk ke karakter tersebut di dalam string s1 dijadikan nilai balik. Sebaliknya, sebuah pointer null yang dijadikan nilai balik.

size_t strcspn( const char *s1, const char *s2 )
Menentukan dan menjadikan nilai balik panjang segmen awal string s1 yang hanya memuat karakter-karakter yang tidak dimuat di dalam string s2.

char *strstr( const char *s1, const char *s2 )
Mencari lokasi kemunculan pertama string s2 di dalam string s1. Jika string tersebut ditemukan, maka pointer yang menunjuk ke string s2 di dalam s1 dijadikan nilai balik. Sebaliknya, sebuah pointer null yang dijadikan nilai balik.

Gambar 11.33 Menggunakan strchr
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
// Gambar 11.33: gambar11_33.cpp
// Menggunakan strchr.
#include <iostream>
#include <cstring> // prototipe strchr
using namespace std;

int main()
{
  const char *string1 = "Ini adalah sebuah test";
  char karakter1 = 'a';
  char karakter2 = 'z';

  // mencari karakter1 di dalam string1
  if( strchr( string1, karakter1 ) != NULL )
    cout << '\'' << karakter1 << "' ditemukan di dalam \""
      << string1 << "\".\n";
  else
    cout << '\'' << karakter1 << "' tidak ditemukan di dalam \""
      << string1 << "\".\n";

  // mencari karakter2 di dalam string1
  if( strchr( string1, karakter2 ) != NULL )
    cout << '\'' << karakter2 << "' ditemukan di dalam \""
      << string1 << "\".\n";
  else
    cout << '\'' << karakter2 << "' tidak ditemukan di dalam \""
      << string1 << "\"." << endl;
} // akhir dari main

‘a’ ditemukan di dalam “Ini adalah sebuah test”
‘z’ tidak ditemukan di dalam “Ini adalah sebuah test”

Fungsi strcspn (Gambar 11.34, baris 15) menentukan panjang dari segmen awal dari string di dalam argumen pertamanya yang tidak memuat sembarang karakter dari string di dalam argumen keduanya. Fungsi ini mengembalikan panjang segmen.

Gambar 11.34 Menggunakan strcspn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Gambar 11.34: gambar11_34.cpp
// Menggunakan strcspn.
#include <iostream>
#include <cstring> // prototipe strcspn
using namespace std;

int main()
{
  const char *string1 = "Nilai adalah 3.14159";
  const char *string2 = "1234567890";

  cout << "string1 = " << string1 << "\nstring2 = " << string2
    << "\n\nPanjang segmen awal dari string1"
    << "\nyang tidak memuat sembarang karakter dari string2 = "
    << strcspn( string1, string2 ) << endl;
} // akhir dari main

string1 = Nilai adalah 3.14159
string2 = 1234567890
Panjang segmen awal dari string1
yang tidak memuat sembarang karakter dari string2 = 13

Fungsi strpbrk mencari kemunculan pertama dari sembarang karakter di dalam argumen string keduanya di dalam argumen string pertamanya. Jika sebuah karakter dari argumen kedua ditemukan, maka fungsi strpbrk mengembalikan sebuah pointer yang menunjuk ke karakter tersebut di dalam argumen pertama; sebaliknya, sebuah pointer null yang dijadikan nilai balik. Baris 13 pada Gambar 11.35 mencari loksi kemunculan pertama dari sembarang karakter dari string2 di dalam string1.

Gambar 11.35 Menggunakan strpbrk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Gambar 11.35: gambar11_35.cpp
// Menggunakan strpbrk.
#include <iostream>
#include <cstring> // prototipe strpbrk
using namespace std;

int main()
{
  const char *string1 = "Ini adalah sebuah test";
  const char *string2 = "berhati-hatilah";

  cout << "Dari karakter-karakter di dalam \"" << string2 << "\"\n'"
    << *strpbrk( string1, string2 ) << "\' adalah karakter pertama "
    << "yang muncul di dalam\n\"" << string1 << '\"' << endl;
} // akhir dari main

Dari karakter-karakter di dalam “berhati-hatilah”
‘i’ adalah karakter pertama yang muncul di dalam
“Ini adalah sebuah test”

Fungsi strrchr mencari kemunculan terakhir dari karakter yang dispesifikasi di dalam sebuah string. Jika karakter yang dicari ditemukan, strrchr menjadikan nilai balik berupa sebuah pointer yang menunjuk ke karakter tersebut di dalam string; sebaliknya, strrchr menghasilkan 0. Baris 15 pada Gambar 11.36 mencari kemunculan terakhir dari karakter ‘d’ di dalam string “Panorama danau toba telah dikenal di segala penjuru dunia”.

Gambar 11.36 Menggunakan strrchr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Gambar 11.36: gambar11_36.cpp
// Menggunakan strrchr.
#include <iostream>
#include <cstring> // prototipe strrchr
using namespace std;

int main()
{
  const char *string1 = "Panorama danau toba telah dikenal di segala penjuru dunia";
  char c = 'd';

  cout << "string1 = " << string1 << "\n" << endl;
  cout << "Sisa dari string1 yang diawali dengan\n"
    << "kemunculan terakhir karakter '"
    << c << "' adalah: \"" << strrchr( string1, c ) << '\"' << endl;
} // akhir dari main

string1 = Panorama danau toba telah dikenal di segala penjuru dunia
Sisa dari string1 yang diawali dengan
kemunculan terakhir dari karakter ‘d’ adalah: “dunia”

Fungsi strspn (Gambar 11.37, baris 15) menentukan panjang segmen awal dari string di dalam argumen pertamanya yang hanya memuat karakter-karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan panjang segmen.

Gambar 11.37 Menggunakan strrchr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Gambar 11.37: gambar11_37.cpp
// Using strspn.
#include <iostream>
#include <cstring> // prototipe strspn
using namespace std;

int main()
{
  const char *string1 = "Nilai adalah 3.14159";
  const char *string2 = "abcd efg ";

  cout << "string1 = " << string1 << "\nstring2 = " << string2
    << "\n\nPanjang segmen awal dari string1\n"
    << "yang hanya memuat karakter-karakter dari string2 = "
    << strspn( string1, string2 ) << endl;
} // akhir dari main

string1 = Nilai adalah 3.14159
string2 = abcd efg
Panjang segmen awal dari string1
yang hanya memuat karakter-karakter dari string2 = 0
Fungsi strstr mencari kemunculan pertama dari argumen string kedua di dalam argumen string pertamanya. Jika string kedua ditemukan di dalam string pertama, maka sebuah pointer yang menunjuk ke lokasi string kedua tersebut di dalam argumen string pertama dijadikan nilai balik; sebaliknya, 0 dijadikan nilai balik. Baris 15 pada Gambar 11.38 menggunakan strstr untuk mencari string “def” di dalam string “abcdefabcdef”.

Gambar 11.38 Menggunakan strstr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Gambar 11.38: gambar11_38.cpp
// Menggunakan strstr.
#include <iostream>
#include <cstring> // prototipe strstr
using namespace std;

int main()
{
  const char *string1 = "abcdefabcdef";
  const char *string2 = "def";

  cout << "string1 = " << string1 << "\nstring2 = " << string2
    << "\n\nPotongan dari string1 yang diawali dengan\n"
    << "kemunculan pertama dari string2 adalah: "
    << strstr( string1, string2 ) << endl;
} // akhir dari main

string1 = abcdefabcdef
string2 = def
Potongan dari string1 yang diawali dengan
kemunculan pertaman dari string2 adalah: defabcdef

Kesimpulan
*      Perancang C++ mengevolusi struktur menjadi kelas. Seperti kelas, struktur di dalam C++ dapat memuat penspesifikasi akses, fungsi anggota, konstruktor dan destruktor. Pada kenyataannya, satu-satunya perbedaan antara struktur dan kelas di dalam C++ adalah bahwa anggota struktur default adalah public dan anggota kelas default adalah private ketika tidak ada penspesifikasi yang digunakan  dan bahwa pewarisan default untuk struktur adalah pewarisan public sedangkan pewarisan default untuk kelas adalah private.

*      Katakunci typedef menyediakan suatu mekanisme untuk menciptakan sinonim (nama alias) untuk tipe data yang didefinisikan. Nama untuk tipe struktur seringkali didefinisikan dengan typedef untuk menciptakan nama tipe yang lebih sederhana dan pendek.

*      Operator bitwise digunakan untuk memanipulasi bit-bit dari operand-operand integral (char, short, int, dan long; untuk signed dan unsigned).
*      Operator-operator bitwise adalah AND bitwise (&), OR bitwise (|), exclusive OR (^) bitwise, geser kiri (<<), geser kanan (>>), dan komplemen bitwise ataua komplemen 1 (~). Operator AND bitwise, exclusive OR bitwise, dan OR bitwise membandingkan dua operandnya bit demi bit. Operator AND bitwise menetapkan setiap bit hasil menjadi 1 jika kedua bit operand adalah 1. Operator OR bitwise menetapkan setiap bit hasil menjadi 1 jika salah satu atau kedua bit operandnya adalah 1. Operator exclusive OR menetapkan setiap bit hasil 1 jika salah satu (tidak keduanya) bit operand adalah 1. Operator geser kiri menggeser bit-bit dari operand kiri ke kiri sejumlah bit yang dispesifikasi di dalam operand kanan. Operator geser kanan menggeser bit-bit dari operand kiri ke kanan sejumlah bit yang dispesifikasi di dalam operand kanan. Operator komplemen bitwise menetapkan semua bit 0 di dalam operandnya menjadi bit 1 di dalam bit hasil dan menetapkan semua bit 1 menjadi bit 0 di dalam bit hasil.

*      C++ menyediakan kemampuan untuk menspesifikasi jumlah bit dimana di dalamnya suatu tipe integral atau tipe enum anggota suatu kelas atau suatu struktur disimpan. Anggota semacam itu dikenal dengan bidang bit. Bidang bit memampukan utilisasi memori secara lebih baik dengan menyimpan data dalam jumlah bit minimum. Anggota bidang data harus dideklarasikan sebagai sebuah tipe integral atau suatu tipe enum.

*      Fungsi isdigit, isalpha, isalnum, dan isxdigit. Fungsi isdigit menentukan apakah argumennya sebuah dijit (0-9) atau tidak. Fungsi isalpha menentukan apakah argumennya sebuah huruf (A-Z, a-z) atau tidak. Fungs isalnum menentukan apakah argumennya sebuah huruf atau dijit (0-9, A-Z, a-z) atau tidak. Fungsi isxdigit menentukan apakah argumennya sebuah dijit heksadesimal (A-F, a-f, 0-9).

*      Fungsi islower menentukan apakah argumennya adalah huruf kecil (a-z) atau tidak. Fungsi isupper menentukan apakah argumennya huruf besar (A – Z) atau tidak. Fungsi tolower mengkonversi huruf besar menjadi huruf kecil dan menjadikan huruf kecil sebagai nilai balik. Jika argumennya tidak huruf besar, fungsi ini mengembalikan argumennya sebagai nilai balik. Fungsi toupper mengkonversi huruf kecil menjadi huruf besar dan menjadikan huruf besar sebagai nilai balik. Jika argumennya tidak huruf kecil, fungsi ini mengembalikan argumennya sebagai nilai balik.

*      Fungsi isspace, iscntrl, ispunct, isprint dan isgraph. Fungsi isspace menentukan apakah argumennya merupakan karakter spasi, seperti garis-baru (‘\n’), spasi (‘ ‘), carriage return (‘\r’), tab horisontal (‘\t’), atau tab vertikal (‘\v’). Fungsi iscntrl menentukan apakah argumennya berupa karakter kontrol, seperti garis-baru (‘\n’), form feed (‘\f’), carriage return (‘\r’), tab horisontal (‘\t’), tab vertikal (‘\v’), alert (‘\a’), atau backspace (‘\b). Fungsi ispunct menentukan apakah argumennya karakter printing selain spasi, dijit, atau huruf. Fungsi isprint menentukan apakah argumennya berupa karakter yang bisa ditampilkan pada layar (termasuk spasi). Fungsi isgraph menguji sama dengan isprint, tetapi karakter spasi di sini tidak disertakan.

*      Fungsi strcpy menyalin argumen keduanya, sebuah string, ke dalam argumen pertamanya, sebuah array karakter yang cukup besar untuk menyimpan string pada argumen kedua dan karakter nullnya (yang juga disalin). Fungsi strncpy sangat mirip dengan strcpy, kecuali bahwa strncpy menspesifikasi jumlah karakter yang akan disalin dari string ke array karakter. Fungsi strncpy tidak harus selalu menyalin karakter null dari argumen keduanya, karena karakter null hanya disalin jika jumlah karakter yang akan disalin setidaknya lebih besar satu dari panjang string.

*      Fungsi strcat menyambung argumen keduanya (sebuah string) ke argumen pertamanya (sebuah array karakter yang memuat string). Karakter pertama pada argumen kedua menggantikan karakter null (‘\0’) di dalam argumen kedua. Anda harus memastikan bahwa array yang dipakai untuk menyimpan string pertama harus cukup besar untuk menampung penggabungan atas string pertama, string kedua dan karakter null (karakter null yang disalin dari string kedua). Fungsi strncat menyambung sejumlah karakter tertentu dari string kedua ke string pertama dan menyambung sebuah karakter null kepada hasil.

*      Fungsi strtok memecah suatu string menjadi beberapa token. Token merupakan suatu runtun karakter yang dipisahkan oleh karakter-karakter pembatas (biasanya spasi atau tanda baca).

*      Fungsi strlen mengambil sebuah string sebagai argumen dan menjadikan jumlah karakter di dalam string sebagai nilai balik, dimana karakter null tidak dihitung.

*      Fungsi atof (Gambar 20.26 pada baris 9) mengkonversi argumennya, sebuah string yang merepresentasikan suatu angka pecahan, menjadi nilai double. Fungsi ini menghasilkan nilai balik double. Jika string tidak dapat dikonversi, misalnya jika karakter pertama string bukan suatu dijit, maka fungsi atof menghasilkan nol.

*      Fungsi atoi (Gambar 20.27 pada baris 9) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu integer, menjadi suatu nilai int. Fungsi ini menghasilkan nilai int sebagai nilai balik. Jika string tidak dapat dikonversi, fungsi atoi menghasilkan nol.

*      Fungsi atol (Gambar 20.28 pada baris 9) mengkonversi argumennya, sebuah string dijit yang merepresentasikan suatu long integer, menjadi suatu nilai long. Fungsi ini menghasilkan nilai long sebagai nilai balik. Jika string tidak dapat dikonversi, fungsi atol menghasilkan nol. Jika int dan long keduanya disimpan dalam empat byte, maka fungsi atoi dan atol akan memberikan hasil yang identik.

*      Fungsi strtod mengkonversi sebuah runtun karakter yang merepresentasikan suatu nilai pecahan menjadi double. Fungsi strtod menerima dua argumen, sebuah string (char *) dan alamat dari sebuah pointer char * (yaitu char **). String tersebut memuat runtuk karakter yang akan dikonversi menjadi double. Argumen kedua memampukan strtod untuk memodifikasi sebuah pointer char * di dalam fungsi pemanggil, sehingga pointer itu menunjuk ke lokasi dari karakter pertama setelah sepenggal string yang dikonversi.

*      Fungsi strchr mencari kemunculan pertama dari sebuah karakter di dalam suatu string. Jika karakter ditemukan, maka strchr memberikan nilai balik berupa suatu pointer yang menunjuk ke karakter tersebut di dalam string; sebaliknya, strchr menghasilkan suatu pointer null.

*      Fungsi strcspn menentukan panjang dari segmen awal dari string di dalam argumen pertamanya yang tidak memuat sembarang karakter dari string di dalam argumen keduanya. Fungsi ini mengembalikan panjang segmen.

*      Fungsi strpbrk mencari kemunculan pertama dari sembarang karakter di dalam argumen string keduanya di dalam argumen string pertamanya. Jika sebuah karakter dari argumen kedua ditemukan, maka fungsi strpbrk mengembalikan sebuah pointer yang menunjuk ke karakter tersebut di dalam argumen pertama; sebaliknya, sebuah pointer null yang dijadikan nilai balik.

*      Fungsi strspn menentukan panjang segmen awal dari string di dalam argumen pertamanya yang hanya memuat karakter-karakter dari string di dalam argumen keduanya. Fungsi ini menghasilkan panjang segmen.

*      Fungsi strstr mencari kemunculan pertama dari argumen string kedua di dalam argumen string pertamanya. Jika string kedua ditemukan di dalam string pertama, maka sebuah pointer yang menunjuk ke lokasi string kedua tersebut di dalam argumen string pertama dijadikan nilai balik; sebaliknya, 0 dijadikan nilai balik.

Latihan
1)      Tulislah sebuah program yang membalikkan urutan bit di dalam sebuah nilai bertipe unsigned int. Program harus memasukkan nilai dari pengguna dan memanggil fungsi balikBit untuk menampilkan bit-bit dalam urutan terbalik. Tampilkan nilai sebelum dan sesudah bit dibalikkan untuk mengkonfirmasi bahwa pembalikan bit telah dilakukan secara benar.

2)      Tulislah sebuah program yang mengentrikan suatu karakter dari papanketik dan menguji karakter tersebut menggunakan setiap fungsi di dalam pustaka karakter. Tampilkan nilai balik setiap fungsi tersebut.

3)      Tulislah sebuah program yang mengentrikan sebaris teks dengan fungsi anggota getline (pada kelas istream) ke dalam array karakter s[100]. Tampilkan sebaris teks tersebut dengan semua huruf kecil dan semua huruf besar.

4)       Tulislah sebuah program yang mengentrikan empat string yang merepresentasikan empat integer, kemudian konversilah string menjadi integer, jumlahkan nilainya dan tampilkan total keempat nilai yang didapatkan.




No comments:

Post a Comment