Tablice znakowe służą do przechowywania ciągów znaków, czyli tekstów, w formie sekwencji pojedynczych znaków. W języku C++ można je zdefiniować jako zwykłe tablice typu char. Ważne jest, aby pamiętać, że tablica znakowa powinna mieć o jedną komórkę więcej, niż wynika z liczby znaków tekstu, ponieważ każdy ciąg znaków musi być zakończony specjalnym znakiem '\0' (null character), który sygnalizuje koniec ciągu. Dzięki temu program wie, kiedy zakończyć odczytywanie tekstu.
Tablice znakowe można zadeklarować i zainicjalizować na dwa główne sposoby:
Deklaracja bezpośrednia z określeniem rozmiaru i wartości:
char tekst[12] = "Ala ma kota";
W tym przypadku ciąg znaków 'Ala ma kota' zajmuje dokładnie 11 miejsc, ale musimy zarezerwować 12 komórek, aby pomieścić dodatkowy znak '\0', który kończy ciąg. Bez tego znaku program mógłby przypadkowo kontynuować odczytywanie pamięci poza obszarem tablicy, co prowadzi do nieoczekiwanych wyników.
Deklaracja bezpośrednia bez podania rozmiaru:
char tekst[] = "Ala ma kota";
Tutaj kompilator automatycznie obliczy potrzebny rozmiar tablicy (w tym dodatkowe miejsce na '\0'), dzięki czemu nie musimy ręcznie określać liczby elementów.
Każdy znak w tablicy jest dostępny poprzez indeksy. Indeksy zaczynają się od zera i pozwalają na bezpośredni dostęp do poszczególnych znaków ciągu.
cout << tekst[0]; // Wyświetli: 'A'
cout << tekst[3]; // Wyświetli: ' '
cout << tekst[11]; // Wyświetli: '\0' (znak końca)
Przykładowy schemat przechowywania tekstu
Dla ciągu znaków 'Ala ma kota', tablica o rozmiarze 12 będzie wyglądać następująco:
Indeks | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Wartość | 'A' | 'l' | 'a' | ' ' | 'm' | 'a' | ' ' | 'k' | 'o' | 't' | 'a' | '\0' |
Do wczytywania ciągów znaków w tablicy char można użyć funkcji cin. Jednak cin wczytuje tylko tekst do pierwszego napotkanego znaku białego, takiego jak spacja. Aby wczytać cały wiersz tekstu (w tym spacje), można użyć funkcji cin.getline.
char tekst[50];
cout << "Podaj tekst (max 49 znaków): ";
cin.getline(tekst, 50);
cout << "Wprowadzono tekst: " << tekst << endl;
Aby wczytać pełną linię tekstu (w tym spacje) w języku C++, można posłużyć się funkcją getline
, dostępną w bibliotece string
. W przeciwieństwie do cin, które zatrzymuje się po napotkaniu pierwszego znaku białego (np. spacji), getline
umożliwia wczytanie całego wiersza tekstu, aż do naciśnięcia klawisza Enter.
Przykład użycia getline:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
cout << "Podaj pełny tekst: ";
getline(cin, text);
cout << "Wprowadzono tekst: " << text << endl;
return 0;
}
Opis działania:
Funkcja getline(cin, text);
pobiera pełen wiersz tekstu od użytkownika, w tym wszystkie spacje, i zapisuje go w zmiennej typu string
.
Zmienna text przechowuje cały wprowadzony tekst, a wynik jest wyświetlany w całości.
Konkatenacja w programowaniu oznacza łączenie dwóch wyrażeń, tworząc z nich jedno. Najczęściej odnosi się to do łączenia dwóch lub więcej ciągów znaków, ale można również połączyć ciąg znaków z liczbą. W C++ konkatenację ciągów znaków można wykonać przy pomocy operatora +.
Przykład:
string s1 = "C";
char cn[] = "string";
string s = s1 + '-' + cn;
cout << s << endl; // Wyświetli: "C-string"
W powyższym kodzie:
Operator + jest używany do połączenia zmiennej s1, znaku '-' oraz tablicy znakowej cn. Efektem jest ciąg ''C-string'', zapisany w zmiennej s.
Konkatenacja działa zarówno dla zmiennych typu string, jak i tablic znakowych (char[]), które mogą być przekształcone na obiekt string przy użyciu operatora +.
Dodatkowe operacje związane z długością ciągu:
#include <iostream>
#include <cstring> // dla strlen
using namespace std;
int main() {
char tekst[] = "Ala ma kota";
string s1 = "C";
char cn[] = "string";
cout << "Obliczona dlugosc ciagu: " << strlen(tekst) << endl; // Wyswietli: 11
cout << "Dlugosc stringu: " << s1.length() << endl; // Wyswietli: 1
cout << "Dlugosc tablicy: " << sizeof(cn) << endl; // Wyswietli: 7 (w tym znak '\0')
return 0;
}
Tutaj:
strlen(tekst) oblicza długość ciągu znaków tekst, która wynosi 11.
s1.length() zwraca długość ciągu s1 bez końcowego znaku '\0'.
sizeof(cn) zwraca rozmiar tablicy cn, który obejmuje wszystkie znaki, w tym końcowy znak '\0'.
W C++ zmienną typu string można traktować jak tablicę znaków, co umożliwia modyfikowanie poszczególnych znaków, odwołując się do ich indeksów. Dzięki temu można łatwo podmienić wybrane znaki w ciągu, tak jak w zwykłej tablicy.
Przykład:
string s = "Basia";
s[0] = 'K'; // Zamienia pierwszy znak 'B' na 'K'
for (int i = 0; i < 5; i++) {
cout << s[i];
}
Działanie powyższego kodu:
Zmienna s początkowo przechowuje ciąg ''Basia''.
s[0] = 'K'; zmienia pierwszy znak na 'K'
, więc s
teraz przechowuje ''Kasia''.
Pętla for wyświetla wszystkie znaki z ciągu s, wypisując wynik: ''Kasia''.
Praca ze zmiennymi string jako tablicą znaków pozwala na wygodne modyfikowanie dowolnych elementów ciągu w sposób podobny do działania na tablicach jednowymiarowych.
Funkcja rand()
z biblioteki cstdlib
pozwala generować pseudolosowe liczby całkowite. Aby uzyskać różne wartości przy każdym uruchomieniu programu, należy dodatkowo ustawić ziarno losowe za pomocą funkcji srand()
z biblioteki ctime
, korzystając z bieżącego czasu jako ziarna losowości.
Przykład:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand(time(NULL)); // Inicjalizacja generatora liczb losowych
int wylosowanaLiczba = (rand() % 99) + 1; // Losowanie liczby od 1 do 99
cout << "Wylosowana liczba: " << wylosowanaLiczba << endl;
return 0;
}
Działanie powyższego kodu:
Inicjalizacja ziarna losowego: Funkcja srand(time(NULL))
ustawia ziarno losowe na podstawie bieżącego czasu systemowego, dzięki czemu przy każdym uruchomieniu programu generowane będą różne liczby. Bez tej inicjalizacji wyniki rand()
byłyby takie same przy każdym uruchomieniu programu.
Losowanie liczby: Funkcja rand()
generuje liczbę całkowitą w przedziale od 0 do RAND_MAX
. Wyrażenie (rand() % 99) + 1
redukuje zakres do liczb od 1 do 99. Operator % 99
sprawia, że wartości będą od 0 do 98, a dodanie 1 zmienia zakres na 1–99.
Wyświetlanie wyniku: Program wyświetla losowo wygenerowaną liczbę w przedziale od 1 do 99.
Funkcja rand()
w połączeniu z srand(time(NULL))
umożliwia generowanie losowych wartości liczbowych w różnych przedziałach, co jest przydatne w wielu zastosowaniach, takich jak gry, symulacje i inne aplikacje, gdzie wymagane są losowe dane.
Napisz program, który wczyta od użytkownika ciąg znaków o maksymalnej długości 20 znaków i zapisze go do tablicy znakowej. Następnie program wyświetli wprowadzony ciąg znaków.
Kroki do wykonania:
Program deklaruje tablicę znakową o rozmiarze 21 (20 znaków plus jeden znak \0 kończący ciąg).
Program prosi użytkownika o wpisanie ciągu znaków, który zostanie zapisany w tablicy znakowej.
Program używa funkcji cin.getline, aby wczytać cały ciąg znaków (w tym potencjalne spacje) do tablicy znakowej.
Program wyświetla wprowadzony ciąg znaków, korzystając z tablicy znakowej.
Wynik działania programu:
Podaj ciag znakow (max 20 znakow): Ala ma kota
Wprowadzony ciag znakow: Ala ma kota
Napisz program, który wczyta od użytkownika ciąg znaków o długości maksymalnie 20 znaków, a następnie zamieni wszystkie wystąpienia litery 'a' na literę 'o'. Program wyświetli zmodyfikowany ciąg znaków.
Kroki do wykonania:
Program wczytuje ciąg znaków od użytkownika i zapisuje go w tablicy o rozmiarze 21.
Program przechodzi przez każdy znak w tablicy, sprawdzając, czy jest to litera 'a'.
Jeśli znajdzie literę 'a', zamienia ją na literę 'o'.
Na końcu program wyświetla zmodyfikowany ciąg znaków.
Wynik działania programu:
Podaj ciag znakow (max 20 znakow): Ala ma kota
Zmodyfikowany ciag znakow: Alo mo koto
Napisz program, który wczyta od użytkownika ciąg znaków oraz znak, którego wystąpienia w ciągu mają zostać zliczone. Program powinien także wyświetlić pozycje, na których dany znak występuje w podanym ciągu.
Kroki do wykonania:
Program wczytuje ciąg znaków od użytkownika, zapisując go w tablicy znaków.
Program następnie wczytuje pojedynczy znak, którego wystąpienia mają być zliczone.
Zmienna licznik jest inicjalizowana do zera, oraz stworzona tablica do przechowywania pozycji wystąpień znaku.
Pętla przechodzi przez każdy element tablicy, porównując każdy znak z podanym przez użytkownika znakiem do zliczenia.
Jeśli dany znak w tablicy jest taki sam, jak szukany, licznik zwiększa swoją wartość o jeden, a pozycja jest zapisywana w tablicy.
Na końcu program wyświetla liczbę wystąpień danego znaku w ciągu oraz listę pozycji, na których dany znak występuje.
Przykład działania programu:
Podaj ciag znakow: Ala ma kota
Podaj znak do zliczenia: a
Liczba wystapien znaku 'a': 3
Pozycje wystapien: 2, 5, 10
Napisz program, który odwróci podany przez użytkownika ciąg znaków i wyświetli wynik.
Kroki do wykonania:
Program wczytuje ciąg znaków od użytkownika i zapisuje go w tablicy znaków.
Program oblicza długość wprowadzonego ciągu, aby wiedzieć, ile znaków należy odwrócić. Należy zaimportować bibliotekę 'cstring' i użyć metody strlen()
Program przechodzi przez tablicę znaków od końca do początku i zapisuje odwrócony ciąg w nowej tablicy.
Na końcu program wyświetla odwrócony ciąg znaków.
Wynik działania programu:
Podaj ciag znakow: Ala ma kota
Odwrocony ciag: atok am alA