- 2 kwietnia 2026
- Posted by: Damian
- Category: Baza wiedzy

Na maturze zdarzają się zadania w których należy policzyć litery, a nawet całe ciągi znaków w tekście. Jednak jak skutecznie sobie z tym poradzić? Poniżej znajdziesz rozwiązania wykorzystujące tablice oraz tablice asocjacyjne. Sprawdź czym się różnią i jak należy z nich prawidłowo korzystać.
Licznik znaków – ile znaków, liter oraz słów?
Powyższy licznik znaków, pomoże Ci dowiedzieć się ile liter oraz słów znajdziesz w poszczególnych zdaniach. Skorzystaj z niego, jeśli chcesz sprawdzić działanie swojego algorytmu lub gdy potrzebujesz sprawdzić jakiś tekst.
Zliczanie liter: klasyczna tablica – implementacja
Klasycznie zliczanie liter polega na stworzeniu tablicy o rozmiarze całego alfabetu łacińskiego, czyli 26. Gdy już mamy utworzoną tablicę należy zmienić wszystkie wartości na 0. Teraz przechodząc po kolejnych znakach tekstu bierzemy kod ASCII każdej litery, a następnie odejmujemy od niego kod litery “a” lub “A” w zależności od wielkości liter w tekście.
Wystarczy teraz zwiększyć wartość o indeksie równym uzyskanej wartości. W ten sposób uzyskamy tablicę, gdzie w komórce o indeksie 0 będzie liczba wystąpień A, natomiast w tej o indeksie 1 liczba wystąpień B i tak dalej aż do 25 (końca alfabetu).
Zliczanie liter – pseudokod i schemat blokowy

1 2 3 4 5 6 7 8 9 10 11 | zliczacz[26] napis ← "kocham informatyke" dla i = 1,2 ... 26 wykonuj zliczacz[i]←0 n ← napis.dlugosc() dla i = 1,2 ... n wykonuj zliczacz [ kodASCII ( napis[ i ] - kodASCII ('a') + 1 ] ← zliczacz [ kodASCII ( napis [ i ] - kodASCII ('a') + 1 ] + 1 dla i = 1,2 ... 26 wykonuj jeżeli zliczacz[i]>0 wyświetl litera ( i + kodASCII ('a') - 1 ) + “: “ wyświetl zliczacz [ i ] |
Opis zliczania liter – Pseudokod
- 1 linia – Tworzy tablicę zliczacz o 26 elementach, służącą do zliczania wystąpień liter alfabetu.
- 2 linia – Przypisuje do zmiennej napis ciąg znaków “kocham informatyke”.
- 3 linia – Rozpoczyna pętlę, która będzie wykonywać się dla każdego indeksu od 1 do n (gdzie n to długość napisu).
- 4 linia – Inicjalizuje każdy element tablicy zliczacz na 0.
- 5 linia – Rozpoczyna kolejną pętlę, która przechodzi przez każdy znak w napisie.
- 6 linia – Zwiększa licznik w tablicy zliczacz dla odpowiedniej litery (na podstawie kodu ASCII znaku w napisie).
- 7 linia – Inicjuje trzecią pętlę, która również przechodzi przez każdy znak w napisie.
- 8 linia – Sprawdza, czy liczba wystąpień danej litery w tablicy zliczacz jest większa niż 0.
- 9 linia – Wyświetla literę oraz jej liczbę wystąpień w napisie, przekształcając kod ASCII z powrotem na znak.
Uwaga: Na maturze nie jest dozwolone korzystanie ze zmiennych typu string.
Zliczanie liter – Python, C++ i Java
Zliczanie liter – Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | text = "kocham Informatyke" letter_count = [0] * 26 for c in text: c = c.lower() if c.isalpha(): letter_count[ord(c) - ord('a')] += 1 print("Liczba wystapien liter:") for i in range(26): if letter_count[i] > 0: letter = chr(ord('a') + i) print(f"{letter}: {letter_count[i]}") |
Zliczanie liter – C++
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 | #include <iostream> #include <cctype> using namespace std; int main() { // Predefined strings string text = "kocham Informatyke"; int letterCount[26] = {0}; for (int i = 0; i < text.length(); i++) { char c = text[i]; c = tolower(c); if (isalpha(c)) { letterCount[c - 'a']++; } } cout << "Liczba wystapien liter:" << endl; for (int i = 0; i < 26; i++) { if (letterCount[i] > 0) { char letter = 'a' + i; cout << letter << ": " << letterCount[i] << endl; } } return 0; } |
Zliczanie liter – Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Main { public static void main(String[] args) { String text = "kocham Informatyke"; int[] letterCount = new int[26]; for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); c = Character.toLowerCase(c); if (Character.isLetter(c)) { letterCount[c - 'a']++; } } System.out.println("Liczba wystapien liter:"); for (int i = 0; i < 26; i++) { if (letterCount[i] > 0) { char letter = (char) ('a' + i); System.out.println(letter + ": " + letterCount[i]); } } } } |
Wyświetlenie liczby wystąpień poszczególnych liter też opiera się na kodach ASCII. Wystarczy prosta pętla, która będzie zwiększała numer wyświetlanego (print) indeksu i wyświetlała (print) litery o kodzie ascii “a” + numer_indeksu.
Co to tablice asocjacyjne?
Tablice asocjacyjne (słowniki, mapy, hashmapy) to struktury danych, przechowujące dane w parach klucz–wartość. Warto pamiętać, że klucze są unikalne, więc nie może wystąpić dwa razy ten sam klucz. Jeśli chodzi o wartości to są dowolne, dzięki czemu można używać tam zarówno liczb, napisów (typ string), obiektów oraz innych typów zmiennych. Co ciekawe, dostęp do danych okazuje się bardzo szybki, ze względu na tzw. haszowanie kluczy. Czyli tablice klasyczne korzystają z indeksów liczbowych jako kluczy, a tablice asocjacyjne z dowolnego ciągu znaków (o ile jest unikalny).

