INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl Wprowadzenie Pascal Turbo Pascal Free Pascal FPC, HUGO, Lazarus Object Pascal Borland Delphi Język rzadko już stosowany, ale dzięki swojej konstrukcji IDEALNY do nauki programowani, implementacji programistycznej algorytmów Mając opanowane podstawy programowania w Pascal u łatwo nauczyć się programować w dowolnym języku 2 Zakres wykładu Środowisko programowania Free Pascal Compiler Struktura (szkielet) programu Komentarz Zmienne, deklaracje zmiennych Stałe, deklaracje stałych Funkcje konwersji zmiennych Instrukcje wejścia-wyjścia Działania matematyczne 3 1
Free Pascal Kompilator Pascal a dla 16, 32 i 64 bitowych procesorów Strona projektu: http://www.freepascal.org/ Kompilator v. 3.0.2. dostępny dla: ARM Intel/i386 PowerPC(64) AMD64/Intel64 Inne Game Boy Adv. Nintendo DS. Linux Windows CE Android DOS Linux Mac OS X Solaris Windows 32-bit AIX Linux Mac OS X Nintendo WII Linux FreeBSD Solaris Windows 64-bit SPARC I8086 MIPS Środowisko projektowania wizualnego: Lazarus - http://www.lazarus-ide.org/ 4 Środowisko FPC a. b. c. a) Menu główne b) Nazwa programu c) Numer aktywnego okna d) Wskaźnik położenia kursora e) Wiersz informacji f) Ekran edycji kodu f. d. e. 5 Środowisko FPC Nowy projekt Nowy projekt z szablonu Otworzenie istniejącego projektu Zapis pliku Wydruk Domyślny katalog roboczy Powłoka Wyjście Lista ostatnich projektów 6 2
Środowisko FPC Zapisany projekt może zostać skompilowany Alt+F9 Dla prawidłowego projektu zostanie utworzony plik wykonawczy *.exe 7 Środowisko FPC Kompilacja i uruchomienie Nawigacja po kodzie przy debugowaniu 8 Środowisko FPC Błędna kompilacja Informacja o błędach Wskazanie na linię kodu zawierającą błąd 9 3
Środowisko FPC Debug kontrola wykonania poszczególnych kroków programu Ułatwia analizę działania kodu, przepływu danych Pomaga w poszukiwaniu błędów 10 Struktura programu FPC Nagłówek programu program uses const type var label procedure function (Nazwa programu); Blok deklaracji (Moduły); (Stałe); (Typy); (Zmienne); (Etykiety); (Procedury); (Funkcje); 11 Struktura programu FPC Blok wykonawczy begin begin end; if then else goto repeat until for to/downto do while do with..do case of else end := procedura funkcja (Instrukcja złożona) (instrukcja warunkowa) (Instrukcja skoku) (Instrukcja Powtarzaj ) (Instrukcja pętli) (Instrukcja dopóki) (Instrukcja wiążąca) (Instrukcja wyboru) (Instrukcja przypisania) (Wywołanie procedury) (Wywołanie funkcji) end. 12 4
Struktura programu FPC Nagłówek programu Blok deklaracji Blok wykonawczy 13 Zmienne Integer -32 768 32 767 16, 32 lub 64bit 2, 4 lub 8 B Int64-2 63 2 63-1 64bit 8 B SmallInt -32 768 32 767 16bit 2 B ShortInt -128 127 8bit 1 B Byte 0 255 8bit 1 B Word 0 65 535 16bit 2 B LongWord 0 4 294 967 295 32bit 4 B Char Pojedynczy znak 8bit 1 B 14 Zmienne Boolean True lub False, 0 lub 1 8bit 1 B ShortString 255 znaków AnsiString String Extended Double Single Currency 2 31 znaków Praktycznie bez limitu 3,6 x 10-4951 5,0 x 10-324 1,5 x 10-45 8, 16, 24 bit 1,1 x 10 4932 80bit 10 B 1,7 x 10 308 64bit 8 B 3,4 x 10 38 32bit 4 B -922 337 203 685 477,5808 64bit 922 337 203 685 477,5807 1, 2 lub 3B 8 B 15 5
Zmienne i stałe Cechą charakterystyczną składni Pascal a jest to, że praktycznie każda linia kodu kończy się znakiem ; 16 Systemy liczbowe System dwójkowy (system binarny, pozycyjny) liczby zapisywane za pomocą dwóch cyfr 0 i 1. Podstawą systemu jest liczba 2. System dziesiętny system pozycyjny zapisywany za pomocą cyfr od 0 do 9, podstawą systemu jest cyfra 10 System szesnastkowy system hexadecymalny, o podstawie 16, do zapisu wykorzystuje się cyfry 0 do 9 i litery A, B, C, D, E i F 17 Dwójkowy na dziesiętny 53 53:2=26 reszty 1 26:2=13 reszty 0 13:2=6 reszty 1 3:2=3 reszty 0 3:2=1 reszty 1 1:2=0 reszty 1 1011101 1 0 1 1 1 0 1 6 5 4 3 2 1 0 (1*2 6 )+(0*2 5 )+(1*2 4 )+(1*2 3 ) +(1*2 2 )+(0*2 1 )+(1*2 0 )= 64+16+8+4+1= 93 110101 93 18 6
Szesnastkowy na 0 0 0000 12188 101110101101 1 1 0001 2 2 0010 C 12188:16=761 reszty 12 1011 1010 1101 3 3 0011 761:16=47 reszty 9 47:16:2 reszty 15 F 4 4 0100 2:16=0 reszty 2 B A D 5 5 0101 BAD 6 6 0110 2F9C 2 1 0 7 7 0111 2 F 9 C 8 8 1000 3 2 1 0 9 9 1001 10 A 1010 11 B 1011 12 C 1100 13 D 1101 14 E 1110 (2*16 3 )+(F*16 2 )+(9*16 1 )+(C*16 0 )= (2*16 3 )+(15*16 2 )+(9*16 1 )+(12*16 0 )= (2*4096)+(15*256)+(9*16)+(12*0)= 8192+3840+144+12= 12188 (11*16 2 )+(10*16 1 ) +(13*16 0 )= (11*256)+(10*16) +(13*1)= 2816+160+13= 2989 15 F 1111 12188 2989 19 Wyjścia-Wyjścia Program komputerowy komunikuje się z użytkownikiem za pomocą standardowych portów wejścia-wyjścia Wejścia: Klawiatura Dysk (plik) Myszka (inne urządzenie wskazujące) Wyjścia: Ekran monitora Dysk (plik) 20 Wejścia-Wyjścia Podstawowa komunikacja z portem wyjściowym, ekranem, realizowana jest za pomocą instrukcji : write( text, zmienna); writeln( text, zmienna); Druga wersja dodatkowo przenosi kursor do nowej linii w konsoli Wyświetla tekst ujęty w apostrofach lub zawartość zmiennej 21 7
Wejścia-Wyjścia Przy wyświetlaniu danych liczbowych możliwe jest sformatowanie jest do postaci wymaganej Liczba cyfr wyświetlana Liczba cyfr po przecinku Pi:=3.141592654; writeln(pi:4:3); writeln(25*pi:6:3); writeln(3.141592654:5:4) 22 Wejścia-Wyjścia Podstawowym wejściem programu jest klawiatura Komunikacja realizowana jest za pomocą funkcji: read(zmienna); readln(zmienna); Dodatkowa funkcja zatrzymanie działania programu i oczekiwanie na wciśnięcie dowolnego klawisza read; readln; 23 24 8
Komentarz Pisząc program należy mieć na uwadze, że pamięć autora może być zawodna oraz program może być analizowany i modyfikowany przez inne osoby Należy możliwie często opisywać przeznaczenie lub sposób działania istotnych fragmentów kodu Należy umieszczać w kodzie komentarze Tekst oznaczony jako komentarz jest pomijany przez kompilator 25 Komentarz W Pascalu komentarz może zostać zapisany na dwa sposoby: 1. Jednowierszaowa po podwójnym znaku slesha // Stosowana w celu opisu pojedynczego wiersza kodu programu a:=15; //współczynnik wielomianu 2. Wielowierszowa zamknięta między nawiasy klamrowe { } Stosowany przy opisie większych fragmentów kodu 26 Komentarz {Pozostawienie komentarza z niezamkniętym nawiasem oznacza że kompilator będzie traktował wszystko, writeln( Kod zostanie pominięty ); readln(y); aż do nawiasu zamykającego jako komentarz} writeln( Ta linia zostanie zinterpretowana popranie ); 27 9
Moduły Biblioteki zawierające dodatkowe funkcje i procedury owe moduły: 1.crt: obsługa tekstu i kursora w konsoli 2.graph: funkcje graficzne pascala 3.math: funkcje matematyczne 4.sysutils: narzędzia systemowe 5.dateutils: funkcje czasu 28 Moduł crt Czyszczenie okna konsoli: ClrScr; Kasowanie znaków w linii od aktywnego kursora ClrEol; Ustawienie pozycji kursora gotoxy(10,20); Sprawdzenie czy naciśnięty został klawisz if KeyPressed then 29 Kolor tekstu TextColor(red); Moduł crt Kolor tła za tekstem TextBackground(green); Odczytanie znaku naciśniętego klawisza x:=readkey; ReadKey: Odczytanie współrzędnych kursora writeln( x=,wherex,,y= WhereY); 30 10
Moduł crt Tworzenie nowego okna na ekranie Window(x1,y1,x2,y2); Pełny ekran konsoli ma wymiary 80 znaków w 25 wierszach x1,y1 współrzędne lewego górnego rogu okna x2,y2 współrzędne prawego dolnego rogu okna Window(20,10,60,15); {okno na środku ekranu} 31 Założenia programu: 1. Powitanie 2. Na środku ekranu zadaje pytania i pobiera dane o dane osobowe: a. imię, b. nazwisko, c. data urodzenia 3. Na pełnym ekranie wyświetla pełne powitanie z informacją o ilości dni do urodzin 32 diagram 33 11
kod program Program_1; uses Crt, sysutils, dateutils; var imie, nazwisko,data: string; dd,mm,yyyy :Word; dni: integer; begin writeln('dzień Dobry'); writeln('witam w moim pierwszym programie'); writeln('na początek proszę o odpowiedzenie na kilka pytań!'); 34 - kod write( Możemy zacząć...?'); readkey; ClrScr; window(25,8,55,17); writeln('podaj swoje imię:'); readln(imie); ClrScr; writeln('podaj swoje nazwisko:'); readln(nazwisko); ClrScr; writeln('podaj datę urodzenia w formacie yyyy-mm-dd:'); 35 kod readln(data); ClrScr; writeln('dziękujemy za podanie informacji!'); write('możemy kontynuować...!'); readkey; ClrScr; window(1,1,80,25); writeln('witam Cię serdeczne ',imie,' ',nazwisko,'.'); 36 12
- kod DeCodeDate(Date,yyyy,mm,dd); writeln (format ('Dzisiaj jest %d,%d,%d ',[dd,mm,yyyy])); DeCodeDate(strtodate(data),yyyy,mm,dd); dni:=daysbetween(encodedate(2017,mm,dd), Date); writeln('do twoich urodzin jest ',dni,' dni. '); readkey; end. 37 Konwersja daty systemowej do trzech zmiennych przechowujących informacje o roku, miesiącu i dniu DeCodeDate(Date, yyyy,mm,dd); Konwersja daty zapisanej w postaci roku, miesiąca i dnia do formatu DateTime EnCodeDate(yyyy,mm,dd); Funkcje wymagają aktywacji modułu dateutils 38 Obliczenie dni pomiędzy dwoma datami realizuje funkcja DaysBetween Funkcja wymaga podpięcia modułu dateutils d:=daysbetween(date1,date2); Zmienne date1 i date2 w formacie TDateTime Konwersja do formatu żądanego za pomoca funkcji konwersji (np.: StrToDate) lub funkcji EncodeDate() 39 13
y Formatowanie łańcucha tekstowego na podstawie danych zgromadzonych w tablicy Funkcja wymaga podpięcia modułu Sysutils Text:=format( tekst plus %d/%d/%d,[100,100,100]); d - liczba rzeczywista, przeważnie typu integer, u - nieokreślona liczba rzeczywista, 40 e - wartość zmiennoprzecinkowa, formatu "naukowego", f - wartość zmiennoprzecinkowa, do dwóch miejsc po przecinku, g - wartość zmiennoprzecinkowa, n - numer, z separatorem części dziesiętnych, m - wartość pieniężna, p - wskaźnik, adres do pamięci, s - łańcuch, x - wartość heksadecymalna. 41 Funkcja skoku W prostych programach stosuje się czasem funkcję skoku goto label; w celu powtórzenia określonego fragmentu kodu Jest to pozostałość z języków niestrukturalnych jak BASIC Obecne stosuje się pętle warunkowe Skorzystanie z funkcji wymaga zdefiniowania kotwicy typu Label i jej umieszczenia w wybranym miejscu kodu źródłowego 42 14
Funkcja skoku 43 Funkcje konwersji Funkcje systemowe wymagające modułu SysUtils Stosowane gdy wymagane jest dostosowanie zmiennej do wymogów wejściowych funkcji lub procedury FloatToStr StrToFloat CurrToStr StrToCurr Konwersja pomiędzy typem liczbowym, zmiennoprzecinkowym a znakowym Konwersja między typem walutowym a znakowym StrToDate DateToStr StrToTime TimeToStr IntToStr StrToInt Konwersja pomiędzy data lub czas a typem znakowym Konwerscja pomiędzy typem liczbowym, całkowitym a znakowym 44 Funkcje matematyczne Pascal w module math dostarcza programiście pokaźną bibliotekę funkcji matematycznych Funkcje trygonometryczne, operują na kontach podanych w radianach Funkcje wykładnicze Funkcje konwersji (radiany na stopnie itp.) Rachunek pseudolosowy Funkcje warunkowe 45 15
Funkcje matematyczne Podstawowe działania: +, -, *, / div dzielenie z obcięciem reszty mod dzielenie z zachowaniem reszty abs(x) moduł liczby x cell(x) zwraca liczbę całkowitą x floor(x) zwraca liczbę całkowitą x sqrt(x) liczy pierwiastek power (x,n) liczy potęgę n liczby x sign(x) zwraca znak x (-1,0,1) 46 Trygonometryczne sin(x) liczy sinus konta x w rad. cos(x) liczy cosinus tan(x) liczy tangens cotan(x), cot(x) liczy cotangens arcsin(x) liczy arcus sinus liczby arccos(x) liczy arcuscosinus liczby arctan(x) liczy arcustangens liczby degtorad(x) konwersje pomiędzy radtodeg(x) stopniani a radianami 47 Generator liczb losowych Pascal posiada rozbudowane narzędzia generowania liczb losowych Uruchomienie generatora liczb losowych randomize; Losowanie liczby z przedziału (0,1) random; Losowanie liczby z przedziału (0,±x), losowane są wartości całkowite z zadanego przedziału random(25); 48 16
Generator liczb losowych Losowanie liczby z zadanego przedziału (x,y), zwracana jest liczba całkowita z zadanego przedziału RandomRange(-100,80); Losowana jest liczba z podanego wektora (zbioru) liczb RandomFrom(wektor); Wektor zawiera liczby całkowite typu integer lub int64 49 Opóźnienie czasowe Czasami istnieje konieczność aby pisany program wykonywał określoną czynność w określonym czasie Pascal dostarcza w module Crt procedury delay(x), wstrzymującej działanie programu o x milisekund delay(2000); Co odpowiada 2 s 50 Opóźnienie czasowe 51 17
Grafika Free Pascal udostępnia moduł graph za pomocą którego można w oknie graficznym rysować obiekty wektorowe Za pomocą grafiki wektorowej można uzupełnić program o rysunki i wykresy Można ustawić jedną z predefiniowanych rozdzielczości o jednej z dostępnych palet barw 52 Grafika Otwarcie okna graficznego inicjowane jest poleceniem: InitGraph(gd,gm,Font_path); Zmiena Font_Path wskazuje katalog z czcionkami BGI, domyslnie można ustawić zmienną pustą Na zakończenie należy zamknąć okno graficzne poleceniem: CloseGraph; 53 Grafika Zmienna gd może przyjmować: 1. detect 3. D2bit 6. D12bit domyślna 4. D4bit 7. D16bit 2. D1bit 5. D8bit Zmienna gm może przyjmować: 1. 0 wykrywanie max 2. m320x200 3. m320x256 amiga 9. m640x400 10. m640x480 11. m800x600 4. m320x400 amiga/atari 12. m832x624 mac 5. m512x384 mac 13. m1024x768 6. m640x200 vga 14. m1280x1024 7. m640x256 amiga 15. m1600x1200 8. m640x350 vga 16. m2048x1536 54 18
Grafika GetMaxX, GetMaxY Maksymalne wartości X i Y dla aktywnego okna graficznego GetX, GetY aktualne współrzędne kursora X i Y MoveTo(x,y) przenosi kursor we skazane miejsce MoveRel(dx,dy) przesuwa kursor GetColor zwraca aktywny kolor ClearDevice czyści okno graficzne i ustawia kursor w (0,0) 55 Grafika Rysowanie łuku Arc(x,y,a,b,r); x,y środek łuku; a, b kąty otwarcia i zamknięcia łuku; r promień łuku Rysowanie prostokąta Bar(x1,y1,x2,y2); Rectangle(x1,y1,x2,y2); 56 Grafika Kolor linii: x nazwa koloru lub wartość numeryczna koloru SetColor(x); Wypełnienie: x rodzaj wypełnienia, y kolor wypełnienia SetFillStyle(x,y); 1. EmptyFill 2. SolidFill 3. LineFill 4. ltslashfill 5. SlashFill 6. BkSlashFill 7. LtBkSlashFill 8. HatchFill 9. XHatchFill 10.InterLeaveFill 11.WideDotFill 12.CloseDotFill 57 19
Grafika Elipsa Elipse(x,y,a,b,dx,dy); Rysowanie linii LineTo(x,y); LineRel(dx,dy); Rysowanie prostopadłościanu Bar3d(x1,y1,x2,y2,z,TOP); 58 Grafika Wycięty okrąg i elipsa PieScile(x,y,a,b,r); Sector(x,y,a,b,dx,dy); Okrąg Circle(x,y,r); Ustawianie stylu linii SetLineStyle(x,0,y); x: Solidln, Dottedln, Centerln, Dashedln y: NormWidth, ThickWidth 59 Grafika Pisanie tekstu OutText( Tekst pisany w oknie ); Tekst we wskazanym miejscu OutTextXY(x,y, Tekst na ekran ); Wyrównanie tekstu SetTextJustify(hor, ver); hor: LeftText, CenterText, RightText ver: BottomText, CenterText,TopText 60 20
Grafika Format tekstu SetTextStyle(font,kierunek,rozmiar); Font: DefaultFont, TriplexFont, SmallFont, SansSerifFont, GothicFont, ScriptFont, TSCRFont, LCOMFont, EuroFont, BoldFont Kierunek: HorizDir, VertDir Rozmiar: w pikselach 61 Program rysuje w oknie graficznym prostokąt o zadanych wymiarach, położeniu, kolorze linii Program rysuje wykreślony prostokąt obrócony o określony kąt względem zadanego punktu Program wykreśla podpis rysunku oraz opisuje obydwa prostokąty Program wyświetla rysunek przez 20s, po tym czasie zamyka się 62 Wyznaczanie współrzędnych punktu przy obrocie względem początku układu współrzędnych X n =Xcos(a) Ysin(a) Y n =Xsin(a)+Ycos(a) 63 21
W sytuacji gdy punkt obrotu nie jest w początku układu równania przyjmują postać X n =(X X o )cos(a) (Y Y o )sin(a)+x o Y n =(X X o )sin(a)+(y Y o )cos(a)+y o 64 Pascal rysuje prostokąt równolegle do osi xy Nie potrafi narysować prostokąta obróconego o zadany kąt Obrócony prostokąt należy narysować za pomocą funkcji LineTo lub DrawPoly DrawPoly wymaga znajomości tablic, które nie wchodzą w zakres tego wykładu 65 Sin(x) Cos(x) Round(x) Rectangle(x1,y1,x2,y2) MoveTo(x,y) LineTo(x,y) x div y DegToRad(x) Delay(x) Math, crt, graph 66 22
program przyklad; uses math, crt, graph; var a,b,x,y:integer; gd, gm:integer; xo,yo,alfa: integer; alfa_rad: single; xn,yn: integer; Begin 67 write('program rysuje prostokąt a następnie'); writeln(' obraca go względem zadanego punktu o podany kąt'); writeln(); writeln('podaj wymiary prostokąta (a,b) oraz współrzędne jego środka (x,y)'); write('a='); readln(a); write('b='); readln(b); write('x='); readln(x); write('y='); readln(y); 68 writeln('podaj punkt obrotu (x,y) oraz kąt obrotu alfa.'); write('x='); readln(xo); write('y='); readln(yo); write('alfa='); readln(alfa); alfa_rad:=degtorad(-alfa); 69 23
gd:=detect; gm:=0; initgraph(gd,gm,''); setcolor(red); rectangle(x - a div 2,y + b div 2,x + a div 2, y - b div 2); rectangle(round(x-a/2),round(y+b/2), round(x+a/2),round(y-b/2)); 70 xn:=round(((x-a/2)-xo)*cos(alfa_rad)- ((y+b/2)-yo)*sin(alfa_rad)+xo); yn:=round(((x-a/2)- xo)*sin(alfa_rad)+((y+b/2)- yo)*cos(alfa_rad)+yo); writeln('xn=',xn,' yn=',yn); moveto(xn,yn); 71 xn:=round(((x+a/2)-xo)*cos(alfa_rad)- ((y+b/2)-yo)*sin(alfa_rad)+xo); yn:=round(((x+a/2)- xo)*sin(alfa_rad)+((y+b/2)- yo)*cos(alfa_rad)+yo); writeln('xn=',xn,' yn=',yn); lineto(xn,yn); 72 24
xn:=round(((x+a/2)-xo)*cos(alfa_rad)-((y-b/2)-yo)*sin(alfa_rad)+xo); yn:=round(((x+a/2)-xo)*sin(alfa_rad)+((y-b/2)-yo)*cos(alfa_rad)+yo); writeln('xn=',xn,' yn=',yn); lineto(xn,yn); xn:=round(((x-a/2)-xo)*cos(alfa_rad)-((y-b/2)-yo)*sin(alfa_rad)+xo); yn:=round(((x-a/2)-xo)*sin(alfa_rad)+((y-b/2)-yo)*cos(alfa_rad)+yo); writeln('xn=',xn,' yn=',yn); lineto(xn,yn); xn:=round(((x-a/2)-xo)*cos(alfa_rad)-((y+b/2)-yo)*sin(alfa_rad)+xo); yn:=round(((x-a/2)-xo)*sin(alfa_rad)+((y+b/2)-yo)*cos(alfa_rad)+yo); writeln('xn=',xn,' yn=',yn); lineto(xn,yn); delay(5000); closegraph; readkey() end. 73 74 25