1
Funkcje
•
Co to jest funkcja?
•
Budowa funkcji
•
Deklaracja, definicja i wywołanie funkcji
•
Przykłady funkcji definiowanych
przez programistę
•
Przekazywanie argumentów do funkcji
•
Tablica jako argument funkcji
•
Funkcje biblioteczne
•
Makrodefinicje
2
Co to jest funkcja?
Funkcja (podprogram)
to wydzielony fragment
kodu przeznaczony do wielokrotnego użycia w
programie.
Nazwany fragment programu, do którego można
się
odwoływać, powodując wykonanie składających
się na
niego instrukcji.
Funkcja może zwracać wartość określonego typu lub
wartość pustą
void
.
Funkcja, która zwraca wartość przekazuje tę wartość
w miejsce swojego wywołania.
3
Dlaczego używamy
funkcji?
Powody uzasadniające użycie funkcji (podprogramów):
•
dbałość o przejrzystą strukturę programu
(podział programu na podprogramy);
•
unikanie powtarzania tych samych ciągów instrukcji
w wielu miejscach programu
(zwartość i mniejszy rozmiar kodu);
•
możliwość korzystania z gotowych funkcji (podprogramów)
rozwiązujących mniejsze fragmenty zadania (programu)
(wielokrotne użycie).
Wielokrotne użycie funkcji umożliwia zmniejszenie rozmiaru
kodu, ale obsługa wywołań funkcji zajmuje dodatkowy czas
procesora.
4
Budowa funkcji
<typ zwracany> <nazwa> ( <arg1>, <arg2>, ... )
{
<deklaracja 1>;
<deklaracja 2>;
....
<instrukcja 1>;
<instrukcja 2>;
....
return <wartość>;
}
część deklaracyjna
(zawsze na
początku)
instrukcje
1
3
2
4
instrukcja
powrotu
CIAŁO
FUNKCJI
NAGŁÓWEK FUNKCJI
5
Budowa funkcji
<typ zwracany> <nazwa> ( <arg1>, <arg2>, ... )
{
.....
}
NAGŁÓWEK FUNKCJI
PARAMETRY FORMALNE
Wywołanie funkcji
<nazwa> ( <arg1>, <arg2>, ... );
PARAMETRY AKTUALNE
(zmienne lokalne)
6
#include <stdio.h>
void drukuj(int n);
int main()
{
int a;
printf(”Podaj a = ”); scanf(”%d”, &a);
drukuj(a);
return 0;
}
void drukuj(int n)
{
int i;
for (i = 1; i <= n; i++)
printf(”Napis %d\n”, i);
}
Deklaracja, definicja i wywołanie
funkcji
DEKLARACJA ZAPOWIADAJĄCA
(PROTOTYP)
DEFINICJA
WYWOŁANIE
7
#include <stdio.h>
void drukuj(int n)
{
int i;
for (i = 1; i <= n; i++)
printf(”Napis %d\n”, i);
}
int main()
{
int a;
printf(”Podaj a = ”);
scanf(”%d”, &a);
drukuj(a);
return 0;
}
Deklaracja, definicja i wywołanie
funkcji
DEKLARACJA ZAPOWIADAJĄCA
(PROTOTYP) JEST ZBĘDNA
DEFINICJA
WYWOŁANIE
8
Przykład 1
– brak argumentów
void opis()
{
printf(”Program oblicza to i tamto\n”);
printf(”Autor: Jan Kowalski\n”);
}
DEKLARACJA ZAPOWIADAJĄCA
(PROTOTYP)
DEFINICJA
WYWOŁANIE
void opis();
opis();
9
Przykład 2
– jeden argument
void drukuj(int n)
{
int i;
for (i = 1; i <= n; i++)
printf(”Napis %d\n”, i);
}
DEKLARACJA ZAPOWIADAJĄCA
(PROTOTYP)
DEFINICJA
WYWOŁANIE
void drukuj(int n);
int a = 2, b = 3;
...
drukuj(5);
drukuj(a);
drukuj(a+b);
10
Przykład 3
– jeden argument i
zwrócenie
float pole(float promien)
{
float p;
const float pi = 3.14;
p = pi*promien*promien;
return p;
}
DEKLARACJA
ZAPOWIADAJĄCA
(PROTOTYP)
DEFINICJA
WYWOŁANIE
float pole(float promien);
float r = 3, S;
S = pole(2.5);
printf(”%f”, pole(r));
S = pole(4*sqrt(r));
11
Przykład 4
– dwa argumenty i
zwrócenie
int dodaj(int a, int b)
{
int c;
c = a+b;
return c;
}
return a+b;
DEKLARACJA
ZAPOWIADAJĄCA
(PROTOTYP)
DEFINICJA
WYWOŁANIE
int dodaj(int a, int b);
int x = 2, y = 4, z;
...
z = dodaj(2, -7);
printf(”%d”, dodaj(x, y));
12
Przykład 5
unsigned long silnia(unsigned int n)
{
unsigned int i;
unsigned long wynik = 1;
if (n > 12)
return 0;
for ( i = 1; i <= n; i++ )
wynik = wynik*i;
return wynik;
}
n! = 1 * 2 * ....
n
DEKLARACJA ZAPOWIADAJĄCA (PROTOTYP)
DEFINICJA
WYWOŁANIE
unsigned long silnia(unsigned int n);
printf(”%ld”, silnia(5));
13
Przekazywanie argumentów do
funkcji
METODA 1: PRZEZ WARTOŚĆ
int dodaj(int a, int b)
{
return a+b;
}
DEFINICJA:
WYWOŁANIE:
int x = 2, y = 3, z;
...
z = dodaj(x, y);
14
Przekazywanie argumentów do
funkcji
METODA 2: PRZEZ ADRES (WSKAŹNIK)
void dodaj(int a, int b, int *c)
{
*c = a+b;
}
DEFINICJA:
WYWOŁANIE:
int x = 2, y = 3, z;
...
dodaj(x, y, &z);
15
Przykład
void swap1(int a, int b)
{
int c;
c = a;
a = b;
b = c;
}
int x = 1, y = 2;
...
swap1(x, y);
Funkcja operuje na
kopiach zmiennych x i y
Zostaną zamienione miejscami
kopie zmiennych x i y, a nie
oryginały!
DEFINICJA:
WYWOŁANIE:
16
Przykład
void swap2(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
Funkcja operuje na
adresach zmiennych x i y
int x = 1, y = 2;
...
swap2(&x, &y);
Zostaną zamienione miejscami wartości
znajdujące się pod adresami zmiennych
x i y.
DEFINICJA:
WYWOŁANIE:
17
Przykład
x = 1, y = 2
x = 1, y = 2
x = 2, y = 1
_
1
3
2
1
3
2
int main()
{
int x = 1, y = 2;
printf(”x = %d, y = %d\n”, x ,y);
swap1(x, y);
printf(”x = %d, y = %d\n”, x ,y);
swap2(&x, &y);
printf(”x = %d, y = %d\n”, x ,y);
return 0;
}
18
Tablica jako argument
funkcji
#include <stdio.h>
int a[3] = { 10, 20, 30 };
int b[] = { 1, 2, 3, 4, 5 };
void drukuj( const int tablica[], int N )
{
int i;
for (i = 0; i < N; i++)
printf(”element[%d] = %d\n”, i, tablica[i]);
/* tablica[0] = 5; */
}
int main()
{
drukuj(a, 3);
drukuj(b, sizeof b/sizeof (int));
}
Nazwa tablicy jest adresem pierwszego
elementu (wskaźnikiem na pierwszy
element):
a
&a[0]
b
&b[0]
UNIEMOŻLIWIA
MODYFIKACJĘ
ZAWARTOŚCI TABLICY
NIEWYKONALNE
19
Funkcje biblioteczne
Biblioteka standardowa:
pliki nagłówkowe
assert.h
diagnostyka kodu (asercje)
ctype.h
funkcje do klasyfikowania znaków
errno.h
float.h
ograniczenia implementacji (arytmetyka
zmiennopozyc.)
limits.h
ograniczenia implementacji (typy całkowite)
locale.h
math.h
funkcje matematyczne
setjmp.h
funkcje do obsługi tzw. skoków odległych
signal.h
funkcje do obsługi sygnałów (zdarzeń
wyjątkowych)
stdarg.h
funkcje do obsługi zmiennej listy argumentów
stddef.h
stdio.h
funkcje obsługujące standardowe wejście-
wyjście
stdlib.h
funkcje narzędziowe
string.h
funkcje do operacji na ciągach znaków
time.h
funkcje do obsługi daty i czasu
20
Makrodefinicje
#include <stdio.h>
#define KWADRAT(a) ((a)*(a))
#define MAX((a), (b)) ( ((a) > (b)) ? (a) : (b) )
int maximum(int a, int b)
{
return (a > b) ? a : b;
}
void main()
{
int a;
a = KWADRAT(3);
a = MAX(2, 5);
a = maximum(3, -2);
}
if (a > b)
return a;
else
return b;
WYWOŁANIE MAKRODEFINICJI
(MAKROWYWOŁANIE
MAKROINSTRUKCJA)
WYWOŁANIE FUNKCJI