Języki programowania obiektowego Nieobiektowe elementy języka C++

Podobne dokumenty
Wprowadzenie do programowania w języku C

Wstęp do programowania

Podstawy programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania w języku C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Wstęp do programowania

Podstawy programowania w języku C i C++

Wstęp do programowania. Wykład 1

Przekazywanie argumentów wskaźniki

Programowanie - wykład 4

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Ćwiczenia podstawowe, zestaw 5, część 1

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Podstawy programowania skrót z wykładów:

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Wstęp do informatyki- wykład 11 Funkcje

Podstawy Programowania Podstawowa składnia języka C++

Języki programowania obiektowego Nieobiektowe elementy języka C++

Wstęp do informatyki- wykład 9 Funkcje

Część 4 życie programu

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

#include <iostream> using namespace std; void ela(int); int main( ); { Funkcja 3. return 0; }

Podstawy programowania w C++

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język C++ zajęcia nr 2

Podstawy programowania w języku C++

Programowanie w języku C++

1 Podstawy c++ w pigułce.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Języki programowania obiektowego Nieobiektowe elementy języka C++

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

1 Podstawy c++ w pigułce.

Język C++ Różnice między C a C++

C++ wprowadzanie zmiennych

I - Microsoft Visual Studio C++

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Wstęp do informatyki- wykład 7

Podstawy programowania w języku C++

Podstawy programowania

Programowanie komputerowe. Zajęcia 1

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

KURS C/C++ WYKŁAD 1. Pierwszy program

Operacje wejścia/wyjścia odsłona pierwsza

Wykład 5: Klasy cz. 3

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie strukturalne i obiektowe. Funkcje

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Tablice, funkcje - wprowadzenie

Programowanie Obiektowe i C++

4. Funkcje. Przykłady

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Programowanie w języku C++

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Język ludzki kod maszynowy

Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Podstawy programowania w języku C++

Struktura pliku projektu Console Application

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Funkcja (podprogram) void

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Paostwowa Wyższa Szkoła Zawodowa w Płocku Dariusz Wardowski

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Podstawy Programowania

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Wstęp do Programowania 2

Język C++ zajęcia nr 1

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Programowanie w języku C++ Grażyna Koba

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

1 Wskaźniki. 1.1 Główne zastosowania wskaźników

Języki programowania obiektowego Nieobiektowe elementy języka C++

Programowanie proceduralne w języku C++ Funkcje

Zmienne, stałe i operatory

C++ - [1-3] Debugowanie w Qt Creator

Szablony funkcji i szablony klas

Wykład 2 Składnia języka C# (cz. 1)

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do informatyki- wykład 9 Pętla while, do while,for -pętla w pętli- przykłady Funkcje

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).

Podstawy Programowania Obiektowego

Transkrypt:

Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Funkcje, przekazywanie parametrów, przykłady wykorzystania

W programach często występują powtarzające się fragmenty kodu cout << "Sredni dochod to: " << dochod; cout << "Nacisnij Enter by kontynuowac..."; cin.get(); cout << "Dochody uporzadkowane rosnaco:"; Tyle razy pisać to samo...? cout << "Nacisnij Enter by kontynuowac..."; cin.get(); cout << "Dochod minimalny:" << min; cout << "Dochod maksymalny:" << maks; cout << "Nacisnij Enter by kontynuowac..."; cin.get(); 2

Powtarzające się fragmenty kodu jako klocek podprogram Definicja podprogramu void czekajnaenter() cout << "Nacisnij Enter by kontynuowac..."; cin.get(); Nagłówek podprogramu Ciało podprogramu Nagłówek podprogramu Typ rezultatu Nazwa podprogramu Parametry podprogramu void czekajnaenter () Słowo kluczowe void należy rozumieć jako nic, brak wartości 3

Aby podprogram zadziałał należy go wywołać void czekajnaenter() cout << "Nacisnij Enter by kontynuowac..."; cin.get(); cout << "Sredni dochod to: " << dochod; Definicja podprogramu czekajnaenter(); cout << "Dochody uporzadkowane rosnaco:"; czekajnaenter(); Wywołanie podprogramu cout << "Dochod minimalny:" << min; cout << "Dochod maksymalny:" << maks; czekajnaenter(); 4

