Spis treści
2.4.1.
3.4.1.
4.1.1. Kodowanie znak-moduł prosty ...............................
4.1.2. Kodowanie odwrotnościowe
4.1.3. Kodowanie uzupełnieniowe
4.1.4.
4.2. Kodowania zmiennopozycyjne
4.2.2. Normalizacja i jednoznaczność
4.2.3. Algorytmy kodowania i dekodowania
4.2.4. Reprezentatywność
4.2.5. Efektywność i optymalizacja
4.2.6. Działania na kodach zmiennopozycyjnych
5.3.1.
5.3.2.
5.3.3. Inkrementacja liczby dziesiętnej
5.3.4. Dekrementacja
5.3.5. Sumowanie
5.3.6.
6. Przykładowa
6.3. Działanie
6.3.1. Interpretacja słowa maszynowego
6.3.2. Rozkazy
6.3.3. Tryby adresowania
6.3.4.
6.4. Realizacja
7. Podstawy algorytmiki
7.1. Wprowadzenie
7.2. Podstawowe
7.2.1. Pojęcie algorytmu ........................................
7.2.2. Wstępne przykłady ........................................
7.2.3.
7.2.4. Podstawienie ............................................
7.2.5. Tablica .................................................
7.3. Zapis algorytmów
7.3.1. Zapis krokowy ...........................................
7.3.2. Schemat blokowy
7.3.3. Strukturalne schematy blokowe ..............................
7.3.4. Zapis liniowy, pseudokod
7.4. Strukturalność .................................................
7.4.1. Generalia
7.4.2. Strukturalny zapis niestrukturalności .........................
7.5. Tworzenie algorytmów
7.6. Złożoność algorytmów ..........................................
7.7. Poprawność algorytmów
7.7.1. Wprowadzenie ...........................................
7.7.2. Podstawy
7.7.3. Częściowa poprawność, niezmienniki pętli .....................
7.7.4. Częściowa poprawność wybranych algorytmów
8. Notacje wyrażeń algebraicznych
8.1. Generalia
8.1.1. Podstawowe pojęcia .......................................
8.1.2. Rodzaje notacji algebraicznych
8.2. Notacje algebraiczne w informatyce ................................
8.3. Konwersje notacji
8.3.1. Stos ....................................................
8.3.2. Sprowadzenie do zapisu liniowego
8.3.3. Zamiana na odwrotną notację polską ..........................
8.3.4. Wartościowanie wyrażeń w
8.4. Zapis algorytmów w ONP........................................
8.4.1. Konwersja zapisu algorytmów do
8.4.2. Odtworzenie algorytmów z zapisu
9. Języki formalne
9.1. Podstawowe pojęcia i oznaczenia ..................................
9.1.1. Przykładowe alfabety ......................................
9.1.2. Przykładowe języki .......................................
9.2. Gramatyka formalna ............................................
9.2.1. Intuicja .................................................
9.2.2. Formalne
9.2.3. Hierarchia Chomsky’ego ...................................
9.2.4. Jeszcze o gramatykach
9.2.5. Gramatyki języków programowania ..........................
3. Systemy liczbowe
3.1. Wprowadzenie
Słowo liczba pochodzi z kategorii słów powszechnie używanych, ale nieoczywistych w formalnej definicji. Matematyka definiuje pojęcie liczby, stosując stosunkowo zaawansowaną wiedzę, nie znajdującą się jednak w zakresie naszych rozważań. Dlatego uznajemy, że pojęcie liczby jest intuicyjnie znane, a ponadto znane są podstawowe rodzaje liczb: naturalne, całkowite, wymierne i rzeczywiste oraz dodatnie, ujemne i liczba zero. Z kolei system liczbowy można określić stosunkowo prosto.
Systemem liczbowym określamy zespół reguł służących stosowaniu liczb, obejmujący nazewnictwo, symbole graficzne oraz reguły łączenia mniejszych elementów w większe.
Nazewnictwo liczb jest domeną języka naturalnego, przyjmujemy je odtąd za znane i ustalone. Jednak z symbolami graficznymi służącymi zapisowi liczb sprawa jest nieco bardziej złożona. Przyzwyczajenie do nazywania znaków zapisu liczb cyframi (dalej zostaną określone bardziej formalnie) jest istotnym uproszczeniem wynikającym z powszechności systemu liczbowego zwanego pozycyjnym (również opisanym szczegółowo dalej), niebyt poprawnie utożsamianego z cyframi arabskim. System pozycyjny nie jest jednak jedynym stosowanym systemem liczbowym. Najpowszechniej znanym systemem niepozycyjnym jest zapis liczb nazywany rzymskim. Na przykładzie rzymskiego zapisu liczb można zarazem zauważyć, że osobne znaki tylko dla liczb nie są powszechne. Większość kultur do zapisu liczb wykorzystuje znaki służące w podstawowej funkcji innym celom – w pismach alfabetycznych są to wybrane litery. Najważniejszym wyróżnikiem systemów liczbowych są szczególne liczby wykorzystywane w swoich wielokrotnościach do przedstawienia większych liczb. Przyzwyczajenie do traktowania w opisany sposób liczby dziesięć jest raczej dziełem przypadku. Ponadto szczególnych liczb wcale nie musi być
3. SYSTEMY LICZBOWE
jedna, ponieważ chociażby w rzymskim zapisie wyjątkową rolę oprócz liczby 10 pełni liczba 5.
Bez względu na nazewnictwo liczb, sposoby zapisu i inne własności systemy liczbowe można podzielić na dwie odrębne kategorie: addytywnych systemów liczbowych i pozycyjnych systemów liczbowych. Systemy addytywne (dodające) zapisują liczby w postaci zbioru znaków (nie ciągu, pozycja nie jest ważna), a wartość liczby jest określana przez sumę użytych symboli. Pierwsze cywilizacje używały najczęściej systemów addytywnych, jednak wraz z postępem wymagającym szybszego liczenia pojawiły się pozycyjne systemy liczbowe. W systemach pozycyjnych liczby przedstawiane są w postaci ciągu pojedynczych znaków (nie zbioru znaków) ze skończonego zbioru (zbioru cyfr), oznaczających pojedyncze liczby. Ciąg cyfr jest koniecznością, ponieważ pozycja cyfry w ciągu oznacza wartość potęgi szczególnej liczby (zwanej podstawą systemu liczbowego) mnożonej przez wartość cyfry i sumowanej dla reprezentacji całej liczby. Powszechnie używany sposób zapisu liczb z dziesięcioznakowym zbiorem cyfr (umownie arabskich) i podstawą systemu wynoszącą 10 jest właśnie przykładem pozycyjnego systemu liczbowego. Podział na systemy liczbowe addytywne oraz pozycyjne nie jest sztywny i znane są systemy mieszane. Przykładem może być system liczbowy starożytnej Mezopotamii z mnożeniem zespołów znaków przez podstawę systemu wynoszącą 60 oraz wspomniany rzymski sposób zapisu liczb nie do końca będący systemem addytywnym. Na przykład liczba 2378 ma w zapisie rzymskim postać MMCCCLXXVIII z wyraźną addytywnością wynikającą z sumy:
1000 + 1000 + 100 + 100 + 100 + 50 + 10 + 10 + 5 + 1 + 1 + 1
Jednak liczba 549 ma w zapisie rzymskim postać CDXLIX, z dwuznakowym sekwencjami CD, XL oraz IX, oznaczającymi nie sumowanie, ale odejmowanie liczby pierwszego znaku od liczby drugiego znaku. Dlatego system rzymski poprawniej należałoby nazywać addytywno-subtraktywnym (dodająco-odejmującym).
Addytywne systemy liczbowe (mimo kilku hobbystyczno/humorystycznych przykładów) nie mają zastosowania w praktycznych komputerach, a powszechność systemów pozycyjnych eliminuje w nazewnictwie słowo pozycyjny, rozróżniając poszczególne systemy przez wartość podstawy. Stąd najpopularniejszy system liczbowy zwany jest prosto systemem dziesiętnym i podobną regułę nazewniczą będziemy odtąd stosowali. Popularność systemu dziesiętnego wynika z anatomii człowieka (dziesięciu palców ludzkich dłoni), ale liczba 10 nie jest jedyną wykorzystywaną przez człowieka podstawą systemu liczbowego.
Początkowo ludzie oznaczali liczby, znacząc najczęściej kreski w ilości równej liczbie (bez żadnych reguł zapisu większych liczb), pierwotne systemy można zatem nazwać jedynkowymi. System jedynkowy mimo swojego prymitywizmu odrodził się w XX wieku w teoretycznych komputerach, a konkretnie w maszynie Turinga (będącej tematem jednego z kolejnych rozdziałów). System dwójkowy omówimy osobno, z racji jego elementarności w zastosowaniach informatycznych, a pewnego rodzaju zaskakującą ciekawostką może być brak przykładu stosowania systemu dwójkowego w jakiejkolwiek znanej wcześniej kulturze. Inaczej jest z systemem trójkowym, stosowanym w islamskim różańcu subha,