wykład 2 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018
Inicjalizacja zmiennych Zmiennej możemy nadać wartość już w momencie jej definiowania (inicjalizacja zmiennej). Przypisywana wartość powinna mieścic się w zakresie typu. Postać: typ zmiennej nazwa zmiennej = wyrażenie; Przykłady int i = 0; float s= 2.5234 + 3.234; int k, l=100, m; tylko jedna zmienna ma nadaną wartość początkową 100
Inicjalizacja zmiennych Zmiennej możemy nadać wartość już w momencie jej definiowania (inicjalizacja zmiennej). Przypisywana wartość powinna mieścic się w zakresie typu. Postać: typ zmiennej nazwa zmiennej = wyrażenie; Przykłady int i = 0; float s= 2.5234 + 3.234; int k, l=100, m; tylko jedna zmienna ma nadaną wartość początkową 100 powyższe wartości początkowe mogą być oczywiście zmienione w trakcie działania programu
Przykład (inicjalizacja zmiennych,oraz C++ to nie Excel ;-) ) # include < iostream > using namespace std ; int main () { int a = 3; int x, b =10; int c = a* b; } cout << " niezainicjalizowany x = " << x << endl ; a = 6; cout << " a = " << a << " b = " << b << " c = " << c << endl ; /* wartosc zmiennej a zmieniona, wartosc c bez zmiany ( nadal 30) */ return 0;
Stałe Oprócz zmiennych możemy wprogramie używać także stałych. Stałe nie mogą zmieniać swojej wartości. Wartość nadajemy im w momencie ich definiowania: definicja stałej: const nazwa typu nazwa stałej = wyrażenie;
Stałe Oprócz zmiennych możemy wprogramie używać także stałych. Stałe nie mogą zmieniać swojej wartości. Wartość nadajemy im w momencie ich definiowania: definicja stałej: const nazwa typu nazwa stałej = wyrażenie; Przykłady const int procent podatku = 18; const float przyspieszenie ziemskie = 9.80665;
Program używający stałych # include < iostream > using namespace std ; int main () { float netto_ price = 123.40; const float vat = 0.22; float brutto_ price ; } brutto_ price = netto_ price + netto_ price * vat ; cout << " cena netto to " << netto_ price << ", ale z podatkiem VAT zaplacisz " << brutto_ price << endl ; return 0;
Wyrażenia arytmetyczne Wyrażenia konstruuje się z literałów, nazw stałych i zmiennych oraz operatorów arytmetycznych, używając nawiasów ( ) w razie potrzeby. Wyrażenia służą do obliczania wartości które są następnie np. przypisywane stałym, zmiennym lub wypisywane na ekranie pojedyncza zmienna lub literał to także wyrażenia
Operatory używane w wyrażeniach arytmetycznych Podstawowe operatory to + - * / całkowitych) i % (modulo, dla wartości kolejnośc wykonywania działań (priorytet operatorów) odpowiada matematyce: wyrażenie w nawiasie obliczane jest w pierwszej kolejności; jeśli nawiasy są zagnieżdżone, pierwszy przetwarzany jest nawias najbardziej wewnętrzny, następnie wykonywane są działania mnożenia, dzielenia i modulo; jeśli jest ich kilka, wykonywane są od lewej do prawej, dodawanie i odejmowanie wykonywane jest na końcu; jeśli jest ich kilka, wykonywane są od lewej do prawej typ wyniku operacji arytmetycznej jest taki jak najdokładniejszy spośród typów wartości będących argumentami operacji; typ wyniku złożonego wyrażenia arytmetycznego można określić stosując powyższą zasadę w kolejnych krokach obliczania jego wartości
Operatory używane w wyrażeniach arytmetycznych Podstawowe operatory to + - * / całkowitych) i % (modulo, dla wartości kolejnośc wykonywania działań (priorytet operatorów) odpowiada matematyce: wyrażenie w nawiasie obliczane jest w pierwszej kolejności; jeśli nawiasy są zagnieżdżone, pierwszy przetwarzany jest nawias najbardziej wewnętrzny, następnie wykonywane są działania mnożenia, dzielenia i modulo; jeśli jest ich kilka, wykonywane są od lewej do prawej, dodawanie i odejmowanie wykonywane jest na końcu; jeśli jest ich kilka, wykonywane są od lewej do prawej typ wyniku operacji arytmetycznej jest taki jak najdokładniejszy spośród typów wartości będących argumentami operacji; typ wyniku złożonego wyrażenia arytmetycznego można określić stosując powyższą zasadę w kolejnych krokach obliczania jego wartości dzielenie dwóch liczb całkowitych daje wynik całkowity, nawet jeśli występuje np. w wyrażeniu zawierającym liczby rzeczywiste jak 12/5 + 7.2
Skompresowane (szybkie) przypisania a = a + x może być zapisane jako a += x podobnie: a = a - x może być zapisane jako a -= x a = a * x może być zapisane jako a *= x a = a / xmoże być zapisane jako a /= x gdzie a jest zmienną, a x dowolnym wyrażeniem (przykłady: a +=10, a-=3*x)
Inne operatory: inkrementacja i dekrementacja Dodawanie i odejmowanie jedynki są na tyle częstymi operacjami że doczekały się specjalnych operatorów: ++ - inkrementacja -- - dekrementacja Sposób użycia (a jest zmienną): a++; a--; (post-inkrementacja / post-dekrementacja) ++a; --a; (pre-inkrementacja. pre-dekrementacja) [szczegóły będa wyjaśnione później]
Przykład (Inkrementacja - przykłady) # include < iostream > using namespace std ; int main () { int i, x; i =2; x =4; i = x ++; cout << " i = " << i << " x = " << x << endl ; // i =4, x =5 (" x najpierw uzyty w przypisaniu, potem zwiekszony ") i =2; x =4; i = ++ x; cout << " i = " << i << " x = " << x << endl ; // i =5, x =5 (" x najpierw zwiekszony, potem uzyty w przypisaniu ") return 0; }
Konwersja typów (rzutowanie) Konwersja typów (rzutowanie typów, ang. type casting) zamienia wartość jednego typu na odpowiadającą jej wartość innego typu dozwolone są dwie formy zapisu: zapis funkcyjny: nazwa typu( obiekt do przekonwertowania) - np. y = int(x) ; zapis w stylu C : ( nazwa typu) obiekt do przekonwertowania - np. y =(int) x ;
Operacje wejścia i wyjścia dla wartości liczbowych Strumień wejściowy std::cin Aby przypisać zmiennej wartość wprowadzoną przez użytkownika możemy użyć strumienia wejściowego std::cin możemy uważać ten strumień za skojarzony z standardowym wejściem (zwykle klawiaturą) ( płynący od klawiatury ) polecenie std::cin >> zmienna; przekierowuje dane z klawiatury do zmiennej podanej po operatorze >>
# include < iostream > using namespace std ; int main (){ int eggs1, eggs2, totaleggs, people ; cout << " Give the number of eggs of the 1 st person : "; cin >> eggs1 ; cout << " Give the number of eggs of the 2 nd person : "; cin >> eggs2 ; totaleggs = eggs1 + eggs2 ; cout << " They have together " << totaleggs << " eggs " << endl ; cout << " How many people do you want to feed? "; cin >> people ; cout << " Eggs for person : " << totaleggs / float ( people ) << endl ; // conversion to float return 0; }
Formatowanie wyjścia: manipulatory Manipulatory to specjalne wartości które mogą być wstawione do strumienia wyjściowego, zmieniając sposób wyświetlania danych większość manipulatorów działa do odwołania (tj. do momentu zastąpienia ustawienia innym)
Manipulatory - cd Manipulatory bezparametrowe: hex, dec, oct - tylko dla wartości całkowitych, określają system w którym są one wypisywane / pobierane (wartość domyślna: dec) showpoint, noshowpoint - przełączniki wyświetlania części ułamkowej poprzedzonej kropką gdy ta część jest zerowa (domyślnie: showpoint) showpos, noshowpos - przełączniki wyświetlania znaku + dla liczby dodatniej (domyślnie: noshowpos) showbase, noshowbase - pzełączniki wyświetlania symbolu podstawy podczas wypisywania liczb w systemie innym niż dziesiętny (domyślnie: noshowbase) fixed, scientific - przełączniki wyświetlania liczb rzeczywistych w postaci dziesiętnej / wykładniczej endl- przejście do nowej linii
# include < iostream > using namespace std ; int main () { cout << " 12 osemkowo : " << oct << 12 << endl ; cout << " inna wersja " << showbase << oct << 12 << endl ; cout << noshowbase ; // powrot do ustawien domyslnych cout << " 12 szesnastkowo : " << hex << 12 << endl ; cout << 123 << endl ; // hex nadal obowiazuje cout << dec ; // przywrocenie domyslnego cout << 123 << endl ; // dziesiatkowo cout << showpoint << 12.00 << noshowpoint << " vs. " << 12.00 << endl ; cout << fixed << 12 e02 << " vs. " << scientific << 12 e02 << endl ; cout << 4.4 << endl ;// notacja wykladnicza cout << showpos << 4 << " vs. " << noshowpos << 4 << endl ; return 0; }
Manipulatory - cd Manipulatory z parametrami, wymagają dołączenia iomanip setw(n) gdzie n jest wartością całkowitą - określa szerokość wypisywania liczb na n, działa tylko dla najbliższej operacji wejścia/wyjścia setfill(n), gdzie n jest znakiem - określa znak wypełniający pusty obszar wypisywania (domyślnie spacja) setprecision(n), gdzie n jest wartością całkowitą - określa dokładność wypisywania wartości rzeczywistych (albo cakowitą liczbę cyfr znaczących, albo liczbę cyfr części ułamkowej jeśli występuje w połączeniu z fixed)
# include < iostream > # include < iomanip > using namespace std ; int main () { cout << std :: setprecision (5) << 100. 1234567899 << endl << " vs. " << endl ; cout << fixed << std :: setprecision (5) << 100. 1234567899 << endl ; cout << 12 << endl ; cout << setw (10) << 12 << endl ; cout << setw (10) << setfill (. ) << 12 << endl ; } return 0;
Funkcje matematyczne Biblioteka cmath Dołączenie biblioteki cmath umożliwia korzystanie z różnych funkcji matematycznych. Niektóre z nich: sin(x), cos(x), tan(x), gdzie x jest wartością rzeczywistą - obliczają sinus, cosinus, tangens kąta (w radianach) podanego jako argument; wynik jest typu takiego jak x exp(x), gdzie x jest wartością rzeczywistą - zwraca e x (wartość typu takiego jak x) log(x), log10(x), gdzie x jest wartością rzeczywistą - obliczają odpowiednio: logarytm naturalny i logarytm dziesiętny z liczby rzeczywistej x, wynik jest typu takiego jak x
Biblioteka cmath - cd ceil(x) - zwraca sufit - najmniejszą liczbę całkowitą nie mniejszą niż x floor(x) - zwraca podłogę - największą liczbę całkowitą nie większą niż x trunc(x) - zwraca zaokrąglenie x w stronę zera, do liczby całkowitej round(x) - zwraca zaokrąglenie x do najbliższej liczby całkowitej; wartości połówkowe są zaokrąglane do wartości dalszej od 0 abs(x) - zwraca x (wartość bezwzględną)
Biblioteka cmath - cd pow(a,b) - oblicza a b ; gdzie a - rzeczywiste, b - rzeczywiste (ale dla a < 0 musi być wartością całkowitą); wynik jest typu takiego jak a sqrt(x), cbrt(x) - obliczają odpowiednio: pierwiastek kwadratowy i pierwiastek trzeciego stopnia z x (x rzeczywiste, wynik ma typ jak x) [cbrt istnieje od standardu C++11]
Przykład (Użycie funkcji matematycznych) # include < iostream > # include <cmath > using namespace std ; int main () { float a = 5.1, b = 2; cout << a << " ^" << b << " to " << pow (a, b) << endl ; cout << " pierwiastek z " << a << " to " << sqrt ( a ) << endl ; cout << " pierwiastek trzeciego stopnia z " << a << " to " << cbrt ( a) << endl ; cout << " modul z " << a << " to " << abs ( a) << endl ; cout << " logarytm naturalny z " << a << " to " << log (a) << endl ; return 0; }
Biblioteka cmath - cd Możliwe jest uzyskanie dostępu do stałych matematycznych, m.in. M PI - stała π M E - stała e M PI 2, M PI 4, M 1 PI, M 2 PI, M 2 SQRTPI - π 2, π 4, 1 π, 2 π, 2 π M LOG2E M LOG10E, M LN2, M LN10 - log 2 e, log 10 e, ln 2, ln 10 M SQRT2, M SQRT1 2-1 2, 2 powyższe stałe nie są elementem standardu C++; uzyskanie dostępu do nich może wymagać zdefiniowania odpowiedniej stałej ( USE MATH DEFINES) przed dołączeniem biblioteki cmath, może też być potrzebne oddefiniowanie STRICT ANSI (lub uruchomienie kompilatora z odpowiednią opcją) #define to dyrektywa preprocesora definiująca tutaj tzw. stałą symboliczną; #undef ma działanie odwrotne
Przykład (Użycie stałych i funkcji matematycznych) # define _ USE_ MATH_ DEFINES // nie zawsze potrzebne # undef STRICT_ ANSI // potrzebne jeszcze rzadziej # include < iostream > # include <cmath > # include < iomanip > using namespace std ; int main () { cout << " Wartosc pi = " << fixed << setprecision (10) << M_PI << endl ; cout << " Wartosc pi /2 = " << M_PI_2 << endl ; cout << " Wartosc sin ( pi /2) = " << sin ( M_PI_2 ) << endl ; return 0; }
Instrukcja warunkowa W programie używamy instrukcji sterujących, umożliwiających warunkowe lub iteracyjne wykonanie pewnych fragmentów kodu Jedną z instrukcji sterujących jest instrukcja warunkowa
Instrukcja warunkowa Instrukcja warunkowa występuje zazwyczaj w trzech wersjach: jeżeli warunek to instrukcje_do_wykonania jeżeli warunek to instrukcje_do_wykonania_1 w_przeciwnym_razie instrukcje_do_wykonania_2 jeżeli warunek1 to instrukcje_do_wykonania1 jeżeli warunek2 to instrukcje_do_wykonania_2... w_pozostałych_przypadkach instrukcje_do_wykonania_n Instrukcja daje możliwość wyboru jednego z dostępnych wariantów, zależnie od wartości logicznej warunku
Instrukcja warunkowa w C++ if ( warunek ) instrukcja_do_wykonania //(może być złożona) ------------------------------------------------------------------------ if ( warunek ) instrukcja_do_wykonania_1 else instrukcja_do_wykonania_2 //(może być złożona) //(może być złożona) ---------------------------------------------------------------------- if ( warunek1 ) instrukcja_do_wykonania1 else if ( warunek2 ) instrukcja_do_wykonania_2... else instrukcje_do_wykonania_n //(może być złożona) //(może być złożona) //(może być złożona)
Pierwszy rodzaj i przykład if ( warunek ) instrukcja_do_wykonania na przykład:... int a; cout << " podaj liczbe : "; cin >> a; if ( a >0 ) cout << " podales liczbe dodatnia ";
Drugi rodzaj i przykład if ( warunek ) instrukcja_do_wykonania_1 else instrukcja_do_wykonania_2 na przykład:... int a; cout << " podaj liczbe : "; cin >> a; if ( a >0 ) cout << " podales liczbe dodatnia "; else cout << " podales liczbe niedodatnia ";
Trzeci rodzaj i przykład if ( warunek1 ) instrukcja_do_wykonania1 else if ( warunek2 ) instrukcja_do_wykonania_2... else instrukcje_do_wykonania_n na przykład:... int a; cout << " podaj liczbe : "; cin >> a; if ( a >0 ) cout << " podales liczbe dodatnia "; else if ( a <0 ) cout << " podales liczbe ujemna "; else cout << " podales zero ";
Co to jest instrukcja złożona Instrukcja złożona składa się z nawiasu klamrowego otwierającego, dowolnych instrukcji (mogą być również kolejne zagnieżdżone instrukcje złożone) i nawiasu klamrowego zamykającego. Za nawiasem zamykającym nie stawia się średnika. Konstrukcje taką stosuje się wszędzie tam, gdzie składnia języka przewiduje jedną instrukcję, a chcemy wykonać więcej niż jedną instrukcję.
Instrukcja złożona - przykład użycia... int a; cout << " podaj liczbe : "; cin >> a; if ( a >0 ) { cout << " podales liczbe dodatnia " << endl ; cout << " pierwiastek z tej liczby wynosi " << sqrt (a) << endl ; }
Jak skonstruować warunek Operatory porównywania Liczby (i nie tylko) możemy ze sobą porównywać. Operatory porównywania to < > <= >= ==!= gdzie == oznacza równe, a!= oznacza różne Wyrażenie zawierające operator porównywania jest wyrażeniem logicznym - ma wartość prawdy lub fałszu (true lub false)
Operatory logiczne Operatory logiczne pozwalają powiązać kilka wyrażeń logicznych w jedno wyrażenie. Dostępne operatory to: &&! && - koniunkcja. Wyrażenie w1 && w2 jest prawdziwe gdy w1 i w2 są prawdziwe. Przy obliczaniu wartości koniunkcji najpierw oblicza się wartość w1, jeśli jest fałszywe to w2 nie jest sprawdzane - alternatywa. Wyrażenie w1 w2 jest prawdziwe gdy przynajmniej jedno z wyrażeń w1, w2 jest prawdziwe. Przy obliczaniu wartości alternatywy najpierw oblicza się wartość w1, jeśli jest prawdziwe to w2 nie jest sprawdzane! - negacja. Wyrażenie!w1 jest prawdziwe gdy w1 jest fałszywe
Operatory logiczne - cd Kolejność wykonywania operacji logicznych: 1 negacja 2 operacje koniunkcji 3 operacje alternatywy Operacje o jednakowym priorytecie wykonywane są od lewej do prawej strony wyrażenia Kolejnością operacji w wyrażeniu można manipulować za pomocą nawiasów ( )
Typ logiczny W C++ dostępny jest typ logiczny bool. Zbiór wartości tego typu to false i true.
Typ logiczny W C++ dostępny jest typ logiczny bool. Zbiór wartości tego typu to false i true.... jak widać każde wyrażenie logiczne ma wartość tego typu.
Typ logiczny W C++ dostępny jest typ logiczny bool. Zbiór wartości tego typu to false i true.... jak widać każde wyrażenie logiczne ma wartość tego typu. Na wartościach typu logicznego można wykonywać omówione wcześniej operacje logiczne
... bool q = true ; bool p = false ; cout << " q = " << q << " p = " <<p << endl ; // wypisze 1 i 0 cout << boolalpha << q << " " << p; // wypisze true i false wartości logiczne mają odpowiedniki liczbowe (false - zero, true - jeden) przy czym dowolna wartość niezerowa skonwertowana do wartości typu bool daje true manipulatory boolalpha i noboolalpha przełączają między wypisywaniem wartości logicznych w postaci słownej i liczbowej
Pułapki ;-) int x =3; cout << ( x ==2) << endl ; // wypisze 0 ( falsz ) cout << ( x ==3) << endl ; // wypisze 1 ( prawda ) cout << ( x =2) << endl ; // wypisze 2 cout << ( x =0) << endl ; // wypisze 0 cout << ( x = -2) << endl ; // wypisze -2 bool a = (x ==2) ; bool b = (x =2) ; cout << a << endl ; // wypisze 0 ( falsz ) cout << b << endl ; // wypisze 1 ( prawda ) operacja przypisania zwraca wartość równą przypisywanej wartości przypisanie użyte jako warunek ma wartość logiczną będącą wynikiem konwersji w/w wartości do bool