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

Artykuł przedstawia rozwiązania matury z informatyki 2021, przy pomocy Microsoft Access (SQL) oraz języków programowania C++, Java i Python. Załączniki potrzebne do wykonania poszczególnych zadań znajdziesz w tym linku.
Zadanie 1 – Cyfrowe dopełnienie

Zadanie 1.1.

Najmniejsza różnica wystąpi wtedy, kiedy dopełnienie będzie jak największe, a liczba jak najmniejsza, nie możemy jednak przesadzić, skoro bierzemy wartość bezwzględną liczby. Spróbujmy więc uzyskać jak najmniejszą liczbę dodatnią. Na pewno w naszej liczbie powinny być same zera (oprócz pierwszej cyfry). Najlepszym kandydatem na pierwsze miejsce będzie liczba 5, skoro różnica między nią, a jej dopełnieniem to 1. Sprawdźmy liczbę 5000. Jej dopełnienie to 4999, a różnica to 1. Trudno uzyskać mniejszą wartość bezwzględną.
W następnym podpunkcie sytuacja jest odwrotna, staramy się uzyskać największą liczbę z jak najmniejszym dopełnieniem, najlepiej żeby liczba składała się tylko z cyfr 9, jednak nie jest to możliwe, bo pierwsza cyfra to nie może być 9. Zastępujemy ją cyfrą 8, a jej dopełnienie to 1. Z kolei przy liczbie 8999, dopełnienie to 1000, a różnica 7999.
Nie ma znaczenia czy w odpowiedzi wpiszesz uzyskaną przez nas liczbę, czy też jej dopełnienie, bo i tak pobierasz wartość bezwzględną z różnicy.
Rozwiazanie:
- 5000 (możliwe też wpisanie 4999),
- 8999 (możliwe też wpisanie 1000).
Zadanie 1.2.

Rozwiązanie:
1 2 3 4 5 6 7 8 | d ← 0 potega ← 1 dopóki n > 0 wykonuj: cyfra ← n mod 10 n ← n div 10 d ← d + (9 - cyfra) * potega potega ← potega * 10 zwróć d i zakończ |
Algorytm wykorzystuje operację mod (modulo – reszta z dzielenia) do pobrania ostatniej cyfry. Używa dzielenia całkowitego przez 10, aby “usunąć” ostatnią cyfrę liczby. Następnie uzyskuje jej cyfrowe dopełnienie i dodaje je do liczby wynikowej d korzystając z mnożenia przez odpowiednie potęgi liczby 10.
Przykład działania operacji:
123 mod 10 = 3
123 div 100 = 1
123 + 1000 * 4 = 4123
Zadanie 2 – Analiza algorytmu

Zobaczmy czy da się łatwo zrozumieć algorytm. Pierwsze trzy linie jedynie zwiększają długość tablicy i inicjalizują zmienne. W pętli, trzy pierwsze linijki po prostu zamieniają miejscami dwie wartości, a ostatnia ustawia wartość s na s div 2. Warunkami pętli są dodatnie s div 2 oraz wartość T[s] większa od T[s div 2]. Podsumowując algorytm dodaje liczbę na koniec tablicy, a następnie zamienia ją z liczbą na dwa razy mniejszej pozycji, jeśli znajdująca się tam liczba jest mniejsza. Wykonuje te zamiany, dopóki nie napotka liczby, która nie jest mniejsza (jest większa lub równa) lub nie ma więcej liczb do sprawdzenia.
Przykład:
tab = [1,2,3,4]
A gdy teraz wykonamy d(5):
- tab = [1, 2, 3, 4, 5],
- tab = [1, 5, 3, 4, 2] (zamiana 2 i 5),
- tab = [5, 1, 3, 4, 2] (zamiana 1 i 5).
Zadanie 2.1.

Rozwiązanie:
36, 15, 17, 3, -5
30, 27, 13, 6, -3, -2, -3, 4
Zadanie 2.2.

Sprawdźmy tablicę po każdym wywołaniu.
6
6, -4
12, -4, 6
27, 12, 6, -4
27, 26, 6, -4, 12
27, 26, 8, -4, 12, 6
Rozwiązanie:
27, 26, 8, -4, 12, 6
Zadanie 2.3.

Za każdym razem dzielimy numer przeszukiwanej komórki przez wartość 2, więc złożoność jest związana z logarytmem binarnym, jednak nie wiemy czy jest to wartość zaokrąglana w górę, czy też w dół, czy może dodawana jest wartość 1? Łatwo to sprawdzić, gdyż wiemy że dla czwórki wynik to 3, a log 4 = 2. Potencjalny kandydat to log k + 1 jednak nadal musimy zdobyć informacje o zaokrągleniu, inaczej nie wykonamy k = 1025. Sprawdźmy dla k = 5.
tab = [1, 2, 3, 4] dodając 5:
- porównanie z T[2],
- porównanie z T[1],
- sprawdzenie warunku i wyjście z pętli.
Trzy porównania, a wartość log 5 jest większa od 2, oznacza to, że wzór na liczbę sprawdzeń to ⌊log k⌋+1. Na tej podstawie możemy łatwo uzyskać pozostałe wartości.
Rozwiązanie:
log 16 + 1 = 5
log 1025 + 1 = 11
| k | Ile razy sprawdzany jest warunek pętli dopóki podczas wykonywania d(k)? |
| 4 | 3 razy |
| 16 | 5 razy |
| 1025 | 11 razy |
Uwaga: log na maturze z informatyki to log2, zwany logarytmem binarnym.
Zadanie 3 – Test
Zadanie 3.1.


