280 likes | 474 Views
Zachodniopomorska Szkoła Biznesu. Podstawy programowania. Wykład 4: Funkcje. Co to jest funkcja?. Funkcja to wydzielony fragment programu (podpogram), któremu nadano nazwę . Może on zawierać deklaracje lokalne oraz instrukcje .
E N D
Zachodniopomorska Szkoła Biznesu Podstawy programowania Wykład 4: Funkcje
Co to jest funkcja? • Funkcja to wydzielony fragment programu (podpogram), któremu nadano nazwę.Może on zawierać deklaracje lokalne oraz instrukcje. • Funkcję można wywołać w dowolnym miejscu programu (poniżej jej deklaracji!) podając tylko jej nazwę z nawiasami ( ) • Funkcji używa się w sytuacji, gdy: • Pewien niemały fragment programu powtarza się kilkakrotnie w jednakowej lub zbliżonej formie • Program jest długi i skomplikowany, dobrze jest wtedy podzielić go na mniejsze zadania, budować całość z mniejszych „klocków” • W języku C++ działanie każdej funkcji wiąże się z wygenerowaniem (zwracaniem) pewnej wartości, której typ musi zostać określony w jej nagłówku. Podstawy programowania - Funkcje
Składnia definicji funkcji • typ nazwa() // nagłówek (nawiasy konieczne) { // nawiasy klamrowe konieczne deklaracje lokalne instrukcje } • Jeżeli funkcja ma nie zwracać żadnej wartości, nadajemy jej typ void. Można ją wtedy nazwać procedurą. • Jeżeli zwracany jest typ inny niż void, przed zakończeniem działania funkcji musi pojawić się instrukcja return wyrażenie; // typ zgodny z nagłówkiem! • Jeżeli funkcja jest typu void, można (ale nie trzeba) w dowolnym jej miejscu użyć instrukcji return; która powoduje natychmiastowe zakończenie działania funkcji. Podstawy programowania - Funkcje
Przykłady definicji funkcji (1) • void pusta() // funkcja minimum { } • float pi() // funkcja minimum z typem { return 3.1415; } • int signum() // sprawdzenie znaku { // globalnej zmiennej ‘a’ if (a<0) // (musi być zadeklarowana) return -1; else return (a>0); } Podstawy programowania - Funkcje
Przykłady definicji funkcji (2) • void odliczanie() // wypisanie na ekranie { // liczb od 10 do 1 int i; // zmienna lokalna for (i=10; i>0; i--) cout << i << endl; // wypisanie elementu } // tu nie musi być ‘return’ • void wypisz_dodatnia(){ int liczba; cout << "Podaj liczbę dodatnią: ";cin >> liczba; if (liczba <=0) return; // wyskoczenie z funkcjicout << liczba; // wypisanie liczby } Podstawy programowania - Funkcje
Typowe błędy w definicji funkcji • Brak return w funkcji innej niż void int BrakReturn1(){ cout >> "Działa funkcja" }// funkcja zwróci wartość przypadkową!!! int BrakReturn2() // nie ma ‘return’ dla { if (i==5) // wszystkich możliwychreturn 1; } // przypadków • Zły typ zwacanej wartości void ZlyTyp1(){ return 1; } // funkcja jest typu void! int ZlyTyp2(){ return "abc"; } // niezgodność typów int ZlyTyp3(){ return 2.5; } // funkcja zwróci 2 !!! Podstawy programowania - Funkcje
Wywołanie funkcji • W celu uruchomienia gotowej funkcji należy umieścić jej wywołanie wewnątrz innej funkcji (np. w funkcji main) • Składnia: nazwa_funkcji(); // nawiasy konieczne!W tym przypadku wartość zwracana przez funkcję jest ignorowana. • Jeżeli funkcja jest innego typu niż void, można jej wywołanie umieścić w wyrażeniu w celu wykorzystania wartości zwracanej przez tę funkcję, np. x=2*nazwa_funkcji()+1; Oznacza to wykonanie funkcji i użycie zwróconej przez nią wartości do obliczeń. Podstawy programowania - Funkcje
Wywołanie funkcji - schemat main() Ustaw(); Zeruj(); Ustaw(); Zeruj(); Ustaw() a1=b1=1;a2=b2=2; Zeruj() a1=b1=0; a2=b2=0; Podstawy programowania - Funkcje
Przykłady wywołania funkcji (1) int a1, a2, b1, b2; // zmienne globalne void Ustaw() { a1=b1=1; a2=b2=2;} void Zeruj() { a1=b1=a2=b2=0;} void main(){ Ustaw(); // wywołanie funkcji ‘Ustaw’ Zeruj(); // wywołanie funkcji ‘Zeruj’ Ustaw(); Zeruj();} Podstawy programowania - Funkcje
Przykłady wywołania funkcji (2) float pi() // ta funkcja musi być pierwsza { return 3.1415;} float dwapi(){ return 2* pi(); // wywołanie ‘pi’} void main() { float Pole, Obwod, r=5; Pole = pi() * r*r; // wywołanie ‘pi’ Obwod= dwapi() * r; // wywołanie ‘dwapi’ } Podstawy programowania - Funkcje
Przekazywanie danych z/do funkcji • Większość funkcji potrzebuje do swego działania danych wejściowych. Przekazanie ich do funkcji może odbywać się poprzez: • Zmienne globalne, które są dostępne zarówno w funkcji wywołującej jak i w funkcji wywoływanej • Parametry wywołania funkcji • Dane wyjściowe, "wyprodukowane" przez funkcję wywoływaną, można przekazać do funkcji wywołującej poprzez: • Wartość zwracaną w instrukcji return (tylko jedna wartość) • Zmienne globalne • Zapisanie danych pod adresem (wskaźnik lub referencja) otrzymanym od funkcji wywołującej. Podstawy programowania - Funkcje
Przekazywanie wartościprzez zmienne globalne float a,b,c,delta, x1,x2; void Obliczdelta() // funkcja wymaga danych!{ delta=b*b-4*a*c;} void ObliczDwa(){ x1=(-b-sqrt(delta)) / (2*a); // wynik do zmiennych x2=(-b+sqrt(delta)) / (2*a); // globalnych} void main(){ a=2, b=3, c=-1; // dane dla funkcji!!!Obliczdelta(); if (delta>0) { ObliczDwa(); cout << "x1=" << x1 << endl; // wypis wyniku cout << "x2=" << x2 << endl; } Podstawy programowania - Funkcje
Zmienne globalne i lokalne • Nie wolno w tym samym zakresie zdefiniować dwóch symboli o tej samej nazwie, bez względu na ich typ • Symbole definiowane wewnątrz funkcji nazywane są lokalnymi • Symbole lokalne tworzone są podczas rozpoczęcia wykonania bloku i niszczone przy opuszczeniu najwęższego bloku, w którym zostały zadeklarowane • Zmienne lokalne powstają na tzw. stosie i po utworzeniu mogą zawierać wartości przypadkowe, podczas gdy zmienne globalne zawsze inicjalizowane są zerami. • Symbol lokalny o mniejszym zakresie może mieć tę samą nazwę co symbol o szerszym zakresie (np. globalny), ale utrudnia lub uniemożliwia jego wykorzystanie, przesłania go • Do przesłoniętego symbolu globalnego można uzyskać dostęp dzięki operatorowi zakresu :: umieszczonemu przed nazwą, np. ::zmienna Podstawy programowania - Funkcje
Przykłady deklaracji zmiennych globalnych i lokalnych int a=1,b=2; // deklaracje symboli globalnych float a; // błąd: powtórzona nazwa ‘a’ int b() // błąd: powtórzona nazwa ‘b’ {} void fun() {int a=3; // zmienne lokalnefloat b=5; // przesłaniające globalne { int a=10; // zmienna podwójnie lokalnacout << a; // 10} cout << a; // 3 cout << ::a; // 1} Podstawy programowania - Funkcje
Parametry funkcji • Parametry wywołania funkcji pozwalają na przekazanie danych wejściowych dla funkcji w sposób jawny i czytelny.Jeżeli funkcja została zadeklarowana z parametrami, podczas wywołania muszą być one podane • Składnia definicji funkcji z parametrami: typ NazwaFunkcji(typ1 par1, typ2 par2, itd.){ ... } • Wywołanie funkcji z parametrami: NazwaFunkcji(wartość_typu1, wartość_typu2, itd.) • Liczba wartości podanych w wywołaniu i ich typy muszą być zgodne z nagłówkiem funkcji • Parametry funkcji można rozumieć jako deklaracje zmiennych lokalnych, które „wypełniane” są przy uruchomieniu funkcji kopiami przekazanych wartości Podstawy programowania - Funkcje
Przykłady funkcji z parametrami float PoleKola(float r) // funkcja z 1 parametrem { return 3.1415*r*r; // użycie parametru 'r } float Delta(float a, float b, float c) // 3 parametry {return b*b-4*a*c; // użycie parametrów } void main() { float aa=1,bb=3,cc=-2, r=2; // inne r! float P, D, x; P=PoleKola(1);P=PoleKola(r+2);if (Delta(aa,bb,cc)==0) x=-b/(2*a); } Podstawy programowania - Funkcje
Przesłanianie zmiennych globalnych przez parametry funkcji int a=1; void funkcja(int a) // ta sama nazwa ‘a’ (a=2) { a=a+5; // a=7cout << a; // 7, użycie zmiennej lokalnej } void main() { cout << a; // 1, użycie zmiennej globalnej funkcja(2);cout << a; // 1, zmienna globalna bez zmian } Podstawy programowania - Funkcje
Deklaracja funkcji (prototyp) • Do użycia istniejącej programiście (a także kompilatorowi podczas kompilacji) potrzebna jest tylko wiedza o jej nazwie, zwracanym typie oraz parametrach wywołania.Tzw. ciało funkcji niezbędne jest dopiero na etapie tzw. linkowania, a więc może znajdować się w dalszej części programu lub nawet w oddzielnym pliku (np. w bibliotece). • Niezbędnego opisu funkcji dostarcza jej deklaracja, zwana też prototypem lub (ang. header - nagłówek). Składnia: typ NazwaFunkcji(typ1 par1, typ2 par2, ...);// uwaga na średnik !!! • Jeżeli taka deklaracja znajdzie się w programie, to w dalszym ciągu pliku można wywoływać tę funkcję normalnie, tak jakby była w pełni zdefiniowana. • Kompletna definicja tej funkcji musi jednak gdzieś się znajdować: albo pod spodem albo w innym pliku projektu. Podstawy programowania - Funkcje
Przykład użycia prototypu float potega(float a, int wyk); // prototyp void main() {float x=potega(2,5); // wywołanie funkcji } float potega(float a, int wyk) // definicja funkcji { // zgodność nagłówków! int i;float p=1; for (i=0; i<wyk; i++) p*=a;return p; } Podstawy programowania - Funkcje
Biblioteki • W wielu programach, jakie są tworzone powtarza się znaczna liczba różnych elementarnych zadań. W celu ułatwienia pracy programisty wiele z nich zostało już wcześniej zaprogramowane i zebrane w różnego rodzaju bibliotekach, zwykle dołączonych do kompilatora. • Biblioteki zawierają przede wszystkim gotowe funkcje • W celu skorzystania z funkcji bibliotecznej należy wcześniejalbo samodzielnie wpisać jej prototyp (np. na podstawie dokumentacji) albo dokonać importu pliku nagłówkowego (ang. header file) za pomocą dyrektywy #include • Próba wywołania w programie funkcji bibliotecznej bez podania wcześniej prototypu spowoduje błąd kompilacji (nieznany symbol) • Zwykle domyślnie ustawiona jest opcja kompilatora nakazująca poszukiwanie we wskazanych bibliotekach tych funkcji, które w programie znalazły się jedynie w formie deklaracji (prototypu) Podstawy programowania - Funkcje
Preprocesor • Integralną częścią koncepcji języka C/C++ jest preprocesor czyli moduł dokonujący pewnych operacji na tekście programu jeszcze przed jego kompilacją • Działa on w oparciu o tzw. dyrektywy, które są poleceniami rozpoczynającymi się od znaku # (hash), który musi być pierwszym znakiem w danej linii programu(nie licząc spacji, tabulacji lub ewentualnie komentarza ograniczonego parą znaków /* i */ ) • Standardowe dyrektywy to:#include#define #undef#if #ifdef #ifndef#else #elif #endif#line #error#pragma Podstawy programowania - Funkcje
Dyrektywa #include • Składnia:#include <nazwa_pliku>lub#include ”nazwa_pliku” • Dyrektywa ta powoduje, że preprocesor w jej miejsce wkleja podany plik w całości • Zazwyczaj wklejanymi plikami są pliki nagłówkowe z rozszerzeniem .h . Zawierają one m.in. prototypy funkcji • Podany plik poszukiwany jest w katalogach wyszczególnionych w opcjach kompilatora jako „include directories”. Znajdują się tam pliki nagłówkowe związane z bibliotekami kompilatora • Jeżeli nazwę pliku podano w cudzysłowach (” ”), plik poszukiwany jest najpierw w katalogu, w którym znajduje się plik programu, a dopiero później w katalogach standardowychWkleja się w ten sposób własne pliki nagłówkowe zawierające m.in. prototypy funkcji zdefiniowanych w różnych plikach Podstawy programowania - Funkcje
Dyrektywa #define • Składnia:#define NAZWA ciąg znaków lub#define NAZWA // ciąg pusty • Każde wystąpienie w tekście programu symbolu NAZWA zostanie przed kompilacją zamienione na podany ciąg znaków • Jeżeli chcemy aby ciąg znaków zawierał więcej niż jedną linię, można go kontynuować w linii następnej pod warunkiem, że na końcu poprzedniej pojawi się znak \ (backslash), znak ten nie będzie wklejany jako część ciągu: #define NAZWA ciąg znaków \ kontynuacja ciągu znaków\ kontynuacja ciągu znaków • Dyrektywę tę wykorzystuje się również do tworzenia tzw. makr Podstawy programowania - Funkcje
Przykłady użycia dyrektywy #define • Tworzenie stałych #define PI 3.1415float x=PI/2;#define N 10 ...for (i=1; i<N; i++)... • Zamiana wybranych słów na inne #define float double W programie poniżej tej dyrektywy wszystkie napisy float zmienią się na double • Usuwanie wybranych słów#define unsigned // zamiana na ciąg pusty...unsigned int x; // unsigned zniknie Podstawy programowania - Funkcje
Biblioteka iostream • Każdy algorytm czy program wymaga wprowadzania danych wejściowych i wyprowadzania wyniku • Podstawowym sposobem wprowadzania danych jest ich wpisywanie z klawiatury, a wyprowadzania danych - wyświetlanie na ekranie • Tzw. operacje wejścia-wyjścia realizowane są za pomocą funkcji (lub obiektów) z bibliotek. W języku C++ zwykle korzysta się w tym celu ze zbioru nagłówkowego iostream.h(W języku C stosowano raczej zbiór nagłówkowy stdio.h) • Bibliotea ta umożliwia wprowadzanie danych z klawiatury oraz ich wyświetlanie na ekranie • Biblioteka iostream.h jest skonstruowana w sposób obiektowy, udostępnia więc przede wszystkim klasy i obiekty, ale również funkcje (jako składniki klas) Podstawy programowania - Funkcje
Wyświetlanie tekstu: obiekt cout • cout jest obiektem odpowiadającym standardowemu strumieniowi wyjściowemu, który domyślnie połączony jest z wyświetlaniem tekstu na ekranie. • Wyświetlenie tekstu uzyskuje się dzięki przedefiniowanemu operatorowi << • Składnia:cout << wyświetlany_element;cout << element1 << element2 << element3; • W celu przechodzenia na początek następnej linii zdefiniowano symbol endlcout << 100.99 << endl; • Wyświetlenie tekstu podanego wprost w programie wymaga umieszczenia go w cudzysłowie: cout << ”Liczba PI= ”<< 3.14 << endl; Podstawy programowania - Funkcje
Wprowadzanie danych: obiekt cin • cin jest obiektem odpowiadającym standardowemu strumieniowi wejściowemu, który domyślnie połączony jest z wprowadzanie danych z klawiatury • Wprowadzanie danych uzyskuje się dzięki specjalnie zdefiniowanemu operatorowi >> • Wprowadzanie danych odbywa się zawsze do pamięci, a więc musimy podać nazwę zmiennej, która ma zapamiętać dane • Składnia: int a,b,c; cin >> a; // po znaku << musi być zmiennacin >> a >> b >> c; • Zwykle najpierw wyświetla się żądanie podania danych, np. cout << „Podaj swoją cenę: ”;cin >> cena; Podstawy programowania - Funkcje
To już jest koniec++ Dziękuję za uwagę