Turbo Pascal - zestawienie podstawowych elementów - powtórka


Pascal
jest jednym z najpopularniejszych języków programowania komputerów.
Powstał on w 1971 roku, kiedy to Niklaus Wirth opublikował pierwszy artykuł o nim. 
W zamierzeniu Wirtha język Pascal miał służyć przede wszystkim do nauki programowania strukturalnego.
Światowy prymat języka Pascal należy  do tak zwanego Turbo Pascala, wprowadzonego na rynek w 1983 roku przez amerykańską firmę Borland International Inc.
Stałe wzbogacanie i doskonalenie języka Turbo Pascal przez Borland doprowadziło do powstania pod koniec 1992 roku wersji 7.0,
która pojawiła się na rynku w postaci dwóch pakietów: Borland Pascal 7.0 i Turbo Pascal 7.0 
Najnowsza wersja kompilatora ( Turbo Pascal 7.0 ) została wydana w 1992 roku.
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-F5User screen - obejrzenie wyników działania programu
Escape umożliwia  rezygnację z wykonywania rozpoczętej operacji.
 
Kompilacja programu: Build, Compile. By uzyskać pli 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 rozdzielonych średnikami instrukcji położonych pomiędzy słowami kluczowymi begin i end.
Program w Pascalu zaczyna się opcjonalnym tytułem -  program nazwa;
 
Treść programu jest miedzy słowami kluczowymi begin  end. (end z kropka na końcu)
 
Elementami programu są słowa kluczowe (zastrzeżone, np. begin, write, read) i identyfikatory (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 całkowita
pointer - wskaźnik
 
 
Deklaracja zmiennej nie powoduje nadania jej wartości (nie jest połączona z inicjalizacją)
Cechami charakterystycznymi zmiennej są nazwa i typ.
Nazwa pozwala na zidentyfikowanie zmiennej, zaś typ określa jej wewnętrzną reprezentację i zakres wartości oraz dopuszczalnych operacji.
Przed użyciem zmienna musi zostać zadeklarowana (za pomocą słowa kluczowego var) oraz zainicjalizowana
(przez przypisanie lub wprowadzenie wartości z zewnątrz, np. z klawiatury).
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;
Po lewej stronie operatora przypisania nie może się znaleźć stała ani wyrażenie, tylko zmienna
Instrukcja przypisania wymaga zgodności typów argumentów
 
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
 
Operatory bitowe: shl przesunięcie bitów w lewo   np. 7 shl 2 = 28;  shr przesunięcie bitów w prawo  np. 128 shr 4 = 8;
xor suma modulo 2 np.  true xor true = false;  7 xor 15 = 8
 
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.
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: caseelse
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.
 
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 formalnymi.
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:
{ 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 lokalneniewidoczne 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.

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.