Programowanie w C++ Wykład 3 Katarzyna Grzelak 12 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35
Zakres ważności obiektów K.Grzelak (Wykład 1) Programowanie w C++ 2 / 35
Zakres ważności obiektów Zakres ważności obiektu, to ta część programu w której można go używać (nazwa obiektu jest znana). Bloki poleceń Blok poleceń pomiędzy dwoma nawiasami klamrowymi. { double masa=1.5; Zakres ważności obiektu Nazwa zmiennej znana do końca bloku. K.Grzelak (Wykład 1) Programowanie w C++ 3 / 35
Czytelny kod źródłowy podstawowe zasady Wcięcia (gdy zaczyna się nowy blok poleceń): 2-3 spacje, tabulator... if (i%3==0) { suma=suma+i*i; i++; Znaczace nazwy zmiennych (np. suma zamiast s). Komentarze Czytelny komunikat po uruchomieniu programu Wypisywanie wyniku na ekran z objaśnieniem K.Grzelak (Wykład 1) Programowanie w C++ 4 / 35
Zalety czytelnego kodu Oszczędność czasu: łatwiej poprawiać błędy na etapie kompilacji, trudniej o popełnienie błędu, samemu traci się mniej czasu usiłujac zrozumieć co napisaliśmy w programie. Najważniejsze Konieczność, jeżeli współpracuje się z innymi. K.Grzelak (Wykład 1) Programowanie w C++ 5 / 35
Jeszcze o czytelności kodu zły przykład: K.Grzelak (Wykład 1) Programowanie w C++ 6 / 35
#include <iostream> #include <cmath> using namespace std; int main(){ double p,o,r; cout << "Podaj trzy liczby: p, o i r" << endl; cin >> p >> o >> r; double d=o*o-4*p*r,e=1e-6; if(d<0){cout << "Brak rozwiazan" << endl; else if(fabs(d)<e){ double x=-o/(2.*p); cout << "x= " << x << endl; else{ cout << "x1= " << (-o+sqrt(d))/(2*p) << " i x2= " << (-o-sqrt(d))/(2*p) << endl; return 0; K.Grzelak (Wykład 1) Programowanie w C++ 7 / 35
Jeszcze o czytelności kodu dobry przykład: K.Grzelak (Wykład 1) Programowanie w C++ 7 / 35
int main(){ double a,b,c; cout << "Wpisz wspolczynniki a, b i c" << endl; cin >> a >> b >> c; double delta=b*b-4*a*c; double epsilon=1e-6; if(delta<0){ cout << "Brak rzecz. pierwiastkow"<< endl; else if(fabs(delta)<epsilon){ double x=-b/(2.*a); cout << "Jeden pierwiastek x= " << x << endl; else{ cout << "Dwa pierwiastki, x1= " << (-b+sqrt(delta) << " i x2= " << (-b-sqrt(delta))/(2*a) << en return 0; K.Grzelak (Wykład 1) Programowanie w C++ 8 / 35
Do sprawdzenia przy komputerze Jak działa program do liczenia pierwiastków równania kwadratowego dla a=1, b=-0.2 i c=0.01? Do sprawdzenia dwie wersje porównujace deltę do zera (delta ==0 i fabs(delta)<epsilon) K.Grzelak (Wykład 1) Programowanie w C++ 8 / 35
Funkcje K.Grzelak (Wykład 1) Programowanie w C++ 9 / 35
Potęgowanie 5 3 bez użycia funkcji int main(){ int pow5_3=1; for(int i=0;i<3;i++){ pow5_3=pow5_3*5; return 0; K.Grzelak (Wykład 1) Programowanie w C++ 10 / 35
Potęgowanie 5 3, 5 7, 3 8 bez użycia funkcji int main(){ int pow5_3=1; for(int i=0;i<3;i++){ pow5_3=pow5_3*5; int pow5_7=1; for(int i=0;i<7;i++){ pow5_7=pow5_7*5; int pow3_8=1; for(int i=0;i<8;i++){ pow3_8=pow3_8*3; return 0; K.Grzelak (Wykład 1) Programowanie w C++ 11 / 35
Prościej jeżeli używa się funkcji 5 3, 5 7, 3 8 int main(){ int pow5_3=potega(5,3); int pow5_7=potega(5,7); int pow3_8=potega(3,8); return 0; Gdzie i jak zdefiniować funkcję potega? K.Grzelak (Wykład 1) Programowanie w C++ 12 / 35
Definicja własnej funkcji int potega(int podstawa, int wykladnik){ int wynik=1; for(int i=0;i<wykladnik;i++){ wynik=wynik*podstawa; return wynik; int main(){ int pow5_3=potega(5,3); int pow5_7=potega(5,7); int pow3_8=potega(3,8); return 0; Każda funkcja zdefiniowana w niezależnym bloku. K.Grzelak (Wykład 1) Programowanie w C++ 13 / 35
Zalety własnych funkcji Kod czytelniejszy Trudniej o popełnienie błędu Zmiana algorytmu zmiana jednej funkcji Tę sama funkcję można użyć w innym programie Tę sama funkcję moga użyć inne osoby K.Grzelak (Wykład 1) Programowanie w C++ 14 / 35
Definicja funkcji int potega(int podstawa, int wykladnik){ int wynik=1; for(int i=0;i<wykladnik;i++){ wynik=wynik*podstawa; return wynik; int main(){ int wynik=potega(3,4); return 0; Funkcje można umieszczać przed lub za funkcja main. K.Grzelak (Wykład 1) Programowanie w C++ 15 / 35
Definicja i deklaracja funkcji int potega(int podstawa, int wykladnik); int main(){ int wynik=potega(3,4); return 0; int potega(int podstawa, int wykladnik){ int wynik=1; for(int i=0;i<wykladnik;i++){ wynik=wynik*podstawa; return wynik; Jeżeli definicja funkcji jest za main, to przed main musi być jej deklaracja. K.Grzelak (Wykład 1) Programowanie w C++ 16 / 35
Przykład funkcji int potega(int podstawa, int wykladnik){ int wynik=1; for(int i=0;i<wykladnik;i++){ wynik=wynik*podstawa; return wynik; potega nazwa funkcji (int podstawa, int wykladnik) argumenty funkcji za return to co funkcja zwraca przed nazwa funkcji typ wyniku K.Grzelak (Wykład 1) Programowanie w C++ 17 / 35
Przykłady deklaracji funkcji int fun1(); double f2(double czas, int typ); void rysuj(char znak, int n); K.Grzelak (Wykład 1) Programowanie w C++ 18 / 35
Wynik działania funkcji Funkcja zwraca co najwyżej jedna wartość. Przykład, gdy nie zwraca niczego: void rysuj(char znak, int n); K.Grzelak (Wykład 1) Programowanie w C++ 19 / 35
Rysowanie kwadratu z przekatnymi void rysuj(char znak, int n){ for(int i=1;i<=n;++i){ for(int j=1;j<=n;++j){ char znak_rys; if(i==1 j==1 i==j j==n-i+1 j==n i cout << znak; else{ cout << " "; cout << endl; int main(){ rysuj( *,10); K.Grzelak (Wykład 1) Programowanie w C++ 20 / 35
Rysowanie kwadratu z przekatnymi K.Grzelak (Wykład 1) Programowanie w C++ 21 / 35
Wynik działania jednej funkcji może być różny Polecenie return może być w kilku miejscach. double sr_geom(double a, double b){ double iloczyn=a*b; if(iloczyn<0){ return -999.; return sqrt(iloczyn); K.Grzelak (Wykład 1) Programowanie w C++ 22 / 35
Stos podręczna pamięć Stos (ang. stack) LIFO(Last In, First Out) K.Grzelak (Wykład 1) Programowanie w C++ 23 / 35
Odwrotna Notacja Polska czyli jak działa stos Przykład ((3+8)/3+(15-6)*5)/2 W odwrotnej notacji polskiej: 3 8 + 3 / 15 6-5 * + 2 / Niepotrzebne nawiasy! K.Grzelak (Wykład 1) Programowanie w C++ 24 / 35
Odwrotna Notacja Polska czyli jak działa stos 3 8 + 3 / 15 6-5 * + 2 / Dla kolejnych symboli: Jeśli symbol jest liczba odkładamy go na stos Jeżeli symbol jest operatorem: zdejmij ze stosu dwa elementy (i i j) odłóż na stos wynik operacji i operator j K.Grzelak (Wykład 1) Programowanie w C++ 25 / 35
Odwrotna Notacja Polska czyli jak działa stos, cd Dla kolejnych symboli: Jeżeli symbol jest funkcja: zdejmij ze stosu tyle elementów ile jest parametrów funkcji odłóż na stos wynik funkcji K.Grzelak (Wykład 1) Programowanie w C++ 26 / 35
Przesyłanie argumentów do funkcji przez wartość K.Grzelak (Wykład 1) Programowanie w C++ 27 / 35
Przesyłanie argumentów do funkcji przez wartość (np. double sumuj(int typ);): Do funkcji przesyłana jest tylko liczbowa wartość Wartość używana do inicjalizacji zmiennej lokalnej na stosie Funkcja pracuje na kopii obiektu K.Grzelak (Wykład 1) Programowanie w C++ 28 / 35
Przesyłanie argumentów do funkcji przez referencję K.Grzelak (Wykład 1) Programowanie w C++ 29 / 35
Przesyłanie argumentów do funkcji przez referencję (np. double sumuj(int & typ);): Do funkcji przesyłany jest tylko adres zmiennej w pamięci komputera Na stosie tworzona jest referencja (przezwisko) obiektu Funkcja pracuje na oryginale obiektu K.Grzelak (Wykład 1) Programowanie w C++ 30 / 35
Przeładowanie funkcji K.Grzelak (Wykład 1) Programowanie w C++ 31 / 35
Przeładowanie funkcji Funkcje moga mieć tę sama nazwę, ale różna liczbę argumentów Funkcje moga mieć tę sama nazwę, tę sama liczbę argumentów, ale inne ich typy void rysuj(char znak, int typ); void rysuj(char znak); void rysuj(char znak, char znak2); K.Grzelak (Wykład 1) Programowanie w C++ 32 / 35
Funkcje biblioteczne K.Grzelak (Wykład 1) Programowanie w C++ 33 / 35
Funkcje biblioteczne Biblioteka matematyczna, cmath Plik nagłówkowy: #include <cmath> Podnoszenie do potęgi (a do potęgi b): pow(a,b) Pierwiastek: sqrt Wartość bezwzględna: fabs Funkcje trygonometryczne: sin, cos, tan, asin, acos, atan, atan2 Funkcje eksponencjalne i logarytmiczne: exp,log,log10... Dokumentacja standardowej biblioteki: http://www.cplusplus.com/reference/ K.Grzelak (Wykład 1) Programowanie w C++ 34 / 35
Funkcje Program Programowanie proceduralne, np. w języku C W C++ też można programować proceduralnie, ale ++ oznacza programowanie obiektowe K.Grzelak (Wykład 1) Programowanie w C++ 35 / 35