Funkcje i metody
Definicja metody
modyfikator_dostępu typ_zwracany nazwa_metody ( lista_parametrów ) { instrukcje return wartość; }
modyfikator_dostępu
- np.public
,private
, dostęp z innych klas, ważny w programowaniu obiektowymtyp_zwracany
- dowolny typ, klasa, lubvoid
nazwa_metody
- identycznie jak nazwa zmiennejlista_parametrów
- definiuje typy i nazwy argumentów metody- instrukcja
return
przerywa działanie metody i zwraca podaną wartość
Funkcja wewnętrzna
public class Program { public static void Main() { // definicja funkcji int Suma(int a, int b) { return a+b; } // uruchomienie funkcji int x = Suma(3, 5); }
Dostępna tylko wewnątrz metody Main
- nie potrzba modyfikatora dostepu
Metoda statyczna klasy
- Metoda - to „funkcja” związana z klasą
public class Program { static int Suma(int a, int b) { return a+b; } public static void Main() { int a = 42; int b = 3; int x = Suma(a, b); x = Program.Suma(a, b); } }
- modyfikator dostępu w tym przypadku pomijamy, bo nie używamy innych klas
- modyfikator
static
- metoda statyczna, nie wymaga utworzenia obiektu klasy, działa jak globalna funkcja - uruchomienie metody
klasa.metoda(argumenty)
lub z zakresu klasyMetoda(argumenty)
Zmienne lokalne
Zmienne zadeklarowane wewnątrz metody są lokalnie dostępne wyłącznie w jej wnętrzu.
static void X(int a) { int b; // zmienna lokalna a++; b = a; Console.WriteLine($"W metodzie X: a={a} b={b}"); } public static void Main() { int a = 42; int b = 13; X(a); Console.WriteLine($"W metodzie Main: a={a} b={b}"); }
Wyjście
W metodzie X: a=43 b=43 W metodzie Main: a=42 b=13
Ćwiczenie: silnia
Napisz metodę o nazwie Silnia
, która wyznaczy wartość silni z podanej liczby całkowitej.
Argumenty metody:
- liczba całkowita $n$ większa od zera
Wartość zwracana:
- liczba całkowita równa $1 \cdot 2 \cdot \ldots \cdot n$
Napisz program, który korzystając z metody Silnia
wyznaczy silnie dowolnej liczby całkowitej podanej przez użytkownika.
Ile wynosi silnia z 13?
Rekurencja
Metoda rekurencyjna - wywołuje sama siebie
Przykład - silnia: $$ n! = (n-1)! \cdot n$$
static int Silnia(int n) { if ( n < 2) return 1; return Silnia(n-1) * n; }
Parametry wartościowe
- wartośc argumentu jest kopiowana do zmiennej zdefiniowanej na liście parametrów
- metoda nie ma możliwości modyfikacji wartości zmiennej z argumnetu (działamy na kopii)
static void Zwiększ(int x) { x++; } public static void Main() { int x = 42; Zwiększ(x); Console.WriteLine($"x={x}"); }
Wynik
x=42
Parametry typu referencyjnego
- argument możemy przekazać w postaci referencji, wówczas metoda może modyfikować jej wartość
static void Zwiększ(ref int x) { x++; } public static void Main() { int x = 42; Zwiększ(ref x); Console.WriteLine($"x={x}"); }
Wynik
x=43
- do zmiennej lokalnej kopiowana jest referencja wskazująca na ten sam obszar pamięci
- modyfikator
ref
musi pojawić się w definicji parametrów metody oraz przy wywołaniu
Tablice w argumentach
Tablice są typem referencyjnym, więc metoda ma dostęp do elementów tablicy z argumentu
static void Zwiększ(int [] tablica) { tablica[0]++; } public static void Main() { int [] tablica = { 1, 2, 3}; Zwiększ(tablica); foreach(var x in tablica) Console.WriteLine(x); }
Wynik
2 2 3
Argumenty typu wyjściowego
- modyfikator
out
pozwala określić parametr wyjściowy, dzięki temu można zwrócić dodatkowe wartości z metody
static void WczytajLiczbę(out int x) { x = Convert.ToInt32(Console.ReadLine()); } public static void Main() { int x; WczytajLiczbę(out x); Console.WriteLine($"x={x}"); }
- metoda musi przypisać wartość do zmiennej typu wyjściowego
- modyfikator
out
musi pojawić się w definicji parametrów metody oraz przy jej wywołaniu
Ćwiczenie: Sortowanie
Zaimplementuj metodę o nazwie Sortuj()
, która posortuje liczby w tablicy.
Spróbuj samodzielnie wymyslic algorytm sortowania.
Parametry metody:
- tablica jednowymiarowa liczb
Wartość zwracana:
- tablica z posortowanymi liczbami
Napisz program, który poprosi użytkonika o wprowadzenie $N$ liczb a nastepnie wykorzysta metodę Sortuj()
do posortowania tych liczb i wypisze wynik na ekranie.
Zadanie 5: Ciag Fibonacciego
Zaimplementuj metodę o nazwie Fibonacci
, która dla podanej liczby całkowitej n
zwraca wartość n
-tego elementu ciągu Fibonacciego, który wyznaczamy ze wzoru:
$$
F_{n}:=\left\{\begin{array}{ll}
0 & \text { dla } n=0 \\
1 & \text { dla } n=1 \\
F_{n-1}+F_{n-2} & \text { dla } n>1
\end{array}\right.
$$
Metoda realizuje następującą specyfikację:
Parametry: liczba całkowita n
Wartość zwracana: wartość elementu n
ciągu Fibonacciego. W przypadku, gdy argument n<0
to wynikiem jest 0.
Uwaga: metoda powinna realizować wyłącznie obliczenie matematyczne, tzn. uruchomienie metody nie powinno generować żadnych komunikatów na konsoli.
Napisz program, który wykorzysta metodę Fibonacci()
do wypełnienia tablicy jednowymiarowej sekwencją pierwszych
elementów ciągu Fibonacciego a następnie wyświetli zawartość tej tablicy na ekranie. Wartość (ilość elementów ciągu) podaje użytkownik na początku działania programu.
Przykład
Ile elementów wypisać? 10 0 1 1 2 3 5 8 13 21 34 55