algorytmy i podstawy programowania - gagolewski · 2017. 2. 1. · 3.algorytmy i struktury danych...

31
MAREK G , AGOLEWSKI INSTYTUT BADA ´ N SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ Algorytmy i podstawy programowania Materialy dydaktyczne dla student´ ow matematyki na Wydziale Matematyki i Nauk Informacyjnych Politechniki Warszawskiej Ostatnia aktualizacja: 1 pa´ zdziernika 2016 r. Copyright © 2010–2016 Marek G , agolewski This work is licensed under a Creative Commons Attribution 3.0 Unported License.

Upload: others

Post on 28-Feb-2021

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

MAREK G ↪AGOLEWSKIINSTYTUT BADAN SYSTEMOWYCH PAN

WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ

Algorytmyi podstawy programowania

2. Podstawy organizacji i dzia lania komputerow.Zmienne w j ↪ezyku C++ i ich typy. Operatory

Materia ly dydaktyczne dla studentow matematykina Wydziale Matematyki i Nauk Informacyjnych Politechniki Warszawskiej

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Copyright © 2010–2016 Marek G ↪agolewskiThis work is licensed under a Creative Commons Attribution 3.0 Unported License.

Page 2: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

SPIS TRESCI 0

Spis tresci

2.1. Zarys historii informatyki . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12.1.1. G lowne kierunki badan w informatyce wspo lczesnej . . . . . . . . . . 3

2.2. Organizacja wspo lczesnych komputerow . . . . . . . . . . . . . . . . . . . . 52.3. Zmienne w j ↪ezyku C++ i ich typy . . . . . . . . . . . . . . . . . . . . . . . 6

2.3.1. Poj ↪ecie zmiennej . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.2. Typy liczbowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.3.3. Identyfikatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3.4. Deklaracja zmiennych . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.5. Operator przypisania . . . . . . . . . . . . . . . . . . . . . . . . . . . 122.3.6. Rzutowanie (konwersja) typow. Hierarchia typow . . . . . . . . . . . 13

2.4. Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4.1. Operatory arytmetyczne . . . . . . . . . . . . . . . . . . . . . . . . . 142.4.2. Operatory relacyjne . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4.3. Operatory logiczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.4.4. Operatory bitowe ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.4.5. Operatory l ↪aczone . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.4.6. Priorytety operatorow . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2.5. Reprezentacja liczb ca lkowitych ? . . . . . . . . . . . . . . . . . . . . . . . . 192.5.1. System dziesi ↪etny ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5.2. System dwojkowy ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.5.3. System szesnastkowy ? . . . . . . . . . . . . . . . . . . . . . . . . . . 222.5.4. System U2 reprezentacji liczb ze znakiem ? . . . . . . . . . . . . . . 23

2.6. Cwiczenia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.7. Wskazowki i odpowiedzi do cwiczen . . . . . . . . . . . . . . . . . . . . . . 27

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 3: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.1. ZARYS HISTORII INFORMATYKI 1

2.1. Zarys historii informatyki

Historia informatyki nieod l ↪acznie zwi ↪azana jest z histori ↪a matematyki, a w szczegolnoscizagadnieniem zapisu liczb i rachunkami. Najwazniejszym powodem powstania komputerowby lo, jak latwo si ↪e domyslic, wspomaganie wykonywania zmudnych obliczen.

Oto wybor najistotniejszych wydarzen z dziejow tej dziedziny, ktore pomog ↪a nam rzucicswiat lo na przedmiot naszych zainteresowan.

– Ok. 2400 r. p.n.e. w Babilonii uzywany jest juz kamienny pierwowzor liczyd la, naktorym rysowano piaskiem (specjalisci umiej ↪acy korzystac z tego urz ↪adzenia nie byliliczni). Podobne przyrz ↪ady w Grecji i Rzymie pojawi ly si ↪e dopiero ok. V-IV w. p.n.e.Tzw. abaki, z lobione w drewnie, pozwala ly dokonywac obliczen w systemie dziesi ↪et-nym.

– Ok. V w. p.n.e. indyjski uczony Panini sformalizowa l teoretyczne regu ly gramatykisanskrytu. Mozna ten fakt uwazac za pierwsze badanie teoretyczne w dziedzinielingwistyki.

– Pierwszy algorytm przypisywany jest Euklidesowi (ok. 400-300 r. p.n.e.). Ten staro-zytny uczony opisa l operacje, ktorych wykonanie krok po kroku pozwala wyznaczycnajwi ↪ekszy wspolny dzielnik dwoch liczb (por. zestaw zadan nr 1).

– Matematyk arabski Al Kwarizmi (IX w.) okresla regu ly podstawowych operacji aryt-metycznych dla liczb dziesi ↪etnych. Od jego nazwiska pochodzi ponoc poj ↪ecie algo-rytmu.

– W epoce baroku dokonuje si ↪e ”obliczeniowy prze lom”. W 1614 r. John Napier, szkocki

teolog i matematyk, znalaz l zastosowanie logarytmow do wykonywania szybkich ope-Mamy bowiem

xy = elog x+log y .racji mnozenia (zast ↪api l je dodawaniem). W roku 1622 William Oughtred stworzy lsuwak logarytmiczny , ktory jeszcze bardziej u latwi l wykonywanie obliczen.

– W. Schickard (1623 r.) oraz B. Pascal (1645 r.) tworz ↪a pierwsze mechaniczne suma-tory . Ciekawe, czy korzysta l z nich Isaac Newton (1643–1727)?

Zadanie

Zastanow si ↪e przez chwil ↪e, do czego moze byc przydatna umiej ↪etnosc szybkiego wykonywaniaoperacji arytmetycznych. W jakich dziedzinach zycia czy nauki moze si ↪e przydac?

– Jacques Jacquard (ok. 1801 r.) skonstruowa l krosno tkackie sterowane dziurkowanymikartami. By lo to pierwsze programowalne urz ↪adzenie w dziejach techniki. Podobnyideowo sposob dzia lania mia ly pianole (po l. XIX w.), czyli automatycznie sterowanepianina.

– Ok. 1837–1839 r. Charles Babbage opisa l wymyslon ↪a przez siebie”maszyn ↪e ana-

lityczn ↪a” (parow ↪a!), programowalne urz ↪adzenie do wykonywania obliczen. By la tojednak tylko koncepcja teoretyczna: nigdy nie uda lo si ↪e jej zbudowac. Pomagaj ↪aca

Pierwszym programist ↪aby la kobieta!mu Ada Lovelace moze byc uznana za pierwszego programist ↪e.

– H. Hollerith konstruuje w 1890 r. maszyn ↪e zorientowan ↪a na przetwarzanie duzej iloscidanych, ktora wspomaga podsumowywanie wynikow spisu powszechnego w USA.

– Niemiecki inzynier w 1918 r. patentuje maszyn ↪e szyfruj ↪ac ↪a Enigma. Na marginesie,jej kod lamie polski matematyk Marian Rejewski w 1932 r., co przyczyni si ↪e pozniejdo sukcesu aliantow w drugiej Wojnie Swiatowej.

– W 1936 r. Alan Turing i Alonzo Church definiuj ↪a formalnie algorytm jako ci ↪ag in-strukcji matematycznych. Okreslaj ↪a dzi ↪eki temu to, co daje si ↪e policzyc. Kleenestawia pozniej tzw. hipotez ↪e Churcha-Turinga.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 4: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.1. ZARYS HISTORII INFORMATYKI 2

Informacja

Hipoteza Churcha-Turinga mowi o tym, ze jesli dla jakiegos problemu istnieje efek-tywny algorytm korzystaj ↪acy z nieograniczonych zasobow, to da si ↪e go wykonac napewnym prostym, abstrakcyjnym modelu komputera:

Kazdy problem, ktory moze byc intuicyjnie uznany za obliczalny, jest roz-wi ↪azywalny przez maszyn ↪e Turinga.

Tutaj jednak pojawia si ↪e problem: co moze byc uznane za”intuicyjnie obliczalne” —

zagadnienie to do dzis nie jest rozstrzygni ↪ete w sposob satysfakcjonuj ↪acy.

– Claude E. Shannon w swojej pracy magisterskiej w 1937 r. opisuje mozliwosc uzyciaelektronicznych prze l ↪acznikow do wykonywania operacji logicznych (implementacjaalgebry Boole’a). Jego praca teoretyczna staje si ↪e podstaw ↪a konstrukcji wszystkichwspo lczesnych komputerow elektronicznych.

– W latach 40’ XX w. w Wielkiej Brytanii, USA i Niemczech powstaj ↪a pierwsze kom-putery elektroniczne, np. Z1, Z3, Colossus, Mark I, ENIAC (zob. rys. 2.1), EDVAC,EDSAC. Pobieraj ↪a bardzo duze ilosci energii elektrycznej i potrzebuj ↪a duzych prze-strzeni. Np. ENIAC mia l mas ↪e ponad 27 ton, zawiera l oko lo 18 000 lamp elektro-nowych i zajmowa l powierzchni ↪e ok. 140 m2. By ly bardzo wolne (jak na dzisiejszestandardy), np. Z3 wykonywa l jedno mnozenie w 3 sekundy. Pierwsze zastosowaniaby ly stricte militarne: lamanie szyfrow i obliczanie trajektorii lotow balistycznych.

– W 1947 r. Grace Hopper odkrywa pierwszego robaka (ang. bug) komputerowegow komputerze Harvard Mark II — dos lownie!

– W mi ↪edzyczasie okazuje si ↪e, ze komputery nie musz ↪a byc wykorzystywane tylko w ce-lach przyspieszania obliczen. Powstaj ↪a teoretyczne podstawy informatyki (np. Tu-ring, von Neumann). Zapocz ↪atkowywane s ↪a nowe kierunki badawcze, m.in. sztucznainteligencja (np. s lynny test Turinga sprawdzaj ↪acy

”inteligencj ↪e” maszyny).

– Pierwszy kompilator j ↪ezyka Fortran zostaje stworzony w 1957 r. Kompilator j ↪ezykaLISP powstaje rok pozniej. Wczesniej programowano komputery w tzw. j ↪ezyku ma-szynowym, bardzo trudnym do zrozumienia dla cz lowieka.