Wywołanie podprogramu void czekajnaenter() cout << "Nacisnij Enter by kontynuowac..."; cin.get(); cout << "Sredni dochod to: " << dochod; 2 1 czekajnaenter(); cout << "Dochody uporzadkowane rosnaco:"; 3 czekajnaenter(); cout << "Dochod minimalny:" << min; cout << "Dochod maksymalny:" << maks; 1 2 Wywołanie podprogramu Wykonanie ciała podprogramu czekajnaenter(); 3 Powrót podprogramu 5

Procedura a funkcja rodzaje podprogramów Wykonać Wykonać i zameldować wykonanie Wywołanie Odpowiedź Procedura Funkcja 6

Rodzaje podprogramów Podprogramy dzielimy na procedury i funkcje. Procedura, to podprogram, który wykonuje akcję określoną instrukcjami zapisanymi w ciele podprogramu i... już! czekajnaenter(); Funkcja, to podprogram, który wykonuje akcję określoną instrukcjami zapisanymi w ciele podprogramu i oddaje w miejscu wywołania pewien rezultat! x = sinus( 0 ) ; Rezultat funkcji, udostępniany w miejscu wywołania, po powrocie z podprogramu 7

Rodzaje podprogramów W języku C/C++ nie występuje podział podprogramów na procedury i funkcje. Wszystkie podprogramy są funkcjami. Istnieje jednak możliwość wykorzystywania funkcji jak procedur, bądź deklarowania funkcji tak, by przypominały procedury. Słowo kluczowe void, będące nazwą typu, oznacza brak, nieobecność jakiejkolwiek wartości. Jeżeli typem rezultatu będzie typ określany słowem kluczowym void, to oznacza, iż funkcja nie udostępnia rezultatu staje się wtedy czymś podobnym do procedury z języka Pascal. void nazwa_funkcja_działającej_jak_procedura() co ś tam, co ś tam... 8

Procedury podsumowanie informacji Procedura to programowe narzędzie realizujące określone czynności. Każda procedura ma swoją nazwę. Wpisanie nazwy procedury w kodzie programu oznacza jej wywołanie. Wywołanie procedury polega na: zawieszeniu wykonania aktualnie realizowanego ciągu instrukcji, wykonaniu instrukcji przypisanych do procedury o danej nazwie, wznowieniu wykonania realizowanego ciągu instrukcji, począwszy od instrukcji następnej po wywołaniu procedury. wyswietlkomunikat( Uwaga, niepoprawne dane! ); czekajnaenter(); 9

Funkcje podsumowanie informacji Funkcja to programowe narzędzie realizujące określone czynności, po wykonaniu których, funkcja udostępnia w miejscu wywołania pewien rezultat. Żargonowo mówi się, że funkcja oddaje wartość w miejscu wywołania. Funkcja różni się od procedury tym, że ta ostatnia tylko wykonuje czynności i nie udostępnia rezultatu w miejscu wywołania. Poza tą różnicą procedury i funkcje są podobne wspólnie nazywa się je podprogramami. x = 2 * R + sinus( alfa ) ; delta = wyznaczdelte( 5, 2, 8 ); // Delta równania: 5x 2 + 2x + 8 = 0 przyprostokatna = przeciwprostokatna * sinus( alfa ); 10

Podprogramy mogą mieć parametry Paramtery (inaczej argumenty) to informacje przekazywane do wnętrza podprogramu. Brak parametrów, dodatkowe informacje nie są potrzebne wewnątrz podprogramu czekajnaenter () ; Parametry mogą, ale nie muszą występować. Dotyczy to zarówno procedur jak i funkcji. x = sinus( 0 ) ; Niektóre funkcje muszą dostawać parametry, ciało funkcji sinus musi wiedzieć, dla jakiego kąta ma zostać wyliczona jego wartość 11

Parametry oficjalny kanał wymiany informacji Instrukcje wykonywane wewnątrz podprogramów są zwykle odseparowane od reszty programu. Można powiedzieć, że te instrukcje są uwięzione wewnątrz celi jaką jest procedura lub funkcja. Aby instrukcje wewnętrzne podprogramu wiedziały o naszych chciejstwach, musimy im przekazać informacje oficjalnym kanałem wymiany informacji. 12

Pierwsza własna funkcja #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; 13

