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.
aibwdef 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 xwysyła wartośćxna 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 typvoid. 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) lubtyp_zwrotu nazwa()(w C++) rozpoczyna definicję funkcji.- Parametry to 'zmienne-szablony' w definicji, a argumenty to 'konkretne wartości' przekazywane przy wywołaniu.
returnnatychmiast 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 zwracaNone. - 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ń.