Parametryzacja metod
Transkrypt
Parametryzacja metod
1 Parametryzacja metod Komunikacja metody ze „światem zewnętrznym” 2 Po co? Wykorzystanie metody dla różnych danych wejściowych: –mogą być wynikiem działania innej metody, –mogą być czytane z urządzenia zewnętrznego, –mogą być czytane z pliku –… Metoda wykorzystywana: –w programie wielokrotnie dla różnych zmiennych, –w różnych programach, także jeszcze nie istniejących. Wykonanie metody: –nie powinno modyfikować zmiennych innych metod –możliwość zwrócenia wielu wyników (np. trójmian) return Nazwa tylko pojedyncza wartość! Czytelność kodu!!! 3 Projektowanie metody Określić: –co i jak należy wykonać, –jakie dane są do tego potrzebne (Wejście), –jakie będą wyniki (Wyjście) Deklaracja metody –zapis ogólnego „przepisu” –nazwanie tego „przepisu”, określenie We/Wy Użycie metody –wywołanie i podanie danych aktualnych 4 Deklaracja Deklaracja metody z parametrami 1 Deklaracja metody z parametrami –każdy parametr musi posiadać nazwę i typ –argumenty umieszczamy w nawiasach okrągłych po nazwie metody –poszczególne parametry oddzielamy przecinkiem 5 Przykłady deklaracji Metoda przyjmująca dwa argumenty typu string static void Powitanie(string imie, string nazwisko) { Console.WriteLine("Witam Pana(ią) {0} {1}", imie, nazwisko); } Metoda przyjmująca jeden parametr typu double static double Szescian(double x) { return x*x*x; } Metoda z różnymi parametrami static int SumaNz(int a, int b, string kom) { int c = 0; if (a * b != 0) c = a + b; else Console.WriteLine(kom); return c; } 6 Użycie Wywołanie metody z parametrami –każdy parametr musi mieć dostarczoną wartość odpowiedniego typu, –wartości umieszczamy w nawiasach okrągłych po nazwie metody, –wartości są przypisywane argumentom na podstawie kolejności występowania, –poszczególne wartości oddzielamy przecinkiem. Gdzie: –w innej metodzie –w metodzie Main 7 Przykład wywołania static void Powitanie(string imie, string nazwisko) { Console.WriteLine(" {0} {1} - witam Pana(ią)!", imie, nazwisko); 2 imie, nazwisko); } Wywołanie: Powitanie("Kubuś", "Puchatek"); Efekt: Kubuś Puchatek - witam Pana(ią)! Argumenty (wartości, zmienne) w miejscu wywołania: –to parametry aktualne metody. 8 Przykłady wywołania double y = Szescian(2); Console.WriteLine(Szescian(y)); double z = Szescian(Szescian(2)); int L1, L2; SumaNz(1, 2, "Jedna z liczb =0!"); … //czytanie l1, l2 SumaNz(L1, L2, "Jedna z liczb =0!"); SumaNz(L1, L2, "Any value = 0!"); SumaNz(L1, L2, "Eine der Zahlen =0!"); 9 Trójmian static double Trojmian(double a, double b, double c) { double delta = b * b - 4 * a * c; if (delta >= 0) { double x1, x2, pd; pd = Math.Sqrt(delta); x1 = (-b - pd) / (2 * a); x2 = (-b + pd) / (2 * a); return x1; return x2; // !?? … … 3 10 Trójmian II static bool Trojmian(double a, double b, double c, double x1, double x2 ) { double delta = b * b - 4 * a * c; if (delta >= 0) { double pd = Math.Sqrt(delta); x1 = (-b - pd) / (2 * a); x2 = (-b + pd) / (2 * a); return true; } else return false; } 11 Analiza Możliwe problemy: –dane nieprawidłowo przekazywane do metody –błędy obliczeniowe w metodzie –dane nieprawidłowo wyprowadzane –wyniki nieprawidłowo prezentowane –…? 12 Deklaracja rodzaju parametru Na etapie projektowania przewidzieć –które parametry tylko dostarczają dane –które parametry przekazują wyniki Zwiększa to bezpieczeństwo danych –jaka jest jakość podprogramów, których wykonanie zostało zlecone? 13 Przesyłanie argumentów do metody przez wartość 4 przez referencję jako niezainicjowany parametr wyjściowy 14 Przesyłanie przez wartość Cechy: –domyślny mechanizm przesyłania argumentów –w metodzie – tworzona NOWA zmienna –w metodzie – traktowana jako zmienna lokalna Argumentem aktualnym może być –dowolne wyrażenie odpowiedniego typu – –jeżeli zmienna: wcześniej zainicjalizowana! int y; f(y); //błąd – brak inicjalizacji Zmiana: –wartości parametru formalnego nie wpływa – na wartość parametru aktualnego. 15 Przesyłanie przez referencję static bool Trojmian(double a, double b, double c, ref double x1, ref double x2) { double delta = b * b - 4 * a * c; if (delta >= 0) { double pd = Math.Sqrt(delta); x1 = (-b - pd) / (2 * a); x2 = (-b + pd) / (2 * a); return true; } else return false; } 16 Przesyłanie przez referencję Argument przez referencję – parametr wejściowy / wyjściowy, – definiujemy przez: dodanie przed nazwą typu parametru ref 5 dodanie przed nazwą typu parametru ref dla każdego argumentu przesyłanego przez referencję. – w miejscu parametr formalny reprezentuje ten sam obszar pamięci, tą samą zmienną, co parametr aktualny Właściwości argumentu aktualnego – tylko zmienna odpowiedniego typu static void f(ref int x){...} można wywołać f(ref y); //gdzie y jest zmienną typu int. wywołanie f(ref 2*4); //spowoduje błąd kompilacji – zmienna wcześniej zainicjalizowana int y; f(ref y); //błąd - niezainicjalizowana zmienna – wewnątrz metody: jako zmienne zainicjalizowane, – zmiana wartości parametru formalnego wpływa na wartość parametru aktualnego. 17 Jako parametr wyjściowy static bool Trojmian(double a, double b, double c, out double x1, out double x2) { double delta = b * b - 4 * a * c; if (delta >= 0) { double pd = Math.Sqrt(delta); x1 = (-b - pd) / (2 * a); x2 = (-b + pd) / (2 * a); return true; } else return false; } 18 Właściwości Deklaracja: –dla każdego argumentu przesyłanego jako parametr wyjściowy –przed nazwą typu parametru słowo out. Właściwości –nie jest tworzona nowa zmienna –parametr aktualny i formalny: ten sam obszar pamięci, –argument aktualny: tylko zmienna odpowiedniego typu brak konieczności inicjalizacji –int y; f(out y); //Wszystko OK. wewnątrz metody jako zmienne niezainicjalizowane –static void f(out int x){ ...int y = x; //błąd, „x” - niezainicjalizowana zmienna 6 } przed wyjściem z metody: nadać wartość! 19 Zasady użycia parametrów Parametry –formalne: deklaracja metody –aktualne: użycie (wywołanie) metody Zgodność parametrów formalnych i aktualnych –jednakowa ilość; –zgodny typ; –zgodna kolejność występowania bywają odstępstwa… Wejściowe: przez wartość Wyjściowe: przez referencję ref lub out 20 Rekurencja (rekursja) • Rekurencja wzajemna (pośrednia): • podprogram A wywołuje podprogram B • podprogram B wywołuje podprogram A, który… • kolejność deklaracji A i B – nieistotna • łańcuch A, B, C, D, … może być dowolnie długi • Rekurencja bezpośrednia: • podprogram A wywołuje sam siebie. • Efekt: pętla nieskończona 21 Rekurencja wzajemna 22 Rekurencja bezpośrednia Silnia: 0! = 1; n>0: n! = n * (n-1) * (n-2) * … * 2 * 1 Iteracyjnie: static ulong Silnia(ushort n) { ulong iloczyn = 1; for(uint i=2;i<=n;i++) 7 for(uint i=2;i<=n;i++) iloczyn *= i; return iloczyn; } dlaczego nie int??? 23 Silnia rekurencyjnie – jak to działa? static ulong Silnia(ushort n) { if(n == 0 || n == 1) return 1; return n * Silnia(n-1); } 24 Rekurencja - Fibonacci Ciąg Fibonacciego: Fib(n) = n dla n<2 Fib(n) = Fib(n-1) + Fib(n-2) dla n 2; 25 Wady i zalety rekurencji Dodatkowe koszty –spowolnienie wykonywania programu wywołanie funkcji, odłożenie danych na stosie czasami powtarzanie obliczeń –zwiększenie objętość danych przechowywanych na tzw. stosie programu argumenty, zmienne lokalne, adres powrotu Zaleta –czytelność algorytmów(?) –krótszy kod. – Unikajmy rekurencji, jeżeli istnieje oczywiste rozwiązanie iteracyjne! Powtarzanie obliczeń – dzieląc zadanie na podzadania, można doprowadzić, że część podzadań będzie identycznych i duża część obliczeń będzie powtórnie rozwiązywała już rozwiązane problemy 26 Nadużywanie rekurencji Unikajmy rekurencji, jeżeli istnieje oczywiste rozwiązanie iteracyjne!!! Ciąg Fibonacciego: 8 Ciąg Fibonacciego: 27 Argument metody Main Przekazanie danych do programu przez argumenty: –w wierszu wywołania –we właściwościach skrótu –w środowisku Visual Studio Właściwości Projektu (menu Project/Nazwa Projektu Properties...) zakładka Debug, pole Command line arguments: 28 Przetwarzanie parametrów Argumenty w wierszu wywołania –parametr metody Main, –tablica tekstowa string[] args – Przykład: –program wypisuje na ekranie wszystkie argumenty Zastosowanie –parametry programu, –katalog roboczy, –nazwa użytkownika, –… 9