Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ~~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~~ <html> <style type="text/css"> p { text-align: left;} .reveal pre code { height: 100%; max-height: 100%; box-sizing: border-box; } </style> </html> ====== Funkcje i metody ====== ===== Definicja metody ===== <file> modyfikator_dostępu typ_zwracany nazwa_metody ( lista_parametrów ) { instrukcje return wartość; } </file> * ''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 ===== <code C#> 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); } </code> Dostępna tylko wewnątrz metody ''Main'' - nie potrzba modyfikatora dostepu ===== Metoda statyczna klasy ===== * Metoda - to //"funkcja"// związana z klasą <code C#> 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); } } </code> ===== ===== * 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. <code C#> 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}"); } </code> Wyjście <file> W metodzie X: a=43 b=43 W metodzie Main: a=42 b=13 </file> ===== Ć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$$ <code C#> static int Silnia(int n) { if ( n < 2) return 1; return Silnia(n-1) * n; } </code> ===== 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) <code C#> static void Zwiększ(int x) { x++; } public static void Main() { int x = 42; Zwiększ(x); Console.WriteLine($"x={x}"); } </code> Wynik <file> x=42 </file> ===== Parametry typu referencyjnego ===== * argument możemy przekazać w postaci referencji, wówczas metoda może modyfikować jej wartość <code C#> static void Zwiększ(ref int x) { x++; } public static void Main() { int x = 42; Zwiększ(ref x); Console.WriteLine($"x={x}"); } </code> Wynik <file> x=43 </file> ===== ===== * 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 <code C#> 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); } </code> Wynik <file> 2 2 3 </file> ===== Argumenty typu wyjściowego ===== * modyfikator ''out'' pozwala określić parametr wyjściowy, dzięki temu można zwrócić dodatkowe wartości z metody <code C#> static void WczytajLiczbę(out int x) { x = Convert.ToInt32(Console.ReadLine()); } public static void Main() { int x; WczytajLiczbę(out x); Console.WriteLine($"x={x}"); } </code> ===== ===== * 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** <file> Ile elementów wypisać? 10 0 1 1 2 3 5 8 13 21 34 55 </file>