Pierwsza własna funkcja przed wywołaniem, wczytanie danych #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: ";» cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; dlugosc_boku pole?? return EXIT_SUCCESS; 14

Pierwsza własna funkcja przed wywołaniem, parametr aktualny #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku;» pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; dlugosc_boku pole 25? return EXIT_SUCCESS; To jest parametr aktualny wywołania podprogramu! To jest bardzo ważne pojęcie trzeba je zrozumieć i zapamiętać! 15

Pierwsza własna funkcja wywołanie funkcji, parametr formalny #include <iostream> #include <cstdlib> using namespace std; double» double oblicz_pole_kwadratu( double double bok bok ) ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); bok dlugosc_boku pole 25 25? cout << "Pole: " << pole; return EXIT_SUCCESS; To jest parametr formalny podprogramu! To jest bardzo ważne pojęcie trzeba je zrozumieć i zapamiętać! 16

Pierwsza własna funkcja wywołanie funkcji, parametr formalny Parametr formalny to specjalna zmienna komunikacyjna, zadeklarowana wewnątrz podprogramu. Jej wartość ustalana jest na etapie wywołania podprogramu na podstawie parametru aktualnego wywołania. Patrząc z punktu widzenia wnętrza podprogramu, instrukcje są w nim zamknięte: double oblicz_pole_kwadratu( double bok ) return bok * bok; Co mi tu znowu dzisiaj dali.... Wartość, która jest kopią parametru aktualnego wywołania Parametr formalny podprogramu 17

Pierwsza własna funkcja wywołanie funkcji, przekazanie parametrów #include <iostream> #include <cstdlib> using namespace std; double» double oblicz_pole_kwadratu( double double bok bok ) ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); 25 bok dlugosc_boku pole 25 25? cout << "Pole: " << pole; return EXIT_SUCCESS; Przekazanie parametrów przez wartość wartość parametru aktualnego jest kopiowana do parametru formalnego podprogramu. 18

Przekazywanie parametrów przez wartość Na etapie wywołania podprogramu wyznaczana jest wartość parametru aktualnego wywołania. Wyznaczona wartość jest kopiowana do parametru formalnego podprogramu. Operacje na parametrach formalnych wykonywane wewnątrz podprogramu nie przenoszą się na parametry aktualne. Parametry aktualne mogą być literałami, stałymi i zmiennymi. 19

Pierwsza własna funkcja wykonanie funkcji #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok )» return bok * bok; ; int main() double dlugosc_boku, pole; 625 bok dlugosc_boku 25 25 cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; pole? cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku ); cout << "Pole: " << pole; return EXIT_SUCCESS; 20

Pierwsza własna funkcja po powrocie funkcji #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; int main() double dlugosc_boku, pole; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; pole = oblicz_pole_kwadratu( dlugosc_boku );» cout << "Pole: " << pole; dlugosc_boku pole 25 625 return EXIT_SUCCESS; 21

Pierwsza własna funkcja drobna optymalizacja #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; Zmienna pole jest niepotrzebna, rezultat funkcji może być int main() double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; przekazany do strumienia wyjściowego bezpośrednio. cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; 22

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; int a = 5; Co wyprowadzi program? a =? inc( a ); cout << a = << a; 23

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; Jaki jest stan pamięci przed wywołaniem? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) a 5 24

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; Co się dzieje w trakcie wywołania? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) a 5 a 5 i 5 25

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; Co się dzieje w trakcie wykonania? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) Wykonanie inc( a ) a 5 a 5 a 5 i 5 i 6 5X ++i 26

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; Jaki jest stan pamięci po wywołaniu? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) Wykonanie inc( a ) Po wykonaniu inc( a ) a 5 a 5 a 5 a 5 i 5 i 6 5X ++i 27

