Funkcje (procedury)
deklaracja i definicja funkcji
zasięg zmiennych
przekazywanie parametrów (wartość, adres)
Modułowa budowa programu
Struktury
Wyk
Wyk
ł
ł
ad
ad
:
:
Modu
Modu
ł
ł
owa struktura. Funkcje
owa struktura. Funkcje
programu. Struktury
programu. Struktury
Funkcje
Funkcje
Funkcja definiuje czynność (procedurę) do wykonania
Deklaracja funkcji podaje się typ wartości przekazywanej z
funkcji (o ile jest ona przekazywana), nazwę funkcji oraz
argumenty formalne (wraz z ich typem), które należy
dostarczyć podczas jej wywołania
Definicja funkcji zawiera instrukcje składające się na
wykonywaną przez funkcję operację
W języku C# definicja funkcji jest połączoną z jej
deklaracją
Funkcje (procedury) to nazwane fragmenty programu
(ciągi instrukcji komunikujące się z otoczeniem)
Sk
Sk
ł
ł
adnia funkcji
adnia funkcji
public int Suma
(int liczba1, double liczba2)
{ }
modyfikator
dostępu
typ zwracanej
wartości
nazwa
funkcji
lista parametrów
(typ parametru
oraz nazwa
parametru)
definicja funkcji, czyli jej
treść (ciało funkcji)
operator
wołania
funkcji
( )
sygnatura funkcji = nazwa funkcji oraz lista parametrów
Deklaracja funkcji (1)
Deklaracja funkcji (1)
Funkcja jest identyfikowana poprzez swoją sygnaturę
(nazwa i lista parametrów), która musi być unikalna
Funkcje posiadają typ zwracanej wartości. Brak
zwracania wartości (procedura) określa się poprzez
słowo kluczowe
void
(pusty).
Funkcje posiadają modyfikatory dostępu, które
określają widoczność funkcji w module, programie. Są
to modyfikatory
public
,
private
,
protected
public int Suma(int liczba1, int liczba2)
{
int s = liczba1 + liczba2;
return s;
}
Deklaracja funkcji (2)
Deklaracja funkcji (2)
public void Wypisz(string s)
{
Console.WriteLine("Wynik = " + s);
}
private void Hello()
{
Console.WriteLine("Hello!");
}
funkcja nie zwraca wartości
funkcja nie posiada
parametrów
Zwracanie warto
Zwracanie warto
ś
ś
ci przez funkcj
ci przez funkcj
ę
ę
Funkcja, której typ jest różny od
void
(odpowiednik procedury w
języku Pascal), musi przekazać na zewnątrz wartość. Wartość tą
określa się instrukcją return
Wartość zwracana przez instrukcję return musi być tego samego
typu, co zadeklarowany typ zwracany przez funkcję
Instrukcja
return
może w definicji funkcji pojawiać się
wielokrotnie:
public double Funkcja(int X, double Y)
{
if (X > 1) return X*Math.Log(Y);
else return X * Y;
}
Deklaracja funkcji (3)
Deklaracja funkcji (3)
-
-
polimorfizm
polimorfizm
public int Fun(int liczba)
{
return liczba + 1;
}
public int Fun(double liczba)
{
int x = (int)liczba;
return x * 10;
}
public int Fun(int liczba1, liczba2)
{
return liczba1 + liczba2;
}
public double Fun(int liczba) {
/* … */
}
tak nie wolno! funkcja nie
zmoże zwracać wartości
innego typu
Wolno nazwać funkcje tak
samo, ale muszą mieć różne
sygnatury
Zwracanie warto
Zwracanie warto
ś
ś
ci w
ci w
funkcjach w j
funkcjach w j
ę
ę
zyku
zyku
C#
C#
public int Funkcja1(int arg)
{ int a;
if (arg > 10) a = 1; else a = -1;
if (arg > 5) return 10;
else {
if (a < 0) return 100;
}
}
public int Funkcja2(int arg)
{ int a;
if (arg > 10) a = 1; else a = -1;
if (arg > 5) return 10;
else if (a < 0) return 100;
return 0;
/* sterowanie i tak tutaj nie dostanie
się, ale... */
}
Kompilator nie jest
kompetentny, aby znać
logikę funkcji i nie wie
czy przypadkiem nie
nastąpi sytuacja, w której
funkcja „pójdzie takim
torem”, że nie zwróci
wartości
Zasi
Zasi
ę
ę
g zmiennych
g zmiennych
Zasięgiem zmiennej jest blok, w którym została zadeklarowana
public void Main()
{
int x = 5;
int y = Funk(x);
Console.WriteLine("Suma {0}", y);
}
public int Funk(int a)
{
double x;
if (a < 10) x = a*a; else x = a * 5;
return x;
}
zmienna x w funkcji
Funk
jest innego typu (double)
niż w programie głównym i istnieje aż do natrafienia
na klamrę zamykającą ciało funkcji
Funk
.
Przekazywanie parametr
Przekazywanie parametr
ó
ó
w do funkcji
w do funkcji
Dla typów prostych parametry funkcji są domyślnie
przekazywane przez wartość
Dla typów referencyjnych domyślnym sposobem
przekazywania parametrów do funkcji jest
przekazywanie przez adres
Dla typów prostych istnieje możliwość jawnego
określenia, że parametr przekazywany jest przez
referencję (operatory
ref
i
out
).
Przekazywanie parametr
Przekazywanie parametr
ó
ó
w przez warto
w przez warto
ść
ść
Dla typów prostych parametry funkcji są domyślnie przekazywane przez
wartość, czyli do funkcji trafia sporządzona w momencie wywołania
kopia zmiennej (parametru), a zmiana dokonana na zmiennej nie będzie
miała wpływu na oryginalny parametr.
public int Fun(int param)
{
param++;
return param;
}
public void Abc()
{
int liczba = 7;
int razem = Fun(liczba) + liczba;
Console.WriteLine("Dla {0} funkcja = {1}", liczba, razem);
}
Fun = 8
liczba = 7
Przekazywanie parametr
Przekazywanie parametr
ó
ó
w przez referencj
w przez referencj
ę
ę
public void Main()
{
int[] Tab = new int[4] = { 1, 3, 4, 2};
int suma1 = Sumuj(Tab);
int suma2 = Sumuj(Tab);
Console.WriteLine("Suma wynosi {0}", suma1);
Console.WriteLine("Suma wynosi {0}", suma2);
}
public int Sumuj(int[] T)
{ int suma = 0;
for (int i = 0; i < T.Length; i++)
{ suma += T[i];
T[i] = T[i] + 1;
}
return suma;
}
suma1 = 10
suma2 = 14
typy referencyjne: tablice, kolekcje, obiekty różnych klas i ich złożenia
Przekazywanie parametr
Przekazywanie parametr
ó
ó
w typ
w typ
ó
ó
w prostych przez
w prostych przez
referencj
referencj
ę
ę
Dla typów prostych parametry funkcji mogą być przekazywane
przez referencję dzięki operatorom ref i out.
public int Fun(ref int x, out int y)
{ x++;
y = 5;
int a = x + y;
return a;
}
public void Abc()
{ int licz1 = 7;
int licz2;
int r = Fun(ref licz1, out licz2);
Console.WriteLine("Dla {0},{1} funkcja = {2}", licz1, licz2, r);
}
razem = 13
liczba1 = 8
liczba1 = 5
Przekazywanie przez referencj
Przekazywanie przez referencj
ę
ę
w j
w j
ę
ę
zyku C#
zyku C#
(
(
2)
2)
Do przekazywania wartości do funkcji służy słowo kluczowe
ref
. Parametr
przekazywany do funkcji ze słowem
ref
musi mieć zainicjowaną wartość.
Do przekazywania wartości do funkcji służy również słowo kluczowe
out
.
Parametr przekazywany do funkcji ze słowem
out
nie musi mieć
zainicjowanej wartości.
public int Fun1(ref int a, ref int b) {
/* ... */
}
public int Fun2(out int a, out int b) {
/* ... */
}
int a, b;
int c, d;
int x = Fun1(a,b);
int z = Fun2(out c, out d);
int e = 0, f = 1;
Int y = Fun1(ref e, ref f);
błąd
tak może być
tak może być
Kod spaghetti
Kod spaghetti
etyk1:
if (…) goto etyk3;
if (…) goto etyk2;
// …
etyk4:
if (…) goto etyk5;
etyk3:
// …
etyk5:
// …
if (…) goto etyk1;
if (…) goto etyk4;
etyk2:
// …
Stosowanie (nadmierne)
instrukcji
goto
prowadzi
do nieczytelności kodu i
niemożności jego sensownej
analizy
Idea programowania
strukturalnego i
proceduralnego polega na
rozbijaniu programu na
prostsze, autonomiczne
fragmenty (np.
procedury)
problem
Modu
Modu
ł
ł
owa budowa programu
owa budowa programu
void Main()
{
PobierzDane();
WykonajObliczenia();
WypiszRezultaty();
}
private void PobierzDane()
{
// … coś tu się wykonuje
}
private void WykonajObliczenia() {
/* … */
}
private void WypiszRezultaty() {
/* … */
}
Zasada modułowości i
programowania strukturalnego
zakłada, że należy stosować
tylko takie konstrukcje sterujące
wykonaniem programu, żeby
mieć zawsze jeden punkt
wejściowy i jeden punkt
wyjściowy (funkcje, instrukcje
pętli (for, do-while), switch itp.
problem
Struktury (jako typ danych)
Struktury (jako typ danych)
struct Motyl
{ string Nazwa;
string nazwaŁacińska;
int rozmiarSkrzydeł;
};
public void Main()
{
Motyl M1, M2;
M1.Nazwa = „Bielinek rzepnik”;
M1.nazwaŁacińska = "
Pieris rapae";
M1.rozmiarSkrzydeł = 130;
M2.Nazwa = „Paź królowej”;
M2.rozmiarSkrzydeł = 50;
M2.rozmiarSkrzydeł++;
}
Deklaracja struktury
Motyl
Struktury (cechy)
Struktury (cechy)
Struktury określa się mianem "klas wagi lekkiej"
Struktura może zawierać pola, metody (funkcje),
właściwości, zdarzenia, konstruktory
Struktura może dziedziczyć po interfejsach
Struktury różnią się zasadniczo od klas tym, że
Struktura jest typem wartościowym (każda struktura
dziedziczy po klasie
System.ValueType
)
Struktura nie może dziedziczyć po klasach
Struktura nie może być przedmiotem dziedziczenia
Bezpośrednio deklarowany konstruktor struktury musi mieć
przynajmniej jeden parametr
Składowe struktury nie mogą być inicjowane w momencie
deklarowania
Konstruktory
Konstruktory
w strukturach
w strukturach
public struct Student {
public string imię;
public string nazwisko;
public string kierunek;
public Student(string i, string n, string k)
{ imię = i;
nazwisko = n;
kierunek = k;
}
}
// i użycie struktury Student w programie
public void Main()
{
Student s = new Student("jan", "kowalski",
"informatyka");
}
Konstruktor struktury
Motyl
jawny konstruktor
struktury musi zawierać
wszystkie pola struktury !