Rozwiązanie:
otrzymamy 5 3 1 1 3 5 F
otrzymamy 6 4 2 2 4 6 P
otrzymamy 7 5 3 1 1 3 5 7 P
otrzymamy 8 6 4 2 2 4 6 8 F
Zadanie 3.2.

Możesz przeczytać w naszym artykule o systemach liczbowych, jak stosować konwersję pomiędzy systemami. Wystarczy zamienić wszystkie liczby na system dziesiętny, a zadanie nie powinno sprawić większych problemów.
Rozwiązanie:
| 100000002 = 12810 | A916= 16910 | 16910 > 12810 | F |
| 11114 = 8510 | 11111112 = 12710 | 8510 < 12710 | F |
| 30034 = 19510 | C216 = 19410 | 19510 > 19410 | P |
| 3338 = 21910 | 101001012 = 16510 | 21910 > 16510 | P |
Zadanie 3.3.

Rozwiązanie:
| 1 | Zapytanie wyświetla wszystkie produkty, których cena wynosi 2 lub 4. | Te wymagania spełniają zeszyt oraz cyrkiel. | F |
| 2 | Zapytanie liczy średnią cenę produktów, których liczba sztuk równa się 125 lub 160. | Ceny tych produktów to 2 i 8. Średnia to 5. | P |
| 3 | Zapytanie dodaje ze sobą liczby sztuk produktów, których cena równa się 1 lub 2. | Cena to 160+250+250=660. | P |
| 4 | Zapytanie liczy produkty, których cena jest w przedziale [2,4]. | Takich produktów jest 5. | F |
Zadanie 4 – Neon cyfrowy

Na początek oczywiście importujemy dane, najlepiej zrobić to tak jak jest w pliku, to znaczy stworzyć listę gdzie w pierwszej komórce jest pierwszy wiersz, w drugiej drugi itd.
Rozwiązanie:
Implementacja – Python
1 2 3 4 | with open("instrukcje.txt", "r") as plik: linie = plik.readlines() for i in range(len(linie)): linie[i] = linie[i].rstrip() |
Implementacja – C++
1 2 3 4 5 6 7 8 9 | ifstream plik("instrukcje.txt"); vector<string> linie; string line; // Wczytanie wszystkich linii z pliku while (getline(plik, line)) { line.erase(line.find_last_not_of(" \n\r\t") + 1); // Usuwanie białych znaków na końcu linie.push_back(line); } |
Implementacja – Java
1 2 3 4 5 6 7 8 9 | BufferedReader br = new BufferedReader(new FileReader("instrukcje.txt")); List<String> linie = new ArrayList<>(); String line; // Wczytanie wszystkich linii z pliku while ((line = br.readLine()) != null) { line = line.trim(); // Usuwanie białych znaków na końcu linie.add(line); } |
Zadanie 4.1.

W pierwszym podpunkcie nie potrzeba od razu całej symulacji, wystarczy policzyć liczbę instrukcji DOPISZ i USUN. Czyli kiedy instrukcja to DOPISZ, dodajemy 1, a gdy USUN odejmujemy 1.
Implementacja – Python
1 2 3 4 5 6 7 | bilans = 0 for napis in linie: if napis.find("DOPISZ") == 0: bilans += 1 elif napis.find("USUN") == 0: bilans -= 1 print(bilans) |
Implementacja – C++
1 2 3 4 5 6 7 8 9 | int bilans = 0; for (const auto& napis : linie) { if (napis.find("DOPISZ") == 0) { bilans += 1; } else if (napis.find("USUN") == 0) { bilans -= 1; } } cout << bilans << endl; |
Implementacja – Java
1 2 3 4 5 6 7 8 9 | int bilans = 0; for (String napis : linie) { if (napis.startsWith("DOPISZ")) { bilans += 1; } else if (napis.startsWith("USUN")) { bilans -= 1; } } System.out.println(bilans); |
Rozwiązanie:
517
Zadanie 4.2.

Drugi podpunkt to dość standardowe zadanie maturalne. Będziemy działać następująco: porównujemy kolejne instrukcje i jeśli są takie same liczymy długość ich ciągu. Z każdym wykonaniem sprawdzamy czy długość obecnie sprawdzanego ciągu jest większa od maksymalnej, a jeśli tak to ustawiamy nową maksymalną długość. Gdy instrukcja się zmieni, po prostu resetujemy licznik długości na 1. W celu “wygrzebania” instrukcji z danych poleceń użyjemy slicingu. Jeśli nie wiesz co to, możesz sprawdzić informacje na ten temat, w naszym artykule.
Implementacja – Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | tmp = linie[0] pierwsza = tmp[:-2] licznik = 0 maks = 0 maksInstrukcja = "" for element in linie: if element[:-2] == pierwsza: licznik += 1 if licznik > maks: maks = licznik maksInstrukcja = pierwsza if element[:-2] != pierwsza: pierwsza = element[:-2] licznik = 1 print(maksInstrukcja, maks) |
Implementacja – C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | string pierwsza = linie[0].substr(0, linie[0].size() - 2); int licznik = 0, maks = 0; string maksInstrukcja = ""; for (const auto& element : linie) { if (element.substr(0, element.size() - 2) == pierwsza) { licznik++; } if (licznik > maks) { maks = licznik; maksInstrukcja = pierwsza; } if (element.substr(0, element.size() - 2) != pierwsza) { pierwsza = element.substr(0, element.size() - 2); licznik = 1; } } cout << maksInstrukcja << " " << maks << endl; |
Implementacja – Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | String pierwsza = linie.get(0).substring(0, linie.get(0).length() - 2); int licznik = 0, maks = 0; String maksInstrukcja = ""; for (String element : linie) { if (element.substring(0, element.length() - 2).equals(pierwsza)) { licznik++; } if (licznik > maks) { maks = licznik; maksInstrukcja = pierwsza; } if (!element.substring(0, element.length() - 2).equals(pierwsza)) { pierwsza = element.substring(0, element.length() - 2); licznik = 1; } } System.out.println(maksInstrukcja + " " + maks); |
Rozwiązanie:
ZMIEN 7
Zadanie 4.3.

