Programowanie proceduralne
INP001210WL
rok akademicki 2018/19 semestr letni
Wykład 2
Karol Tarnowski
karol.tarnowski@pwr.edu.pl
A-1 p. 411B
• Zasięg zmiennych – zmienne lokalne i globalne
• Przekazywanie argumentów do funkcji
• Przekazywanie tablic do funkcji
• Zwracanie wartości przez funkcję
• Rekurencja
Plan prezentacji
Zmienne lokalne i globalne
Zmienne lokalne i globalne
Zmienne lokalne i globalne
• Zmienna lokalna jest zdefiniowana wewnątrz klamry
• Zasięg zmiennej lokalnej jest ograniczony
do tej klamry – najczęściej do funkcji
Zmienne lokalne i globalne
• Zmienna globalna jest zdefiniowana poza funkcją
• Zasięg zmiennej globalnej rozciąga się do
końca pliku
Zmienne lokalne i globalne
Zmienne lokalne i globalne
Przekazywanie argumentów
Istnieją dwa sposoby przekazywania argumentów do funkcji:
• przez kopię (przez wartość),
• przez wskaźnik (przez adres).
Przekazywanie argumentów przez kopię
Do wywoływanej funkcji przekazywana jest wartość zmiennej, a nie sama zmienna;
zmienna jest kopiowana.
Przekazywanie argumentów
przez kopię
Przekazywanie argumentów
przez kopię
Przekazywanie argumentów przez wskaźnik
Do wywoływanej funkcji przekazywany jest adres zmiennej. Oznacza to, że zmiany
wartości zmiennej wykonywane są na
oryginalnej zmiennej.
Przekazywanie argumentów
przez wskaźnik
Przekazywanie argumentów
przez wskaźnik
Przekazywanie argumentów przez wskaźnik
Wyjaśnienie tajemnicy funkcji scanf().
Zmienne, do których funkcja scanf() wpisuje dane, przekazywane są przez wskaźnik.
Przekazywanie tablicy do funkcji
Tablica jest zawsze przekazywana do funkcji
przez adres.
Przekazywanie tablicy do
funkcji
Przekazywanie tablicy do
funkcji
Przekazywanie tablicy do funkcji
Tablica jest stałą wskaźnikową pokazującą na początek obszaru pamięci. Zatem do
funkcji jest przekazywany adres.
Przekazywanie tablicy do
funkcji
Zwracanie wyniku przez funkcję
• Do zwracania wartości przez funkcje służy instrukcja return.
• Funkcja może zwracać tylko jedną wartość.
• Funkcja zwraca wartość typu określonego
w deklaracji (domyślnie int).
Zwracanie wyniku przez
funkcję
Zwracanie wyniku przez funkcję
Wyjaśnienie tajemnicy polecenia return 0;
• Funkcja główna programu też zwraca wynik.
• Funkcja main() powinna mieć typ int.
• Prawidłowe zakończenie programu oznacza się najczęściej wartością 0.
Zwracanie wyniku przez
funkcję
Definicja rekurencyjna funkcji
• Definicja funkcji, która zawiera odwołanie do tej funkcji, nazywana jest definicją
rekurencyjną.
Przykłady definicji rekurencyjnych
• Wyrażenie na sumę elementów tablicy zapisane bez wykorzystania rekurencji
• oraz w wersji rekurencyjnej:
10
,
n i
i
S t n t
1
0 dla 1
, .
, 1 w p.p.
n S t n n
t S t n
Przykłady definicji rekurencyjnych
• ciąg Fibonacciego
0 dla 0
1 dla 1
1 2 dla 1
n
fib n n
fib n fib n n
Przykłady definicji rekurencyjnych
• silnia
1 dla 0
! 1 ! dla 0
n n
n n n
Przykłady definicji
rekurencyjnych
Przykłady definicji rekurencyjnych
• największy wspólny dzielnik
dla 0 nwd ,
nwd mod , dla 0
n k
k n n k k k
Definicja rekurencyjna funkcji
• Zaletą rekurencji jest przejrzystość algorytmu.
• Stosowanie rekurencji może prowadzić do wzrostu złożoności obliczeniowej,
zwiększa złożoność pamięciową, może prowadzić do wielokrotnego
rozwiązywania tego samego podproblemu.
• W definicji rekurencyjnej należy określić
warunek zatrzymania.
• Zmienne mogą mieć ograniczony zakres widoczności – lokalny i globalny. Rozważ jakiego typu zmiennej używać - prawie zawsze zmienne lokalne będą
bezpieczniejsze.
Absolutne minimum (1)
• Podstawowym sposobem przekazywania zmiennych do funkcji jest przekazywanie przez wartość – funkcja nie zmieni
oryginalnej zmiennej.
• Można przekazywać zmienne przez adres – jeżeli chcesz, aby funkcja modyfikowała zmienną.
• Tablice są zawsze przekazywane przez adres.
Absolutne minimum (2)
• Funkcja może zwracać jedną wartość.
Typ funkcji określony jest w deklaracji.
• Funkcja główna to int main().
• Rekurencja – zwiększa przejrzystość algorytmu, musi zawierać warunek zatrzymania.