~~NOCACHE~~
~~REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024x768~~
====== 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 obiektowym
* ''typ_zwracany'' - dowolny typ, klasa, lub ''void''
* ''nazwa_metody'' - identycznie jak nazwa zmiennej
* ''lista_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 klasy ''Metoda(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