Funkcja – wysoce niezależny blok definicji i instrukcji programu (podprogram).
Każdy program napisany w języku C/C++ zawiera przynajmniej jedną funkcję o predefiniowanej nazwie: main(). Najczęściej wykorzystuje się również wiele innych predefiniowanych funkcji, np. printf(...), scanf(...), abs(...), sin(...), itp. Można także definiować nowe - własne funkcje.
Ogólna postać deklaracji funkcji:
typ_funkcji nazwa_funkcji (lista typów argumentów);
Deklaracja funkcji informuje kompilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty:
float fun(int a);
float fun(int);
Nazwy argumentów w deklaracjach nie są istotne dla kompilatora i można je pominąć.
Definicja jest deklaracją, w której jest przedstawiona treść funkcji. Każda funkcja wywoływana w programie musi być zdefiniowana, tylko raz.
#include <iostream.h>
long dodaj(int, int); //deklaracja funkcji, prototyp funkcji
main() {
long wynik; int i=9; float f=3.45;
wynik = dodaj(2, 5); //wywołanie funkcji
wynik = dodaj(3, i);
wynik = dodaj(i, f); //konwersja float do int
}
long dodaj(int a, int b){ //definicja funkcji
long w;
w=2*a+2*b;
return (w); //return (2*a+2*b) jest instrukcją powrotu
}
Przy przekazywaniu argumentów, sprawdza się typ argumentów i tam gdzie trzeba dokonuje się niejawnej i jawnej konwersji typów argumentów.
lista parametrów funkcji może być pusta lub zawierać opisy kolejnych parametrów (oddzielone przecinkami):
main( )
main(void)
main(int argc, char* argv[ ])
parametry definiowane są tak jak zmienne.
Uwaga: nie można grupować sekwencji parametrów tego samego typu:
int MAX (int liczba_1, liczba_2, liczba_3) źle!
„ciało” funkcji jest zawarte pomiędzy nawiasami klamrowymi: {...} (bez średnika na końcu),
działanie funkcji kończy się po napotkaniu polecenia return lub po wykonaniu sekwencji wszystkich instrukcji zawartych w ciele funkcji,
jeżeli funkcja jest typu void, to używamy samego słowa return, bez żadnego wyrażenia po nim,
jeżeli funkcja jest typu innego niż void, wówczas po poleceniu return musi się pojawić wyrażenie odpowiedniego typu (może być w nawiasach), np.:
return liczba_1;
return(liczba_1);
Podczas wywoływania funkcji przydziela się pamięć dla jej argumentów formalnych, a następnie każdemu argumentowi formalnemu przypisuje się odpowiadający mu parametr aktualny. Sprawdza się przy tym zgodności typów i w razie potrzeby dokonuje się konwersji.
void func(int par) {
par += 5; //par = par+5;
}
Zmienna par to tzw. parametr formalny funkcji. W funkcji main() wywołujemy ją w następujący sposób:
void main(){
int a1=5;
func(a1); // a1 to jest parametr aktualny funkcji
}
Argumenty przekazujemy:
przez wartość
przez wskaźnik
przez referencję (przezwisko).
Funkcja pracuje na kopii zmiennej (parametru aktualnego), więc funkcja nie ma możliwości modyfikowania go. Parametr aktualny służy jedynie do modyfikacji parametru formalnego przechowywanego tymczasowo na stosie.
int func(int par){
par = par + 5;
cout<<"\nfunkcja: par="<<par;
return (par);
}
Zmienna par to argument (parametr) formalny funkcji.
void main(){
int w, a1=5;
cout<<"\nParametr aktualny przed wywolaniem: a1 = "<<a1;
w = func(a1);
cout<<"\nParametr aktualny po wywolaniu: a1 = "<<a1;
cout<<"\nWynik = "<<w;
}
Przy przekazywaniu parametru przez referencje do funkcji przesyłany jest adres zmiennej. Operacje przeprowadzane są bezpośrednio na zmiennej, której referencje przesłano do funkcji lub na zmiennej tymczasowej, gdy występuje niezgodność typu referencyjnego i argumentu.
#include <iostream.h>
void zer(int wart, int &ref);
/******************************************************/
main(){
int a=44, b=77 ;
cout « "Przed wywolaniem funkcji: zer \n";
cout « "a = " « a « ", b = " « b « endl;
zer(a, b) ;
cout « "Po powrocie z funkcji: zer \n"
cout « "a = " « a « ", b = " « b « endl;
/*****************************************************/
void zer( int wart, int &ref){
cout « "\tW funkcji zer przed zerowaniem \n";
cout « "\twart = " « wart « ", ref = " « ref « endl; wart = 0;
ref = 0;
cout « "\tW funkcji zer po zerowaniu \n";
cout « "\twart = " « wart « ", ref = " « ref « endl;
}
}
Przeanalizuj programy z przykładów 1, 2, 3 i uzasadnij wyniki ich działania.
Napisz program obliczający silnię dla liczby całkowitej podanej z klawiatury (program zawiera funkcję o nazwie silnia).
Przy użyciu funkcji z zadania 2 napisz program obliczający współczynnik Newtona $\left( \frac{n}{k} \right)$.