Przeczytaj
Łańcuch znaków
Łańcuch znaków to ciąg znaków o ustalonej wcześniej lub dowolnej długości, w którym znaki to kolejno zapisane bajtybajty w pamięci.
Przykłady łańcuchów znaków:
„Krokodyl”,
„Informatyka jest super”,
„1234453ABC”,
„#*%$ ./#”.
Tablica ASCII
Przyjrzyjmy się tabeli ASCII dla zakresu wartości od 32 do 127.
Wartość | Symbol | Wartość | Symbol | Wartość | Symbol |
---|---|---|---|---|---|
32 | Spacja | 64 | @ | 96 | ` |
33 | ! | 65 | A | 97 | a |
34 | „ | 66 | B | 98 | b |
35 | # | 67 | C | 99 | c |
36 | $ | 68 | D | 100 | d |
37 | % | 69 | E | 101 | e |
38 | & | 70 | F | 102 | f |
39 | ' | 71 | G | 103 | g |
40 | ( | 72 | H | 104 | h |
41 | ) | 73 | I | 105 | i |
42 | * | 74 | J | 106 | j |
43 | + | 75 | K | 107 | k |
44 | , | 76 | L | 108 | l |
45 | - | 77 | M | 109 | m |
46 | . | 78 | N | 110 | n |
47 | / | 79 | O | 111 | o |
48 | 0 | 80 | P | 112 | p |
49 | 1 | 81 | Q | 113 | q |
50 | 2 | 82 | R | 114 | r |
51 | 3 | 83 | S | 115 | s |
52 | 4 | 84 | T | 116 | t |
53 | 5 | 85 | U | 117 | u |
54 | 6 | 86 | V | 118 | v |
55 | 7 | 87 | W | 119 | w |
56 | 8 | 88 | X | 120 | x |
57 | 9 | 89 | Y | 121 | y |
58 | : | 90 | Z | 122 | z |
59 | ; | 91 | [ | 123 | { |
60 | < | 92 | \ | 124 | | |
61 | = | 93 | ] | 125 | } |
62 | > | 94 | ^ | 126 | ~ |
63 | ? | 95 | _ | 127 | Delete |
Wartości z zakresu 0‑31 to w większości (ale nie wszystkie) klawisze kontrolne – Esc, tabulator, Backspace itd. Natomiast zakres wartości 128‑255 obejmuje znaki charakterystyczne dla danego języka – w języku polskim są to m.in. „ł”, „ć”, „ą”, „ż”.
Przeznaczenie pierwszych 32 kodów (0‑31) ASCII znakom sterującym funkcjonuje już od czasów, gdy komputery były jedynie terminalami („odbiornikami” treści z serwera). Wówczas opisywane kody umożliwiały sterowanie urządzeniem (terminalem), np. służyły do manipulowania ekranem lub papierem w drukarce.
Kody ASCII w systemie binarnym reprezentowane są na 8 bitach, np. literze „H” odpowiadać będzie kod „0100 1000”. Analogicznie cyfry w kodzie ASCII mają konkretną reprezentację binarną, odmienną niż w przypadku rozpatrywania ich jako zmiennych liczbowych.
Cyfrę 9 możemy zaprezentować w systemie binarnym jako 1001, natomiast wartość 9 w kodzie ASCII (binarnie 0000 1001) przypisana jest tabulatorowi. Znakowi „9” odpowiada inna wartość – 57 (binarnie 0011 1001). Możemy więc zauważyć, że reprezentacje binarne cyfry 9 i kodu ASCII dla znaku „9” będą się od siebie różnić.
Rzutowanie zmiennych
Rzutowanie zmiennych znane jest także pod pojęciem konwersja typu. Jest to zmiana typu zmiennej. Czynność ta jest bardzo często wykorzystywana podczas programowania.
Załóżmy, że mamy zmienną typu znakowego.
W zmienna
przechowujemy znak 'C'
. Zastanów się, co zostanie wyświetlone, po wykonaniu następującej operacji:
funkcja
rzutujCalk()
wykonuje poprawne rzutowanie do typu liczbowego całkowitego,funkcja
wyświetl()
powoduje wyświetlenie parametruparametru.
Zostanie wyświetlona liczba 67, która jest odpowiednikiem dziesiętnym znaku 'C'
w tablicy ASCII.
Zastanów się, co zostanie wyświetlone, jeżeli wykonamy przedstawiony za pomocą pseudokodu algorytm. Poznaj definicje metod:
rzutujCalk()
wykonuje poprawne rzutowanie do typu liczbowego całkowitego,
bin()
konwertuje liczbę typu liczbowego całkowitego na liczbę zapisaną binarnie,wyświetl()
powoduje wyświetlenie parametru.
Wskazówka: tablica ASCII.
Opisane powyżej rzutowanie odnosi się do języków programowania obsługujących zmienne typu char
, np. języka C++. Podobny efekt w języku Python otrzymać można, wykorzystując funkcję ord()
. Jej działanie nie jest jednak rzutowaniem, a zwracaniem kodu ASCII dla danego symbolu.
Funkcje i operacje
Omówimy teraz typowe funkcje w językach programowania, które realizują różne rodzaje operacji na łańcuchach znaków.
Funkcja length
Funkcja length
jest jedną z najczęściej wykorzystywanych funkcji przy operacjach na łańcuchach znaków. Służy ona do określania długości ciągu znaków wyrażanej w liczbie znaków.
Funkcja length
dla łańcucha znaków „INFORMATYKA” zwróci wartość liczbową 11.
Konkatenacja
„Sklejanie” ciągów znaków. Konkatenacja powoduje łączenie ze sobą łańcuchów znaków.
Po konkatenacji łańcuchów znaków „Ala”, „ma”, „kota” powstanie łańcuch znaków „Alamakota”. Jeżeli chcielibyśmy otrzymać tekst „Ala ma kota”, wówczas należałoby dokonać konkatencji również dodatkowych dwóch znaków spacji
„ „ umieszczonych pomiędzy ciągami „Ala” i „ma” oraz „ma” i „kota”.
W przypadku języków programowania C++, Java, Python do łączenia łańcuchów znaków używa się znaku dodawania +
.
Funkcja insert
Funkcja umożliwiająca wstawianie znaków i ciągów znaków w określonym miejscu. Zazwyczaj przyjmuje dwa parametry: ciąg znaków do wstawienia oraz miejsce (indeks), w którym łańcuch znaków ma zostać wstawiony.
Funkcja erase
Funkcja usuwająca podaną część z łańcucha znaków. Występuje najczęściej w dwóch postaciach:
Przyjmuje tylko jeden parametr – jest to indeks znaku, który ma zostać usunięty z łańcucha znaków.
Przyjmuje dwa parametry, dwa indeksy, z czego pierwszy to początek wycinanego fragmentu a drugi koniec.
Funkcja replace
Funkcja replace
najczęściej występuje w poniższych postaciach:
Przyjmuje dwa parametry, którym są znaki. Funkcja zamienia wszystkie występowania znaku podanego jako pierwszy parametr na znak podany jako drugi parametr.
Przyjmuje dwa parametry, którymi są łańcuchy znaków. Pierwszy parametr to łańcuch znaków, który chcemy zamienić, a drugi to łańcuch znaków, na jaki chcemy zamienić.
Funkcja find
Służy do wyszukiwania wzorca w łańcuchu znaków. Zazwyczaj funkcja zwraca pozycję (indeks) wystąpienia wzorca w łańcuchu znaków. Innym wariantem może być funkcja find
, która jest typu logicznego i zwraca prawdę, jeżeli wzorzec wystąpił w sprawdzanym łańcuchu znaków, jeśli nie – zwraca fałsz.
Funkcja substr
Funkcja wyszukująca w ciągu znaków podciąg o podanej długości znajdujący się w ustalonej lokalizacji, a następnie go zwracająca. Jako parametry opisywana funkcja przyjmuje ciąg znaków, pozycję znaku w ciągu, od której zaczyna się podciąg oraz liczbę znaków zawartych w podciągu.
Wyszukiwanie podciągu w słowie „NAUKA”:
Jako wynik działania funkcji otrzymamy podciąg „AUK”.
Funkcja transform
Aby zamienić w ciągu znaków wszystkie małe liter na wielkie, potrzebujemy w pierwszej kolejności funkcję zmieniającą wielkość wybranego znaku. Przyjmijmy, że za ten element odpowiedzialna jest funkcja zamiana
. Działa ona w następujący sposób:
Dokonaj rzutowania litery do typu liczbowego całkowitego.
Jeżeli uzyskana liczba całkowita jest mniejsza niż 123, ale większa niż 96 (kody ASCII od 97 do 122 przeznaczone są na małe litery) odejmij od zmiennej 32 (stała różnica w tabeli ASCII pomiędzy kodami tej samej litery w wariancie wielkim i małym).
Dokonaj rzutowania zmiennej do typu znakowego.
W rezultacie otrzymujemy wielką literę.
Wiemy już, jak zmienić pojedynczy znak, jednak chcemy przeprowadzić tę operację na całym ciągu. Wykorzystamy do tego funkcję transform
. Pozwala ona na wykonanie pożądanej operacji na zbiorze, a następnie zwrócenie rezultatów do wybranego zbioru (tego samego bądź innego).
Możemy już wykorzystać obie funkcje do wykonania zadania. Dodatkowo, aby wskazać początek i koniec zbioru, wykorzystamy odpowiednio funkcje początek
i koniec
. Załóżmy, że zamieniamy wielkości liter w słowie „Litera” znajdującym się w zmiennej słowo
.
W wyniku powyższej operacji zmienna słowo
będzie zawierała ciąg znaków „LITERA”.
Apostrofy i cudzysłowy
W niektórych językach programowania, np. C++ i Java, istnieje pewna zależność dotycząca używania apostrofów i cudzysłowów.
Znaku pojedynczego apostrofu używa się przy deklaracji, przypisaniu pojedynczego znaku. W poniższym przykładzie zmienna litera
jest zmienną znakową (char
) i zostaje jej przypisana wartość (pojedynczy znak) przy użyciu właśnie pojedynczych apostrofów.
Moglibyśmy także nadać wartość zmiennej litera
(przypisać znak „C”) w inny sposób, np. podać wartość dziesiętną tej litery. Tutaj pomocna okazuje się wcześniej omówiona tablica ASCII. Następujące linie kodu są bliźniacze:
W przypadku deklarowania oraz przypisywania łańcuchów znaków używane są do tego cudzysłowy. W przytoczonym przykładzie zmienna zdanie
jest łańcuchem znaków (string
), któremu zostaje przypisany ciąg znaków „ALA MA KOTA”.
W wypadku używania cudzysłowów wszystko jest rozpatrywane jako tekst. W związku z tym zaprezentowana linia kodu nie spowoduje, że w zmiennej zdanie będzie zapisana litera „C”, tylko tekst, łańcuch znaków „67”.
Warto dodać, że w języku Python rozróżnienie pomiędzy cudzysłowem i apostrofem nie istnieje, ponieważ znak i ciąg znaków są tego samego typu.
Funkcje pobierające słowa od użytkownika
W wielu językach programowania wyróżniamy dwie główne metody pobierania łańcuchów znaków od użytkownika:
metoda pobierająca pojedyncze słowo, łańcuch znaków (pobiera do pierwszej spacji, odstępu) od użytkownika i zapisujące je do zmiennej,
metoda pobierająca wiele łańcuchów, a także odstępów (pobiera do znaku nowej linii).
Słownik
wykorzystywana w dziedzinie informatyki jednostka pamięci złożona z 8 bitów
zmienna, która jest zdefiniowana przy deklaracji metody lub funkcji