Funkcje

Funkcje (w niektórych językach zwane także metodami) to bloki kodu, które można wywołać, aby wykonać określone zadanie. Główne cechy funkcji to:

  • Reużywalność: Raz napisana funkcja może być wywoływana wielokrotnie z różnych miejsc w programie.
  • Modularność: Funkcje dzielą program na mniejsze części, co ułatwia zrozumienie i utrzymanie kodu.
  • Eliminowanie powtarzalności: Zamiast wielokrotnie pisać ten sam kod, można zamknąć go w funkcji i używać, kiedy jest potrzebny.

Składnia funkcji w C#

Funkcja składa się z kilku elementów:

  • Typ zwracany: Określa, jakiego typu dane funkcja zwraca po zakończeniu swojego działania. Jeśli funkcja nie zwraca żadnej wartości, używa się słowa kluczowego void.
  • Nazwa funkcji: Nazwa, którą wywołujemy funkcję w programie.
  • Parametry: Wartości, które możemy przekazać funkcji, aby mogła pracować na danych.
  • Ciało funkcji: To zestaw instrukcji, które zostaną wykonane, gdy funkcja zostanie wywołana.

Przykład funkcji w C#:

public int Dodaj(int a, int b)
{
    int suma = a + b;
    return suma;
}

Wyjaśnienie:

  • public: To modyfikator dostępu, który określa, że funkcja jest dostępna z innych części programu. Możemy używać także innych modyfikatorów, takich jak private.
  • int: To typ zwracany przez funkcję. Oznacza, że funkcja zwróci liczbę całkowitą.
  • Dodaj: To nazwa funkcji. Kiedy chcemy ją wywołać, używamy tej nazwy.
  • int a, int b: To parametry funkcji – dane, które przekazujemy funkcji, aby mogła wykonać swoje zadanie.
  • return suma;: To zwracanie wartości z funkcji. Funkcja po wykonaniu dodawania zwraca wynik.

Wywoływanie funkcji

Aby użyć funkcji, należy ją wywołać w odpowiednim miejscu w programie. Wywołanie funkcji polega na użyciu jej nazwy wraz z odpowiednimi argumentami (wartościami przekazywanymi do parametrów).

Przykład wywołania funkcji:

int wynik = Dodaj(5, 3);
Console.WriteLine(wynik);  // Wypisze: 8

Wyjaśnienie:

  • Funkcja Dodaj(5, 3) została wywołana z argumentami 5 i 3.
  • Wynik funkcji (czyli 8) został przypisany do zmiennej wynik.
  • Następnie wypisujemy wynik na ekranie.

Funkcje z parametrami i bez parametrów

Funkcja może przyjmować parametry, aby wykonać operację na danych przekazanych z zewnątrz, ale nie jest to konieczne.

Funkcja z parametrami:

public int Pomnoz(int x, int y)
{
    return x * y;
}

Wywołanie:

int wynik = Pomnoz(4, 5);
Console.WriteLine(wynik);  // Wypisze: 20

Funkcja bez parametrów:

Funkcje nie muszą przyjmować parametrów. Mogą działać na danych, które są dostępne globalnie.

public void Witaj()
{
    Console.WriteLine("Witaj w programowaniu w C#!");
}

Wywołanie:

Witaj();  // Wypisze: Witaj w programowaniu w C#!

Funkcje z wartością zwracaną i bez wartości zwracanej

Funkcje mogą zwracać wartość (np. int, string, bool), ale mogą również nie zwracać żadnej wartości. Do tego służy typ void.

Funkcja zwracająca wartość:

public string Przywitaj(string imie)
{
    return "Cześć, " + imie + "!";
}

Wywołanie:

string powitanie = Przywitaj("Jan");
Console.WriteLine(powitanie);  // Wypisze: Cześć, Jan!

Funkcja bez wartości zwracanej (void):

public void PokazWynik(int wynik)
{
    Console.WriteLine("Twój wynik to: " + wynik);
}

Wywołanie:

PokazWynik(95);  // Wypisze: Twój wynik to: 95

Funkcje przeciążone (Overloading)

Funkcje mogą być przeciążone, co oznacza, że mogą mieć tę samą nazwę, ale różnią się liczbą lub typami parametrów. Przeciążanie funkcji pozwala na użycie tej samej nazwy funkcji do różnych zadań.

Przykład przeciążonych funkcji:

// Funkcja dodająca dwie liczby całkowite
public int Dodaj(int a, int b)
{
    return a + b;
}

// Funkcja dodająca trzy liczby całkowite
public int Dodaj(int a, int b, int c)
{
    return a + b + c;
}

Wywołanie:

int wynik1 = Dodaj(2, 3);      // Wywołanie funkcji z 2 parametrami
int wynik2 = Dodaj(1, 2, 3);   // Wywołanie funkcji z 3 parametrami

Funkcje z opcjonalnymi parametrami

W C# można definiować parametry, które mają wartości domyślne. Jeśli użytkownik nie poda argumentu dla takiego parametru, funkcja użyje wartości domyślnej.

Przykład funkcji z opcjonalnymi parametrami:

public void WyswietlWiadomosc(string wiadomosc = "Domyślna wiadomość")
{
    Console.WriteLine(wiadomosc);
}

Wywołanie:

WyswietlWiadomosc();  // Wypisze: Domyślna wiadomość
WyswietlWiadomosc("Cześć!");  // Wypisze: Cześć!

Operator ref i out w funkcjach

W funkcjach możemy używać operatorów ref i out, aby modyfikować wartości zmiennych przekazywanych do funkcji.

Operator ref:

Używany, gdy chcemy przekazać zmienną zainicjalizowaną do funkcji, a następnie zmodyfikować jej wartość w funkcji.

public void Zwieksz(ref int liczba)
{
    liczba += 10;
}

int x = 5;
Zwieksz(ref x);
Console.WriteLine(x);  // Wypisze: 15

Operator out:

Używany, gdy chcemy, aby funkcja zwróciła więcej niż jedną wartość, lub gdy zmienna jest modyfikowana wewnątrz funkcji (nie musi być zainicjalizowana przed przekazaniem).

public void RozdzielLiczbe(int liczba, out int dziesiatki, out int jednosci)
{
    dziesiatki = liczba / 10;
    jednosci = liczba % 10;
}

int d, j;
RozdzielLiczbe(54, out d, out j);
Console.WriteLine("Dziesiątki: " + d + ", Jedności: " + j);  // Wypisze: Dziesiątki: 5, Jedności: 4

Rekurencja – funkcje, które wywołują same siebie

Rekurencja to technika, w której funkcja wywołuje samą siebie. Jest to przydatne, gdy problem można podzielić na mniejsze podproblemy, które rozwiązujemy tą samą funkcją.

Przykład funkcji rekurencyjnej – silnia:

public int Silnia(int n)
{
    if (n == 0)  // Warunek zatrzymania
    {
        return 1;
    }
    else
    {
        return n * Silnia(n - 1);  // Wywołanie rekurencyjne
    }
}

Wywołanie:

int wynik = Silnia(5);
Console.WriteLine(wynik);  // Wypisze: 120 (5! = 5 * 4 * 3 * 2 * 1)