JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 4 1
NAPISY W C++ Tablice znakowe (typu char) kłopotliwe w użyciu Biblioteka standardowa C++ ma zaimplementowaną uogólnioną klasę napisów zwaną string (łańcuch znaków, napis). #include <iostream> using namespace std; int main() string Napis= To jest string ; cout<<napis; return 0; String jest przechowywany w pamięci jako ciąg liter, a na samym jego końcu dodawany jest znak o kodzie 0 (w kodzie ASCII), czyli znak NULL. 2
NAPISY W C++ Klasa string ma zdefiniowanych wiele operatorów, co ułatwia niektóre działania na napisach. Te operatory to m.in. =, ==,!=, +, <, > (o operatorach za chwilę ) Np. : #include <iostream> using namespace std; int main() string Tekst1= Ala ; string Tekst2=Tekst1+ ma kota ; cout<<tekst2; return 0; 3
OPERATORY Operatory arytmetyczne: Symbol Nazwa / działanie Przykład = przypisanie ( staje się ) y=3; + dodawanie c=a+b; - odejmowanie m=n-11.3; * mnożenie d=3*f; / dzielenie h=g/1.3; % modulo, reszta z dzielenia k=8%3; //wynik: 2 ++ inkrementacja (zwiększenie o 1) -- dekrementacja (zmniejszenie o 1) x++; (postinkrementacja) ++x; (preinkrementacja) x--; (postdekrementacja) --x; (predekrementacja) Priorytet operatorów +,-,*,/ jak w matematyce. W razie wątpliwości lepiej użyć nawiasów 4
OPERATORY Uwaga! Wynikiem dzielenia dwu liczb całkowitych jest liczba całkowita, np. wynikiem działania 4/3 będzie 1, a nie spodziewane 1.333(3) Rozwiązanie 1: Przynajmniej jedną z liczb zapisujemy w postaci z kropką, np.: 4.0/3 Rozwiązanie 2: Stosujemy tzw. rzutowanie: #include <iostream> using namespace std; int main() cout.precision(15); //zwiększenie dokładności wyświetlania //(ale nie liczenia) cout<<static_cast<float>(4)/3; //chcemy, by 4 było traktowane jak float cout<<static_cast<double>(4)/3; //a może lepiej jak double return 0; 5
OPERATORY Operatory arytmetyczne cd.: Symbol Nazwa / działanie Przykład += przypisanie sumy y+=3; //y=y+3; -= przypisanie różnicy c-=7.2; //c=c-7.2; *= przypisanie iloczynu m*=2.1; //m=m*2.1; /= przypisanie ilorazu d/=3.38; //d=d/3.38; %= przypisanie modulo w%=7; //w=w%7; Uwaga! Kolejność jest ważna! y+=3 y=+3 //y=y+3 //y=3 - przypisanie do y wartości +3 6
OPERATORY Pre- czy post-? Cztery sposoby dodania 1 do zmiennej : 1. m=m+1; 2. m+=1; 3. ++m; 4. m++; Ad. 3 (operatory z prefiksem): Najpierw dokonywane jest zwiększenie (zmniejszenie) jego wartości o 1. Nowa wartość jest następnie zwracana jako wynik. Ad. 4 (operatory z postfiksem): Najpierw zwracana jest wartość wyrażenia (tworzona jest kopia zmiennej), następnie dokonywane jest zwiększenie (zmniejszenie) jego wartości o 1. Co wybrać? Jeśli to możliwe, to wersję z prefiksem szybsza i mniejsze wymagania pamięciowe. 7
OPERATORY Uwaga na operatory inkrementacji i dekrementacji w wyrażeniach! Ich działanie może sprawiać kłopoty, np: #include <iostream> using namespace std; int main() int a=10, b=10; cout<<"wartosci wyrazen:"<<endl; cout<<++a<<endl; //wyświetla 11 cout<<b++<<endl; //wyświetla 10 cout<<"wartosci zmiennych:"<<endl; cout<<a<<endl; //wyświetla 11 cout<<b<<endl; //wyświetla 11 return 0; Najbezpieczniej jest stosować je jako liczniki w pętlach (zwykle for) i samodzielne instrukcje typu: ++zm; 8
OPERATORY Operatory logiczne: Symbol Nazwa / działanie Przykład < jest mniejszy if(a<3); <= jest mniejszy bądź równy if(b<=11.3); > jest większy if(c>d); >= jest większy bądź równy if(e>=(f+1)); == jest równy if(m==n);! (not) negacja if(!m); //prawda, gdy m==0!= jest różny od if(p!=13); && (and) iloczyn logiczny (AND) if((a>3)&&(b<=11.3)); (or) suma logiczna (OR) if((s== t ) (s== T )); O if i innych instrukcjach wyboru będzie mowa później 9
OPERATORY Uwaga! == oraz = to dwa zupełnie różne operatory! a=7 przypisanie do zmiennej wartości 7 a==7 porównanie a oraz 7 #include <iostream> using namespace std; int main() int a; cout<<"wpisz dowolna cyfre, a powiem Ci, czy podales 7\n"; cin>>a; if(a==7) cout<<"tak! Podales 7"; //if(a=7)cout<<"tak! Podales 7"; // Sprawdź, co się stanie else cout<<"to raczej nie jest 7..."; return 0; 10
WYBRANE FUNKCJE Z BIB. STANDARDOWEJ W pliku nagłówkowym <cmath> Niektóre funkcje trygonometryczne: Funkcja sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) Opis Zwraca wartość sinusa x Zwraca wartość cosinusa x Zwraca wartość tangensa x Funkcja odwrotna do sin(x) Funkcja odwrotna do cos(x) Funkcja odwrotna do tan(x) Uwaga! Funkcje trygonometryczne przyjmują argument w radianach 11
WYBRANE FUNKCJE Z BIB. STANDARDOWEJ W pliku nagłówkowym <cmath> Niektóre funkcje wykładnicze i logarytmiczne: Funkcja Opis exp(x) log(x) log10(x) Zwraca wartość funkcji wykładniczej e x Zwraca wartość logarytmu naturalnego z x Zwraca wartość logarytmu dziesiętnego z x Potęgi i pierwiastki: Funkcja pow(x,y) pow10(x) sqrt(x) cbrt(x) Zwraca wartość x do potęgi y Opis Zwraca wartość 10 x Zwraca wartość pierwiastka kwadratowego z x Zwraca wartość pierwiastka sześciennego z x 12
WYBRANE FUNKCJE Z BIB. STANDARDOWEJ W pliku nagłówkowym <cmath> Inne przydatne funkcje: Funkcja abs(x), fabs(x) round(x) floor(x) ceil(x) Opis Zwraca wartość bezwzględną z x Zwraca wartość naturalnego zaokrąglenia x Zwraca wartość zaokrąglenia x w dół Zwraca wartość zaokrąglenia x w górę Istotniejsze stałe matematyczne: Funkcja M_PI M_E Zwraca wartość stałej p Opis Zwraca wartość stałej Eulera (podstawy logarytmu nat.) e 13
WYBRANE FUNKCJE Z BIB. STANDARDOWEJ W pliku nagłówkowym <cstdlib> Funkcja srand() rand() Opis Ustawia punkt startowy, który jest stosowany do generowania serii pseudolosowych liczb całkowitych Generuje całkowitą liczbę pseudolosową W pliku nagłówkowym <cstdlib> Funkcja Opis time() W pliku nagłówkowym <cctype> Zwraca bieżący czas kalendarzowy w sekundach Funkcja islower() isupper() tolower() toupper() Opis Do określania czy argument jest małą literą Do określania czy argument jest wielką literą Do zamiany wielkich liter na małe Do zamiany liter małych na wielkie 14
INSTRUKCJE STERUJĄCE Instrukcje sterujące to takie instrukcje, które sterują przebiegiem programu w zależności od spełnienia (bądź nie) jakiegoś warunku. Decyzje podejmowane są zależnie od tego, czy dany warunek jest spełniony (wartością wyrażenia jest prawda), czy też nie jest spełniony (wartością wyrażenia jest fałsz). W C++: wartość ZERO odpowiada stanowi FAŁSZ wartość INNA NIŻ ZERO odpowiada stanowi PRAWDA Instrukcje sterujące: 1. instrukcje wyboru; 2. pętle; 3. instrukcje skoku. 15
INSTRUKCJE WYBORU Instrukcja warunkowa if: if(warunek)instrukcja; lub: if(warunek) instrukcja_1; instrukcja_2; // blok instrukcji // ograniczony nawiasami klamrowymi Jeżeli warunek jest spełniony (jego wartość jest różna od zera), to wykonywana jest instrukcja lub blok instrukcji (ciąg instrukcji ograniczonych nawiasami klamrowymi). 16
INSTRUKCJE WYBORU if else Instrukcja warunkowa if else: if(warunek)instrukcja_1; else instrukcja_2; Jeżeli warunek jest spełniony, to wykonywana jest instrukcja lub blok instrukcji występujących po słowie if. Jeżeli warunek nie jest spełniony, to wykonywana jest instrukcja lub blok instrukcji występujących po słowie else. 17
INSTRUKCJE WYBORU if else Przykład: #include <iostream> using namespace std; int main() int a ; cout<<"wpisz prosze 7"<<endl; cin>>a; if (a==7) //if(!(a-7)) //albo tak: wartością (a-7) jest 0 (fałsz) //lub inna liczba (prawda) cout <<"To prawda, ze wpisales 7"<<endl; cout<<"dziekuje za wspolprace"<<endl; else cout<<"wpisales inna liczbe!"<<endl; cout<< Przeciez prosilem grzecznie o 7..."<<endl; return 0; 18
INSTRUKCJE WYBORU if else if else, wybór wielowariantowy: if(warunek_1)instrukcja_1; else if(warunek_2) instrukcja_2; else if(warunek_3) instrukcja_3; else instrukcja_n; if else, zagnieżdżanie: if(warunek1) if(warunek2) instrukcja_1; instrukcja_2; else instrukcja_n; Jeżeli nawiasy klamrowe nie określają inaczej, to else odnosi się do najbliższego if. 19
INSTRUKCJE WYBORU if else Przykład: #include <iostream> using namespace std; int main() int temperatura ; cout<<"podaj, jaka jest dzis temperatura w stopniach"<<endl; cin>>temperatura; if (temperatura>30) cout<<"upalnie"; else if (temperatura>20) cout<<"przyjemnie cieplo"; else if (temperatura>10) cout<<"moze byc Ci chlodno"; else if (temperatura>=0) cout<<"dosc chlodno"; else cout<<"temperatura jest ujemna!"; return 0; 20
INSTRUKCJE WYBORU switch Instrukcja wielokrotnego wyboru switch: switch(wyrażenie_warunkowe) case wyrażenie_stałe_1 instrukcja_1; break; //break jest opcjonalne case wyrażenie_stałe_2 instrukcja_2; instrukcja_3; break; default //gdy żadne wyrażenie stałe nie //jest prawdziwe (opcjonalne) instrukcja_n; 21
INSTRUKCJE WYBORU switch Przykład: #include <iostream> using namespace std; int main() int karta; cout<<"zagrajmy w trzy karty.\n"; cout<<"podaj numer karty do odsloniecia:"<<endl; cin>>karta; switch(karta) case 1: cout<<"pierwsza karta odslonieta."; break; case 2: cout<<"druga karta odslonieta."; break; case 3: cout<<"trzecia karta odslonieta."; break; default: cout<<"nie ma takiej karty..."; return 0; 22
INSTRUKCJE WYBORU switch Przykład: #include <iostream> using namespace std; int main() char odpowiedz; int T_zlicz=0,N_zlicz=0; cout<<"odpowiedz T lub N (tak lub nie)"<<endl; cin>>odpowiedz; switch(odpowiedz) case 'T': case 't': //zauwaz, ze po case 'T' nie było break... cout<<"odpowiedziales twierdzaco"<<endl; ++T_zlicz; break; //wyjście ze switch case 'N': case 'n': cout<<"odpowiedziales przeczaco"<<endl; ++N_zlicz; break; //wyjście ze switch default: cout<<"nie odpowiedziales prawidlowo..."<<endl; //switch return 0; 23
INSTRUKCJE WYBORU switch vs. if else (czyli: co wybrać ) Obiekt wybierający co to?: a) switch(obiekt_wybierający) b) if(obiekt_wybierający==wyrażenie) Wybór: 1. Ze względu na obiekt wybierający: a) dla switch musi być to obiekt lub wyrażenie całkowite; b) dla if else typ obiektu wybierającego nie ma znaczenia. 24
INSTRUKCJE WYBORU 2. Ze względu na to, z czym porównywany jest obiekt wybierający: a) dla switch obiekt wybierający jest porównywany ze stałymi wartościami całkowitymi znanymi w momencie pisania programu; b) dla if else obiekt wybierający można porównać z wyrażeniem, którego wartość jest znana dopiero podczas wykonywania programu. 3. Ze względu na operację porównana: a) dla switch porównanie to sprawdzenie, czy jest spełniona równość; b) dla if else porównanie może być dowolnym operatorem logicznym, dającym w wyniku prawda/fałsz. 25
PĘTLE for Pętle są to instrukcje, które umożliwiają wykonywanie pojedynczej instrukcji bądź ich bloku tak długo, jak długo dopóki spełniony jest warunek. Pętla for: for(instrukcja_inicjalizujaca; wyrazenie_warunkowe; krok) instrukcja_1; instrukcja_2; instrukcja_inicjalizujaca instrukcja wykonywania jednokrotnie przed wykonaniem właściwej części pętli. wyrazenie_warunkowe wyrażenie, którego wartość jest obliczana przed każdym obiegiem pętli. Jeśli jest prawdziwe wykonywane są instrukcje w treści pętli. krok instrukcja wykonywana na zakończenie obiegu pętli (zwykle zwiększenie licznika ) 26
PĘTLE for Przykład: #include <iostream> using namespace std; int main() for (int i=0; i<10; ++i) //wykonaj 10 razy cout<<i+1 <<" "; // wypisanie 1 2 9 10 // int i=0 bardzo częste return 0; Każdy z elementów występujących w nawiasie za for może zostać pominięty (za wyjątkiem znaków ;). Np.: for(;;) oznacza pętlę nieskończoną (już samo opuszczenie wyrażenia warunkowego jest traktowane tak, jak gdyby było ono zawsze prawdziwe). 27
PĘTLE while Pętla while: while(wyrazenie_warunkowe) instrukcja_1; instrukcja_2; Blok instrukcji jest wykonywany tak długo, jak długo prawdziwe jest wyrazenie_warunkowe. Jeśli wyrazenie_warunkowe od razu nie jest prawdziwe, to pętla nie wykona się ani raz. 28
PĘTLE while Przykład: #include <iostream> using namespace std; int main() int i=1; while(i<=10) cout<<i<<" "; // wypisanie 1 2 9 10 ++i; return 0; 29
PĘTLE do while Pętla do while: do instrukcja_1; instrukcja_2; while(wyrazenie_warunkowe); Blok instrukcji jest wykonywany tak długo, jak długo prawdziwe jest wyrazenie_warunkowe. Jeśli wyrazenie_warunkowe od razu nie jest prawdziwe, to pętla wykona się dokładnie 1 raz. 30
PĘTLE do while Przykład: #include <iostream> using namespace std; int main() int i=1; do cout<<i<<" "; // wypisanie 1 2 9 10 ++i; while(i<=10); return 0; Mając do wyboru pętle while i do while zaleca się wybierać tą pierwszą (mniej podatna na błędy). 31
ZAGADKA Z MORAŁEM Znalezione w sieci: Małgosia dała Jasiowi dwa jabłka a Krysia trzy. Ile jabłek ma Jasio? Prawidłowa odpowiedź: nie wiadomo. A morał z tego: Programisto, zawsze inicjalizuj zmienne. Przykład: #include <iostream> using namespace std; int main() int liczba1=5; int liczba2, wynik; //brak inicjalizacji zmiennej "liczba2" wynik=liczba1+liczba2; //sprawdź, jaki jest rezultat... cout<<"wynik dodawania to: "<<wynik<<endl; return 0; 32
POZOSTAŁE INSTRUKCJE STERUJĄCE Instrukcja break: Instrukcja ta w przypadku pętli powoduje natychmiastowe wyjście z pętli, np.: Przykład: #include <iostream> using namespace std; int main() int i=1; while(i<=10) if(i>5) break; cout<<i<<" "; //wypisanie: 1 2 3 4 5 ++i; return 0; 33
POZOSTAŁE INSTRUKCJE STERUJĄCE Instrukcja continue: Instrukcja ta w przypadku pętli powoduje pominięcie instrukcji występujących za nią i przejście do następnej iteracji (pętla nie zostaje przerwana). Przykład: #include <iostream> using namespace std; int main() int i=0; while(i<10) ++i; //i<10, bo za chwilę ++i; //inkrementacja tu, bo inaczej po continue //pętla nieskończona if((i==5) (i==7) (i==9)) continue; cout <<i<<" "; //wypisanie: 1 2 3 4 6 8 10 return 0; 34
POZOSTAŁE INSTRUKCJE STERUJĄCE Instrukcja return: Instrukcja ta powoduje zwrot przez funkcję wartości stojącej po prawej stronie instrukcji. Wartością tą może być dowolne wyrażenie lub wywołanie innej lub tej samej (tzw. wywołanie rekurencyjne) funkcji. Więcej przy omawianiu funkcji Instrukcja skoku goto: Instrukcja ta powoduje przeniesienie wykonywania programu do miejsca, gdzie jest dana etykieta, której nazwa stoi po prawej stronie instrukcji, np.: cout<<"ala ma kota\n"; goto etykieta_1; etykieta_1: cout<<"bardzo wazny tekst "; Używanie instrukcji goto jest odradzane! jej użycia prawie zawsze da się uniknąć. Instrukcja ta powoduje, że kod programu staje się nieczytelny i trudny do kompilacji. 35