Przekazywanie parametrów przez wartość (język C i C++) void inc( int i ) ++i; int a = 5; 5, słownie: pięć, nic się nie zmieniło! a = 5 inc( a ); cout << a = << a; Przy przekazywaniu parametrów przez wartość, wartość parametru aktualnego wywołania funkcji kopiowana jest do parametru formalnego funkcji. Od tego momentu parametr aktualny i formalny są od siebie niezależne. Żadna modyfikacja parametru formalnego funkcji nie przenosi się na parametr aktualny wywołania wnętrze funkcji nie jest w stanie zmodyfikować parametru formalnego funkcji. 28

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; Parametr formalny i jest referencją do parametru aktualnego wywołania funkcji. int a = 5; Co wyprowadzi program? a =? inc( a ); cout << a = << a; 29

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; Jaki jest stan pamięci przed wywołaniem? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) a 5 30

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; Co się dzieje w trakcie wywołania? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) a 5 a 5 i 31

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; Co się dzieje w trakcie wykonania? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) Wykonanie inc( a ) a 5 a 5 i a 6 5X ++i i 32

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; Jaki jest stan pamięci po wywołaniu? int a = 5; inc( a ); cout << a = << a; Przed wywołaniem inc( a ) Wywołanie inc( a ) Wykonanie inc( a ) Po wykonaniu inc( a ) a 5 a 5 i a 6 5X ++i i a 56 33

Przekazywanie parametrów przez referencję (tylko C++) void inc( int & i ) ++i; int a = 5; 6, słownie: sześć, wartość się zmieniła! a = 6 inc( a ); cout << a = << a; Przy przekazywaniu parametrów przez referencję, parametr aktualny wywołania funkcji nakłada się na parametr formalny funkcji. Od tego momentu parametr aktualny i formalny odnoszą się do tej samej lokalizacji (adresu) w pamięci operacyjnej. Każda modyfikacja parametru formalnego funkcji przenosi się na parametr aktualny wywołania, wnętrze funkcji może zmodyfikować parametr formalny funkcji. 34

Informacje wyjściowe z funkcji rezultat czy parametr referencyjny? Wczytywanie liczby wczytana wartość jako rezultat funkcji: double czytajdystans() double liczba; do cout << endl << "Podaj dystans: "; cin >> liczba; if( liczba <= 0 ) cout << "Dystans musi byc liczba dodatnia"; while( liczba <= 0 ); return liczba; double dystans; dystans = czytajdystans(); 35

Informacje wyjściowe z funkcji rezultat czy parametr referencyjny? Wczytywanie liczby wczytana wartość jako parametr referencyjny void czytajdystans( double & liczba ) do cout << endl << "Podaj dystans: "; cin >> liczba; if( liczba <= 0 ) cout << "Dystans musi byc liczba dodatnia"; while( liczba <= 0 ); double dystans; czytajdystans( dystans ); 36

Informacje wyjściowe z funkcji rezultat czy parametr referencyjny? Wczytywanie liczby wczytana wartość jako rezultat funkcji: double dystans; dystans = czytajdystans(); Wczytywanie liczby wczytana wartość jako parametr referencyjny double dystans; czytajdystans( dystans ); Czy rzeczywiście jest referencja? void czytajdystans( double & liczba ) void czytajdystans( double liczba ) 37

Wiele danych wyjściowy parametry referencyjne void czytajpaliwoidystans( double & p, double & d ) do cout << endl << "\npodaj ilosc paliwa: "; cin >> p; if( p <= 0 ) cout << "Ilosc paliwa musi byc liczba dodatnia"; while( p <= 0 ); do cout << endl << "\npodaj dystans: "; cin >> d; if( d <= 0 ) cout << "Dystans musi byc liczba dodatnia"; while( d <= 0 ); double dystans, paliwo; czytajpaliwoidystans( paliwo, dystans ); 38

Definicja funkcji po jej wywołaniu int main() double dlugosc_boku, pole; pole = oblicz_pole_kwadratu( dlugosc_boku ); Wywołanie funkcji double oblicz_pole_kwadratu( double bok ) return bok * bok; Czy kompilatorowi się to spodoba? Definicja funkcji 39

Czy kompilatorowi się to spodoba? int main() double dlugosc_boku, pole; pole = oblicz_pole_kwadratu( dlugosc_boku ); Wywołanie funkcji double oblicz_pole_kwadratu( double bok ) return bok * bok; Definicja funkcji Tak, bez błędów i ostrzeżeń w starszych wersjach kompilatorów. Tak, bez błędów lecz z ostrzeżeniem w nowszych wersjach kompilatorów, oraz tych pracujących w trybie zgodności z normą ANSI. Nie, wystąpi błąd w kompilatorach pracujących w trybie C++. 40

