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

Podobne dokumenty