Wstęp do programowania

Podobne dokumenty
Wstęp do programowania

Przekazywanie argumentów wskaźniki

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

Część 4 życie programu

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

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

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

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

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentó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 9 Funkcje

Wstęp do informatyki- wykład 11 Funkcje

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

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

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

Programowanie - wykład 4

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

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

C-struktury wykład. Dorota Pylak

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

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

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

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

tablica: dane_liczbowe

Tablice (jedno i wielowymiarowe), łańcuchy znaków

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania. Wykład 1

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

Wskaznik. Przekazywanie wyniku funkcji przez return. Typy i zmienne wskaznikowe. Zmienna wskazywana. typ * nazwa_wkaznika

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

C-struktury wykład. Dorota Pylak

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Programowanie strukturalne i obiektowe. Funkcje

Programowanie Obiektowe i C++

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

Programowanie w języku C++

Zmienne, stałe i operatory

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

Język C zajęcia nr 11. Funkcje

Wstęp do programowania

Wstęp do programowania

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Struktury Struktura polami struct struct struct struct

Laboratorium nr 10. Temat: Funkcje cz.2.

Tablice i funkcje. Marcin Makowski. 26 listopada Zak lad Chemii Teoretycznej UJ

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Wyjątki (exceptions)

Tablice, funkcje - wprowadzenie

Wstęp do Programowania 2

1 Podstawy c++ w pigułce.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

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

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

Wstęp do programowania obiektowego, wykład 7

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

I - Microsoft Visual Studio C++

Obsługa wyjątków. Język C++ WW12

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Techniki Programowania wskaźniki 2

Wstęp do Programowania, laboratorium 02

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

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

Język C++ zajęcia nr 2

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie komputerowe. Zajęcia 1

Wstęp do programowania

Wstęp do programowania

Przeciążenie (przeładowanie nazw) funkcji

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

Wstęp do programowania

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Programowanie i struktury danych

Podstawy Programowania C++

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

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

Podstawy algorytmiki i programowania - wykład 5 C-struktury cd.

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

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

Programowanie komputerowe. Zajęcia 3

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

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Wykład 5: Klasy cz. 3

KURS C/C++ WYKŁAD 8. Deklaracja funkcji informuje komplilator jaką wartość funkcja będzie zwracała i jakiego typu są jej argumenty.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

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

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

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

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

Transkrypt:

wykład 10 Agata Półrola Wydział Matematyki i Informatyki UŁ semestr zimowy 2018/2019

Przesyłanie argumentów - cd Przesyłanie argumentów do funkcji - tablice wielowymiarowe Przekazywanie tablic wielowymiarowych jest podobne do przekazywania tablic jednowymiarowych, z tym że jedynie pierwszy wymiar może nie zostać określony (przykład: int fun2 (int a[][4], int ilosc wierszy);) użycie notacji tablicowej utrudnia obsługę funkcji zwracających (wygenerowane w funkcji) tablice Możliwe rozwiązania problemu: linearyzacja tablic użycie wskaźników

Przykład (Przekazywanie tablic wielowymiarowych) # include <iostream > using namespace std ; // -------------------------------------------------- void pobierztab (int tab [][4], int ilewierszy ); void wypisztab (int tab [][4], int ilewierszy ); int maxtab (int tab [][4], int ilewierszy ); // -------------------------------------------------- int main () int n; cout << " podaj dlugosc tablicy : "; cin >> n; int A[n ][4]; cout << " podaj zawartosc tablicy : " << endl ; pobierztab (A,n); cout << "\ ntwoja tablica : \n"; wypisztab (A,n); cout << endl << " wartosc maksymalna : " << maxtab (A,n) << endl ; return 0; // --------------------------------------------------

Przykład (Przekazywanie tablic wielowymiarowych - cd) void pobierztab (int tab [][4], int ilewierszy ) for ( int i =0; i< ilewierszy ; i ++) for ( int j =0; j <4; j ++) cout << " element " << i << "," << j << ": "; cin >> tab [i][j]; void wypisztab (int tab [][4], int ilewierszy ) for ( int i =0; i< ilewierszy ; i ++) for ( int j =0; j <4; j ++) cout << tab [i][j] << " "; cout << endl ; int maxtab (int tab [][4], int ilewierszy ) int m= tab [0][0]; for ( int i =0; i< ilewierszy ; i ++) for ( int j =0; j <4; j ++) if ( tab [i][j] > m) m = tab [i][j]; return m;

Argumenty (parametry) domyśłne czasami użytecznie jest przypisać pewnemu argumentowi wartość domyślną. Jeśli wywołując funkcję nie podamy wartości tego argumentu, to przyjmie on wówczas wartość domyślną wartość domyślną podaje się w deklaracji funkcji. Jeśli deklaracja i definicja są rozdzielone, to w definicji już wartości domyślnej nie powtarzamy