Kolejny często występujący podpunkt maturalny. Wystarczy użyć słownika lub zwykłej tablicy, a także kodów ASCII. Tworzymy listę o długości angielskiego alfabetu (26). Następnie jeśli wykryjemy instrukcję DOPISZ, dodajemy wartość 1 do indeksu odpowiadającego danej literze. Uzyskujemy go odejmując od kodu ASCII danej litery kod oznaczający litery A.
Indeks odpowiadający literze A to 0, B to 1 itd.
Na koniec używając funkcji maks znajdujemy maksymalną liczbę wystąpień i sprawdzamy która to litera, dodając do jej indeksu kod A oraz używając funkcji chr() do zamiany kodu na znak.
Rozwiązanie:
Z 37
Implementacja – Python
1 2 3 4 5 6 7 8 | litery = [0]*26 for element in linie: if element[:-2] == "DOPISZ": litery[ord(element[-1])-ord("A")] += 1 maks = max(litery) print(chr(litery.index(maks)+ord("A")), maks) |
Implementacja – C++
1 2 3 4 5 6 7 8 9 10 | vector<int> litery(26, 0); for (const auto& element : linie) { if (element.substr(0, element.size() - 2) == "DOPISZ") { litery[element[element.size() - 1] - 'A'] += 1; } } int maksLitera = *max_element(litery.begin(), litery.end()); char maksChar = 'A' + distance(litery.begin(), find(litery.begin(), litery.end(), maksLitera)); cout << maksChar << " " << maksLitera << endl; |
Implementacja – Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int[] litery = new int[26]; for (String element : linie) { if (element.substring(0, element.length() - 2).equals("DOPISZ")) { char letter = element.charAt(element.length() - 1); litery[letter - 'A']++; } } int maksLitera = 0; for (int i = 1; i < litery.length; i++) { if (litery[i] > litery[maksLitera]) { maksLitera = i; } } System.out.println((char) (maksLitera + 'A') + " " + litery[maksLitera]); |
Zadanie 4.4.