– Informatyka staje si ↪e dyscyplin ↪a akademick ↪a dopiero w latach szescdziesi ↪atych XX w.(wytyczne programowe ACM). Pierwszy wydzia l informatyki powsta l na Uniwer-sytecie Purdue w 1962 r. Pierwszy doktorat w tej dziedzinie zosta l obroniony juzw 1965 r.

– W 1969 r. nast ↪epuje pierwsze po l ↪aczenie sieciowe pomi ↪edzy komputerami w ramachprojektu ARPAnet (prekursora Internetu). Pocz ↪atkowo ma ono miec g lownie zasto-sowanie (znowu!) wojskowe.

– Dalej rozwoj nast ↪epuje bardzo szybko: powstaj ↪a bardzo wazne algorytmy (np. wy-szukiwanie najkrotszych sciezek w grafie Dijkstry, sortowanie szybkie Hoara itp.),teoria relacyjnych baz danych, okienkowe wielozadaniowe systemy operacyjne, nowej ↪ezyki programowania, systemy rozproszone i wiele, wiele innych. . .

– Wspo lczesnie komputer osobisty (o mocy kilka miliardow razy wi ↪ekszej niz ENIAC)pod l ↪aczony do ogolnoswiatowej sieci Internet znajdziemy w prawie kazdym domu,a elementy informatyki wyk ladane s ↪a juz w szko lach podstawowych.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 5: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.1. ZARYS HISTORII INFORMATYKI 3

Rys. 2.1. Komputer ENIAC

Zadanie

Zastanow si ↪e, jak wygl ↪ada l swiat 30–50 lat temu. A jak 100 lat temu. W jaki sposob ludziekomunikowali si ↪e ze sob ↪a. W jaki sposob sp ↪edzali czas wolny.

Tak przyzwyczailismy si ↪e do wszechobecnych komputerow, ze wiele osob nie potrafi sobiewyobrazic bez nich zycia.

Wielu najznakomitszych informatykow XX wieku by lo z wykszta lcenia matematykami.Informatyka teoretyczna by la pocz ↪atkowo poddzia lem matematyki stosowanej. Z czasemdopiero sta la si ↪e niezalezn ↪a dyscyplin ↪a akademick ↪a. Nie oznacza to oczywiscie, ze obszarybadan obu dziedzin s ↪a roz l ↪aczne.

Zapami↪etaj

Wielu matematykow zajmuje si ↪e informatyk ↪a, a wielu informatykow — matematyk ↪a!Bardzo p lodnym z punktu widzenia nauki jest obszar na styku obydwu dziedzin. Jesliplanujesz w przysz losci karier ↪e naukowca czy analityka danych moze to b ↪edzie i Twojadroga. Jesli nie, tym bardziej dostrzezesz za kilka lat, ze bez komputera po prostu nieb ↪edziesz mog l (mog la) wykonywac swojej pracy.

2.1.1. G lowne kierunki badan w informatyce wspo lczesnej

Mozna pokusic si ↪e o nast ↪epuj ↪ac ↪a klasyfikacj ↪e g lownych kierunkow badan w informatyce1:

1. Matematyczne podstawy informatyki

(a) Kryptografia (kodowanie informacji niejawnej)

1Por. www.newworldencyclopedia.org/entry/Computer science.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 6: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.1. ZARYS HISTORII INFORMATYKI 4

(b) Teoria grafow (np. algorytmy znajdywania najkrotszych sciezek, algorytmy ko-lorowania grafow)

(c) Logika (w tym logika wielowartosciowa, logika rozmyta)(d) Teoria typow (analiza formalna typow danych, m.in. badane s ↪a efekty zwi ↪azane

z bezpieczenstwem programow)

2. Teoria obliczen

(a) Teoria automatow (analiza abstrakcyjnych maszyn i problemow, ktore moznaz ich pomoc ↪a rozwi ↪azac)

(b) Teoria obliczalnosci (co jest obliczalne?)(c) Teoria z lozonosci obliczeniowej (ktore problemy s ↪a ”

latwo” rozwi ↪azywalne?)

3. Algorytmy i struktury danych

(a) Analiza algorytmow (ze wzgl ↪edu na czas dzia lania i potrzebne zasoby)(b) Projektowanie algorytmow(c) Struktury danych (organizacja informacji)(d) Algorytmy genetyczne (znajdywanie rozwi ↪azan przyblizonych problemow opty-

malizacyjnych)

4. J ↪ezyki programowania i kompilatory

(a) Kompilatory (budowa i optymalizacja programow przetwarzaj ↪acych kod w da-nym j ↪ezyku na kod maszynowy)

(b) J ↪ezyki programowania (formalne paradygmaty j ↪ezykow, w lasnosci j ↪ezykow)

5. Bazy danych

(a) Teoria baz danych (m.in. systemy relacyjne, obiektowe)(b) Data mining (wydobywanie wiedzy z baz danych)

6. Systemy rownoleg le i rozproszone

(a) Systemy rownoleg le (bada wykonywanie jednoczesnych obliczen przez wiele pro-cesorow)

(b) Systemy rozproszone (rozwi ↪azywanie tego samego problemu z uzyciem wielukomputerow po l ↪aczonych w siec)

(c) Sieci komputerowe (algorytmy i protoko ly zapewniaj ↪ace niezawodny przesy ldanych pomi ↪edzy komputerami)

7. Architektura komputerow

(a) Architektura komputerow (projektowanie, organizacja komputerow, takze z pun-ktu widzenia elektroniki)

(b) Systemy operacyjne (systemy zarz ↪adzaj ↪ace zasobami komputera i pozwalaj ↪aceuruchamiac inne programy)

8. Inzynieria oprogramowania

(a) Metody formalne (np. automatyczne testowanie programow)(b) Inzynieria (zasady tworzenia dobrych programow, zasady organizacji procesu

analizy, projektowania, implementacji i testowania programow)

9. Sztuczna inteligencja

(a) Sztuczna inteligencja (systemy, ktore wydaj ↪a si ↪e cechowac inteligencj ↪a)(b) Automatyczne wnioskowanie (imitacja zdolnosci samodzielnego rozumowania)(c) Robotyka (projektowanie i konstrukcja robotow i algorytmow nimi steruj ↪acych)

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 7: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.2. ORGANIZACJA WSPO LCZESNYCH KOMPUTEROW 5

(d) Uczenie si ↪e maszynowe (tworzenie zestawow regu l w oparciu o informacje wej-sciowe)

10. Grafika komputerowa

(a) Podstawy grafiki komputerowej (algorytmy generowania i filtrowania obrazow)(b) Przetwarzanie obrazow (wydobywanie informacji z obrazow)(c) Interakcja cz lowiek-komputer (zagadnienia tzw. interfejsow s luz ↪acych do komu-

nikacji z komputerem)

Do tej listy mozna tez dopisac wiele dziedzin z tzw. pogranicza matematyki i informa-tyki, np. bioinformatyk ↪e, statystyk ↪e obliczeniow ↪a, analiz ↪e danych, uczenie si ↪e maszynowe,zbiory rozmyte itd.

Zapami↪etaj

Zauwaz, ze w trakcie studiow mniej lub bardziej dok ladnie zapoznasz si ↪e z zagadnie-niami z p. 1–5. Pami ↪etaj o tym.

Na koniec tego paragrafu warto zwrocic uwag ↪e (choc zdania na ten temat s ↪a podzie-lone), ze to, co w j ↪ezyku polskim okreslamy mianem informatyki czy tez nauk informacyj-nych, jest przez wielu uznawane za poj ↪ecie szersze od angielskiego computer science, czylinauk o komputerach. Informatyka jest wi ↪ec ogolnym przedmiotem dociekan dotycz ↪acychprzetwarzania informacji, w tym rowniez przy uzyciu urz ↪adzen elektronicznych.

Informacja

Informatyka jest nauk ↪a o komputerach w takim stopniu jak astronomia — nauk ↪a o te-leskopach. (Dijkstra)

2.2. Organizacja wspo lczesnych komputerow

Jak zd ↪azylismy nadmienic, podstawy teoretyczne dzia lania wspo lczesnych komputerowelektronicznych zawarte zosta ly w pracy C. Shannona (1937 r.). Komputery, na na naj-nizszym mozliwym poziomie abstrakcji, mog ↪a byc pojmowane jako zestaw odpowiedniosterowanych prze l ↪acznikow , tzw. bitow (ang. binary digits).

Zapami↪etaj

Kazdy prze l ↪acznik moze znajdowac si ↪e w jednym z dwoch stanow (rys. 2.2):

– pr ↪ad nie p lynie (co oznaczamy jako 0),– pr ↪ad p lynie (co oznaczamy przez 1).

Co wazne, informacje, ktore przetwarza komputer (por. rozdz. 1 — okreslilismy je jakoci ↪agi liczb lub symboli) zawsze reprezentowane s ↪a przez ci ↪agi zer i jedynek. Tylko tyle

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 8: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 6

i az tyle. W niniejszym rozdziale dowiemy si ↪e m.in. w jaki sposob za ich pomoc ↪a mozemyzapisywac liczby ca lkowite, rzeczywiste, a kiedy indziej — znaki drukowane (np. literyalfabetu, tzw. kod ASCII).

0

1

Rys. 2.2. Dwa stany prze l ↪acznikow

Na wspo lczesny komputer osobisty (PC, od ang. personal computer) sk ladaj ↪a si ↪e nast ↪epu-j ↪ace elementy:

1. jednostka obliczeniowa (CPU, od ang. central processing unit):

– jednostki arytmetyczno-logiczne (ALU , ang. arithmetic and logical units),

– jednostka do obliczen zmiennopozycyjnych (FPU , ang. floating point unit),

– uk lady steruj ↪ace (CU , ang. control units),

– rejestry (akumulatory), pe lni ↪ace funkcj ↪e pami ↪eci podr ↪ecznej;

2. pami ↪ec RAM (od ang. random access memory) — zawiera dane i program,

3. urz ↪adzenia wejsciowe (ang. input devices),

