wykład 2 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017
Liczby Korzystanie z liczn C++ zna różne rodzaje liczb (różne typy liczbowe) i potrafi wykonywać na nich różne operacje arytmetyczne.
Podstawowe działania na liczbach całkowitych # include < iostream > using namespace std ; int main () { cout << " 20 + 2 = " << 20+2 << endl ; cout << " 20-2 = " << 20-2 << endl ; cout << " 20 * 2 = " << 20*2 << endl ; cout << " 20 / 2 = " << 20/2 << endl ; cout << " 20 / 3 = " << 20/3 << endl ; cout << " 20 % 2 = " << 20%2 << endl ; cout << " 20 % 3 = " << 20%3 << endl ; } return 0; użyte operatory arytmetyczne: + - dodawanie, - odejmowanie, - mnożenie, / - dzielenie, % - modulo (reszta z dzielenia)
Podstawowe działania na liczbachrzeczywistych Liczby rzeczywiste zapisujemy z kropką dziesiętną (przecinek zamiast kropki nie jest dozwolony!!) # include < iostream > using namespace std ; int main () { cout << " 20 + 2.0 = " << 20+2.0 << endl ; cout << " 20-2.0 = " << 20-2.0 << endl ; cout << " 20 * 2.0 = " << 20*2.0 << endl ; cout << " 20 / 2.0 = " << 20/2.0 << endl ; cout << " 20 / 2.1 = " << 20/2.1 << endl ; } return 0; operatory arytmetyczne: + - dodawanie, - odejmowanie, - mnożenie, / - dzielenie (nie ma operatora modulo!)
Dzielenie dzielenie dwóch liczb całkowitych daje wynik będący liczbą całkowitą (wykonywane jest dzielenie całkowite - 20/2 daje 10, 20/3 daje 6) jeśli przynajmniej jedna z liczb jest rzeczywista, wynik jest liczbą rzeczywistą
Dzielenie dzielenie dwóch liczb całkowitych daje wynik będący liczbą całkowitą (wykonywane jest dzielenie całkowite - 20/2 daje 10, 20/3 daje 6) jeśli przynajmniej jedna z liczb jest rzeczywista, wynik jest liczbą rzeczywistą... zatem jeśli chcemy uzyskać poprawny wynik dzielenia, musimy przynajmniej jedną z liczb zapisać z kropką dziesiętną (możliwe zapisy: 20.0/3 albo 20/3.0 albo 20.0/3.0)
Literały Literały są rodzajem stałych (wyrażeń o ustalonej, niezmiennej wartości). Umożliwiają umieszczenie w kodzie źródłowym programu konkretnych wartości (liczb, znaków, napisów), reprezentujac je za pomocą odpowiedniej notacji. Literały numeryczne reprezentują wartości liczbowe. Wyróżniamy literały całkowite reprezentujące wartości całkowite oraz literały zmiennoprzecinkowe (ang. floating-point literals) reprezentujące wartości rzeczywiste.
Literały całkowite liczby dziesiętne: 12, -12, 1234 liczby ósemkowe (system o podstawie 8): 012, -012 (cyfry liczby są poprzedzone zerem) liczby szesnastkowe (system o podstawie 16): 0xab, 0x12, -0X12, -0XAB (cyfry liczby są poprzedzone znakami 0x albo 0X, cyfry w tym systemie to 0..9, a..f) liczby binarne (system o podstawie 2) - zapis dozwolony od standardu C++14: 0B001, -0b1111 (cyfry liczby poprzedzone są znakami 0b albo 0B)
Literały całkowite - cd Domyślnym typem literałów całkowitych nie mających przyrostka specyfikującego typ jest int. Przyrostki umożliwiające przypisanie literału całkowitego do innego typu liczbowego to: (o typach za chwilę) u lub U typ unsigned int l lub L typ long int ll lub LL typ long long int (przyrostki można [odpowiednio] łączyć - np. ul oznacza unsigned long int. Przykłady: 75l, 75ul, 75LL).
Literały rzeczywiste Reprezentują liczby rzeczywiste, z kropką dziesiętną i/lub wykładnikiem. notacja standardowa : 12.3, -4.5 notacja naukowa (wykładncza) : -3.3e5, 4.6E-2
Literały rzeczywiste Reprezentują liczby rzeczywiste, z kropką dziesiętną i/lub wykładnikiem. notacja standardowa : 12.3, -4.5 notacja naukowa (wykładncza) : -3.3e5, 4.6E-2 domyślnym typem literałów rzeczywistych jest double. Przyrostki umożliwiające przyisanie literału rzeczywistego do innego typu rzeczywistego: f lub F typ float l lub L typ long double
Typy liczbowe W języku zdefiniowane są pewne (tzw. predefiniowane) typy liczbowe. Podstawowe to: int, short int, long int, long long int służące do reprezentowania liczb całkowitych; każdy z nich może być ze znakiem (signed, domyślnie) lub bez znaku (unsigned). Przykład: unsigned short int - typ krótki całkowity bez znaku (dozwolone jest używanie skróconych nazw typów: short, long, long long ) float, double i long double służące do reprezentowania liczb rzeczywistych
Zakresy typów Wartości danego typu T reprezentowane są w pamięci komputera przy użyciu pewnej, ustalonej dla danego typu, liczby bitów (jako ciągi zer i jedynek). Z tego powodu każdy typ ma swój zakres - istnieje w nim wartość najmniejsza i największa
Wyświetlenie zakresu typu int # include < iostream > # include < limits > using namespace std ; int main () { cout << " zakres int : od " << std :: numeric_limits < int >:: min () << " do " << std :: numeric_limits < int >:: max () << endl ; cout << " rozmiar wartosci typu int w bajtach : " << sizeof ( int ) << endl ; } return 0; Zakresy innych typów liczbowych można uzyskać w podobny sposób
Zmienne Aby móc zapamiętać (przechować) w pamięci komputera wprowadzoną z klawiatury albo wyliczoną w programie wartość pewnego typu, musimy zdefiniować zmienną tego typu (ang variable) w tym celu piszemy typ zmiennej nazwa zmiennej ; (e.g., int a; ) nazwy zmiennych muszą być indentyfikatorami (nie będącymi słowami kluczowymi) wynik: w odpowiednim momencie uruchamiania programu w pamięci zostaje zarezerwowany pewien obszar o rozmiarze odpowiednim dla przechowania wartości danego typu. Odwołujemy się do niego przez nazwę zmiennej.
Zmienne Aby móc zapamiętać (przechować) w pamięci komputera wprowadzoną z klawiatury albo wyliczoną w programie wartość pewnego typu, musimy zdefiniować zmienną tego typu (ang variable) w tym celu piszemy typ zmiennej nazwa zmiennej ; (e.g., int a; ) nazwy zmiennych muszą być indentyfikatorami (nie będącymi słowami kluczowymi) wynik: w odpowiednim momencie uruchamiania programu w pamięci zostaje zarezerwowany pewien obszar o rozmiarze odpowiednim dla przechowania wartości danego typu. Odwołujemy się do niego przez nazwę zmiennej. można zdefiniować naraz kilka zmiennych tego samego typu: int a,b,c;
Definicja a deklaracja deklaracja informuje kompilator że dana nazwa jest już znana, ale nie powoduje alokacji (rezerwacji) pamięci (przykład: extern int a; - informuje że zmienna a jest zdefiniowana w innym pliku będącym częścią programu) definicja określa dokładnie czym jest dany identyfikator. Zdefiniowanie zmiennej skutkuje zarezerwowaniem pamięci dla tej zmiennej Każda definicja jest deklaracją, ale nie każda deklaracja jest definicją.
Przypisanie Wartość zmiennej może ulegać zmianie w trakcie działania programu Operator przypisania (=) pozwala nadać zmiennej pewną wartość
Przypisanie Wartość zmiennej może ulegać zmianie w trakcie działania programu Operator przypisania (=) pozwala nadać zmiennej pewną wartość przypisywana wartość musi oczywiście mieścić się z zakresie typu do którego należy zmenna zmienna, której nie przypisano w programie żadnej wartości, ma wartość przypadkową
Przykład (Użycie instrukcji przypisania) deklaracje zmiennych: int a,b,i; i = 2; a = 2+2; b = a+i; weź wartość zmiennej a, dodaj do niej wartość zmiennej i, otrzymany wynik przypisz zmiennej b a = a + 5; weż wartość zmiennej a, dodaj do niej 5, otrzymany wynik przypisz z powrotem zmiennej a
Przykład użycia zmiennych # include < iostream > using namespace std ; int main () { int a; int b,c; a =3; b =6; c = a+b; cout << " a = " << a << endl ; cout << " b = " << b << endl ; cout << " a + b = " << c << endl ; } return 0;
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;