Funkcje w Python i C++ na Maturze z Informatyki
Funkcje to absolutna podstawa organizacji kodu. Pomyśl o nich jak o 'miniprogramach' lub 'przepisach', które możesz wielokrotnie wykorzystywać. Zamiast pisać 10 razy ten sam kod do obliczania NWD, piszesz go *raz* w funkcji `nwd(a, b)`, a potem po prostu ją wywołujesz. Funkcja to wydzielony blok kodu, który ma swoją nazwę, przyjmuje jakieś dane wejściowe (nazywane *parametrami*) i może (ale nie musi) zwrócić jakiś wynik (za pomocą słowa kluczowego `return`). Jest to najważniejsze narzędzie do dzielenia skomplikowanych problemów na mniejsze, zarządzalne kawałki. Zamiast jednego, gigantycznego skryptu, piszesz czytelny kod złożony z małych, logicznych funkcji: `wczytaj_dane()`, `przetworz_dane()`, `zapisz_wyniki()`.
Dlaczego to ważne? Na maturze czysty, podzielony na funkcje kod jest łatwiejszy do debugowania i pisania. Co ważniejsze, wiele zadań maturalnych (np. Matura 2024, Maj) wprost prosi o *napisanie funkcji* o określonej specyfikacji. Musisz biegle umieć definiować funkcje, przekazywać do nich argumenty i odbierać od nich wyniki za pomocą `return`. To klucz do modułowego i poprawnego rozwiązywania zadań.
Teoria
Funkcja to nazwany blok kodu, który wykonuje się tylko wtedy, gdy jest *wywołany*. Kapsułkuje logikę. Parametry to zmienne zadeklarowane w definicji funkcji (np. `def dodaj(a, b)`). Argumenty to konkretne wartości, które podajesz podczas wywołania (np. `dodaj(5, 3)`). Słowo kluczowe `return` natychmiast kończy działanie funkcji i odsyła wartość w miejsce wywołania.
Jak to działa?
- Krok 1: Definicja Funkcji. W Pythonie zaczynasz od `def nazwa_funkcji(parametr1, parametr2):`. W C++ musisz określić typ zwrotny: `typ_zwrotu nazwa_funkcji(typ1 parametr1) {}`.
- Krok 2: Parametry (Wejście). To zmienne 'wewnętrzne' funkcji. `a` i `b` w `def dodaj(a, b):` istnieją tylko wewnątrz tej funkcji.
- Krok 3: Ciało Funkcji. To wcięty blok kodu (Python) lub kod w nawiasach `{}` (C++), który wykonuje całą logikę.
- Krok 4: Zwracanie Wartości (Wyjście). `return x` wysyła wartość `x` na zewnątrz. Funkcja kończy działanie w tym momencie.
- Krok 5: Wywołanie Funkcji. Aby użyć funkcji, piszesz jej nazwę z argumentami w nawiasach, np. `wynik = dodaj(10, 20)`. Program 'wskakuje' do funkcji, wykonuje ją i 'wraca' z wartością.
- Krok 6: Funkcje `void` (Python: `None`). Funkcja, która nic nie zwraca (np. tylko coś wypisuje), w C++ ma typ `void`. W Pythonie taka funkcja automatycznie zwraca specjalną wartość `None`.
Złożoność: Nie dotyczy. Złożoność zależy od tego, co *robi* funkcja. Samo wywołanie funkcji ma pewien mały, stały narzut czasowy (O(1)), ale na maturze jest on pomijalny.
Implementacja
Definiowanie i zwracanie wartości (`return`)
Python# 1. Funkcja, która przyjmuje parametry i zwraca wartość
def dodaj(a, b):
suma = a + b
return suma
# Wywołanie funkcji
wynik_dodawania = dodaj(5, 3)
print(f"Wynik: {wynik_dodawania}") # Wynik: 8
# 2. Funkcja, która nic nie zwraca (zwraca None)
def powitaj(imie):
print(f"Cześć, {imie}!")
# Wywołanie funkcji
wynik_witania = powitaj("Anna")
print(f"Wynik funkcji 'powitaj': {wynik_witania}") # Cześć, Anna!
# Wynik funkcji 'powitaj': NoneFunkcja `dodaj` *zwraca* wynik, który możemy przypisać do zmiennej. Funkcja `powitaj` tylko *wypisuje* coś na ekran, a sama w sobie nie ma wartości (zwraca `None`). To kluczowa różnica.
Funkcja jako narzędzie maturalne (np. `czy_pierwsza`)
Pythondef czy_pierwsza(n):
"""Sprawdza, czy liczba n jest liczbą pierwszą."""
if n < 2:
return False # Liczby mniejsze od 2 nie są pierwsze
for i in range(2, int(n0.5) + 1):
if n % i == 0:
return False # Znaleziono dzielnik, więc nie jest pierwsza
return True # Pętla się skończyła, nie znaleziono dzielników
# Użycie funkcji w pętli
licznik = 0
for liczba_z_pliku in [2, 3, 4, 5, 6, 7, 10, 11]:
if czy_pierwsza(liczba_z_pliku):
licznik += 1
print(f"Znaleziono {licznik} liczb pierwszych.") # 5To idealny przykład użycia funkcji na maturze. Zamiast wklejać skomplikowany kod sprawdzania pierwszości do głównej pętli, 'zamykasz' go w funkcji `czy_pierwsza`. Kod staje się czysty i czytelny.
Definiowanie i zwracanie wartości (`return`)
C++#include <iostream>
#include <string>
using namespace std;
// 1. Funkcja, która przyjmuje parametry i zwraca wartość
int dodaj(int a, int b) {
int suma = a + b;
return suma;
}
// 2. Funkcja, która nic nie zwraca (typ void)
void powitaj(string imie) {
cout << "Cześć, " << imie << "!" << endl;
}
int main() {
int wynik_dodawania = dodaj(5, 3);
cout << "Wynik: " << wynik_dodawania << endl; // Wynik: 8
powitaj("Anna"); // Cześć, Anna!
return 0;
}W C++ musisz jawnie zadeklarować typ zwracanej wartości (np. `int`, `string`, `bool`). Jeśli funkcja nic nie zwraca, używasz typu `void` (pustka).
Przykładowe Zadania Maturalne
Napisz funkcję `suma_cyfr(n)`, która dla podanej liczby naturalnej 'n' obliczy i zwróci sumę jej cyfr (np. dla `n=123` funkcja powinna zwrócić `6`). Następnie, używając tej funkcji, znajdź i wypisz tę liczbę z pliku 'liczby.txt' (zawierającego 1000 liczb), która ma największą sumę cyfr.
Wskazówka: Funkcja `suma_cyfr(n)` powinna używać pętli `while n > 0`. W pętli pobieraj ostatnią cyfrę (`n % 10`) i dodawaj do sumy, a następnie skracaj liczbę (`n = n // 10`). W programie głównym wczytaj plik, iteruj po liczbach, wywołuj dla każdej swoją funkcję i szukaj maksimum.
Pokaż szkic rozwiązania
1. Zdefiniuj funkcję `suma_cyfr(n)`: a. `suma = 0` b. `while n > 0:` c. ` suma += n % 10` d. ` n //= 10` e. `return suma` 2. Zainicjuj zmienne `max_suma = 0` i `liczba_o_max_sumie = 0`. 3. Otwórz plik 'liczby.txt'. 4. Dla każdej linii w pliku: a. Wczytaj `liczba = int(linia.strip())`. b. Oblicz sumę cyfr: `biezaca_suma = suma_cyfr(liczba)`. c. Sprawdź: `if biezaca_suma > max_suma:` d. ` max_suma = biezaca_suma` e. ` liczba_o_max_sumie = liczba` 5. Wypisz `liczba_o_max_sumie`.
Nieparzystym skrótem dodatniej liczby całkowitej n nazwiemy dodatnią liczbę całkowitą m, która powstaje przez usunięcie cyfr parzystych z zapisu dziesiętnego liczby n (np. dla 294762 skrótem jest 97). Napisz *funkcję*, która dla dodatniej całkowitej liczby n (...) wyznaczy liczbę m - nieparzysty skrót liczby n. W zapisie funkcji możesz korzystać tylko z operacji arytmetycznych (bez konwersji na stringi).
Wskazówka: To zadanie wprost prosi o napisanie funkcji. Funkcja musi iterować po cyfrach liczby 'n' (najlepiej od końca, używając `n % 10` i `n //= 10`). Jeśli cyfra jest nieparzysta, musisz ją 'dopiąć' na początek budowanej liczby 'm'. Użyj do tego mnożnika (potęgi 10).
Pokaż szkic rozwiązania
1. Zdefiniuj funkcję `skrot(n)`: a. Zainicjuj wynik `m = 0`. b. Zainicjuj mnożnik pozycji: `mnoznik = 1`. c. Rozpocznij pętlę `while n > 0:` d. Pobierz ostatnią cyfrę: `cyfra = n % 10`. e. Skróć `n`: `n //= 10`. f. Sprawdź warunek: `if cyfra % 2 != 0:` (jeśli nieparzysta). g. Dodaj cyfrę na początek budowanego wyniku: `m = m + cyfra * mnoznik`. h. Zwiększ mnożnik: `mnoznik *= 10`. i. Zwróć `m`.
Częste Błędy
❌ Mylenie `print` z `return`
To najczęstszy błąd. `print(wynik)` tylko *wyświetla* wartość w konsoli, ale funkcja *nie zwraca* tej wartości. Kod `x = dodaj(2, 2)` (gdzie `dodaj` używa `print`) sprawi, że `x` będzie równe `None` (w Pythonie).
Poprawka: Jeśli chcesz, aby funkcja *przekazała* wartość do reszty programu, musisz użyć `return wynik`.
❌ Zasięg zmiennych (Scope)
Zmienna utworzona *wewnątrz* funkcji (zmienna lokalna) 'umiera', gdy funkcja się kończy. Nie możesz się do niej odwołać z zewnątrz. `def fn(): x = 10; fn(); print(x)` -> błąd!
Poprawka: Jeśli chcesz wyciągnąć wartość z funkcji, funkcja musi ją *zwrócić* (`return x`), a kod na zewnątrz musi ten wynik *odebrać* (`wynik = fn()`).
❌ Zapomnienie o `return` (Python)
Jeśli funkcja Pythona dojdzie do końca i nie napotka `return`, automatycznie zwraca `None`. Jeśli zapomnisz `return suma` w swojej funkcji, obliczenia w programie głównym będą działać na `None`, co spowoduje błąd `TypeError`.
Poprawka: Zawsze upewnij się, że funkcja, która ma coś obliczać, kończy się poleceniem `return`.
❌ C++: Zapomnienie o typie zwrotnym
W C++ każda funkcja musi mieć określony typ zwrotny (np. `int`, `string`, `bool`). Jeśli funkcja nic nie zwraca, musi być oznaczona jako `void`.
Poprawka: Zawsze zaczynaj definicję funkcji w C++ od typu, który zwraca (np. `int suma_cyfr(int n) {...}`).
Kluczowe Wnioski
- Funkcje to bloki kodu wielokrotnego użytku, klucz do organizacji (zasada DRY - Don't Repeat Yourself).
- `def` (w Pythonie) lub `typ_zwrotu nazwa()` (w C++) rozpoczyna definicję funkcji.
- Parametry to 'zmienne-szablony' w definicji, a argumenty to 'konkretne wartości' przekazywane przy wywołaniu.
- `return` natychmiast kończy funkcję i odsyła (zwraca) wartość do miejsca wywołania.
- Funkcja, która nic nie zwraca, w C++ ma typ `void`, a w Pythonie automatycznie zwraca `None`.
- Zmienne tworzone w funkcji są lokalne - nie istnieją poza nią.
- Na maturze *zawsze* dziel skomplikowane problemy na mniejsze, logiczne funkcje.
Najczęściej Zadawane Pytania
❓ Jaka jest dokładnie różnica między `print` a `return`?
`print()` to instrukcja wyjścia. Po prostu 'drukuje' coś na ekran, aby człowiek mógł to zobaczyć. `return` to instrukcja *wyjścia* z funkcji, która przekazuje wartość z powrotem do programu, aby mógł on jej dalej używać w obliczeniach.
❓ Czy funkcja może zwracać wiele wartości?
W Pythonie tak! Możesz napisać `return a, b, c`. Python automatycznie 'spakuje' te wartości w jedną krotkę (tuple), którą możesz potem 'rozpakować': `x, y, z = moja_funkcja()`.
❓ Co to jest 'parametr', a co to 'argument'?
To dwie strony tego samego. Parametr to nazwa zmiennej w *definicji* funkcji, np. `imie` w `def powitaj(imie):`. Argument to *wartość*, którą podajesz przy *wywołaniu* funkcji, np. 'Anna' w `powitaj("Anna")`.
❓ Co się stanie, jeśli przekażę listę do funkcji i ją zmienię w środku?
W Pythonie, jeśli przekażesz listę (lub słownik) do funkcji i zmodyfikujesz ją *w miejscu* (np. przez `.append()` lub `lista[0] = 100`), ta zmiana będzie widoczna *również na zewnątrz* funkcji po jej zakończeniu. Dzieje się tak, ponieważ funkcja otrzymuje referencję (wskaźnik) do tej listy, a nie jej kopię.
Chcesz opanować wszystkie tematy maturalne?
Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.