4. urz ↪adzenia wyjsciowe (ang. output devices).

Jest to tzw. architektura von Neumanna (por. rys. 2.3). Najwazniejsz ↪a jej cech ↪a jest to,ze w pami ↪eci operacyjnej znajduj ↪a si ↪e zarowno instrukcje programow, jak i dane (wszystkozapisane za pomoc ↪a tylko zer i jedynek). To od kontekstu zalezy, jak powinny byc oneinterpretowane przez komputer.

RAM

CUFPU ALUCPU

IN OUT

Rys. 2.3. Architektura wspo lczesnych komputerow osobistych

2.3. Zmienne w j↪ezyku C++ i ich typy

2.3.1. Poj↪ecie zmiennej

Czytaj ↪ac pseudokody algorytmow z pierwszego zestawu zadan, kilka razy napotykalismyinstrukcj ↪e podobn ↪a do nast ↪epuj ↪acej.

niech x ∈ R;

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 9: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 7

Tym samym mielismy na mysli:”niech od tej pory x b ↪edzie zmienn ↪a ze zbioru liczb rzeczy-

wistych”. Formalnie, dokonalismy tym samym deklaracji zmiennej (ang. variable declara-tion) typu rzeczywistego. Dzi ↪eki temu moglismy uzyc x np. do obliczenia wartosci pewnegopodwyrazenia w skomplikowanym wzorze tak, by rozwi ↪azanie uczynic czytelniejszym.

Zapami↪etaj

Zmienna s luzy do przechowywania w pami ↪eci RAM komputera (lub, w przypadkupseudokodu, czyms, co pami ↪ec komputera reprezentuje) dowolnych wartosci z pew-nego ustalonego zbioru (dziedziny), zwanego typem zmiennej.

2.3.2. Typy liczbowe

Jako ze kazda zmienna musi miec okreslon ↪a dziedzin ↪e, omowmy wpierw typy zmiennychliczbowych dost ↪epne w j ↪ezyku C++. B ↪ed ↪a to:

1. typy ca lkowite, reprezentuj ↪ace odpowiednie podzbiory Z,2. typy zmiennoprzecinkowe, reprezentuj ↪ace pewne podzbiory R oraz3. typ logiczny.

2.3.2.1. Typy ca lkowite

Do typow ca lkowitych zaliczamy:

Nazwa typu Zakres Liczba bitow1

char {−128,−127, . . . , 127} 8short {−32 768,−32 767, . . . , 32 767} 16int {−2 147 483 648, . . . , 2 147 483 647} 32long long {∼ −9× 1018, . . . ,∼ 9× 1018} 64

Do reprezentacji liczb ca lkowitych b ↪edziemy korzystac z typu int. W 32-bitowych sys-temach operacyjnych typ ten pozwala zapisywac liczby rz ↪edu ± 2 miliardow. W systemach64-bitowych (zalezy to ponadto od wersji kompilatora) typ ten byc moze pozwoli na re-prezentacj ↪e liczb z zakresu ± 9 trylionow.

Ciekawostka

Typ int reprezentuje najcz ↪esciej co najmniej 32-bitow ↪a (64-bitow ↪a w niektorych systemachoperacyjnych i wersjach kompilatora) liczb ↪e ca lkowit ↪a w systemie U2 (ze znakiem). Czytelni-kow zainteresowanych reprezentacj ↪a liczb odsy lamy do rozdz. 2.5.

Zapami↪etaj

Zauwazmy, ze typy zmiennych nie reprezentuj ↪a ca lego zbioru liczb ca lkowitych Z,a jedynie ich podzbior. Ich zakres jest jednak na tyle duzy, ze wystarcza do wi ↪ekszoscizastosowan praktycznych.

1Podana liczba bitow dotyczy Microsoft Visual C++ dzia laj ↪acym w srodowisku 32 bitowym, zob. rozdz.2.5.4.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 10: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 8

Ciekawostka

Do kazdego z wyzej wymienionych typow mozemy zastosowac modyfikator unsigned — otrzy-mujemy liczb ↪e nieujemn ↪a (bez znaku), np.

unsigned int = {0, 1, . . . , 4,294,967,295} ⊂ N0.

W codziennej praktyce jednak nie uzywa si ↪e go zbyt cz ↪esto.

Informacja

Sta le ca lkowite, np. 0, −5, 15210 s ↪a reprezentantami typu int danymi w postaci dzie-si ↪etnej, czyli takiej, do ktorej jestesmy przyzwyczajeni.

Oprocz tego mozna uzywac sta lych w innych systemach liczbowych (zob. rozdz.2.5) np. postaci szesnastkowej, poprzedzaj ↪ac liczby przedrostkiem 0x, np. 0x53a353czy tez 0xabcdef, oraz osemkowej, korzystaj ↪ac z przedrostka 0, np. 0777. Nie ma,

niestety, mozliwosci definiowania bezposrednio sta lych w postaci dwojkowej.

Zapami↪etaj

010 oraz 10 oznaczaj ↪a dwie rozne liczby! Pierwsza z nich to liczba rowna osiem (no-tacja osemkowa), a druga — dziesi ↪ec (notacja dziesi ↪etna).

2.3.2.2. Typy zmiennoprzecinkowe

Do typow zmiennoprzecinkowych zaliczamy:

Nazwa typu Zakres (przyblizony) Liczba bitow

float ⊆ [−1038, 1038] 32double ⊆ [−10308, 10308] 64

Do reprezentacji liczb rzeczywistych b ↪edziemy uzywac najcz ↪esciej typu double.

Informacja

Sta le zmiennoprzecinkowe wprowadzamy podaj ↪ac zawsze cz ↪esc dziesi ↪etn ↪a i cz ↪escu lamkow ↪a rozdzielon ↪a kropk ↪a (nawet gdy cz ↪esc u lamkowa jest rowna 0), np. 3.14159,1.0 albo −0.000001. Domyslnie sta le te nalez ↪a do typu double.

Dodatkowo, liczby takie mozna wprowadzac w formie notacji naukowej, uzywaj ↪acdo tego celu separatora e, ktory oznacza

”razy dziesi ↪ec do pot ↪egi”. I tak liczba −2.32

e−4 jest sta l ↪a o wartosci −2,32× 10−4.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 11: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 9

Dok ladne omowienie zagadnienia reprezentacji i arytmetyki liczb zmiennoprzecinko-wych wykracza poza ramy naszego wyk ladu. Wi ↪ecej szczego low, w tym rachunek b l ↪edowarytmetyki tych liczb, przedstawiony b ↪edzie na wyk ladzie z metod numerycznych.

Zainteresowanym osobom mozna polecic nast ↪epuj ↪acy angielskoj ↪ezyczny artyku l (o bar-dzo sugestywnym tytule): D. Goldberg, What Every Computer Scientist Should KnowAbout Floating-Point Arithmetic, ACM Computing Surveys 21(1), 1991, 5–48; zob.www.ibspan.waw.pl/∼gagolews/Teaching/aipp/priv/Czytelnia/Goldberg1991.pdf.

Zapami↪etaj

Warto miec na uwadze zawsze problemy zwi ↪azane z uzyciem liczb zmiennoprzecinko-wych.

1. Nie da si ↪e reprezentowac ca lego zbioru liczb rzeczywistych, a tylko jego pod-zbior (w lasciwie jest to tylko podzbior liczb wymiernych!). Wszystkie liczby s ↪azaokr ↪aglane do najblizszej reprezentowalnej.

2. Arytmetyka zmiennoprzecinkowa nie spe lnia w pewnych przypadkach w lasnosci l ↪acznosci i rozdzielnosci.

Ich konsekwencje b ↪edziemy badac wielokrotnie podczas zaj ↪ec laboratoryjnych.

Informacja

W standardzie IEEE-754, ktory jest stosowany w komputerach typu PC, okreslonezosta ly wartosci specjalne, ktore mog ↪a byc przyjmowane przez zmienne typu zmien-noprzecinkowego:

– ∞ (Inf, ang. infinity),– −∞ (-Inf),– nie-liczba (NaN, ang. not a number).

Np. 1/0 = Inf, 0/0 = NaN.

2.3.2.3. Typ logiczny

Dost ↪epny jest takze typ bool, s luz ↪acy do reprezentowania zbioru wartosci logicznych.

Informacja

Zmienna typu logicznego moze znajdywac si ↪e w dwoch stanach, okreslonych przezsta le logiczne true (prawda) oraz false (fa lsz).

2.3.3. Identyfikatory

Mamy dwie mozliwosci uzycia zmiennej: mozemy przypisac jej pewn ↪a wartosc (jednocze-snie

”kasuj ↪ac” wartosc poprzedni ↪a) b ↪adz przechowywan ↪a wen wartosc odczytac. Kazda

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 12: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 10

zmienna musi miec swoj identyfikator, to jest jednoznaczn ↪a nazw ↪e uzywan ↪a po to, bymozna si ↪e by lo do niej odwo lac. Identyfikatory mog ↪a sk ladac si ↪e z nast ↪epuj ↪acych znakow:

a b c d e f g h i j k l m n o p q r s t u v w x y zA B C D E F G H I J K L M N O P Q R S T U V W X Y Z _oraz z ponizszych, pod warunkiem, ze nie s ↪a one pierwszym znakiem identyfikatora:

0 1 2 3 4 5 6 7 8 9Wobec tego przyk ladami poprawnych identyfikatorow s ↪a: i, suma, wyrazenieZeWzoru3,

_2m1a oraz zmienna_pomocnicza1. Zgodnie jednak z podan ↪a regu l ↪a np. 3523aaa, ala ma kotaoraz :−) nie mog ↪a byc identyfikatorami.

Identyfikatorami nie mog ↪a byc tez zarezerwowane s lowa kluczowe j ↪ezyka C++ (np. int,if). Z tego powodu wyrozniamy je w niniejszym skrypcie pogrubion ↪a czcionk ↪a.

Zapami↪etaj

W j ↪ezyku C++ wielkosc liter ma znaczenie!

Dla przyk ladu, T oraz t to identyfikatory dwoch roznych zmiennych. Dalej, np. iden-tyfikator Int (poprawny!) nie jest tozsamy z int (s lowo kluczowe).