Ostatni podpunkt to jedynie pełne wykonanie wszystkich operacji. Zamiast zmiennej typu string jak sugerowane jest to w symulacji, użyjemy listy, bo stringi w pythonie są niezmienne, więc działanie na nich byłoby dość irytujące.
Symulacja:
gdy wykryjemy instrukcję DOPISZ:
appendujemy (dodajemy na koniec) element do naszej listy,
gdy wykryjemy instrukcję DOPISZ:
usuwamy ostatnią liczbę i appendujemy nową literę, która jest podana jako argument instrukcji
gdy wykryjemy instrukcję USUN:
po prostu usuwamy ostatnią literę
gdy wykryjemy instrukcję PRZESUN:
używamy funkcji index() do znalezienia pierwszej litery podanej w argumencie. Dodajemy do jej kodu 1 i sprawdzamy czy jest on większy od litery “Z”. Jeśli występuje, to wstawiamy A, a jeśli nie, to dany kod zamieniamy na literę.
Na koniec printujemy (wypisujemy) uzyskany wyraz, możemy użyć gwiazdki, wtedy lista wyprintuje się jak napis string. Możemy też wstawić sep=””, żeby nie było odstępów między literami.
Wskazówka: Możesz sprawdzić swój wynik, porównując długość uzyskanego ciągu z długością uzyskaną w pierwszym podpunkcie.
Implementacja – Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | lista = [] for polecenie in linie: if polecenie[:-2] == "DOPISZ": lista.append(polecenie[-1]) elif polecenie[:-2] == "ZMIEN": lista.pop() lista.append(polecenie[-1]) elif polecenie[:-2] == "USUN": lista.pop() elif polecenie[:-2] == "PRZESUN": indeks = lista.index(polecenie[-1]) if ord(lista[indeks]) + 1 > ord("Z"): lista[indeks] = "A" else: lista[indeks] = chr(ord(lista[indeks]) + 1) print(*lista,sep="") |
Implementacja – 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 | vector<char> lista; for (const auto& polecenie : linie) { if (polecenie.substr(0, polecenie.size() - 2) == "DOPISZ") { lista.push_back(polecenie.back()); } else if (polecenie.substr(0, polecenie.size() - 2) == "ZMIEN") { lista.pop_back(); lista.push_back(polecenie.back()); } else if (polecenie.substr(0, polecenie.size() - 2) == "USUN") { lista.pop_back(); } else if (polecenie.substr(0, polecenie.size() - 2) == "PRZESUN") { auto it = find(lista.begin(), lista.end(), polecenie.back()); if (it != lista.end()) { if (*it == 'Z') { *it = 'A'; } else { (*it)++; } } } } for (const char& c : lista) { cout << c; } cout << endl; |
Implementacja – Java
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 | List<Character> lista = new ArrayList<>(); for (String polecenie : linie) { if (polecenie.substring(0, polecenie.length() - 2).equals("DOPISZ")) { lista.add(polecenie.charAt(polecenie.length() - 1)); } else if (polecenie.substring(0, polecenie.length() - 2).equals("ZMIEN")) { lista.remove(lista.size() - 1); lista.add(polecenie.charAt(polecenie.length() - 1)); } else if (polecenie.substring(0, polecenie.length() - 2).equals("USUN")) { lista.remove(lista.size() - 1); } else if (polecenie.substring(0, polecenie.length() - 2).equals("PRZESUN")) { char znak = polecenie.charAt(polecenie.length() - 1); int indeks = lista.indexOf(znak); if (indeks != -1) { if (lista.get(indeks) == 'Z') { lista.set(indeks, 'A'); } else { lista.set(indeks, (char) (lista.get(indeks) + 1)); } } } } for (char c : lista) { System.out.print(c); } System.out.println(); |
Uwaga: W zadaniach maturalnych tego typu nie zawsze wychodzi tekst, który ma sens.
Rozwiązanie:
| POZNIEJMOWIONOZECZLOWIEKTENNADSZEDLODPOLNOCYODBRAMYPOWROZNICZEJSZEDLPIESZOAOBJUCZONEGOKONIAPROWADZILZAUZDEBYLOPOZNEPOPOLUDNIEIKRAMYPOWROZNIKOWIRYMARZYBYLYJUZZAMKNIETEAULICZKAPUSTABYLOCIEPLOACZLOWIEKTENMIALNASOBIECZARNYPLASZCZNARZUCONYNARAMIONAZWRACALUWAGEZATRZYMALSIEPRZEDGOSPODASTARYNARAKORTPOSTALCHWILEPOSLUCHALGWARUGLOSOWGOSPODAJAKZWYKLEOTEJPORZEBYLAPELNALUDZINIEZNAJOMYNIEWSZEDLDOSTAREGONARAKORTUPOCIAGNALKONIADALEJWDOLULICZKITAMBYLADRUGAKARCZMAMNIEJSZANAZYWALASIEPODLISEMTUBYLOPUSTOKARCZMANIEMIALANAJLEPSZEJSLAWY |
Pełny kod 4.1-4.4 – implementacja w python, C++ i java
Implementacja – Python
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | with open("instrukcje.txt", "r") as plik: linie = plik.readlines() for i in range(len(linie)): linie[i] = linie[i].rstrip() bilans = 0 for napis in linie: if napis.find("DOPISZ") == 0: bilans += 1 elif napis.find("USUN") == 0: bilans -= 1 print(bilans) tmp = linie[0] pierwsza = tmp[:-2] licznik = 0 maks = 0 maksInstrukcja = "" for element in linie: if element[:-2] == pierwsza: licznik += 1 if licznik > maks: maks = licznik maksInstrukcja = pierwsza if element[:-2] != pierwsza: pierwsza = element[:-2] licznik = 1 print(maksInstrukcja, maks) litery = [0]*26 for element in linie: if element[:-2] == "DOPISZ": litery[ord(element[-1])-ord("A")] += 1 maks = max(litery) print(chr(litery.index(maks)+ord("A")), maks) lista = [] for polecenie in linie: if polecenie[:-2] == "DOPISZ": lista.append(polecenie[-1]) elif polecenie[:-2] == "ZMIEN": lista.pop() lista.append(polecenie[-1]) elif polecenie[:-2] == "USUN": lista.pop() elif polecenie[:-2] == "PRZESUN": indeks = lista.index(polecenie[-1]) if ord(lista[indeks]) + 1 > ord("Z"): lista[indeks] = "A" else: lista[indeks] = chr(ord(lista[indeks]) + 1) print(*lista,sep="") |
Implementacja – 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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <iostream> #include <fstream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { ifstream plik("instrukcje.txt"); vector<string> linie; string line; // Wczytanie wszystkich linii z pliku while (getline(plik, line)) { line.erase(line.find_last_not_of(" \n\r\t") + 1); // Usuwanie białych znaków na końcu linie.push_back(line); } // Bilans int bilans = 0; for (const auto& napis : linie) { if (napis.find("DOPISZ") == 0) { bilans += 1; } else if (napis.find("USUN") == 0) { bilans -= 1; } } cout << bilans << endl; // Maksymalna liczba wystąpień instrukcji string pierwsza = linie[0].substr(0, linie[0].size() - 2); int licznik = 0, maks = 0; string maksInstrukcja = ""; for (const auto& element : linie) { if (element.substr(0, element.size() - 2) == pierwsza) { licznik++; } if (licznik > maks) { maks = licznik; maksInstrukcja = pierwsza; } if (element.substr(0, element.size() - 2) != pierwsza) { pierwsza = element.substr(0, element.size() - 2); licznik = 1; } } cout << maksInstrukcja << " " << maks << endl; // Liczenie liter vector<int> litery(26, 0); for (const auto& element : linie) { if (element.substr(0, element.size() - 2) == "DOPISZ") { litery[element[element.size() - 1] - 'A'] += 1; } } int maksLitera = *max_element(litery.begin(), litery.end()); char maksChar = 'A' + distance(litery.begin(), find(litery.begin(), litery.end(), maksLitera)); cout << maksChar << " " << maksLitera << endl; // Lista vector<char> lista; for (const auto& polecenie : linie) { if (polecenie.substr(0, polecenie.size() - 2) == "DOPISZ") { lista.push_back(polecenie.back()); } else if (polecenie.substr(0, polecenie.size() - 2) == "ZMIEN") { lista.pop_back(); lista.push_back(polecenie.back()); } else if (polecenie.substr(0, polecenie.size() - 2) == "USUN") { lista.pop_back(); } else if (polecenie.substr(0, polecenie.size() - 2) == "PRZESUN") { auto it = find(lista.begin(), lista.end(), polecenie.back()); if (it != lista.end()) { if (*it == 'Z') { *it = 'A'; } else { (*it)++; } } } } for (const char& c : lista) { cout << c; } cout << endl; return 0; } |
Implementacja – Java
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("instrukcje.txt")); List<String> linie = new ArrayList<>(); String line; // Wczytanie wszystkich linii z pliku while ((line = br.readLine()) != null) { line = line.trim(); // Usuwanie białych znaków na końcu linie.add(line); } // Bilans int bilans = 0; for (String napis : linie) { if (napis.startsWith("DOPISZ")) { bilans += 1; } else if (napis.startsWith("USUN")) { bilans -= 1; } } System.out.println(bilans); // Maksymalna liczba wystąpień instrukcji String pierwsza = linie.get(0).substring(0, linie.get(0).length() - 2); int licznik = 0, maks = 0; String maksInstrukcja = ""; for (String element : linie) { if (element.substring(0, element.length() - 2).equals(pierwsza)) { licznik++; } if (licznik > maks) { maks = licznik; maksInstrukcja = pierwsza; } if (!element.substring(0, element.length() - 2).equals(pierwsza)) { pierwsza = element.substring(0, element.length() - 2); licznik = 1; } } System.out.println(maksInstrukcja + " " + maks); // Liczenie liter int[] litery = new int[26]; for (String element : linie) { if (element.substring(0, element.length() - 2).equals("DOPISZ")) { char letter = element.charAt(element.length() - 1); litery[letter - 'A']++; } } int maksLitera = 0; for (int i = 1; i < litery.length; i++) { if (litery[i] > litery[maksLitera]) { maksLitera = i; } } System.out.println((char) (maksLitera + 'A') + " " + litery[maksLitera]); // Lista List<Character> lista = new ArrayList<>(); for (String polecenie : linie) { if (polecenie.substring(0, polecenie.length() - 2).equals("DOPISZ")) { lista.add(polecenie.charAt(polecenie.length() - 1)); } else if (polecenie.substring(0, polecenie.length() - 2).equals("ZMIEN")) { lista.remove(lista.size() - 1); lista.add(polecenie.charAt(polecenie.length() - 1)); } else if (polecenie.substring(0, polecenie.length() - 2).equals("USUN")) { lista.remove(lista.size() - 1); } else if (polecenie.substring(0, polecenie.length() - 2).equals("PRZESUN")) { char znak = polecenie.charAt(polecenie.length() - 1); int indeks = lista.indexOf(znak); if (indeks != -1) { if (lista.get(indeks) == 'Z') { lista.set(indeks, 'A'); } else { lista.set(indeks, (char) (lista.get(indeks) + 1)); } } } } for (char c : lista) { System.out.print(c); } System.out.println(); } } |
Rozwiązanie:
517
ZMIEN 7
Z 37
| POZNIEJMOWIONOZECZLOWIEKTENNADSZEDLODPOLNOCYODBRAMYPOWROZNICZEJSZEDLPIESZOAOBJUCZONEGOKONIAPROWADZILZAUZDEBYLOPOZNEPOPOLUDNIEIKRAMYPOWROZNIKOWIRYMARZYBYLYJUZZAMKNIETEAULICZKAPUSTABYLOCIEPLOACZLOWIEKTENMIALNASOBIECZARNYPLASZCZNARZUCONYNARAMIONAZWRACALUWAGEZATRZYMALSIEPRZEDGOSPODASTARYNARAKORTPOSTALCHWILEPOSLUCHALGWARUGLOSOWGOSPODAJAKZWYKLEOTEJPORZEBYLAPELNALUDZINIEZNAJOMYNIEWSZEDLDOSTAREGONARAKORTUPOCIAGNALKONIADALEJWDOLULICZKITAMBYLADRUGAKARCZMAMNIEJSZANAZYWALASIEPODLISEMTUBYLOPUSTOKARCZMANIEMIALANAJLEPSZEJSLAWY |
Zadanie 5 – Wodociągi

