wyklad 7 zap i, 18 11 2013


POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA KOMPUTERÓW
ZAP  zima 2013
Język programowania: C/C++
Åšrodowisko programistyczne: Qt
Wykład 7: Funkcje
2
Funkcje
Cel stosowania funkcji:
Podział problemu na prostsze podproblemy
Czytelność programów
Unikanie powtórzeń, wielokrotne wykorzystanie kodu
PRZYKAAD: Do wektorów N - elementowych (N - stała) wczytać dane następująco:
- do wektora a - wartości nie większe niż 5;
- do wektora b - wartości nie większe niż 8;
- do wektora c - wartości nie większe niż -3;
Pozostałe wczytywane dane pomijać.
int main ( ) {
const int N=4;
int a[N], b[N], c[N], i;
for (i=0; i cout <<  podaj wartosc nie wieksza niz 5 \n ;
cin >> a[i];
} while (a[i] > 5);
for (i=0; i cout <<  podaj wartosc nie wieksza niz 8 \n ;
cin >> b[i];
} while (b[i] > 8);
for (i=0; i cout <<  podaj wartosc nie wieksza niz -3 \n ;
cin >> c[i];
} while (c[i] > -3);
return 0;
}
3
Przykład  program z dwiema funkcjami
ta stała jest
...
dostępna
using namespace std;
w każdej definicji
const int N=7;
funkcji
void czytaj ( int x[ ], int g ) {
int i;
for (i=0; i do {
definicja funkcji
cout<< podaj wartosc nie wieksza niz  <czytaj
typ funkcji
cin >> x[i];
} while (x[i]>g);
}
nazwa funkcji
int main ( ) {
int a[N], b[N], c[N];
3-krotne
czytaj (a , 5);
wywołanie
czytaj (b , 8);
funkcji
definicja funkcji
czytaj
czytaj (c , -3); main
...
return 0;
}
void - tzw. typ pusty (brak typu)
4
Program z dwiema funkcjami c.d.
definicja funkcji czytaj:
parametry formalne
Uwaga: tu nie
void czytaj ( int x[ ], int g ) {
podajemy
int i;
rozmiaru
for (i=0; itablicy
do {
cout<< podaj wartosc nie wieksza niż  < cin >> x[i];
} while (x[i]>g);
}
// funkcja wczytuje do jakiejÅ› jednowymiarowej tablicy x typu int
// N wartości nie większych niż jakaś wartość g typu int.
wywołania funkcji czytaj:
int a[N], b[N], c[N];
...
czytaj (a , 5); // funkcja wykonuje siÄ™ dla danej tablicy a
czytaj (b , 8); // funkcja wykonuje siÄ™ dla danej tablicy b
czytaj (c , -3); // funkcja wykonuje siÄ™ dla danej tablicy c
parametry aktualne
5
Definicja funkcji
FUNKCJA - ciąg instrukcji zapisany pod jakąś nazwą i wywoływany za
pomocÄ… tej nazwy w programie.
FUNKCJA wykonując ciąg instrukcji wyznacza jedną wartość i zwraca ją
poprzez nazwę funkcji. Typ zwracanej wartości będziemy nazywali w skrócie
typem funkcji.
Aby funkcja zwróciła jakąś wartość, potrzebna jest instrukcja return, która
przerywa natychmiast działanie funkcji przekazując wynik do miejsca
wywołania funkcji.
Definicja FUNKCJI
nagłówek
typ_funkcji nazwa_funkcji ( lista parametrów formalnych )
funkcji
{
tu ciÄ…g deklaracji, definicji i instrukcji
ciało
funkcji
return w ; // w - wartość zwracana przez funkcję
(treść
// w może być zmienną, a nawet wyrażeniem
funkcji)
// ale nie może pokrywać się z nazwą funkcji
}
W nagłówku funkcji może nie występować lista parametrów formalnych;
nawiasy ( ) jednak muszą pozostać.
6
Typ wartości zwracanej przez funkcję
Typ wyniku funkcji może być jednym z następujących:
" typem prostym (int, double i inne typy liczbowe, char, bool)
" typem napisowym (string)
" typem wskaznikowym
" typem rekordowym
" typem pustym (void), który oznacza, że funkcja nie zwraca wyniku, więc
jej typ nie jest określony. Taka funkcja służy więc tylko do wykonania ciągu
instrukcji.
W każdym programie C/C++ musi
int main ( ) {
być funkcja main (główna).
void drukuj ( ... ) {
...
...
W języku C++ funkcja main jest
return 0;
}
zawsze typu int.
}
double suma ( ) {
double s1, s2;
...
Jeśli funkcja jest typu void, to instrukcja
return s1+s2;
return w ciele funkcji nie jest konieczna.
}
UWAGA: nazwa funkcji nie może być
To wyrażenie musi być typu
używana w treści funkcji jako zmienna
double lub dać się
przekonwertować na double
7
Wywoływanie funkcji
Wywołanie funkcji (podprogramu):
" zawiesza wykonanie funkcji wywołującej (np. programu głównego)
" następuje przejście do realizowania instrukcji określonych przez
definicjÄ™ funkcji
" wznowienie wykonywania funkcji wywołującej następuje w jednym
z dwu przypadków:
uð po napotkaniu instrukcji return
uð po wykonaniu wszystkich instrukcji zawartych w ciele funkcji
(jeśli funkcja jest typu void i jej treść nie zawiera żadnej instrukcji return)
8
Wywołanie funkcji
Wywołanie FUNKCJI
nazwa_funkcji ( lista parametrów aktualnych )
" Listę parametrów aktualnych podaje się wówczas, jeżeli w definicji funkcji
występowała lista parametrów formalnych
" Funkcje wywołuje się w wyrażeniach, w sposób analogiczny jak wywołuje się
funkcje standardowe.
Przykłady:
x = dlugosc (4.1, 5.3 ,8.5, 1.0);
cout << suma (a, 10);
if ( f (x,3) >5 ) licz++;
" Funkcje można wywoływać również jak zwykłe instrukcje - co ma sens wtedy,
jeśli nie jest potrzebny zwracany przez nie wynik, a funkcja ma za zadanie tylko
wykonać ciąg instrukcji; najczęściej wywołuje się w ten sposób funkcje typu
void.
Przykłady:
policz ( );
czytaj ( a, 5 );
rysuj ( 50,  *  );
9
Przykład 5
Wydrukować sumę wartości elementów wszystkich tablic a, b i c z poprzedniego
przykładu.
const int N=20;
void czytaj ( int x[ ], int g ) {
for (int i=0; i do { definicja
cout<< podaj wartosc nie wieksza niż  < cin >> x[i];
} while (x[i]>g);
}
int suma ( int x [ ]) {
definicja
int pom=0 ;
funkcji suma
for (int i = 0; i< N; i++)
pom = pom + x[i];
return pom;
}
int main( ) {
int a[N], b[N], c[N];
definicja
czytaj( a , 5 ); czytaj( b , 8 ); czytaj( c , -3 );
funkcji main
cout << suma(a)+ suma(b)+ suma(c);
return 0;
}
Najpierw trzeba zdefiniować funkcje czytaj i suma, a dopiero
potem można zdefiniować funkcję main, która je wywołuje.
10
Deklaracje i definicje funkcji - przykład
Jeżeli chcemy, by funkcja main była zawsze zdefiniowana jako pierwsza, wcześniej trzeba
umieścić deklaracje (nagłówek + średnik) tych funkcji, które są w ciele funkcji main
wywoływane.
const int N=20;
deklaracja funkcji czytaj
void czytaj ( int x[ ], int g );
deklaracja funkcji suma
int suma ( int x [ ]) ;
int main( ) {
int a[N], b[N], c[N];
definicja
czytaj( a , 5 ); czytaj( b , 8 ); czytaj( c , -3 );
funkcji main
cout << suma(a)+ suma(b)+ suma(c);
return 0;
}
void czytaj ( int x[ ], int g ) {
for (int i=0; idefinicja
do {
funkcji czytaj
cout<< podaj wartosc nie wieksza niż  < cin >> x[i];
} while (x[i]>g);
}
int suma ( int x [ ]) {
int pom=0 ;
definicja
for (int i = 0; i< N; i++)
funkcji suma
pom = pom + x[i];
return pom;
}
11
Przykład  funkcja drukowania tablicy dwuwymiarowej
tak podajemy informacje o tablicach dwuwymiarowych -
tylko liczba kolumn jest wbudowana w funkcjÄ™
const int W=5, K=7;
void pisz_tab (double x[ ][K], string tytul) {
cout << tytul << endl; // drukuj napis objaśniający
cout << fixed << setw (8) << setprecision (2); // ustaw format drukowania
for (int i = 0; i < W; i++) { // dla każdego wiersza
for (int j = 0; j < K; j++) // dla każdej kolumny w danym wierszu
cout << x [i] [j]; // wypisz wartość elementu
cout << endl; // przejdz do nowej linii - po wydrukowaniu całego wiersza
}
} // koniec definicji funkcji
// Funkcja pisz_tab drukuje wierszami jakÄ…Å› tablicÄ™ x typu double, o K kolumnach,
// poprzedzajÄ…c to wydrukowaniem jakiegoÅ› napisu tytul.
Nazwy funkcji należy pisać zgodnie z jednym z zalecanych stylów
pisania nazw zmiennych - czyli z małej litery, a wewnątrz albo znak
double a[W] [K], t [W] [K] ;
podkreślenia, albo wielkie litery, np. czytaj_i_pisz, zrobCos.
...
pisz_tab (a , "oto tablica a");
pisz_tab (t , "zawartosc tablicy t");
Parametry formalne i aktualne funkcji
Lista parametrów formalnych
(nazwa typu parametr 1 , nazwa typu parametr 2 , ... nazwa typu parametr n)
" nazwa typu musi określać typ wbudowany (int, char,...) lub wcześniej
zdefiniowany (np. strukturę, która musi być wcześniej zdefiniowana)
" do nazwy parametru mogą być dodatkowo dodane przedrostki & lub *
(znaczenie ich będzie omówione pózniej)
Lista parametrów aktualnych
(parametr 1 , parametr 2 , ... parametr n)
" ilość parametrów aktualnych musi być taka sama, jak ilość parametrów
formalnych
" typ parametrów aktualnych musi być zgodny z typem parametru formalnego
lub dać się na niego przekonwertować.
" Parametry formalne należy traktować jak jakieś zmienne podanego typu, za pomocą
których definiowane jest działanie funkcji. Nazwy tych parametrów nie mają znaczenia.
" Parametry aktualne muszą odwoływać się do konkretnych stałych i/lub zmiennych
zdefiniowanych w programie.
13
Wiązanie parametrów formalnych i aktualnych
PARAMETRY PRZEKAZYWANE PRZEZ WARTOŚĆ
" Parametr aktualny może być dowolnym wyrażeniem, ale nie typu plikowego
Sposób wykonania funkcji:
" przydzielenie pamięci dla parametru formalnego
" obliczenie wartości parametru aktualnego
" nadanie obliczonej wartości parametrowi formalnemu (wraz z ewentualną konwersją w
przypadku niezgodności typów) - tworzona jest kopia parametru aktualnego
" wykonanie algorytmu z tak ustaloną początkową wartością parametru formalnego
(wartość tego parametru może ulegać zmianie)
" zwolnienie pamięci zajętej przez parametr formalny
(nawet jeśli parametr formalny uległ zmianie, to parametr aktualny pozostanie nie zmieniony!)
PARAMETRY PRZEKAZYWANE PRZEZ ZMIENN (inaczej: przez nazwÄ™,
albo: przez referencję) - jeśli są poprzedzone w nagłówku znakiem & albo są
tablicami
" Parametr aktualny musi być zmienną (!), nie może być liczbą, stałą,
wyrażeniem. Bardzo wskazana jest dbałość o pełną zgodność typów
parametrów aktualnego i formalnego.
Sposób wykonania funkcji:
" nazwa parametru formalnego zostaje zastÄ…piona nazwÄ… parametru aktualnego
" funkcja wykonuje się na oryginalnym parametrze aktualnym - jeśli parametr aktualny
zmieni się w trakcie wykonania funkcji, to zachowa on zmienioną wartość po zakończeniu
jej wykonania.
14
Wiązanie parametrów formalnych i aktualnych - podsumowanie
PARAMETRY PRZEKAZYWANE PRZEZ WARTOŚĆ
" kopia parametrów tworzona jest na wewnętrzny użytek funkcji
" wszelkie zmiany parametrów dokonane w trakcie działania funkcji zostaną
więc utracone po zakończeniu jej działania.
PARAMETRY PRZEKAZYWANE PRZEZ ZMIENN (referencjÄ™)
" funkcja wykonuje siÄ™ na oryginalnych parametrach, nie na kopiach
" wszelkie zmiany parametrów dokonane w trakcie działania funkcji pozostają
więc aktualne po zakończeniu jej działania.
Jak przekazywać parametry ?
1. Wszystkie parametry, przez które funkcja zwraca wyniki, muszą być
przekazywane przez zmienną (należy je poprzedzić w nagłówku znakiem &) .
" Tablice zawsze są przekazywane przez zmienną (to pozwala uniknąć niepotrzebnego
kopiowania dużych tablic), nie poprzedza się ich znakiem & (byłby to błąd kompilacji; w
rzeczywistości bowiem nazwa tablicy jest wskaznikiem przekazywanym przez wartość - ale to będzie
pokazane dopiero w następnych wykładach).
" Zmienne plikowe należy zawsze przekazywać przez zmienną, używając
znaku &
" We wszystkich pozostałych przypadkach najlepiej jest stosować
przekazywanie przez wartość; w szczególności jest to konieczne, jeśli
parametr aktualny nie jest nazwÄ… zmiennej.
15
Przykłady nagłówków funkcji
double f (int x, int y) {
return sqrt (x*x+y*y) ;
}
// funkcja zwraca wartość typu double, obliczoną na podstawie jakichś dwu
// zmiennych x i y typu int
// oba parametry muszą być przekazywane przez wartość, dzięki czemu
// możliwe będzie wywołanie w postaci:
cout << f(a+5, 7) << f(2, f(3,1)-4 ); // w drugim przypadku wynik działania funkcji f
// jest argumentem funkcji f - ale ulegnie konwersji z double na integer
void min_max ( double a [ ] [ N ], double &min, double &max) {
//...ciało funkcji.....
}
// funkcja wczytuje jakÄ…Å› tablicÄ™ a typu double i wyznacza
// jakieÅ› dwie zmienne min i max typu double
gdyby te parametry nie były przekazywane przez
referencjÄ™, to param. aktualne min1 , max1 itd.
nie uległyby zmianie po wywołaniu funkcji
// przykład wywołania:
double min1, max1, min2, max2, a[N][N], b[N][N] ;
min_max (a, min1, max1);
min_max (b, min2, max2);
cout << min1 << max1 <

Wyszukiwarka

Podobne podstrony:
wyklad 8 zap i, 11 2013
wyklad 5 zap i, 4 11 2013
wyklad 6 zap i, 11 2013
Techniki negocjacji i mediacji w administracji wykłady 05 11 2013
wyklad 3 zap i,! 10 2013
Wykład 28 11 2013
wyklad zap i, 12 2013
wyklad zap i, 12 2013
wyklad 9 zap i, 2 12 2013
wyklad 1 zap i, 7 10 2013
wyklad 2 zap i, 10 2013
wyklad 4 zap i,( 10 2013 poprawiony
CHEMIA dla IBM Wyklad 8) 11 2013
6 11 2013 EGIPT W OKRESIE STAREGO I ŚREDNIEGO PAŃSTWA wykład

więcej podobnych podstron