Informacja

Dobr ↪a praktyk ↪a jest nadawanie zmiennym takich nazw, by”same si ↪e objasnia ly”.

Dzi ↪eki temu czytaj ↪ac kod programu b ↪edzie nam latwiej dowiedziec si ↪e, do czego danazmienna jest uzywana.

Zmienne poleKwadratu, delta, wspolczynnikX w pewnych kontekstach posiadaj ↪a wyzejwymienion ↪a cech ↪e. Cz ↪esto uzywamy tez identyfikatorow i, j, k jako licznikow w p ↪etlach.Z drugiej strony, np. zmienne dupa albo ratunku niezbyt jasno mowi ↪a czytelnikowi, doczego mog ↪a s luzyc.

2.3.4. Deklaracja zmiennych

Dzi ↪eki zmiennym pisane przez nas programy (ale takze np. twierdzenia matematyczne) nieopisuj ↪a jednego, szczegolnego przypadku pewnego interesuj ↪acego nas problemu (np. roz-wi ↪azania konkretnego uk ladu dwoch rownan liniowych), lecz wszystkie mozliwe w danymkontekscie (np. rozwi ↪azania dowolnego uk ladu dwoch rownan liniowych). Taki mechanizmdaje wi ↪ec nam mozliwosc uogolniania (abstrakcji) algorytmow.

Oto prosty przyk lad. Ci ↪ag twierdzen:

Twierdzenie 1. Pole ko la o promieniu 1 wynosi π.

Twierdzenie 2. Pole ko la o promieniu 2 wynosi 4π.

Twierdzenie 3. . . .

przez kazdego matematyka (a nawet przysz lego matematyka) by lby uznany, lagodnie rzeczujmuj ↪ac, za nieudany zart. Jednakze uogolnienie powyzszych wynikow przez odwo lanie si ↪edo pewnej, wczesniej zadeklarowanej zmiennej sprawia, ze wynik staje si ↪e interesuj ↪acy.

Twierdzenie 4. Niech r ∈ R+. Pole ko la o promieniu r wynosi πr2.

Zauwazmy, ze w matematyce zdanie deklaruj ↪ace zmienn ↪a ”niech r ∈ R+” nie musi si ↪e

pojawiac w takiej w lasnie formie. Wi ↪ekszosc naukowcow podchodzi do tego, rzecz jasna,w sposob elastyczny. Mimo to, pisz ↪ac np.

”pole ko la o promieniu r > 0 wynosi πr2” b ↪adz

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 13: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 11

nawet”pole ko la o promieniu r wynosi πr2”, domyslamy si ↪e, ze chodzi w lasnie o powyzsz ↪a

konstrukcj ↪e (czyli za lozenie, ze r jest liczb ↪a rzeczywist ↪a dodatni ↪a). Wiemy juz jednakz pierwszego wyk ladu, ze komputery nie s ↪a tak domyslne jak my.

Zapami↪etaj

W j ↪ezyku C++ wszystkie zmienne musz ↪a zostac zadeklarowane przed ich pierwszymuzyciem.

Aby zadeklarowac zmienn ↪a, nalezy napisac w kodzie programu odpowiedni ↪a instrukcj ↪eo scisle okreslonej sk ladni.

Informacja

Instrukcja (ang. statement) jest podstawowym sk ladnikiem pisanego programu. Dzi ↪ekiniej mozemy nakazac komputerowi wykonac pewn ↪a ustalon ↪a czynnosc (byc moze bar-dzo z lozon ↪a), ktorej znaczenie jest scisle okreslone przez regu ly semantyczne j ↪ezykaprogramowania.

Odpowiednikiem instrukcji w j ↪ezyku polskim jest w pewnym sensie zdanie rozkazuj ↪ace.Na przyk lad

”wynies smieci!”,

”zacznij si ↪e wreszcie uczyc AiPP!” s ↪a dobrymi instrukcjami.

Z drugiej strony zdanie”Jasiu, zle mi, zrob cos!” instrukcj ↪a nie jest, poniewaz nie ma scisle

okreslonego znaczenia (semantyki).

Sk ladnia instrukcji deklaruj ↪acej zmienn ↪a lokaln ↪a w j ↪ezyku C++ (ang. local variabledeclaration statement), czyli np. takiej, ktor ↪a mozemy umiescic w funkcji main(), jestnast ↪epuj ↪aca:

Type Variable declarator

,

;

gdzie Type to typ zmiennej (np. int b ↪adz double), a Variable declarator to tzw. deklaratorzmiennej. Jest on postaci:

Identifier

= Expression

Tutaj Identifier oznacza identyfikator zmiennej, a Expression jest pewnym wyrazeniem.Wi ↪ecej o wyrazeniach dowiemy si ↪e za chwil ↪e. Na razie wystarczy nam wiedziec, ze wy-razeniem moze byc po prostu sta la ca lkowita b ↪adz zmiennoprzecinkowa albo tez pewnaoperacja arytmetyczna.

Zapami↪etaj

Prawie wszystkie instrukcje w j ↪ezyku C++ musz ↪a byc zakonczone srednikiem!

Oto kilka przyk ladow instrukcji deklaruj ↪acych zmienne:

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 14: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 12

1 int x; // n i e c h x b ↪e d z i e z m i e n n ↪a c a l k o w i t ↪a2 bool p = false ; /∗ n i e c h p b ↪e d z i e w a r t o s c i ↪a l o g i c z n ↪a3 u s t a w i o n ↪a ( na p o c z ↪a t k u ) na PRAWDA ∗/4 int y=10;5 double a, b; // n i e c h a i b b ↪ed ↪a z m i e n n y m i t y p u d o u b l e6 int u = y+10, v = −y;

Informacja

Tekst drukowany kursyw ↪a i szar ↪a czcionk ↪a to komentarze. Komentarze s ↪a albo zawartemi ↪edzy znakami /* i */ (i wtedy mog ↪a zajmowac wiele wierszy kodu), albo nast ↪epuj ↪apo znakach // (i wtedy si ↪egaj ↪a do konca aktualnego wiersza).

Tresc komentarzy jest ignorowana przez kompilator i nie ma wp lywu na wykonanieprogramu. Jednakze opisywanie tworzonego kodu jest bardzo dobrym nawykiem, bosprawia, ze jest on bardziej zrozumia ly dla jego czytelnika.

2.3.5. Operator przypisania

Deklaracja zmiennej powoduje przydzielenie jej pewnego miejsca w pami ↪eci RAM kompu-tera (poznamy to zagadnienie bardzo dok ladnie na wyk ladzie o wskaznikach).

Informacja

Zmienna nie jest inicjowana automatycznie. Dopoki nie przypiszemy jej jawnie jakiejswartosci, b ↪edzie przechowywac

”smieci”. Proba odczytania wartosci niezainicjowanej

zmiennej moze (lecz nie musi, jest to zalezne od kompilatora) skutkowac nag lymzakonczeniem uruchomionego programu.

Operator przypisania (ang. assignment operator), s luzy do nadania zmiennej okreslonejwartosci. Sk ladni ↪e instrukcji, ktora go wykorzystuje, obrazuje ponizszy diagram:

Identifier = Expression ;

Co wazne, najpierw obliczana jest wartosc wyrazenia Expression. Dopiero po tym wy-nik wpisywany jest do zmiennej o nazwie Identifier.

Przesledzmy ponizszy kod.

1 int i, j; // d e k l a r a c j a dwoch z m i e n n y c h ( n i e z a i n i c j o w a n y c h )2 i = 4; // p r z y p i s a n i e i w a r t o s c i 4 , c z y t a j : i s t a j e s i ↪e 43 j = i; /∗ p r z y p i s a n i e j w a r t o s c i t a k i e j ,4 j a k ↪a a k t u a l n i e p r z e c h o w u j e z m i e n n a i ∗/5 cout << j; // w y p i s z e na e k r a n ”4 ”

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 15: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.3. ZMIENNE W J ↪EZYKU C++ I ICH TYPY 13

Informacja

Obiekt o nazwie cout umozliwia wypisywanie wartosci zmiennych roznych typow naekran monitora (a dok ladnie, na tzw. standardowe wyjscie). Wartosc wyrazenia (po-wyzej: wartosc przechowywan ↪a w zmiennej j)

”wysy la” si ↪e na ekran za pomoc ↪a ope-

ratora <<.

Inny sposob przypisywania wartosci zmiennym, dzi ↪eki ktoremu wartosci nie musz ↪a bycz gory ustalane podczas pisania programu, zapewnia obiekt cin i operator >>. Korzystaj ↪acz nich mozemy poprosic uzytkownika juz podczas dzia lania napisanego przez nas pro-gramu o podanie za pomoc ↪a klawiatury konkretnych wartosci, ktore maj ↪a byc przypisaneokreslonym zmiennym.

Przyk lad:

1 int x;2 cout << "Podaj wartość x: ";3 cin >> x; /∗ w c z y t a n i e w a r t o s c i x z tzw . s t a n d a r d o w e g o w e j s c i a4 ( d o m y s l n i e j e s t t o k l a w i a t u r a k o m p u t e r a ) ∗/5 cout << "Teraz x=" << x << endl;

Ciekawostka

Przy okazji omawiania operatora przypisania, warto wspomniec o mozliwosci definiowaniasta lych symbolicznych, wed lug sk ladni:

const Type Identifier = Expr. ;

Przy tworzeniu sta lej symbolicznej nalezy od razu przypisac jej wartosc. Cech ↪a zasadnicz ↪asta lych jest to, ze po ich zainicjowaniu nie mozna wcale zmieniac ich wartosci. Ich stosowaniemoze zmniejszac prawdopodobienstwo omy lek programisty.

Przyk lady:

1 const int dlugoscCiagu = 10;2 const double pi = 3.14159;3 const double G = 6.67428e−11; /∗ t o samo , co 6,67428 · 10−11 . ∗/4 pi = 4.3623; // b l ↪a d − p i j e s t ” t y l k o do o d c z y t u ”

2.3.6. Rzutowanie (konwersja) typow. Hierarchia typow

