Funkcje Deklaracja funkcji typ funkcji identyfikator_funkcji(lista parametrów formalnych); Typ funkcji określa typ wartości zwracanej przez funkcję (typ zdefiniowany pierwotnie jak int, typ zdefiniowany przez użytkownika np. klasa, lub typ void, który oznacza, że funkcja nie przekazuje wartości). Typem wartości zwracanych przez funkcję nie może być funkcja ani tablica. Lista parametrów formalnych składa się z typów argumentów oddzielonych przecinkami. Po każdym typie argumentu może nieobowiązkowo występować nazwa. Lista parametrów formalnych może być pusta, ale nie możemy opuścić nawiasów okrągłych: int fun() jest równoważne int (void). Napisz funkcję SUMA wyznaczającą sumę dwóch zadanych liczb całkowitych. Deklaracja funkcji SUMA może wyglądać w następujący sposób: int SUMA(int, int); lub int SUMA(int a, int b); Definicja funkcji Definicja funkcji różni się od deklaracji. Składa się z nagłówka funkcji oraz treści funkcji ujętej w nawiasy klamrowe. W przypadku definicji wiersza nagłówkowego nie kończymy średnikiem. W treści funkcji, która ma określony typ wyniku, powinna wystąpić przynajmniej jedna instrukcja return wyrażenie; Wartość tego wyrażenia będzie wynikiem funkcji. Gdy funkcja jest typu void, powinno wystąpić samo słowo return; Wykonanie instrukcji powoduje zakończenie wykonywania funkcji. Definicja funkcji SUMA: int SUMA(int a, int b) return a+b; lub int SUMA(int a, int b) int c=a+b; return c; Wykorzystanie funkcji w programie. W programie wykorzystujemy funkcję pisząc identyfikator_funkcji(lista param. aktualnych). Nazwy parametrów aktualnych mogą różnić się od nazw parametrów formalnych. Kompilator sprawdza zgodność typów parametrów aktualnych z typami parametrów formalnych. Zgodne są typy identyczne oraz takie, dla których można dokonać automatycznej konwersji wartości. #include<iostream> using namespace std; int main() int c1,c2; cout<<"c1="; cin>>c1; cout<<"c2="; cin>>c2; cout<<"c1+c2="<<suma(c1,c2)<<endl; system("pause"); return 0;
Sposoby przekazywania parametrów. Parametry do funkcji można przekazywać na trzy sposoby: przez wartość, przez referencję oraz przez wskaźnik. Dwa pierwsze sposoby zostaną omówione poniżej. Przekazywanie parametru przez wartość zostało zastosowane w definicji funkcji SUMA. Parametry przekazane w ten sposób nie zmieniają wartości pod wpływem działania funkcji (ponieważ są one lokalnymi kopiami tych argumentów i znajdują się na stosie podczas wykonywania funkcji). Przekazanie parametru przez referencję odbywa się przez postawienie znaku & przed nazwą parametru i umożliwia zmianę wartości zmiennej, która jest parametrem aktualnym, pod wpływem działania funkcji. Przykład: void fun(int& k) k = k + 2; Taki zapis oznacza, że argument typu int zostanie przesłany do funkcji przez referencję. Jeśli wywołamy tę funkcję podając jako argument pewną zmienną typu int, to w czasie wykonania funkcji nazwa parametru k będzie inną nazwą dokładnie tej samej zmiennej. A więc nie będzie kopiowania wartości na stos: zmienna lokalna w funkcji w ogóle nie będzie tworzona, nazwa k będzie odnosić się do oryginału zmiennej będącej argumentem wywołania. Jeśli powyższą funkcję wywołamy w funkcji main() tak: int m = 1; fun(m); cout << "m = " << m << endl; to wewnątrz funkcji nazwa k będzie inną nazwą tej zmiennej, która w programie wywołującym nazywa się m. Ta właśnie zmienna zostanie przez funkcję powiększona o dwa. Zatem po wykonaniu funkcji zmienna m w funkcji wywołującej będzie zmieniona - jej wartość wynosić będzie teraz trzy. Zauważmy, że samo wywołanie funkcji wygląda tak jak normalne wywołanie przez wartość. Przy wywołaniu przez wartość jednak to kopia wartości m byłaby przypisana do lokalnej dla funkcji zmiennej k. Modyfikacje tej lokalnej zmiennej nie odbiłyby się w żaden sposób na wartości oryginału, czyli zmiennej m z funkcji wywołującej. Zatem z przekazywania parametrów przez referencję korzystamy, gdy chcemy zmieniać wartości argumentów aktualnych lub chcemy przekazać dodatkowe wyniki funkcji do funkcji wywołującej. Ponadto parametry referencyjne to wygodny sposób przekazywania do funkcji obiektów o znacznych rozmiarach. Parametr zadeklarowany jako referencyjny jest inną nazwą zmiennej przekazanej jako argument. Zatem ta zmienna musi istnieć. Przekazywanie tablic do funkcji. Jeżeli parametrem funkcji jest tablica, jest ona przekazywana przez wskaźnik do pierwszego elementu tablicy, co umożliwia również zmianę wartości elementów tablicy pod wpływem działania funkcji. Wymiar tablicy należy przekazać jako osobny argument. (np. float max(float tab[],int wymiar)) void ZwiekszOPiec1(int a) a+=5; return; void ZwiekszOPiec2(int &a) a+=5; return;
Do funkcji ZwiekszOPiec1 parametr został przekazany przez wartość, do funkcji ZwiekszOPiec2 przez referencję. Wykorzystanie obu funkcji #include<iostream> using namespace std; int main() int liczba=11; cout<<"liczba ma wartość "<<liczba<<endl; ZwiekszOPiec(liczba); cout<<"wartość zmiennej liczba po wykonaniu funkcji ZwiekszOPiec1 wynosi " <<liczba<<endl; //funkcja nie zmieniła wartości zmiennej liczba, //ze względu na przekazanie jej przez wartość ZwiekszOPiec2(liczba); cout<<"wartość zmiennej liczba po wykonaniu funkcji ZwiekszOPiec2 wynosi " <<liczba<<endl; //funkcja zwiększyła wartość zmiennej. Teraz liczba=16 system("pause"); return 0; Argumenty domyślne W C/C++ istnieje możliwość definiowania funkcji o domyślnych wartościach argumentów. Znaczy to, że wywołując funkcję nie trzeba podawać wszystkich argumentów: dla tych argumentów, których wartość nie została podana, przyjęta zostanie wartość domyślna. Aby skorzystać z tej możliwości, definiujemy funkcję, określając wartości domyślne dla parametrów funkcji bezpośrednio w nagłówku. Muszą to być końcowe parametry: jeśli któryś z parametrów ma wartość domyślną, to wszystkie parametry występujące na liście parametrów po nim też muszą mieć przypisane wartości domyślne. Wartości domyślne można przypisać tylko raz: jeśli zrobimy to w deklaracji, to nie powtarzamy tego w definicji. Na przykład, można zadeklarować funkcję fun o jednym argumencie obowiązkowym i dwoma z wartościami domyślnymi: void fun(int i, int b = 0, double x = 3.14); Ponieważ w deklaracji nazwy parametrów są i tak pomijane, tę samą deklarację możemy zapisać tak: void fun(int, int = 0, double = 3.14); W dalszej części programu musimy oczywiście podać definicję tej funkcji; tam już przypisania wartości domyślnych nie umieszczamy: void fun(int i, int b, double x) //... Teraz możemy wywoływać funkcję fun na różne sposoby, np.: fun(3, 4, 7.5); fun(3, 4); fun(3); W linii pierwszej podaliśmy wszystkie argumenty, więc żadna wartość domyślna nie zostanie użyta. W drugiej linii podaliśmy dwa argumenty: wartość pierwszego zostanie użyta do zainicjowania parametru pierwszego ( i), wartość drugiego - parametru drugiego ( b; tu wartość domyślna 0 zostanie zignorowana).
Trzeciego argumentu nie podaliśmy, więc parametr trzeci ( x) zostanie zainicjowany wartością domyślną (3,14). W trzeciej linii podaliśmy tylko jeden argument; dla dwóch pozostałych przyjęte zostaną wartości domyślne. Tak więc powyższe trzy wywołania równoważne są wywołaniom: fun(3, 4, 7.5); fun(3, 4, 3.14); fun(3, 0, 3.14); Zauważmy, że nie ma sposobu, aby podać wartość trzeciego Funkcje ćwiczenia 1. Napisz funkcję suma, która dodaje do siebie dwie liczby będące parametrami funkcji. Jako wynik funkcja zwraca obliczoną sumę. 2. Napisz funkcję suma, która dodaje do siebie dwie liczby będące parametrami funkcji, a wynik dodawania funkcja przekazuje przez parametr. Funkcja nie zwraca żadnego wyniku. 3. Napisz funkcję iloczyn wyznaczającą iloczyn dwóch zadanych liczb całkowitych. Działanie funkcji sprawdź pisząc odpowiedni program 4. Napisz funkcję iloraz wyznaczającą iloraz dwóch zadanych liczb całkowitych. Działanie funkcji sprawdź pisząc odpowiedni program. 5. Napisz funkcję, która wyznacza liczbę cyfr zadanej liczby całkowitej. 6. Napisz funkcję, która wyznacza n-tą (n jest liczba naturalną) potęgę zadanej liczby rzeczywistej x. Funkcja ma wykorzystywać iterację. 7. Napisz funkcję, która wyznacza wartość n! (n jest liczba naturalną). Funkcja ma wykorzystywać iterację. 8. Napisz funkcję obliczającą euklidesową odległość pomiędzy dwoma punktami. Współrzędne punktów mają być zadane jako parametry. 9. Napisz funkcję zamieniającą wartościami liczby podane jako jej parametry. 10. Napisz funkcję poleiobwod, która dla zadanych parametrami boków trójkąta zwróci jako wartość pole trójkąta i jako parametr zwróci obwód trójkąta. Jeśli parametry nie mogą być długościami boków trójkąta, funkcja ma zwracać wartość 1. 11. Napisz funkcję sumaiilosc, która dla zadanej parametrem liczby całkowitej jako wartość zwróci sumę cyfr tej liczby i jako parametr zwróci ilość jej cyfr. 12. Napisz funkcję, której danymi są liczby oznaczające długość, szerokość i wysokość prostopadłościanu a wynikiem jest pole powierzchni ścian oraz objętość, przekazana jako parametr. Jeżeli któraś z wartości nie jest dodatnia, funkcja ma zwracać wartość 1. 13. Napisz program, który podaną przez użytkownika kwotę pieniędzy (liczba całkowita) rozmieni na jak najmniejszą ilość monet i banknotów o nominałach 1, 2, 5, 10 złotych. Przykład dla kwoty 188 zł: 188 zl rozmieniamy na 18 banknotów 10 zl 1 moneta 5zl 1 moneta 2zl 1 moneta x 1zl.
W programie należy zdefiniować funkcję, w której zadana kwota oraz ilości poszczególnych monet są parametrami funkcji, a wynikiem funkcji jest ilość banknotów dziesięciozłotowych. 14. Dokończ definicję funkcji int liczbawystapien(int n, int c) która zwraca w wyniku informację ile razy cyfra c wystąpiła w zapisie dziesiętnym liczby n. 15. Napisz funkcję max2, która zwraca większą z dwóch podanych jako jej parametry liczb, a następnie funkcję max3, zwracającą największą spośród trzech podanych liczb. Funkcja max3 ma do tego celu używać funkcji max2. 16. Napisz funkcję, która dla zadanych liczb rzeczywistych a, b, c zwraca 1 jeśli nie mogą być to długości boków trójkąta, lub pole trójkąta o bokach o długości a, b, c. (Ta funkcja z kolei, może używać funkcji max3) 17. Napisz funkcję która ma trzy parametry formalne a, b, c będące liczbami całkowitymi. Wartością funkcji jest true, jeśli zadane liczby są liczbami pitagorejskimi oraz false w przeciwnym wypadku. Liczby pitagorejskie spełniają warunek: a*a+b*b=c*c. Wykorzystując tę funkcję, wydrukuj na ekranie wszystkie różne trójki pitagorejskie w przedziale od <1,30>. 18. Napisz funkcję, która wyznacza pierwiastek całkowity z zadanej liczby. Zastosuj algorytm odejmowania kolejnych liczb nieparzystych (pierwiastek całkowity z liczby x związany jest z ilością kolejnych liczb nieparzystych jakie uda się odjąć od liczby x tak by pozostała ona nieujemna). 19. Napisz funkcję, która wyznacza sumę cyfr zadanej liczby całkowitej. Wykorzystaj tę funkcję w programie wyznaczającym dla dowolnej liczby całkowitej liczbę jednocyfrową powstałą przez sumowanie jej cyfr (jeśli suma cyfr nie jest liczbą jednocyfrową, to jej cyfry po raz kolejny sumujemy). Wydruk ma mieć postać: Liczba podana przez uzytkownika: 2982 FSuma(2982)=FSuma(21)=3 20. Napisz funkcję logiczną, która stwierdza, czy zadana jako parametr liczba całkowita jest liczbą pierwszą. Wartością funkcji ma być prawda, jeśli parametr jest liczbą pierwszą oraz fałsz w przeciwnym wypadku. 21. Napisz funkcję logiczną doskonala, która zwraca true, gdy zadana parametrem liczba całkowita jest liczbą doskonałą, false w przeciwnym przypadku. Liczba doskonała to taka, która jest równa sumie swoich dzielników. Przykładami takich liczb są 1 = 1, 6 = 1+2+3. 22. Ciąg liczb rzeczywistych jest określony wzorem a 0 = 2; a n = 1 / (2 + a n-1 ), dla n >= 1 Napisz funkcję, która dla danej liczby naturalnej n oblicza n-ty wyraz ciągu a n. 23. Ciąg F 0 =0, F 1 =1, F n =F n-1 +F n-2 nazywamy ciągiem Fibbonaciego. Napisz funkcję obliczającą wartość F n dla danego n. 24. Wielomiany Czebyszewa pierwszego rodzaju określamy za pomocą wzorów T 0 (x)=1, T 1 (x)=x, T n (x)=2xt n-1 (x)-t n-2 (x). Napisz funkcję obliczającą wartość T n (x) dla danego n i punktu x. n 1 25. Napisać funkcję obliczającą n-te przybliżenie liczby e, korzystając z rozwinięcia: e= k!. k=0 n ( 1) 26. Napisać funkcję obliczającą n-te przybliżenie liczby e -1, korzystając z rozwinięcia: e= k k! k=0 (Wskazówka: 1sp. Skorzystaj ze wzorów rekurencyjnych a 0 =1, a k =-a k-1 /k, k=1,2,...n oraz algorytmu sumowania, 2sp. skorzystaj ze schematu Hornera.).
Funkcje operujące na tablicach 27. Napisz funkcję, która znajduje w tablicy element maksymalny. Parametrami funkcji mają być: tablica tab oraz liczba elementów tablicy n. Wartością funkcji ma być element maksymalny. 28. Napisz funkcję, która znajduje w tablicy element minimalny. Parametrami funkcji mają być: tablica tab oraz liczba elementów tablicy n. Wartością funkcji ma być element minimalny. 29. Napisz funkcję, która posiada trzy parametry formalne. Pierwszym parametrem jest liczba a, drugim tablica liczb tab zaś trzecim liczba n. Funkcja ma dla zadanej liczby a zwracać w tablicy tab jej kod binarny. Liczba n ma informować o tym ile elementów tablicy zostało wypełnionych. 30. Napisz funkcję, która sortuje zadaną tablicę liczb całkowitych malejąco. 31. Napisz funkcję, która sortuje zadaną tablicę liczb całkowitych rosnąco. 32. Napisz funkcję, która wyznacza wartość wielomianu w zadanym punkcie. Parametrami funkcji mają być: n - stopień wielomianu (liczba całkowita), tab tablica współczynników (współczynniki są liczbami rzeczywistymi) oraz x zadany punkt (liczba rzeczywista). Wartością funkcji ma być wyznaczona wartość wielomianu. 33. Napisz funkcję, która wyznacza sumę dwóch wielomianów. 34. Napisz funkcję, zwracającą liczbę elementów w tablicy większych od podanej liczby. 35. Napisz funkcję, zwracającą średnią arytmetyczną wszystkich elementów w tablicy. 36. Napisz funkcję, zwracającą iloczyn skalarny dwóch wektorów tego samego wymiaru.