Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
We współczesnych językach programowania znaki są podstawowym typem danych. W pamięci komputera znak jest przechowywany w postaci liczby, którą nazywamy kodem znaku (ang. character code). Każdy znak posiada swój własny kod. Aby różne urządzenia systemu komputerowego mogły w ten sam sposób interpretować kody znaków, opracowano kilka standardów kodowania liter. Poniżej przedstawiamy wybrane dwa:
Znaki są zapamiętywane w postaci 8 bitowych kodów (pierwotnie było to 7 bitów, lecz później standard ASCII został poszerzony na 8 bitów, w których znalazły się różne znaki narodowe). Taki sposób reprezentacji znaków jest dzisiaj bardzo wygodny, ponieważ podstawowa komórka pamięci komputera IBM przechowuje właśnie 8 bitów. Dzięki temu znaki dobrze mieszczą się w pamięci.
8-bitowy kod pozwala przedstawić 256 różnych wartości i tylko tyle może być
zdefiniowane znaków w kodzie ASCII. Pierwsza połówka zbioru kodów –
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Poniższy program demonstruje niekompatybilność kodowania znaków w Windows ze znakami wyświetlanymi w oknie konsoli znakowej. |
Pascalprogram prg; begin writeln('ĄąĆćĘꣳŃńÓ󌜏źŻż'); end. |
─ä─ů─ć─ç─ś─Ö┼ü┼é┼â┼ä├ô├│┼Ü┼Ť┼╣┼║┼╗┼╝ |
#include <iostream> using namespace std; int main() { cout << "ĄąĆćĘꣳŃńÓ󌜏źŻż\n"; return 0; } |
ą╣ĂŠ╩ŕú│нˡîťĆč»┐ |
BasicPrint "ĄąĆćĘꣳŃńÓ󌜏źŻż" End |
ą╣ĂŠ╩ŕú│нˡîťĆč»┐ |
Język Python koduje litery w standardzie UTF-8, dzięki temu nie występuje tu problem niezgodności kodowania polskich znaków w konsoli i w Windows.
Python
(dodatek)print("ĄąĆćĘꣳŃńÓ󌜏źŻż") |
ĄąĆćĘꣳŃńÓ󌜏źŻż |
W języku
setlocale(LC_ALL, "");
Dzięki niej można tworzyć programy komunikujące się z użytkownikiem w języku polskim:
#include <iostream> using namespace std; int main() { setlocale (LC_ALL, ""); cout << "Zażółć żabią jaźń" << endl; return 0; } |
Zażółć żabią jaźń |
W tym artykule nie będziemy jednak korzystać z tej funkcji, ponieważ brak jej odpowiedników w innych językach programowania. Nie wpłynie to w żaden sposób na przedstawione tu algorytmy tekstowe. Problem lokalizacji nie sprowadza się jedynie do poprawnego wypisywania polskich literek ą, ć, ę… Obejmuje on również sposób zapisu waluty, dat, liczb ułamkowych, sortowania wg polskiego alfabetu, itp. Problemy te rozwiązuje system operacyjny, jednak program użytkownika musi być napisany w określony sposób. Tym się tutaj nie zajmujemy.
Unicode
Znaki są zapamiętywane w postaci kodów 16-bitowych. Dzięki temu rozwiązaniu liczba możliwych do przedstawienia znaków rośnie do 65536. Pierwsze 256 kodów jest zwykle kompatybilne z kodami ASCII. Kody powyżej 256 tworzą banki znaków, w których znajdują się wszystkie znaki narodowe, arabskie, hebrajskie, matematyczne itp.
Poniższa tabelka prezentuje nazwy typów znakowych w wybranych przez nas językach programowania:
Pascal | |
ASCII |
char |
Unicode |
widechar wchar |
|
|
ASCII |
unsigned char |
Unicode |
wchar_t |
Basic | |
ASCII |
String * 1 |
Unicode |
Wstring * 1 |
W języku Free Basic nie ma prostego typu znakowego. W tym charakterze używamy łańcucha znakowego o stałej długości 1, o czym piszemy dalej.
W języku Python znaki są kodowane w systemie UTF-8 (ang. Unicode Transformation Format – opis kodowania UTF znajdziesz w Internecie). Nie istnieje tu osobny typ znakowy jak w innych językach programowania.
Zmienna w Pythonie otrzymuje typ poprzez przypisanie i typ ten można zmieniać w programie. Technicznie robione jest to w ten sposób, iż dane są tworzone w pamięci, a w zmiennej jest umieszczany jedynie ich adres (wskaźnik, referencja). Informacja o typie danych przechowywana jest wraz z danymi. Zmienna w Pythonie jest wskaźnikiem (referencją) do danych. Przypisanie danej do zmiennej, powoduje umieszczenie jej adresu w zmiennej. Dzięki takiemu rozwiązaniu zmienne mogą wskazywać dane o różnych typach.
Poniższy program tworzy dane różnych typów, a następnie przypisuje ich adresy
zmiennej x. Typ danych wskazywanych przez
x otrzymujemy przy pomocy funkcji
Python
(dodatek)x = 10 print(x, type(x)) # Liczba całkowita x = 10.5 print(x, type(x)) # Liczba rzeczywista x = True print(x, type(x)) # Wartość logiczna x = "Liczba 10" print(x, type(x)) # Łańcuch znakowy x = ["x = ", 10, 5.1, False] print(x, type(x)) # Lista, itd. |
10 <class 'int'> 10.5 <class 'float'> True <class 'bool'> Liczba 10 <class 'str'> ['x = ', 10, 5.1, False] <class 'list'> |
W Pythonie łańcuch znakowy zawierający jeden znak jest odpowiednikiem znaku w innych językach. Ponieważ łańcuchy używają systemu kodowania UTF-8, to znak może odpowiadać różnej liczbie bajtów (od 1 do 4). Przy operacjach na łańcuchach znakowych nie ma to zwykle znaczenia.
Zmienne znakowe deklarujemy w identyczny sposób jak zmienne innych typów:
Pascal | |
Deklaracja |
… var c : char; wc : wchar; … |
|
|
Deklaracja zmiennej znakowej |
… char c; wchar_t wc; … |
Basic | |
Deklaracja zmiennej znakowej |
… Dim c As String * 1 Dim wc As Wstring * 1 … |
Tak zadeklarowana zmienna c może przechowywać jeden znak ASCII, a zmienna wc jeden znak Unicode.
W Pythonie nie ma osobnych zmiennych znakowych. Odpowiednikiem takich zmiennych są łańcuchy zawierające jeden znak. Łańcuch w Pythonie jest obiektem dynamicznym i może zawierać dowolną liczbę znaków. Znaki są kodowane w systemie UTF-8.
Python
(dodatek)a = "A" # odpowiednik zmiennej znakowej print("Znak '%s' o kodzie %d" % (a, ord(a))) a = "ś" print("Znak '%s' o kodzie %d" % (a, ord(a))) |
Znak 'A' o kodzie 65 Znak 'ś' o kodzie 347 |
Znaki o kodach od 32 do 127 odpowiadają znakom kodu ASCII:
Python
(dodatek)c = 0 for i in range(32, 128): print(chr(i), end="") c += 1 if c == 32: c = 0 print() |
!"#$%&'()*+, -./0123456789:;<=>? @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ `abcdefghijklmnopqrstuvwxyz{|}~ |
Znaki te zawierają między innymi duże i małe litery alfabetu łacińskiego oraz cyfry.
Duże litery: A…Z, kody od 65 do 90 Małe litery: a…z, kody od 97 do 122 Cyfry: 0…9, kody od 48 do 57
Zmienne znakowe mogą również być zadeklarowane jako tablice znaków.
Pascal | |
Deklaracja |
… var c : array [0..99] of char; wc : array [0..99] of wchar; … |
|
|
Deklaracja tablicy znakowej |
… char c[100]; wchar_t wc[100]; … |
Basic | |
Deklaracja tablicy znakowej |
… Dim c As String * 100 Dim wc As Wstring * 100 … |
Python (dodatek) | |
Deklaracja tablicy znakowej |
… c = "x" * 100 … |
W przypadku tablicy znakowej mamy dostęp do poszczególnych znaków za pomocą indeksu w klamerkach kwadratowych. Wyjątkiem jest język Basic, gdzie zmienna znakowa jest traktowana jako spójna całość i dostęp do poszczególnych znaków uzyskujemy poprzez polecenie Mid (przy zapisie do zmiennej) oraz funkcję Mid (przy odczycie ze zmiennej). Pierwszy znak posiada zawsze indeks równy 1.
W Pythonie odpowiednikiem tablicy znakowej jest łańcuch znaków. Dostęp do poszczególnych znaków wykonywany jest przy pomocy indeksów w klamerkach kwadratowych. Pierwszy znak ma indeks 0. Indeksy mogą również być ujemne, wtedy oznaczają znaki od końca łańcucha:
indeksy dodatnie |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
Tekst: |
A |
L |
I |
G |
A |
T |
O |
R |
indeksy ujemne |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
Python
(dodatek)a = "ALIGATOR" print("a : %s" % a) print("----------") for i in range(8): print(" a[%d] : '%s'" % (i, a[i])) print("----------") for i in range(-1, -9, -1): print("a[%d] : '%s'" % (i, a[i])) |
a : ALIGATOR ---------- a[0] : 'A' a[1] : 'L' a[2] : 'I' a[3] : 'G' a[4] : 'A' a[5] : 'T' a[6] : 'O' a[7] : 'R' ---------- a[-1] : 'R' a[-2] : 'O' a[-3] : 'T' a[-4] : 'A' a[-5] : 'G' a[-6] : 'I' a[-7] : 'L' a[-8] : 'A' |
W Pythonie łańcuch znakowy jest obiektem niezmiennym (ang. immutable). Oznacza to, iż nie możesz zmieniać znaków wewnątrz łańcucha, np. poprzez przypisanie:
a[indeks] = "nowy_znak"
Jeśli chcemy wykonać taką operację, to musimy utworzyć nową kopię łańcucha, a znak wymienić przy pomocy tzw. slicingu. Jeśli a jest łańcuchem, to
a[start:koniec]
zwraca kopię łańcucha od indeksu start do indeksu poprzedzającego
koniec
a[:koniec] zwraca kopię łańcucha od jego
początku do indeksu poprzedzającego koniec
a[start:] zwraca kopię łańcucha od
indeksu start do końca łańcucha.
Poniższy program wymienia drugi znak łańcucha "LASEK" z "A" na "I":
Python
(dodatek)s = "LASEK" # niezmienny łańcuch print(s) s = s[:1]+"I"+s[2:] # nowy łańcuch print(s) |
LASEK LISEK |
Wymiana znaku na pozycji x wykonywana jest wg schematu:
a = a[:x]+"znak"+a[x+1:]
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program tworzy trzyznakową tablicę i wpisuje do niej wyraz ALO. Następnie literki są wypisywane w kierunku odwrotnym: |
Pascalprogram prg; var s : array [0..2] of char; begin s[0] := 'A'; s[1] := 'L'; s[2] := 'O'; writeln(s[2], s[1], s[0]); end. |
#include <iostream> using namespace std; int main() { unsigned char s[3]; s[0] = 'A'; s[1] = 'L'; s[2] = 'O'; cout << s[2] << s[1] << s[0] << endl << endl; return 0; } |
BasicDim s As String * 3 Mid(s, 1) = "A" Mid(s, 2) = "L" Mid(s, 3) = "O" Print Mid(s, 3, 1); Print Mid(s, 2, 1); Print Mid(s, 1, 1) End |
Python
(dodatek)s = "ALO" print(s[2], end="") print(s[1], end="") print(s[0]) print() |
Wynik: |
OLA |
Oprócz zwykłych tablic znakowych
(ang. character tables), języki Pascal,
Pascal | |
łańcuch ASCII |
ansistring |
łańcuch Unicode |
widestring |
|
|
łańcuch ASCII |
string |
łańcuch Unicode |
wstring |
Basic | |
łańcuch ASCII |
String |
łańcuch Unicode |
Wstring Ptr |
Koniec łańcucha znakowego znaczony jest kodem 0. Znak o tym kodzie nie jest wliczany do łańcucha. Również nie powinieneś tego znaku umieszczać wewnątrz łańcucha, gdyż może to spowodować nieprawidłowe działanie wielu funkcji i procedur tekstowych.
W języku Pascal i Basic indeksy znaków w łańcuchu rozpoczynają się od 1, a w
języku
W języku Basic łańcuchy Wstring są wskaźnikami do obszaru pamięci
przechowującego właściwe znaki. Dlatego do wskaźnika musi być przypisywany adres
zarezerwowanego obszaru, w którym będą umieszczane znaki Unicode. Dostęp do danych następuje poprzez operator *, podobnie jak w języku
Liczbę znaków przechowywanych w łańcuchu tekstowym otrzymamy przy pomocy następujących funkcji:
Pascal | |
Długość łańcucha |
length(s) |
|
|
Długość łańcucha |
s.length() s.size() |
Basic | |
Długość łańcucha |
Len(s) |
Python | |
Długość łańcucha |
len(s) |
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Programy demonstrują sposoby deklarowania zmiennej łańcuchowej oraz dostępu do znaków zawartych w łańcuchu. |
Pascalprogram prg; var s : ansistring; i : integer; begin s := 'Hello there!!!'; for i := length(s) downto 1 do write(s[i]); writeln; writeln; end. |
Pascalprogram prg; var s : widestring; i : integer; begin s := 'Hello there!!!'; for i := length(s) downto 1 do write(s[i]); writeln; writeln; end. |
#include <iostream> #include <string> using namespace std; int main() { string s; s = "Hello there!!!"; for(int i = s.length()-1; i >= 0; i--) cout << s[i]; cout << endl << endl; return 0; } |
#include <iostream> #include <string> using namespace std; int main() { wstring s; s = L"Hello there!!!"; for(int i = s.length()-1; i >= 0; i--) cout << (char)s[i]; cout << endl << endl; return 0; } |
BasicDim s As String Dim i As Integer s = "Hello there!!!" For i = Len(s) To 1 Step-1 Print Mid(s, i, 1); Next Print: Print End |
BasicDim s As Wstring Ptr Dim i As Integer s = Allocate (20 * Len(Wstring)) *s = "Hello there!!!" For i = Len(*s) To 1 Step-1 Print Mid(*s, i, 1); Next Print: Print End |
Python
(dodatek)s = "Hello there!!!" for i in reversed(range(len(s))): print(s[i], end="") print() print() |
Wynik: |
!!!ereht olleH |
Przy przetwarzaniu tekstu często musimy odczytywać kody znaków zawartych w zmiennej znakowej lub zamieniać kody na odpowiadające im znaki – na przykład w celu umieszczenia ich w tekście. W każdym z wybranych przez nas języków programowania istnieją odpowiednie do tego zadania narzędzia.
Pascal | |
kodu znaku |
ord(znak) |
kod na znak |
chr(kod) |
|
|
kodu znaku |
(int)znak |
kod na znak |
(char)kod |
Basic | |
kodu znaku |
Asc(znak) |
kod na znak |
Chr(kod) |
Python | |
kodu znaku |
ord(znak) |
kod na znak |
chr(kod) |
Język
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program odczytuje z klawiatury łańcuch znaków do zmiennej łańcuchowej, a następnie wypisuje kolejne literki wraz z ich kodami ASCII. |
Pascalprogram prg; var s : ansistring; i : integer; begin readln(s); writeln; for i := 1 to length(s) do writeln(s[i], ' : ', ord(s[i]):3); writeln; end. |
#include <iostream> #include <iomanip> #include <string> using namespace std; int main() { string s; getline(cin, s); cout << endl; for(unsigned i = 0; i < s.length(); i++) cout << s[i] << ": " << setw(3) << (int)s[i] << endl; cout << endl; return 0; } |
BasicDim s As String, i As Integer Input s Print For i = 1 To Len (s) Print Using "! : ###";Mid(s, i, 1);Asc(Mid(s, i, 1)) Next Print End |
Python
(dodatek)s = input() print() for i in range(len(s)): print("%s : %3d" % (s[i], ord(s[i]))) print() |
Python
(dodatek)s = input() print() for i in s: # i-kolejne znaki w s print("%s : %3d" % (i, ord(i))) print() |
Wynik: |
Aligator Arek A : 65 l : 108 i : 105 g : 103 a : 97 t : 116 o : 111 r : 114 : 32 A : 65 r : 114 e : 101 k : 107 |
Często zdarza się, iż chcemy połączyć dwa lub więcej tekstów w jeden tekst. Operacja łączenia tekstu nosi nazwę konkatencji (ang. concatenation). W przypadku łańcuchów jest to bardzo proste:
Pascal | |
Łączymy łańcuch s1 z s2 i wynik połączenia umieszczamy w s3 |
s3 := s1+s2; |
|
|
Łączymy łańcuch s1 z s2 i wynik połączenia umieszczamy w s3 |
s3 = s1+s2; |
Basic | |
Łączymy łańcuch s1 z s2 i wynik połączenia umieszczamy w s3 |
s3 = s1+s2 |
Python | |
Łączymy łańcuch s1 z s2 i wynik połączenia umieszczamy w s3 |
s3 = s1+s2 |
Podmiana znaku w łańcuchu jest operacją prostą. Po prostu odwołujemy się do wybranego elementu w zmiennej łańcuchowej – może nią być również tablica znaków – i zapisujemy go nową zawartością:
Pascal | |
Zamiana znaku na pozycji i-tej w łańcuchu s |
s[i] := 'znak'; s[i] := char(kod); |
|
|
Zamiana znaku na pozycji i-tej w łańcuchu s |
s[i] = 'znak'; s[i] = kod |
Basic | |
Zamiana znaku na pozycji i-tej w łańcuchu s |
Mid(s, i, 1) = "znak" Mid(s, i, 1) = Chr(kod) |
Python | |
Zamiana znaku na pozycji i-tej w łańcuchu s |
s = s[:i]+"znak"+s[i+1:] s = s[:i]+chr(kod)+s[i+1:] |
Wstawienie znaku wymaga przesunięcia części znaków w zmiennej łańcuchowej, aby udostępnić miejsce na wstawiany znak. Operacja wstawiania znaku lub łańcucha znaków jest obsługiwana przez funkcje biblioteczne:
Pascal | |
Wstawiamy łańcuch s1 na pozycję i-tą w łańcuchu s2 |
insert(s1, s2, i); |
|
|
Wstawiamy łańcuch s1 na pozycję i-tą w łańcuchu s2 |
s2.insert(i, s1); |
Basic | |
Wstawiamy łańcuch s1 na pozycję i-tą w łańcuchu s2 |
s2 = Left(s2, i-1)+s1+Right(s2, Len(s2)-i+1) |
Python | |
Wstawiamy łańcuch s1 na pozycję i-tą w łańcuchu s2 |
s2 = s2[:i]+s1+s2[i:] |
Język FreeBasic nie posiada bezpośredniej funkcji wstawiania znaku lub łańcucha do innego łańcucha. Dlatego posiłkujemy się dwoma funkcjami pomocniczymi:
Left(s, i) | – zwraca i pierwszych znaków łańcucha s. Jeśli i = 0, to zwraca łańcuch pusty. |
Right(s, i) | – zwraca i ostatnich znaków łańcucha s. Jeśli i = 0, to zwraca łańcuch pusty. |
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program umieszcza w łańcuchu tekstowym zdanie "Rudy lisek", a następnie wstawia łańcuch ", szybki" po słowie "Rudy". |
Pascalprogram prg; var s : ansistring; begin s := 'Rudy lisek'; writeln(s); insert (', szybki', s, 5); writeln(s); writeln; end. |
#include <iostream> #include <string> using namespace std; int main() { string s; s = "Rudy lisek"; cout << s << endl; s.insert(4, ", szybki"); cout << s << endl << endl; return 0; } |
BasicDim s As String s = "Rudy lisek" Print s s = Left(s, 4)+", szybki"+Right(s, 6) Print s Print End |
Python
(dodatek)s = "Rudy lisek" print(s) s = s[:4]+", szybki"+s[4:] print(s) print() |
Wynik: |
Rudy lisek Rudy, szybki lisek |
Usunięcie znaku z łańcucha/tablicy polega na przesunięciu wszystkich znaków następujących za znakiem usuwanym o jedną pozycję w lewo. W ten sposób znak zostaje nadpisany znakiem sąsiadującym z prawej strony – w efekcie zniknie on z łańcucha. Dla łańcuchów znakowych mamy w każdym z wybranych języków programowania gotowe funkcje usuwania znaku lub fragmentu łańcucha.
Pascal | |
Usuwamy z łańcucha
s n znaków począwszy od pozycji i-tej |
delete(s, i, n); |
|
|
Usuwamy z łańcucha
s n znaków począwszy od pozycji i-tej |
s.erase(i, n); |
Basic | |
Usuwamy z łańcucha s n znaków począwszy od pozycji i-tej |
s = Left(s, i-1)+Right(s, Len(s)-i-n+1) |
Python | |
Usuwamy z łańcucha
s n znaków począwszy od pozycji i-tej |
s = s[:i]+s[i+n:] |
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program umieszcza w łańcuchu tekstowym zdanie "Rakieta kosmiczna", a następnie usuwa z wyrazu "kosmiczna" literkę 's'. |
Pascalprogram prg; var s : ansistring; begin s := 'Rakieta kosmiczna'; writeln(s); delete(s, 11, 1); writeln(s); writeln; end. |
#include <iostream> #include <string> using namespace std; int main() { string s; s = "Rakieta kosmiczna"; cout << s << endl; s.erase(10, 1); cout << s << endl << endl; return 0; } |
BasicDim s As String s = "Rakieta kosmiczna" Print s s = Left(s, 10)+Right(s, 6) Print s End |
Python
(dodatek)s = "Rakieta kosmiczna" print(s) s = s[:10]+s[11:] print(s) |
Wynik: |
Rakieta kosmiczna Rakieta komiczna |
Zastępując fragment łańcucha innym łańcuchem możemy wykorzystać funkcje
usuwania i wstawiania tekstu – najpierw usuwamy zastępowany fragment z łańcucha,
a następnie wstawiamy na jego miejsce nowy fragment. W języku
Pascal | |
n znaków
od pozycji i-tej w łańcuchu s2 zastępujemy łańcuchem s1 |
delete(s2, i, n); insert(s1, s2, i); |
|
|
n znaków
od pozycji i-tej w łańcuchu s2 zastępujemy łańcuchem s1 |
s2.replace(i, n, s1); |
Basic | |
n znaków
od pozycji i-tej w łańcuchu s2 zastępujemy łańcuchem s1 |
s2 = Left(s2, i-1)+s1+Right(s2, Len(s2)-i-n+1) |
Python | |
n znaków
od pozycji i-tej w łańcuchu s2 zastępujemy łańcuchem s1 |
s2 = s2[:i]+s1+s2[i+n:] |
Uwaga: Zanim uruchomisz program, przeczytaj wstęp do tego artykułu, w którym wyjaśniamy funkcje tych programów oraz sposób korzystania z nich. |
Program umieszcza w łańcuchu tekstowym zdanie "Zielone, stare drzewko", a następnie wymienia wyraz "stare" na "wysokie". |
Pascalprogram prg; var s : ansistring; begin s := 'Zielone, stare drzewko'; writeln(s); delete(s, 10, 5); insert('wysokie', s, 10); writeln(s); writeln; end. |
#include <iostream> #include <string> using namespace std; int main() { string s; s = "Zielone, stare drzewko"; cout << s << endl; s.replace(9, 5, "wysokie"); cout << s << endl << endl; return 0; } |
BasicDim s As String s = "Zielone, stare drzewko" Print s s = Left(s, 9)+"wysokie"+Right(s, 8) Print s End |
Python
(dodatek)s = "Zielone, stare drzewko" print(s) s = s[:9]+"wysokie"+s[14:] print(s) |
Wynik: |
Zielone, stare drzewko Zielone, wysokie drzewko |
Łańcuchy tekstowe możemy porównywać przy pomocy typowych operatorów porównań. Jednakże obowiązuje tutaj kilka zasad.
Dwa łańcuchy są równe, jeśli składają się z takiej samej liczby znaków oraz zgadzają się ze sobą na każdej pozycji znakowej.
Jeśli dwa łańcuchy mają różną długość, lecz krótszy łańcuch zawiera te same początkowe znaki co łańcuch dłuższy, to krótszy jest mniejszy, a dłuższy jest większy.
W dwóch łańcuchach porównywane są znaki na odpowiadających sobie pozycjach znakowych aż do napotkania niezgodności kodów. Wtedy mniejszy łańcuch jest tym, który posiada na porównywanej pozycji znak o mniejszym kodzie. Na przykład:
"ALA" > "AKACJA" – kod literki L jest większy od kodu literki K.
Taki sposób porównywania nosi nazwę leksykograficznego. Zwróć uwagę, iż w ten sposób nie można porównywać łańcuchów zawierających polskie litery – poprawny będzie jedynie test na równość łańcuchów.
W poniższej tabelce zebraliśmy często wykonywane, typowe operacje na tekstach. Z operacji tych będziemy intensywnie korzystać w przykładach programowych do omawianych algorytmów tekstowych.
Pascal | |
Odczyt wiersza znaków ze standardowego wejścia |
readlns); write('opis'); readln(s) |
Zapis łańcucha znaków na standardowe wyjście |
writeln(s); write(s); |
Sprawdzenie, czy łańcuch jest pusty |
if s = '' then … if length(s) = 0 then … |
Kopiowanie
n znaków łańcucha s1 od pozycji i-tej do łańcucha s2 |
s2 = copy(s1, i, n); |
Kopiowanie
n początkowych znaków łańcucha s1 do łańcucha s2 |
s2 = copy(s1, 1, n); |
Kopiowanie
n końcowych znaków łańcucha s1 do łańcucha s2 |
s2 = copy(s1, length(s1)-n+1, n); |
|
|
Odczyt wiersza znaków ze standardowego wejścia |
getline(cin, s); cout << "opis"; getline(cin, s) |
Zapis łańcucha znaków na standardowe wyjście |
cout << s << endl; cout << s; |
Sprawdzenie, czy łańcuch jest pusty |
if(s == "") … if(!s.length())… if(!s.size())… |
Kopiowanie n znaków łańcucha s1 od pozycji i-tej do łańcucha s2 |
s2 = s1.substr(i, n); |
Kopiowanie
n początkowych znaków łańcucha s1 do łańcucha s2 |
s2 = s1.substr(0, n); |
Kopiowanie
n końcowych znaków łańcucha s1 do łańcucha s2 |
s2 = s1.substr(s1.length()-n); |
Basic | |
Odczyt wiersza znaków ze standardowego wejścia |
Line Input s Line Input "opis";s |
Zapis łańcucha znaków na standardowe wyjście |
Print s Print s; |
Sprawdzenie, czy łańcuch jest pusty |
If s = "" Then … If Len(s) = 0 Then … |
Kopiowanie
n znaków łańcucha s1 od pozycji i-tej do łańcucha s2 |
s2 = Mid(s1, i, n) |
Kopiowanie
n początkowych znaków łańcucha s1 do łańcucha s2 |
s2 = Left(s1, n) |
Kopiowanie
n końcowych znaków łańcucha s1 do łańcucha s2 |
s2 = Right(s1, n) |
Python | |
Odczyt wiersza znaków ze standardowego wejścia |
s = input() s = input("opis") |
Zapis łańcucha znaków na standardowe wyjście |
print(s) print(s, end="") |
Sprawdzenie, czy łańcuch jest pusty |
if s == "": … if not s: … |
Kopiowanie
n znaków łańcucha s1 od pozycji i-tej do łańcucha s2 |
s2 = s1[i:i+n] |
Kopiowanie
n początkowych znaków łańcucha s1 do łańcucha s2 |
s2 = s1[:n] |
Kopiowanie
n końcowych znaków łańcucha s1 do łańcucha s2 |
s2 = s1[-n:] |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.