Import danych okazuje się standardowy, możesz przeczytać o nim w naszym artykule o imporcie danych Access/Excel. W moim przypadku KodKlienta został zaimportowany jako tekst, jednak jeśli u ciebie obcina początkowe zera, musisz zmienić typ pola na tekst ręcznie. Dobrym pomysłem może być dodanie kolumn numer klienta, liczba osób oraz kod miasta. Numer klienta otrzymamy funkcją LEWY([KodKlienta],5). Do uzyskania liczby osób możemy użyć funkcji FRAGMENT.TEKSTU([KodKlienta];6;2) i na koniec kod dzielnicy funkcją PRAWY([KodKlienta],3). Z tak przygotowanymi danymi szybko rozwiążemy zadanie.

Zadanie 5.1.

Na początek stwórzmy kolumnę z całkowitym zużyciem wody każdego klienta zwyczajnie sumując wszystkie miesiące. Zużycie wody na osobę możemy uzyskać po prostu dzieląc uzyskaną wartość na liczbę osób. Należy pamiętać o odpowiednim zaokrągleniu funkcją ZAOKR([liczba];2).

Teraz wystarczy utworzyć tabelę przestawną z całego zestawienia, dodając numery klientów do wierszy i zużycie wody na osobę jako wartość. Na koniec, aby otrzymać numery dziesięciu osób o największym zużyciu wody na osobę, wystarczy kliknąć PPM na którąś z wartości i wybrać Sortuj / Sortuj od największych do najmniejszych.

Rozwiązanie:
| Numer klienta | Zużycie wody na osobę w m3 |
| 07935 | 41,33 |
| 05080 | 40 |
| 00645 | 39,75 |
| 08090 | 39,5 |
| 05738 | 39,33 |
| 08349 | 39,2 |
| 08850 | 39 |
| 02202 | 38,25 |
| 09468 | 37,75 |
| 06866 | 36,75 |
Zadanie 5.2.

