Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałKornelia Boruń Został zmieniony 10 lat temu
1
Podstawy programowania PP – LAB4 Wojciech Pieprzyca
2
Funkcje Funkcja jest częścią programu spełniającą określone zadanie. Cały program zwykle składa się z wielu funkcji (podprogramów). Pozwala to podzielenie programu na wiele mniejszych, niezależnych fragmentów. Funkcja może na wejściu przyjąć dowolną liczbę argumentów. Każda funkcja musi zwrócić na wyjściu jakąś wartość. W szczególności, gdy nie istnieje potrzeba zwracania żadnej konkretnej wartości, zwracana jest tzw. wartość pusta typu void.
3
Definicja funkcji Definicja funkcji polega na określeniu typu zwracanego przez funkcję, jej nazwy oraz listy argumentów. W ramach definicji określa się również działanie funkcji tzw. ciało funkcji. typ nazwa(lista argumentów) { ciało funkcji return typ; } Lista argumentów może być pusta () lub też przyjąć dowolnie wiele wartości: (typ zm1,typ zm2,…, typN zmN) Każdy argument musi mieć określony swój typ i nazwę. Zwracana wartość określana jest po słowie return. Typ zwracanej wartości musi zgadzać się z typem podanym w nagłówku funkcji.
4
Przykłady void funkcja1() Funkcja nie zwracająca żadnej wartości i nie przyjmująca żadnych argumentów. void funkcja2(int x) Funkcja nie zwracającą żadnej wartości i przyjmującą jeden argument wartość x typu całkowitego. int funkcja3(float x) Funkcja zwracająca wartość całkowitą i przyjmująca jako argument wartość x typu rzeczywistego. double funkcja4(int x, char y) Funkcja zwracająca wartość rzeczywistą i przyjmująca jako argumenty wartość x typu całkowitego i wartość y typu znakowego.
5
Przykład funkcji – wzór Herona float Heron (float a, float b, float c) { float p = (a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } Int main() { float a,b,c; cout << Podaj a: ; cin >> a; cout << Podaj b: ; cin >> b; cout << Podaj c: ; cin >> c; cout << Pole trojkata = << Heron(a,b,c); }
6
Uwagi do programu Program oblicza pole trójkąta zgodnie ze wzorem podanym przez Herona. Obliczanie pola odbywa się w funkcji o nazwie Heron. Funkcja ta przyjmuje trzy argumenty, którymi są długości boków trójkąta a,b,c. Wszystkie te wartości są typu rzeczywistego float. Jako typ zwracanej wartości również określono typ rzeczywisty float. Zwrot wartości funkcji następuje poprzez instrukcję return. Wartość ta określana jest poprzez wzór sqrt(p*(p-a)*(p- b)*(p-c)). Funkcja główna w naszym programie zapytuje użytkownika o długości boków a,b,c po czym przekazuje je jako argumenty wejściowe do funkcji Heron. Funkcja Heron z kolei zwraca obliczoną wartość pola trójkąta, która w funkcji main jest wyświetlana na ekranie.
7
Przekazywanie argumentów przez wartość (I) Argumenty do funkcji mogą być przekazywane na dwa sposoby: 1.Przez wartość, 2.Przez referencję. Najpierw omówimy sposób przekazywania zmiennej przez wartość. Przekazywanie przez wartość charakteryzuje się tym, iż do funkcji nie jest przekazywany oryginał podawanej zmiennej, a jedynie kopia jej wartości. Konsekwencją tego faktu jest to, że jakiekolwiek zmiany dokonane na zmiennej w ramach funkcji są ważne tylko do jej zakończenia. Po zakończeniu funkcji, wszelkie odwołania do zmiennej będą wskazywać na oryginalną, niezmienioną wartość.
8
Przekazywanie argumentów przez wartość (II) void zmien(int liczba) { liczba = liczba+5; cout << Liczba w funkcji: << liczba << endl; } int main() { int liczba = 10; cout << Liczba przed wywolaniem funkcji: << liczba << endl; zmien(liczba); cout << Liczba po wywolaniu funkcji: << liczba << endl; } Wynikiem działania programu będzie wyświetlenie wartości 10,15,10. Wynika to z tego, że zmieniona wartość liczby widoczna jest tylko w ramach funkcji zmien.
9
Przekazywanie argumentów przez referencję (I) W przypadku przekazywanie argumentu przez referencję do funkcji nie trafia sama wartość argumentu, tylko adres komórki pamięci w której ta wartość się znajduję. Wszelkie odwołania w ramach funkcji odnosić się zatem będą do oryginalnej zawartości zmiennej. Należy zatem zauważyć, że w przypadku przekazywania argumentów przez referencje, wszelkie zmiany dokonywane na zmiennych będą widoczne także po zakończeniu funkcji. Przekazywanie argumentów przez referencję uzyskuje się poprzedzając w nagłówku funkcji nazwy zmiennych znakiem ampersand (&). Samo wywołanie takiej funkcji pozostaje bez zmian.
10
Przekazywanie argumentów przez referencję (II) void zmien(int &liczba) { liczba = liczba+5; cout << Liczba w funkcji: << liczba << endl; } int main() { int liczba = 10; cout << Liczba przed wywolaniem funkcji: << liczba << endl; zmien(liczba); cout << Liczba po wywolaniu funkcji: << liczba << endl; } Wynikiem działania programu będzie wyświetlenie wartości 10,15,15. Bierze się to stąd iż operacje w funkcji były wykonywane na oryginalnej zawartości zmiennej liczba.
11
Ćwiczenia (1) 1.Napisz program, która wyznacza wartość wielomianu ax 2 +bx+c. Program powinien składać się z 2 funkcji. Pierwsza pyta użytkownika o parametry a,b,c,x, a druga oblicza samą wartość wielomianu. 2.Napisz funkcję przyjmującą trzy argumenty. Pierwsze i drugi argument to liczby, a trzeci to nazwa operacji do wykonania. Dozwolone operacje to suma, różnica, iloczyn i iloraz. Funkcja ma zwracać wynik wykonanego wyrażenia. 3.Napisz funkcję, która sprawdza czy dany trójkąt o podanych bokach a, b i c jest równoboczny, równoramienny lub prostokątny. 4.Napisz dwie funkcje. Jedna wyznacza minimum a druga maksimum dwóch podanych liczb.
12
Funkcję operujące na tekście (1) Pod pojęciem tekstu rozumiemy w tym przypadku ciąg znaków nazywany także łańcuchem tekstowym. Tekst przechowywany jest w postaci tablicy znaków. Przykład deklaracji takiej tablicy znajduje się poniżej: char tekst[20]; W tej tablicy możemy zapisać do 20 znaków. Do zapisu może posłużyć nam funkcja strcpy kopiująca podany tekst do miejsca docelowego np. strcpy(tekst,Przykladowy krotki tekst); Każda litera tekstu zapisana jest w osobnej komórce tablicy. Oznacza to, że do pierwszej litery możemy odwołać się pisząc tekst[0]. Należy pamiętać o tym, że tablice w C++ są numerowane od 0, a więc indeksy dla tablicy 20 elementowej rozpoczynają się od 0 a kończą na 19.
13
Funkcję operujące na tekście (2) Możliwa jest także inicjalizacja (przypisanie tekstu) do tablicy znakowej już w trakcie jej deklaracji np. char tekst[20] = Super tekst; Także bez podawania wielkości tablicy takie przypisanie będzie poprawne, wówczas rozmiar tablicy zostanie dostosowany do rozmiaru podanego tekstu np. char tekst[] = Super tekst; W tym przypadku tekst składa się z 11 znaków i taki też będzie rozmiar tablicy. Do łączenia tekstów (tzw. konkatenacja) służy funkcja strcat. Składnia: strcat(tekst1, tekst2); Przykład: tekst = strcat(kot,w butach);
14
Funkcję operujące na tekście (3) Długość łańcucha tekstowego można sprawdzić za pomocą funkcji strlen(napis). Przykład: char tekst[20] = WSIiZ; cout << strlen(tekst); Powyższy przykład wyświetli liczbę 5 oznaczającą długość podanego tekstu WSIiZ. Brany jest zatem pod uwagę nie rozmiar samej tablicy w której przechowywany jest tekst, ale efektywna długość samego ciągu znaków. Kolejna funkcja to strcmp(tekst1,tekst2). Sprawdza ona czy podane dwa teksty są identyczne. Jeżeli tak to zwraca wartość 0, w przeciwnym razie wartość różną od 0. Przykład: if (strcmp(tekst,ala)==0) cout << Zmienna tekst to ala;
15
Funkcję operujące na tekście (4) Funkcja strstr(tekst1,tekst2) poszukuje ciągu znaków tekst2 w tekst1. Jeżeli tekst zostanie znaleziony to funkcja zwróci wskaźnik do pierwszego wystąpienia tekstu, jeżeli tekst nie zostanie odnaleziony to funkcja zwróci 0. Przykład: if (strstr(tekst,ala)!=0) cout << Zmienna tekst zawiera napis ala; Ponieważ funkcja wczytującą dane z klawiatury do zmiennej (cin) potrafi operować tylko na pojedynczym wyrazie (bez spacji) to wprowadzono dodatkową funkcję gets (get string – czyli pobierz ciąg znaków). Funkcja ta ma postać: gets(zmienna) i powoduje zapis do zmiennej całego tekstu wpisanego z klawiatury. Przykład: cout << Podaj imie i nazwisko; gets(dane); cout << dane;
16
Ćwiczenia (2) 1.Napisz funkcję, która przyjmuje jako parametry dwa łańcuchy tekstowe, a następnie: - pokaże długość pierwszego i drugiego łańcucha, - połączy oba łańcuchy w jeden i go wyświetli, - sprawdzi czy łańcuchy są takie same. 2.Napisz funkcję, która przyjmuje jako parametry dwa łańcuchy tekstowe (dany,szukany), a następnie sprawdza za pomocą funkcji strstr czy tekst szukany znajduje się w tekście danym. Proszę wykorzystać funkcję gets.
17
Funkcje rekurencyjne (1) Rekurencja dotyczy przypadków, gdy funkcja wywołuje samą siebie ze swego wnętrza. Oczywiście takie cykliczne wywołanie musi mieć swój koniec, dlatego każda funkcja rekurencyjna posiada warunek zakończenia, kiedy to nie wywołuje się funkcji, a zwraca jakąś konkretną wartość. Przykładem zastosowania funkcji rekurencyjnej może być obliczanie silni. Silnia to iloczyn kolejnych liczb naturalnych od 1 do n, gdzie n to wartość dla której chcemy obliczyć silnię: 0! = 0 1! = 1 n! = n*(n-1)!
18
Funkcje rekurencyjne (2) Funkcja obliczająca silnię wygląda następująco: int silnia(int n) { if (n==1) return 1; return n*silnia(n-1); } Jak widzimy, wewnątrz funkcji wywołuje ona samą siebie. Różni się jedynie argument przekazywany do funkcji, który za każdym wywołaniem pomniejszany jest o jeden (n-1). Warunkiem kończącym ciąg wywołań funkcji jest wartość n=1 (co zajdzie wówczas, gdy do funkcji zostanie przekazana wartość 1).
19
Funkcje rekurencyjne (3) Przeanalizujmy ciąg wywołań dla obliczenia wartości 5!. Pierwotne wywołanie silnia(5) silnia(1) = 1 silnia(n) = n*silnia(n-1), dla n>1 a zatem: silnia(5) = 5*silnia(4) = 5*4*silnia(3) = 5*4*3*silnia(2) = = 5*4*3*2*silnia(1) = 5*4*3*2*1 = 120
20
Ćwiczenia (3) 1.Napisz funkcję rekurencyjną obliczającą dowolny wyraz ciągu Fibonacciego. Ciąg ten ma następującą postać: F(1) = 1 F(2) = 1 F(n) = F(n-1)+F(n-2), dla n>2
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.