funkcje i procedury

Transkrypt

funkcje i procedury
Deklaracja funkcji :
typ nazwa(lista parametrów formalnych);
zawiera wyłącznie nagłówek funkcji, czyli pierwszy wiersz jej definicji.
Definicja funkcji ma składnię:
typ nazwa (lista parametrów formalnych)
{
//polecenia zawarte w funkcji
}
Typ określa jakiego typu wartość przyjmuje funkcja nazwa. Jeżeli tu podamy określenie void,
funkcji nie jest przypisywana wartość. Gdy wpiszemy nazwę konkretnego typu, wówczas funkcji
nadawana jest wartość. Przypisanie wartości funkcji wykonuje się poleceniem return wewnątrz
funkcji.
PRZYKŁAD 1:
int funkcja(void)
{
int a=2, b=5;
funkcja oblicza sumę zmiennych a i b, ponadto
wartością funkcji jest wyznaczona suma a+b
return a+b;
}
PRZYKŁAD 2:
void funkcja (void)
{
int a=2, b=5;
cout<<a+b<<endl;
Tu nie pojawia się polecenie nadania jej wartości
return. Typ funkcji to void.
Wynika stąd ze:
- funkcji nie jest nadawana wartość
- Wyznaczona suma a i b wypisywana jest
bezpośrednio na ekran
}
Uruchomienie funkcji w programie wykonujemy następująco:
nazwa (lista parametrów aktualnych);
Jeżeli funkcja jest typu void, wywołujemy ją samodzielnie, nie wiążąc z żadnym wyrażeniem.
Jeśli funkcji przypisano wartość, to przeważnie obliczoną wartość przekazujemy do wyrażenia
(przypisać konkretnej zmiennej lub wykorzystać w wyrażeniu).
Parametry formalne to argumenty, które wprowadzamy do funkcji z zewnątrz. Lista parametrów
zawiera określenie ich typów i liczby. Z parametrami formalnymi mamy do czynienia w
momencie deklarowania (definiowania) funkcji. Gdy już przechodzimy do jej uruchomienia, w
miejsce parametrów formalnych wstawiane są parametry aktualne, czyli konkretne zmienne lub
wartości wpisywane w miejsce parametrów formalnych.
Należy zachować zgodność typów i liczby parametrów. Jeśli w miejsce parametrów formalnych
wpiszemy słowo void, wówczas funkcja nie posiada parametrów i jest uruchamiana z pustym
nawiasem.
PRZYKŁAD:
#include <iostream>
using namespace std;
void funkcja1(void)
{
cout<”uruchomienie funkcji1”<<endl;
}
void funkcja2 (int a, int b)
{
cout<<”uruchomienie funkcji2:”<<endl;
cout<<a+b<<endl;
}
int funkcja3(int a, int b)
{
return a+b;
}
main()
{
int x=2, int y=8, z;
funkcja1();
funkcja2(x,y);
cout<<”uruchomienie funkcji3”<<endl;
z=funkcja3(x,y);
cout<<”suma= „<<z<<endl;
}
----------------------------------------------------------------------------------------------------------------------------
Zmienne lokalne i globalne
Zakresem działania zmiennej jest blok w którym została dana zmienna zadeklarowana.
Jeśli zmienna zostanie zadeklarowana we wnętrzu funkcji lub instrukcji, to nazywamy ją
zmienną lokalną.
Zmienna zadeklarowana w funkcji dostępna jest od momentu jej zadeklarowania do
zakończenia działania funkcji.
Zmienna zadeklarowana w instrukcji jest lokalna względem tej instrukcji.
Zmienna globalna deklarowana jest w części deklaracyjnej programu i można się do niej
odwoływać w dowolnym miejscu programu. Jest o niebezpieczne ponieważ wartość takiej
zmiennej może być zmienina przez jedną z funkcji w sposób niewidoczny dla innej funkcji.
PRZYKŁAD:
# include <iostream>
Rusing namespace std;
int a=5;
int oblicz(void)
{ int b=4;
return a*b;
}
Zmienna b jest lokalna – dostępna tylko w ………..
Zmienna c jest lokalna dostępna tylko w ………….
zmienna a jest ……………. dostępna
………………………………………………..
main()
{
int c;;
c=oblicz();
cout<<c<<endl;
return 0;
}
Przekazywanie parametrów w funkcjach
1. Przez wartość
stosowana jest wówczas, gdy nie chcemy, aby wartość parametrów aktualnych była
zmieniana wewnątrz funkcji lub gdy w miejsce parametrów chcemy wpisać wartości liczbowe.
Podczas wywołania funkcji tworzona jest pomocnicza zmienna lokalna o tej samej
nazwie co parametr formalny i o wartości równej parametrowi aktualnemu, z której korzysta
program.
Po zakończeniu funkcji zmienna pomocnicza jest kasowana, działania wykonane na niej
nie są widoczne poza funkcją.
PRZYKŁAD:
funkcja:
void funkcja(int n)
{
n-n+2;
cout<<”wewnątrz funkcji
n=”<<n<<endl;
}
uruchomienie funkcji:
int a=5;
funkcja(a);
cout<<” na zewnątrz funkcji: „<<a<<endl;
Tablica jednowymiarowa
Elementy tablicy numerowane są od 0.
Deklaracja tablicy:
typ identyfikator [rozmiar]
np. t[5];
do elementów odwołujemy się przez indeksy: t[0], t[1], .., t[?];
deklarując tablicę t[rozmiar] nie możemy odwoływac się do elementu t[rozmiar]. Indeksy tej
tablicy zawierają się w zakresie […;… .] .
Nadanie tablicy wartości początkowej umożliwia inicjalizacja tablicy, która ma postać:
typ identyfikator [rozmiar]={lista wartości};
Nazwa tablicy jest adresem elementu tablicy o numerze 0. Wynika stąd , że zapisy *t i t[0] są
równoważne. Nastepne elementy tablicy można wskazywać, dodając numer elementu do
wskaźnika wyrazu początkowego.
np. mamy zadeklarowaną tablicę int t[4], wówcza elementy tablicy mają następujące
identyfikatory:
t[0] lub *t
t[1] lub *(t+1)
t[2] lub *(t+1)
t[3] lub *(t+2)
t[4] lub *(t+3)
Jeżeli chcemy przekazać tablicę jako parametr do funkcji, musimy pamiętać ze do funkcji
przekazywany jest tylko adres początkowy tablicy
np. deklaracja funkcji ma postać:
void funkcja (double t[]);
void funkcja(double *t);
PRZYKŁAD:
#include <iostream>
#include <iomanip>
using namespace std;
const int max=25;
void wczytaj (int *t, int n)
{
cout<<”podaj elementy tablicy: ‘<,endl;
for (int i=0; i<n; i++)
{
cout<,”t[“<<i<<] = “;
cin>.t[i] ;
cout<<endl;
}
}
void wypisz (int t[]. int n)
{
cout<<”wczytana tablica: „<<endl;
for (int i=0; i<n; i++)
cout<<setw(7)<<t[i] ;
//setw(7) – wyznacza szerokość pola równą n znaków
cout<<endl;
}
void wypiszodwrotnie (int t[], int n)
{
cout<<”\nwczytana tablica odwrotnie: “<<endl;
for (int i-n; i>=0; i--) cout<<setw(7)<<t[i];
cout<<endl;
}
main()
{
int t[max];
wczytaj (t,8);
wypisz (t,8);
wypiszodwrotnie (t,8);
return 0;
}