Skąd te rozbieżności? Definicja funkcji występuje po jej wywołaniu. Kompilator na etapie wywołania jej jeszcze nie zna. Czyni w stosunku do niej założenia że to funkcja, której rezultatem jest wartość int. To założenie może być słusznie albo nie. Aby kompilator mógł kontrolować poprawność wywołania funkcji, należy to wywołanie poprzedzić definicją lub deklaracją wywoływanej funkcji. Aby uniknąć niejednoznaczności, wprowadza się prototypy funkcji. Deklaracja przyjmuje postać prototypu funkcji. 41

Prototypy funkcji Definicja funkcji: double oblicz_pole_kwadratu( double bok ) return bok * bok; Deklaracja prototyp funkcji: double oblicz_pole_kwadratu( double bok ); Ogólna postać definicji funkcji: typ_rezultatu nazwa_funkcji( lista_parametrów_formalnych ) ciało_funkcji Ogólna postać prototypu funkcji: typ_rezultatu nazwa_funkcji( lista_parametrów_formalnych ); 42

Wykorzystanie prototypów funkcji zadeklaruj funkcję, potem wołaj #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ); int main() double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; double oblicz_pole_kwadratu( double bok ) return bok * bok; 43

Można jednak bez prototypu zdefiniuj funkcję, potem wołaj #include <iostream> #include <cstdlib> using namespace std; double oblicz_pole_kwadratu( double bok ) return bok * bok; int main() double dlugosc_boku; cout << endl << "Obliczam pole kwadratu"; cout << endl << "Podaj dlugosc boku: "; cin >> dlugosc_boku; cout << "Pole: " << oblicz_pole_kwadratu( dlugosc_boku ); return EXIT_SUCCESS; 44

Podsumowanie informacji o prototypach Starsze implementacje C dopuszczały wywoływanie funkcji wcześniej kompilatorowi nieznanych. W trakcie kompilowania wywołania nieznanej funkcji przez domniemanie przyjmowano, że jej rezultatem jest wartość int i nic nie wiadomo na temat jej parametrów. Nie pozwalało to kompilatorowi kontrolować poprawności wywołania funkcji. Aby kompilator mógł kontrolować poprawność wywołania funkcji, należy to wywołanie poprzedzić definicją lub deklaracją wywoływanej funkcji. Deklaracja przyjmuje postać prototypu funkcji. Deklaracja i definicja funkcji powinna być zgodna. Jeżeli w obrębie jednego pliku wystąpi niezgodność, kompilator zgłosi błąd kompilacji. 45

Podsumowanie informacji o podprogramach Historycznie i technicznie pierwotna przyczyna wyodrębnienia podprogramów to eliminowanie powtarzających się fragmentów kodu. Z czasem podprogramy stały się podstawowym środkiem podziału programu na mniejsze części, stając się podstawą dla programowania proceduralnego. Stosowanie podprogramów zwykle skraca program zarówno kod źródłowy jak i wynikowy. Program staje się czytelniejszy. Modyfikacje programu stają się łatwiejsze. Łatwiejsze jest lokalizowanie i eliminowanie błędów. Program staje się podatniejszy na modularyzację. Łatwiej wyodrębnić zbiory spójnych podprogramów, stanowiące zalążek potencjalnych bibliotek. 46

Przykład programu podzielonego na funkcje #include <iostream> #include <cmath> using namespace std; void komunikat_wstepny(); void oblicz(); float obwod_kola( float r ); float pole_kola( float r ); int main() komunikat_wstepny(); oblicz(); return EXIT_SUCCESS; void komunikat_wstepny() cout << "\nobliczam obwod..."; void oblicz() float r; cout << "\npodaj promien R = "; cin >> r; cout << "\nobwod : " << obwod_kola( r ); cout << "\npole : " << pole_kola( r ); cout << "\nnacisnij Enter by..."; cin.ignore(); cin.get(); float obwod_kola( float r ) return 2 * M_PI * r; float pole_kola( float r ) return M_PI * r * r; 47

Programowanie zstępujące int main() komunikat_wstepny(); oblicz(); return EXIT_SUCCESS; void komunikat_wstepny() cout << "\nobliczam obwod..."; void oblicz() cout << "\nobwod : " << obwod_kola( r ); float pole_kola( float r ) return M_PI * r * r; cout << "\npole : " << pole_kola( r ); float obwod_kola( float r ) return 2 * M_PI * r; 48

