background image

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

background image

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.

background image

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.

background image

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

background image

5

Budowa funkcji

<typ zwracany> <nazwa> ( <arg1>, <arg2>, ... )
{

.....

}

NAGŁÓWEK FUNKCJI

PARAMETRY FORMALNE

Wywołanie funkcji

<nazwa> ( <arg1>, <arg2>, ... );

PARAMETRY AKTUALNE

(zmienne lokalne)

background image

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

background image

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

background image

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();

background image

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);

background image

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));

background image

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));

background image

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));

background image

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);

background image

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);

background image

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:

background image

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:

background image

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;
}

background image

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

background image

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

background image

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


Document Outline