To zadanie jest prawie identyczne. Ponownie skorzystamy z kolumny całkowite zużycie wody dla każdego klienta. Następnie utworzymy tabelę przestawną do wierszy, dodając kod kolumny, a do wartości po prostu całkowite zużycie wody. Gdyby uzyskane wartości wyglądały na nierealistyczne należy upewnić się, że po kliknięciu prawego przycisku myszy i wybraniu Podsumuj wartości według, zaznaczona jest suma.

Rozwiązanie:
| Kod dzielnicy | Całkowite zużycie wody w m3 |
| BEM | 54080 |
| BIA | 61614 |
| BIE | 56368 |
| MOK | 55889 |
| OCH | 59273 |
| PRA | 57241 |
| REM | 58971 |
| SRO | 58124 |
| TAR | 60234 |
| URU | 59597 |
| URY | 50116 |
| WAW | 57674 |
| WES | 60372 |
| WIL | 55476 |
| WLO | 66372 |
| WOL | 60523 |
| ZOL | 62312 |
Zadanie 5.3.

Kolejny podpunkt podobny do poprzednich. Na podstawie danych tworzymy tabelę przestawną, do wierszy dodajemy kod dzielnicy, a do kolumn po kolei wszystkie miesiące. Tak uzyskaną tabele wystarczy użyć wspólnie z funkcją MAX() i gotowe.

Rozwiązanie:
| Kod dzielnicy | Maksymalne zużycie wody w miesiącu |
| BEM | 8108 |
| BIA | 9274 |
| BIE | 8475 |
| MOK | 8452 |
| OCH | 8861 |
| PRA | 8575 |
| REM | 8873 |
| SRO | 8776 |
| TAR | 9120 |
| URU | 8960 |
| URY | 7519 |
| WAW | 8699 |
| WES | 9050 |
| WIL | 8284 |
| WLO | 9966 |
| WOL | 9117 |
| ZOL | 9417 |
Zadanie 5.4.


W tym podpunkcie należy stworzyć trochę danych. Sumujemy każdy miesiąc (każdą kolumnę) i otrzymany wiersz oznaczamy jako 2019. Dalej następne wiersze oznaczamy kolejnymi latami aż do 2030.

Teraz miesiące kolejnych lat generujemy poprzez formułę ZAOKR.GORA([wartość z tego samego miesiąca, ale z zeszłego roku]+0,01*[wartość z tego samego miesiąca, ale z zeszłego roku];0).

Czy nie zabrakło wody można sprawdzić na wiele sposobów. Ja wybrałem sprawdzenie czy w roku występuje wartość większa od 160000, a jeśli tak, manualnie wyszukuje się miesiąc. Uważam że jest to najszybszy sposób przy tak małej tabeli. Formuła, której użyto to JEŻELI(MAX([tabela wartości dla miesięcy])>160000;1;0). Uzyskany wynik to lipiec 2026.

Dla uzyskanego zestawienia trzeba stworzyć jeszcze wykres. Zaznaczamy przekopiowane wartości i miesiące 2030 z etykietami, po czym z zakładki wstawianie wybieramy wykres liniowy. Jak zrobić wykres na maksymalną ilość punktów możesz przeczytać w artykule o wykresach w Excelu. Pamiętaj żeby wkleić zestawienie do pliku z odpowiedziami.

Uwaga: Ten wykres co prawda jest odrobinę nielogiczny (zamiast liniowego, bardziej pasowałby wykres kolumnowy, bo wartości między miesiącami nie mają tu znaczenia), jednak należy trzymać się tego rozwiązania, jeśli zadanie miałoby zostać zaliczone przez CKE.
Rozwiązanie:
lipiec 2026
| Rok | I | II | III | IV | V | VI | VII | VIII | IX | X | XI | XII |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2019 | 53545 | 53274 | 53195 | 85745 | 85627 | 117552 | 149526 | 117497 | 85623 | 85530 | 53516 | 53606 |
| 2020 | 54081 | 53807 | 53727 | 86603 | 86484 | 118728 | 151022 | 118672 | 86480 | 86386 | 54052 | 54143 |
| 2021 | 54622 | 54346 | 54265 | 87470 | 87349 | 119916 | 152533 | 119859 | 87345 | 87250 | 54593 | 54685 |
| 2022 | 55169 | 54890 | 54808 | 88345 | 88223 | 121116 | 154059 | 121058 | 88219 | 88123 | 55139 | 55232 |
| 2023 | 55721 | 55439 | 55357 | 89229 | 89106 | 122328 | 155600 | 122269 | 89102 | 89005 | 55691 | 55785 |
| 2024 | 56279 | 55994 | 55911 | 90122 | 89998 | 123552 | 157156 | 123492 | 89994 | 89896 | 56248 | 56343 |
| 2025 | 56842 | 56554 | 56471 | 91024 | 90898 | 124788 | 158728 | 124727 | 90894 | 90795 | 56811 | 56907 |
| 2026 | 57411 | 57120 | 57036 | 91935 | 91807 | 126036 | 160316 | 125975 | 91803 | 91703 | 57380 | 57477 |
| 2027 | 57986 | 57692 | 57607 | 92855 | 92726 | 127297 | 161920 | 127235 | 92722 | 92621 | 57954 | 58052 |
| 2028 | 58566 | 58269 | 58184 | 93784 | 93654 | 128570 | 163540 | 128508 | 93650 | 93548 | 58534 | 58633 |
| 2029 | 59152 | 58852 | 58766 | 94722 | 94591 | 129856 | 165176 | 129794 | 94587 | 94484 | 59120 | 59220 |
| 2030 | 59744 | 59441 | 59354 | 95670 | 95537 | 131155 | 166828 | 131092 | 95533 | 95429 | 59712 | 59813 |
Zadanie 5.5.