Zastanowmy si ↪e, co si ↪e stanie, jesli zechcemy przypisac zmiennej jednego typu wartoscinnego typu.

1 double x; // d e k l a r a c j a z m i e n n e j n i e z a i n i c j o w a n e j t y p u d o u b l e2 int i = 4, j; /∗ d e k l a r a c j a dwoch z m i e n n y c h t y p u i n t ,3 z m i e n n a i z o s t a n i e z a i n i c j o w a n a w a r t o s c i ↪a 4 ,4 z m i e n n a j j e s t n i e z a i n i c j o w a n a ∗/5

6 x = i; /∗ i n n y t y p ! n i e j a w n a k o n w e r s j a na 4 . 0 ,7 tzw . p r o m o c j a − OK ∗/8

9 x = 3.14159;10

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 16: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.4. OPERATORY 14

11 j = x; // b l ↪a d ! ( t y p d o c e l o w y j e s t ”m n i e j po jemny ”)12 j = (int)x; // j a w n a k o n w e r s j a ( tzw . r z u t o w a n i e ) − t e r a z OK13

14 cout << j << ", " << x; // w y p i s z e na e k r a n ”3 , 3 . 1 4 1 5 9 ”

Przypisanie wartosci typu double do zmiennej typu int zakonczy si ↪e b l ↪edem kompilacji.Jest to spowodowane tym, ze w wyniku dzia lania takiej instrukcji mog laby wyst ↪apic utratainformacji. W j ↪ezyku C++ obowi ↪azuje nast ↪epuj ↪aca hierarchia typow :

typ logiczny︷ ︸︸ ︷bool ⊂

typy ca lkowite︷ ︸︸ ︷char ⊂ short ⊂ int ⊂ long long b

typy zmiennoprzecinkowe︷ ︸︸ ︷float ⊂ double .

Promocja typu, czyli konwersja na typ silniejszy, bardziej”pojemny”, odbywa si ↪e au-

tomatycznie. Dlatego w powyzszym kodzie instrukcja x=i; wykona si ↪e poprawnie.Z drugiej strony, rzutowanie do s labszego typu musi byc zawsze jawne. Nalezy explicite

oznajmic kompilatorowi, ze post ↪epujemy swiadomie. S luzy do tego tzw. operator rzuto-wania. Taki operator umieszczamy przed rzutowanym wyrazeniem. Oprocz zastosowanejw powyzszym przyk ladzie sk ladni (typ)wyrażenie, dost ↪epne s ↪a dodatkowo dwie rowno-wazne: typ(wyrażenie) oraz static_cast<typ>(wyrażenie).

Zapami↪etaj

W przypadku rzutowania zmiennej typu zmiennoprzecinkowego do ca lkowitoliczbo-wego nast ↪epuje obci ↪ecie cz ↪esci u lamkowej, np. (int)3.14 da w wyniku 3, a (int)−3.14zas — wartosc −3.

Z kolei dla konwersji do typu bool, wartosc rowna 0 da zawsze wynik false, arozna od 0 b ↪edzie przekszta lcona na true.

Przy konwersji typu bool do ca lkowitoliczbowego wartosc true zostaje zamienionazawsze na 1, a false na 0.

2.4. Operatory

2.4.1. Operatory arytmetyczne

Operatory arytmetyczne mog ↪a bys stosowane (poza wyszczegolnionymi wyj ↪atkami) nawartosciach typu ca lkowitego i zmiennoprzecinkowego. Operatory binarne (czyli dwuargu-mentowe) prezentujemy w ponizszej tabeli.

Operator Znaczenie

+ dodawanie− odejmowanie∗ mnozenie/ dzielenie rzeczywiste b ↪adz ca lkowite% reszta z dzielenia (tylko liczby ca lkowite)

Informacja

Zauwazmy, ze w j ↪ezyku C++ nie ma okreslonego operatora pot ↪egowania.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 17: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.4. OPERATORY 15

Zastosowanie operatorow do argumentow dwoch roznych typow powoduje konwersj ↪eoperandu o typie s labszym do typu silniejszego.

Przyk lady:

1 cout << 2+2 << endl;2 cout << 3.0/2.0 << endl;3 cout << 3/2 << endl;4 cout << 7%4 << endl;5 cout << 1/0.0 << endl; // u z g o d n i e n i e typow : t o samo , co 1 . 0 / 0 . 0

Wynikiem wykonania powyzszych instrukcji b ↪edzie:

41.51 (dlaczego?)3Inf

Oprocz operatorow arytmetycznych binarnych mamy tez dost ↪ep do kilku operatorowunarnych, czyli jednoargumentowych.

Operator Znaczenie

+ unarny plus (nic nie robi)− unarny minus (zmiana znaku na przeciwny)++ inkrementacja (przedrostkowy i przyrostkowy)−− dekrementacja (przedrostkowy i przyrostkowy)

Przyk lad:

1 int i = −4; // zmiana znaku s t a l e j 42 i = −i; // zmiana znaku z m i e n n e j i3 cout << i; // w y n i k : 4

Operator inkrementacji (++) s luzy do zwi ↪ekszania wartosci zmiennej o 1, a operatordekrementacji (−−) zmniejszania o 1. Stosuje si ↪e je najcz ↪esciej na zmiennych typu ca lko-witego. Operatory te wyst ↪epuj ↪a w dwoch wariantach: przedrostkowym (ang. prefix ) orazprzyrostkowym (ang. suffix ).

W przypadku operatora inkrementacji/dekrementacji przedrostkowego, wartosci ↪a ca- lego wyrazenia jest wartosc zmiennej po wykonaniu operacji (operator ten dzia la tak, jakbynajpierw aktualizowa l stan zmiennej, a potem zwraca l swoj ↪a wartosc w wyniku). Z koleidla operatora przyrostkowego wartosci ↪a wyrazenia jest stan zmiennej sprzed zmiany (naj-pierw zwraca wartosc zmiennej, potem aktualizuje jej stan).

Zadanie

Przeanalizuj nast ↪epuj ↪acy przyk ladu.

1 int i = 5, j = 9;2

3 −−j; // w y n i k : j ==8, t o samo t o j = j −1;4 j−−; // j ==7, t o samo t o j = j −1;5

6 j = ++i; // w y n i k : i ==6, j ==6 ( p r z e d r o s t k o w y ) ( ∗ )7 j = i++; // j ==6, i ==7 ( p r z y r o s t k o w y ) ( ∗ )8

9 j = ++100; // b l ↪a d , 100 j e s t s t a l ↪a

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 18: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.4. OPERATORY 16

Podsumowuj ↪ac, j = ++i; mozna zapisac jako dwie instrukcje: i = i+1; j = i; Z dru-giej strony, j = i++; jest rownowazne operacjom: j = i; i = i+1;

Niew ↪atpliw ↪a zalet ↪a tych dwoch operatorow jest mozliwosc napisania zwi ↪ez lego frag-mentu kodu. Niestety, jak widac, odbywa si ↪e to kosztem czytelnosci. Nie polecamy zatemstosowac ich w przypadkach takich jak te oznaczone gwiazdk ↪a w powyzszym przyk ladzie.

2.4.2. Operatory relacyjne

Operatory relacyjne s luz ↪a do porownywania dwoch wartosci. S ↪a to wi ↪ec operatory binarne.Wynikiem porownania jest zawsze wartosc typu bool.

Operator Znaczenie

== czy rowne?!= czy rozne?< czy mniejsze?<= czy nie wi ↪eksze?> czy wi ↪eksze?>= czy nie mniejsze?

Zapami↪etaj

Cz ↪esto pope lnianym b l ↪edem jest omy lkowe uzycie operatora przypisania (=) w miejscu,w ktorym powinien wyst ↪apic operator porownania (==).

Przyk lady:

1 bool w1 = 1==1; // t r u e2 int w2 = 2 >=3; // 0 , c z y l i ( i n t ) f a l s e3 bool w3 = (0.0 == (((1 e34 + 1e−34) − 1e34) − 1e−34)); // f a l s e !4 // Uwaga na p o r o w n y w a n i e l i c z b z m i e n n o p r z e c i n k o w y c h − b l ↪e d y !

2.4.3. Operatory logiczne

Operatory logiczne s luz ↪a do przeprowadzania dzia lan na wyrazeniach typu bool (lub ta-kich, ktore s ↪a sprowadzalne do bool). W wyniku ich dzia lania otrzymujemy wartosc lo-giczn ↪a.

Operator Znaczenie

! negacja (unarny)|| alternatywa (lub)&& koniunkcja (i)

Mamy, co nast ↪epuje:

!false truetrue false

|| false true

false false truetrue true true

&& false true

false false falsetrue false true

Kilka przyk ladow:

1 bool w1 = (! true); // f a l s e2 bool w2 = (1<2 || 0<1); // t r u e −> ( t r u e | | f a l s e )3 bool w3 = (1.0 && 0.0); // f a l s e −> ( t r u e && f a l s e )

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 19: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.4. OPERATORY 17

Ciekawostka

Okazuje si ↪e, ze komputery s ↪a czasem leniwe. W przypadku wyrazen sk ladaj ↪acych si ↪e z wielupodwyrazen logicznych, obliczane jest tylko to, co jest potrzebne do ustalenia wyniku. I takw przypadku koniunkcji, jesli pierwszy argument ma wartosc false, to wyznaczanie wartoscidrugiego jest niepotrzebne. Podobnie jest dla alternatywy i pierwszego argumentu o wartoscitrue. Na przyk lad:

1 int a = 0;2 bool p = (true || (++a==0)); // l e n i w y3 cout << a; // a==04 bool q = (true && (++a==0)); // t u t a j j u z mus i p o l i c z y c5 cout << a; // a==1

Zwrocmy jednak uwag ↪e, ze czytelnosc takiego kodu pozostawia wiele do zyczenia. Mimo toniektorzy programisci lubi ↪a stosowac rozne

”sztuczki j ↪ezyka C++” w swoich programach.

Dopoki dobrze nie opanujemy j ↪ezyka, starajmy si ↪e powstrzymac od tego typu skrotowcow.

2.4.4. Operatory bitowe ?

