JezykC8.pdf

(93 KB) Pobierz
7. FUNKCJE
W języku Pascal istnieją dwa rodzaje podprogramów: funkcje i procedury . W języku C istnieją tylko
funkcje . Funkcja otrzymuje od wywołującego ją programu (lub innej funkcji) ciąg argumentów (być
może pusty - void ) i oblicza pewien wynik (jeśli ma nic nie przekazywać z powrotem do wywołują-
cego programu, typem wyniku również może być void ).
Podział podprogramów na funkcje i procedury w Pascalu jest dość sztuczny i jest związany głównie
z tym, że wartości zwracane przez funkcje mogą być tylko jednego z typów prostych . W języku C
struktury mogą być zarówno argumentami, jak i wynikami działania funkcji, natomiast nazwy tablic
są traktowane jako nazwy stałych wskaźnikowych (czyli wielkości typu prostego).
W Pascalu odróżniamy przekazywanie argumentów przez wartość i przez referencję . W języku C
istnieje tylko ten pierwszy sposób, co oznacza, że funkcja rozpoczynając działanie tworzy prywatne
kopie wartości przekazywanych jako argumenty wywołania i przyporządkowuje je nazwom swoich
argumentów formalnych, traktując je jako swoje zmienne lokalne. Możliwość przekazywania
argumentów przez referencję jest w języku C (szeroko) zastępowana przekazywaniem wskaźników.
786885459.002.png
Przyczyny stosowania podprogramów:
1) możliwość wielokrotnego użycia podprogramu w wywołującym go programie;
2) możliwość tworzenia bibliotek podprogramów , które mogą być potem wykorzystywane przez
wiele programów;
3) możliwość tworzenia dobrze zorganizowanego, czytelnego oprogramowania o hierarchicznej
strukturze;
4) możliwość łatwego wprowadzania poprawek i ulepszeń w pojedynczych podprogramach (bez
ingerowania w treść pozostałych);
5) możliwość stosowania rekursji (czyli techniki programowania bazującej na wywoływaniu
podprogramu przez ten sam podprogram).
Ważną zaletą kompilatorów języka C jest możliwość niezależnej kompilacji funkcji , co ułatwia
tworzenie bibliotek funkcji oraz tworzenie złożonego oprogramowania zapisanego przed kompilacją
w wielu plikach źródłowych.
786885459.003.png
Ogólna postać definicji funkcji:
typ_wyniku nazwa_funkcji ( lista argumentów )
{
deklaracje
instrukcje
}
Lista argumentów jest listą par o postaci: typ nazwa oddzielonych przecinkami.
Jeżeli funkcja ma zwracać pewną wartość (wynik), musi ona być zgodna z zadeklarowanym typem
wyniku . Wartość jest zwracana wskutek wykonania instrukcji o postaci return wyrażenie ; .
Uwaga:
1) wyrażenie może być ujęte w nawiasy, ale nie musi;
2) jeśli funkcja ma nie zwracać żadnego wyniku (tylko przekazywać sterowanie z powrotem do
programu wywołującego), wystarczy umieścić w niej instrukcję return ; (bez wyrażenia );
3) jeśli w funkcji nie występuje return , sterowanie jest przekazywane po dojściu do ostatniego „}”.
786885459.004.png
Przykład
n
Funkcja obliczająca potęgę liczby całkowitej o wykładniku naturalnym k .
int power ( int k, unsigned int n )
{
int p;
for (p = 1; n > 0; - - n)
p = p * k;
return p;
}
Przykład użycia wyżej zdefiniowanej funkcji w programie głównym:
...........
int p, x;
...........
p = power (x, 4) + 2 * power (x, 3) ;
...........
786885459.005.png
W powyższym przykładzie każde wywołanie funkcji power powodowało (czasowe) utworzenie
kopii obydwóch argumentów. W przypadku, gdy argumentem jest tablica, działanie funkcji odnosi
się do oryginalnej zawartości tej tablicy (która może ulec zmianie w wyniku wykonania funkcji).
Przykład
Zwiększenie n początkowych elementów tablicy o 1.
void inctab ( int a[ ], int n );
{
while (- - n >= 0) a[n] ++ ;
}
Wywołanie tej funkcji przez program spowoduje zwiększenie wartości elementów tablicy, której
nazwa zostanie podana w wywołaniu.
Uwaga
Na liście argumentów formalnych w nagłówku definicji funkcji podajemy nazwy tablic nie
podając rozmiarów tych tablic (gdyż i tak jedyną przekazywaną do funkcji wartością jest wskaźnik
do początku tej tablicy).
786885459.001.png
 
Zgłoś jeśli naruszono regulamin