Professional Documents
Culture Documents
BAB II
STRUKTUR DATA STRING
2.1
Pendahuluan
Struktur data string sebenarnya adalah struktur data array linier yang
2.2
Sistem Pengkodean
Untuk merepresentasikan himpunan karakter yang digunakan oleh manusia,
ada beberapa sistem pengkodean yang digunakan oleh komputer yaitu ASCII,
EBCDIC dan yang terbaru, Unicode.
2.2.1
ASCII
-------------------------------------------Desimal
Oktal
Hex Biner
Karakter
-------------------------------------------000
000
00
00000000
NUL
(Null char.)
001
001
01
00000001
SOH
(Start of Header)
002
002
02
00000010
STX
(Start of Text)
003
003
03
00000011
ETX
(End of Text)
004
004
04
00000100
EOT
(End of Transmission)
005
005
05
00000101
ENQ
(Enquiry)
006
006
06
00000110
ACK
(Acknowledgment)
007
007
07
00000111
BEL
(Bell)
008
010
08
00001000
BS
(Backspace)
009
011
09
00001001
HT
(Horizontal Tab)
010
012
0A
00001010
LF
(Line Feed)
011
013
0B
00001011
VT
(Vertical Tab)
012
014
0C
00001100
FF
(Form Feed)
013
015
0D
00001101
CR
(Carriage Return)
014
016
0E
00001110
SO
(Shift Out)
015
017
0F
00001111
SI
(Shift In)
016
020
10
00010000
DLE
(Data Link Escape)
017
021
11
00010001
DC1
(XON)(Device Control 1)
018
022
12
00010010
DC2
(Device Control 2)
019
023
13
00010011
DC3
(XOFF)(Device Control 3)
020
024
14
00010100
DC4
(Device Control 4)
021
025
15
00010101
NAK
(Negative Acknowledgement)
022
026
16
00010110
SYN
(Synchronous Idle)
023
027
17
00010111
ETB
(End of Trans. Block)
024
030
18
00011000
CAN
(Cancel)
025
031
19
00011001
EM
(End of Medium)
026
032
1A
00011010
SUB
(Substitute)
027
033
1B
00011011
ESC
(Escape)
028
034
1C
00011100
FS
(File Separator)
029
035
1D
00011101
GS
(Group Separator)
030
036
1E
00011110
RS
(Request to Send)
(Record Separator)
031
037
1F
00011111
US
(Unit Separator)
032
040
20
00100000
SP
(Space)
033
041
21
00100001
!
(exclamation mark)
034
042
22
00100010
"
(double quote)
035
043
23
00100011
#
(number sign)
036
044
24
00100100
$
(dollar sign)
037
045
25
00100101
%
(percent)
038
046
26
00100110
&
(ampersand)
--------------------------------------------Tabel 2.1 (lanjutan)
-------------------------------------------
Desimal
Oktal
Hex Biner
Karakter
------------------------------------------039
047
27
00100111
'
(single quote)
040
050
28
00101000
(
(left opening parenthesis)
041
051
29
00101001
)
(right closing parenthesis)
042
052
2A
00101010
*
(asterisk)
043
053
2B
00101011
+
(plus)
044
054
2C
00101100
,
(comma)
045
055
2D
00101101
(minus or dash)
046
056
2E
00101110
.
(dot)
047
057
2F
00101111
/
(forward slash)
048
060
30
00110000
0
049
061
31
00110001
1
050
062
32
00110010
2
051
063
33
00110011
3
052
064
34
00110100
4
053
065
35
00110101
5
054
066
36
00110110
6
055
067
37
00110111
7
056
070
38
00111000
8
057
071
39
00111001
9
058
072
3A
00111010
:
(colon)
059
073
3B
00111011
;
(semi-colon)
060
074
3C
00111100
<
(less than sign)
061
075
3D
00111101
=
(equal sign)
062
076
3E
00111110
>
(greater than sign)
063
077
3F
00111111
?
(question mark)
064
100
40
01000000
@
(AT symbol)
065
101
41
01000001
A
066
102
42
01000010
B
067
103
43
01000011
C
068
104
44
01000100
D
069
105
45
01000101
E
070
106
46
01000110
F
071
107
47
01000111
G
072
110
48
01001000
H
073
111
49
01001001
I
074
112
4A
01001010
J
075
113
4B
01001011
K
076
114
4C
01001100
L
077
115
4D
01001101
M
078
116
4E
01001110
N
079
117
4F
01001111
O
080
120
50
01010000
P
081
121
51
01010001
Q
082
122
52
01010010
R
083
123
53
01010011
S
084
124
54
01010100
T
085
125
55
01010101
U
086
126
56
01010110
V
087
127
57
01010111
W
088
130
58
01011000
X
089
131
59
01011001
Y
090
132
5A
01011010
Z
091
133
5B
01011011
[
(left opening bracket)
092
134
5C
01011100
\
(back slash)
093
135
5D
01011101
]
(right closing bracket)
094
136
5E
01011110
^
(caret cirumflex)
095
137
5F
01011111
_
(underscore)
096
140
60
01100000
`
097
141
61
01100001
a
098
142
62
01100010
b
099
143
63
01100011
c
100
144
64
01100100
d
101
145
65
01100101
e
102
146
66
01100110
f
103
147
67
01100111
g
104
150
68
01101000
h
105
151
69
01101001
i
106
152
6A
01101010
j
107
153
6B
01101011
k
108
154
6C
01101100
l
--------------------------------------------Tabel 2.1 (lanjutan)
-------------------------------------------
Desimal
Oktal
Hex Biner
Karakter
------------------------------------------109
155
6D
01101101
m
110
156
6E
01101110
n
111
157
6F
01101111
o
112
160
70
01110000
p
113
161
71
01110001
q
114
162
72
01110010
r
115
163
73
01110011
s
116
164
74
01110100
t
117
165
75
01110101
u
118
166
76
01110110
v
119
167
77
01110111
w
120
170
78
01111000
x
121
171
79
01111001
y
122
172
7A
01111010
z
123
173
7B
01111011
{
124
174
7C
01111100
|
125
175
7D
01111101
}
126
176
7E
01111110
~
127
177
7F
01111111
DEL
-----------------------------------------
2.2.2
EBCDIC
Kode EBCDIC
-------------------------------------------------------------------------------Dec
Hex
Code
Dec
Hex
Code
Dec
Hex
Code
Dec
Hex
Code
-------------------------------------------------------------------------------0
00
NUL
32
20
BS
64
40
space
96
60
1
01
SOH
33
21
SOS
65
41
97
61
/
2
02
STX
34
22
FS
66
42
98
62
3
03
ETX
35
23
67
43
99
63
4
04
PF
36
24
BYP
68
44
100
64
5
05
HT
37
25
LF
69
45
101
65
6
06
LC
38
26
ETB
70
46
102
66
7
07
DEL
39
27
ESC
71
47
103
67
8
08
GE
40
28
72
48
104
68
9
09
RLF
41
29
73
49
105
69
10
0A
SMM
42
2A
SM
74
4A
106
6A
|
11
0B
VT
43
2B
CU2
75
4B
.
107
6B
,
12
0C
FF
44
2C
76
4C
<
108
6C
%
13
0D
CR
45
2D
ENQ
77
4D
(
109
6D
_
14
0E
SO
46
2E
ACK
78
4E
+
110
6E
>
15
0F
SI
47
2F
BEL
79
4F
|
111
6F
?
16
10
DLE
48
30
80
50
&
112
70
17
11
DC1
49
31
81
51
113
71
18
12
DC2
50
32
SYN
82
52
114
72
19
13
TM
51
33
83
53
115
73
20
14
RES
52
34
PN
84
54
116
74
21
15
NL
53
35
RS
85
55
117
75
22
16
BS
54
36
UC
86
56
118
76
23
17
IL
55
37
EOT
87
57
119
77
24
18
CAN
56
38
88
58
120
78
25
19
EM
57
39
89
59
121
79
26
1A
CC
58
3A
90
5A
!
122
7A
:
27
1B
CU1
59
3B
CUB
91
5B
$
123
7B
#
28
1C
IFS
60
3C
DC4
92
5C
*
124
7C
@
29
1D
IGS
61
3D
NAK
93
5D
)
125
7D
30
1E
IRS
62
3E
94
5E
;
126
7E
=
31
1F
IUS
63
3F
SUB
95
5F
^
127
7F
"
--------------------------------------------------------------------------------
Tabel 2.2
(lanjutan)
-------------------------------------------------------------------------------Dec
Hex
Code
Dec
Hex
Code
Dec
Hex
Code
Dec
Hex
Code
-------------------------------------------------------------------------------128
80
160
A0
192
C0
{
224
E0
\
129
81
a
161
A1
~
193
C1
A
225
E1
130
82
b
162
A2
s
194
C2
B
226
E2
S
131
83
c
163
A3
t
195
C3
C
227
E3
T
132
84
d
164
A4
u
196
C4
D
228
E4
U
133
85
e
165
A5
v
197
C5
E
229
E5
V
134
86
f
166
A6
w
198
C6
F
230
E6
W
135
87
g
167
A7
x
199
C7
G
231
E7
X
136
88
h
168
A8
y
200
C8
H
232
E8
Y
137
89
i
169
A9
z
201
C9
I
233
E9
Z
138
8A
170
AA
202
CA
234
EA
139
8B
171
AB
203
CB
235
EB
140
8C
172
AC
204
CC
236
EC
141
8D
173
AD
205
CD
237
ED
142
8E
174
AE
206
CE
238
EE
143
8F
175
AF
207
CF
239
EF
144
90
176
B0
208
D0
}
240
F0
0
145
91
j
177
B1
209
D1
J
241
F1
1
146
92
k
178
B2
210
D2
K
242
F2
2
147
93
l
179
B3
211
D3
L
243
F3
3
148
94
m
180
B4
212
D4
M
244
F4
4
149
95
n
181
B5
213
D5
N
245
F5
5
150
96
o
182
B6
214
D6
O
246
F6
6
151
97
p
183
B7
215
D7
P
247
F7
7
152
98
q
184
B8
216
D8
Q
248
F8
8
153
99
r
185
B9
217
D9
R
249
F9
9
154
9A
186
BA
218
DA
250
FA
155
9B
187
BB
219
DB
251
FB
156
9C
188
BC
220
DC
252
FC
157
9D
189
BD
221
DD
253
FD
158
9E
190
BE
222
DE
254
FE
159
9F
191
BF
223
DF
255
FF
--------------------------------------------------------------------------------
Pada tahun 1964 EBCDIC mulai digunakan oleh komputer IBM mainframe seri
IBM/360 lalu seri IBM/370. Selain IBM perusahaan komputer lain seperti Hawlett
Packard dan Fujitsu juga menggunakan EBCDIC untuk komputer mainframe-nya.
Sekarang EBCDIC tidak banyak digunakan lagi karena representasi karakternya tidak
berurutan dan ada beberapa tanda baca yang tidak direpresentasikan dalam EBCDIC.
2.2.3
Unicode
Unicode adalah sistem pengkodean yang paling baru dan mulai banyak
digunakan seiring dengan makin murahnya harga memori komputer. Mungkin tidak
lama lagi Unicode akan menggantikan ASCII sebagai bahasa internasional
komputer. Unicode terdiri dari 16 bit (2 byte) sehingga dapat merepresentasikan
hampir semua bahasa di dunia seperti bahasa Arab, Jepang, Thai, Yunani dan lain-lain.
Banyaknya karakter yang dapat direpresentasikan oleh Unicode adalah 65.536 (2 16)
karakter. Sekarang ini aplikasi pengolah kata sudah menggunakan Unicode tetapi
tidak dibakukan seperti ASCII sehingga suatu teks yang ditulis dengan menggunakan
suatu aplikasi belum tentu dapat dibaca dengan sempurna oleh aplikasi lain.
2.2.4
2.2.5
Collating sequence
Collating sequence adalah posisi atau urutan karakter dalam himpunan
Pernyataan:
b.
Pernyataan:
2.3
deretan karakter yang ditulis di antara tanda petik. Contohnya adalah sebagai berikut:
a. Siapa nama anda?.
b. Fakultas Teknologi Informasi
c. Kode pos: 11440
d. Jakarta
Konstanta string dalam program C++ disimpan dalam memori yang berurutan
dan diakhiri dengan karakter null (\0) seperti gambar 2.1 berikut.
J
a \0
2.3.1
Closure
b.
2.3.2
Asosiatif
2.3.3
Identitas
abc = abc
b.
teknologi O = teknologi
2.3.4
Operasi penugasan
2.3.5
Operasi logika
Sama seperti sistem bilangan, string juga mengenal operasi logika yang hasilnya
adalah konstanta logika TRUE atau FALSE. Operator yang digunakan adalah operator
relasional ==, !=, >, >=, <, dan <=. Operasi ini biasanya digunakan untuk
mengurutkan data string seperti kamus, daftar nama pelanggan dan sebagainya.
Uji kesamaan untuk sistem string menggunakan operator == dan didefinisikan
sebagai berikut:
Bab II Struktur Data String : 23
Jika x dan y adalah variabel string dengan x = x1...xn dan y = y1...ym maka
x == y jika jika dan hanya jika:
1. Banyaknya karakter pada x dan y sama atau n == m
2. xi == yi untuk setiap 1<= i <= n
Sebagai contoh pernyataan:
a.
abc == abc
true
b.
abc == abc
c.
dan !=. Hasil dari uji ketidaksamaan ini tergantung pada posisi karakter dalam
collating sequence-nya. Untuk sistem pengkodean ASCII collating sequence-nya
dapat dilihat pada tabel 2.1.
Sebagai contoh pernyataan:
a.
true
b.
true
c.
true
2.4
Operasi String
Beberapa operasi yang didefinisikan untuk struktur data string adalah:
a.
mendeklarasikan string
b.
c.
d.
e.
2.4.1
Mendeklarasikan string
char NAMA[10] NAMA adalah variabel string yang dapat menyimpan paling
banyak 9 karakter. Tempat yang terakhir digunakan untuk
menyimpan karakter \0 yang menunjukkan akhir dari string.
Ilustrasi pada gambar 2.2 di bawah ini menunjukkan variabel
NAMA berisi string ADIANTO. Tanda ? setelah karakter
\0 menunjukkan bahwa pada indeks tersebut tidak digunakan
untuk menyimpan data karena string telah berakhir di indeks 7.
NAMA: A
[0] [1] [2] [3] [4] [5] [6] [7] [8] [9]
indeks array
2.4.2
S = STRLEN(ComputerScience)
S = 16
b.
T = 2 + 3 + STRLEN(ComputerScience)
T = 21
2.4.3
Menggabung string
X = MickeyMouse
b.
2.4.4
Operasi untuk menyalin sebagian string akan menghasilkan string baru yang
isinya adalah sebagian karakter dari string yang sudah ada. Operasi ini menggunakan
built in function SUB(a1, a2, a3) dengan
a1 : string yang sudah ada
a2 : posisi tempat mulainya pengambilan
a3 : banyaknya karakter yang diambil
Sebagai contoh lihat ekspresi berikut ini. S dan T adalah variabel string.
S = ton
a.
S = SUB(EdmontonAlberta, 6, 3)
b.
T = SUB(Edmonton, 3, 4) SUB(PortCredit, 6, 2)
SUB(Calgary, 2, 2)
T = mont O re O al
T = montreal
2.4.5
Operasi untuk mencari suatu string (atau disebut pola) dalam string yang lain
disebut sebagai pattern matching. Operasi ini dilakukan dengan built in function
MATCH(S,P), dan menghasilkan bilangan integer yang menunjukkan posisi awal
dari string P dalam string S atau angka 0 jika string P tidak ada dalam string S. String
P adalah pola yang dicari (pattern string) dan string S adalah string tempat pencarian
(subject string) dilakukan. Setelah string P ditemukan, maka pencarian selesai.
Sebagai contoh lihat ekspresi berikut ini. A dan B adalah veriabel integer.
Bab II Struktur Data String : 26
a.
pola (karakter)
b.
B = MATCH(XYXYZYZXYZ, XYZ)
2.5
karakter.
Meskipun
demikian,
bahasa
pemrograman
C++
sudah
b.
c.
d.
e.
strstr(str1, str2): menghasilkan posisi str2 dalam str1, atau angka nol jika str2
tidak ada dalam str1.
2.6
2.6.1
Memisahkan
nama
menjadi
nama
depan
dan
nama keluarga
Bab II Struktur Data String : 27
Program ini menerima input berupa nama yang terdiri dari 2 kata yang dipisah
dengan spasi, lalu program akan memisahkan nama tersebut menjadi nama depan dan
nama keluarga. Sebagai contoh, nama yang diinput adalah Joko Widodo maka
outputnya adalah:
Nama depan anda adalah Joko
Nama keluarga anda adalah Widodo
Karakter spasi digunakan sebagai tanda pemisah antara kata pertama dan kata kedua.
Algoritma PisahNama
Algoritma untuk mememisahkan nama yang terdiri dari 2 buah kata
menjadi nama depan dan nama keluarga. NAMA adalah variabel
string untuk menyimpan input. ND adalah variabel string yang
menyimpan nama depan (kata pertama). NK adalah variabel string
yang menyimpan nama keluarga (kata kedua). Diasumsikan
panjang nama tidak lebih dari 40 karakter, serta panjang nama
depan dan nama keluarga masing-masing tidak lebih dari 20
karakter.
[deklarasi variabel string]
char NAMA[41]
char ND[21]
char NK[21]
1. [menuliskan pesan]
Write (Ketikkan nama depan dan nama keluarga anda)
Write (pisahkan dengan spasi)
2. [membaca input]
Read (NAMA)
3. [inisialisasi variabel]
i=0
4. [mencari lokasi karakter spasi untuk mendapatkan nama
depan]
While (NAMA[i] != )
{ ND[i] = NAMA[i]
i++
}
5. [menambahkan karakter null]
ND[i+1] = \0
6. [inisialisasi variabel, mulai dari kata yang kedua]
i = i+1
j=0
7. [mencari lokasi karakter null]
While (NAMA[i] != \0)
{ NK[j] = NAMA[i]
i++
j++
}
8. [menambahkan karakter null]
NK[J+1] = \0
[mencetak hasil]
Write (Nama depan anda adalah , ND)
Write (Nama keluarga anda adalah , NK)
10. [selesai]
halt
9.
2.6.2
Menghitung
frekuensi
suatu
huruf
dalam
string
Frekuensi yang dimaksud disini adalah persentasi banyaknya suatu huruf dalam
suatu string. Sebagai contoh, diketahui string S = ada apa?, maka frekuensi dari
huruf a dalam string S adalah banyaknya huruf a yang ada dalam string S dibagi
dengan total banyaknya huruf dalam string S, atau 4/6 x 100% = 66.67%. Dan
frekuensi dari huruf d dan p masing-masing adalah 1/6 x 100% = 16.67%. Untuk
menyimpan frekuensi digunakan array linier yang indeksnya menunjukkan posisi
suatu huruf dalam himpunan alfabet. Sebagai contoh, pada indeks 3 disimpan
frekuensi dari huruf c karena dalam alfabet, huruf c berada pada posisi ke 3.
Algoritma LETTER_FREQUENCY
Algoritma untuk menghitung frekuensi suatu huruf dalam suatu
string. ALFABET adalah variabel string yang berisi daftar seluruh
huruf. TEXT adalah variabel string yang berisi string yang akan
diperiksa. FREKUENSI[1..26] adalah array linier yang menyimpan
persentasi banyaknya suatu karakter dalam string input; berjenis
real. Variabel TOTAL_HURUF untuk menyimpan banyaknya huruf
dalam variabel TEXT. Algoritma ini menggunakan built in function
STRLEN(s), SUB(a1,a2,a3) dan MATCH(s,p).
1. [inisialisasi variabel string ]
ALFABET = ABCDEFGHIJKLMNOPQRSTUVWXYZ
2. [masukkan string yang akan diperiksa]
Read (TEXT)
3. [inisialisasi variabel]
TOTAL_HURUF = 0
4. [menghitung panjang string input]
PANJANG_TEXT = STRLEN(TEXT)
5. [inisialisasi array FREKUENSI dengan 0]
For ( K = 1 ; K <= 26 ; K++)
{
FREKUENSI[K] = 0
}
6. [loop untuk memeriksa string input huruf per huruf]
For ( K = 1 ; K <= PANJANG_TEXT ; K++ )
{
6.a
[mengambil 1 huruf dari string input]
HURUF = SUB(TEXT, K, 1)
6.b
6.c
8.
9.
2.6.3
}
[loop untuk menampilkan isi array FREKUENSI]
For ( K = 1 ; K = 26 ; K++ )
{ [menghitung persentasi]
FREKUENSI[K] = FREKUENSI[K]/TOTAL_HURUF*100
Write(Frekuensi dari huruf ke , K, adalah
FREKUENSI[K])
}
Halt
Mengubah
nama
lengkap
menjadi
nama
Poe,EA
+
+
+
+
2.a. Buat fungsi DUPLIKAT(s,n) untuk mengulang string s sebanyak n kali. Sebagai
contoh: DUPLIKAT(ha, 3) akan menghasilkan : hahaha. Buat pula
algoritma utamanya.
2.b. Buat pula programnya dalam bahasa C++
3.a. Buat fungsi HAPUS(a, b) untuk menghapus setiap karakter yang ada dalam
string a dari string b. Sebagai contoh, string a berisi xz dan string b berisi
Txhzexzexxzznxzdx maka hasilnya string b berisi The end. Buat pula
algoritma utamanya.
3.b. Buat pula programnya dalam bahasa C++.
4.a. Buat fungsi HAPUS untuk menghilangkan semua spasi dari string input
sehingga hasilnya adalah string yang tanpa spasi. Buat pula algoritma utamanya.
4.b. Buat pula programnya dalam bahasa C++.
5.a. Buat fungsi TENGAH untuk mencetak string input di tengah halaman jika
diketahui lebar halaman adalah 120 karakter. Panjang string input < 120
karakter. Buat pula algoritma utamanya.
5.b. Buat pula programnya dalam bahasa C++.
6.a. Buat fungsi TRIM untuk menghapus semua karakter selain huruf alfabet (a..z)
dari string input. Hasilnya adalah string yang hanya terdiri dari huruf alfabet.
Buat pula algoritma utamanya.
6.b. Buat pula programnya dalam bahasa C++.
7.a. Buat fungsi untuk menghitung banyaknya kata dalam sebuah string.
Diasumsikan setiap kata dipisahkan oleh satu atau lebih spasi.
7.b. Buat fungsi untuk menghitung banyaknya huruf dalam sebuah kata.
7.c. Dengan menggunakan fungsi pada 7.a dan 7.b buatlah fungsi untuk menghitung
rata-rata banyaknya huruf dari kata-kata yang ada dalam sebuah string. Buat
pula algoritma utamanya.
7.d. Buat pula programnya dalam bahasa C++.
8.a. Buat fungsi untuk menghitung banyaknya huruf hidup (vokal) dalam sebuah
string.
8.b. Buat fungsi untuk menghitung banyaknya huruf mati (konsonan) dalam sebuah
string.
8.c. Dengan menggunakan fungsi pada 8.a dan 8.b buatlah fungsi untuk menghitung
banyaknya karakter selain huruf yang ada dalam sebuah string. Buat pula
algoritma utamanya.
8.d. Buat pula programnya dalam bahasa C++.
9.a. Buat fungsi REVERSE (iteratif dan rekursif) untuk menerima string input dan
menghasilkan string output yang isinya adalah kebalikan urutan karakter dalam
string input. Sebagai contoh string input = abcd, maka string output = dcba.
Buat pula algoritma utamanya.
9.b. Buat pula programnya dalam bahasa C++.
10.a. Palindrome adalah string yang dapat dibaca dari depan maupun dari belakang.
Contohnya adalah malam, kodok dan lain-lain. Buatlah fungsi (rekursif dan
iteratif) untuk menentukan apakah sebuah string input termasuk palindron atau
bukan. Diasumsikan string input berupa huruf kecil semua. Buat pula algoritma
utamanya.
10.b. Buat pula programnya dalam bahasa C++.
11.
Perbaiki algoritma Pisah Nama di depan sehingga dapat menerima input nama
yang lebih dari dua kata, memisahkannya menjadi nama depan (1 kata), nama
tengah (kosong, 1 kata atau lebih dari 1 kata) dan nama keluarga (1 kata).