Ogólnie

 

Na Wikipedii jest wprost genialnie to opisane, dlatego poniżej zrobiłem z niej wyciąg.

Podprogram (inaczej funkcja lub procedura) - termin związany z programowaniem proceduralnym. Podprogram to wydzielona część programu wykonująca jakieś operacje. Podprogramy stosuje się, aby uprościć program główny i zwiększyć czytelność kodu.

Czym się różni funkcja

 

W pewnych językach programowania dzieli się podprogramy na funkcje i procedury:

  • Funkcja ma wykonywać obliczenia i zwracać jakąś wartość, nie powinna natomiast mieć żadnego innego wpływu na działanie programu (np. funkcja obliczająca pierwiastek kwadratowy)
  • Procedura natomiast nie zwraca żadnej wartości, zamiast tego wykonuje pewne działania (np. procedura czyszcząca ekran)
Przez zwracanie wartości należy rozumieć możliwość użycia wywołania funkcji wewnątrz wyrażenia. Procedury często też zwracają wartości, ale poprzez odpowiednie parametry.

Podział ten występuje w językach takich jak Pascal i Ada. W pozostałych językach (m. in. w C i C++) nie ma już takiego rozróżnienia i funkcją jest każdy podprogram, niezależnie od tego czy zwraca jakieś wartości i czy ma wpływ na program.

W C++ procedurą nazwali byśmy każdą funkcję typu void. Oczywiście, jeżeli spełnia ww. warunki.

Identyfikacja funkcji

 

Podprogram może być identyfikowany:

  • przez nazwę - identyfikator przypisany do podprogramu w jego deklaracji
    jest to najczęściej spotykany przypadek w językach wysokiego poziomu
    języki programowania: Ada, C, C++, COMAL, Clipper, Forth, Icon, Logo, Modula 2, Pascal, Simula 67, PL/1, PL/M, Visual Basic
  • przez etykietę
    języki programowania:Basic, Visual Basic,
  • przez liczbę - literał całkowity
    języki programowania:Basic, Visual Basic, Jean, JOSS
  • przez adres/referencję
    w językach wysokiego poziomu takie wskaźniki do podprogramów przechowywane są w zmiennych typu proceduralnego/funkcyjnego lub wskaźnikowego

Metody wywołania podprogramu

 

Wartościową cechą podprogramu jest możliwość wielokrotnego jego wywołania. Wywołanie podprogramu może być:

  • funkcyjne – w wyrażeniu, do którego podprogram zwraca obliczoną wartość,
    • poprzez nazwę z listą argumentów, np. A=B+Func(C); lub
    • wielokrotne (zagłębione), np. L=Trim(Copy(Delete(‘ Ala ‘,3,1),3));
    oczywiście taka forma wywołania dotyczy tylko podprogramów mających cechy funkcji, tzn. zwracających wartość,
  • proceduralne (instrukcja wywołania):
    • poprzez nazwę z listą argumentów, np. Proc(A, 5); - m.in. Pascal,
    • po słowie kluczowym,
      • CALL Proc(A, 5); - PL/1, Visual Basic,
      • EXEC Proc(A, 5) - Comal,
    • inne:
      • Basic: 10 GOSUB 50
      • Jean, JOSS: 1.2 DO PART 3
Konkretne implementacje języków często dopuszczają wywołanie funkcji w postaci proceduralnej, tzn. poza wyrażeniami. W tym przypadku zwracana przez podprogram wartość jest ignorowana – np. jest tak w Borland Pascalu.

Komunikacja funkcji z otoczeniem

 

Podprogram jako samodzielna, wydzielona część algorytmu, zazwyczaj (z wyjątkiem prostych operacji, np. czyszczenie ekranu) musi komunikować się z otoczeniem. Taką komunikację realizuje się za pomocą:

  • zmiennych globalnych,
  • argumentów (parametrów aktualnych), przypisywanych zdefiniowanym w podprogramie parametrom (parametrom formalnym),
  • rezultatów funkcji (wartości zwracanych do miejsca wywołania),
  • pól obiektu (dla metod danego obiektu),
  • wyjątków,
  • i innych, rzadko stosowanych lub nie zalecanych, jak np.:
    • obszarów wspólnych (nakładanych np. COMMON),
    • zmiennych nakładanych (np. absolute)

Przekazywanie argumentów

 

  • Argumenty przekazywane przez wartość
    W tym przypadku parametr zachowuje się w podprogramie jak zmienna lokalna, której przypisano w momencie wywołania podprogramu wartość początkową, równą wartości przekazywanego argumentu. Oznacza to, że argument przekazywany do podprogramu może być wyrażeniem. Po zakończeniu podprogramu, wartość odpowiedniego parametru, nie zostanie zachowana.

    Przykładowe języki programowania: Ada (in), Pascal, C, Modula-2, Snobol i inne.

  • Argumenty przekazywane przez wynik
    Parametr zachowuje się jak zmienna lokalna, bez wartości początkowej (a więc należy dokonać przypisania wartości w podprogramie), a po zakończeniu podprogramu, argument (który powinien być zmienną, wskazaniem na zmienną lub innym wyrażeniem dopuszczalnym po lewej stronie operatora przypisania w danym języku programowania) otrzyma wartość nadaną w podprogramie, przekazaną do miejsca wywołania.

    Przykładowe języki programowania: Ada (out), Algol W

  • Argumenty przekazywane przez wartość i wynik
    Parametr zachowuje się więc jak zmienna lokalna o nadanej w momencie wywołania podprogramu wartości początkowej, równej wartości przekazywanego argumentu, a po zakończeniu podprogramu argument zachowa ostatnio nadaną parametrowi wartość.

    Przykładowe języki programowania: Ada (in out).

  • Argumenty przekazywane przez referencję
    Argumenty przekazywane przez referencję (przez zmienną, przez adres), to nałożenie zmiennej reprezentowanej przez parametr na zmienną reprezentowaną przez argument. Każda zmiana wartości parametru oznacza w rzeczywistości zmianę wartości skojarzonego z nim argumentu. Różnica z przekazywaniem argumentu przez wartość i wynik polega więc na tym, że w tym drugim przypadku istnieje zmienna lokalna, na której wykonywane są wszystkie operacje, przy przekazywaniu przez referencję wszystkie operacje wykonywane są bezpośrednio na argumencie.

    Przykładowe języki programowania: C/C++, Pascal (var), Modula-2, PL/1, Cobol, Fortran.

Przykład w języku Pascal

 

(Bo w C++ to umie każdy ;)

Jako procedura:

procedure Procedura( {argumenty} );
 begin
    { instrukcje do wykonania }
 end;
Jako funkcja:
function Funkcja( {argumenty} ) : integer; { typ wartości funkcji }
 begin
    { instrukcje do wykonania (ciało funkcji) }
 end;