Suplement I przeciążanie funkcji Przeciążanie funkcji (ang. function overloading) tworzenie większej liczby funkcji o takiej samej nazwie. Nazwa funkcji może być zatem użyta wielokrotnie do realizacji różnych czynności. Jest więc przeciążona dodatkowymi obowiązkami. Kompilator zadba o dobranie właściwej wersji funkcji przeciążonej w zależności od kontekstu jej wywołania. int dodaj( int a, int b ) // 1-sza wersja funkcji przeciążonej add return a + b; double dodaj( double a, double b ) // 2-ga wersja funkcji przeciążonej add return a + b; cout << endl << "Dodawanie int :" << dodaj( 1, 1 ); cout << endl << "Dodawanie double :" << dodaj( 1.0, 1.0 ); Uwaga, z przeciążaniem funkcji wiąże się szereg subtelnych niuansów, ich omówienie wykracza poza ramy tego wykładu. Należy zachować dużą ostrożność przy definiowaniu tego typu funkcji. 49

Suplement II funkcje inline czyli funkcje wstawiane Funkcje inline nie są wywoływane w sposób klasyczny ich kod jest umieszczany w miejscu wywołania i w rzeczywistości nie są one wywoływane. inline int dodaj( int a, int b ) return a + b; int main() int i = 2, j = 2, k; int main() int i = 2, j = 2, k; k = dodaj( i, j ); return EXIT_SUCCESS; k = i + j; return EXIT_SUCCESS; Wywołanie podprogramu, opracowanie i przekazanie parametrów oraz powrót z podprogramu to dodatkowe instrukcje maszynowe zatem instrukcje wpakowane do podprogramu wykonują się odrobinę wolniej. Jednak we większości typowych przypadków opóźnienie to jest nieznaczące. 50

Suplement II funkcje inline czyli funkcje wstawiane, cd.... Specyfikacja ze słowem kluczowym inline to tylko rekomendacja dla kompilatora niektórych funkcji nie można w pełni rozwinąć i będą one wywoływane klasycznie (np. rekurencyjne). Funkcje wstawiane zastępują w języku C++ makra, stosowanie powszechnie w języku C. W porównaniu z makrami funkcje inline zapewniają kontrolę typów i wychwytywanie błędów na etapie kompilacji Mechanizm funkcji zadeklarowanych jako inline przeznaczony jest do optymalizacji małych, prostych i często wykorzystywanych funkcji. Kod wielokrotnie wykorzystujący pewną funkcję inline: Może działać szybciej brak narzutu czasowego związanego z organizacją wywołania funkcji i powrotu z podprogramu; Będzie dłuższy, zawiera bowiem rozwinięcia ciała funkcji w miejscu jej każdorazowego wywołania. 51

Suplement III parametry domyślne Bardzo często przy wywoływaniu funkcji, przy kolejnych wywołaniach pewne parametry się powtarzają. Powtarzające się parametry aktualne wywołania można ustawić jako parametry domyślne, można je pominąć przy wywołaniu. Jako parametr aktualny zostanie przyjęta wartość domyślna. void outint( int value, bool asdecimal = true ) cout << (( asdecimal )? dec : hex ) << value; Parametr domyślny Przykładowe wywołania: outint( 22 ); outint( 22, true ); outint( 22, false ); // Parametr asdecimal otrzyma wartosc true // Parametr asdecimal otrzyma wartosc jak w wywolaniu // Parametr asdecimal otrzyma wartosc jak w wywolaniu 52

Suplement III parametry domyślne, cd.... enum outformat AS_DEC, AS_OCT, AS_HEX ; void outint( int value, int base = AS_DEC ) switch( base ) case AS_DEC : cout << dec; break; case AS_OCT : cout << oct; break; case AS_HEX : cout << hex; break; cout << value; Parametr domyślny outint( 10, AS_OCT ); outint( 10, AS_HEX ); outint( 10 ); // Parametr domyslny AS_DEC 53

