Programowanie w języku Pascal Dr inż. Grażyna KRUPIŃSKA grazyna@novell.ftj.agh.edu.pl D-10 pokój 227
Od algorytmu do programu PROBLEM ALGORYTM PROGRAM ŹRÓDŁOWY wykonywalnego ETAPY PROGRAMOWANIA 0. WYBÓR-ZNALEZIENIE- OPRACOWANIE ALGORYTMU 1. IMPLEMENTACJA to zapis algorytmu w języku programowania PROGRAM WYKONYWALNY KOMPUTER 2.TRANSLACJA to tłumaczenie programu źródłowego na kod maszynowy 3. URUCHOMIENIE programu 4. TESTOWANIE programu 12/1/2011 Język Pascal - Grafika 2
Struktura programu w Pascalu nazwa jest jednym wyrazem (bez spacji) nazwa nie zawiera polskich liter program polekola; uses crt; const pi=3.14; var p,r:real; 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 deklaracje modułów moduły to zbiory funkcji i procedur, które możemy wykorzystywać w naszych programach nazwa=wartość; definicje stałych var lista zmiennych:typ; deklaracje zmiennych wszystkie zmienne występujące w programie muszą być wcześniej zadeklarowane instrukcje programu end. Kolejność zapisywania instrukcji odpowiada kolejności wykonywania Instrukcje oddzielamy średnikiem 2011-12-01 Programowanie w języku Pascal 3
Dokładność obliczeniowa program dokladnosc; var x,y,z : Real; x := 7.244; y := sqrt(x); z := x - y*y; write ('Dokladnosc maszynowa wyniosla '); writeln(z); writeln ('... nacisnij klawisz ENTER'); readln; end. 12/1/2011 Język Pascal - Grafika 4
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) 12/1/2011 Język Pascal - Grafika 5
Procedura Program TakieCosTam; uses crt; type Tablica=array[1..10] of integer; procedure nazwa (lista parametrów); var lista zmiennych; zestaw instrukcji; end; procedure WypiszTablice(var t:tablica); var i:integer; 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 a[i]:=i*2; b[i]:= i; end; WypiszTablice(a); WypiszTablice(b); 12/1/2011 Język Pascal - Grafika 6 end.
Funkcja Program funkcja; uses crt; type Tablica=array[1..10] of integer; function nazwa (lista param.):typ ; var lista zmiennych; zestaw instrukcji; nazwa := wartość end; function srednia (var t:tablica): real; var i, suma :integer; Begin suma := 0; 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 a[i]:=i*2; b[i]:= i; end; writeln('srednia tablicy a =',srednia(a)); writeln('srednia tablicy b = ',srednia(b)); end. 12/1/2011 Język Pascal - Grafika 7
Zmienne globalne i lokalne 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/1/2011 Język Pascal - Grafika 8
Program zmienne; uses crt; var zmienna_1 : integer; //zmienna globalna Zmienne globalne i lokalne procedure pierwsza ( ); var zmienna_2 :integer; //zmienna lokalna w procedurze 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 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/1/2011 Język Pascal - Grafika 9
Przekazywanie parametrów procedure p_1(a_1:integer); a_1:=21; end; procedure p_2(var a_2:integer); a_2:=45; end; var b:integer; Begin b :=10; 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/1/2011 Język Pascal - Grafika 10
Moduły 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/1/2011 Język Pascal - Grafika 11
Moduły 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/1/2011 Język Pascal - Grafika 12
Moduły 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). program polekola; Moduł deklaruje się poprzez użycie uses crt, słowa graph; uses, a const dalej podje się nazwę modułu lub modułów oddzielając je przecinkami. pi=3.14; var p,r:real; instrukcje end. 12/1/2011 Język Pascal - Grafika 13
Moduł Crt 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/1/2011 Język Pascal - Grafika 14
Moduł Crt program pierwszy; uses crt; TextBackground(7); //deklaracja użycia modułu Crt //zmienia kolor tła na szary ClrScr; //czyścimy ekran GotoXY(30,13); //umieszczamy kursor w pozycji 30:13 TextColor(4); //zmieniamy kolor czcionki na czerwony write( To jest pierwszy tekst ); //i piszemy end. 12/1/2011 Język Pascal - Grafika 15
Moduł Crt program drugi; uses crt; TextBackground(3); //deklaracja użycia modułu Crt //zmienia kolor tła na niebieski ClrScr; //czyścimy ekran GotoXY(0,0); //umieszczamy kursor w pozycji 0:0 TextColor(4); //zmieniamy kolor czcionki na różowy write( To jest pierwszy program ); //i piszemy GotoXY(10,10); //umieszczamy kursor w pozycji 10:10 TextColor(4); //zmieniamy kolor czcionki na zielony write( To jest pierwszy program ); //i piszemy end. 12/1/2011 Język Pascal - Grafika 16
Moduł Crt program trzeci; uses crt; var i:byte; ClrScr; textcolor(1); for i:=0 to 10 do textcolor(i); writeln; writeln(' To jest kolor nr - ',i:2); end; readln; end. 12/1/2011 Język Pascal - Grafika 17
Moduł Graph Moduł Graphobsł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/1/2011 Język Pascal - Grafika 18
Inicjalizacja trybu graficznego Tryb graficznyjest ś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/1/2011 Język Pascal - Grafika 19
Inicjalizacja trybu graficznego 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/1/2011 Język Pascal - Grafika 20
Inicjalizacja trybu graficznego 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 TurboPascalzdefiniowano 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/1/2011 Język Pascal - Grafika 21
Okno graficzne 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, GetMaxYi zależą od rozdzielczości ekranu i jego trybu pracy. 12/1/2011 Język Pascal - Grafika 22
Prosty program graficzny program linia; uses Graph, Crt; var sterownik, tryb, karta : SmallInt; 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/1/2011 Język Pascal - Grafika 23
Prosty program graficzny program kwadraty; uses Graph, Crt; var sterownik, tryb : SmallInt; DetectGraph (sterownik,tryb); //inicjalizacja trybu graficznego InitGraph (sterownik,tryb,'c:\program Files\Dev-Pas'); SetColor ( Green); Rectangle (30,30,120,120); //rysowanie kwadratów Rectangle (10,10,100,100); repeat until keypressed; CloseGraph; //zamykanie trybu graficznego repeat until keypressed; end. 12/1/2011 Język Pascal - Grafika 24
Prosty program graficzny program kwadraty; uses Graph, Crt; var sterownik, tryb : SmallInt; 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/1/2011 Język Pascal - Grafika 25
Procedura FloodFill Funkcja FloodFill FloodFill(X, Y : Integer; kolorgranicy : Word); wypełnia kolorem i wzorem podanym w procedurze SetFillStyle obszar ekranu. Jeżeli przy wypełnianiu napotka linię, wykonaną kolorem kolorgranicy 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/1/2011 Język Pascal - Grafika 26
Kolejne procedury 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. 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/1/2011 Język Pascal - Grafika 27
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 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 2011-12-01 Programowanie w języku Pascal 28
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 2011-12-01 Programowanie w języku Pascal 29
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 2011-12-01 Programowanie w języku Pascal 30
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 2011-12-01 Programowanie w języku Pascal 31