Operatory bitowe dzia laj ↪a na poszczegolnych bitach liczb ca lkowitych (por. rozdz. 2.5).Zwracany wynik jest tez liczb ↪a ca lkowit ↪a.

Operator Znaczenie

~ bitowa negacja (unarny)| bitowa alternatywa& bitowa koniunkcja^ bitowa alternatywa wy l ↪aczaj ↪aca (albo, ang. exclusive-or)

<< k przesuni ↪ecie w lewo o k bitow (ang. shift-left)>> k przesuni ↪ecie w prawo o k bitow (ang. shift-right)

Operator bitowej negacji zamienia kazdy bit liczby na przeciwny. Operatory bitowejalternatywy, koniunkcji i alternatywy wy l ↪aczaj ↪acej zestawiaj ↪a bity na odpowiadaj ↪acychsobie pozycjach dwoch operandow wed lug nast ↪epuj ↪acych regu l.

~0 11 0

| 0 1

0 0 11 1 1

& 0 1

0 0 01 0 1

^ 0 1

0 0 11 1 0

Np. 0xb6 ^ 0x5f == 0xe9, gdyz1 0 1 1 0 1 1 0

^ 0 1 0 1 1 1 1 1

1 1 1 0 1 0 0 1

Zapami↪etaj

Nie nalezy mylic operatorow ~ (ktory w notacji matematycznej oznacza czasem lo-giczn ↪a negacj ↪e) i ! (ktory oznacza logiczn ↪a negacj ↪e w C++).

Operatory przesuni ↪ecia zmieniaj ↪a pozycje bitow w liczbie. Bity, ktore nie”mieszcz ↪a

si ↪e” w danym typie s ↪a tracone. W przypadku operatora <<, na zwalnianych pozycjach

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 20: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.4. OPERATORY 18

wstawiane s ↪a zera. Operator >> wstawia zas na zwalnianych pozycjach bit znaku (por.rozdz. 2.5.4). Dla przyk ladu, dokonajmy przesuni ↪ecia bitow liczby 8 bitowej o 3 pozycjew lewo.

10101011 101

wynik︷ ︸︸ ︷01011000

0xab << 3 == 0x58

Oto kolejne przyk lady:

1 int p1 = 1 | 2; // 3 , bo 00000001 | 00000010 −> 000000112 int p2 = ~0 xf0; // 1 5 , bo ˜11110000 −> 000011113 int p3 = 0xb ^ 5; // 1 4 , bo 00001011 ˆ 000000101−> 000011104 int p4 = 5 << 2; // 2 0 , bo 00000101 << 2 −> 000101005 int p5 = 7 >> 1; // 3 , bo 00000111 >> 1 −> 000000116 int p6 = −128 >> 4; // −8, bo 10000000 >> 4 −> 11111000

Ciekawostka

Operacja n<<k rownowazna jest (o ile nie nast ↪api przepe lnienie) n×2k, a n>>k jest rownowazna

ca lkowitoliczbowej operacji n× 2-k (k krotne dzielenie ca lkowite przez 2).

Informacja

Zauwazmy, ze operatory << i >> maj ↪a inne znaczenie w przypadku uzycia ich naobiektach, odpowiednio, cout i cin. Jest to praktyczny przyk lad zastosowania tzw.przeci ↪azania operatorow, czyli roznicowania ich znaczenia w zaleznosci od kontekstu.Wi ↪ecej na ten temat dowiemy si ↪e podczas wyk ladu z Programowania obiektowego naII semestrze.

2.4.5. Operatory l↪

aczone

Dla skrocenia zapisu zosta ly tez wprowadzone tzw. operatory l ↪aczone, ktore w zwi ↪ez lysposob l ↪acz ↪a operacje arytmetyczne i przypisanie:

+=, −=, ∗=, /=, %=.

Np. x += 10; znaczy to samo, co x = x + 10;

Ciekawostka

W analogiczny sposob mozna tez l ↪aczyc operatory bitowe.

2.4.6. Priorytety operatorow

Zaobserwowalismy, ze w jednym wyrazeniu mozna uzywac wielu operatorow. Kolejnoscwykonywania dzia lan jest jednak scisle okreslona. Domyslnie wyrazenia obliczane s ↪a we-d lug priorytetow, zestawionych w kolejnosci od najwi ↪ekszego do najmniejszego w tab. 2.1.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 21: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 19

Dla przyk ladu, zapis 1+2∗0 test tozsamy z 1+(2∗0), poniewaz operacja mnozenia ma wyz-szy priorytet niz dodawanie. Co wazne, w przypadku operatorow o tym samym priorytecie,operacje wykonywane s ↪a w kolejnosci od lewej do prawej, np. 4∗3/2 oznacza to samo, co(4∗3)/2.

Zapami↪etaj

W przypadku jakiejkolwiek w ↪atpliwosci co do priorytetu stosowanych operacji, okre-slon ↪a kolejnosc dzia lan mozemy zawsze wymusic za pomoc ↪a nawiasow okr ↪ag lych (. . . ).

Tab. 2.1. Priorytety operatorow

13 ++, −− (przyrostkowe)

12 ++, −− (przedrostkowe), +, − (unarne), !, ~ (?)

11 ∗, /, %10 +, −9 <<, >> (?)

8 <, <=, >, >=7 ==, !=6 & (?)

5 ^ (?)

4 | (?)

3 &&2 ||1 =, +=, −=, ∗=, /=, %=

Przyk lady:

1 int p1 = 2+4∗3/2; // p1 = ( 2 + ( ( 4∗3 ) / 2 ) ) ;2 p1 += 2>3 == !true; /∗ p1 += ((2 >3) == ( ! t r u e ) ) ;3 c z y l i t o samo , co p1++;4 d o s k o n a l y p r z y k l a d na to , j a k n i e p i s a c ! ∗/5 cout << p1; // 9

2.5. Reprezentacja liczb ca lkowitych ?

Powiedzielismy wczesniej, ze wszelkie informacje w komputerze reprezentowane s ↪a przezci ↪agi bitow. Zainteresowany Czytelnik z pewnosci ↪a b ↪edzie chcia l si ↪e dowiedziec, w jakisposob zapisywane s ↪a liczby ca lkowite.

Zacznijmy od liczb nieujemnych.

Informacja

Systemy liczbowe mozna podzielic na pozycyjne i addytywne. Oto przyk lady kazdegoz nich.

Pozycyjne systemy liczbowe:

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 22: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 20

1. system dziesi ↪etny (decymalny, indyjsko-arabski) — o podstawie 10,2. system dwojkowy (binarny) — o podstawie 2,3. system szesnastkowy (heksadecymalny) — o podstawie 16,4. . . .

Addytywne systemy liczbowe:

1. system rzymski,2. system szescdziesi ↪atkowy (Mezopotamia).

Tutaj szczegolnie b ↪ed ↪a interesowac nas systemy pozycyjne, w tym uzywany na co dziensystem dziesi ↪etny.

2.5.1. System dziesi↪etny ?

System dziesi ↪etny (decymalny, ang. decimal), przyj ↪ety w Europie zachodniej w XVI w., topozycyjny system liczbowy o podstawie 10. Do zapisu liczb uzywa si ↪e w nim nast ↪epuj ↪acychsymboli (cyfr): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Jako przyk lad rozwazmy liczb ↪e 194510 (przyrostek 10 wskazuje, ze chodzi nam o liczb ↪ew systemie dziesi ↪etnym). Jak w kazdym systemie pozycyjnym istotne jest tu, na ktorejpozycji stoi kazda z cyfr.

1 9 4 5 10= 1 0 0 0+ 9 0 0+ 4 0+ 5

Rownowazne:

1 9 4 5 10= 1 ×1000+ 9 ×100+ 4 ×10+ 5 ×1

Numeracj ↪e pozycji cyfr zaczynamy od 0. Dalej oznaczamy je w kierunku od prawej dolewej, czyli od najmniej do najbardziej znacz ↪acej.

1 9 4 5 10= 1 ×103

+... 9 ×102

+...

... 4 ×101

+...

...... 5 ×100

3 2 1 0

Ogolnie rzecz bior ↪ac, maj ↪ac dan ↪a liczb ↪e n cyfrow ↪a, zapisan ↪a w postaci ci ↪agu cyfr dzie-si ↪etnych bn−1bn−2 . . . b1b0, gdzie bi ∈ {0, 1, . . . , 9} dla i = 0, 1, . . . , n− 1, jej wartosc moznaokreslic za pomoc ↪a wzoru

n−1∑i=0

bi × 10i.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 23: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 21

Liczb ↪e 10 wyst ↪epuj ↪ac ↪a we wzorze nazywamy podstaw ↪a systemu.Jak latwo si ↪e domyslic, mozna okreslic systemy pozycyjne o innych podstawach. Sys-

temy o podstawie 2 i 16 s ↪a najbardziej przydatne z punktu widzenia informatyki.

2.5.2. System dwojkowy ?

Dwojkowy pozycyjny system liczbowy (binarny, ang. binary) to system pozycyjny o pod-stawie 2. Uzywanymi tu symbolami (cyframi) s ↪a tylko 0 oraz 1. Zauwazmy, ze cyfry te maj ↪aw lasnie

”prze l ↪acznikow ↪a” interpretacj ↪e: pr ↪ad nie p lynie/p lynie czy tez prze l ↪acznik wy l ↪aczo-

ny/w l ↪aczony. Zatem n cyfrowa liczba w tym systemie moze opisywac stan n prze l ↪acznikownaraz.

Jako przyk lad rozpatrzmy liczb ↪e 1010012.

1 0 1 0 0 1 2= 1 ×25

+ 0 ×24

+ 1 ×23

+ 0 ×22

+ 0 ×21

+ 1 ×20

1 0 1 0 0 1 2= 1 ×32+ 0 ×16+ 1 ×8+ 0 ×4+ 0 ×2+ 1 ×1

Zatem 1010012 = 3210 + 810 + 110 = 4110. Jest to przyk lad konwersji (zamiany) pod-stawy liczby dwojkowej na dziesi ↪etn ↪a.