Zadanie 5.5 wymaga lekkiej modyfikacji poprzedniego podpunktu. Zamiast sprawdzać czy wartość przekroczyła 160000, sprawdzamy czy jest większa dla 160000+1000*([rok]-2020), można to łatwo wygenerować dane w excelu przez przeciąganie. Znaleziony wynik to lipiec 2035.

Rozwiązanie:
lipiec 2035
Zadanie 6 – Bitwa

Podczas importowania należy uważać na format daty oraz na dość niestandardowy klucz główny w tabeli klasy, który jest tekstem.

Zadanie 6.1.

Dodajemy tabele gracze. Również wstawiamy pola kraj oraz id_gracza. Aktywujemy sumy, a na id_gracza ustawiamy sumę Policz. Dodajemy nową kolumnę klikając prawy przycisk myszy (PPM) na puste pole i wybieramy konstruuj. W nowo dodanej kolumnie chcemy uzyskać rok z daty. Z pomocą przychodzi funkcja Year(), która pięknie wyjmuje rok z daty. Nasze wyrażenie to Year([Gracze].[data_dolaczenia]). Nakładamy kryterium na wyrażenie z wartością 2018, bo o taki rok pytają nas w zadaniu. Teraz wystarczy posortować malejąco biorąc pod uwagę id_gracza i przekopiować pierwsze 5 wierszy do pliku z odpowiedziami.

Implementacja – SQL
1 2 3 4 5 | SELECT Gracze.kraj, Count(Gracze.id_gracza) AS PoliczOfid_gracza FROM Gracze WHERE (((Year([Gracze].[data_dolaczenia]))=2018)) GROUP BY Gracze.kraj ORDER BY Count(Gracze.id_gracza) DESC; |
Rozwiązanie:
kraj liczba graczy
Polska 11
Stany Zjednoczone 8
Francja 7
Niemcy 6
Rosja 6
Zadanie 6.2.

Należy zauważyć, że chodzi tu konkretnie o podane sumy wartości wszystkich jednostek, które posiadają w ramach klasy część nazwy “elf”. Dodajemy tabele gracze, Jednostki oraz Klasy, po czym aktywujemy sumy. Z tabeli jednostki pobieramy kolumnę nazwa z kryterium Like “*elf*”. Z kolei z tabeli Klasy wyjmujemy pole strzal i zmieniamy sumę na Suma.

Implementacja – SQL
1 2 3 4 | SELECT Jednostki.nazwa, Sum(Klasy.strzal) AS SumaOfstrzal FROM Klasy INNER JOIN Jednostki ON Klasy.nazwa = Jednostki.nazwa GROUP BY Jednostki.nazwa HAVING (((Jednostki.nazwa) Like "*elf*")); |
Rozwiązanie:
nazwa suma
ciemny elf 555
elfi czarodziej 435
lesny elf 1815
wysoki elf-gwardzista 870
Zadanie 6.3.

Na początek warto stworzyć kwerendę pomocniczą, w której umieszczeni zostaną gracze posiadający przynajmniej jednego artylerzystę. Następnie wyświetlimy tylko graczy, których nie ma w tej tabeli.
Kwerendę pomocnicza tworzymy poprzez wyciągnięcie wszystkich tabel, włączenie sum i dodanie kolumn Gracze.id_gracza oraz Klasy.nazwa z suma Gdzie, a także z kryterium “artylerzysta”.
Główna kwerenda wymaga użycia tabeli Gracze oraz naszej kwerendy pomocniczej. Po dodaniu danych i stworzeniu relacji między Gracze.id_gracza i pomocnicza.id_gracza, trzeba zmienić typ relacji na taki, który uwzględnia wszystkie rekordy z tabeli Gracze. Można to zmienić klikając prawym przyciskiem myszy na połączenie i wybierając właściwości sprzężenia. Teraz pobieramy pola Gracze.id_gracza oraz pomocnicza.id_gracza z kryterium Is Null (jeśli uwzględnimy wszystkie rekordy z tabeli gracze to wartości odpowiadające im w kwerendzie pomocniczej, będą miały wartość null, jeśli nie ma podanego id_gracza w kwerendzie pomocniczej).

Implementacja – SQL
1 2 3 4 | SELECT Gracze.id_gracza FROM Klasy INNER JOIN (Gracze INNER JOIN Jednostki ON Gracze.id_gracza = Jednostki.id_gracza) ON Klasy.nazwa = Jednostki.nazwa WHERE (((Klasy.nazwa)="artylerzysta")) GROUP BY Gracze.id_gracza; |

Implementacja – SQL
1 2 3 | SELECT Gracze.id_gracza, [3 pom].id_gracza FROM Gracze LEFT JOIN [3 pom] ON Gracze.id_gracza = [3 pom].id_gracza WHERE ((([3 pom].id_gracza) Is Null)); |
Rozwiązanie:
22
24
29
35
36
37
38
47
54
61
64
72
110
114
115
122
123
138
141
167
Zadanie 6.4.

Do tego podpunktu użyjemy dwóch kwerend. Najpierw takiej, która sprawdzi czy dana jednostka może dotrzeć do bramy i drugiej która stworzy zestawienie.
Pierwsza kwerenda:
Dodajemy tabelę Jednostki oraz Klasy i wybieramy kolumnę Jednostki.nazwa. Następnie dodajemy nową kolumnę klikając PPM / konstruuj. Teraz w zasadzie przepisujemy lekko zmodyfikowaną formułę z polecenia. Funkcja IIf sprawdza czy warunek jest spełniony, a warunek to:

Implementacja – SQL
1 2 | SELECT Jednostki.nazwa, IIf(Abs(100-[Jednostki].[lok_x])+Abs(100-[Jednostki].[lok_y])<=[Klasy].[szybkosc],1,0) AS Wyr1 FROM Klasy INNER JOIN Jednostki ON Klasy.nazwa = Jednostki.nazwa; |
Teraz tworzymy nową kwerendę, która wykorzystuje tabelę Klasy oraz nowo utworzoną kwerendę pomocniczą. Wyjmujemy pole Klasy.nazwa oraz pomocnicza.wyrazenie, należy też włączyć sumy i zmienić sumę na polu kwerendy na suma lub policz, ale w przypadku policz trzeba tworzyć dodatkowe warunki używając sumy gdzie.

Implementacja – SQL
1 2 3 | SELECT Klasy.nazwa, Sum([4 pom].Wyr1) AS SumaOfWyr1 FROM Klasy INNER JOIN [4 pom] ON Klasy.nazwa = [4 pom].nazwa GROUP BY Klasy.nazwa; |
Rozwiązanie:
nazwa SumaOfWyr1
architekt 1
artylerzysta 4
balista 2
ciemny elf 1
drwal 3
elfi czarodziej 1
goniec 2
ifryt 1
kaplan 2
katapulta 0
kawalerzysta 7
konny lucznik 4
kusznik 1
lekki jezdziec 19
lesny elf 0
lucznik 1
mag ognia 0
mag powietrza 3
mag wody 2
mag ziemi 0
paladyn 1
piechur 7
pikinier 5
robotnik 5
smok 0
szpieg 0
topornik 5
troll 0
wysoki elf-gwardzista 1
zwiadowca 4
Zadanie 6.5.

Najpierw stwórzmy kwerendę, która zwróci wszystkie bitwy. Najlepiej podejść tu od strony lokalizacji, ponieważ ustalając bitwy dla jednostek będą one liczone po kilka razy dla jednego pola, a w poleceniu jest napisane, że na polu może być tylko jedna bitwa. Poza tym jest to prostsze. Użyjemy kwerendy pomocniczej, która usunie przypadki gdzie jednostki tylko jednego gracza znajdują się na danym polu. Do nowej kwerendy dodajemy tabelę Jednostki i wybieram pola lok_x, lok_y i id_gracza. Na koniec włączamy sumy. Suma grupuj według pięknie łączy ze sobą zduplikowane id_gracza.

Implementacja – SQL
1 2 3 | SELECT Jednostki.lok_x, Jednostki.lok_y, Jednostki.id_gracza FROM Jednostki GROUP BY Jednostki.lok_x, Jednostki.lok_y, Jednostki.id_gracza; |
Główna kwerenda wykorzystuje tylko poprzednia kwerendę i wykorzystuje wszystkie jej pola. Trzeba tylko włączyć sumy i zmienić sumę na Policz w przypadku id_gracza oraz dać na nią filtr >1. Ta kwerenda po prostu liczy jednostki na każdym polu i wyświetla dane pole, jeśli są na nim przynajmniej 2 jednostki – co oznacza że jest na nim bitwa.

Implementacja – SQL
1 2 3 4 | SELECT [5 pom].lok_x, [5 pom].lok_y, Count([5 pom].id_gracza) AS PoliczOfid_gracza FROM [5 pom] GROUP BY [5 pom].lok_x, [5 pom].lok_y HAVING (((Count([5 pom].id_gracza))>1)); |
Wynik można uzyskać poprzez kliknięcie widok arkusza danych w prawym dolnym rogu i przeczytanie po lewej liczby wierszy. Gdyby nie było tam liczby, należy zjechać na sam dół.
Sprawdzenie w których bitwach brali udział Polacy wygląda podobnie. Znowu tworzymy kwerendę pomocniczą jednak zamiast id_gracza wybieramy kraj z filtrem “Polska”. Uzyskaliśmy właśnie lokalizację pól na których znajduje się przynajmniej jedna jednostka należąca do Polaków.

Implementacja – SQL
1 2 3 4 | SELECT Jednostki.lok_x, Jednostki.lok_y, Gracze.kraj FROM Gracze INNER JOIN Jednostki ON Gracze.id_gracza = Jednostki.id_gracza GROUP BY Jednostki.lok_x, Jednostki.lok_y, Gracze.kraj HAVING (((Gracze.kraj)="Polska")); |
Wystarczy stworzyć nową kwerendę z dodanym zapytaniem liczącą bitwy i dodaną tabelą pól z jednostkami Polaków. Teraz należy utworzyć relację między lok_x i lok_y, żeby uzyskać ostateczny wynik.

Implementacja – SQL
1 2 | SELECT [5].lok_x, [5].lok_y FROM [5 pom polacy] INNER JOIN 5 ON ([5 pom polacy].lok_x = [5].lok_x) AND ([5 pom polacy].lok_y = [5].lok_y); |
Domyślnie relacja wyświetla wartości które istnieją i są sobie równe w obydwu tabelach. W tym przypadku wynikiem są pola bitew z kwerendy, która ma wszystkie bitwy, ale “przefiltrowane” przez lokalizację polskich jednostek. Odpowiedź znajdziemy tak samo jak ostatnio.
Rozwiązanie:
a) 1061
b) 245
Wpisy, które mogą Cię zainteresować:


