Podstawy Programowania
Wykład 1: Wstęp
1. Wykładowca
dr inż. Arkadiusz Chrobot
pokój: 3.23, budynek D
konsultacje: wtorki, 13:30 15:00
telefon: (41) 34 24 185
e mail: a.chrobot@tu.kielce.pl
WWW: http://achilles.tu.kielce.pl/strony-dydaktyczne/Members/achrobot
2. Literatura podstawowa
1. Andrzej Marciniak Borland Pascal 7.0 , Wydawnictwo Nakom, Poznań 1994
2. Dokumentacja środowiska Free Pascal: http://www.freepascal.org/docs.var (język
angielski)
3. Keith Weiskamp Borland Pascal 7.0 , WNT, Warszawa 1996
4. Alfred V.Aho, John E.Hopcroft, Jeffrey D.Ullman Algorytmy i struktury danych ,
Helion, Gliwice 2003
5. Niklaus Wirth Algorytmy + struktury danych = programy , WNT, Warszawa 2001
3. Literatura uzupełniająca
1. Thomas H.Cormen, Charles E.Leiserson, Ronald L.Rivest Wprowadzenie do
algorytmów , WNT, Warszawa 1998
2. Donald E.Knuth Sztuka programowania , WNT, Warszawa 2002
3. Piotr Wróblewski Algorytmy, struktury danych i techniki programowania , Helion,
Gliwice 1997
4. Jon Bentley Perełki Oprogramowania , WNT, Warszawa 1992
4. Historia programowania.
Ludzkość od zawsze stara się zautomatyzować wykonywanie czynności, które są
monotonne i czasochłonne. Do takich czynności należy zaliczyć wszelkiego rodzaju operacje
arytmetyczne, które trzeba wykonywać wielokrotnie. Już dosyć wcześnie zauważono, że
istnieje możliwość wykonania takich działań mechanicznie. Na przestrzeni lat zbudowano
wiele urządzeń, które w mniejszym lub większym stopniu wspomagały obliczenia
matematyczne. Jednym z najprostszych był oczywiście abak, ale powstały również dosyć
zaawansowane urządzenia pomysłu Leibnitz'a, czy Pascala. Za najbardziej przełomową
konstrukcję należy uznać maszynę różnicową Charlesa Babagge'a. Jej autor pracował nad
jej bardziej zaawansowaną wersją maszyną analityczną, ale niestety nie została ona
ukończona. Potencjał tego urządzenia dostrzegła angielska matematyczka Ada Augusta
Byron, hrabina Lovelace (koniec XIX wieku). W jednej ze swoich prac poświęconych tej
maszynie, zainspirowana działaniem krosna Jacquarda zaproponowała uzupełnienie
projektu maszyny analitycznej o mechanizm umożliwiający zmianę jej działania. Maszyna
ta byłaby więc metamaszyną. W tej pracy znalazł się również zapis przykładowego
programu dla maszyny Babagge'a, który wyliczał liczby Bernoulliego. Należy więc uznać
hrabinę Lovelace za pierwszą programistkę w dziejach ludzkości. Ada Byron przewidywała
również, że maszyna analityczna, którą możemy uznać za mechanicznego protoplastę
współczesnych komputerów, będzie mogła nie tylko rozwiązywać problemy z zakresu
matematyki, ale również wykonywać takie operacje, jak generowanie obrazów, czy muzyki.
Na realizację tej idei trzeba było poczekać do lat 40 ubiegłego stulecia. Dzięki postępowi
w matematyce i technice oraz pracom między innymi takich ludzi, jak John von Neuman
(koncepcja komputera z programem umieszczonym całkowicie w pamięci operacyjnej), Alan
M. Turing (teoria przetwarzania), Claude Shannon (teoria informacji) udało się
skonstruować pierwsze, uniwersalne komputery. Programowanie tych komputerów
polegało na zapisaniu programu bezpośrednio w kodzie maszynowym komputera
i umieszczenie go w pamięci operacyjnej. Z czasem powstały języki programowania
wysokiego poziomu ułatwiające tworzenie programów komputerowych. Takim językiem
programowania jest między innymi język Pascal.
5. Co to jest programowanie?
Programowanie systemów komputerowych jest to zespół czynności, którego celem jest
przygotowanie programu dla systemu komputerowego. W skład tych czynności wchodzą:
opracowanie modelu problemu, który chcemy rozwiązać za pomocą systemu kompute-
rowego, opracowanie algorytmu (lub algorytmów) rozwiązania, zapisanie tego algorytmu za
pomocą wybranego języka programowania oraz usunięcie błędów składniowych i logicz-
nych.
Program komputerowy to zapis algorytmu lub algorytmów rozwiązania pewnych
problemów w określonym języku programowania.
Algorytm jest to skończony zbiór precyzyjnie zdefiniowanych czynności koniecznych do
wykonania określonego zadania.
6. System komputerowy
System komputerowy to urządzenie lub zbiór współpracujących urządzeń, które mogą
zrealizować określony, przygotowany dla nich program. Istnieją różne rodzaje takich
systemów, np.:
systemy klastrowe
systemy typu Personal Computer
systemy mobilne
mikrokontrolery
7. Własności algorytmu
Skończoność wykonanie algorytmu zawsze musi się zatrzymać po skończonej
liczbie kroków. Procedura, która ma wszystkie cechy algorytmu, poza skończonością
nazywana jest procedurą obliczeniową.
Dobre zdefiniowanie każdy krok algorytmu musi być opisany precyzyjnie, dla
każdego przypadku akcje muszą być opisane ściśle i jednoznacznie,
Dane wejściowe algorytm ma zero lub więcej danych wejściowych, tj. wartości,
które są znane przed rozpoczęciem wykonania algorytmu,
Dane wyjściowe algorytm generuje jedną lub więcej danych wyjściowych, czyli
wartości w określony sposób powiązanych z danymi wejściowymi.
Efektywność z praktycznego punktu widzenia, algorytm nie tylko powinien dać
się wykonać w skończonym czasie, ale również ten czas powinien być możliwie
krótki.
7. Zapis algorytmu
Algorytm może być zapisany w postaci zrozumiałej dla człowieka lub nadającej się do
wykonania przez komputer. W pierwszym przypadku może on być np. opisany słownie lub
przedstawiony za pomocą schematu blokowego.
Przykład:
Algorytm Euklidesa wyznaczania największego wspólnego dzielnika dodatnich liczb
całkowitych (NWD).
Opis słowny:
Dane są dwie dodatnie liczby całkowite M i N, należy znalezć ich największy wspólny
dzielnik, tj. największą dodatnią liczbę całkowitą, która dzieli całkowicie zarówno M, jak
i N.
E1. [Znajdywanie reszty] Podziel M przez N i niech R oznacza resztę z tego dzielenia.
E2. [Czy wyszło zero?] Jeśli R = 0, to zakończ algorytm, odpowiedzią jest N.
E3. [Upraszczanie] Wykonaj N M R N i wróć do kroku E1.
,
Schemat blokowy:
START
Wczytaj
M i N
R <- M mod N
M <- N
N <- R
NIE Czy
R=0 ?
TAK
Wypisz N
STOP
Elementy schematu blokowego (www.algorytm.org):
Elipsoida oznacza początek lub koniec algorytmu.
Prostokąt oznacza instrukcje, które mają zostać wykonane (proces),
Romb (diamentoid) oznacza blok decyzyjny, z tego bloku wychodzą dwie
strzałki. Gdy warunek umieszczony we wnętrzu rombu jest spełniony
wybierana jest strzałka z etykietą TAK , w przeciwnym przypadku
z etykietą NIE.
Równoległobok (lub trapez) oznacza blok wejścia wyjścia.
Taka figura oznacza wcześniej zdefiniowany ciąg operacji (podprogram).
Koło oznacza odnośnik do jakiejś części schematu blokowego znajdującej się na
tej samej stronie.
Taka figura oznacza odnośnik do części schematu blokowego, która znajdującego
się na innej stronie.
Jeśli chcemy zapisać algorytm w postaci nadającej się do wykonania przez
komputer, to musimy w tym celu użyć jakiegoś języka programowania. Językiem
bezpośrednio zrozumiałym dla komputera jest język maszynowy. W tym języku
zarówno instrukcje programu, jak i dane zapisane są w postaci ciągu liczb
binarnych. Niestety, zapisanie programu w takiej postaci jest skomplikowane
i może prowadzić do błędów, które są trudne do wykrycia. Utrudniona jest również
konserwacja tak napisanego oprogramowania. Aby uczynić proces pisania programu
łatwiejszym dla człowieka stworzono języki asemblerowe, które upraszczały zapis
programu. Jedna instrukcja języka asemblerowego odpowiadała jednej instrukcji
języka maszynowego. Nadal jednak programy komputerowe odznaczały się dużym
stopniem skomplikowania. Dopiero wprowadzenie tzw. języków programowania
wysokiego poziomu uprościło pisanie programów komputerowych. W językach
wysokiego poziomu program jest zapisywany w języku, którego składnia
przypomina język naturalny (najczęściej angielski), ale jest bardziej zwięzła
i precyzyjna (nie pozwala na tworzenie wieloznacznych konstrukcji). Tekst takiego
programu, nazywany kodem zródłowym, jest tłumaczony przez program nazywany
translatorem (w szczególności translatorem może być kompilator) na język
maszynowy. Przetłumaczony w ten sposób program nazywamy kodem wynikowym.
7. Ranking TIOBE (dygresja)
Position Position Ratings Delta
Delta in Programming
Sep Sep Sep Sep Status
Position Language
2012 2011 2012 2011
1 2 C 19.295% +1.29% A
2 1 Java 16.267% -2.49% A
3 6 Objective-C 9.770% +3.61% A
4 3 C++ 9.147% +0.30% A
5 4 C# 6.596% -0.22% A
6 5 PHP 5.614% -0.98% A
7 7 (Visual) Basic 5.528% +1.11% A
8 8 Python 3.861% -0.14% A
9 9 Perl 2.267% -0.20% A
10 11 Ruby 1.724% +0.29% A
11 10 JavaScript 1.328% -0.14% A
12 12 Delphi/Object Pascal 0.993% -0.32% A
13 14 Lisp 0.969% -0.07% A
14 15 Transact-SQL 0.875% +0.02% A
15 39 Visual Basic .NET 0.840% +0.53% A
16 16 Pascal 0.830% -0.02% A
17 13 Lua 0.723% -0.43% A-
18 18 Ada 0.700% +0.02% A--
19 17 PL/SQL 0.604% -0.12% B
20 22 MATLAB 0.563% +0.02% B
8. Ogólna struktura kodu zródłowego programu napisanego w języku Pascal
PROGRAM NazwaProgramu;
USES
Modul_1, Modul_2;
LABEL
Etykieta_1, Etykieta_2;
CONST
NazwaStalej = 2; {2 oznacza wartość jaką możemy przypisać stałej}
TYPE
NazwaTypu = definicja typu;
VAR
NazwaZmiennej : NazwaTypuZmiennej;
PROCEDURE Nazwa .. .;
.
. {Definicja procedury}
.
END;
FUNCTION NazwaFunkcji ... : TypWartościZwracanejPrzezFunkcję;
.
.
.
END;
BEGIN
.
.
.
END.
Powyższy schemat przedstawia ogólną strukturę programu napisanego w języku
Pascal. W większości programów nie wszystkie z umieszczonych tu elementów
występują1. Mogą również występować w innej kolejności2. Słowa kluczowe, będące
częścią języka programowania zostały napisane wielkimi literami i podkreślone.
Słowa kluczowe mogą w programie być pisane zarówno dużymi, jak i małymi
literami. Należy pamiętać, że są one zastrzeżone i nie mogą stanowić nazw
procedur, funkcji, zmiennych, stałych, itd. Słowo kluczowe program , wraz z nazwą
programu jest nieobowiązkowe i może zostać pominięte. Oznacza ono, że w pliku
znajduje się kod zródłowy programu. Nazwa programu, podobnie jak inne
identyfikatory w języku Pascal, takie jak nazwy stałych, typów i zmiennych, może
składać się z dowolnej liczby znaków (liter, liczb, itd.), ale tylko pierwsze 63 litery
są brane pod uwagę przez kompilator Turbo Pascal, a Free Pascal bierze pod uwagę
pierwsze 127. Dodatkowo, nie może ona rozpoczynać się cyfrą. Nie może również
zawierać znaków specjalnych (np. &, *), oprócz znaku podkreślenia ( _ ), a także
polskich liter. Kompilator Pascala nie rozróżnia dużych i małych liter, a więc nazwy
Zmienna_X i zmienna_x są dla niego takie same. Po nazwie programu
występuje znak średnika. Pełni on specjalną rolę w większości języków
programowania, podobną do roli kropki w zdaniu w językach naturalnych. Słowo
kluczowe uses oznacza, że chcemy, aby do programu zostały włączone moduły
zawierające gotowe elementy programów, które chcemy w naszym programie
wykorzystać. Po tym słowie kluczowym wymieniane są nazwy tych modułów. Jeśli
1 Najkrótszy program w języku Pascal ma postać:
begin
end.
2 Ogólna zasada mówi, że jeśli sami definiujemy lub deklarujemy nowy element programu, to musimy
to uczynić przed jego użyciem. Ta reguła pozwala np.: umieścić sekcję definicji stałych w innym
miejscu kodu zródłowego niż to podano na schemacie. Niestety, nie ze wszystkimi elementami
możemy postąpić w ten sposób.
tych nazw jest więcej to rozdzielamy je przecinkami. Po ostatniej nazwie stawiamy
średnik. Słowo kluczowe label rozpoczyna sekcję deklaracji etykiet. Etykiety są
używane wraz ze słowem kluczowym goto , które zostanie omówione na
następnych wykładach. Słowem kluczowym const rozpoczyna się sekcja definicji
stałych. Każdej stałej musimy nadać określoną wartość używając znaku = .
W Pascalu programista ma również możliwość definiowania swoich typów
zmiennych. Czyni to w części programu rozpoczynającej się słowem kluczowym
type . W części rozpoczynającej się słowem kluczowym var deklarowane są
zmienne. Deklaracja zmiennej składa się z nazwy zmiennej i jej typu wymienionego
po dwukropku. Po nazwie typu należy postawić średnik. Jeśli deklarujemy więcej
zmiennych tego samego typu, ich nazwy możemy wymienić po przecinku. Po części
zawierającej deklaracje zmiennych może wystąpić część zawierająca definicje
procedur i funkcji. Na końcu występuje główny blok programu zawierający
instrukcje do wykonania. Zaczyna się on słowem kluczowym begin , a kończy
słowem end po którym występuje kropka3. Jeśli jakiś element zostanie przez nas
zapisany niezgodnie z regułami języka, kompilator zwróci błąd, który nazywamy
błędem czasu kompilacji, lub krócej błędem kompilacji. Jeśli podczas wykonania
programu pojawi się błąd, to taki błąd nazywamy błędem czasu wykonania.
W kodzie zródłowym programu możemy umieszczać komentarze, które są
ignorowane przez kompilator, ale pomocne dla osób czytających program. Treść
ujęta w nawiasy klamrowe, lub w znaki (* i *) stanowi komentarz.
W komentarzach możemy umieszczać polskie znaki.
9. Definicje stałych
Ogólna postać deklaracji stałej jest następująca:
nazawstalej = wartość;
np.:
stl = 2;
Taki zapis nakazuje kompilatorowi podstawienie wartości 2 w kodzie, wszędzie
tam, gdzie napotka na identyfikator stl . Podstawienie to zachodzi przed
tłumaczeniem programu z języka wysokiego poziomu na język maszynowy. Stałe
nie muszą być wyłącznie liczbami, mogą również być znakami, ciągami
(łańcuchami) znaków lub wartościami logicznymi. Wartość stałej można również
określić wyrażeniem, ale tylko takim, które zawiera wartości lub wcześniej
zdefiniowane stałe. Należy pamiętać, że stałe definiujemy po słowie kluczowym
3 Słowa begin i end pełnią również inną rolę w programach napisanych w języku Pascal. Nazywa
się je nawiasami syntaktycznymi.
const i że nie możemy zdefiniować dwóch stałych o takiej samej nazwie. Nie
możemy również zdefiniować pojedynczej stałej o nazwie, która już została użyta4
w programie lub jest słowem kluczowym.
10. Deklaracje zmiennych
Zmienne w informatyce różnią się od zmiennych, które występują w matematyce.
Każda zmienna w programie ma określony zasięg (ang. scope) oraz typ. Zasięg
określa, które elementy programu mogą korzystać ze zmiennej. Do czasu
omówienia budowy podprogramów (procedur i funkcji) będziemy zajmować się
wyłącznie zmiennymi globalnymi, z których mogą korzystać wszystkie elementy
programu. Typ zmiennej określa ile pamięci komputera należy przeznaczyć na
wartości, które będą umieszczone w tej zmiennej i jak te wartości traktować. Język
Pascal dysponuje kilkoma wbudowanymi typami zmiennych, których nie trzeba
samemu definiować i z których możemy skorzystać. Ich nazwy oraz podstawowe
własności podano w tabeli (jeśli przy danym typie zakres lub rozmiar jest podany
w dwóch wierszach, to wiersz górny oznacza wartości dla kompilatora Turbo
Pascal, a dolny dla Free Pascal):
Nazwa typu Rozmiar Wartość Wartość
minimalna maksymalna
Boolean 1 bajt FALSE TRUE
Byte 1 bajt 0 255
ShortInt 1 bajt -128 127
Word 2 bajty 0 65535
Integer 2 bajty -32768 32767
2 lub 4 bajty lub jak LongInt lub jak LongInt
LongInt 4 bajty -2147483648 2147483647
Real 6 bajtów 2.9e-39 1.7e38
od 4 do 8 bajtów zależnie od zależnie od
komputera komputera
Single 4 bajty 1.5e-45 3.4e38
Double 8 bajtów 5.0e-324 1.7e308
Extended5 10 bajtów 3.4e-4932 1.1e4932
1.9E-4932 1.1E4932
4 Od tej reguły są pewne odstępstwa, o których powiemy sobie na następnych wykładach.
Nazwa typu Rozmiar Wartość Wartość
minimalna maksymalna
Comp 8 bajtów -263+1 263-1
-264+1 263-1
Char 1 bajt #0 #255
String 256 bajtów Ciąg znaków (maksymalnie 255
znaków).
Aby wyjaśnić, skąd biorą się takie wartości i jakie jest znaczenie jednostki bajt
musimy zapoznać się z wewnętrzną reprezentacją danych stosowaną przez
komputery cyfrowe. Program komputerowy, składający się z danych i operujących
na nich instrukcji (kodu) jest przechowywany w pamięci komputera, w postaci liczb
zapisanych w systemie dwójkowym (binarnym). Pełna nazwa tego systemu, to
pozycyjny system liczbowy o podstawie dwa . W życiu codziennym posługujemy się
systemem liczbowym o podstawie dziesięć. W tym systemie, jeśli zapiszemy liczbę
1995, to jej wartość będzie wynosiła 1*1000+9*100+9*10+5*1, co możemy zapisać
jako 1*103+9*102+9*101+5*100. Liczba dziesiętna jest więc zbudowana z cyfr
z zakresu od 0 do 9, przy czym pozycja poszczególnych cyfr w liczbie określa ich
wartość. Innymi słowy, z każdą pozycją w liczbie dziesiętnej związana jest pewna
waga. Liczba 10 jest nazywana podstawą tego systemu. Liczby dwójkowe (binarne)
składają się z cyfr 0 i 1. Podstawą systemu binarnego jest liczba 2. Tak więc liczba
1011, ma wartość dziesiętną równą 1*23+0*22+1*21+1*20 = 1*8+0*4+1*2+1*1 =
= 8+2+1 = 11. Liczbę dwójkową łatwo można reprezentować w pamięci komputera
(1 napięcie +5V, 0 napięcie 0V). Pojedynczą pozycję w liczbie dwójkowej
nazywamy bitem i jest to najmniejsza jednostka informacji, jaką może zapamiętać
komputer. Okazuje się jednak, że jest to jednostka zbyt mała, aby posługiwanie się
nią było opłacalne. Najmniejszą jednostką informacji, jaką operuje komputer jest
8 bitów. Tę jednostkę nazywamy bajtem. Ile różnych liczb możemy zapisać
w pamięci o pojemności 1 bajta? Z kombinatoryki wynika, że 28, czyli 256*. Mamy
więc już odpowiedz, dlaczego w zmiennej typu byte, która zajmuje jeden bajt
pamięci możemy zapisywać liczby o wartościach dziesiętnych od 0 (00000000) do
255 (11111111). Dodajmy, że są to tylko liczby naturalne. W jaki sposób jednak
reprezentować liczby całkowite? Pierwszym pomysłem, jaki zastosowano, była
modyfikacja systemu binarnego, który od tej pory będziemy nazywać naturalnym
binarnym (w skrócie NB). Nazwijmy skrajnie lewy bit liczby binarnej najstarszym
5 W przypadku kompilatora Turbo Pascal, aby użyć w programie typów single, double i extended
należy zmienić zmienić umieścić przed deklaracją zmiennych tego typu zapis {$N+} nakazujący
uaktywnienie koprocesora.
* Należy przypomnieć sobie wzór na wariacje z powtórzeniami.
bitem, a skrajnie prawym najmłodszym bitem. Wspomniana modyfikacja polegała
na założeniu, że najstarszy bit liczby binarnej będzie oznaczał znak liczby i jeśli
będzie on miał wartość 1 , to będzie to liczba ujemna, a jeśli 0 - to wartość
dodatnią. Taki system nazwano systemem znak-moduł (w skrócie ZM). Dzięki
niemu możemy reprezentować w jednym bajcie liczby całkowite z zakresu od -127
(11111111) do 127 (011111111). Niestety ten system nie jest zbyt wygodny
w użyciu, poza tym ma pewną wadę. Liczba zero jest reprezentowana w nim
podwójnie. Mamy ujemne zero równe 10000000 i dodatnie zero równe
00000000 . Znacznie łatwiejszy w użyciu okazał się system znak uzupełnienie
do jedynki (w skrócie U1). Liczbę ujemną reprezentujemy w tym systemie, negując
wszystkie bity odpowiadającej jej liczbie dodatniej. Operacja negacji bitów polega
na zamianie bitów o wartości zero na jeden i odwrotnie. Dzięki temu systemowi
w jednym bajcie możemy zapisać liczby całkowite o wartościach od -127
(100000000) do 127 (01111111). Niestety, tu także występuje podwójna
reprezentacja zera: 11111111 i 00000000. Ostatecznie do reprezentacji liczb
całkowitych używamy systemu znak uzupełnienie do dwójki (w skrócie U2).
Liczby ujemne są tworzone poprzez zanegowanie wszystkich bitów odpowiadającej
jej liczby dodatniej i dodanie jedynki. Tak więc w jednym bajcie możemy
reprezentować liczby od -128 (10000000) do 127 (01111111). Zero ma tylko jedną
reprezentację (00000000). Dzięki systemom NB i U2 potrafimy reprezentować
liczby naturalne i całkowite. Jeśli mamy potrzebę zapamiętania wartości
z większych przedziałów niż te które dotychczas były wymienione, to na ich
zapamiętanie przeznaczamy większą ilość pamięci komputera, co w przypadku
programu w języku Pascal sprowadza się do zmiany typu zmiennej na odpowiednio
większy. Pewien kłopot sprawia reprezentowanie liczb rzeczywistych w pamięci
komputera. Nie istnieje ich dokładna reprezentacja, lecz tylko przybliżona.
Wywodzi się ona z notacji używanej do reprezentowania bardzo małych lub bardzo
dużych liczb dziesiętnych, np.: stałą Plancka zapisujemy jako 6,6*10-34. Ten sam
sposób możemy zastosować do liczb binarnych: rezerwujemy na liczbę pewną ilość
pamięci i dzielimy ją na dwie części. Pierwsza część bajtów będzie zawierała część
ułamkową liczby, natomiast druga część będzie zawierać wykładnik. Podstawy
potęgi nie musimy zapamiętywać, gdyż jest ona zawsze równa 2. Część ułamkowa
jest zapisana w odmianie kodu ZM, gdzie pierwszy bit jest oczywiście bitem znaku,
a kolejne mają malejące wagi (2-1, 2-2,2-3,itd.), natomiast wykładnik jest zapisany
w kodzie U2. Tak zapisane liczby nazywamy liczbami zmiennoprzecinkowymi. Jak
już wcześniej wspomniano nie są one tym samym co liczby rzeczywiste. Te ostatnie
tworzą zbiór ciągły, tzn. jego reprezentacją geometryczną jest linia prosta. Liczby
zmiennoprzecinkowe tworzą zbiór dyskretny, tzn. jego reprezentacją geometryczną
są punkty, które są ułożone obok siebie dosyć gęsto , ale nie tworzą ciągłej prostej.
Należy też zaznaczyć, że reprezentacja liczb całkowitych i naturalnych w pamięci
komputera też nie jest doskonała. W matematyce oba zbiory liczb zawierają
nieskończoną liczbę elementów, a to uniemożliwia ich pełne reprezentowanie
w pamięci komputera, która jest skończona. Znaki do których należą litery i cyfry
reprezentowane są za pomocą liczb binarnych o wartościach dziesiętnych od 0 do
255 (1 bajt). Każdej takiej liczbie, nazywanej kodem ASCII jest przyporządkowany
jeden znak. Jeśli chcemy przechowywać w pamięci operacyjnej większą liczbę
znaków, to musimy zarezerwować w niej odpowiednio więcej miejsca. Wydawać by
się mogło, że wartości logiczne (prawda i fałsz) powinny być pamiętane, na tylko
jednym bicie. Tak jednak nie jest, ponieważ jak zostało to napisane wyżej,
komputery posługują się całymi bajtami, a więc wartość TRUE jest pamiętana jako
11111111, natomiast wartość FALSE jako 00000000. Jeśli uważnie rozważymy
zapis dwójkowy, to zauważymy, że np.: liczba 255 ma taką samą reprezentację
binarną jak liczba -1 lub jak wartość logiczna TRUE. W jaki więc sposób komputer
radzi sobie z odróżnianiem tych znaczenia tych liczb. Rozróżnienie zachodzi na
etapie kompilacji. Kompilator napotykając na deklarację zmiennej, sprawdza jej
typ i rezerwuje wynikającą z niego ilość pamięci. Następnie zamienia każdą
wysokopoziomową instrukcję programu, która odwołuje się do wymienionej
zmiennej na rozkaz niskopoziomowy (bądz ciąg takich rozkazów), który jest
właściwy dla typu zmiennej. Np.: jeśli zmienna jest liczbą naturalną, to używa
rozkazów, które traktują zawartość przydzielonej na zmienną pamięci, jako właśnie
liczbę naturalną. Jeśli zmienna jest liczbą całkowitą, to używa innych rozkazów,
odpowiadających liczbom całkowitym. W języku Pascal liczby naturalne możemy
przechowywać w zmiennych o typach: byte, word, liczby całkowite w zmiennych
o typach: shortint, integer, longint i comp6. Liczby zmiennoprzecinkowe
przechowujemy w zmiennych typu real, single, double i extended. Pojedynczy znak
możemy przechowywać w zmiennej typu char. Do przechowania grupy znaków
możemy posłużyć się zmienna typu string. Wartości logiczne przechowujemy
w zmiennych typu boolean. Typy byte, word, shortint, integer, longint, boolean
i char są typami porządkowymi, tj. dla każdej wartości, którą możemy zapisać
w zmiennej tego typu możemy znalezć wartość następną w stosunku do niej
(następnik) i poprzednią (poprzednik). Pozostałe typy nie są typami porządkowymi.
Zmienne w języku Pascal deklarujemy po słowie kluczowym var, według schematu:
NazwaZmiennej:TypZmiennej;
np.:
licznik:word;
Jeśli chcemy zadeklarować więcej zmiennych tego samego typu, nie musimy
6 Ten typ przechowuje liczby całkowite w postaci zmiennoprzecinkowej i jest rzadko używany
w praktyce.
deklarować ich osobno. Możemy zadeklarować je razem rozdzielając ich nazwy
przecinkami np.:
waga, wzrost:real;
Inne systemy liczbowe stosowane w informatyce.
Oprócz systemu binarnego stosujemy w informatyce system szesnastkowy
(hexadecymalny) i ósemkowy (oktalny). Jak łatwo się domyśleć podstawą pierwszego jest
liczba 16, a drugiego 8. W systemie szesnastkowym występują cyfr od 0 do F, przy czym
liczbie dziesiętnej 10 odpowiada cyfra A, 11 cyfra B, itd. Bardzo łatwo zamienić jest liczbę
dwójkową na szesnastkową i odwrotnie, ponieważ 16 = 24. Liczbę 10110011 dzielimy na
dwie części po 4 bity (cyfry) 1011 i 0011. Następnie każdą z tak powstałych liczb
zamieniamy na cyfrę szesnastkową, czyli na B i 3, a więc liczba 10110011 w notacji
szesnastkowej będzie miała wartość B3h (litera h nie jest cyfrą i dodaje się ją celem
oznaczenia, że mamy do czynienia z wartością zapisaną w kodzie szesnastkowym).
W kodzie ósemkowy występują cyfry od 0 do 7. Ponieważ 8=23, to liczbę binarną dzielimy
na części po trzy bity: 101 100 011, i każdą z tych grup zamieniamy na cyfrę ósemkową:
543o (podobnie jak poprzednio o nie jest cyfrą, tylko informuje z jakim systemem
liczbowym mamy do czynienia). Przeliczenie wartości szesnastkowych lub ósemkowych
na binarne wykonywane jest w analogiczny sposób. Należy jeszcze objaśnić w jaki sposób
przeliczać wartości dziesiętne na binarne, ósemkowe i szesnastkowe. Spróbujmy znalezć
reprezentację binarną liczby dziesiętnej 11. W tym celu podzielimy liczbę 11 przez 2,
zapiszemy resztę z tego dzielenia, następnie wynik tego dzielenia będziemy ponownie
dzielić przez 2 i ponownie zapiszemy jego resztę. Proces ten będziemy kontynuować, aż
uzyskamy wynik 0:
11 : 2 = 5 r. 1
5 : 2 = 2 r. 1
2 : 2 = 1 r. 0
1 : 2 = 0 r. 1
Teraz zapisujemy reszty w odwrotnej kolejności niż się pojawiły i otrzymujemy: 1011.
Przeliczenia na pozostałe systemy dokonujemy podobnie, ale zamiast dzielenia przez
2 dzielimy odpowiednio przez 8 i 16.
W pracy informatyka przydaje W informatyce używa się dosyć często takich przedrostków,
się znajomość potęg dwójki. jak kilo, mega, giga. Nie są one jednak zgodne z przed-
Poniżej znajduje się zesta- rostkami, które znamy z układu SI:
wienie pierwszych siedem-
1 kilo = 210 = 1024 (dosyć często oznaczany literą K zamiast k)
nastu:
1 mega = 220 = 1.048.576 (M)
20 = 1 211 = 2048
1 giga = 230 = 1.073.741.824 (G)
21 = 2 212 = 4096
W roku 1999 Międzynarodowa Komisja do spraw
22 = 4 213 = 8192
Elektrotechniki zaproponowała wprowadzenie odrębnego na-
23 = 8 214 = 16384 zewnictwa przedrostków informatycznych , celem od-
różnienia ich od przedrostków SI. Są to odpowiednio: kibi
24 = 16 215 = 32768
(Ki) w zastępstwie kilo, mebi (Mi) odpowiednik mega, gibi
25 = 32 216 = 65536
(Gi) odpowiednik giga. Ten standard jeszcze się nie
upowszechnił.
26 = 64
27 = 128
28 = 256
29 = 512
210 = 1024
Wyszukiwarka
Podobne podstrony:
PP1 wykladPP1 wyklad 8PP1 wyklad 3PP1 wyklad 5PP1 wyklad 2PP1 wykladPP1 wyklad 4PP1 wyklad 5PP1 wyklad 9PP1 wykladPP1 wyklad 4PP1 wykladSieci komputerowe wyklady dr FurtakWykład 05 Opadanie i fluidyzacjaWYKŁAD 1 Wprowadzenie do biotechnologii farmaceutycznejwięcej podobnych podstron