Konwersja liczb do systemu dziesi ↪etnego jest stosunkowo prosta. Przyjrzyjmy si ↪e jakprzekszta lcic liczb ↪e dziesi ↪etn ↪a na dwojkow ↪a. Na listingu 2.1 podajemy algorytm, ktorymoze byc wykorzystany w tym celu.

Listing 2.1. Konwersja liczby dziesi ↪etnej na dwojkow ↪a

1 // W e j s c i e : l i c z b a k ∈ N .2 // W y j s c i e : p o s t a c t e j l i c z b y w s y s t e m i e dwojkowym ( k o l e j n e c y f r y

b ↪ed ↪a w y p i s y w a n e na e k r a n w k o l e j n o s c i od l e w e j do p r a w e j ) .3 niech i − największa liczba naturalna taka , że k ­ 2i;4 dopóki (i ­ 0)5 {6 jeśli (k ­ 2i)7 {8 cout << 1;9 k = k − 2i;

10 }11 w_przeciwnym_przypadku12 cout << 0;13

14 i = i− 1;15 }

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 24: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 22

Tab. 2.2. Przyk lad: konwersja liczby 194510 na dwojkow ↪a

k 2i i

1945 20481945 1024 10 1

1945-1024 = 921 512 9 1921-512 = 409 256 8 1409-256 = 153 128 7 1153-128 = 25 64 6 0

25 32 5 025 16 4 1

25-16= 9 8 3 19-8= 1 4 2 0

1 2 1 01 1 0 1

1-1= 0 ↑

Dla przyk ladu, rozwazmy liczb ↪e 194510. Tablica 2.2 opisuje kolejno wszystkie krokipotrzebne do uzyskania wyniku w postaci dwojkowej. Mozemy z niej odczytac, iz 194510 =111100110012.

2.5.3. System szesnastkowy ?

System szesnastkowy (heksadecymalny, ang. hexadecimal) jest systemem pozycyjnymo podstawie 16. Zgodnie z przyj ↪et ↪a konwencj ↪a, uzywanymi symbolami (cyframi) s ↪a:0, 1, . . . , 9, A,B,C,D,E oraz F . Jak widzimy, wykorzystujemy tutaj (z koniecznosci) takzekolejne litery alfabetu, ktore maj ↪a swoj ↪a liczbow ↪a (a w lasciwie cyfrow ↪a) interpretacj ↪e.

Po co taki system, skoro komputer w lasciwie opiera si ↪e na liczbach w systemie binar-nym? Jak mozna zauwazyc, liczba w postaci dwojkowej prezentuje si ↪e na kartce lub naekranie dosyc. . . okazale. Korzystaj ↪ac z faktu, ze 16 = 24, mozemy uzyc jednego sym-bolu w zapisie szesnastkowym zamiast czterech w systemie dwojkowym. Fakt ten sprawiarowniez, ze konwersja z systemu binarnego na heksadecymalny i odwrotnie jest bardzoprosta.

Tablica 2.3 przedstawia cyfry systemu szesnastkowego i ich wartosci w systemie dwoj-kowym oraz dziesi ↪etnym.

Tab. 2.3. Cyfry systemu szesnastkowego i ich wartosci w systemie dwojkowym oraz dziesi ↪etnym

BIN DEC HEX

0000 0 00001 1 10010 2 20011 3 30100 4 40101 5 50110 6 60111 7 7

BIN DEC HEX

1000 8 81001 9 91010 10 A1011 11 B1100 12 C1101 13 D1110 14 E1111 15 F

Zatem na przyk lad 10111102 = 5E16, gdyz grupuj ↪ac kolejne cyfry dwojkowe czworkami,

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 25: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 23

od prawej do lewej, otrzymujemy5︷ ︸︸ ︷

0101E︷ ︸︸ ︷

1110 2.

Podobnie post ↪epujemy dokonuj ↪ac konwersji w przeciwn ↪a stron ↪e, np. 2D16 = 1011012,bowiem

0010︷︸︸︷2

1101︷︸︸︷D 16.

Jak widzimy, dla uproszczenia zapisu pocz ↪atkowe zera mozemy pomijac bez straty zna-czenia (wyj ↪atek w rozdz. 2.5.4!).

Konwersji z i do postaci dziesi ↪etnej mozemy dokonywac za posrednictwem opanowanejjuz przez nas postaci binarnej.

2.5.4. System U2 reprezentacji liczb ze znakiem ?

Interesuj ↪acym jest pytanie, w jaki sposob mozna reprezentowac w komputerze liczby zeznakiem, np. −10012? Jak widzimy, znak jest nowym (trzecim) symbolem, a elektronicznyprze l ↪acznik moze znajdowac si ↪e tylko w dwoch stanach.

Sposrod kilku mozliwosci rozwi ↪azania tego problemu, obecnie w wi ↪ekszosci kompute-row osobistych uzywany jest tzw. kod uzupe lnien do dwoch, czyli kod U2. Niew ↪atpliw ↪ajego dodatkow ↪a zalet ↪a jest to, iz pozwala na bardzo latw ↪a realizacj ↪e operacji dodawaniai odejmowania (zob. cwiczenia).

Zapami↪etaj

W notacji U2 najstarszy (czyli stoj ↪acy po lewej stronie) bit determinuje znak liczby.I tak:

– najstarszy bit rowny 0 oznacza liczb ↪e nieujemn ↪a,– najstarszy bit rowny 1 oznacza liczb ↪e ujemn ↪a.

Jesli dana jest n cyfrowa liczba w systemie U2 postaci bn−1bn−2 . . . b1b0, gdzie bi ∈ {0, 1}dla i = 0, 1, . . . , n− 1, jej wartosc wyznaczamy nast ↪epuj ↪aco:

−bn−1 × 2n−1 +n−2∑i=0

bi × 2i.

Zatem dla liczby n bitowej najstarszy bit mnozymy nie przez 2n−1, lecz przez −2n−1.Dla przyk ladu, 0110U2 = 1102 oraz

1011U2 = −1× 23 + 0× 22 + 1× 21 + 1× 20 = −510 = −1012.

Co wazne, najstarszego bitu rownego 0 nie mozna dowolnie pomijac w zapisie! Mamybowiem 0bn−2 . . . b0U2 6= bn−2 . . . b0U2, gdy bn−2 = 1. Jednakze,

0bn−2 . . . b0U2 = 00 . . . 0bn−2 . . . b0U2.

Z drugiej strony, mozna udowodnic (zob. cwiczenia), ze rowniez

1bn−2 . . . b0U2 = 11 . . . 1bn−2 . . . b0U2.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 26: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.5. REPREZENTACJA LICZB CA LKOWITYCH ? 24

Informacja

Latwo pokazac, ze uzycie k bitow pozwala na zapis liczb −2k−1, . . . , 2k−1 − 1, np.liczby 8 bitowe w systemie U2 mog ↪a miec wartosci od −128 do 127.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 27: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.6. CWICZENIA 25

2.6. Cwiczenia

Zadanie 2.1. Jak ↪a wartosc maj ↪a nast ↪epuj ↪ace liczby dane w notacji naukowej: a) 4.21e6,b) 1.95323e2, c) 2.314e−4, d) 4.235532e−2?

Zadanie 2.2. Wyznacz wartosc nast ↪epuj ↪acych wyrazen. Ponadto, okresl jakiego s ↪a onetypu (int czy double).

1. 10.0+15.0/2+4.3,2. 10.0+15/2+4.3,3. 3.0∗4/6+6,

4. 20.0−2/6+3,5. 10+17∗3+4,6. 10+17/3.0+4,

7. 3∗4%6+6,8. 3.0∗4%6+6,9. 10+17%3+4.

Zadanie 2.3. Dane s ↪a trzy zmienne zadeklarowane i zainicjowane w nast ↪epuj ↪acy sposob.

double a = 10.6 , b = 13.9 , c = −3.42;

Oblicz wartosc ponizszych wyrazen.

1. int(a),2. int(c),

3. int(a+b),4. int(a)+b+c,

5. int(a+b)∗c,6. double(int(a))/c.

Zadanie 2.4. Korzystaj ↪ac z przekszta lcen logicznych (np. praw De Morgana, praw roz-dzielnosci) uprosc nast ↪epuj ↪ace wyrazenia.

1. !(!p),2. !p && !q ,3. !(!p || !q || !r),

4. !(b>a && b<c),5. !(a>=b && b>=c && a

>=c),

6. (a>b && a<c) ||(a<c && a>d),

7. p || !p .

Zak ladamy, ze a,b,c,d s ↪a typu double, a p,q,r typu bool.

Zadanie 2.5. [MD] Napisz w j ↪ezyku C++ funkcj ↪e abs(), ktora obliczy wartosc bez-wzgl ↪edn ↪a danej liczby rzeczywistej.

Zadanie 2.6. [MD] Napisz (w pseudokodzie, w ktorym korzysta si ↪e z poznanych juzoperatorow) funkcj ↪e pierwiastek(), ktora b ↪edzie wyznaczac pierwiastek kwadratowy da-nej liczby rzeczywistej dodatniej x wed lug podanego algorytmu. (Uwaga: zak ladamy, zeepsilon jest ustalon ↪a, ma l ↪a wartosci ↪a, a nie parametrem funkcji).

przyblizenie=1dopóki różnica dwóch ostatnich przybliżeń jest większa niż epsilon

przyblizenie = srednia z przyblizenie oraz x/przyblizeniezwróć przybliżenie

Przesledz dzia lanie algorytmu np. dla x=9 oraz epsilon=1.

Zadanie 2.7. [MD] Wyznacz typ i wartosc nast ↪epuj ↪acych wyrazen:

1. 1+0.5,2. 1.0==1,3. 5/2 - 2.5,4. pierwiastek(4)==2,5. pierwiastek(9)-int(3.5),6. 6/2 + 7/2,7. abs(pierwiastek(9)-3)<1.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 28: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.6. CWICZENIA 26

Reprezentacje liczb ca lkowitych ?

? Zadanie 2.8. Przedstaw nast ↪epuj ↪ace liczby ca lkowite nieujemne w postaci binar-nej, dziesi ↪etnej i szesnastkowej: 1010, 1810, 1816, 1012, 10110, 10116,ABCDEF16, 6413531210,1101011110012,FFFFF0C216.

