Programowanie w języku Pascal Dr inż. Grażyna KRUPIŃSKA grazyna@fis.agh.edu.pl D-10 pokój 227
Prezentacja algorytmu w języku programowania Aby przedstawić algorytm w postaci programu, trzeba go napisać jako ciąg instrukcji języka programowania. Każda instrukcja podobnie jak skrzynka w schemacie blokowym odpowiada określonej operacji, dlatego też kolejność występowania instrukcji w programie określa kolejność wykonywania operacji. Nauka programowania nie polega jednak na nauczeniu się na pamięć instrukcji danego języka, ale na zrozumieniu zasad ich działania oraz na umiejętnym ich zastosowaniu. Programowanie w języku Pascal 08.12.2016 2
Programowanie algorytm rozwiązuje problem program realizuje algorytm komputer wykonuje program Programowanie w języku Pascal 08.12.2016 3
Programowanie ETAPY PROGRAMOWANIA PROBLEM ALGORYTM PROGRAM ŹRÓDŁOWY PROGRAM WYKONYWALNY KOMPUTER 0. WYBÓR-ZNALEZIENIE- OPRACOWANIE ALGORYTMU 1. IMPLEMENTACJA to zapis algorytmu w języku programowania 2. TRANSLACJA to tłumaczenie programu źródłowego na kod maszynowy 3. URUCHOMIENIE programu 4. TESTOWANIE programu Programowanie w języku Pascal 08.12.2016 4
Języki programowania ALGORYTM PROGRAMOWANIE kod źródłowy programu kompilator języka interpreter języka KOMPILACJA kod binarny program wykonywalny Programowanie w języku Pascal 08.12.2016 5
Program źródłowy i wynikowy PROGRAM (KOD) ŹRÓDŁOWY to algorytm zapisany w języku programowania (języku wysokiego poziomu) Przejrzysta struktura (reguły języka) zrozumiały dla człowieka Niezależność od sprzętu PROGRAM (KOD) WYNIKOWY to program zapisany w języku wewnętrznym (maszynowym) procesora Instrukcje odpowiadają instrukcjom konkretnego procesora Programowanie w języku Pascal 08.12.2016 6
Program źródłowy wynikowy TRANSLACJA - tłumaczenie programu źródłowego na kod maszynowy. Używamy do tego programów zwanych translatorami. INTERPRETERY każde polecenie języka wysokiego poziomu jest na bieżąco zamieniane na kod maszynowy i wykonywane (do wykonania programu potrzebne jest uruchomienie interpretera) KOMPILATORY cały program źródłowy jest tłumaczony na kod maszynowy i zapisywany w pliku wykonywalnym (*.exe). Raz skompilowany program jest gotowy do użycia. Programowanie w języku Pascal 08.12.2016 7
Struktura programu w Pascalu program polekola; uses crt; const var pi=3.14; p,r:real; begin end. writeln( pole koła ); writeln('podaj promień'); readln(r); p:=pi*r*r*; nagłówek programu część deklaracyjna część wykonawcza writeln(pole koła wynosi,p:4:2) program nazwa; uses lista modułów; const nazwa=wartość; var lista zmiennych:typ; begin instrukcje programu end. nazwa jest jednym wyrazem (bez spacji) nazwa nie zawiera polskich liter deklaracje modułów moduły to zbiory funkcji i procedur, które możemy wykorzystywać w naszych programach definicje stałych deklaracje zmiennych wszystkie zmienne występujące w programie muszą być wcześniej zadeklarowane Kolejność zapisywania instrukcji odpowiada kolejności wykonywania Instrukcje oddzielamy średnikiem Programowanie w języku Pascal 08.12.2016 8
Zmienne Zmienna jest synonimem pewnego obszaru pamięci, służącego do przechowywania danych. Posiada trzy podstawowe atrybuty: symboliczną nazwę identyfikator, miejsce przechowywania, wartość; Za pomocą nazwy możemy w kodzie źródłowym odwołać się do zawartości. W programie wartość zmiennej może być odczytywana lub zastępowana nową wartością, tak więc wartość zmiennej może zmieniać się w trakcie wykonywania programu. Nazwa i miejsce przechowywania nie zmieniają się w trakcie istnienia zmiennej Programowanie w języku Pascal 08.12.2016 9
Zmienne KAŻDA ZMIENNA UŻYWANA W PROGRAMIE MUSI BYĆ ZADEKLAROWANA dla każdej zadeklarowanej zmiennej rezerwowany jest fragment pamięci o określonym adresie i wielkości zmiennym nadajemy wartości wczytując je z klawiatury lub pliku używając instrukcji przypisania przypisując nową wartość zmiennej automatycznie kasujemy starą Programowanie w języku Pascal 08.12.2016 10
Podstawowe typy danych PREDEFINIOWALNE TYPY DANYCH liczby całkowite INTEGER liczby rzeczywiste REAL wartości logiczne BOOLEAN = {TRUE, FALSE} wartości znakowe CHAR łańcuchy STRING STRING[n] łańcuch ograniczony do n znaków Programowanie w języku Pascal 08.12.2016 11
Notacja nadmiarowa Wartość dziesiętna liczby zapisanej w dwójkowym kodzie z nadmiarem b n-1 b n-2...b 2 b 1 b 0 (BIAS) = b n-1 2 n-1 + b n-2 2 n-2 +... + b 2 2 2 + b 1 2 1 + b 0 2 0 - bias gdzie b - bit, cyfra dwójkowa 0 lub 1 n - liczba bitów w zapisie liczby bias - nadmiar, odchyłka w stosunku do naturalnych wartości słów kodowych 00011111 (BIAS=63) = 2 4 + 2 3 + 2 2 + 2 1 + 2 0-63 00011111 (BIAS=63) = 31-63 00011111 (BIAS=63) = (-32) (10) Programowanie w języku Pascal 08.12.2016 12
Liczby duże i małe Zapisywanie liczb oznaczających bardzo duże lub bardzo małe wartości notacja naukowa. Gwiazda Proxima Centauri znajduje się w odległości 9460800000000 [km], 9,4608 x 1012. Masa elektronu wynosi me = 0,00000000000000000000000000091095 [g], czyli 9,1095 x 10-28 [g] Programowanie w języku Pascal 08.12.2016 13
Zapis zmiennopozycyjny Liczba w tym zapisie składa się z trzech części: liczby stałoprzecinkowej podstawy systemu potęgi zwanej wykładnikiem lub cechą. L = m * p c m mantysa p podstawa systemu c cecha - wykładnik potęgowy Programowanie w języku Pascal 08.12.2016 14
Zapis zmiennopozycyjny L = m * p c 325 10 20 = 32,5 10 21 = 3,25 10 22 = 0,325 10 23 = dokładność liczby wielkość liczby Znormalizowana liczba zmiennoprzecinkowa to taka, w której mantysa spełnia nierówność: p > m 1 Programowanie w języku Pascal 08.12.2016 15
Zapis zmiennopozycyjny L = m * p c Przykład 8-bitowy zapis liczby 01101101 bit znaku; cecha kodowana z nadmiarem 4 na 3 bitach; mantysa na 4 bitach; 0 1 1 0 1 1 0 1 liczba dodatnia cecha 110 (BIAS=4) =6-4=2 mantysa.1101 11.01 czyli 3 1 4 Programowanie w języku Pascal 08.12.2016 16
Zapis zmiennopozycyjny L = m * p c Przykład 8-bitowy zapis liczby 10111100 1 0 1 1 1 1 0 0 liczba ujemna cecha 011 (BIAS=4) =3-4=-1 mantysa.1100 0.1100 czyli 3 8 Programowanie w języku Pascal 08.12.2016 17
Zapis zmiennopozycyjny L = m * p c Przykład +2 3 4 1 0. 1 1 0 1 0 1 1 cecha powinna mieć wartość 2, (2 + 4 = 6) czyli 110 (BIAS=4) 0 1 1 0 1 0 1 1 Programowanie w języku Pascal 08.12.2016 18
L = m * p c Zapis zmiennopozycyjny Przykład 2.625= 2 5 8 1 0. 1 0 1 utracony bit 0 1 0 1 0 cecha powinna mieć wartość 2, (2 + 4 = 6) czyli 110 (BIAS=4) 0 1 1 0 1 0 1 0 czyli 2 4 8 a nie 2 5 8 Programowanie w języku Pascal 08.12.2016 19
Standard zapisu zmiennoprzecinkowego IEEE 754 Standard IEEE 754 definiuje dwa rodzaje liczb zmiennoprzecinkowych: 32-bitowe (pojedynczej precyzji - ang. single precision) 64-bitowe (podwójnej precyzji - ang. double precision). Format zapisu zmiennoprzecinkowego IEEE 754 32 bity (1 bit) b 31 (8 bitów) b 30... b 23 (BIAS=127) (23 bity)b 22... b 0 (U1) 64 bity (1 bit) b 63 (11 bitów) b 62... b 52 (BIAS=1023) (52 bity)b 51... b 0 (U1) Opis pół bitowych L = m * p c bit znaku bity kodu cechy bity mantysy Programowanie w języku Pascal 08.12.2016 20
Standard zapisu Zapis cechy w notacji nadmiarowej umożliwia szybkie porównywanie liczb: większa ma 1-kę na pierwszym od lewej różniącym się polu: zmiennoprzecinkowego 00101010 > 00011001 IEEE 754 Format zapisu zmiennoprzecinkowego IEEE 754 32 bity (1 bit) b 31 (8 bitów) b 30... b 23 (BIAS=127) (23 bity)b 22... b 0 (U1) 64 bity (1 bit) b 63 (11 bitów) b 62... b 52 (BIAS=1023) (52 bity)b 51... b 0 (U1) Opis pół bitowych bit znaku bity kodu cechy bity mantysy Wzrost ilości bitów cech liczb zmiennoprzecinkowych wpływa na ich zakres. L = m * p c Wzrost liczby bitów mantys wpływa na ich precyzję, czyli dokładność odwzorowywania liczb rzeczywistych. Programowanie w języku Pascal 08.12.2016 21
Standard zapisu zmiennoprzecinkowego IEEE 754 Mantysy są zapisywane w stałoprzecinkowym kodzie U1. (wartości od -127 wszystkie bity wyzerowane do 128 wszystkie bity ustawione na 1) Mantysa jest prawie zawsze znormalizowana (p>m 1 ) - jej wartość liczbowa zawiera się pomiędzy 1 a 2. Pierwszy bit całkowity mantysy zawsze wynosi 1 => zapamiętujemy tylko bity ułamkowe. Mantysa dłuższa o jeden bit - zwiększamy jej rozdzielczość do 24 bitów dla formatu pojedynczej precyzji i do 53 bitów dla formatu podwójnej precyzji. Programowanie w języku Pascal 08.12.2016 22
Standard zapisu zmiennoprzecinkowego IEEE 754 Format zapisu zmiennoprzecinkowego IEEE 754 32 bity (1 bit) b 31 (8 bitów) b 30... b 23 (BIAS=127) (23 bity)b 22... b 0 (U1) Mantysy są zapisywane w stałoprzecinkowym kodzie U1. (wartości od -127 wszystkie bity wyzerowane do 128 wszystkie bity ustawione na 1) 64 bity (1 bit) b 63 (11 bitów) b 62... b 52 (BIAS=1023) (52 bity)b 51... b 0 (U1) Opis Mantysa pół jest prawie zawsze znormalizowana bity (p>m 1 ułamkowe ) - bit znaku bity kodu cechy bity mantysy bitowych jej wartość liczbowa zawiera się pomiędzy 1 a 2. mantysy Pierwszy bit całkowity mantysy zawsze wynosi 1 => zapamiętujemy tylko bity ułamkowe. Mantysa dłuższa o jeden bit - zwiększamy jej rozdzielczość do 24 bitów dla formatu pojedynczej precyzji i do 53 bitów dla formatu podwójnej precyzji. Programowanie w języku Pascal 08.12.2016 23
Standard zapisu zmiennoprzecinkowego IEEE 754 Z kodu wydzielamy poszczególne pola Do odczytanej mantysy dodajemy na początku 01 i przecinek - otrzymujemy dodatnią liczbę stałoprzecinkową w kodzie U1. Obliczamy wartość cechy i mantysy, a następnie wyliczamy wartość liczby wg wzoru: L (IEEE 754) = m * p c = (-1) z *m*2 c 01000010110010000000000000000000 10010000000000000000000 (IEEE 754) ) z = 0 - liczba jest dodatnia c = 10000101 (BIAS=127) = 133-127 = 6 m = 01,10010000000000000000000 (U1) = 1 9 / 16 Programowanie w języku Pascal 08.12.2016 24
Standard zapisu zmiennoprzecinkowego IEEE 754 Z kodu wydzielamy poszczególne pola L (IEEE 754) = (-1) z * m * 2 c = (-1) 0 * 1 9 / 16 * 2 6 = 25 / 16 * 2 6 = Do 25 odczytanej * 2 2 = 25 * 4 mantysy = 100 (10) dodajemy na początku 01 i przecinek - 01000010110010000000000000000000 otrzymujemy dodatnią liczbę stałoprzecinkową (IEEE w 754) kodzie = 100 U1. (10) Obliczamy wartość cechy i mantysy, a następnie wyliczamy wartość liczby wg wzoru: L (IEEE 754) = m * p c = (-1) z *m*2 c 01000010110010000000000000000000 10010000000000000000000 (IEEE 754) ) z = 0 - liczba jest dodatnia c = 10000101 (BIAS=127) = 133-127 = 6 m = 01,10010000000000000000000 (U1) = 1 9 / 16 Programowanie w języku Pascal 08.12.2016 25
Zakres w standardzie IEEE 754 Największa cecha i mantysa cecha 11111110 (BIAS=127) c = 254-127 c = 127 11111111 (BIAS=127) wartość zdenormalizowana mantysa 11111111111111111111111 (U1) m = 01, 11111111111111111111111 (U1) m = 1+ (2 23-1) / 2 23 = (2 24-1) / 2 23 max (IEEE 754) = m 2 c max (IEEE 754) = (2 24-1) / 2 23 2 127 max (IEEE 754) = (2 24-1) 2 104 max (IEEE 754) = 3,4028234663852885981170418348452 10 38 Programowanie w języku Pascal 08.12.2016 26
Zakres w standardzie IEEE 754 W pojedynczej precyzji Z (IEEE 754) = - 3,4 10 38... 3,4 10 38 W podwójnej precyzji Z (IEEE 754) = - 1,8 10 308... 1,8 10 308 Programowanie w języku Pascal 08.12.2016 27
Precyzja liczb IEEE 754 Precyzję zapisu liczby zawsze wyznacza ilość dostępnych bitów mantysy. Jedną cyfrę dziesiętną koduje (statystycznie) log 2 (10) bitów mantysy W pojedynczej precyzji - 24 bity mantysy 24 / log 2 (10) = 24 / 3,32 = 7,2 cyfr W podwójnej precyzji - 53 bity mantysy 53 bity / log 2 (10) = 53 bity / 3,32 = 15,96 cyfr Programowanie w języku Pascal 08.12.2016 28
Przykład komórka zawierająca zapis 0 1 0 0 0 0 0 1 może oznaczać: liczbę 65 lub kod litery A typ Rodzaj danych Zakres wartości rozmiar char znaki Znaki alfabetu ASCII 1 bajt boolean wartości logiczne TRUE/FALSE 1 bajt byte Liczby naturalne [0;255] 1 bajt shortint Liczby całkowite [-128;127] 1 bajt word Liczby naturalne [0;65 535] 2 bajty integer Liczby całkowite [-32 768;32 767] 2 bajty long Liczby całkowite [-2147483648;2147483647] 4 bajty real Liczby rzeczywiste (-1,7 38 ;1,7 38) 11-12 cyfr znaczących 6 bajtów single Liczby rzeczywiste (-3,4 38 ;3,4 38 ) 7-8 cyfr znaczących 4 bajtów double Liczby rzeczywiste (-1,7 308 ;1,7 308) 15-16 cyfr znaczących 8 bajtów extended Liczby rzeczywiste (-1,1 4932 ;1,1 4392) 19-20 cyfr znaczących 10bajtów Programowanie w języku Pascal 08.12.2016 29
Instrukcje wejścia Służą do wprowadzania danych do programu Read(lista zmiennych); Readln(lista zmiennych); wczytanie ( z klawiatury) zmiennych wymienionych w nawiasie wczytanie ( z klawiatury) zmiennych wymienionych w nawiasie, a następnie przeniesienie kursora do następnej linii Programowanie w języku Pascal 08.12.2016 30
Wprowadź z Służą do wprowadzania danych do programu Przykład dla zmiennych x, y, z, t wprowadzamy odpowiednio wartości 4 12 6 8 read(x,y); read(z); read(t); readln(x,y); readln(z); read(t); Instrukcja Sposób wprowadzenia (ekran) 4 12 6 8 <ENTER> 4 12 <ENTER> 5 <ENTER> 8 <ENTER> Programowanie w języku Pascal 08.12.2016 31
Instrukcje wyjścia Służą do wyprowadzania wyników lub komunikatów Write(lista zmiennych); Writeln(lista zmiennych); wypisanie wartości zmiennych wymienionych w nawiasie wypisanie wartości zmiennych wymienionych w nawiasie, a następnie przeniesienie kursora do następnej linii Writeln( tekst komunikatu ); Tekst ujęty w apostrofach zostanie wypisany na ekranie Programowanie w języku Pascal 08.12.2016 32
Wypisz j Przykład dla zmiennych i, j, k o wartościach 12, 4 i 78 Instrukcja write( oto liczby: ); write(i); write(j); write(k); writeln( oto liczby: ); write(i); writeln(j); write(k); Sposób wyprowadzenia (ekran) oto liczby: 12 4 78 oto liczby: 12 4 78 Programowanie w języku Pascal 08.12.2016 33
Formatowanie wydruku liczby całkowite: writeln(zmienna:l_cyfr) l_cyfr - długość liczby (w znakach), Przykład dla zmiennych n = 153, k = 76 Instrukcja Ekran Write(n,k); 15376 Write(n:3,k:3); 153 76 Write(n:5,k:5); 153 76 Programowanie w języku Pascal 08.12.2016 34
Formatowanie wydruku liczby rzeczywiste: writeln(zmienna:l_cyfr :c_dzies) l_cyfr - długość liczby (w znakach) łącznie z przecinkiem c_dzies liczba cyfr po przecinku Przykład dla zmiennej x=9,75 Instrukcja Write(X); Ekran 9.7500000E+00 Write(x:4:2) 9.75 Write(x:3:1) 9.8 Write(x:5:1) 9.8 Write(x:8:4) 9.7500 Programowanie w języku Pascal 08.12.2016 35
Instrukcja przypisania Służy do nadawania wartości zmiennym przez program zmienna := wyrażenie; S a + b wyrażenie (wzór) to zapis obliczeń składający się ze zmiennych, operatorów działań i funkcji wartość obliczona na podstawie wyrażenia zostanie przypisana zmiennej typ zmiennej musi być zgodny z typem wyrażenia Programowanie w języku Pascal 08.12.2016 36
Instrukcja przypisania Służy do nadawania wartości zmiennym przez program Operacje arytmetyczne + dodawanie - odejmowanie * mnożenie / dzielenie rzeczywiste przykład: 7/2=3,5 div dzielenie całkowite przykład: 7 div 3 = 2 mod reszta z dzielenia całkowitego przykład: 7 mod 3 = 1 Programowanie w języku Pascal 08.12.2016 37
Budowa wyrażeń Zasady zapisu: wszystkie działania muszą być jawne np. y:=2*a a nie y:=2a do grupowania działań służy nawias zwykły np y:=1/((1/x)+1) Kolejność działań: wartości funkcji wyrażenia w nawiasach mnożenie i dzielenie dodawanie i odejmowanie Programowanie w języku Pascal 08.12.2016 38
a 2 b h Budowa wyrażeń (a+b)/2*h a b cd a b c d (a+b)/c*d (a+b)/(c*d) 1 x 2 1 1/sqrt(x*x+1) 2 sin cos 2 2 2*sin((a+b)/2)*cos((a-b)/2) Programowanie w języku Pascal 08.12.2016 39
Funkcje standardowe abs(x) - wartość bezwzględna sqr(x) - kwadrat sqrt(x) - pierwiastek kwadratowy ln(x) - logarytm naturalny z x exp(x) - e x sin(x) - sinus (x w radianach) cos(x) - cosinus (x w radianach) arctan(x) - arcus tangens x (wynik w mierze łukowej) round(x) - zaokrąglenie do najbliższej liczby całkowitej round(7.67)=8 trunc(x) - obcięcie części ułamkowej trunc(7.67)=7 Programowanie w języku Pascal 08.12.2016 40
Instrukcja warunkowa Pozwala na podjęcie decyzji, którą instrukcję ma wykonać w zależności od postawionego warunku a 0 Tak Nie wynik a wynik -a Wypisz wynik Programowanie w języku Pascal 08.12.2016 41
Instrukcja warunkowa Pozwala na podjęcie decyzji, którą instrukcję ma wykonać w zależności od postawionego warunku a 0 Tak Nie wynik a wynik -a IF warunek THEN instrukcje_gdy_tak Wypisz wynik - wykonywana jest gdy warunek jest spełniony ELSE instrukcje_gdy_nie; - wykonywana jest gdy warunek nie jest spełniony Programowanie w języku Pascal 08.12.2016 42
Instrukcja warunkowa Pozwala na podjęcie decyzji, którą instrukcję ma wykonać w zależności od postawionego warunku Przykład 1: if (x=1) then y:=0.5*x*x-4 else y:=1/(x-1); Przykład 2: Readln(x); if (x<0) then x:=x*(-1); Writeln( wartość bezwzględna=,x); Programowanie w języku Pascal 08.12.2016 43
Warunek, operacja, operator IF warunek THEN... warunek czyli wyrażenie logiczne wyrażenie logiczne (warunek) to zapis warunku przy użyciu operatorów relacji lub operacji logicznych wyrażenie logiczne przyjmuje wartość TRUE lub FALSE (może być fałszywe lub prawdziwe) Programowanie w języku Pascal 08.12.2016 44
Warunek, operacja, operatory relacji = - równe <> - różne < - mniejsze > - większe <= - mniejsze lub równe >= - większe lub równe operator operacje logiczne not and - negacja - iloczyn logiczny or - suma logiczna przykłady wyrażeń logicznych a > b ( a > b ) or ( a > c ) ( a <> 0 ) and ( ( a> b ) or ( a > c ) ) Programowanie w języku Pascal 08.12.2016 45
Instrukcja złożona Służy do grupowania kilku instrukcji w celu łącznego wykonania (lub nie wykonania) begin... instrukcje programu;... end; Programowanie w języku Pascal 08.12.2016 46
Instrukcja złożona Instrukcja warunkowa IF...THEN..ELSE sama z siebie domyślnie warunkiem (na tak lub nie) obejmuje tylko jedną instrukcję programu if x=0 then writeln( y nie istnieje ) else y:=1/x; writeln( y=,y:5:2); if x<>0 then writeln( y nie istnieje ); else begin y:=1/x; writeln( y=,y:5:2) end; elementem instrukcji warunkowej jest tylko y:=1/x; writeln( y=,y:5:2); wykona się niezależnie od wartości x Obie instrukcje zostaną wykonane (lub nie) - zależnie od wartości x Programowanie w języku Pascal 08.12.2016 47
Instrukcja wyboru Pozwala na wybór jednej spośród kilku instrukcji w zależności od wartości wyrażenia sterującego (selektora) CASE (wyrażenie) OF w 1 :instrukcja 1; w 2 :instrukcja 2; w 3 :instrukcja 3;... END; obliczana jest wartość wyrażenia w nawiasie wyrażenie musi być typu całkowitego lub znakowego wykonywana jest instrukcja odpowiadająca obliczonej wartości jeżeli obliczonej wartości wyrażenia nie ma na liście nie zostanie wykonana żadna z instrukcji gdy dla jednej wartości wyrażenia należy wykonać kilka instrukcji stosujemy instrukcję złożoną (begin... end) Programowanie w języku Pascal 08.12.2016 48
Instrukcja wyboru Pozwala na wybór jednej spośród kilku instrukcji w zależności od wartości wyrażenia sterującego (selektora) Case (kont div 90+1) of 1:writeln( pierwsza ćwiartka ); 2:writeln( druga ćwiartka ); 3:writeln( trzecia ćwiartka ); 4:writeln( czwarta ćwiartka ); end; Obliczane jest wyrażenie (kont div 90)+1 Wykonywana jest instrukcja informująca do której ćwiartki należy wartość kont Programowanie w języku Pascal 08.12.2016 49
Instrukcja iteracyjna FOR Pozwala na powtarzanie instrukcji określoną ilość razy S 0 L N Tak L > 0 Nie S S + L L L 1 Pisz S Programowanie w języku Pascal 08.12.2016 50
Instrukcja iteracyjna FOR S 0 L N Tak L > 0 Nie FOR zmienna:=wart.początkowa TO wart. końcowa DO instrukcja; S S + L L L 1 Pisz S FOR zmienna:=wart.początkowa DOWNTO wart. końcowa DO instrukcja; Po każdym wykonaniu instrukcji zmienna jest automatycznie modyfikowana o 1 zmienna musi być typu całkowitego w górę dla TO w dół dla DOWNTO Instrukcja wykonywana jest tyle razy aby zmienna startując od wartości początkowej osiągnęła wartość końcową Programowanie w języku Pascal 08.12.2016 51
Instrukcja iteracyjna FOR Pozwala na powtarzanie instrukcji określoną ilość razy for i:=1 to 10 do suma:=suma+i; for i:=1 to 10 do begin write( liczba= ); readln(liczba); suma:=suma+liczba; end; gdy pętlą jest objętych kilka instrukcji (linijek) trzeba stosować instrukcję złożoną Programowanie w języku Pascal 08.12.2016 52
Instrukcja cykliczna repeat...until Pozwala na powtarzanie instrukcji nieokreśloną ilość razy aż do spełnienia zadanego warunku Tak Czytaj Liczba S <=30 Nie Wypisz Liczba Pisz S S S + Liczba Programowanie w języku Pascal 08.12.2016 53
Instrukcja cykliczna repeat...until Pozwala na powtarzanie instrukcji nieokreśloną ilość razy aż do spełnienia zadanego warunku REPEAT instrukcja; UNTIL warunek; instrukcja (instrukcje) umieszczone wewnątrz pętli będą wykonywane dopóki warunek nie zostanie spełniony; po spełnieniu warunku program opuści pętlę repeat write( liczba= ); readln(liczba); suma:=suma+liczba; until suma<=100; najpierw wykonywana jest instrukcja, a później sprawdzany jest warunek między słowami kluczowymi repeat...until możemy umieścić kilka instrukcji - powtarzane są wszystkie Programowanie w języku Pascal 08.12.2016 54
Instrukcja cykliczna while...do Pozwala na powtarzanie instrukcji nieokreśloną ilość razy tak długo jak długo warunek jest spełniony WHILE warunek DO instrukcja; instrukcja jest powtarzana tak długo jak długo jest spełniony warunek gdy warunek nie będzie spełniony program opuści pętlę najpierw sprawdzany jest warunek, a później wykonywana jest instrukcja Programowanie w języku Pascal 08.12.2016 55
Instrukcja cykliczna while...do Pozwala na powtarzanie instrukcji nieokreśloną ilość razy tak długo jak długo warunek jest spełniony while (a*b)<>0 do if a>b then a:=a mod b else b:=b mod a; while suma<100 do begin write( liczba= ); readln(liczba); suma:=suma+liczba; end; gdy warunkiem jest objętych kilka instrukcji (linijek) trzeba stosować instrukcję złożoną Programowanie w języku Pascal 08.12.2016 56
Tablice - wstęp Służą do przechowywania ustalonej liczby elementów (liczb całkowitych, rzeczywistych lub znaków) tego samego typu. tablica posiada nazwę każde pole tablicy posiada numer (indeks) nazwa nr pola liczby 1 1 2 3 5 8 13 21 34 55 1 2 3 4 5 6 7 8 9 10 Dostęp do każdego elementu tablicy uzyskujemy poprzez nazwę (tablicy) i numer Przykład odwołanie się do elementu tablicy: liczby[2]=1 liczby[6]=8 Programowanie w języku 08.12.2016 57
Tablice - deklaracje deklaracja klasyczna definicja 10 elementowej tablicy liczb całkowitych o nazwie liczby var liczby:array[1..10] of integer; nazwa rozmiar typ elementów Rozmiar tablicy musi być stałą liczbą całkowitą Programowanie w języku 08.12.2016 58
Tablice- deklaracje Można również zdefiniować tablicę o określonym rozmiarze jako nowy typ danych, a następnie zadeklarować zmienną tego typu program przykład; type tablica=array[1..10] of integer; definicja typu danych tablica var liczby:tablica;... deklaracja zmiennej typu tablica Programowanie w języku 08.12.2016 59
Tablice - odwołania do elementów Nadawanie wartości: poprzez wczytanie z klawiatury: read (liczby[i]); poprzez instrukcję przypisania : liczby[i]:=wyrażenie; Przypisywanie wartości całej tablicy wykonujemy nadając wartość każdemu elementowi z osobna Lub For i:=1 to 10 do liczby[i]:=wyrażenie; For i:=1 to 10 do readln (liczby[i]); 08.12.2016 60
Tablice - odwołania do elementów Wyprowadzanie wartości elementów tablicy również każdy element osobno For i:=1 to 10 do write (liczby[i]); Programowanie w języku 08.12.2016 61
Łańcuchy Służą do przechowywania ciągu znaków (w tym spacji). Łańcuchy mogą mieć do 255 znaków. deklaracja zmiennej łańcuchowej: var nazwa:string[liczba znaków]; - gdy brak liczby znaków Pascal przyjmie 255 Przykład deklaracja 30 znakowego łańcucha o nazwie wyraz var wyraz:string[30]; Programowanie w języku 08.12.2016 62
Łańcuchy Łańcuchy możemy traktować jak tablice znaków wyraz = parowóz to wyraz[1]= p wyraz[4]= o Wprowadzanie zawartości łańcucha przez wczytanie z klawiatury readln(wyraz); instrukcja przypisania wyraz:= parowóz tekst musi być ujęty w pojedyncze apostrofy Programowanie w języku 08.12.2016 63
Łańcuchy - funkcje i procedury length(łańcuch) określenie długości łańcucha (liczba znaków) length( parowoz )=7 pos(podłańcuch, łańcuch) określenie pozycji od której zaczyna się podłańcuch pos( men, dokumentacja )=5 Programowanie w języku 08.12.2016 64
Łańcuchy - funkcje i procedury concat(łańcuch1,łańcuch2,...) połączenie kilku łańcuchów w jeden copy(łańcuch,indeks,licznik) skopiowanie z łańcucha licznik znaków począwszy od indeks copy( dyrygent,5,3) oznacza gen Programowanie w języku 08.12.2016 65
Łańcuchy - funkcje i procedury delete(łańcuch,indeks,licznik) usunięcie z łańcucha licznik znaków począwszy od indeks delete( telefon,1,4) da w wyniku fon insert(podłańcuch,łańcuch,indeks) wstawienie podłańcucha do łańcucha na określonym przez indeks miejscu insert( promujemy, gra,4) da w wyniku programujemy Programowanie w języku 08.12.2016 66
Łańcuchy - funkcje i procedury Zamiana liczba - łańcuch Val(łańcuch,liczba,kod)- zamiana łańcucha na liczbę (kod<>0 oznacza błąd) Str(liczba,łańcuch) zamiana liczby na łańcuch Programowanie w języku 08.12.2016 67
Tablice dwuwymiarowe Służą do przechowywania ustalonej liczby elementów (liczb całkowitych, rzeczywistych lub znaków) tego samego typu. 1 7 2 13 5 8 3 21 89 55 wiersze 10 1 6 31 7 0 32 51 34 28 88 0 14 3 111 5 714 29 38 51 44 15 7 22 58 87 13 33 59 8 kolumny każde pole posiada dwa indeksy odwołanie do elementu tablicy wygląda tak: nazwa[wiersz, kolumna] tablica[1,3]=2 tablica[2,1]=10 tablica[4,10]=8 Programowanie w języku 08.12.2016 68
Tablice dwuwymiarowe deklaracja klasyczna tablica liczb całkowitych złożona z : 4 wierszy i 10 kolumn o nazwie tabliczka var tabliczka:array[1..4, 1..10] of integer; nazwa l.wierszy, l.kolumn typ elementów Programowanie w języku 08.12.2016 69
Tablice dwuwymiarowe Przypisywanie wartości całej tablicy w podwójnej pętli for i:=1 to 4 do for j:=1 to 10 do tabliczka[i,j]:=wyrażenie; Lub for i:=1 to 4 do for j:=1 to 10 do readln(tabliczka[i,j]); Wyprowadzanie wartości elementów tablicy for i:=1 to 4 do for j:=1 to 10 do write(tabliczka[i,j]); Programowanie w języku 08.12.2016 70
Podprogramy Pewne obliczenia (zestawy instrukcji) mogą być wykonywane w programie wielokrotnie dla takich samych lub innych danych. Korzystne jest wydzielenie takich fragmentów w postaci podprogramów. Podprogram służy do wyodrębnienie pewnego fragmentu programu, stanowiącego pewną całość logiczną w całość fizyczną identyfikowaną za pomocą nazwy. Taki podprogram może być wywołany w wielu miejscach programu. Programowanie w języku 08.12.2016 71
Podprogramy Pascal posiada dwa rodzaje podprogramów Procedury używane do wykonania przez program jakiejś złożonej czynności np. wczytanie lub wydrukowanie zawartości tablicy, wyczyszczenie ekranu itp. Funkcje wykonują zespół instrukcji, którego efektem jest obliczenie jakiejś wartości ( być może poprzez wykonanie wielu rachunków elementarnych) Programowanie w języku 08.12.2016 72
Definicja procedury: procedure nazwa(lista parametrów); var lista zmiennych; begin zestaw instrukcji; end; Procedury Zdefiniowaną procedurę wywołujemy w programie podając jej nazwę z listą parametrów Program TakieCosTam; uses crt; type type Tablica=array[1..10] of real; Tablica=array[1..10] of real; procedure CzytajTablice(var t:tablica); var var i:integer; begin a,b,c,d:tablica; for i:=1 to 10 do Begin begin ClrScr; write( t[,i:2, ]= ); for readln(t[i]); i:=1 to 10 do end; begin end; write( a[,i:2, ]= ); readln(a[i]); write( b[,i:2, ]= ); var readln(b[i]); a, b, write( c[,i:2, ]= ); c, d:tablica; Begin readln(c[i]); ClrScr; write( c[,i:2, ]= ); CzytajTablice(a); readln(c[i]); CzytajTablice(b); CzytajTablice(c); CzytajTablice(d); end; Programowanie w języku end. 08.12.2016 73
Procedury Program TakieCosTam; uses crt; type Tablica=array[1..10] of real; Definicja procedury: procedure nazwa(lista parametrów); var lista zmiennych; begin zestaw instrukcji; end; procedure CzytajTablice(var t:tablica); var i:integer; begin for i:=1 to 10 do begin write( t[,i:2, ]= ); readln(t[i]); end; end; Zdefiniowaną procedurę wywołujemy w programie podając jej nazwę z listą parametrów var a, b, c, d:tablica; Begin ClrScr; CzytajTablice(a); CzytajTablice(b); CzytajTablice(c); CzytajTablice(d); Programowanie w języku end. 08.12.2016 74
Definicja funkcji: function nazwa(lista parametrów):typ funkcji; var lista zmiennych; begin zestaw instrukcji; nazwa:=wyrażenie; end; Typ funkcji to typ wartości obliczanej przez funkcję Funkcje W zestawie instrukcji musi pojawić się instrukcja przypisania wartości obliczanej przez funkcję Funkcję wywołujemy w programie używając jej (z listą parametrów) w instrukcji przypisania Program TakieCosTam; uses crt; function maks(x,y:real):real; begin if x>y then maks:=x else maks:=y; end; var a,b,c:real; begin ClrScr; readln(a); readln(b); c:=maks(a,b);... end. Programowanie w języku 08.12.2016 75
Zmienne globalne i lokalne Pascal wymaga zadeklarowania każdej zmiennej poprzez podanie jej nazwy i typu jest to związane przydzieleniem dla niej miejsca w pamięci operacyjnej W programie głównym deklarujemy zmienne globalne to znaczy takie które są widoczne w całym programie (zmienne globalne mają przydzieloną pamięć przez cały czas pracy programu) W procedurach i funkcjach deklarujemy zmienne lokalne widziane tylko przez podprogram w programie głównym nie są one widoczne (zmienne lokalne mają pamięć przydzieloną tylko na czas wykonywania podprogramu po jego wykonaniu pamięć jest zwalniana a wartość zmiennej ulega zagubieniu) Programowanie w języku 08.12.2016 76
Przekazywanie parametrów Pascal pozwala przekazywać parametry do procedur i funkcji na dwa sposoby przez wartość procedure pisz(t:tablica); var i:integer; begin for i:=1 to 10 do writeln(t[i]); end; wartości parametrów są kopiowane do zmiennych lokalnych po zakończeniu procedury zmiany ulegają zapomnieniu (pozostaje wartość pierwotna parametru) przez zmienną procedure czytaj(var t:tablica); var i:integer; begin for i:=1 to 10 do readln(t[i]); end; procedura otrzymuje dostęp do zmiennej globalnej (adres w pamięci operacyjnej) wprowadzone zmiany pozostają po wykonaniu procedury Programowanie w języku 08.12.2016 77
Przykład komórka zawierająca zapis 0 1 0 0 0 0 0 1 może oznaczać: liczbę 65 lub kod litery A typ Rodzaj danych Zakres wartości rozmiar char znaki Znaki alfabetu ASCII 1 bajt boolean wartości logiczne TRUE/FALSE 1 bajt byte Liczby naturalne [0;255] 1 bajt shortint Liczby całkowite [-128;127] 1 bajt word Liczby naturalne [0;65 535] 2 bajty integer Liczby całkowite [-32 768;32 767] 2 bajty long Liczby całkowite [-2147483648;2147483647] 4 bajty real Liczby rzeczywiste (-1,7 38 ;1,7 38) 11-12 cyfr znaczących 6 bajtów single Liczby rzeczywiste (-3,4 38 ;3,4 38 ) 7-8 cyfr znaczących 4 bajtów double Liczby rzeczywiste (-1,7 308 ;1,7 308) 15-16 cyfr znaczących 8 bajtów extended Liczby rzeczywiste (-1,1 4932 ;1,1 4392) 19-20 cyfr znaczących 10bajtów Programowanie w języku 08.12.2016 78
Deklaracja własnych typów danych Oprócz standardowych typów danych użytkownik może definiować własne Definicję rozpoczynamy kluczowym słowem TYPE Po którym następuje definicja: nazwa_typu=opis_typu; Programowanie w języku 08.12.2016 79
Deklaracja własnych typów danych Przykład: definiujemy typ napisowy o długości 20 znaków: tekst20=string[20]; definiujemy 10 elementową tablicę liczb całkowitych tab10int=array[1..10] of integer; Po zdefiniowaniu typu deklarujemy zmienną, która będzie ten typ wykorzystywała type tekst=string[30]; var komunikat:tekst; begin komunikat:= wszystko gra ;... Programowanie w języku 08.12.2016 80
Typ wyliczeniowych Używany jest gdy pewne wartości stałe używane w programie mają odpowiedniki tekstowe [identyfikatory]: type nazwa_typu =(lista identyfikatorów); Przykładem mogą być oceny... 1)Wykaz identyfikatorów <=255 pozycji 2)Nie mogą być słowami zastrzeżonymi 3)Są ponumerowane od 0 do n-1 type oceny=(niedostateczny,dopuszczajacy,dostateczny,dobry,bardzo_dobry,celujacy); var odp, kl, pk : oceny; Programowanie w języku 08.12.2016 81
Typ wyliczeniowych Używany jest gdy pewne wartości stałe używane w programie mają odpowiedniki tekstowe [identyfikatory]: Dostępne funkcje: ORD(identyfikator) zwraca numer identyfikatora ORD( dobry )=3 PRED(identyfikator) zwraca poprzedni identyfikator PRED( dobry )= dostateczny SUCC(identyfikator) - zwraca następny identyfikator SUCC( dobry )= bardzo _dobry Programowanie w języku 08.12.2016 82
Typ okrojony Dotyczy konkretnego typu bazowego. Zbiór wartości typu okrojonego jest podzbiorem zbioru wartości typu bazowego. Definiujemy jak każdy inny typ użytkownika (potem deklarujemy zmienną nowozdefiniowanego typu) Możemy zdefiniować typ podczas deklarowania zmiennych type miesiac=1..12; var mc_ur : miesiac; var mc_ur : 1..12; dz_ur : 1..31; Próba nadania zmiennej typu okrojonego wartości spoza zakresu kończy się błędem wykonania Programowanie w języku 08.12.2016 83
Rekordy dostęp do pól Rekord jest zmienną złożoną [strukturą] służącą do przechowywania danych różnego typu. Każde pole ma nazwę Każde pole ma określony typ danych,które przechowuje rekord data rekord osoba dzień l.całkowita miesiąc l.całkowita rok l.całkowita nazwisko łańcuch imię łańcuch wiek l.całkowita Programowanie w języku 08.12.2016 84
Rekordy dostęp do pól rekord osoba nazwisko łańcuch imię łańcuch wiek l.całkowita type osoba=record imie:string[30]; nazwisko:string[50]; wiek:integer; end; Deklaracja zmiennych rekordowych: var uczen, nauczyciel, dyrektor : osoba; Programowanie w języku 08.12.2016 85
Rekordy Dostęp do pól rekordu (wprowadzanie lub wyprowadzanie danych) uzyskujemy: var Podając nazwę zmiennej (rekordu) i nazwę pola oddzieloną kropką Korzystając z instrukcji with podajemy nazwę zmiennej a następnie używamy tylko nazwy pola uczen,nauczyciel:osoba; begin readln(uczen.nazwisko); readln(uczen.imie); readln(uczen.wiek);... var uczen,nauczyciel:osoba;... with uczen do begin readln(nazwisko); readln(imie); readln(wiek); end;... Programowanie w języku 08.12.2016 86
Pliki Pliki zawierają dane przechowywane w pamięci dyskowej są zachowywane po zakończeniu pracy z programem Pliki reprezentowane są w programie przez zmienną plikową Zmienna plikowa musi zostać związana ze znajdującym się na dysku plikiem fizycznym [Plik fizyczny stanowi obszar pamięci dyskowej identyfikowalny poprzez nazwę] Podczas pracy programu dane z pliku są sprowadzane do pamięci operacyjnej tam są przetwarzane Programowanie w języku 08.12.2016 87
Pliki Dane w plikach są zapisywane po kolei (sekwencyjnie) można je odczytywać po kolei lub zażądać odczytania elementu o określonym numerze. Liczba elementów w pliku jest dowolna (ograniczona wolnym miejscem na dysku) Po przetworzeniu dane mogą być zapisane do tego samego lub innego pliku Programowanie w języku 08.12.2016 88
Pliki - rodzaje Pliki tekstowe składają się ze znaków kodów ASCII pogrupowanych we wiersze o różnej długości Wiersz kończy się parą znaków CR LF (#10 #13) Plik kończy się znakiem końca pliku EOF (#26) Pliki binarne dane zapisane są binarnie (liczby dwójkowe) nie nadają się do bezpośredniego oglądania wymagają interpretacji przez program Pliki zdefiniowane składają się z elementów o określonej strukturze (np. ze zdefiniowanych w programie rekordów) Pliki niezdefiniowane poszczególne porcje danych mogą mieć różny rozmiar i różne znaczenie program odczytujący musi wiedzieć co tam jest Programowanie w języku 08.12.2016 89
Pliki - przetwarzanie Deklaracja zmiennej plikowej zm_plik:rodzaj pliku; text plik tekstowy file of element - plik elementów File plik niezdefiniowany Skojarzenie zmiennej z plikiem fizycznym Otwarcie pliku Wykonanie operacji na pliku ReWrite(zm_plik); Reset(zm_plik); Append(zm_plik); Assign(zm_plik, nazwa pliku); Read(zm_plik, lista zmiennych); Write(zm_plik, lista zmiennych); nazwa pliku ze ścieżką dostępu nowy pliku do zapisu danych plik do odczytu danych plik tekstowy do dopisania danych na końcu Zamknięcie pliku Close(zm_plik); plik otwarty musi zostać zamknięty Programowanie w języku 08.12.2016 90
Pliki - przydatne funkcje EOF(zm_plik) zwraca TRUE gdy osiągnięto koniec pliku EOLN(zm_plik) zwraca TRUE gdy osiągnięto koniec linii w pliku tekstowym Seek(zm_plik,n) ustawia wskaźnik pliku na elemencie o numerze n FilePos(zm_plik) zwraca aktualną pozycję wskaźnika pliku FileSize(zm_plik) zwraca liczbę elementów pliku IOResult zwraca 0 gdy ostatnią operację na pliku wykonano pomyślnie w przeciwnym wypadku zwraca kod błędu Programowanie w języku 08.12.2016 91
PROBLEM ALGORYTM PROGRAM ŹRÓDŁOWY PROGRAM WYKONYWALNY KOMPUTER ETAPY PROGRAMOWANIA 0. WYBÓR-ZNALEZIENIE- OPRACOWANIE ALGORYTMU 1. IMPLEMENTACJA to zapis algorytmu w języku programowania 2. TRANSLACJA to tłumaczenie programu źródłowego na kod maszynowy 3. URUCHOMIENIE programu 4. TESTOWANIE programu 12/8/2016 Język Pascal - Grafika 92
program pole_kola; uses crt; const pi=3.14; var p,r:real; begin writeln( pole koła ); writeln('podaj promień'); readln(r); p:=pi*r*r*; nagłówek programu część deklaracyjna część wykonawcza writeln(pole koła wynosi,p:4:2) end. program nazwa; uses lista modułów; const nazwa=wartość; var lista zmiennych:typ; begin instrukcje programu end. nazwa jest jednym wyrazem (nie spacji), nie zawiera polskich liter deklaracje modułów moduły to zbiory funkcji i procedur, które możemy wykorzystywać w naszych programach definicje stałych deklaracje zmiennych wszystkie zmienne występujące w programie muszą być wcześniej zadeklarowane Kolejność zapisywania instrukcji odpowiada kolejności wykonywania Instrukcje oddzielamy średnikiem 08.12.2016 Programowanie w języku Pascal 93
Pascal posiada dwa rodzaje podprogramów Procedury używane do wykonania przez program jakiejś złożonej czynności np. wczytanie lub wydrukowanie zawartości tablicy, wyczyszczenie ekranu itp. Funkcje wykonują zespół instrukcji, którego efektem jest obliczenie jakiejś wartości ( być może poprzez wykonanie wielu rachunków elementarnych) 12/8/2016 Język Pascal - Grafika 94
Program TakieCosTam; uses crt; type tablica=array[1..10] of integer; procedure nazwa (lista parametrów); var lista zmiennych; begin zestaw instrukcji; end; procedure WypiszTablice(var t:tablica); var i:integer; begin writeln ('Zawartosc tablicy:'); for i:=1 to 10 do writeln('t[',i:2,']=', t[i]); end; var a,b :tablica; i:integer; Zdefiniowaną procedurę wywołujemy w programie podając jej nazwę z listą parametrów Begin for i:=1 to 10 do begin a[i]:=i*2; b[i]:= i; end; WypiszTablice(a); WypiszTablice(b); end. 12/8/2016 Język Pascal - Grafika 95
function nazwa (lista param.):typ ; var lista zmiennych; begin zestaw instrukcji; nazwa := wartość end; Zdefiniowaną funkcję wywołujemy w programie podając jej nazwę z listą parametrów w miejscu gdzie może wystąpić wyrażenie Program funkcja; uses crt; type Tablica=array[1..10] of integer; function srednia (var t:tablica): real; var i, suma : integer; suma := 0; begin for i:=1 to 10 do suma := suma + t[i]; srednia := suma/10; end; var a,b :tablica; i:integer; Begin for i:=1 to 10 do begin a[i]:=i*2; b[i]:= i; end; writeln('srednia tablicy a =', srednia(a)); writeln('srednia tablicy b = ', srednia(b)); end. Język Pascal - Grafika 96
W programie głównym deklarujemy zmienne globalne to znaczy takie które są widoczne w całym programie (zmienne globalne mają przydzieloną pamięć przez cały czas pracy programu) W procedurach i funkcjach deklarujemy zmienne lokalne widziane tylko przez podprogram w programie głównym nie są one widoczne (zmienne lokalne mają pamięć przydzieloną tylko na czas wykonywania podprogramu po jego wykonaniu pamięć jest zwalniana, a wartość zmiennej ulega zagubieniu) 12/8/2016 Język Pascal - Grafika 97
Program zmienne; uses crt; var zmienna_1 : integer; procedure pierwsza ( ); var zmienna_2 :integer; //zmienna globalna //zmienna lokalna w procedurze begin zmienna_2 :=2; writeln('w procedurze zmienna_1 = ', zmienna_1:2); writeln('w procedurze zmienna_2 = ', zmienna_2:2); writeln('w procedurze zmienna_3 = ', zmienna_3:2); end; var zmienna_3 : integer; ; //zmienna lokalna w procedurze głównej begin zmienna_3:=3 zmienna_1 :=1; writeln('zmienna_1 = ', zmienna_1:2); writeln('zmienna_2 = ', zmienna_2:2); writeln('zmienna_3 = ', zmienna_3:2); pierwsza(); end. 12/8/2016 Język Pascal - Grafika 98
procedure p_1(a_1 : integer); begin writeln (procedura p_1 parametr a_1 = ', a_1:3); a_1:=21; writeln (procedura p_1 parametr a_1 = ', a_1:3); end; procedure p_2(var a_2 : integer); begin writeln (procedura p_2 parametr a_2 = ', a_2 :3); a_2:=45; writeln (procedura p_2 parametr a_2 = ', a_2 :3); end; var b : integer; begin b :=10; writeln (program glowny b = ', b:3); p_1( b ); writeln ('po pocedurze p_1 b = ', b:3); b:=10; p_2( b ); writeln ('po pocedurze p_2 b = ', b:3); end. 12/8/2016 Język Pascal - Grafika 99
Wszystkie polecenia języka Turbo Pascal zostały uporządkowane w postaci grup zwanych modułami (ang. units). Istnieje kilka standardowych modułów, które zostały dołączone do programu Pascal (System, Dos, Crt, Printer, Graph, itp.) Moduł standardowy System jest dostępny automatycznie. Pozostałe wymagają świadomego dołączenia przez programistę. Możliwe jest również tworzenie własnych modułów. 12/8/2016 Język Pascal - Grafika 100
Wśród modułów standardowych wyróżniamy: System zawiera procedury standardowe języka; Crt zawiera procedury obsługi ekranu, klawiatury i sterowania dźwiękami emitowanymi przez głośnik komputera; Dos zawiera procedury współpracujące z systemem operacyjnym; Graph zawiera procedury potrzebne do tworzenia grafiki; 12/8/2016 Język Pascal - Grafika 101
Aby móc korzystać z procedur któregoś z modułów należy zadeklarować jego użycie (nie dotyczy to modułu System, który jest automatycznie deklarowany przez program Pascal). Moduł deklaruje się poprzez użycie słowa uses, a dalej podje się nazwę modułu lub modułów oddzielając je program polekola; przecinkami. uses crt, graph; const pi=3.14; 12/8/2016 Język Pascal - Grafika 102 var p,r:real; begin instrukcje end.
ClrScr - czyści ekran i ustawia kursor w lewym górnym rogu (pozycja 0:0) Delay(MS : word) - zatrzymuje program na określoną ilość milisekund. GotoXY(X, Y : byte) - przesuwa kursor do punktu x:y KeyPressed { : Boolean } - sprawdza aktywność klawiatury ReadKey { : Char } - wczytuje znak z klawiatury TextBackground(color : byte) - zmienia kolor tła TextColor(color : byte) - zmienia kolor tekstu 12/8/2016 Język Pascal - Grafika 103
program pierwszy; uses crt; begin TextBackground ( 7 ); ClrScr; //deklaracja użycia modułu Crt //zmienia kolor tła na szary //czyścimy ekran GotoXY(30, 13); //umieszczamy kursor w pozycji 30:13 TextColor ( 4 ); write ( To jest pierwszy tekst ); end. //zmieniamy kolor czcionki na czerwony //i piszemy 12/8/2016 Język Pascal - Grafika 104
program drugi; uses crt; begin TextBackground (3); ClrScr; //deklaracja użycia modułu Crt //zmienia kolor tła na niebieski //czyścimy ekran GotoXY (0,0); //umieszczamy kursor w pozycji 0:0 TextColor (4); write ( To jest pierwszy tekst ); //zmieniamy kolor czcionki na różowy //i piszemy GotoXY (10,10); //umieszczamy kursor w pozycji 10:10 TextColor (4); write ( To jest drugi tekst ); end. //zmieniamy kolor czcionki na zielony //i piszemy 12/8/2016 Język Pascal - Grafika 105
program trzeci; uses crt; var i:byte; begin ClrScr; textcolor (1); for i:=0 to 10 do begin textcolor (i); writeln; writeln(' To jest kolor nr - ', i:2); end; readln; end. 12/8/2016 Język Pascal - Grafika 106
Moduł Graph obsługuje operacje ekranowej grafiki punktowej (pikselowej). Zawiera procedury i funkcje, które umożliwiają rysowanie na ekranie monitora krzywych różnych kształtów i kolorów, wypełnianie obszarów określonym wzorem i kolorem, wykreślanie tekstów o zdefiniowanej przez użytkownika wielkości wybraną czcionką w poziomie lub pionie. Umiejętne wykorzystanie zasobów modułu pozwala również na tworzenie rysunków animowanych 12/8/2016 Język Pascal - Grafika 107
Tryb graficzny jest ściśle związany z kartą graficzną, w jaką jest wyposażony komputer. Podczas inicjowania trybu graficznego należy określić właściwy dla danego sprzętu sterownik i tryb pracy ekranu. Do tego służy procedura DetectGraph. DetectGraph (sterownik, tryb); sterownik identyfikator karty sterownika graficznego; tryb tryb graficzny (rozdzielczość, ilość kolorów); 12/8/2016 Język Pascal - Grafika 108
Z przeważającej większości procedur i funkcji modułu graficznego można korzystać dopiero po zainicjowaniu graficznego trybu pracy monitora, czyli wywołaniu procedury InitGraph: InitGraph (sterownik: Integer, tryb: Integer, ścieżka: String); sterownik identyfikator karty sterownika graficznego; tryb tryb graficzny (rozdzielczość, ilość kolorów); ścieżka katalog, w którym znajduje się sterownik *.bgi Przejście do trybu graficznego powoduje przydzielenie części pamięci operacyjnej dla potrzeb realizacji operacji graficznych. Po zakończeniu ich wykonywania należy zwolnić tę część pamięci i przywrócić poprzedni tryb tekstowy za pomocą procedury CloseGraph 12/8/2016 Język Pascal - Grafika 109
Dla prawidłowej pracy monitora w trybie graficznym potrzebne są programy obsługujące zainstalowaną w komputerze kartę graficzną. Programy takie nazwano sterownikami (ang. Drivers). W systemie TurboPascal zdefiniowano sterowniki dla 8 najpopularniejszych kart graficznych komputerów klasy IBM: CGA, MCGA, EGA, VGA, Hercules, ATT400, IBM8514, IBM3270PC. Sterownikom tym nadano rozszerzenie BGI (Borland Graphics Interface) 12/8/2016 Język Pascal - Grafika 110
Wszystkie operacje graficzne wykonywane są w obrębie okna graficznego. W momencie inicjacji trybu graficznego okno zajmuje cały ekran. Lewy, górny róg ekranu ma współrzędne (0,0) i jest początkiem układu, którego oś pionowa jest skierowana w dół, a oś pozioma - w prawo. Współrzędne prawego dolnego rogu są określone przez funkcje GetMaxX, GetMaxY i zależą od rozdzielczości ekranu i jego trybu pracy. 12/8/2016 Język Pascal - Grafika 111
program linia; uses Graph, Crt; var sterownik, tryb, karta : SmallInt; begin DetectGraph(sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor (4); //ustawiamy kolor Line (30,30,610,450); //rysujemy linie od punktu (30,30) do punktu (610,450) Repeat Until Keypressed; CloseGraph; //zamykanie trybu graficznego repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 112
Procedura SetLineStyle SetLineStyle (Rodzaj_Lin, Wzor, Grubosc : word); zmienia rodzaj linii oraz jej grubość używanej przy procedurach Line, Circle. Rodzaje linii to: SolidLn = 0 - ciągła DottedLn = 1 - kropkowana CenterLn = 2 - symetryczna DashedLn = 3 - przerywana 12/8/2016 Język Pascal - Grafika 113
program linia_2; uses Graph, Crt; var sterownik, tryb, karta : SmallInt; begin DetectGraph(sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor (4); //ustawiamy kolor SetLineStyle(3,0,3); //ustawiamy rodzaj linii Line (30,30,610,450); //rysujemy linie od punktu (30,30) do punktu (610,450) SetColor (7); //ustawiamy kolor SetLineStyle(1,0,1); //ustawiamy rodzaj linii Line (30,50,610,500); //rysujemy linie od punktu (30,50) do punktu (610,500) Repeat Until Keypressed; CloseGraph; //zamykanie trybu graficznego repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 114
program kwadrat_i_kolo; uses Graph, Crt; var sterownik, tryb : SmallInt; begin DetectGraph (sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor(Green); SetLineStyle(0,0,3); //ustawiamy rodzaj linii Rectangle(30,30,120,120); //rysowanie kwadratu SetColor (Yellow); SetLineStyle (3,0,3); //ustawiamy rodzaj linii Circle(150, 150, 100); //rysowanie kola repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 115
Procedura SetFillStyle SetFillStyle (nr_wzorca, kolor : word); zmienia rodzaj i kolor wypełnienia konturów wykorzystywanych przez niektóre procedury. Domyślne ustawienia początkowe to wzorzec wypełniania ciągłego i numer koloru będący maksymalnym kolorem aktualnego trybu graficznego. 12/8/2016 Język Pascal - Grafika 116
EmptyFill = 0 - wypełnienie kolorem tła SolidFill = 1 - wypełnienie ciągłe LineFill = 2 - wypełnienie pogrubionymi liniami poziomymi LtSlashFill = 3 - wypełnienie liniami pochyłymi w prawo SlashFill = 4 - wypełnienie pogrubionymi liniami pochyłymi w prawo BkSlashFill = 5 - wypełnienie pogrubionymi liniami pochyłymi w lewo LtBkSlashFill = 6 - wypełnienie liniami pochyłymi w lewo HatchFill = 7 - wypełnienie siatką pionową xhatchfill = 8 - wypełnienie siatką ukośną InteerleaveFill = 9 - wypełnienie liniami splecionymi VideDotFill = 10 - wypełnienie kropkami CloseDotFill = 11 - wypełnienie zagęszczonymi kropkami UserFill = 12 - wypełnienie wzorem zdefiniowanym przez użytkownika procedurą SetFillPattern 12/8/2016 Język Pascal - Grafika 117
Procedura FloodFill FloodFill(X, Y : Integer; kolorgranicy : word); wypełnia kolorem i wzorem podanym w procedurze SetFillStyle (sposób_wypełniani, kolor_granicy) obszar ekranu. Jeżeli przy wypełnianiu napotka linię, wykonaną kolorem kolor granicy przerywa wypełnianie tak jakby to był dla niej mur nie do przejścia Punkt X, Y jest miejscem od którego procedura zaczyna wypełnianie. 12/8/2016 Język Pascal - Grafika 118
program kwadrat_1_fill; uses Graph, Crt; var sterownik, tryb : SmallInt; begin DetectGraph (sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor(Green); SetLineStyle(0,0,3); //ustawiamy rodzaj linii Rectangle(30,30,120,120); //rysowanie kwadratu SetFillStyle(1, red); //ustawiamy sposób wypelniania FloodFill (90, 90, Green); //wypelnienie repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 119
program kwadrat_2_fill; uses Graph, Crt; var sterownik, tryb : SmallInt; begin DetectGraph (sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor(Green); SetLineStyle(0,0,3); //ustawiamy rodzaj linii Rectangle(30,30,120,120); //rysowanie kwadratu SetFillStyle(1, red); //ustawiamy sposób wypelniania FloodFill (130, 130, Green); //wypelnienie repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 120
program kwadraty; uses Graph, Crt; var sterownik, tryb : SmallInt; begin DetectGraph (sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor ( Green); Rectangle (30,30,120,120); //rysujemy kwadrat Circle (150, 150, 100); //rysujemy okrąg SetFillStyle(1, red); //ustawianie sposobu wypełniania FloodFill ( 50, 50, Green); //funkcja wypełniająca repeat until keypressed; CloseGraph; //zamykanie trybu graficznego repeat until keypressed; end. 12/8/2016 Język Pascal - Grafika 121
Bar(X1, Y1, X2, Y2) : rysuje wypełniony prostokąt. X1,Y1 to współrzędne lewego górnego rogu, X2,Y2 to współrzędne prawego dolnego rogu. Kolor ramki jest określany przez procedurę SetColor, a kolor wypełnienia przez procedurę SetFillStyle. Bar3D(X1, Y1, X2, Y2; B; TOP) : rysuje trójwymiarowy prostokąt wypełniony. X1,Y1 to współrzędne lewego górnego rogu przedniej ścianki, X2,Y2 to współrzędne lewego dolnego rogu przedniej ścianki, zmienna B jest to głębokość prostopadłościanu, zmienna TOP określa czy górna powierzchnia jest widoczna czy nie. 12/8/2016 Język Pascal - Grafika 122
PutPixel (X, Y; Kolor) : wyświetla jeden punkt o współrzędnych (X, Y) i podanym kolorze. OutTextXY(X, Y, S) : wyświetla na ekranie tekst określony przez zmienną S rozpoczynając od współrzędnych X, Y. Kolor tekstu podawany jest przez procedurę SetColor. ClearDevice : procedura ta czyści ekran graficzny, analogicznie do procedury ClrScr w trybie graficznym 12/8/2016 Język Pascal - Grafika 123