Suplement IV zmienna liczba parametrów Czasem trudno oszacować, ile będzie parametrów wywołania. W językach C/C++ można definiować funkcje ze zmienną liczbą parametrów. Do obsługi zmiennej liczby parametrów służą makra zdefiniowane w stdarg.h. Parametry zmienne oznaczane są w nagłówku funkcji znakiem operatorem... Scenariusz obsługi zmiennej liczby argumentów: Definicja zmiennej identyfikującej parametry zmienne (typ va_list), Ustalenie początku listy parametrów zmiennych (makro va_start), Pobranie kolejnych parametrów zmiennych (makro va_arg), Zakończenie pobierania parametrów zmiennych (makro va_end). Uwaga, aby to zadziałało, funkcja musi posiadać przynajmniej jeden parametr zwykły, oraz funkcja musi wiedzieć jakie są typy kolejnych argumentów zmiennych. 54

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; Typ zmiennej używanej do wydobywania kolejnych parametrów funkcji. va_list arglist; va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 55

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; va_list arglist; va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); Obowiązkowy normalny parametr. 56

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; va_list arglist; Oznaczenie zmiennej części parametrów va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 57

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; Zakotwiczenie zmiennej arglist o pierwszy parametr zmienny, czyli następny za ostatnim va_list arglist; normalnym parametrem. va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 58

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; Wydobycie kolejnego parametru o określonym va_list arglist; typie. va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 59

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; Wydobycie kolejnego parametru o określonym typie. va_list arglist; va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 60

Suplement IV zmienna liczba parametrów, cd.... void varargsfunction( jakistyp normalnyparametr,... ) typparametru parametr; Zakończenie wydobywania parametrów. va_list arglist; va_start( arglist, normalnyparametr ); parametr = va_arg( arglist, typparametru ); parametr = va_arg( arglist, typparametru ); va_end( arglist ); 61

Suplement IV zmienna liczba parametrów, konkretny przykład Dodawanie dowolnej liczby danych typu int, wersja naiwna: int addints( int count,... ) int total = 0; va_list arglist; va_start( arglist, count ); for( int i = 1; i <= count; i++ ) int value = va_arg( arglist, int ); total += value; va_end( arglist ); return total; cout << endl << addints( 2, 1, 2 ); cout << endl << addints( 3, 4, -1, 6 ); cout << endl << addints( 0 ); cout << endl << addints( 5, 1, 2, 3, 4, 5 ); 62

Suplement IV zmienna liczba parametrów, konkretny przykład Dodawanie dowolnej liczby danych typu int, wersja poprawiona: int addints( int count,... ) int total = 0; va_list arglist; va_start( arglist, count ); for( ; count; count-- ) total += va_arg( arglist, int ); va_end( arglist ); return total; cout << endl << addints( 2, 1, 2 ); cout << endl << addints( 3, 4, -1, 6 ); cout << endl << addints( 0 ); cout << endl << addints( 5, 1, 2, 3, 4, 5 ); 63

Suplement IV zmienna liczba parametrów, printf jako przykład Funkcja printf pochodzi z biblioteki stdio z języka C. Funkcja printf wyprowadzane sformatowane dane do stdout. Pierwszy parametr funkcji, będący łańcuchem znaków, może zawierać specyfikacje przekształceń, rozpoczynające się znakiem %. W miejsce specyfikatorów przekształceń wstawiane są wartości kolejnych parametrów wywołania funkcji printf, sformatowane zgodnie z określonym formatem. printf( "To w milach: %f", wynik ); 64

Suplement IV zmienna liczba parametrów, printf jako przykład Sekwencje rozpoczynające się od znaku % stanowią specyfikacje przekształceń kolejnych parametrów funkcji printf: %d wyprowadza liczbę całkowitą dziesiętną, %f wyprowadza liczbę rzeczywistą, %c wyprowadza znak, %s wyprowadza napis. Możliwości formatowania funkcji są bardzo szerokie, omówione zostaną osobno. printf( "%s ma %d lat%c", "Ala", 18, '!' ); 65

Suplement IV zmienna liczba parametrów, printf jako przykład printf( "To w milach: %10.2f", wynik ); printf( "To w milach: %-10.2f", wynik ); printf( "To w milach: %0.2f", wynik ); 66

Suplement IV zmienna liczba parametrów, printf jako przykład printf( "%g km to w %g mil", kilometry, wynik ); %f wyprowadza liczbę rzeczywistą, %g wyprowadza liczbę rzeczywistą w najkrótszej postaci. 67

Na chwilę kończymy z funkcjami..., ale od teraz będą one już na zawsze obecne w programowaniu! Pytania? Polemiki? Teraz, albo: roman.siminski@us.edu.pl