Turbo Pascal - zestawienie podstawowych elementów - powtórka
Pascal jest jednym z najpopularniejszych języków programowania komputerów.
Powstał on w 1971 roku - twórca Niklaus Wirth. Język Pascal miał służyć przede wszystkim do nauki programowania strukturalnego.
Turbo Pascal firmy Borland: Borland Pascal 7.0 i Turbo Pascal 7.0
Innym, popularnym kompilatorem Pascala jest darmowy Free Pascal Compiler (FPC)..
Object Pascal - obiektowy język programowania, obiektowe rozszerzenie języka Pascal, użyty jako język programowania w środowisku programistycznym
Borland Delphi, Kylix oraz Lazarus. Kontynuacja linii Turbo Pascal. Obecnie język ten właściwie jest nazywany Delphi Pascal.
Charakteryzuje się głównie prostą składnią i bardzo wysoką efektywnością tworzenia oprogramowania, na co wpływ ma zwłaszcza bardzo szybki kompilator.
IDE (Integrated Development Environment) - zintegrowane środowisko robocze Turbo Pascala
- wszystkie elementy dostępne poprzez okno edytora, menu główne oraz kombinacje klawiszy
Wszystkie polecenia IDE Turbo Pascala dostępne są poprzez menu główne (wywoływane klawiszem F10 lub za pomocą myszki).
Część poleceń można również wywołać naciskając klawisze skrótu.
Uruchomienie Turbo Pascala - polecenie turbo.exe (w podkatalogu BIN Torbo Pascala, np. C:\TP\BIN\Turbo.exe)
Użyteczne klawisze: F1-help, Alt-X – opuszczenie środowiska (koniec pracy), F9-kompilacja programu, Ctrl+F9 – uruchomienie,
F2 – zapisanie tekstu programu na dysk, F3-odczytanie pliku z dysku, Alt-F5 – User screen - obejrzenie wyników działania programu
Escape umożliwia rezygnację z wykonywania rozpoczętej operacji.
Kompilacja programu: Build, Compile. By uzyskać plik wykonywalny EXE, należy wybrać opcję zapisu na dysk.
Rozszerzenie plików źródłowych: PAS, program wykonywalny po kompilacji - .EXE.
Program pascalowy składa się z ciągu instrukcji, rozdzielonych średnikami położonych pomiędzy słowami kluczowymi begin i end.
Program w Pascalu zaczyna się opcjonalnym tytułem - program nazwa;
Elementami programu są słowa kluczowe (zastrzeżone, np. begin, write, read) i identyfikatory – nazwy obiektów (np. nazwy zmiennych, stałych).
Instrukcje stanowią symboliczny zapis operacji, które ma wykonać komputer.
Instrukcje mogą zawierać wyrażenia oraz wywołania funkcji i procedur.
Wyrażenia składają się ze stałych, operatorów i identyfikatorów.
Identyfikatory są nazwami obiektów składających się na program.
Identyfikatory mogą one zawierać litery, cyfry i znaki podkreślenia, nie mogą jednak zaczynać się od cyfr. Identyfikatory nie mogą zawierać spacji ani polskich liter.
Duże litery nie są odróżniane od małych.
Separatorem w programie (deklaracji, procedur, funkcji) jest znak średnika.
Komentarzem w Pascalu jest dowolny ciąg znaków ujęty w nawiasy klamrowe { } lub (* *)
Do wprowadzania informacji (danych) służą w Pascalu procedury write i writeln (po writeln przejście kursora do nowej linii).
Zmienna – jako pojemnik na dane, każda zmienna musi być określonego typu.
Zmienne służą so przechowywania wartości..
Typy zmiennych określa się przy pomocy słowa kluczowego var, np. var liczba1, liczba2: redl;
Najczęściej stosowane typy zmiennych w Pascalu:
integer (liczba całkowita ze znakiem) – 2 bajty, real (liczba rzeczywista) – 6 bajtów, char (znak ASCII), Boolean – wartość logiczna true lub false,
longint – całkowita – 4 bajty, byte - całkowita (0..255) – 1 bajt, word - całkowita (0..65535) – 2 bajty, double – rzeczywista - 8 bajtów
string - napis (łańcuch, ciąg znaków) - ciąg do 255 znaków, np. 'Napis'
comp bardzo długa liczba rzeczywista
pointer - wskaźnik
Deklaracja zmiennej nie powoduje nadania jej wartości (nie jest połączona z inicjalizacją)
Cechami charakterystycznymi zmiennej są nazwa i typ.
Do wprowadzania wartości zmiennych z klawiatury służą procedury read i readln, które powinny być uzupełniane procedurami write i writeln.
Chcąc wstrzymać działanie programu, można użyć procedury readln.
Do przekształcania informacji w programie służą wyrażenia.
W skład wyrażeń wchodzą stałe i zmienne (reprezentujące dane) oraz operatory i funkcje (reprezentujące sposoby przekształcania informacji).
Najważniejsze grupy operatorów pascalowych to operatory arytmetyczne, bitowe, logiczne oraz relacyjne (operatory porównania).
Do zmiany kolejności działań służą nawiasy.
Do nadawania wartości zmiennym służy operator przypisania :=, np. a:=a+2;
Operacje arytmetyczne są wykonywane wg ustalonej kolejności, do zmiany której służą nawiasy (nawiasy mają priorytet).
Operatory arytmetyczne: *, /, div (dzielenie całkowite), mod (reszta z dzielenia) , +, -
Pierwszeństwo mają operatory mnożenia i dzielenia (*, /, div i mod), wykonywane zawsze przed dodawaniem i odejmowaniem.
Działania reprezentowane przez operatory o tym samym priorytecie wykonywane są w kolejności od lewej do prawej.
Operatory relacyjne: =, <>, <. <=, >, >=
Operatory logiczne: not - negacja, and - iloczyn logiczny - koniunkcja - daje true gdy wszystkie argumenty mają wartość true,
or – suma logiczna – alternatywa – daje true, gdy co najmniej jeden argument ma wartość true
Priorytet wszystkich operatorów:
not 1 (najwyższy)
* / div mod and shl shr 2 (niższy)
+ - or xor 3 (jeszcze niższy)
= <> < <= > >= 4 (najniższy)
Stałe (const)
Stałe to komórki pamięci, które mają takie same wartości przez cały czas działania programu.
Definiujemy przy pomocy słowa const, np. const ROS = 200.0/Pi;
Najczęściej programiści nadają im nazwy dużymi literami -w odróżnieniu od zmiennych.
Stałe są wygodne przy podstawianiu pewnych wartości, które będą miały wpływ na działanie całego programu.
Definiuje się je na początku kodu programu. Stalą jest np. liczba π – stała nazywa się PI,
stałe można tworzyć samemu, może to być np. stała grawitacji: STALA_G.
Słowo const pozwala również na deklarowanie zmiennych połączone z nadawaniem im wartości początkowych.
Examples:
(* Constant Declarations *)
const
STALA_G = 9.81;
MAX_PAMIEC = 63000; { maksymalna wielkosc katalogu }
Liczba_ksiazek : word = 0; { na początku } { katalog jest pusty }
Liczniki : array[1..4] of word = (0, 0, 0, 0); { inicjalizacja tablicy }
MaxData = 1024 * 64 - 16;
NumChars = Ord('Z') - Ord('A') + 1;
Message = 'Hello world...';
Podejmowanie decyzji w programie:
Do realizacji instrukcji warunkowych (rozgałęzień wykonania programu) służy w Pascalu instrukcja if then else lub case
If warunek then instrukcja;
Np. if (warunek<min) or (warunek>max) then warunek:=0;
read(liczba); IF liczba=100 THEN writeln('Podałeś liczbę równą 100');
if warunek then instrukcja-1 else instrukcja-2;
Np.
if delta < 0 then { brak pierwiastków rzeczywistych }
else
if delta = 0 then { oblicz i wypisz pojedynczy pierwiastek }
else { odnosi się do drugiego if-a } { oblicz i wypisz obydwa pierwiastki }
Jeśli wyborem steruje wartość typu porządkowego, lepszym rozwiązaniem jest użycie instrukcji wyboru case.
Instrukcję case stosujemy gdy zachodzi konieczność podjęcia kilku decyzji.
Wielokrotne sprawdzanie warunku: case – else
case przełącznik of wartość-1 : akcja-1; wartość-2 : akcja-2; ... else akcja-domyślna end;
Przykłady z case:
case liczba_interesantow of
0 : mozna_wyjsc_do_fryzjera;
1, 2 : niech_czekaja;
3..6 : trzeba_obsluzyc;
else wypisz('INWENTARYZACJA')
end;
case ch of
‘A’..’Z’, ‘a’..’z’: writeln(‘litera’);
‘0’..’9’: writeln(‘cyfra’);
‘+’,’-‘,’*’,’/’: writeln(‘operator’);
else writeln(‘znak specjalny’);
end;
Obliczenia cykliczne (iteracyjne)
Do cyklicznego (iteracyjnego) wykonywania instrukcji służą w Pascalu pętle.
Instrukcje pętli mogą być sterowane warunkiem (while-do, repeat-until) lub licznikiem (for-to/downto).
Pętle while i repeat używane są wówczas, gdy nie znamy z góry liczby przebiegów pętli, możemy natomiast określić warunek jej zakończenia.
Instrukcja while – do pozwala na zapętlenie wykonywania instrukcji tak długo, jak długo jest spełniony warunek.
while warunek do instrukcja;
Przykład: while ch=’ ‘ do ch:=getchar;
Instrukcja repeat
repeat instrukcja until warunek
Wykonywane są wszystkie instrukcje między słowami kluczowymi repeat i until.
Wykonywanie instrukcji kończy się, jeśli wartość warunku jest true, w przeciwnym przypadku powtarzane jest ponownie.
Przykłady:
Repeat readln(liczba); dług:=dług+1; until liczba=0;
repeat ch:=getchar until ch <> ‘ ‘;
repeat write(‘Wprowadź cyfrę 0..9 ‘); readln(i); until (i>=0) and (i<=9);
Instrukcje tworzące zawartość pętli repeat muszą wykonać się co najmniej raz,
zaś w przypadku pętli while mogą nie wykonać się ani razu.
Pętla while wykonuje się tak długo, jak długo warunek jest spełniony, repeat - tak długo, jak długo jest niespełniony.
Instrukcja for
Umożliwia wykonanie określonej liczby przebiegów – jest kontrolowana licznikiem
for zmienna:= wart_poczatkowa to wart_koncowa do instrukcja;
for zmienna:= wart_poczatkowa downto wart_koncowa do instrukcja;
Zmienna musi być typu całkowitego, znakowego lub logicznego.
Przykłady:
for i:=1 to 5 do writeln(i);
for i:=5 downto 1 do writeln(i);
Programując kryterium zakończenia pętli while i repeat (i nie tylko) należy pamiętać o niedokładności reprezentacji liczb rzeczywistych i kumulacji błędów obliczeń.
Pętla for wykorzystywana jest w sytuacjach, gdy możemy dokładnie określić liczbę przebiegów.
Licznik pętli for jest zawsze typu porządkowego i zmienia się z krokiem 1.
Modyfikacja licznika wewnątrz pętli for jest dopuszczalna, ale może prowadzić do trudnych do wykrycia błędów i należy jej unikać.
Do inkrementacji lub dekrementacji zmiennych typu porządkowego można wykorzystać instrukcje Inc i Dec.
Tablice w Pascalu
Tablica jest to struktura danych zawierająca uporządkowany zbiór obiektów tego samego typu.
Odpowiada matematycznemu pojęciu wektora – tablica jednowymiarowa lub macierzy – tablica dwuwymiarowa.
Elementy tablicy wskazujemy za pomocą indeksów
Tablicę tworzymy przy pomocy słowa kluczowego array
var zmienna_tabl:=array[zakresy_indeksow] of typ_elementu; {zmienna tablicowa}
Np. var t1, t2: array[1..30] of integer;
Typ tablicowy:
Type identyfikator_tabl = array [zakresy_indeksow] of typ_ellementu;
Np. type wektor = array[1..30] of integer;
var t1, t2: wektor;
Do obsługi tablic wykorzystuje się często pętle for. Np. for i:=1 to i do writeln(t1[i]);
Podprogramy: procedury I funkcje
Podprogram jest to wyróżniona część programu, komunikująca się z pozostałą częścią w ściśle określony sposób.
Do komunikacji wykorzystywane są parametry, w definicji podprogramu nazywane formalnymi, a przy wywoływaniu podprogramu parametrami aktualnymi.
Podprogram może być wielokrotnie wywoływany z części głównej programu lub z innych podprogramów.
Wywołanie podprogramu polega na podaniu jego nazwy oraz parametrów w nawiasach.
Najważniejsze korzyści stosowania podprogramów:
Program z podziałem na podprogramy jest znacznie bardziej czytelny i zrozumiały
Pewne fragmenty programu, które się powtarzają lub realizują ściśle określone operacje powinny być wyodrębnione i zapisane w postaci jednego podprogramu
Podczas testowania i uruchamiania programu można testować podprogramy oddzielnie .
W języku Pascal są 2 rodzaje podprogramów: procedury i funkcje.
Funkcje pod swoją nazwą zwracają obliczoną wartość, a procedury nie.
Wszystkie obiekty zdefiniowane wewnątrz procedur są lokalne, tj. widoczne tylko dla nich i ewentualnie procedur wewnętrznych..
Wszystkie obiekty zdefiniowane w blokach nadrzędnych wobec procedur są dla nich dostępne, łącznie ze strukturami globalnymi, zdefiniowanymi w programie głównym..
Zdefiniowanie obiektu lokalnego o tej samej nazwie co obiekt z bloku nadrzędnego, powoduje jego przesłonięcie (odwołania odnoszą się do obiektu lokalnego).
Procedury
Procedure nazwa (lista_parametrow_formalnych);
{deklaracje stałych, zmiennych, typów}
begin {treść procedury} end;
Przykład:
Procedura do wyświetlenia na ekranie trójkąta złożonego z gwiazdek, czyli czegoś takiego:
*
**
***
****
….
program Szlaczki;
var
i : integer; { licznik wierszy }
procedure Szlaczek(Znak : char; Ile : integer);
begin
for i := 1 to Ile do { wypisz szlaczek }
write(Znak); { złożony z iluś znaków }
writeln
end;
begin {Program główny}
for i := 1 to 20 do { wypisz 20 szlaczków }
Szlaczek('*', i);
end.
Przykład:
{ Procedure Declaration }
procedure WrStr(X, Y: integer; S: string);
var
SaveX, SaveY: Integer;
begin
SaveX := WhereX;
SaveY := WhereY;
GotoXY(X, Y);
Write(S);
GotoXY(SaveX, SaveY);
end;
Funkcje
Function nazwa_funkcji (lista_parametrow_formalnych): typ_wyniku;
{deklaracje stałych, zmiennych, typów}
begin
{treść funkcji}
nazwa_funkcji:=wynik; { w treści funkcji musi być umieszczone przypisanie: nazwa_funkcji:=wynik}
end;
W treści funkcji musi być umieszczone przypisanie: nazwa_funkcji:=wynik
Wywołanie funkcji:
Zmienna:=nazwa_funkcji(lista_parametrow_aktualnych);
Przykład:
(* Function declaration *)
function UpCaseStr(S: string): string;
var
I: Integer;
begin
for I := 1 to Length(S) do
if (S[I] >= 'a') and (S[I] <= 'z') then
Dec(S[I], 32);
UpCaseStr := S;
end;
Procedury i funkcje pascalowe pozwalają zamknąć dany zestaw operacji w logiczną całość, pobierającą z otoczenia odpowiednie informacje i zwracającą żądany wynik.
Przed wykorzystaniem (wywołaniem) funkcji lub procedury należy ją zdefiniować, czyli określić jej treść i sposób komunikowania się z otoczeniem.
Do przekazywania informacji do funkcji (procedury) służą parametry (argumenty).
W trakcie definiowania informacja przekazywana do funkcji (procedury) symbolizowana jest parametrami formalnymi.
Definicje funkcji (procedur) muszą być umieszczone w programie przed częścią operacyjną i muszą występować w odpowiedniej kolejności.
Samo wywołanie funkcji (procedury) odbywa się przez podanie w programie jej nazwy uzupełnionej odpowiednią listą parametrów aktualnych.
Stosowanie funkcji i procedur jest korzystne ze względu na poprawę czytelności i efektywności programu, zmniejszenie podatności na błędy i skrócenie czasu potrzebnego na jego pisanie.
program Trygonometria; { demonstracja przekazywania parametrów }
var i : integer; s, c : real;
procedure SinCos(x : real; var SinX, CosX : real); { oblicza jednocześnie sinus i cosinus argumentu – przekazywanie przez nazwę - var}
begin
SinX := sin(x); CosX := cos(x);
end;
begin SinCos(Pi/3,s,c); { oblicz wartości }
writeln(s:8:3, c:8:3); { i wypisz je na ekranie }
end.
Wszelkie obiekty zadeklarowane wewnątrz funkcji (procedury) są tzw. obiektami lokalnymi.
Obiekty lokalne są niewidoczne na zewnątrz funkcji.
Obiekty zadeklarowane w programie głównym (na zewnątrz wszystkich procedur i funkcji) są obiektami globalnymi. Są one dostępne dla wszystkich elementów programu.
Wszelkie obiekty przeznaczone wyłącznie do użytku wewnętrznego funkcji (procedury) powinny być deklarowane jako lokalne.
Zakres "widzialności" obiektu zwany jest jego zasięgiem.
Zadeklarowanie w funkcji (procedurze) obiektu lokalnego o takiej samej nazwie jak obiekt z bloku nadrzędnego powoduje przysłonięcie tego ostatniego.
Modyfikowanie obiektów nielokalnych (czyli przekazywanie informacji do/z funkcji lub procedury drogą inną niż przez parametry lub nazwę funkcji) nosi nazwę efektów ubocznych.
Efektów ubocznych należy unikać, a jeśli się ich używa - czynić to z rozwagą.
Pascal udostępnia dwie metody przekazywania parametrów: przez wartość i przez nazwę.
Przekazywanie przez wartość działa jednokierunkowo, tj. przekazuje informację od wywołującego do wywoływanej funkcji lub procedury.
Przekazywanie przez nazwę umożliwia zwrócenie zmodyfikowanej wartości parametru do wywołującego.
Przekazując do funkcji lub procedur większe struktury danych należy stosować przekazywanie przez nazwę.
Skraca to czas wykonania programu i umożliwia uniknięcie przepełnienia stosu.
Zapamiętywanie danych na dysku i odczyt danych
Wiąże się ze strukturalnym typem danych - typem plikowym.
Definicja typu plikowego rozpoczyna się od słowa kluczowego FILE.
np.
TYPE wyniki = FILE of integer;
Pliki tekstowe (file of char) mają zwykle rozszerzenie TXT, są predefiniowane w Pascalu i mają identyfikator TEXT.
Pascal w stosunku do innych języków wyróżnia się niezwykle intuicyjną i elegancką obsługą plików.
W języku Pascal możemy wyróżnić trzy rodzaje plików.
Każdy rodzaj pliku wymaga osobnej deklaracji zmiennej plikowej -
reprezentującej zbiór dyskowy w naszym programie.
1)
type typea=...
var filea: file of typea;
var file1: file of byte; {plik o elementach typu byte, po prostu liczby całkowite o rozm. 1b}
var file2: file of record {plik o elementach typu rekordowego}
id: byte;
nm: string[20];
end;
2) Pliki tekstowe:
var file_txt: text;
Pliki te to po prostu pliki textowe ASCII. Możemy też myśleć o takich plikach jak o zbiorach znaków ASCII.
3) Ppliki beztypowe (amorficzne).
Są to pliki o niejawnej strukturze. Może to być każdy plik
znajdujący się na dysku.
Traktowany jest jako ciąg bajtów o nieuporządkowanej strukturze:
var file_byt: file;
Każdy, z tych 3 typów plików jest reprezentowany w programie
przez odpowiednią zmienną plikową.
Do każdego z tych typów mamy podobne procedury i funkcje służące do
zapisu/odczytu informacji i obsługi.
Najważniejszą parą procedur z punktu widzenia plików typowych jest read/write
(odczyt/zapis), plików textowych read/write
oraz readln/writeln, plików amorficznych blockread/blockwrite.
Przed użyciem plik należy otworzyć lub utworzyć a po użyciu zamknąć.
Służą do tego procedury reset/rewrite oraz close.
Aby było możliwe otwarcie pliku, należy zmienna plikową skojarzyć ze zbiorem na
dysku (czyli fizycznym plikiem).
Służy temu procedura assign.
Przykłady:
program p1;
USES CRT;
VAR
f :text; { f - zmianna plikowa - plik tekstowy}
BEGIN
assign(f, 'C:\plik1.txt'); {przydzielenie do zmiennej pliku plik1.txt}
rewrite(f); {otwarcie pliku do zapisu}
writeln(f, 'Jakieś zdanie numer 1');
writeln(f, 'Jakieś zdanie numer 2');
Close(f); {zamkniecie pliku}
END.
program p2;
USES CRT;
VAR
t: text;
a:char;
BEGIN
clrscr;
assign(t, 'c:\plik1.txt'); {przydzielenie do zmiennej pliku plik1.txt}
reset(t); {otwarcie pliku do czytania}
REPEAT
read(t, a); {czytanie z pliku}
write(a);
UNTIL EOF(t);
close(t);
readln;
END.