Przykład (Domyślne wartości parametrów) include <iostream > using namespace std ; // **************************************** double zamien_temperature ( double t, char skala = K ); // wartosc domyslna double CnaK ( double t); double CnaF ( double t); // **************************************** int main () double tempc ; char wybor ; cout << " podaj temperature w stopniach Celsjusza >"; cin >> tempc ; cout << " wybierz skale (F - Fahrenheit, K - Kelvin ) > "; cin >> wybor ; else if ( wybor == K wybor == F ) cout << " temperatura wynosi " << zamien_temperature (tempc, wybor ) << " " << wybor << " \n"; cout << " niepoprawna skala - zamieniam na skale Kelvina \n"; return 0; cout << " temperatura wynosi " << zamien_temperature ( tempc ) << " K \n";

Przykład (Domyślne wartości parametrów - cd) // **************************************** double zamien_temperature ( double t, char skala ) // wartosc domyslna nie jest powtorzona switch ( skala ) case K : return CnaK (t); case F : return CnaF (t); double CnaK ( double t) return t +273; double CnaF ( double t) return (9.0 * t) /5.0 + 32;

Funkcje inline Funkcje inline Wywołanie funkcji generuje koszt czasowy (na poziomie kodu maszynowego wywołanie funkcji wymaga pewnych dodatkowych operacji, jak przejście do inneg miejsca programu, utworzenie zmiennych lokalnych itp) jeśli program zawiera niewielkie funkcje które będą wykonywane wielokrotnie, to może być opłacalne zdefiniowanie ich jako funkcji inline

Funkcje inline - cd funkcje inline definiujemy poprzedzając standardową definicję funkcji słowem kluczowym inline. Deklaracja i definicja (ciało) takiej funkcji nie mogąbyć rozdzielone za każdym razem kiedy kompilator napotka wywołanie funkcji inline, umieszcza jej treść (dopasowaną do aktualnych danych) w linii w której to wywołanie nastąpiło (tak jakbyśmy je tam wpisali ręcznie) użycie funkcji inline skutkuje krótszym czasem wykonania, ale większym rozmiarem programu wykonywalnego (z tego powodu nie należy używać tego rozwiązania do dużych funkcji - może to prowadzić do uzyskania bardzo dużych programów) funkcja inline może zostać skompilowana jako zwykła funkcja, np. gdy kompilator nie obsługuje funkcji inline, lub z jakichś innych powodów wybierze zignorowanie żądanie traktowania funkcji jako inline

Przykład (Funkcje inline) # include <iostream > using namespace std ; // **************************************** double zamien_temperature ( double t, char skala = K ); // wartosc domyslna inline double CnaK ( double t) return t +273; inline double CnaF ( double t) return (9.0 * t) /5.0 + 32; // **************************************** int main () double tempc ; char wybor ; cout << " podaj temperature w stopniach Celsjusza >"; cin >> tempc ; cout << " wybierz skale (F - Fahrenheit, K - Kelvin ) > "; cin >> wybor ;

Przykład (Fukcje inline - cd) else if ( wybor == K wybor == F ) cout << " temperatura wynosi " << zamien_temperature (tempc, wybor ) << " " << wybor << " \n"; cout << " niepoprawna skala - zamieniam na skale Kelvina \n"; return 0; cout << " temperatura wynosi " << zamien_temperature ( tempc ) << " K \n"; // **************************************** double zamien_temperature ( double t, char skala ) // wartosc domyslna nie jest powtorzona switch ( skala ) case K : return CnaK (t); case F : return CnaF (t);

Przecążenie (przeładowanie) nazwy funkcji C++ umożliwia zdefiniowanie w jednym obszarze widzialności (np. pliku) kilku funkcji / operatorów o tej samej nazwie. Jest to nazywane przeciążaniem (przeładowaniem) nazwy funkcji (ang. function overloading) Przeciążona deklaracja funkcji deklaruje funkcję o tej samej nazwie jak inna deklaracja w tym samym zakresie widzialności, jednak obie deklaracje muszą mieć różne argumenty i oczywiście różne definicje (implementacje). Wywołanie przeciążonej funkcji/operatora wymaga tzw. rozwiązania przeładowania - kompilator decyduje którą funkcj uaktywnić, porównując liczbę i typy parametrów aktualnych i formalnych.

Przeciążanie funkcji - cd w C++ definicje przeciążanych funkcji muszą różnić się liczbą lub typem argumentów (inaczej kompilator zgłosi błąd) idopuzczalna jest też sytuacja gdy dwie funkcje mają argumenty tych samych typów, ale w różnej kolejności nie można przeciązyć funkcji za pomocą deklaracji różniącej się tylko zwracanym typem (przy rozróżnianiu funkcji typ zwracanej wartości nie jest brany pod uwagę)

Przykład (Przeciążanie funkcji) # include <iostream > using namespace std ; // ----------------------------------------------- void wypisz_ladnie ( char s []) ; // dwie funkcje o takiej samej nazwie void wypisz_ladnie ( int a); // ale roznych typach parametrow // ----------------------------------------------- int main () int li; char st [80]; cout << " podaj wyraz i liczbe > "; cin >> st ; cin >> li ; wypisz_ladnie (st); wypisz_ladnie (li); return 0; // ----------------------------------------------- void wypisz_ladnie ( char s []) cout << "\n\n* -* -* -* -* -* " << s << " * -* -* -* -* -* \n\n"; void wypisz_ladnie ( int a) cout << "\n\n -* -* -* -* -* >> " << a << " << -* -* -* -* -* \n\n";

Przeładowanie od środka dla kompilatora przeładowane funkcje mają różne nazwy - kompilator pamięta nazwy fukcji wraz z typami argumentów, np. void funct(void); jako funct Fv void funct(int,double); jako funct Fid void funct(double,int); jako funct Fdi etc. Podane nazwy są przykładowe; sposób zakodowania nazwy funkcji zależy od kompilatora

Statyczne zmienne lokalne Zmienne lokalne i globalne jeszcze raz zmienne globalne, zdefiniowane poza ciałem jakiejkolwiek funkcji, są dostępne dla wszystkich funkcji programu (poniżej linii w której zostały zdefiniowane) zmienne lokalne, zdefiniowane w ciele funkcji, są dostępne tylko dla tej funkcji (poniżej linii w której zostały zdefiniowane)

zmienne lokalne są zazwyczaj przechowywane na tzw. stosie (ang. stack). Obiekty takie nazywane są zmiennymi automatycznymi zmienne globalne przechowywane są w normalnym obszarze pamięci Konsekwencje: normalny obszar pamięci jest zerowany przed uruchomieniem programu, co powoduje że zmienne globalne są automatycznie inicjalizowane zerami (dla danego typu); niezainicjalizowane zmienne lokalne mają wartości przypadkowe zmienne globalne nie są niszczone automatycznie w czasie wykonywania programu; zmienne automatycze są automatycznie likwidowane po zakończeniu wykonywania bloku w którym zostały powołane do życia. Kolejne wykonanie tego samego bloku powoduje ponowne utworzenie tych zmiennych na stosie

Statyczne obiekty lokalne jeśli chcemy aby zmienna lokalna dla danej funkcji nie ginęła (istniała pomiędzy wywołaniami funkcji) i przy ponownym wykonaniu tej fyncji miała wartość taką jak przy zakończeniu poprzedniego wykonania, to musimy zdefiniować ją jako zmienną statyczną deklaracja zmiennej statycznej ma postać static typ zmiennej nazwa zmiennej; np. static int licznik; obiekty statyczne przechowywane są w normalnym obszarze pamięci

Przykład (Statyczne zmienne lokalne) # include <iostream > using namespace std ; int licznik ; // zmienna globalna // ----------------------------------- void pierwsza_funkcja (); void druga_funkcja (); // ----------------------------------- int main () pierwsza_funkcja (); pierwsza_funkcja (); pierwsza_funkcja (); druga_funkcja (); druga_funkcja (); pierwsza_funkcja (); cout << " licznik globalny : " << licznik << "\n"; return 0; // ----------------------------------- void pierwsza_funkcja () static int licznik ; // automatyczne zerowanie licznik = licznik + 1; cout << " pierwsza_funkcja wykonana " << licznik << " raz \n"; void druga_funkcja () static int licznik = 100; // aby rozroznic liczniki licznik = licznik + 1; cout << " druga_funkcja wykonana " << licznik << " raz \n"; Program wypisze wartości liczników: 1, 2, 3, 101, 102, 4, 0

Funkcje rekurencyjne funkcja może wywoływać samą siebie. Jest to tzw. rekurencja (rekursja) inaczej mówiąc - rekurencja to technika programistyczna pozwalająca programiście opisać operaję za pomocą niej samej rekurencja wymaga warunku stopu (zatrzymującego rekurencję), inaczej funkcja będzie się wywoływała w nieskończoność, tzn. do wyczerpania pamięci

Przykład (Funkcja rekurencyjna) # include <iostream > using namespace std ; int silnia_rek ( int N); // wersja rekurencyjna int silnia_it ( int N); // wersja iteracyjna // ---------------------------------- int main () int n; cout << " podaj n: "; cin >> n; cout << "n! = " << silnia_it (n) << endl ; cout << "n! = " << silnia_rek (n) << endl ; return 0; // ----------------------------------- int silnia_it ( int N) // n! = 1*2*3*...* n if (N ==0) return 1; int w = 1; for ( int i =2; i <=N; i ++) w = w*i; return w; int silnia_rek ( int N) // n! = n * (n -1)! if (N ==0) return 1; else return N * silnia_rek (N -1) ;

Funkcje rekurencyjne - zmienne Gdy funkcja rekurencyjna wywołuje samą siebie, na stosie są już zmienne automatyczne będące własnością pierwszego wywołania funkcji. Kolejne jej wywołanie umieszcza na stosie swoje własne zmienne automatyczne zmienne zadeklarowane jako statyczne nie tylko nie giną po zakończeniu danego wykonania funkcji, ale są również wspóne dla wszystkich rekurencyjnych wywołań tej fukcji