KURS PROGRAMOWANIA — FUNKCJE W C++
Funkcje w C++
Kurs uczy wykorzystywać funkcje do rozwiązywania zadań programistycznych: dobierać sygnatury, zwracać wyniki, przekazywać argumenty, dzielić rozwiązanie na mniejsze części, pisać rekurencję i oceniać koszt obliczeń. To kurs o funkcjach, a nie kompletny kurs C++ ani pełny kurs przygotowujący do matury lub olimpiady.
Mapa kursu
| Blok | Moduły | Tematy | Co ćwiczysz |
|---|---|---|---|
| I. Konstrukcja funkcji | 1–3 | Sygnatura, parametry, return; Kontrakt i przypadki brzegowe; Deklaracja, definicja i współpraca funkcji | Czytanie i pisanie prostych funkcji; Precyzowanie zachowania oraz testowanie granic; Rozbijanie prostego problemu na funkcje |
| II. Argumenty i kolekcje | 4–6 | Przekazywanie przez wartość i const T&; T& i parametry wyjściowe; Funkcje pracujące na wektorach | Kopia, referencja i odczyt bez kopiowania; Kontrolowana modyfikacja argumentów; Odczyt, transformacja i zwracanie kolekcji |
| III. Algorytmiczne wykorzystanie funkcji | 7–9 | Funkcje pomocnicze i podział problemu; Rekurencja; Złożoność i zadania integrujące | Łączenie małych funkcji w rozwiązanie; Warunek bazowy, postęp i rekurencyjne podproblemy; Dobór algorytmu oraz testowanie większych danych |
Jak przechodzić kurs
- Przeczytaj teorię z jednego modułu — powinna zająć kilka minut.
- Rozwiąż zadania bez zaglądania do gotowych implementacji. W kursie nie podajemy rozwiązań w starterach.
- Uruchom testy publiczne, a potem popraw rozwiązanie na podstawie komunikatów.
- Do kolejnego bloku przejdź po sprawdzianie. Gdy błąd dotyczy kontraktu lub przypadku brzegowego, wróć do konkretnego ćwiczenia, a nie do całego kursu.
Zanim zaczniesz
Uczeń powinien już znać typy int, long long, bool, char, double, instrukcje if, for, while, operatory, podstawy std::string i std::vector, indeksowanie oraz kompilowanie prostego programu. Ten materiał nie uczy od zera składni C++.
Platformowe ćwiczenia funkcjonalne domyślnie wymagają implementacji samej funkcji, bez main(). Wyjątek stanowi zadanie oznaczone wyraźnie jako zadanie architektoniczne z deklaracją przed main() i definicją poniżej. W kodzie platformy należy wtedy użyć odrębnego trybu oceny pełnego programu.
Moduły
- 01Sygnatura, parametry i wynik funkcjiFunkcja składa się z typu zwracanego, nazwy, listy parametrów i ciała.
- 02Kontrakt i przypadki brzegoweKontrakt funkcji opisuje, jakie dane funkcja przyjmuje, jaki wynik ma zwrócić i jakie warunki obowiązują.
- 03Deklaracja, definicja i współpraca funkcjiDeklaracja mówi kompilatorowi, jak funkcję wywołać.
- 04Przekazywanie przez wartość i const T&Przekazanie przez wartość tworzy parametr będący kopią argumentu.
- 05Modyfikowalna referencja T& i parametry wyjścioweParametr T& jest referencją do obiektu wywołującego.
- 06Funkcje operujące na wektorachW funkcjach przyjmujących wektor rozróżniaj trzy role:…
- 07Funkcje pomocnicze i dzielenie problemuFunkcja pomocnicza powinna wykonywać jedną dobrze określoną czynność.
- 08Rekurencja krok po krokuRekurencja występuje, gdy funkcja rozwiązuje problem przez wywołanie samej siebie dla mniejszego podproblemu.
- 09Złożoność i zadania integrująceTestowanie poprawności i analiza złożoności to dwie różne rzeczy.
- 10Zadania z arkuszy (vilospraw)Rekurencyjne mnożenie liczone tylko dodawaniem, śledzenie parametrów przekazywanych przez referencję oraz tablice jako parametr — 11 zadań z arkuszy powtórkowych, wszystko w Pracowni C++
Jak działa ocenianie
- Starter nigdy nie jest traktowany jako rozwiązanie. Po otwarciu zadania uczeń nie otrzymuje punktów ani zaliczenia. Interfejs powinien rozróżniać stan „nieoddane” od „oddano i uzyskano 0 pkt”.
- Punkty są naliczane dopiero po świadomym wysłaniu zgłoszenia. Samo otwarcie edytora, zapis startera, kompilacja ani uruchomienie przykładu nie zwiększają wyniku.
- W każdym zadaniu maksymalnie 3 pkt. Każde z trzech kryteriów musi mieć własne testy lub wiarygodną kontrolę strukturalną. Nie przyznawaj punktów za ogólne wrażenie, że kod „wygląda poprawnie”.
- Błąd kompilacji oznacza 0 pkt za dane zgłoszenie. Punktów cząstkowych nie da się wiarygodnie przypisać, jeśli nie można uruchomić implementacji. Błąd kompilacji nie powinien jednak blokować ponownego zgłoszenia po poprawce.
- Po kompilacji oceniaj kryteria oddzielnie. Każdy test uruchamiaj w izolacji i przechwytuj wyjątki. Jeśli test jednego kryterium się nie powiedzie, nie powinien uniemożliwiać sprawdzenia pozostałych kryteriów. Niezaliczone testy nie dają punktów.
- Sygnatura jest warunkiem interfejsu, nie darmowym punktem. Jej niezgodność może uniemożliwić kompilację lub zaliczenie odpowiedniego kryterium, ale sama poprawna nazwa funkcji nie daje punktów za jej działanie.
- Wymogi strukturalne punktuj tylko wtedy, gdy są wprost podane w zadaniu. Jeśli zadanie wymaga rekurencji albo użycia funkcji pomocniczej, przyznaj za to najwyżej punkt określony w kryteriach i sprawdź strukturę rzeczywistego programu. Nie wymagaj konkretnego zapisu, gdy dopuszczono różne równoważne implementacje.
- Nie oceniaj tylko przykładów widocznych w poleceniu. Dodaj testy ukryte obejmujące wartości brzegowe, dane o innym układzie oraz większy rozmiar, jeśli zadanie ma kryterium wydajnościowe.
- Każde zgłoszenie uruchamiaj w czystym środowisku. Zresetuj stan procesu między niezależnymi testami. Wyjątkiem są specjalne zadania, w których kolejność wywołań jest częścią kontraktu.
- Nie przyznawaj punktu za kryterium wydajnościowe wyłącznie na podstawie małego testu. Użyj testów odpowiednio dużych, limitu czasu oraz — jeśli zadanie ma narzucać konkretną metodę — wiarygodnej analizy struktury.
Wzorzec startera
Starter powinien zawierać sygnaturę, ewentualne niezbędne nagłówki i wyraźny znacznik nieukończonej implementacji. Nie może zwracać 0, false, pustego wektora ani innej wartości domyślnej, która przechodzi część testów.
#include <stdexcept>
int znak(long long x) {
(void)x; // pozwala uniknąć ostrzeżenia o nieużywanym parametrze
throw std::logic_error("TODO: zaimplementuj funkcję znak");
}
Dla funkcji void również można rzucić wyjątek std::logic_error. W zadaniach z kilkoma funkcjami każda niezaimplementowana funkcja powinna mieć taki znacznik. Harness testowy powinien przechwycić wyjątek w ramach konkretnego testu, oznaczyć go jako niezaliczony i kontynuować pozostałe testy.
W zadaniu pełnoprogramowym z modułu 3.3 starter może zawierać gotowy main() i odczyt wejścia, ale ciało funkcji oblicz musi być niezrealizowane i nie może dawać przypadkowo poprawnych wyników. Sekcje dostarczane przez platformę należy jasno oznaczyć jako zablokowane, by uczeń wiedział, co ma napisać.
Czego ten kurs nie zastępuje
Ten kurs porządkuje umiejętność projektowania i używania funkcji. Nie wystarczy samodzielnie do pełnego przygotowania do matury rozszerzonej z informatyki ani do konkursów i olimpiad algorytmicznych. W zależności od wymagań egzaminu lub etapu zawodów potrzebne są również osobne moduły dotyczące m.in.:
- podstawowych algorytmów: sortowanie, wyszukiwanie, algorytmy liczbowe i tekstowe;
- dowodzenia poprawności i niezmienników pętli;
- analizy złożoności czasowej i pamięciowej oraz doboru algorytmu do ograniczeń;
- stosów, kolejek, kolejek priorytetowych, map i zbiorów;
- grafów i algorytmów grafowych;
- zachłanności, dziel i zwyciężaj, przeszukiwania z powrotem i programowania dynamicznego;
- pracy z plikami, danymi oraz innymi narzędziami wymaganymi w aktualnym informatorze CKE;
- rozwiązywania pełnych arkuszy i zadań konkursowych w limicie czasu.