W budowie
← Wróć na pulpit Materiał edukacyjny · Informatyka

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

BlokModułyTematyCo ćwiczysz
I. Konstrukcja funkcji1–3Sygnatura, parametry, return; Kontrakt i przypadki brzegowe; Deklaracja, definicja i współpraca funkcjiCzytanie i pisanie prostych funkcji; Precyzowanie zachowania oraz testowanie granic; Rozbijanie prostego problemu na funkcje
II. Argumenty i kolekcje4–6Przekazywanie przez wartość i const T&; T& i parametry wyjściowe; Funkcje pracujące na wektorachKopia, referencja i odczyt bez kopiowania; Kontrolowana modyfikacja argumentów; Odczyt, transformacja i zwracanie kolekcji
III. Algorytmiczne wykorzystanie funkcji7–9Funkcje 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

  1. Przeczytaj teorię z jednego modułu — powinna zająć kilka minut.
  2. Rozwiąż zadania bez zaglądania do gotowych implementacji. W kursie nie podajemy rozwiązań w starterach.
  3. Uruchom testy publiczne, a potem popraw rozwiązanie na podstawie komunikatów.
  4. 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

Jak działa ocenianie

  1. 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”.
  2. Punkty są naliczane dopiero po świadomym wysłaniu zgłoszenia. Samo otwarcie edytora, zapis startera, kompilacja ani uruchomienie przykładu nie zwiększają wyniku.
  3. 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”.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.