? Zadanie 2.9. Dana jest n cyfrowa liczba w systemie U2 zapisana jako ci ↪ag cyfrbn−1bn−2 . . . . . . b1b0, gdzie bi ∈ {0, 1} dla i = 0, 1, . . . , n − 1. Pokaz, ze powielenie pierw-szej cyfry dowoln ↪a liczb ↪e razy nie zmienia wartosci danej liczby, tzn. bn−1bn−2 . . . b1b0 =bn−1bn−1 . . . . . . bn−1bn−2 . . . b1b0.

? Zadanie 2.10. Przedstaw nast ↪epuj ↪ace liczby dane w notacji U2 jako liczby dziesi ↪etne:10111100, 00111001, 1000000111001011.

? Zadanie 2.11. Przedstaw nast ↪epuj ↪ace liczby dziesi ↪etne w notacji U2 (do zapisu uzyj 8,16 lub 32 bitow): −12, 54,−128,−129, 53263,−32000,−56321,−3263411.

? Zadanie 2.12. Dana jest wartosc x ∈ N. Napisz wzor matematyczny, ktory opiszenajmniejsz ↪a liczb ↪e cyfr potrzebnych do zapisania wartosci x w systemie a) binarnym,b) dziesi ↪etnym, c) szesnastkowym.

?? Zadanie 2.13. Rozwazmy operacje dodawania i odejmowania liczb nieujemnych w re-prezentacji binarnej. Oblicz wartosc nast ↪epuj ↪acych wyrazen korzystaj ↪ac z metody analo-gicznej do sposobu

”szkolnego” (dodawania i odejmowanie s lupkami). Pami ↪etaj jednak, ze

np. 12 + 12 = 102 (tzw. przeniesienie).

1. 10002 + 1112,2. 10002 + 11112,3. 11101102 + 111001112,

4. 111112 + 111111112,5. 11112 − 00012,6. 10002 − 00012,

7. 101010102 − 111012,8. 110011012 − 100101112.

?? Zadanie 2.14. Okazuje si ↪e, ze liczby w systemie U2 mozna dodawac i odejmowac t ↪asam ↪a metod ↪a, co liczby nieujemne w reprezentacji binarnej. Oblicz wartosc nast ↪epuj ↪acychwyrazen i sprawdz otrzymane wyniki, przekszta lcaj ↪ac je do postaci dziesi ↪etnej. Uwaga:operacji dokonuj na dwoch liczbach n bitowych, a wynik podaj rowniez jako n bitowy.

1. 1000U2 + 0111U2,2. 10110110U2 + 11100111U2,

3. 10101010U2 − 00011101U2,4. 11001101U2 − 10010111U2.

5. 10001101U2 − 01010111U2.

?? Zadanie 2.15. Dana jest liczba w postaci U2. Pokaz, ze aby uzyskac liczb ↪e do niejprzeciwn ↪a, nalezy odwrocic wartosci jej bitow (dokonac ich negacji, tzn. zamienic zera najedynki i odwrotnie) i dodac do wyniku wartosc 1. Ile wynosz ↪a wartosci 0101U2, 1001U2i 0111U2 po dokonaniu tych operacji? Sprawdz uzyskane rezultaty za pomoc ↪a konwersjitych liczb do systemu dziesi ↪etnego.

?? Zadanie 2.16. [SK] Dana jest liczba w postaci binarnej. W jaki sposob za pomoc ↪ajednej operacji logicznej, jednej bitowej oraz jednej arytmetycznej sprawdzic, czy danaliczba jest pot ↪eg ↪a liczby 2.

? Zadanie 2.17. [MD] Napisz algorytm, ktory znajdzie binarn ↪a reprezentacj ↪e dodatniejliczby naturalnej. Wskazowka: jako wynik wypisuj na ekran kolejne cyfry dwojkowe, odnajm lodszej do najstarszej.

? Zadanie 2.18. [MD] Dany jest ci ↪ag n liczb o elementach ze zbioru {0, 1}, ktory reprezen-tuje pewn ↪a liczb ↪e w postaci U2. Wartosci te b ↪ed ↪a wczytywane z klawiatury, w kolejnoscitym razem od najstarszego bitu do najm lodszego. Napisz algorytm, ktory wypisze wartosctej liczby w systemie dziesi ↪etnym.

? Zadanie 2.19. Jaki wynik dadz ↪a ponizsze operacje bitowe dla zmiennych typu short?

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 29: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.7. WSKAZOWKI I ODPOWIEDZI DO CWICZEN 27

1. 0x0FCD | 0xFFFF,2. 364 & 0x323,

3. ~163,4. 0xFC93 ^ 0x201D,

5. 14 << 4,6. 0xf5a3 >> 8.

2.7. Wskazowki i odpowiedzi do cwiczen

Odpowiedz do zadania 2.2.

1. 10.0+15.0/2+4.3 == 21.8 (double).2. 10.0+15/2+4.3 == 21.3 (double).3. 3.0∗4/6+6 == 8.0 (double).4. 20.0−2/6+3 == 23.0 (double).5. 10+17∗3+4 == 65 (int).6. 10+17/3.0+4 ' 19.6667 (double).7. 3∗4%6+6 == 6 (int).8. 3.0∗4%6+6 — b l ↪ad kompilacji.9. 10+17%3+4 == 16 (int).

Odpowiedz do zadania 2.8.

1. 1010 = 10102 = A16.2. 1810 = 100102 = 1216.3. 1816 = 110002 = 2410.4. 1012 = 510 = 516.5. 10110 = 11001012 = 6516.6. 10116 = 1000000012 = 25710.7. ABCDEF16 = 1010101111001101111011112 = 1125937510.8. 6413531210 = 111101001010100000100100002 = 3D2A09016.9. 1101011110012 = D7916 = 344910.

10. FFFFF0C216 = 111111111111111111110000110000102 = 429496339410.

Odpowiedz do zadania 2.10.

1. 10111100U2 = −68.2. 00111001U2 = 5710.3. 1000000111001011U2 = −32309.

Odpowiedz do zadania 2.11.

1. −1210 = 11110100U2.2. 5410 = 00110110U2.3. −12810 = 10000000U2.4. −12910 = 1111111101111111U2.5. 5326310 = 00000000000000001101000000001111U2.6. −3200010 = 11111111111111111000001100000000U2.7. −5632110 = 11111111111111110010001111111111U2.8. −326341110 = 11111111110011100011010001001101U2.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 30: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.7. WSKAZOWKI I ODPOWIEDZI DO CWICZEN 28

Odpowiedz do zadania 2.13.

1. 10002 + 1112 = 11112.2. 10002 + 11112 = 101112.3. 11101102 + 111001112 = 1010111012, gdyz

1 1 1 1 1

1 1 1 0 1 1 0+ 1 1 1 0 0 1 1 1

= 1 0 1 0 1 1 1 0 1

4. 111112 + 111111112 = 1000111102.5. 11112 − 00012 = 11102.6. 10002 − 00012 = 1112.7. 101010102 − 111012 = 100011012, gdyz

-1 -1 -1 -1

1 0 1 0 1 0 1 0- 1 1 1 0 1

= 1 0 0 0 1 1 0 1

8. 110011012 − 100101112 = 1101102, gdyz

-1 -1 -1 -1

1 1 0 0 1 1 0 1- 1 0 0 1 0 1 1 1

= 0 0 1 1 0 1 1 0

Odpowiedz do zadania 2.14.

1. 1000U2 + 0111U2 = 1111U2 = −110 = −810 + 710.2. 10110110U2+11100111U2 = 110011101U2 = 10011101U2 = −9910 = −7410+(−25)10.3. 10101010U2 − 00011101U2 = 10001101U2 = −11510 = −8610 − 2910.4. 11001101U2 − 10010111U2 = 00110110U2 = 5410 = −5110 − (−10510).5. 10001101U2 − 01010111U2 = 00110110U2 = 5410 6= −11510 − 8710 = −20210! Wyst ↪a-

pi lo tzw. przepe lnienie, czyli przekroczenie zakresu wartosci dla liczby 8-bitowej (alemamy 28 − 20210 = 5410). Mozna zapisac operandy na wi ↪ekszej liczbie bitow, np.szesnastu:

1111111110001101U2 − 0000000001010111U2 = 1111111100110110U2 = −20210.

Wskazowka do zadania 2.16.

1 niech x ∈ N;2 zwróć (x & (x − 1)) == 0 jako wynik;

Dlaczego tak jest? Wykaz. �

Odpowiedz do zadania 2.18.

Ostatnia aktualizacja: 1 pazdziernika 2016 r.

Page 31: Algorytmy i podstawy programowania - Gagolewski · 2017. 2. 1. · 3.Algorytmy i struktury danych (a)Analiza algorytm ow (ze wzgledu na czas dzia lania i potrzebne zasoby), (b)Projektowanie

2.7. WSKAZOWKI I ODPOWIEDZI DO CWICZEN 29

1 // W e j s c i e : n > 0 o r a z x[0], x[1], . . . , x[n− 1] ∈ {0, 1}2 // W y j s c i e : w a r t o s c x w s y s t e m i e d z i e s i ↪e t n y m3 niech ret ,pot ∈ N;4

5 ret = 0;6 pot = 1;7 dla (i=1 ,2 ,... ,n−1)8 {9 ret = ret + pot∗x[n−i];

10 pot = pot ∗ 2;11 }12 ret = ret − pot ∗ x[0];13 zwróć ret jako wynik;

Odpowiedz do zadania 2.19.

1. 0x0FCD | 0xFFFF == −1 (0xFFFF).2. 364 & 0x323 == 288 (0x0120).3. ~163 == −164 (0xFF5C) (dlaczego -164?).4. 0xFC93 ^ 0x201D == −9074 (0xDC8E).5. 14 << 4 == 224 (0x00E0).6. 0xf5a3 >> 8 == 0xFFF5 (bit znaku == 1).

Ostatnia aktualizacja: 1 pazdziernika 2016 r.