Zadania
Blok 7, rozgrzewka 1 — znajdź błędy
Section titled “Blok 7, rozgrzewka 1 — znajdź błędy”Strona schroniska „Łapka” prawie działa. W dwóch plikach jest 8 błędów. Każdy z nich ktoś z Was kiedyś zrobił.
- Rozpakuj schronisko-starter-7.zip do folderu
nazwisko_imie_blok7whtdocs: małe litery, bez polskich znaków. - Popraw błędy w
index.phpistyl.css. Niczego nie dopisuj od zera, popraw to, co jest. - Przy każdej poprawce dopisz komentarz
// BŁĄD 1: …(w CSS/* BŁĄD 1: … */): co było źle i jak to zauważyłeś.
Jak strona ma działać
Section titled “Jak strona ma działać”| Element | Poprawnie |
|---|---|
| Wygląd | arkusz stylów styl.css działa w całości; wiersze psów w wieku 10 lat i więcej mają tło |
| Linki „Wszystkie”, „Małe”, „Duże” | każdy jest klikalny; „Małe” pokazuje tylko małe psy, „Duże” tylko duże, „Wszystkie” wszystkie |
| Wejście na stronę | bez żadnego ostrzeżenia PHP |
<tfoot> |
liczba psów widocznych w tabeli |
| Formularz | imię niepuste, wiek liczba całkowita od 0 do 20, rozmiar z listy |
| Złe dane | pies nie trafia do tabeli, nad formularzem widać komunikat |
| Dobre dane | psa widać w tabeli |
Sprawdź
Section titled “Sprawdź”- Wejście bez parametrów → 6 psów, dwa wiersze z tłem.
- „Duże” → 4 psy, „Małe” → 2.
- Burek, 0 lat, mały → 7 psów, bez komunikatu. To samo dla 20 lat.
- Puste imię, wiek
21,abc,-1→ 6 psów i komunikat.
Podpowiedzi
Section titled “Podpowiedzi”- Najpierw F12: konsola, zakładka Sieć (czy arkusz stylów się wczytał?) i Elements.
- Ostrzeżenie PHP podaje numer linii. Zacznij od niej.
- Zanim coś zmienisz, przewidź, co się zmieni na stronie. Potem sprawdź.
Oddanie
Section titled “Oddanie”Folder nazwisko_imie_blok7 z index.php i styl.css.
Blok 7, rozgrzewka 2 — kod → zadanie
Section titled “Blok 7, rozgrzewka 2 — kod → zadanie”Zwykle dostajesz treść i piszesz kod. Teraz odwrotnie: masz gotowy kod, napisz do niego treść.
- Rozpakuj kino-7.zip i uruchom stronę. Pobaw się formularzem.
- Przeczytaj kod i napisz treść zadania, którego rozwiązaniem jest ten plik. Pisz tak, jak wygląda arkusz egzaminacyjny: co jest w formularzu, co robi skrypt, jakie są komunikaty.
- Treść ma być na tyle dokładna, żeby ktoś, kto kodu nie widział, napisał stronę liczącą dokładnie te same kwoty.
Sprawdź
Section titled “Sprawdź”Weź swoją treść i dwa zestawy biletów. Policz kwotę z samej treści, potem w przeglądarce. Wynik ma się zgadzać.
Oddanie
Section titled “Oddanie”Plik nazwisko_imie_kino_blok7.txt.
Blok 5 — egzamin próbny INF.03
Section titled “Blok 5 — egzamin próbny INF.03”Dziś rozwiązujesz prawdziwy arkusz INF.03 z czerwca 2026 (zadanie 02, „Wodospady”) w 150 minut. Nie ma punktów ani oceny. Wynik dostajesz osobno dla każdej części arkusza.
- Pobierz pliki2.zip od razu na początku i rozpakuj. W środku są baza
baza2.sql, zdjęcia i arkuszarkusz.pdf. To zwykły zip, więc hasło z arkusza pomiń. - Utwórz folder
nazwisko_imie_blok5zamiast folderu z numerem PESEL. W stopce strony wpisz imię i nazwisko zamiast numeru zdającego. - Przeczytaj arkusz w 10 minut, potem pracuj 150 minut, bez AI i bez internetu. O pomoc możesz pytać prowadzącego i kolegów.
Oddanie
Section titled “Oddanie”Folder nazwisko_imie_blok5 ze wszystkimi plikami z arkusza. Spakuj go zipem i wyślij na Teams, obie grupy tak samo.
Blok 4, zadanie A — dodaj okrążenie, ale bezpiecznie
Section titled “Blok 4, zadanie A — dodaj okrążenie, ale bezpiecznie”Formularz z bloku 3 przyjmował wszystko. Dziś PHP najpierw sprawdza dane.
- Rozpakuj zawody-starter-4.zip do
htdocs. Nazwij pliknazwisko_imie_blok4.php: małe litery, bez polskich znaków. - Dopisz obsługę formularza w sekcji
// ===== OBSŁUGA FORMULARZA =====. Sekcja zostaje nad liczeniem wyników. - Obsługa działa tylko po wysłaniu formularza:
$_SERVER['REQUEST_METHOD'] === 'POST'. - Sprawdź każde pole. Każda reguła ma własny komunikat w
$blad.
| Pole | Poprawne, gdy |
|---|---|
zawodnik |
liczba całkowita, numer zawodnika z tablicy $zawodnicy |
czas |
liczba całkowita od 60 do 900 |
kary |
liczba całkowita od 0 do 10 |
Zły wpis: okrążenie się nie dodaje, nad formularzem widać komunikat. Dobry wpis: okrążenie widać w tabeli, w liczniku elity i w <tfoot>.
Sprawdź
Section titled “Sprawdź”- Fijałek, 250 s, 0 kar → 12 okrążeń, 3 zawodników w elicie.
- Czas
abc, puste pole,30,1000→ 11 okrążeń i komunikat. - Kary
-1,11→ 11 okrążeń i komunikat. - Zawodnik
7alboabc(zmieńvalueopcji w F12) → 11 okrążeń i komunikat.
Dodatkowo
Section titled “Dodatkowo”Usuń w F12 pole czasu i wyślij. Strona ma pokazać komunikat, a nie ostrzeżenie PHP.
Podpowiedzi
Section titled “Podpowiedzi”- Wszystko w
$_POSTjest napisem, także z polatype="number". ctype_digit($tekst)sprawdza, czy napis to same cyfry. Odrzucaabc, puste pole,-1i2.5.(int)niczego nie sprawdza: z"abc"robi0. Najpierwctype_digit, potem(int).isset($zawodnicy[$nr])mówi, czy jest taki zawodnik.isset($_POST['czas'])mówi, czy pole przyszło.
Oddanie
Section titled “Oddanie”Plik nazwisko_imie_blok4.php. Przed wysłaniem odśwież stronę i wyślij raz dobre, raz złe okrążenie.
Blok 4, zadanie B — okrążenia z bazy
Section titled “Blok 4, zadanie B — okrążenia z bazy”W zadaniu A okrążenie znika po odświeżeniu. Tu trafia do wspólnej bazy, więc zostaje i widzi je cała sala.
- Skopiuj plik z A jako
nazwisko_imie_baza_blok4.php. Pracuj na kopii. - Pod
<?phpwklej połączenie. Host i hasło są na tablicy.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);$db = mysqli_connect('HOST', 'zs1', 'HASŁO', 'zawody');mysqli_set_charset($db, 'utf8mb4');- Usuń tablicę
$zawodnicyz kodu. Zbuduj ją z dwóchSELECT-ów, w tym samym kształcie co w A. - Dobre okrążenie zapisz do bazy i od razu przekieruj. Do zapytania wstawiasz tylko liczby po walidacji i
(int).
mysqli_query($db, "INSERT INTO okrazenia (zawodnik_id, czas, kary) VALUES ($nr, $czas, $kary)");header('Location: ' . $_SERVER['PHP_SELF']);exit;| Tabela | Kolumny |
|---|---|
zawodnicy |
id (0–4, jak numery w tablicy), nazwa |
okrazenia |
id, zawodnik_id, czas, kary, dodano (wpisuje się samo) |
Kolejność w pliku: połączenie → SELECT zawodników → obsługa formularza → SELECT okrążeń → liczenie → HTML.
Sprawdź
Section titled “Sprawdź”- Zanim ktoś doda okrążenie, strona wygląda jak w A. Inna liczba znaczy zły kształt tablicy.
- Dodaj okrążenie i wciśnij F5. Ma być jedno nowe okrążenie, bez pytania przeglądarki.
- Sąsiad widzi Twoje okrążenie u siebie. Liczby rosną też od okrążeń innych osób.
Pod tabelą 5 ostatnich okrążeń, od najnowszego: ORDER BY dodano DESC, id DESC LIMIT 5.
Podpowiedzi
Section titled “Podpowiedzi”mysqli_fetch_assoc($wynik)w pętliwhiledaje kolejne wiersze jako tablice.- W bazie kolumna to
nazwa, w tablicy klucz to'nazwisko'. - Liczby z bazy przychodzą jako napisy. Dodaj
(int). headerdziała, zanim strona coś wypisze. Przed<?phpnie może być nawet spacji.
Oddanie
Section titled “Oddanie”Plik nazwisko_imie_baza_blok4.php, bez punktów.
Blok 3, zadanie A — zawody z karami
Section titled “Blok 3, zadanie A — zawody z karami”Zadanie ma dwa etapy. Najpierw piszesz funkcje z pustym ciałem, potem wycinasz z HTML-a kod, który się powtarza.
Starter: zawody-starter-3.zip, w środku index.php. Rozpakuj do htdocs i od razu zmień nazwę pliku na nazwisko_imie_blok3.php: małe litery, bez polskich znaków, na przykład kowalska_anna_blok3.php. Otwórz pod localhost/nazwisko_imie_blok3.php.
Strona działa od pierwszego otwarcia. Wszystkie czasy pokazują 0:00, a każdy zawodnik ma kategorię brak. Tak ma być na starcie. Twoja robota to sprawić, żeby tabela pokazywała prawdę.
Nowość w danych: okrążenie nie jest już samą liczbą sekund, tylko rekordem z dwoma kluczami: 'czas' i 'kary'. Jedna kara kosztuje 5 sekund. Wszystko, co tabela pokazuje, liczy się z czasem powiększonym o kary.
Etap 1: dwie funkcje z pustym ciałem
Section titled “Etap 1: dwie funkcje z pustym ciałem”Na górze pliku, w sekcji // ===== FUNKCJE =====, stoją dwie funkcje bez ciała. Napisz je.
| Funkcja | Co dostaje | Co ma zwrócić |
|---|---|---|
czasZKarami($okrazenie) |
jedno okrążenie, czyli rekord ['czas' => 300, 'kary' => 2] |
liczbę sekund razem z karami, tutaj 310 |
najlepsze($okrazenia) |
listę okrążeń jednego zawodnika | najkrótszy czas z karami, a dla pustej listy null |
Kolumny zapalają się po kolei. Jeśli po napisaniu funkcji coś dalej pokazuje 0:00, ta funkcja nie zwraca jeszcze tego, co powinna.
Uwaga na Fijałka: nie ma ani jednego okrążenia. Dlatego najlepsze([]) musi zwrócić null. Kiedy spróbujesz wybrać najmniejszą wartość z pustej listy, PHP nie ostrzeże, tylko wywali całą stronę. Przeczytaj ten błąd, zanim zapytasz.
Etap 2: ten sam kod stoi w pliku dwa razy
Section titled “Etap 2: ten sam kod stoi w pliku dwa razy”W HTML-u są dwa fragmenty napisane po dwa razy. Oba mają komentarz.
| Komentarz | Co ten kod robi | Gdzie stoi dwa razy |
|---|---|---|
POWTÓRKA A |
liczy średni czas z listy okrążeń | raz dla jednego zawodnika w wierszu, raz dla wszystkich okrążeń zawodów w <tfoot> |
POWTÓRKA B |
drabinka if, która z najlepszego czasu robi nazwę kategorii |
raz przy liczniku elity nad tabelą, raz w wierszu zawodnika |
Wytnij każdy z nich do funkcji. Nazwy są ustalone: srednia i kategoria. Co ma być parametrem, decydujesz sam, i to jest tu cała robota. Porównaj oba wystąpienia: różnica między nimi jest parametrem.
Test robisz sam: strona po Twojej zmianie ma wyglądać dokładnie tak samo jak przed nią. Refactor zmienia kod, nie wynik. Jeśli po wycięciu funkcji zmieniła się w tabeli jakakolwiek liczba, coś poszło nie tak.
Kolejność, która boli najmniej: napisz pustą funkcję, przenieś do niej kod z jednego miejsca, sprawdź stronę, dopiero potem podmień drugie.
Dodatkowo
Section titled “Dodatkowo”W pliku jest jeszcze trzecie powtórzenie, nieoznaczone. Robi dokładnie to samo, co jedna z Twoich gotowych funkcji. Znajdź je i zastąp wywołaniem.
Podpowiedzi
Section titled “Podpowiedzi”- Funkcje mieszkają na górze pliku, w sekcji
// ===== FUNKCJE =====. Nie w środku tabeli. - Funkcja bierze dane przez parametr. Jeśli działa tylko dlatego, że zna nazwę zmiennej z zewnątrz, masz parametr za mało.
count($tablica),round($liczba),implode(', ', $tablica).- Danych ani HTML-a nie ruszasz. Zmieniasz tylko kod PHP, który je liczy.
Oddanie
Section titled “Oddanie”Plik nazwisko_imie_blok3.php.
Nazwa jest częścią zadania, tak jak na egzaminie, gdzie arkusz mówi, jak ma się nazywać każdy plik. Zanim wyślesz, odśwież stronę i sprawdź, czy wstaje.
Blok 3, zadanie B — formularz
Section titled “Blok 3, zadanie B — formularz”Zanim ruszysz, zrób kopię swojego pliku pod nazwą nazwisko_imie_formularz_blok3.php i pracuj na kopii. Plik z zadania A zostaje nietknięty.
Nad tabelą dochodzi formularz, którym dodasz zawodnikowi okrążenie.
| Element | Co ma być |
|---|---|
<select name="zawodnik"> |
jedna opcja na zawodnika, value to jego numer w tablicy |
<input name="czas"> |
czas okrążenia w sekundach, type="number", required |
<input name="kary"> |
liczba kar, type="number", required, domyślnie 0 |
| przycisk | wysyła formularz |
Formularz ma method="post". Po wysłaniu PHP czyta $_POST i dokłada nowe okrążenie do tablicy, zanim cokolwiek policzy. Jeśli dołożysz je za późno, tabela pokaże nowy czas, ale podsumowanie i licznik elity go nie zobaczą.
Potem odśwież stronę. Okrążenie zniknie. Tak ma być: skrypt startuje od zera przy każdym żądaniu, a dane siedzą w kodzie. O tym, jak sprawić, żeby zostało, jest następny blok.
Drugi formularz, tym razem method="get", z jedną listą: pokaż tylko wybraną kategorię. Wyślij go i spójrz na pasek adresu, a zobaczysz tam swój wybór. Po formularzu POST pasek nie pokazuje nic. To jest cała różnica między jednym a drugim.
Oddanie zadania B
Section titled “Oddanie zadania B”Plik nazwisko_imie_formularz_blok3.php. Bez punktów — czytam go, żeby zobaczyć, czy formularze weszły.
Blok 2 — wyniki zawodów biegowych
Section titled “Blok 2 — wyniki zawodów biegowych”Starter: bieg-starter.zip (w środku index.php). Rozpakuj do htdocs, od razu zmień nazwę pliku na nazwisko_imie_blok2.php (małe litery, bez polskich znaków, np. kowalska_anna_blok2.php) i otwórz pod localhost/nazwisko_imie_blok2.php.
W pliku jest gotowa tablica $zawodnicy (nazwisko + lista czasów ukończonych okrążeń, w sekundach) i szkielet tabeli HTML z nagłówkiem. Twoja robota to <tbody> i <tfoot>. Danych nie zmieniasz.
Dla każdego zawodnika jeden wiersz tabeli
Section titled “Dla każdego zawodnika jeden wiersz tabeli”| Kolumna | Co ma być |
|---|---|
| Zawodnik | nazwisko z tablicy |
| Okrążenia | wszystkie czasy po przecinku, każdy w formacie m:ss (np. 312 → 5:12) |
| Najlepsze | najkrótsze okrążenie, m:ss |
| Średnie | średnia z okrążeń zaokrąglona do pełnych sekund, m:ss |
| Kategoria | najlepsze okrążenie poniżej 5:00 → elita, poniżej 6:00 → zaawansowany, inaczej amator |
| Uwagi | jeśli którekolwiek okrążenie trwało 7:00 lub dłużej → słabe okrążenie; jeśli wszystkie okrążenia mieszczą się w 15 sekundach od najlepszego → równe tempo |
Wiersz dostaje klasę CSS równą kategorii (class="elita" itd.) — style już są w <style>.
Uwaga na Zielińskiego: nie ma ani jednego ukończonego okrążenia. Dla niego w wierszu ma być tekst brak ukończonych okrążeń i przechodzisz dalej. Jeśli to przeoczysz, PHP nie da ostrzeżenia, tylko wywali całą stronę błędem. Przeczytaj ten błąd, zanim zapytasz.
Pod tabelą, w <tfoot>
Section titled “Pod tabelą, w <tfoot>”Ilu zawodników łącznie, ilu w kategorii elita, najlepsze okrążenie zawodów (najkrótsze ze wszystkich, m:ss) i ile okrążeń łącznie. Liczniki żyją poza pętlą i rosną w jej środku.
Podpowiedzi
Section titled “Podpowiedzi”m:ss: minuty tofloor($sekundy / 60), sekundy to$sekundy % 60, astr_pad($x, 2, '0', STR_PAD_LEFT)dokleja zero z przodu, żeby wyszło5:05, nie5:5.min($tablica),count($tablica),implode(', ', $tablica),round($liczba).- Zestaw danych jest dobrany tak, że każdy zawodnik wpada w inną gałąź. Jeśli dwa wiersze wyglądają tak samo, coś jest nie tak.
Druga część: funkcje
Section titled “Druga część: funkcje”Zanim ruszysz, zrób kopię pliku pod nazwą nazwisko_imie_funkcje_blok2.php i pracuj na kopii. Plik z pierwszej części zostaje nietknięty.
Oddanie
Section titled “Oddanie”Dwa pliki: nazwisko_imie_blok2.php i nazwisko_imie_funkcje_blok2.php. Grupa 1: do swojego repo z bloku 1, push. Grupa 2: na Teams.
Nazwa jest częścią zadania, tak jak na egzaminie, gdzie arkusz mówi, jak ma się nazywać każdy plik. Skrypt sprawdzający szuka pierwszego pliku po tej nazwie; plik nazwany inaczej dostaje najwyżej 1, nawet jeśli działa.
Blok 1 — strona o sobie
Section titled “Blok 1 — strona o sobie”Starter: pobierz o-mnie.html
Treść pliku jest już gotowa, ale kompletnie płaska — same linie tekstu, bez żadnych znaczników HTML. Zadanie: otaguj to (opis w Blok 1).