Używa się ich przede wszystkim w sytuacjach, gdy chce się przechowywać dane opisane nazwami (np. id, pesel lub coś innego), a także gdy zależy nam na szybkim wyszukiwaniu po nazwach.
Dlaczego warto użyć tablic asocjacyjnych do licznika liter?
Klasyczne tablice nie zawsze się sprawdzają przy zliczaniu liter:
- Kiedy pojawią się znaki inne niż litery alfabetu łacińskiego np. cyfry, czy polskie znaki, zliczacz nie będzie działał poprawnie (należy wtedy stworzyć większą tablicę oraz dodać kilka instrukcji warunkowych).
- Jeśli w tekście nie występują wszystkie znaki które liczymy to będziemy mieli nie wykorzystane komórki, które niepotrzebnie zajmują pamięć. Co jeśli w tekście są same litery “a”?
- Działania na kodach ascii mogą być uciążliwe.
Z pomocą przychodzą tablice asocjacyjne nazywane inaczej w każdym języku np. słownik w pythonie lub mapa w C++.
Zliczanie liter – Tablice asocjacyjne – implementacja
Znajomość szczegółów ich działania nie jest wymagana, jednak warto wiedzieć, że prawie wszystkie operacje na nich mają złożoność O(log2n) lub O(1) w zależności od implementacji. Zainteresowani mogą poczytać o drzewach binarnych, a w szczególności o Red-Black Tree oraz Hash map. Dzięki nim zamiast tworzyć zmienne na wszystkie litery alfabetu, możemy zapisać tylko te, które faktycznie pojawią się w tekście. Kolejną zaletą jest możliwość zapisania dowolnego znaku, a nawet całego napisu, tak naprawdę nie jesteśmy w tym ograniczeni. Możemy użyć jako klucza prawie każdego typu zmiennej. Przykładowo w C++ możemy użyć jako klucza nawet tablic.
W przypadku zliczania liter, kluczem nazywamy wartość którą liczymy, a wartością liczbę jego wystąpień.
Wyświetlanie nie jest skomplikowane, zazwyczaj w danym języku mamy dostęp do klucza i wartości, więc wystarczy je wyświetlić za pomocą print lub podobnej funkcji. Jeżeli chcemy liczyć litery niezależnie czy są duże, czy małe, warto użyć funkcji lower() w pythonie (albo alternatywy dostępnej w innych językach).
Zliczanie liter – pseudokod i schemat blokowy

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | napis ← "Kocham Informatyke!" zliczacz ← {} i ← 0 dopóki i < napis.dlugosc() wykonuj: c ← napis [i] jeżeli c w zliczacz to: zliczacz[c] ← zliczacz[c]+1 w przeciwnym razie: zliczacz[c] ← 1 i ← i + 1 Dla każdego elementu w zliczacz: wypisz zliczacz.klucz wypisz zliczacz.wartość |
Uwaga: Instrukcje “Dla każdego elementu w zliczacz: oraz jeżeli c w zliczacz” nie są dozwolone na maturze. Wstawiono je tu poglądowo, dla łatwiejszego zrozumienia działania algorytmu.
Zliczanie liter – Python, C++ i Java
Zliczanie liter – Python
W pythonie tablica asocjacyjna nazywana jest słownikiem, działa on podobnie co mapy w C++, jednak nie zawsze jest posortowany, choć zachowuje kolejność wstawiania liter. Słownik tworzy się używając {} albo pisząc dict(). Kiedy iterujemy po pojemniku zamiast par, dostajemy sam klucz, żeby dostać całą parę, gdzie pierwszy element to klucz, a drugi to odpowiadająca mu wartość musimy użyć funkcji items(). Można też użyć funkcji values(), żeby iterować po samych wartościach
1 2 3 4 5 6 7 8 9 10 11 | text = "Kocham Informatyke!" char_count = {} for c in text: if c in char_count: char_count[c] += 1 else: char_count[c] = 1 for char, count in char_count.items(): print(f"{char}: {count}") |
Zliczanie liter – C++
W C++ mapa przechowuje pary, więc będziemy z nich korzystać w pętli, para.first przechowuje klucz, a para.second przechowuje wartość. Mapę deklarujemy jak każdy inny container z biblioteki standardowej map<typ1, typ2>. Nie ma potrzeby dodawać elementów do mapy, dodają się same i inicjalizują wartości na domyślne jeśli zostaną użyte. Przykład:
1 2 3 | map<char, int> charCount; char c = “a” cout<< charCount[c]; |
W trzeciej linie zostaje dodany element, a odpowiadająca mu wartość zostaje zainicjalizowana na 0. Następnie wartość jest wyświetlana.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <iostream> #include <map> #include <string> #include <utility> using namespace std; int main() { string text = "Kocham Informatyke!"; map<char, int> charCount; for (int i = 0; i < text.length(); i++) { char c = text[i]; charCount[c]++; } for (pair<char, int> pair : charCount) { cout << pair.first << ": " << pair.second << endl; } return 0; } |
Uwaga: w C++ domyślna wartość w mapie (dla nowego klucza) to 0. W Pythonie nie ma typów zmiennych i trzeba to zapisać bardziej jawnie – czyli dodać warunek: jeśli znak jest już w słowniku, zwiększamy licznik, a jeśli nie, to ustawiamy go na 1. W C++ map automatycznie inicjalizuje nowy klucz wartością domyślną (0), więc wystarczy samo charCount++.
Dla zainteresowanych: W C++ jest dostępne również hash_map, które nie jest posortowane oraz multimap, mogące przechowywać wiele elementów z tym samym kluczem.
Zliczanie liter – Java
W javie są dostępne różne mapy, w tym TreeMap, która działa jak ta w C++ oraz HashMap, działająca jak słownik w pythonie (jednak nie zachowuje kolejności wstawiania). Tworzymy ją podobnie jak w C++: Map<typ1, typ2> mapa = new HashMap<>();. Elementy dodajemy funkcją put (klucz, wartość) i odczytujemy funkcją getOrDeflaut (klucz, wartość_kiedy_element_nie_istnieje). Dość sprytnie dodając 1 możemy uzyskać pożądany efekt. Wyświetlenie działa podobnie jak w C++, jednak zamiast pary piszemy Map.Entry<typ1,typ2>, następnie musimy iterować używając metody entrySet() (podobnie jak w pythonie), która właśnie takie pary zwraca podczas działania.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { String text = "Kocham Informatyke!"; Map<Character, Integer> charCount = new HashMap<>(); for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); charCount.put(c, charCount.getOrDefault(c, 0) + 1); } for (Map.Entry<Character, Integer> entry : charCount.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } } |
Uwaga: W Javie standardowa mapa (Map) nie przypisuje nowemu kluczowi wartości domyślnej. Dlatego, aby zliczyć wystąpienia znaków w tekście, używamy getOrDefault(c, 0) + 1 — jeśli znak c nie istnieje w mapie, metoda getOrDefault zwróci 0, a następnie zwiększamy wartość o 1. W Pythonie natomiast nie ma typów zmiennych i trzeba jawnie sprawdzać, czy znak jest już w słowniku: jeśli tak, zwiększamy licznik, a jeśli nie, ustawiamy go na 1.
Zliczanie liter – z użyciem set
Kolejną przydatną funkcją dostępną w wielu językach programowania są sety. Set przypomina zwykłą tablice, ale nie ma w nim nigdy dwa razy tych samych elementów. W C++ sety dodatkowo są zawsze posortowane. Przykładowe wykorzystanie setów to wypisanie tylko tych liter, które były użyte w tekście, ich liczby (np. funkcją len()) albo ile unikatowych kombinacji występuje w jakimś pliku. Oczywiście można by to zrobić używając zwykłej listy, ale używając setu mamy dużo mniejszą złożoność (O(log n) vs O(n) lub nawet O(1) vs O(n) w zależności od implementacji).
Uwaga: jako unikatowy znak liczona jest też np. spacja, aby liczyć same litery trzeba użyć odpowiednich warunków w danym języku.
Zliczanie liter – Python
1 2 3 4 5 6 7 8 | napis = "Kocham informatyke" unikatowe_znaki = set() for znak in napis: unikatowe_znaki.add(znak) print(unikatowe_znaki) print(f"Liczba unikatowych znakow w tekscie wynosi: {len(unikatowe_znaki)}") |
Zliczanie liter – C++
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 | #include <iostream> #include <set> #include <string> using namespace std; int main() { string napis = "Kocham informatyke"; set<char> unikatowe_znaki; for (char znak : napis) { unikatowe_znaki.insert(znak); } cout << "Unikatowe znaki: "; for (char znak : unikatowe_znaki) { cout << znak << " "; } cout << endl; cout << "Liczba unikatowych znakow w tekscie wynosi: " << unikatowe_znaki.size() << endl; return 0; } |
Zliczanie liter – Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import java.util.HashSet; import java.util.Set; public class Main { public static void main(String[] args) { String napis = "Kocham informatyke"; Set<Character> unikatoweZnaki = new HashSet<>(); for (char znak : napis.toCharArray()) { unikatoweZnaki.add(znak); } System.out.print("Unikatowe znaki: "); for (char znak : unikatoweZnaki) { System.out.print(znak + " "); } System.out.println(); System.out.println("Liczba unikatowych znakow w tekscie wynosi: " + unikatoweZnaki.size()); } } |
QUIZ – Sprawdź swoją wiedzę
Najczęściej zadawane pytania o tablice asocjacyjne
Czym są tablice asocjacyjne
Tablice asocjacyjne to struktury danych, które przechowują informacje w postaci par klucz–wartość. Każdej wartości przypisany jest unikalny klucz, który służy do jej identyfikacji i odczytu. Kluczami mogą być ciągi znaków lub inne typy danych, a nie tylko liczby. Dzięki temu dane można przechowywać i odczytywać w sposób bardziej zrozumiały i czytelny.
Jaka jest różnica między tablicą, a tablicą asocjacyjną?
Podstawowa różnica polega na sposobie dostępu do danych. W zwykłej tablicy dostęp do elementów odbywa się za pomocą indeksów liczbowych, które wskazują pozycję danego elementu. Natomiast w tablicy asocjacyjnej dostęp uzyskuje się za pomocą nazwanych kluczy, co pozwala lepiej zorganizować i opisać dane. Tablica klasyczna skupia się na kolejności elementów, natomiast tablica asocjacyjna na znaczeniu poszczególnych informacji.
Dlaczego potrzebujemy tablicy asocjacyjnej?
Tablica asocjacyjna jest przydatna wtedy, gdy potrzebujemy przechowywać dane opisowe, do których chcemy mieć szybki dostęp na podstawie nazw, a nie pozycji. Pozwala to tworzyć bardziej czytelne i logiczne struktury danych, które są łatwiejsze do zrozumienia, utrzymania i rozbudowy. Umożliwia także dynamiczne zarządzanie danymi i efektywne wyszukiwanie potrzebnych informacji.


