Pascal - Szybki przewodnik

Pascal to język ogólnego przeznaczenia na wysokim poziomie, który został pierwotnie opracowany przez Niklausa Wirtha na początku lat 70. Został opracowany z myślą o nauczaniu programowania jako dyscypliny systematycznej oraz w celu opracowania niezawodnych i skutecznych programów.

Pascal jest językiem opartym na Algolu i zawiera wiele konstrukcji Algola. Algol 60 jest podzbiorem Pascala. Pascal oferuje kilka typów danych i struktur programistycznych. Programy Pascal są łatwe do zrozumienia i utrzymania.

Popularność Pascal na arenie dydaktycznej i akademickiej wzrosła z różnych powodów:

  • Łatwe do nauki.
  • Język strukturalny.
  • Tworzy przejrzyste, wydajne i niezawodne programy.
  • Można go kompilować na różnych platformach komputerowych.

Cechy języka Pascal

Pascal ma następujące funkcje -

  • Pascal to język silnie typowany.
  • Oferuje obszerne sprawdzanie błędów.
  • Oferuje kilka typów danych, takich jak tablice, rekordy, pliki i zestawy.
  • Oferuje różnorodne struktury programistyczne.
  • Obsługuje programowanie strukturalne za pomocą funkcji i procedur.
  • Obsługuje programowanie obiektowe.

Fakty o Pascalu

  • Język Pascal został nazwany na cześć Blaise'a Pascala, francuskiego matematyka i pioniera w rozwoju komputerów.

  • Niklaus Wirth zakończył prace nad oryginalnym językiem programowania Pascal w 1970 roku.

  • Pascal jest oparty na stylu struktury blokowej języka programowania Algol.

  • Pascal został opracowany jako język odpowiedni do nauczania programowania jako dyscyplina systematyczna, której implementacje mogą być zarówno niezawodne, jak i wydajne.

  • Standard ISO 7185 Pascal został pierwotnie opublikowany w 1983 roku.

  • Pascal był podstawowym językiem wysokiego poziomu używanym do programowania w Apple Lisa i we wczesnych latach Mac.

  • W 1986 roku Apple Computer wydał pierwszą implementację Object Pascal, aw 1993 roku Komitet Standardów Pascala opublikował Object-Oriented Extension to Pascal.

Dlaczego używać Pascala?

Pascal umożliwia programistom definiowanie złożonych strukturalnych typów danych oraz tworzenie dynamicznych i rekurencyjnych struktur danych, takich jak listy, drzewa i wykresy. Pascal oferuje takie funkcje, jak rekordy, wyliczenia, podzakresy, dynamicznie przydzielane zmienne z powiązanymi wskaźnikami i zestawami.

Pascal dopuszcza zagnieżdżone definicje procedur na dowolnym poziomie głębokości. To naprawdę zapewnia wspaniałe środowisko programistyczne do nauki programowania jako systematycznej dyscypliny opartej na podstawowych pojęciach.

Do najbardziej niesamowitych realizacji Pascala należą -

  • Skype
  • Total Commander
  • TeX
  • Macromedia Captivate
  • Apple Lisa
  • Różne gry na PC
  • Systemy wbudowane

Do ogólnego użytku dostępnych jest kilka kompilatorów i interpreterów Pascala. Wśród nich są -

  • Turbo Pascal - zapewnia IDE i kompilator do uruchamiania programów Pascal na CP / M, CP / M-86, DOS, Windows i Macintosh.

  • Delphi- zapewnia kompilatory do uruchamiania Object Pascal i generuje natywny kod dla 32- i 64-bitowych systemów operacyjnych Windows, a także 32-bitowych systemów Mac OS X i iOS. Embarcadero planuje zbudować wsparcie dla systemu operacyjnego Linux i Android.

  • Free Pascal- jest to darmowy kompilator do uruchamiania programów Pascal i Object Pascal. Darmowy kompilator Pascal to 32- i 64-bitowy kompilator Pascal kompatybilny z Turbo Pascal i Delphi dla systemów Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS i kilku innych platform.

  • Turbo51 - Jest to darmowy kompilator Pascala dla rodziny mikrokontrolerów 8051, ze składnią Turbo Pascal 7.

  • Oxygene - Jest to kompilator Object Pascal dla platform .NET i Mono.

  • GNU Pascal (GPC) - Jest to kompilator Pascala składający się z frontonu do kolekcji kompilatorów GNU.

W tych samouczkach będziemy używać Free Pascal. Możesz pobrać Free Pascal dla swojego systemu operacyjnego z linku: Pobierz Free Pascal

Instalowanie Free Pascal w systemie Linux

Dystrybucja Free Pascal w systemie Linux występuje w trzech formach -

  • za tar.gz wersja, dostępna również jako osobne pliki.

  • za .rpm (Red Hat Package Manager) wersja.

  • za .deb (Debian) wersja.

Kod instalacyjny wersji .rpm:

rpm -i fpc-X.Y.Z-N.ARCH.rpm

Gdzie XYZ to numer wersji pliku .rpm, a ARCH to jedna z obsługiwanych architektur (i386, x86_64 itd.).

Kod instalacyjny dla wersji Debiana (jak Ubuntu) -

dpkg -i fpc-XXX.deb

Gdzie XXX to numer wersji pliku .deb.

Aby uzyskać szczegółowe informacje, przeczytaj: Podręcznik instalacji programu Free Pascal

Instalowanie Free Pascal na Macu

Jeśli używasz systemu Mac OS X, najłatwiejszym sposobem korzystania z Free Pascal jest pobranie środowiska programistycznego Xcode ze strony internetowej Apple i wykonanie prostych instrukcji instalacji. Po skonfigurowaniu Xcode będziesz mógł korzystać z kompilatora Free Pascal.

Instalowanie Free Pascal w systemie Windows

W przypadku systemu Windows pobierzesz instalator systemu Windows, setup.exe. To jest zwykły program instalacyjny. Musisz wykonać następujące kroki, aby zainstalować -

  • Wybierz katalog.

  • Wybierz części pakietu, które chcesz zainstalować.

  • Opcjonalnie wybierz powiązanie rozszerzeń .pp lub .pas z IDE Free Pascal.

Aby uzyskać szczegółowe informacje, przeczytaj: Podręcznik instalacji programu Free Pascal

Edytor tekstu

Będzie to użyte do wpisania twojego programu. Przykłady kilku edytorów obejmują Notatnik Windows, polecenie edycji systemu operacyjnego, Brief, Epsilon, EMACS i vim lub vi.

Nazwa i wersja edytora tekstu mogą się różnić w różnych systemach operacyjnych. Na przykład Notatnik będzie używany w systemie Windows, a vim lub vi może być używany w systemie Windows, a także w systemie Linux lub UNIX.

Pliki utworzone za pomocą edytora nazywane są plikami źródłowymi i zawierają kod źródłowy programu. Pliki źródłowe programów Pascal są zwykle nazywane z rozszerzeniem.pas.

Przed rozpoczęciem programowania upewnij się, że masz jeden edytor tekstu i masz wystarczające doświadczenie, aby napisać program komputerowy, zapisać go w pliku, skompilować i ostatecznie wykonać.

Zanim przestudiujemy podstawowe elementy składowe języka programowania Pascal, przyjrzyjmy się minimalnej strukturze programu Pascal, abyśmy mogli przyjąć ją jako odniesienie w kolejnych rozdziałach.

Struktura programu Pascal

Program Pascal składa się zasadniczo z następujących części -

  • Nazwa programu
  • Używa polecenia
  • Deklaracje typów
  • Stałe deklaracje
  • Deklaracje zmiennych
  • Deklaracje funkcji
  • Deklaracje proceduralne
  • Główny blok programu
  • Instrukcje i wyrażenia w każdym bloku
  • Comments

Każdy program w pascalu ma na ogół instrukcję nagłówka, deklarację i część wykonawczą ściśle w tej kolejności. Poniższy format przedstawia podstawową składnię programu Pascal -

program {name of the program}
uses {comma delimited names of libraries you use}
const {global constant declaration block}
var {global variable declaration block}

function {function declarations, if any}
{ local variables }
begin
...
end;

procedure { procedure declarations, if any}
{ local variables }
begin
...
end;

begin { main program block starts}
...
end. { the end of main program block }

Przykład Pascala Hello World

Poniżej znajduje się prosty kod pascal, który wypisuje słowa „Hello, World!” -

program HelloWorld;
uses crt;

(* Here the main program block starts *)
begin
   writeln('Hello, World!');
   readkey;
end.

To da następujący wynik -

Hello, World!

Spójrzmy na różne części powyższego programu -

  • Pierwsza linia programu program HelloWorld; wskazuje nazwę programu.

  • Druga linia programu uses crt; jest poleceniem preprocesora, które mówi kompilatorowi, aby dołączył jednostkę crt przed przejściem do właściwej kompilacji.

  • Kolejne wiersze zawarte w instrukcjach begin i end to główny blok programu. Każdy blok w Pascalu jest zamknięty wbegin oświadczenie i plik endkomunikat. Jednak po instrukcji end wskazującej koniec programu głównego następuje kropka (.) Zamiast średnika (;).

  • Plik begin instrukcja głównego bloku programu jest miejscem rozpoczęcia wykonywania programu.

  • Linie w środku (*...*) zostanie zignorowany przez kompilator i został umieszczony w celu dodania pliku comment w programie.

  • Twierdzenie writeln('Hello, World!');używa funkcji writeln dostępnej w Pascalu, która powoduje wyświetlenie komunikatu „Hello, World!” do wyświetlenia na ekranie.

  • Twierdzenie readkey;umożliwia wstrzymanie wyświetlania do momentu naciśnięcia klawisza przez użytkownika. Jest częścią jednostki crt. Jednostka jest jak biblioteka w Pascalu.

  • Ostatnia wypowiedź end. kończy twój program.

Skompiluj i uruchom program Pascal

  • Otwórz edytor tekstu i dodaj powyższy kod.

  • Zapisz plik jako hello.pas

  • Otwórz wiersz poleceń i przejdź do katalogu, w którym zapisałeś plik.

  • Wpisz fpc hello.pas w wierszu polecenia i naciśnij klawisz Enter, aby skompilować kod.

  • Jeśli w kodzie nie ma błędów, wiersz polecenia przeniesie Cię do następnego wiersza i wygeneruje hello plik wykonywalny i hello.o plik obiektu.

  • Teraz wpisz hello w wierszu polecenia, aby wykonać program.

  • Będziesz mógł zobaczyć na ekranie napis „Hello World”, a program czeka, aż naciśniesz dowolny klawisz.

$ fpc hello.pas Free Pascal Compiler version 2.6.0 [2011/12/23] for x86_64 Copyright (c) 1993-2011 by Florian Klaempfl and others Target OS: Linux for x86-64 Compiling hello.pas Linking hello 8 lines compiled, 0.1 sec $ ./hello
Hello, World!

Upewnij się, że darmowy kompilator Pascal fpc znajduje się w Twojej ścieżce i że uruchamiasz go w katalogu zawierającym plik źródłowy hello.pas.

Widzieliście już podstawową strukturę programu pascal, więc będzie łatwo zrozumieć inne podstawowe elementy składowe języka programowania pascal.

Zmienne

Definicja zmiennej jest umieszczana w bloku zaczynającym się od a var słowo kluczowe, po którym następują definicje zmiennych w następujący sposób:

var
A_Variable, B_Variable ... : Variable_Type;

Zmienne Pascal są deklarowane poza treścią kodu funkcji, co oznacza, że ​​nie są zadeklarowane w ramach begin i end par, ale są deklarowane po definicji procedury / funkcji, a przed beginsłowo kluczowe. W przypadku zmiennych globalnych są one definiowane po nagłówku programu.

Funkcje / procedury

W Pascalu a procedure jest zbiorem instrukcji do wykonania, bez zwracanej wartości, a functionjest procedurą, która zwraca wartość. Definicja funkcji / procedur będzie następująca -

Function Func_Name(params...) : Return_Value;
Procedure Proc_Name(params...);

Komentarze

Komentarze wielowierszowe są zawarte w nawiasach klamrowych i gwiazdkach jako (* ... *). Pascal dopuszcza jednowierszowe komentarze w nawiasach klamrowych {...}.

(* This is a multi-line comments
   and it will span multiple lines. *)

{ This is a single line comment in pascal }

Rozróżnianie wielkości liter

Pascal jest językiem niewrażliwym na wielkość liter, co oznacza, że ​​możesz pisać zmienne, funkcje i procedury w obu przypadkach. Podobnie jak zmienne A_Variable, a_variable i A_VARIABLE mają to samo znaczenie w Pascalu.

Instrukcje Pascal

Programy Pascal składają się z instrukcji. Każda instrukcja określa określone zadanie programu. Zadania te mogą obejmować deklarację, przypisanie, odczyt danych, zapis danych, podejmowanie decyzji logicznych, przekazywanie kontroli przepływu programu itp.

Na przykład -

readln (a, b, c);
s := (a + b + c)/2.0;
area := sqrt(s * (s - a)*(s-b)*(s-c));
writeln(area);

Zarezerwowane słowa w języku Pascal

Oświadczenia w języku Pascal są zaprojektowane za pomocą pewnych specyficznych słów Pascal, zwanych słowami zastrzeżonymi. Na przykład słowa, program, input, output, var, real, begin, readline, writeline i end są słowami zastrzeżonymi.

Poniżej znajduje się lista słów zastrzeżonych dostępnych w języku Pascal.

i szyk zaczynać walizka konst
div zrobić aż do jeszcze koniec
plik dla funkcjonować iść do gdyby
w etykieta mod zero nie
z lub zapakowane procedura program
rekord powtarzać zestaw następnie do
rodzaj aż do var podczas z

Zestaw znaków i identyfikatory w Pascalu

Zestaw znaków Pascal składa się z -

  • Wszystkie wielkie litery (AZ)

  • Wszystkie małe litery (az)

  • Wszystkie cyfry (0–9)

  • Symbole specjalne - + * /: =,. ;. () [] = {} `` biała przestrzeń

Jednostki w programie Pascal, takie jak zmienne i stałe, typy, funkcje, procedury i rekordy itp., Mają nazwę lub identyfikator. Identyfikator to ciąg liter i cyfr zaczynający się od litery. W identyfikatorze nie wolno używać specjalnych symboli i spacji.

Typy danych podmiotu wskazują znaczenie, ograniczenia, możliwe wartości, operacje, funkcje i sposób przechowywania z nim związanych.

Typy całkowite, rzeczywiste, logiczne i znakowe są określane jako standardowe typy danych. Typy danych można podzielić na skalarne, wskaźnikowe i strukturalne. Przykładami skalarnych typów danych są liczby całkowite, rzeczywiste, logiczne, znakowe, podzakresy i wyliczeniowe. Strukturyzowane typy danych składają się z typów skalarnych; na przykład tablice, rekordy, pliki i zbiory. Później omówimy typy danych wskaźników.

Typy danych Pascal

Typy danych Pascal można podsumować jak poniżej na poniższym diagramie -

Deklaracje typu

Deklaracja typu służy do deklarowania typu danych identyfikatora. Składnia deklaracji typu to -

type-identifier-1, type-identfier-2 = type-specifier;

Na przykład następująca deklaracja definiuje zmienne dni i wiek jako typ całkowity, tak i prawda jako typ boolowski, nazwę i miasto jako typ łańcuchowy, opłaty i wydatki jako typ rzeczywisty.

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Typy całkowite

Poniższa tabela zawiera szczegółowe informacje o standardowych typach liczb całkowitych, ich rozmiarach i zakresach wartości używanych w Object Pascal -

Rodzaj Minimum Maksymalny Format
Liczba całkowita -2147483648 2147483647 podpisany 32-bitowy
Kardynał 0 4294967295 bez znaku 32-bitowe
Shortint -128 127 podpisany 8-bitowy
Smallint -32768 32767 podpisany 16-bitowy
Longint -2147483648 2147483647 podpisany 32-bitowy
Int64 -2 ^ 63 2 ^ 63 - 1 podpisany 64-bitowy
Bajt 0 255 unsigned 8-bitowy
Słowo 0 65535 unsigned 16-bitowy
Longword 0 4294967295 bez znaku 32-bitowe

Stałe

Użycie stałych sprawia, że ​​program jest bardziej czytelny i pomaga zachować specjalne ilości w jednym miejscu na początku programu. Pascal dopuszcza stałe numeryczne, logiczne, łańcuchowe i znakowe . Stałe można zadeklarować w części deklaracyjnej programu, określając rozszerzenieconst deklaracja.

Składnia deklaracji typu stałego jest następująca -

const
Identifier = contant_value;

Oto kilka przykładów stałych deklaracji -

VELOCITY_LIGHT = 3.0E=10;
PIE = 3.141592;
NAME = 'Stuart Little';
CHOICE = yes;
OPERATOR = '+';

Wszystkie deklaracje stałe należy podać przed deklaracją zmiennej.

Wyliczone typy

Wyliczeniowe typy danych to typy danych zdefiniowane przez użytkownika. Pozwalają na określenie wartości na liście. Tylko operatory przypisania i operatory relacyjne są dozwolone dla wyliczonych typów danych. Wyliczone typy danych można zadeklarować w następujący sposób -

type
enum-identifier = (item1, item2, item3, ... )

Oto kilka przykładów wyliczeniowych deklaracji typów -

type
SUMMER = (April, May, June, July, September);
COLORS = (Red, Green, Blue, Yellow, Magenta, Cyan, Black, White);
TRANSPORT = (Bus, Train, Airplane, Ship);

Kolejność, w jakiej elementy są wymienione w domenie typu wyliczeniowego, określa kolejność elementów. Na przykład w wyliczonym typie LATO kwiecień przypada przed majem, maj przed czerwcem i tak dalej. Domena wyliczonych identyfikatorów typów nie może składać się ze stałych liczbowych ani znakowych.

Typy podzakresów

Typy podzakresów pozwalają zmiennej przyjmować wartości mieszczące się w pewnym zakresie. Na przykład, jeśli wiek wyborców powinien wynosić od 18 do 100 lat, zmienną o nazwie wiek można zadeklarować jako -

var
age: 18 ... 100;

Szczegółowo przyjrzymy się deklaracji zmiennych w następnej sekcji. Możesz również zdefiniować typ podzakresu przy użyciu deklaracji typu. Składnia deklarowania typu podzakresu jest następująca -

type
subrange-identifier = lower-limit ... upper-limit;

Oto kilka przykładów deklaracji typu podzakresów -

const
P = 18;
Q = 90;
type
Number = 1 ... 100;
Value = P ... Q;

Typy podzakresów można tworzyć z podzbioru już zdefiniowanego typu wyliczeniowego, na przykład -

type
months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
Summer = Apr ... Aug;
Winter = Oct ... Dec;

Zmienna to nic innego jak nazwa nadana obszarowi pamięci, którym nasze programy mogą manipulować. Każda zmienna w Pascalu ma określony typ, który określa rozmiar i układ pamięci zmiennej; zakres wartości, które mogą być przechowywane w tej pamięci; oraz zestaw operacji, które można zastosować do zmiennej.

Nazwa zmiennej może składać się z liter, cyfr i znaku podkreślenia. Musi zaczynać się od litery lub podkreślenia. Pascal jestnot case-sensitive, więc wielkie i małe litery oznaczają to samo tutaj. W oparciu o podstawowe typy wyjaśnione w poprzednim rozdziale, będą następujące podstawowe typy zmiennych -

Podstawowe zmienne w języku Pascal

Sr.No Typ i opis
1

Character

Zwykle pojedynczy oktet (jeden bajt). To jest typ całkowity.

2

Integer

Najbardziej naturalny rozmiar liczby całkowitej dla maszyny.

3

Real

Wartość zmiennoprzecinkowa o pojedynczej precyzji.

4

Boolean

Określa prawdziwe lub fałszywe wartości logiczne. Jest to również typ całkowity.

5

Enumerated

Określa listę zdefiniowaną przez użytkownika.

6

Subrange

Reprezentuje zmienne, których wartości mieszczą się w określonym zakresie.

7

String

Przechowuje tablicę znaków.

Język programowania Pascal pozwala także na definiowanie różnych innych typów zmiennych, które będziemy omawiać w kolejnych rozdziałach, takich jak Wskaźnik, Tablica, Rekordy, Zbiory, Pliki, itp. W tym rozdziale przyjrzymy się tylko podstawowym typom zmiennych.

Deklaracja zmiennej w języku Pascal

Wszystkie zmienne muszą zostać zadeklarowane zanim użyjemy ich w programie Pascal. Po wszystkich deklaracjach zmiennych następuje słowo kluczowe var . Deklaracja określa listę zmiennych, po których następuje dwukropek (:) i typ. Składnia deklaracji zmiennej to -

var
variable_list : type;

W tym przypadku typ musi być prawidłowym typem danych Pascal, w tym typem danych znakowych, całkowitych, rzeczywistych, logicznych lub dowolnego typu danych zdefiniowanego przez użytkownika itp., A lista_zmiennych może składać się z jednej lub więcej nazw identyfikatorów oddzielonych przecinkami. Oto niektóre prawidłowe deklaracje zmiennych -

var
age, weekdays : integer;
taxrate, net_income: real;
choice, isready: boolean;
initials, grade: char;
name, surname : string;

W poprzednim samouczku omówiliśmy, że Pascal umożliwia deklarowanie typu. Typ można zidentyfikować za pomocą nazwy lub identyfikatora. Ten typ może służyć do definiowania zmiennych tego typu. Na przykład,

type
days, age = integer;
yes, true = boolean;
name, city = string;
fees, expenses = real;

Teraz tak zdefiniowane typy mogą być używane w deklaracjach zmiennych -

var
weekdays, holidays : days;
choice: yes;
student_name, emp_name : name;
capital: city;
cost: expenses;

Zwróć uwagę na różnicę między deklaracją typu a deklaracją var . Deklaracja typu wskazuje kategorię lub klasę typów, takich jak liczba całkowita, rzeczywista itp., Podczas gdy specyfikacja zmiennej wskazuje, jakie wartości może przyjmować zmienna. Możesz porównać deklarację typu w Pascalu z typedef w C. Co najważniejsze, nazwa zmiennej odnosi się do miejsca w pamięci, w którym ma być przechowywana wartość zmiennej. Tak nie jest w przypadku deklaracji typu.

Inicjalizacja zmiennej w Pascalu

Zmiennym jest przypisywana wartość z dwukropkiem i znakiem równości, po których następuje stałe wyrażenie. Ogólna forma przypisywania wartości to -

variable_name := value;

Domyślnie zmienne w Pascalu nie są inicjowane zerem. Mogą zawierać wartości śmieci. Dlatego lepszą praktyką jest inicjowanie zmiennych w programie. Zmienne można zainicjować (przypisać wartość początkową) w ich deklaracji. Po inicjalizacji następuje rozszerzenievar słowo kluczowe, a składnia inicjalizacji jest następująca -

var
variable_name : type = value;

Oto kilka przykładów:

age: integer = 15;
taxrate: real = 0.5;
grade: char = 'A';
name: string = 'John Smith';

Spójrzmy na przykład, który korzysta z omówionych dotąd różnych typów zmiennych -

program Greetings;
const
message = ' Welcome to the world of Pascal ';

type
name = string;
var
firstname, surname: name;

begin
   writeln('Please enter your first name: ');
   readln(firstname);
   
   writeln('Please enter your surname: ');
   readln(surname);
   
   writeln;
   writeln(message, ' ', firstname, ' ', surname);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Please enter your first name:
John
Please enter your surname:
Smith
Welcome to the world of Pascal John Smith

Zmienne wyliczeniowe

Wiesz już, jak używać prostych typów zmiennych, takich jak liczba całkowita, liczba rzeczywista i wartość logiczna. Zobaczmy teraz zmienne typu wyliczeniowego, które można zdefiniować jako -

var
var1, var2, ...  : enum-identifier;

Po zadeklarowaniu typu wyliczeniowego można zadeklarować zmienne tego typu. Na przykład,

type
months = (January, February, March, April, May, June, July, August, September, October, November, December);
Var
m: months;
...
M := January;

Poniższy przykład ilustruje koncepcję -

program exEnumeration;
type
beverage = (coffee, tea, milk, water, coke, limejuice);

var
drink:beverage;

begin
   writeln('Which drink do you want?');
   drink := limejuice;
   
   writeln('You can drink ', drink);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Which drink do you want?
You can drink limejuice

Zmienne podzakresu

Zmienne podzakresu są deklarowane jako -

var
subrange-name : lowerlim ... uperlim;

Przykładami zmiennych podzakresów są -

var
marks: 1 ... 100;
grade: 'A' ... 'E';
age: 1 ... 25;

Poniższy program ilustruje koncepcję -

program exSubrange;
var
marks: 1 .. 100;
grade: 'A' .. 'E';

begin
   writeln( 'Enter your marks(1 - 100): ');
   readln(marks);
   
   writeln( 'Enter your grade(A - E): ');
   readln(grade);
   
   writeln('Marks: ' , marks, ' Grade: ', grade);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter your marks(1 - 100): 
100
Enter your grade(A - E):
A
Marks: 100 Grade: A

Stała to jednostka, która pozostaje niezmieniona podczas wykonywania programu. Pascal umożliwia deklarowanie tylko stałych następujących typów -

  • Typy porządkowe
  • Ustaw typy
  • Typy wskaźników (ale jedyną dozwoloną wartością jest Nil).
  • Prawdziwe typy
  • Char
  • String

Deklarowanie stałych

Składnia deklarowania stałych jest następująca -

const
identifier = constant_value;

Poniższa tabela zawiera przykłady niektórych prawidłowych deklaracji stałych -

Real type constant

Sr.No Stałe typy i przykłady
1

Ordinal(Integer)type constant

valid_age = 21;

2

Set type constant

Samogłoski = zbiór (A, E, I, O, U);

3

Pointer type constant

P = NIL;

4

e = 2,7182818;

velocity_light = 3,0E + 10;

5

Character type constant

Operator = '+';

6

String type constant

prezes = „Johnny Depp”;

Poniższy przykład ilustruje koncepcję -

program const_circle (input,output);
const
PI = 3.141592654;

var
r, d, c : real;   {variable declaration: radius, dia, circumference}

begin
   writeln('Enter the radius of the circle');
   readln(r);
   
   d := 2 * r;
   c :=  PI * d;
   writeln('The circumference of the circle is ',c:7:2);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter the radius of the circle
23
The circumference of the circle is 144.51

Obserwuj formatowanie w instrukcji wyjściowej programu. Zmienną c należy sformatować tak, aby zawierała łącznie 7 i 2 cyfry po przecinku. Pascal umożliwia takie formatowanie wyjścia za pomocą zmiennych numerycznych.

Operator to symbol, który mówi kompilatorowi, aby wykonał określone operacje matematyczne lub logiczne. Pascal dopuszcza następujące typy operatorów -

  • Operatory arytmetyczne
  • Operatorzy relacyjni
  • Operatory boolowskie
  • Operatory bitowe
  • Ustaw operatory
  • Operatory łańcuchowe

Omówmy kolejno operatory arytmetyczne, relacyjne, logiczne i bitowe. Później omówimy operatory zbiorów i operacje na łańcuchach.

Operatory arytmetyczne

Poniższa tabela przedstawia wszystkie operatory arytmetyczne obsługiwane przez Pascala. Przyjmij zmiennąA posiada 10 i zmienną B mieści 20, a następnie -

Pokaż przykłady

Operator Opis Przykład
+ Dodaje dwa operandy A + B da 30
- Odejmuje drugi operand od pierwszego A - B da -10
* Mnoży oba operandy A * B da 200
/ Dzieli licznik przez mianownik B / A da 2
% Operator modułu i reszta po dzieleniu całkowitoliczbowym B% A da 0

Operatorzy relacyjni

Poniższa tabela przedstawia wszystkie operatory relacyjne obsługiwane przez Pascala. Przyjmij zmiennąA posiada 10 i zmienną B mieści 20, a następnie -

Pokaż przykłady

Operator Opis Przykład
= Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli tak, warunek staje się prawdziwy. (A = B) nie jest prawdą.
<> Sprawdza, czy wartości dwóch operandów są równe, czy nie, jeśli wartości nie są równe, warunek staje się prawdziwy. (A <> B) jest prawdą.
> Sprawdza, czy wartość lewego operandu jest większa niż wartość prawego operandu. Jeśli tak, warunek staje się prawdziwy. (A> B) nie jest prawdą.
< Sprawdza, czy wartość lewego operandu jest mniejsza niż wartość prawego operandu, jeśli tak, warunek staje się prawdziwy. (A <B) jest prawdą.
> = Sprawdza, czy wartość lewego operandu jest większa lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. (A> = B) nie jest prawdą.
<= Sprawdza, czy wartość lewego operandu jest mniejsza lub równa wartości prawego operandu, jeśli tak, warunek staje się prawdziwy. (A <= B) jest prawdą.

Operatory boolowskie

Poniższa tabela przedstawia wszystkie operatory boolowskie obsługiwane przez język Pascal. Wszystkie te operatory działają na operandach boolowskich i dają wyniki boolowskie. Przyjmij zmiennąA jest prawdziwe i zmienne B ma fałsz, więc -

Pokaż przykłady

Operator Opis Przykład
i Nazywany operatorem logicznym AND. Jeśli oba operandy są prawdziwe, warunek staje się prawdziwy. (A i B) jest fałszem.
i wtedy Jest podobny do operatora AND, jednak gwarantuje kolejność, w jakiej kompilator ocenia wyrażenie logiczne. Operandy od lewej do prawej i po prawej są oceniane tylko wtedy, gdy jest to konieczne. (A, a następnie B) jest fałszem.
lub Nazywany operatorem logicznym OR. Jeśli którykolwiek z dwóch operandów jest prawdziwy, warunek staje się prawdziwy. (A lub B) jest prawdą.
albo Jest podobny do logicznego OR, jednak gwarantuje kolejność, w jakiej kompilator ocenia wyrażenie logiczne. Operandy od lewej do prawej i po prawej są oceniane tylko wtedy, gdy jest to konieczne. (A lub B) jest prawdą.
nie Nazywany operatorem logicznym NIE. Służy do odwracania stanu logicznego argumentu. Jeśli warunek jest prawdziwy, wówczas operator logiczny NOT sprawi, że będzie on fałszywy. nie (A i B) jest prawdą.

Operatory bitowe

Operatory bitowe pracują na bitach i wykonują operacje bit po bicie. Wszystkie te operatory działają na operandach całkowitych i dają wyniki w postaci liczb całkowitych. Tabela prawdy dla bitowych i (&), bitowych lub (|) i bitowych nie (~) jest następująca -

p q p & q p | q ~ p ~ q
0 0 0 0 1 1
0 1 0 1 1 0
1 1 1 1 0 0
1 0 0 1 0 1

Załóżmy, że A = 60; i B = 13; teraz w formacie binarnym będą wyglądać następująco -

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

W poniższej tabeli wymieniono operatory bitowe obsługiwane przez Pascal. Załóżmy, że zmienna A zawiera 60, a zmienna B 13, a następnie:

Pokaż przykłady

Operator Opis Przykład
& Operator binarny AND kopiuje trochę do wyniku, jeśli istnieje w obu operandach. (A i B) da 12, czyli 0000 1100
| Operator binarny OR kopiuje bit, jeśli istnieje w którymkolwiek operandzie. (A | B) da 61, czyli 0011 1101
! Operator binarny OR kopiuje bit, jeśli istnieje w którymkolwiek operandzie. Tak samo jak | operator. (A! B) da 61, czyli 0011 1101
~ Operator dopełniacza binarnego jest jednoargumentowy i powoduje „odwracanie” bitów. (~ A) da -61, czyli 1100 0011 w postaci uzupełnienia do 2 ze względu na liczbę binarną ze znakiem.
<< Binarny operator przesunięcia w lewo. Wartość lewych operandów jest przesuwana w lewo o liczbę bitów określoną przez prawy operand. A << 2 da 240, czyli 1111 0000
>> Binarny operator przesunięcia w prawo. Wartość lewego operandu jest przesuwana w prawo o liczbę bitów określoną przez prawy operand. >> 2 da 15, czyli 0000 1111

Należy pamiętać, że różne implementacje Pascala różnią się operatorami bitowymi. Free Pascal, kompilator, którego tutaj użyliśmy, obsługuje jednak następujące operatory bitowe -

Operatorzy Operacje
nie Bitowe NIE
i Bitowe AND
lub Bitowe OR
xor Wyłączne OR bitowe
shl Przesunięcie bitowe w lewo
shr Przesunięcie bitowe w prawo
<< Przesunięcie bitowe w lewo
>> Przesunięcie bitowe w prawo

Pierwszeństwo operatorów w Pascalu

Pierwszeństwo operatorów określa grupowanie terminów w wyrażeniu. Ma to wpływ na sposób oceny wyrażenia. Niektórzy operatorzy mają wyższy priorytet niż inni; na przykład operator mnożenia ma wyższy priorytet niż operator dodawania.

Na przykład x = 7 + 3 * 2; tutaj x ma przypisane 13, a nie 20, ponieważ operator * ma wyższy priorytet niż +, więc najpierw jest mnożony przez 3 * 2, a następnie sumowany do 7.

Tutaj operatory o najwyższym priorytecie pojawiają się na górze tabeli, a operatory o najniższym priorytecie - na dole. W wyrażeniu najpierw zostaną ocenione operatory o wyższym priorytecie.

Pokaż przykłady

Operator Precedens
~ nie, Najwyższa
*, /, div, mod i, &
|,!, +, - lub,
=, <>, <, <=,>,> =, in
albo jeszcze, a potem Najniższa

Struktury decyzyjne wymagają, aby programista określił jeden lub więcej warunków, które mają być ocenione lub przetestowane przez program, wraz z instrukcją lub instrukcjami, które mają zostać wykonane, jeśli warunek zostanie określony jako prawdziwy, i opcjonalnie inne instrukcje do wykonania, jeśli warunek jest zdeterminowany, aby być fałszywy.

Poniżej przedstawiono ogólną formę typowej struktury podejmowania decyzji występującej w większości języków programowania -

Język programowania Pascal udostępnia następujące typy instrukcji decyzyjnych. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No Oświadczenie i opis
1 jeśli - to oświadczenie

Na if - then statement składa się z wyrażenia logicznego, po którym następuje co najmniej jedna instrukcja.

2 Instrukcja if-then-else

Na if - then statement może następować opcjonalnie else statement, która jest wykonywana, gdy wyrażenie logiczne ma wartość false.

3 zagnieżdżone instrukcje if

Możesz użyć jednego if lub else if oświadczenie wewnątrz innego if lub else if sprawozdania).

4 oświadczenie przypadku

ZA case Instrukcja umożliwia testowanie zmiennej pod kątem równości względem listy wartości.

5 case - else oświadczenie

Jest podobny do if-then-else komunikat. Tutaj plikelse termin następuje po case statement.

6 zagnieżdżone instrukcje przypadku

Możesz użyć jednego case oświadczenie wewnątrz innego case sprawozdania).

Może zaistnieć sytuacja, gdy trzeba będzie kilkakrotnie wykonać blok kodu. Ogólnie instrukcje są wykonywane sekwencyjnie: pierwsza instrukcja funkcji jest wykonywana jako pierwsza, po niej następuje druga i tak dalej.

Języki programowania zapewniają różne struktury kontrolne, które pozwalają na bardziej skomplikowane ścieżki wykonywania.

Instrukcja pętli pozwala nam wielokrotnie wykonać instrukcję lub grupę instrukcji, a następująca po niej jest ogólną postacią instrukcji pętli w większości języków programowania -

Język programowania Pascal zapewnia następujące typy konstrukcji pętli do obsługi wymagań pętli. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No Typ i opis pętli
1 pętla podczas wykonywania

Powtarza instrukcję lub grupę instrukcji, gdy dany warunek jest prawdziwy. Testuje warunek przed wykonaniem treści pętli.

2 pętla for-do

Wykonuje sekwencję instrukcji wiele razy i skraca kod zarządzający zmienną pętli.

3 pętla powtarzania do

Podobnie jak instrukcja while, z tą różnicą, że testuje warunek na końcu treści pętli.

4 pętle zagnieżdżone

Możesz użyć jednej lub więcej pętli w dowolnej innej pętli while, for lub powtórzyć do pętli.

Instrukcje sterowania pętlą

Instrukcje sterujące pętlą zmieniają wykonanie z jego normalnej sekwencji. Gdy wykonanie opuszcza zakres, wszystkie automatyczne obiekty utworzone w tym zakresie są niszczone.

Pascal obsługuje następujące instrukcje sterujące. Kliknij poniższe łącza, aby sprawdzić ich szczegóły.

Sr.No Oświadczenie i opis kontroli
1 instrukcja break

Kończy loop lub case instrukcja i przekazuje wykonanie do instrukcji bezpośrednio po pętli lub instrukcji case.

2 kontynuuj oświadczenie

Powoduje, że pętla pomija pozostałą część swojego ciała i natychmiast ponownie testuje swój stan przed ponownym powtórzeniem.

3 instrukcja goto

Przekazuje kontrolę do oznaczonej instrukcji. Chociaż nie jest zalecane używanie w programie instrukcji goto.

Podprogramy

Podprogram to jednostka / moduł programu, który wykonuje określone zadanie. Te podprogramy są łączone w celu utworzenia większych programów. Zasadniczo nazywa się to „konstrukcją modułową”. Podprogram może zostać wywołany przez podprogram / program, który jest nazywany programem wywołującym.

Pascal udostępnia dwa rodzaje podprogramów -

  • Functions - te podprogramy zwracają pojedynczą wartość.

  • Procedures - te podprogramy nie zwracają bezpośrednio wartości.

Funkcje

ZA functionto grupa instrukcji, które razem wykonują zadanie. Każdy program Pascala ma co najmniej jedną funkcję, którą jest sam program, a wszystkie najbardziej trywialne programy mogą definiować dodatkowe funkcje.

Funkcja declarationinformuje kompilator o nazwie funkcji, typie zwracanym i parametrach. Funkcjadefinition dostarcza rzeczywistą treść funkcji.

Biblioteka standardowa Pascal zapewnia liczne wbudowane funkcje, które program może wywołać. Na przykład functionAppendStr() dołącza dwa ciągi, funkcja New() dynamicznie przydziela pamięć do zmiennych i wielu innych funkcji.

Definiowanie funkcji

W Pascalu a functionjest definiowana za pomocą słowa kluczowego function. Ogólna postać definicji funkcji jest następująca -

function name(argument(s): type1; argument(s): type2; ...): function_type;
local declarations;

begin
   ...
   < statements >
   ...
   name:= expression;
end;

Definicja funkcji w Pascalu składa się z funkcji header, lokalnie declarations i funkcję body. Nagłówek funkcji składa się ze słowa kluczowego function i plikunamenadana funkcji. Oto wszystkie części funkcji -

  • Arguments- Argument (y) ustanawiają powiązanie między programem wywołującym a identyfikatorami funkcji i nazywane są również parametrami formalnymi. Parametr działa jak symbol zastępczy. Gdy funkcja jest wywoływana, przekazujesz wartość do parametru. Ta wartość jest określana jako rzeczywisty parametr lub argument. Lista parametrów odnosi się do typu, kolejności i liczby parametrów funkcji. Użycie takich parametrów formalnych jest opcjonalne. Te parametry mogą mieć standardowy typ danych, typ danych zdefiniowany przez użytkownika lub typ podzakresu.

    Lista parametrów formalnych pojawiająca się w instrukcji funkcji może być zmiennymi prostymi lub indeksowanymi, tablicami lub zmiennymi strukturalnymi lub podprogramami.

  • Return Type- Wszystkie funkcje muszą zwracać wartość, więc wszystkim funkcjom należy przypisać typ. Plikfunction-typejest typem danych wartości zwracanej przez funkcję. Może to być typ standardowy, skalarny lub podzakres zdefiniowany przez użytkownika, ale nie może być typem strukturalnym.

  • Local declarations - Deklaracje lokalne odnoszą się do deklaracji etykiet, stałych, zmiennych, funkcji i procedur, które mają zastosowanie tylko do treści funkcji.

  • Function Body- Treść funkcji zawiera zbiór instrukcji, które definiują, co robi funkcja. Powinien zawsze znajdować się między zarezerwowanymi słowami rozpoczynającymi się i kończącymi. Jest to część funkcji, w której wykonywane są wszystkie obliczenia. Musi istnieć instrukcja przypisania typu -name := expression;w treści funkcji, która przypisuje wartość do nazwy funkcji. Ta wartość jest zwracana podczas wykonywania funkcji. Ostatnia instrukcja w treści musi być instrukcją końcową.

Poniżej znajduje się przykład pokazujący, jak zdefiniować funkcję w pascalu -

(* function returning the max between two numbers *)
function max(num1, num2: integer): integer;

var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

Deklaracje funkcji

Funkcja declarationinformuje kompilator o nazwie funkcji i sposobie wywołania funkcji. Rzeczywistą treść funkcji można zdefiniować oddzielnie.

Deklaracja funkcji składa się z następujących części -

function name(argument(s): type1; argument(s): type2; ...): function_type;

Dla wyżej zdefiniowanej funkcji max (), poniżej znajduje się deklaracja funkcji -

function max(num1, num2: integer): integer;

Deklaracja funkcji jest wymagana, gdy definiujesz funkcję w jednym pliku źródłowym i wywołujesz tę funkcję w innym pliku. W takim przypadku powinieneś zadeklarować funkcję na początku pliku wywołującego funkcję.

Wywołanie funkcji

Tworząc funkcję, podajesz definicję tego, co funkcja ma robić. Aby użyć funkcji, będziesz musiał wywołać tę funkcję, aby wykonać określone zadanie. Gdy program wywołuje funkcję, sterowanie programem jest przekazywane do wywoływanej funkcji. Wywołana funkcja wykonuje zdefiniowane zadanie, a po wykonaniu jej instrukcji return lub po osiągnięciu ostatniej instrukcji końcowej zwraca sterowanie programem z powrotem do programu głównego.

Aby wywołać funkcję, wystarczy przekazać wymagane parametry wraz z nazwą funkcji, a jeśli funkcja zwraca wartość, można ją zapisać. Poniżej znajduje się prosty przykład pokazujący użycie -

program exFunction;
var
   a, b, ret : integer;

(*function definition *)
function max(num1, num2: integer): integer;
var
   (* local variable declaration *)
   result: integer;

begin
   if (num1 > num2) then
      result := num1
   
   else
      result := num2;
   max := result;
end;

begin
   a := 100;
   b := 200;
   (* calling a function to get max value *)
   ret := max(a, b);
   
   writeln( 'Max value is : ', ret );
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Max value is : 200

Procedures to podprogramy, które zamiast zwracać pojedynczą wartość, pozwalają uzyskać grupę wyników.

Definiowanie procedury

W Pascalu procedura jest definiowana przy użyciu rozszerzenia proceduresłowo kluczowe. Ogólna forma definicji procedury jest następująca -

procedure name(argument(s): type1, argument(s): type 2, ... );
   < local declarations >
begin
   < procedure body >
end;

Procedura definition w Pascal składa się z header, lokalnie declarations i a bodyprocedury. Nagłówek procedury składa się ze słowa kluczowegoprocedureoraz nazwę nadaną procedurze. Oto wszystkie części procedury -

  • Arguments- Argument (y) ustanawiają powiązanie między programem wywołującym a identyfikatorami procedur i nazywane są również parametrami formalnymi. Reguły dotyczące argumentów w procedurach są takie same jak dla funkcji.

  • Local declarations - Deklaracje lokalne odnoszą się do deklaracji etykiet, stałych, zmiennych, funkcji i procedur, które mają zastosowanie tylko do treści procedury.

  • Procedure Body- Treść procedury zawiera zbiór instrukcji, które definiują, co robi procedura. Powinien zawsze znajdować się między zarezerwowanymi słowami rozpoczynającymi się i kończącymi. Jest to część procedury, w której wykonywane są wszystkie obliczenia.

Poniżej znajduje się kod źródłowy procedury o nazwie findMin () . Ta procedura przyjmuje 4 parametry x, y, z i m i przechowuje minimum spośród pierwszych trzech zmiennych w zmiennej o nazwie m. Zmienna m jest przekazywanareference (omówimy przekazywanie argumentów przez odniesienie nieco później) -

procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m := x
   else
      m := y;
   
   if z <m then
      m := z;
end; { end of procedure findMin }

Deklaracje procedur

Procedura declarationinformuje kompilator o nazwie procedury i sposobie wywołania procedury. Rzeczywistą treść procedury można zdefiniować oddzielnie.

Deklaracja procedury ma następującą składnię -

procedure name(argument(s): type1, argument(s): type 2, ... );

Należy pamiętać, że name of the procedure is not associated with any type. Dla wyżej zdefiniowanej procedury findMin () , poniżej znajduje się deklaracja -

procedure findMin(x, y, z: integer; var m: integer);

Wywołanie procedury

Tworząc procedurę, podajesz definicję tego, co ma ona zrobić. Aby użyć tej procedury, będziesz musiał wywołać tę procedurę, aby wykonać określone zadanie. Gdy program wywołuje procedurę, sterowanie programem jest przekazywane do wywoływanej procedury. Wywołana procedura wykonuje zdefiniowane zadanie, a po osiągnięciu ostatniej instrukcji końca zwraca sterowanie z powrotem do programu wywołującego.

Aby wywołać procedurę, wystarczy przekazać wymagane parametry wraz z nazwą procedury, jak pokazano poniżej -

program exProcedure;
var
   a, b, c,  min: integer;
procedure findMin(x, y, z: integer; var m: integer); 
(* Finds the minimum of the 3 values *)

begin
   if x < y then
      m:= x
   else
      m:= y;
   
   if z < m then
      m:= z;
end; { end of procedure findMin }  

begin
   writeln(' Enter three numbers: ');
   readln( a, b, c);
   findMin(a, b, c, min); (* Procedure call *)
   
   writeln(' Minimum: ', min);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter three numbers:
89 45 67
Minimum: 45

Podprogramy rekurencyjne

Widzieliśmy, że program lub podprogram może wywołać inny podprogram. Gdy podprogram wywołuje sam siebie, nazywa się to wywołaniem rekurencyjnym, a proces nazywany jest rekurencją.

Aby zilustrować to pojęcie, obliczmy silnię liczby. Silnia liczby n jest definiowana jako -

n! = n*(n-1)!
   = n*(n-1)*(n-2)!
      ...
   = n*(n-1)*(n-2)*(n-3)... 1

Poniższy program oblicza silnię podanej liczby, wywołując siebie rekurencyjnie.

program exRecursion;
var
   num, f: integer;
function fact(x: integer): integer; (* calculates factorial of x - x! *)

begin
   if x=0 then
      fact := 1
   else
      fact := x * fact(x-1); (* recursive call *)
end; { end of function fact}

begin
   writeln(' Enter a number: ');
   readln(num);
   f := fact(num);
   
   writeln(' Factorial ', num, ' is: ' , f);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter a number:
5
Factorial 5 is: 120

Poniżej znajduje się kolejny przykład, który generuje Fibonacci Series dla danej liczby za pomocą recursive funkcja -

program recursiveFibonacci;
var
   i: integer;
function fibonacci(n: integer): integer;

begin
   if n=1 then
      fibonacci := 0
   
   else if n=2 then
      fibonacci := 1
   
   else
      fibonacci := fibonacci(n-1) + fibonacci(n-2);
end; 

begin
   for i:= 1 to 10 do
   
   write(fibonacci (i), '  ');
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

0 1 1 2	3 5 8 13 21 34

Argumenty podprogramu

Jeśli podprogram (function or procedure) ma używać argumentów, musi zadeklarować zmienne, które akceptują wartości argumentów. Te zmienne nazywane sąformal parameters podprogramu.

Parametry formalne zachowują się jak inne zmienne lokalne wewnątrz podprogramu i są tworzone przy wejściu do podprogramu i niszczone przy wyjściu.

Podczas wywoływania podprogramu argumenty mogą być przekazywane do podprogramu na dwa sposoby -

Sr.No Typ i opis połączenia
1 Zadzwoń według wartości

Ta metoda kopiuje rzeczywistą wartość argumentu do parametru formalnego podprogramu. W tym przypadku zmiany dokonane w parametrze wewnątrz podprogramu nie mają wpływu na argument.

2 Zadzwoń przez odniesienie

Ta metoda kopiuje adres argumentu do parametru formalnego. Wewnątrz podprogramu adres jest używany do uzyskania dostępu do faktycznego argumentu używanego w wywołaniu. Oznacza to, że zmiany wprowadzone w parametrze wpływają na argument.

Domyślnie Pascal używa call by valueprzekazywać argumenty. Ogólnie oznacza to, że kod w podprogramie nie może zmienić argumentów używanych do wywołania podprogramu. Przykładowy program, którego użyliśmy w rozdziale „Pascal - Funkcje”, wywołał funkcję o nazwie max () używająccall by value.

Natomiast podany tutaj przykładowy program ( exProcedure ) wywołuje procedurę findMin () używająccall by reference.

Zakres w każdym programowaniu to region programu, w którym zdefiniowana zmienna może istnieć, a poza nią nie można uzyskać dostępu. Istnieją trzy miejsca, w których można zadeklarować zmienne w języku programowania Pascal -

  • W podprogramie lub bloku nazywanym zmiennymi lokalnymi

  • Poza wszystkimi podprogramami, które są nazywane zmiennymi globalnymi

  • W definicji parametrów podprogramu nazywamy to parametrami formalnymi

Wyjaśnijmy, jakie są local i global zmienne i parametry formalne.

Zmienne lokalne

Zmienne zadeklarowane wewnątrz podprogramu lub bloku nazywane są zmiennymi lokalnymi. Mogą być używane tylko przez instrukcje, które znajdują się wewnątrz tego podprogramu lub bloku kodu. Zmienne lokalne nie są znane podprogramom poza ich własnymi. Poniżej znajduje się przykład użycia zmiennych lokalnych. Tutaj wszystkie zmienne a , b i c są lokalne dla programu o nazwie exLocal .

program exLocal; 
var
   a, b, c: integer;

begin
   (* actual initialization *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

value of a = 10 b = 20 c = 30

Teraz rozszerzmy program trochę bardziej, stwórzmy procedurę o nazwie display, która będzie miała własny zestaw zmiennych a , b i c i będzie wyświetlać ich wartości bezpośrednio z programu exLocal .

program exLocal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;
begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= a + b;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   display();
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
value of a = 10 b = 20 c = 30

Zmienne globalne

Zmienne globalne są definiowane poza funkcją, zwykle w górnej części programu. Zmienne globalne zachowają swoją wartość przez cały okres istnienia programu i można uzyskać do nich dostęp w ramach dowolnej funkcji zdefiniowanej dla programu.

ZA globalDostęp do zmiennej można uzyskać za pomocą dowolnej funkcji. Oznacza to, że zmienna globalna jest dostępna do użycia w całym programie po jej zadeklarowaniu. Poniżej znajduje się przykład użyciaglobal i local zmienne -

program exGlobal;
var
   a, b, c: integer;
procedure display;
var
   x, y, z: integer;

begin
   (* local variables *)
   x := 10;
   y := 20;
   z := x + y;
   
   (*global variables *)
   a := 30;
   b:= 40;
   c:= a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables x, y, and z');
   
   writeln('value of x = ', x , ' y =  ',  y, ' and z = ', z);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   
   display();
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 30 b = 40 c = 70
Displaying the local variables x, y, and z
value of x = 10 y = 20 z = 30

Proszę zauważyć, że wyświetlacz procedury ma dostęp do zmiennych a, b i c, które są zmiennymi globalnymi w odniesieniu do wyświetlania, jak również do własnych zmiennych lokalnych. Program może mieć taką samą nazwę dla zmiennych lokalnych i globalnych, ale wartość zmiennej lokalnej wewnątrz funkcji będzie miała pierwszeństwo.

Zmieńmy trochę poprzedni przykład, teraz zmienne lokalne do wyświetlania procedury mają takie same nazwy jak a , b , c -

program exGlobal;
var
   a, b, c: integer;
procedure display;

var
   a, b, c: integer;

begin
   (* local variables *)
   a := 10;
   b := 20;
   c := a + b;
   
   writeln('Winthin the procedure display');
   writeln(' Displaying the global variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
   writeln('Displaying the local variables a, b, and c');
   
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);
end;

begin
   a:= 100;
   b:= 200;
   c:= 300;
   
   writeln('Winthin the program exlocal');
   writeln('value of a = ', a , ' b =  ',  b, ' and c = ', c);   
   
   display();
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Within the program exlocal
value of a = 100 b = 200 c = 300
Within the procedure display
Displaying the global variables a, b, and c
value of a = 10 b = 20 c = 30
Displaying the local variables a, b, and c
value of a = 10 b = 20 c = 30

Łańcuch w Pascalu jest w rzeczywistości sekwencją znaków z opcjonalną specyfikacją rozmiaru. Znaki mogą być numeryczne, litery, spacje, znaki specjalne lub kombinacja wszystkich. Extended Pascal zapewnia wiele typów obiektów łańcuchowych w zależności od systemu i implementacji. Omówimy bardziej popularne typy łańcuchów używanych w programach.

Możesz zdefiniować ciąg na wiele sposobów -

  • Character arrays - Jest to ciąg znaków składający się z zera lub więcej znaków wielkości bajtów ujętych w pojedyncze cudzysłowy.

  • String variables - Zmienna typu String, zgodnie z definicją w Turbo Pascalu.

  • Short strings - zmienna typu String z określeniem rozmiaru.

  • Null terminated strings - zmienna pchar rodzaj.

  • AnsiStrings - Odpowiedzi to ciągi bez limitu długości.

Pascal udostępnia tylko jeden operator łańcuchowy, operator konkatenacji łańcuchów (+).

Przykłady

Poniższy program wypisuje pierwsze cztery rodzaje łańcuchów. W następnym przykładzie użyjemy AnsiStrings.

program exString;
var
   greetings: string;
   name: packed array [1..10] of char;
   organisation: string[10];
   message: pchar;

begin
   greetings := 'Hello ';
   message := 'Good Day!';
   
   writeln('Please Enter your Name');
   readln(name);
   
   writeln('Please Enter the name of your Organisation');
   readln(organisation);
   
   writeln(greetings, name, ' from ', organisation);
   writeln(message); 
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Please Enter your Name
John Smith
Please Enter the name of your Organisation
Infotech
Hello John Smith from Infotech

Poniższy przykład wykorzystuje kilka dodatkowych funkcji, zobaczmy -

program exString;
uses sysutils;
var
   str1, str2, str3 : ansistring;
   str4: string;
   len: integer;

begin
   str1 := 'Hello ';
   str2 := 'There!';
   
   (* copy str1 into str3 *)
   str3 := str1;
   writeln('appendstr( str3, str1) :  ', str3 );
   
   (* concatenates str1 and str2 *)
   appendstr( str1, str2);
   writeln( 'appendstr( str1, str2) ' , str1 );
   str4 := str1 + str2;
   writeln('Now str4 is: ', str4);
   
   (* total lenghth of str4 after concatenation  *)
   len := byte(str4[0]);
   writeln('Length of the final string str4: ', len); 
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

appendstr( str3, str1) : Hello
appendstr( str1, str2) : Hello There!
Now str4 is: Hello There! There!
Length of the final string str4: 18

Funkcje i procedury pascala

Pascal obsługuje szeroką gamę funkcji i procedur, które manipulują napisami. Te podprogramy różnią się pod względem narzędzi. Tutaj wymieniamy różne podprogramy do manipulacji ciągami dostarczane przez Free Pascal -

Sr.No. Funkcja i cel
1

function AnsiCompareStr(const S1: ; const S2:):Integer;

Porównuje dwa ciągi

2

function AnsiCompareText(const S1: ; const S2:):Integer;

Porównuje dwa ciągi bez rozróżniania wielkości liter

3

function AnsiExtractQuotedStr(var Src: PChar; Quote: Char):;

Usuwa cudzysłowy z ciągu znaków

4

function AnsiLastChar(const S:):PChar;

Pobiera ostatni znak ciągu

5

function AnsiLowerCase(const s:):

Konwertuje ciąg na małe litery

6

function AnsiQuotedStr(const S: ; Quote: Char):;

Cytuje ciąg

7

function AnsiStrComp(S1: PChar;S2: PChar):Integer;

Porównuje ciągi z uwzględnieniem wielkości liter

8

function AnsiStrIComp(S1: PChar; S2: PChar):Integer;

Porównuje ciągi bez rozróżniania wielkości liter

9

function AnsiStrLComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Porównuje L znaków w łańcuchach z uwzględnieniem wielkości liter

10

function AnsiStrLIComp(S1: PChar; S2: PChar; MaxLen: Cardinal):Integer;

Porównuje L znaków w łańcuchach bez uwzględniania wielkości liter

11

function AnsiStrLastChar(Str: PChar):PChar;

Pobiera ostatni znak ciągu

12

function AnsiStrLower(Str: PChar):PChar;

Konwertuje ciąg na małe litery

13

function AnsiStrUpper(Str: PChar):PChar;

Konwertuje ciąg znaków na wielkie litery

14

function AnsiUpperCase(const s:):;

Konwertuje ciąg znaków na wielkie litery

15

procedure AppendStr(var Dest: ; const S:);

Dołącza 2 ciągi

16

procedure AssignStr(var P: PString; const S:);

Przypisuje wartość ciągów na stercie

17

function CompareStr(const S1: ; const S2:):Integer; overload;

Porównuje dwa ciągi z uwzględnieniem wielkości liter

18

function CompareText(const S1: ; const S2:):Integer;

Porównuje dwa ciągi bez rozróżniania wielkości liter

19 procedure DisposeStr(S: PString); overload;

Usuwa ciąg ze sterty

20

procedure DisposeStr(S: PShortString); overload;

Usuwa ciąg ze sterty

21

function IsValidIdent( const Ident:):Boolean;

Czy ciąg jest prawidłowym identyfikatorem pascal

22

function LastDelimiter(const Delimiters: ; const S:):Integer;

Ostatnie wystąpienie znaku w ciągu

23

function LeftStr(const S: ; Count: Integer):;

Pobiera pierwsze N ​​znaków ciągu

24

function LoadStr(Ident: Integer):;

Ładuje ciąg z zasobów

25

function LowerCase(const s: ):; overload;

Konwertuje ciąg na małe litery

26

function LowerCase(const V: variant ):; overload;

Konwertuje ciąg na małe litery

27

function NewStr(const S:):PString; overload;

Przydziela nowy ciąg na stercie

28

function RightStr(const S: ; Count: Integer):;

Pobiera ostatnie N znaków ciągu

29

function StrAlloc(Size: Cardinal):PChar;

Przydziela pamięć dla ciągu

30

function StrBufSize(Str: PChar):SizeUInt;

Rezerwuje pamięć dla ciągu

31

procedure StrDispose(Str: PChar);

Usuwa ciąg ze sterty

32

function StrPas(Str: PChar):;

Konwertuje PChar na łańcuch pascalowy

33

function StrPCopy(Dest: PChar; Source:):PChar;

Kopiuje ciąg pascal

34

function StrPLCopy(Dest: PChar; Source: ; MaxLen: SizeUInt):PChar;

Kopiuje N bajtów łańcucha pascal

35

function UpperCase(const s:):;

Konwertuje ciąg znaków na wielkie litery

Pascal zapewnia typ danych Boolean, który umożliwia programistom definiowanie, przechowywanie i manipulowanie jednostkami logicznymi, takimi jak stałe, zmienne, funkcje i wyrażenia itp.

Wartości logiczne są w zasadzie liczbami całkowitymi. Zmienne typu boolowskiego mają dwie predefiniowane możliwe wartościTrue i False. Wyrażenia rozpoznające wartość logiczną można również przypisać do typu boolowskiego.

Free Pascal obsługuje również ByteBool, WordBool i LongBoolrodzaje. Są to odpowiednio typy Byte, Word lub Longint.

Wartość False jest równoważna 0 (zero), a każda wartość różna od zera jest uznawana za True podczas konwersji na wartość logiczną. Wartość logiczna True jest konwertowana na -1 w przypadku przypisania jej do zmiennej typu LongBool.

Należy zauważyć, że operatory logiczne and, or i not są zdefiniowane dla typu Boolean.

Deklaracja logicznych typów danych

Zmienna typu Boolean jest deklarowana przy użyciu słowa kluczowego var.

var
boolean-identifier: boolean;

na przykład,

var
choice: boolean;

Przykład

program exBoolean;
var
exit: boolean;

choice: char;
   begin
   writeln('Do you want to continue? ');
   writeln('Enter Y/y for yes, and N/n for no');
   readln(choice);

if(choice = 'n') then
   exit := true
else
   exit := false;

if (exit) then
   writeln(' Good Bye!')
else
   writeln('Please Continue');

readln;
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Do you want to continue?
Enter Y/y for yes, and N/n for no
N
Good Bye!
Y
Please Continue

Język programowania Pascal zapewnia strukturę danych zwaną tablicą, która może przechowywać sekwencyjną kolekcję elementów tego samego typu o stałym rozmiarze. Tablica jest używana do przechowywania kolekcji danych, ale często bardziej przydatne jest myślenie o tablicy jako o zbiorze zmiennych tego samego typu.

Zamiast deklarować pojedyncze zmienne, takie jak liczba1, liczba2, ... i liczba100, deklarujesz jedną zmienną tablicową, taką jak liczby, i używasz liczb [1], liczb [2] i ..., liczb [100] do reprezentowania indywidualne zmienne. Dostęp do określonego elementu w tablicy uzyskuje się za pomocą indeksu.

Wszystkie tablice składają się z ciągłych lokalizacji pamięci. Najniższy adres odpowiada pierwszemu elementowi, a najwyższy adres ostatniemu elementowi.

Zwróć uwagę, że jeśli chcesz mieć tablicę w stylu C zaczynającą się od indeksu 0, wystarczy, że zaczniesz indeks od 0 zamiast 1.

Deklarowanie tablic

Aby zadeklarować tablicę w Pascalu, programista może albo zadeklarować typ, a następnie utworzyć zmienne tej tablicy lub bezpośrednio zadeklarować zmienną tablicową.

Ogólna postać deklaracji typu jednowymiarowej tablicy to -

type
   array-identifier = array[index-type] of element-type;

Gdzie,

  • array-identifier - wskazuje nazwę typu tablicy.

  • index-type- określa indeks tablicy; może to być dowolny skalarny typ danych oprócz rzeczywistych

  • element-type - określa typy wartości, które będą przechowywane

Na przykład,

type
   vector = array [ 1..25] of real;
var
   velocity: vector;

Teraz prędkość jest zmienną tablicą typu wektorowego, która wystarcza do przechowywania do 25 liczb rzeczywistych.

Aby rozpocząć tablicę od indeksu 0, deklaracja byłaby -

type
   vector = array [ 0..24] of real;
var
   velocity: vector;

Typy indeksów tablicy

W Pascalu indeks tablicy może być dowolnego typu skalarnego, takiego jak liczba całkowita, wartość logiczna, wyliczenie lub podzakres, z wyjątkiem liczby rzeczywistej. Indeksy tablicy również mogą mieć wartości ujemne.

Na przykład,

type
   temperature = array [-10 .. 50] of real;
var
   day_temp, night_temp: temperature;

Weźmy inny przykład, w którym indeks jest typu znakowego -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;

Indeks dolny może być wyliczeniowy -

type
   color = ( red, black, blue, silver, beige);
   car_color = array of [color] of boolean;
var
   car_body: car_color;

Inicjowanie tablic

W Pascalu tablice są inicjowane poprzez przypisanie, albo przez określenie konkretnego indeksu dolnego, albo za pomocą pętli for-do.

Na przykład -

type
   ch_array = array[char] of 1..26;
var
   alphabet: ch_array;
   c: char;

begin
   ...
   for c:= 'A' to 'Z' do
   alphabet[c] := ord[m];  
   (* the ord() function returns the ordinal values *)

Dostęp do elementów tablicy

Dostęp do elementu uzyskuje się poprzez indeksowanie nazwy tablicy. Odbywa się to poprzez umieszczenie indeksu elementu w nawiasach kwadratowych po nazwie tablicy. Na przykład -

a: integer;
a: = alphabet['A'];

Powyższa instrukcja pobierze pierwszy element z tablicy o nazwie alphabet i przypisze wartość zmiennej a.

Poniżej znajduje się przykład, który będzie wykorzystywał wszystkie wyżej wymienione trzy koncepcje, a mianowicie. deklaracja, przypisanie i dostęp do tablic -

program exArrays;
var
   n: array [1..10] of integer;   (* n is an array of 10 integers *)
   i, j: integer;

begin
   (* initialize elements of array n to 0 *)        
   for i := 1 to 10 do
       n[ i ] := i + 100;   (* set element at location i to i + 100 *)
    (* output each array element's value *)
   
   for j:= 1 to 10 do
      writeln('Element[', j, '] = ', n[j] );
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110

Tablice Pascal w szczegółach

Tablice są ważne dla Pascala i powinny wymagać dużo więcej szczegółów. Istnieje kilka ważnych pojęć związanych z tablicą, które powinny być jasne dla programisty Pascala:

Sr.No Koncepcja i opis
1 Tablice wielowymiarowe

Pascal obsługuje tablice wielowymiarowe. Najprostszą formą tablicy wielowymiarowej jest tablica dwuwymiarowa.

2 Tablica dynamiczna

W tego typu tablicach długość początkowa wynosi zero. Rzeczywistą długość tablicy należy ustawić w standardzieSetLength funkcjonować.

3 Tablica upakowana

Tablice te są pakowane bitowo, tj. Każdy znak lub wartość prawdy jest przechowywany w kolejnych bajtach zamiast używać jednej jednostki pamięci, zwykle słowa (4 bajty lub więcej).

4 Przekazywanie tablic do podprogramów

Można przekazać do podprogramu wskaźnik do tablicy, podając nazwę tablicy bez indeksu.

Wskaźniki w Pascalu są łatwe i przyjemne do nauczenia. Niektóre zadania programowania Pascal są łatwiejsze do wykonania przy użyciu wskaźników, a innych zadań, takich jak dynamiczna alokacja pamięci, nie można wykonać bez użycia wskaźników. Dlatego konieczne jest nauczenie się wskaźników, aby zostać doskonałym programistą Pascala. Zacznijmy uczyć się ich w prostych i łatwych krokach.

Jak wiecie, każda zmienna jest miejscem w pamięci i każda lokalizacja pamięci ma zdefiniowany adres, do którego można uzyskać dostęp za pomocą nazwy zmiennej wskaźnikowej, która oznacza adres w pamięci.

Co to są wskaźniki?

Wskaźnik to zmienna dynamiczna, której wartością jest adres innej zmiennej, tj. Bezpośredni adres miejsca w pamięci. Jak w przypadku każdej zmiennej lub stałej, należy zadeklarować wskaźnik, zanim będzie można go użyć do przechowywania adresu zmiennej. Ogólną postacią deklaracji zmiennej wskaźnikowej jest -

type
   ptr-identifier = ^base-variable-type;

Typ wskaźnika jest definiowany przez poprzedzenie strzałki w górę symbolu daszka (^) typem podstawowym. Typ bazowy definiuje typy elementów danych. Gdy zmienna wskaźnikowa jest zdefiniowana jako określonego typu, może ona wskazywać tylko elementy danych tego typu. Po zdefiniowaniu typu wskaźnika możemy użyćvar deklaracja do zadeklarowania zmiennych wskaźnikowych.

var
   p1, p2, ... : ptr-identifier;

Poniżej znajduje się kilka prawidłowych deklaracji wskaźników -

type
   Rptr = ^real;
   Cptr = ^char;
   Bptr = ^ Boolean;
   Aptr = ^array[1..5] of real;
   date-ptr = ^ date;
      Date = record
         Day: 1..31;
         Month: 1..12;
         Year: 1900..3000;
      End;
var
   a, b : Rptr;
   d: date-ptr;

Zmienne wskaźnika są wyłuskiwane przy użyciu tego samego symbolu daszka (^). Na przykład powiązaną zmienną, do której odwołuje się wskaźnik rptr , jest rptr ^ . Dostęp do niego można uzyskać jako -

rptr^ := 234.56;

Poniższy przykład zilustruje tę koncepcję -

program exPointers;
var
   number: integer;
   iptr: ^integer;

begin
   number := 100;
   writeln('Number is: ', number);
   
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200

Drukowanie adresu pamięci w Pascalach

W Pascalu możemy przypisać adres zmiennej do zmiennej wskaźnikowej za pomocą operatora adresu (@). Używamy tego wskaźnika do manipulowania i uzyskiwania dostępu do elementu danych. Jeśli jednak z jakiegoś powodu musimy pracować z samym adresem pamięci, musimy zapisać go w zmiennej typu słowo.

Rozszerzmy powyższy przykład, aby wydrukować adres pamięci przechowywany we wskaźniku iptr -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   number := 100;
   writeln('Number is: ', number);
   iptr := @number;
   writeln('iptr points to a value: ', iptr^);
   
   iptr^ := 200;
   writeln('Number is: ', number);
   writeln('iptr points to a value: ', iptr^);
   y := addr(iptr);
   writeln(y^); 
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504

Wskaźniki NIL

Przypisanie pliku NILwartość do zmiennej wskaźnikowej w przypadku, gdy nie masz dokładnego adresu do przypisania. Odbywa się to w momencie deklaracji zmiennej. Przypisany wskaźnikNILnigdzie nie wskazuje. Rozważ następujący program -

program exPointers;
var
   number: integer;
   iptr: ^integer;
   y: ^word;

begin
   iptr := nil;
   y := addr(iptr);
   
   writeln('the vaule of iptr is ', y^);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

The value of ptr is 0

Aby sprawdzić nil wskaźnik, możesz użyć instrukcji if w następujący sposób -

if(ptr <> nill )then     (* succeeds if p is not null *)
if(ptr = nill)then    (* succeeds if p is null *)

Wskaźniki Pascal w szczegółach

Wskaźniki mają wiele, ale łatwych koncepcji i są bardzo ważne dla programowania w języku Pascal. Istnieje kilka ważnych pojęć dotyczących wskaźników, które powinny być jasne dla programisty Pascala:

Sr.No Koncepcja i opis
1 Pascal - Arytmetyka wskaźnika

Istnieją cztery operatory arytmetyczne, których można używać na wskaźnikach: inkrementacja, dekrementacja, +, -

2 Pascal - tablica wskaźników

Możesz zdefiniować tablice do przechowywania wielu wskaźników.

3 Pascal - wskaźnik do wskaźnika

Pascal pozwala mieć wskaźnik na wskaźniku i tak dalej.

4 Przekazywanie wskaźników do podprogramów w Pascalu

Przekazanie argumentu przez odniesienie lub przez adres umożliwia zmianę przekazanego argumentu w podprogramie wywołującym przez wywołany podprogram.

5 Zwróć wskaźnik z podprogramów w Pascalu

Pascal umożliwia podprogramowi zwrócenie wskaźnika.

Tablice Pascal pozwalają na zdefiniowanie typu zmiennych, które mogą zawierać kilka elementów danych tego samego rodzaju, ale rekord jest innym typem danych zdefiniowanym przez użytkownika dostępnym w Pascalu, który umożliwia łączenie elementów danych różnego rodzaju.

Rekordy składają się z różnych pól. Załóżmy, że chcesz śledzić swoje książki w bibliotece, możesz chcieć śledzić następujące atrybuty każdej książki:

  • Title
  • Author
  • Subject
  • Identyfikator książki

Definiowanie rekordu

Aby zdefiniować typ rekordu, możesz użyć instrukcji deklaracji typu. Typ rekordu jest zdefiniowany jako -

type
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Oto sposób, w jaki można ogłosić rekord Księgi -

type 
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Zmienne rekordu są definiowane w zwykły sposób jako

var
   r1, r2, ... : record-name;

Alternatywnie możesz bezpośrednio zdefiniować zmienną typu rekordu jako -

var
Books : record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: integer;
end;

Dostęp do pól rekordu

Aby uzyskać dostęp do dowolnego pola rekordu, używamy operatora dostępu do elementu członkowskiego (.). Operator dostępu do członka jest zakodowany jako kropka między nazwą zmiennej rekordu a polem, do którego chcemy uzyskać dostęp. Poniżej znajduje się przykład wyjaśniający użycie struktury -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
 
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1.title);
   writeln('Book 1 author : ', Book1.author);
   writeln( 'Book 1 subject : ', Book1.subject);
   writeln( 'Book 1 book_id : ', Book1.book_id);
   writeln; 

   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2.title);
   writeln('Book 2 author : ', Book2.author);
   writeln( 'Book 2 subject : ', Book2.subject);
   writeln( 'Book 2 book_id : ', Book2.book_id);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Rekordy jako argumenty podprogramów

Możesz przekazać rekord jako argument podprogramu w bardzo podobny sposób, jak przekazujesz dowolną inną zmienną lub wskaźnik. Dostęp do pól rekordów można uzyskać w podobny sposób, jak w powyższym przykładzie -

program exRecords;
type
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
   Book1, Book2: Books; (* Declare Book1 and Book2 of type Books *)

(* procedure declaration *)
procedure printBook( var book: Books );

begin
   (* print Book info *)
   writeln ('Book  title : ', book.title);
   writeln('Book  author : ', book.author);
   writeln( 'Book  subject : ', book.subject);
   writeln( 'Book book_id : ', book.book_id);
end;

begin
   (* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;
   
   (* book 2 specification *)
   Book2.title := 'Telecom Billing';
   Book2.author := 'Zara Ali';
   Book2.subject := 'Telecom Billing Tutorial';
   Book2.book_id := 6495700;
   
   (* print Book1 info *)
   printbook(Book1);
   writeln; 

   (* print Book2 info *)
   printbook(Book2);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Wskaźniki do rekordów

Możesz zdefiniować wskaźniki do rekordów w bardzo podobny sposób, jak definiujesz wskaźnik do dowolnej innej zmiennej w następujący sposób -

type
record-ptr = ^ record-name;
record-name = record
   field-1: field-type1;
   field-2: field-type2;
   ...
   field-n: field-typen;
end;

Teraz możesz przechowywać adres zmiennej typu rekordu w zdefiniowanej powyżej zmiennej wskaźnikowej. Aby zadeklarować zmienną utworzonego typu wskaźnika, użyj słowa kluczowego var -

var
   r1, r2, ... : record-ptr;

Przed użyciem tych wskaźników należy utworzyć pamięć dla zmiennej typu nazwa rekordu, która będzie manipulowana przez te wskaźniki.

new(r1);
new(r2);

Aby uzyskać dostęp do członków rekordu za pomocą wskaźnika do tego rekordu, musisz użyć ^. operator w następujący sposób -

r1^.feild1 := value1;
r1^.feild2 := value2;
...
r1^fieldn := valuen;

Wreszcie, nie zapomnij wyrzucić używanego magazynu, gdy nie jest już używany -

dispose(r1);
dispose(r2);

Napiszmy ponownie pierwszy przykład, używając wskaźnika do rekordu Książki. Mam nadzieję, że będzie Ci łatwo zrozumieć tę koncepcję -

program exRecords;
type
BooksPtr = ^ Books;
Books = record
   title: packed array [1..50] of char;
   author: packed array [1..50] of char;
   subject: packed array [1..100] of char;
   book_id: longint;
end;

var
  (* Declare Book1 and Book2 of pointer type that refers to Book type *)
   Book1, Book2: BooksPtr; 

begin
   new(Book1);
   new(book2);
   
   (* book 1 specification *)
   Book1^.title  := 'C Programming';
   Book1^.author := 'Nuha Ali '; 
   Book1^.subject := 'C Programming Tutorial';
   Book1^.book_id := 6495407;
   
   (* book 2 specification *)
   Book2^.title := 'Telecom Billing';
   Book2^.author := 'Zara Ali';
   Book2^.subject := 'Telecom Billing Tutorial';
   Book2^.book_id := 6495700;
   
   (* print Book1 info *)
   writeln ('Book 1 title : ', Book1^.title);
   writeln('Book 1 author : ', Book1^.author);
   writeln( 'Book 1 subject : ', Book1^.subject);
   writeln( 'Book 1 book_id : ', Book1^.book_id);
   
   (* print Book2 info *)
   writeln ('Book 2 title : ', Book2^.title);
   writeln('Book 2 author : ', Book2^.author);
   writeln( 'Book 2 subject : ', Book2^.subject);
   writeln( 'Book 2 book_id : ', Book2^.book_id);
   
   dispose(Book1); 
   dispose(Book2);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407

Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

Oświadczenie With

Omówiliśmy, że dostęp do członków rekordu można uzyskać za pomocą operatora dostępu do elementów członkowskich (.). W ten sposób nazwa zmiennej rekordu musi być wpisywana za każdym razem. PlikWith oświadczenie zapewnia alternatywny sposób, aby to zrobić.

Spójrz na następujący fragment kodu zaczerpnięty z naszego pierwszego przykładu -

(* book 1 specification *)
   Book1.title  := 'C Programming';
   Book1.author := 'Nuha Ali '; 
   Book1.subject := 'C Programming Tutorial';
   Book1.book_id := 6495407;

To samo zadanie można zapisać przy użyciu rozszerzenia With oświadczenie jako -

(* book 1 specification *)
With Book1 do
begin
   title  := 'C Programming';
   author := 'Nuha Ali '; 
   subject := 'C Programming Tutorial';
   book_id := 6495407;
end;

Pascal obsługuje unikalny typ nazwanych wariantów pamięci. W zmiennej wariantowej można przypisać wartości dowolnego prostego typu. Typ wartości przechowywanej w wariancie jest określany tylko w czasie wykonywania. Prawie każdy typ prosty można przypisać do wariantów: typy porządkowe, typy łańcuchowe, typy int64.

Typy strukturalne, takie jak zbiory, rekordy, tablice, pliki, obiekty i klasy, nie są zgodne z przypisaniem z wariantem. Możesz także przypisać wskaźnik do wariantu.

Free Pascal obsługuje różne warianty.

Deklarowanie wariantu

Możesz zadeklarować typ wariantu jak każdy inny typ przy użyciu varsłowo kluczowe. Składnia deklarowania typu wariantu to -

var
   v: variant;

Teraz ta zmienna wariantowa v może być przypisana do prawie wszystkich prostych typów, w tym typów wyliczeniowych i odwrotnie.

type  
   color = (red, black, white);  
var  
   v : variant;  
   i : integer;  
   b : byte;  
   w : word;  
   q : int64;  
   e : extended;  
   d : double;  
   en : color;  
   as : ansistring;  
   ws : widestring;  

begin  
   v := i;  
   v := b;  
   v := w;  
   v := q;  
   v := e;  
   v := en;  
   v := d:  
   v := as;  
   v := ws;  
end;

Przykład

Poniższy przykład ilustruje koncepcję -

Program exVariant;

uses variants;
type
   color = (red, black, white);

var
   v : variant;
   i : integer;
   r: real;
   c : color;
   as : ansistring;


begin
   i := 100;
   v:= i;
   writeln('Variant as Integer: ', v);

   r:= 234.345;
   v:= r;
   writeln('Variant as real: ', v);

   c := red;
   v := c;
   writeln('Variant as Enumerated data: ', v);

   as:= ' I am an AnsiString';
   v:= as;
   writeln('Variant as AnsiString: ', v);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Variant as Integer: 100
Variant as real: 234.345
Variant as Enumerated data: 0
Variant as AnsiString: I am an AnsiString

Zestaw to zbiór elementów tego samego typu. Pascal umożliwia zdefiniowanie ustawionego typu danych. Elementy zestawu nazywane są jego członkami. W matematyce zbiory są reprezentowane przez ujęcie elementów w nawiasy klamrowe {} . Jednak w Pascalu elementy zestawu są zawarte w nawiasach kwadratowych [], które są określane jako konstruktor zestawów.

Definiowanie typów zestawów i zmiennych

Typy zestawów Pascal są zdefiniowane jako

type
set-identifier = set of base type;

Zmienne typu zestawu są zdefiniowane jako

var
s1, s2, ...: set-identifier;

lub,

s1, s2...: set of base type;

Przykłady niektórych prawidłowych deklaracji typu zestawu to -

type
Days = (mon, tue, wed, thu, fri, sat, sun);
Letters = set of char;
DaySet = set of days;
Alphabets = set of 'A' .. 'Z';
studentAge = set of 13..20;

Operatory zbioru

Na zestawach Pascal można wykonać następujące operacje na zestawach.

Sr.No Operacje i opisy
1

Union

To łączy dwa zestawy i daje nowy zestaw z elementami z obu zestawów.

2

Difference

Pobiera różnicę między dwoma zestawami i podaje nowy zestaw z elementami, które nie są wspólne dla żadnego z zestawów.

3

Intersection

Pobiera przecięcie dwóch zestawów i podaje nowy zestaw z elementami wspólnymi dla obu zestawów.

4

Inclusion

Zbiór P jest zawarty w zestawie Q, jeśli wszystkie przedmioty w P są również w Q, ale nie odwrotnie.

5

Symmetric difference

Pobiera symetryczną różnicę dwóch zestawów i podaje zestaw elementów, które znajdują się w jednym z zestawów, a nie w ich przecięciu.

6

In

Sprawdza członkostwo.

Poniższa tabela przedstawia wszystkie operatory zestawów obsługiwane przez Free Pascal. Zakładać, żeS1 i S2 są dwoma zestawami znaków, takimi, że -

S1: = ['a', 'b', 'c'];

S2: = ['c', 'd', 'e'];

Operator Opis Przykład
+ Połączenie dwóch zbiorów

S1 + S2 da zestaw

[„a”, „b”, „c”, „d”, „e”]

- Różnica dwóch zestawów

S1 - S2 da set

[„a”, „b”]

* Przecięcie dwóch zbiorów

S1 * S2 da zestaw

['do']

> < Różnica symetryczna dwóch zbiorów S1> <S2 da zestaw ['a', 'b', 'd', 'e']
= Sprawdza równość dwóch zbiorów S1 = S2 da wartość logiczną Fałsz
<> Sprawdza nierówność dwóch zbiorów S1 <> S2 poda wartość logiczną True
<= Zawiera (sprawdza, czy jeden zestaw jest podzbiorem drugiego) S1 <= S2 da wartość logiczną Fałsz
Zawierać Zawiera element w zestawie; w zasadzie jest to suma zbioru i element tego samego typu podstawowego

Uwzględnij (S1, ['d']) da zestaw

[„a”, „b”, „c”, „d”]

Wykluczać Wyklucza element z zestawu; w zasadzie jest to Różnica zestawu i elementu tego samego typu podstawowego

Wyklucz (S2, ['d']) da zbiór

['c', 'e']

W Sprawdza przynależność do zestawu elementu w zestawie ['e'] w S2 daje wartość logiczną True

Przykład

Poniższy przykład ilustruje użycie niektórych z tych operatorów -

program setColors;
type  
color = (red, blue, yellow, green, white, black, orange);  
colors = set of color;  
 
procedure displayColors(c : colors);  
const  
names : array [color] of String[7]  
  = ('red', 'blue', 'yellow', 'green', 'white', 'black', 'orange');  
var  
   cl : color;  
   s : String;  

begin  
   s:= ' ';  
   for cl:=red to orange do  
      if cl in c then  
      begin  
         if (s<>' ') then s :=s +' , ';  
         s:=s+names[cl];  
      end;  
   writeln('[',s,']');  
end;  
 
var  
   c : colors;  
 
begin  
   c:= [red, blue, yellow, green, white, black, orange];
   displayColors(c);

   c:=[red, blue]+[yellow, green]; 
   displayColors(c);  

   c:=[red, blue, yellow, green, white, black, orange] - [green, white];     
   displayColors(c);    

   c:= [red, blue, yellow, green, white, black, orange]*[green, white];     
   displayColors(c);  

   c:= [red, blue, yellow, green]><[yellow, green, white, black]; 
   displayColors(c);  
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

[ red , blue , yellow , green , white , black , orange]
[ red , blue , yellow , green]
[ red , blue , yellow , black , orange]
[ green , white]
[ red , blue , white , black]

Pascal traktuje plik jako sekwencję komponentów, które muszą być jednakowego typu. Typ pliku jest określany przez typ składników. Typ danych pliku jest zdefiniowany jako -

type
file-name = file of base-type;

Gdzie typ bazowy wskazuje typ składników pliku. Typem bazowym może być dowolna liczba całkowita, rzeczywista, logiczna, wyliczona, podzakres, rekord, tablice i zbiory z wyjątkiem innego typu pliku. Zmienne typu pliku są tworzone przy użyciu deklaracji var -

var
f1, f2,...: file-name;

Poniżej znajduje się kilka przykładów definiowania niektórych typów plików i zmiennych plików -

type
   rfile = file of real;
   ifile = file of integer;
   bfile = file of boolean;
   datafile = file of record
   arrfile = file of array[1..4] of integer;

var
   marks: arrfile;
   studentdata: datafile;
   rainfalldata: rfile;
   tempdata: ifile;
   choices: bfile;

Tworzenie i zapisywanie do pliku

Napiszmy program, który utworzy plik danych do akt uczniów. Utworzyłby plik o nazwie Students.dat i zapisałby do niego dane ucznia -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   Assign(f,'students.dat');
   Rewrite(f);
   Student.s_name := 'John Smith';
   Student.s_addr := 'United States of America';
   Student.s_batchcode := 'Computer Science';
   Write(f,Student);
   Close(f);
end.

Po skompilowaniu i uruchomieniu program utworzyłby plik o nazwie Students.dat w katalogu roboczym. Możesz otworzyć plik za pomocą edytora tekstu, takiego jak notatnik, aby przejrzeć dane Johna Smitha.

Czytanie z pliku

Właśnie utworzyliśmy i zapisaliśmy w pliku o nazwie Students.dat. Teraz napiszmy program, który odczyta dane ucznia z pliku -

program DataFiles;
type
   StudentRecord = Record
      s_name: String;
      s_addr: String;
      s_batchcode: String;
   end;

var
   Student: StudentRecord;
   f: file of StudentRecord;

begin
   assign(f, 'students.dat');
   reset(f); 
   while not eof(f) do
   
   begin
      read(f,Student);
      writeln('Name: ',Student.s_name);
      writeln('Address: ',Student.s_addr);
      writeln('Batch Code: ', Student.s_batchcode);
   end;
   
   close(f);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Name: John Smith
Address: United States of America
Batch Code: Computer Science

Pliki jako parametr podprogramu

Pascal umożliwia używanie zmiennych plikowych jako parametrów w podprogramach standardowych i zdefiniowanych przez użytkownika. Poniższy przykład ilustruje tę koncepcję. Program tworzy plik o nazwie rainfall.txt i przechowuje niektóre dane dotyczące opadów. Następnie otwiera plik, odczytuje dane i oblicza średnie opady.

Proszę to zanotować, if you use a file parameter with subprograms, it must be declared as a var parameter.

program addFiledata;
const
   MAX = 4;
type
   raindata = file of real;

var
   rainfile: raindata;
   filename: string;
procedure writedata(var f: raindata);

var
   data: real;
   i: integer;

begin
   rewrite(f, sizeof(data));
   for i:=1 to MAX do
   
   begin
      writeln('Enter rainfall data: ');
      readln(data);
      write(f, data);
   end;
   
   close(f);
end;

procedure computeAverage(var x: raindata);
var
   d, sum: real;
   average: real;

begin
   reset(x);
   sum:= 0.0;
   while not eof(x) do
   
   begin
      read(x, d);
      sum := sum + d;
   end;
   
   average := sum/MAX;
   close(x);
   writeln('Average Rainfall: ', average:7:2);
end;

begin
   writeln('Enter the File Name: ');
   readln(filename);
   assign(rainfile, filename);
   writedata(rainfile);
   computeAverage(rainfile);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter the File Name:
rainfall.txt
Enter rainfall data:
34
Enter rainfall data:
45
Enter rainfall data:
56
Enter rainfall data:
78
Average Rainfall: 53.25

Pliki tekstowe

Plik tekstowy w Pascalu składa się z wierszy znaków, z których każdy jest zakończony znacznikiem końca wiersza. Możesz zadeklarować i zdefiniować takie pliki jak -

type
file-name = text;

Różnica między zwykłym plikiem znaków a plikiem tekstowym polega na tym, że plik tekstowy jest podzielony na linie, z których każda jest zakończona specjalnym znacznikiem końca linii, automatycznie wstawianym przez system. Poniższy przykład tworzy i zapisuje w pliku tekstowym o nazwie contact.txt -

program exText;
var
   filename, data: string;
   myfile: text;

begin
   writeln('Enter the file name: ');
   readln(filename);
   
   assign(myfile, filename);
   rewrite(myfile);
   
   writeln(myfile, 'Note to Students: ');
   writeln(myfile, 'For details information on Pascal Programming');
   writeln(myfile, 'Contact: Tutorials Point');
   writeln('Completed writing'); 
   
   close(myfile);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Enter the file name:
contact.txt 
Completed writing

Dołączanie do pliku

Dołączanie do pliku oznacza zapisywanie do istniejącego pliku, który zawiera już pewne dane, bez nadpisywania pliku. Poniższy program ilustruje to -

program exAppendfile;
var
   myfile: text;
   info: string;

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('[email protected]');
   close(myfile);
   
   (* let us read from this file *)
   assign(myfile, 'contact.txt');
   reset(myfile);
   while not eof(myfile) do
   
   begin
      readln(myfile, info);
      writeln(info);
   end;
   close(myfile);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Contact Details
[email protected]
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Funkcje obsługi plików

Free Pascal zapewnia następujące funkcje / procedury obsługi plików -

Sr.No. Nazwa i opis funkcji
1

procedure Append(var t: Text);

Otwiera plik w trybie dołączania

2

procedure Assign(out f: file; const Name:);

Przypisuje nazwę do pliku

3

procedure Assign(out f: file; p: PChar);

Przypisuje nazwę do pliku

4

procedure Assign(out f: file; c: Char);

Przypisuje nazwę do pliku

5

procedure Assign(out f: TypedFile; const Name:);

Przypisuje nazwę do pliku

6

procedure Assign(out f: TypedFile; p: PChar);

Przypisuje nazwę do pliku

7

procedure Assign(out f: TypedFile; c: Char);

Przypisuje nazwę do pliku

8

procedure Assign(out t: Text; const s:);

Przypisuje nazwę do pliku

9

procedure Assign(out t: Text; p: PChar);

Przypisuje nazwę do pliku

10

procedure Assign(out t: Text; c: Char);

Przypisuje nazwę do pliku

11

procedure BlockRead(var f: file; var Buf; count: Int64; var Result: Int64);

Odczytuje dane z pliku do pamięci

12

procedure BlockRead(var f: file; var Buf; count: LongInt; var Result: LongInt);

Odczytuje dane z pliku do pamięci

13

procedure BlockRead(var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Odczytuje dane z pliku do pamięci

14

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Word);

Odczytuje dane z pliku do pamięci

15

procedure BlockRead(var f: file; var Buf; count: Word; var Result: Integer);

Odczytuje dane z pliku do pamięci

16

procedure BlockRead(var f: file; var Buf; count: Int64);

Odczytuje dane z pliku do pamięci

17

procedure BlockWrite(var f: file; const Buf; Count: Int64; var Result: Int64);

Zapisuje dane z pamięci do pliku

18

procedure BlockWrite(var f: file; const Buf; Count: LongInt; var Result: LongInt);

Zapisuje dane z pamięci do pliku

19

procedure BlockWrite(var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Zapisuje dane z pamięci do pliku

20

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Word);

Zapisuje dane z pamięci do pliku

21

procedure BlockWrite(var f: file; const Buf; Count: Word; var Result: Integer);

Zapisuje dane z pamięci do pliku

22

procedure BlockWrite(var f: file; const Buf; Count: LongInt);

Zapisuje dane z pamięci do pliku

23

procedure Close(var f: file);

Zamyka plik

24

procedure Close(var t: Text);

Zamyka plik

25

function EOF(var f: file):Boolean;

Sprawdza koniec pliku

26

function EOF(var t: Text):Boolean;

Sprawdza koniec pliku

27

function EOF: Boolean;

Sprawdza koniec pliku

28

function EOLn(var t: Text):Boolean;

Sprawdza koniec linii

29

function EOLn: Boolean;

Sprawdza koniec linii

30

procedure Erase(var f: file);

Usuwa plik z dysku

31

procedure Erase(var t: Text);

Usuwa plik z dysku

32

function FilePos( var f: file):Int64;

Pozycja w pliku

33

function FileSize(var f: file):Int64;

Rozmiar pliku

34

procedure Flush(var t: Text);

Zapisuje bufory plików na dysku

35

function IOResult: Word;

Zwraca wynik ostatniej operacji we / wy pliku

36

procedure Read(var F: Text; Args: Arguments);

Odczytuje z pliku do zmiennej

37

procedure Read(Args: Arguments);

Odczytuje z pliku do zmiennej

38

procedure ReadLn(var F: Text; Args: Arguments);

Wczytuje z pliku do zmiennej i przechodzi do następnej linii

39

procedure ReadLn(Args: Arguments);

Wczytuje z pliku do zmiennej i przechodzi do następnej linii

40

procedure Rename(var f: file; const s:);

Zmienia nazwę pliku na dysku

41

procedure Rename(var f: file; p: PChar);

Zmienia nazwę pliku na dysku

42

procedure Rename(var f: file; c: Char);

Zmienia nazwę pliku na dysku

43

procedure Rename(var t: Text; const s);

Zmień nazwę pliku na dysku

44

procedure Rename(var t: Text; p: PChar);

Zmienia nazwę pliku na dysku

45

procedure Rename( var t: Text; c: Char);

Zmienia nazwę pliku na dysku

46

procedure Reset(var f: file; l: LongInt);

Otwiera plik do odczytu

47

procedure Reset(var f: file);

Otwiera plik do odczytu

48

procedure Reset(var f: TypedFile);

Otwiera plik do odczytu

49

procedure Reset(var t: Text);

Otwiera plik do odczytu

50

procedure Rewrite(var f: file; l: LongInt);

Otwiera plik do zapisu

51

procedure Rewrite(var f: file);

Otwiera plik do zapisu

52

procedure Rewrite(var f: TypedFile);

Otwiera plik do zapisu

53

procedure Rewrite(var t: Text);

Otwiera plik do zapisu

54

procedure Seek(var f: file; Pos: Int64);

Ustawia pozycję pliku

55

function SeekEOF(var t: Text):Boolean;

Ustawia pozycję pliku na koniec pliku

56

function SeekEOF: Boolean;

Ustawia pozycję pliku na koniec pliku

57

function SeekEOLn(var t: Text):Boolean;

Ustawia pozycję pliku na koniec wiersza

58

function SeekEOLn: Boolean;

Ustawia pozycję pliku na koniec wiersza

59

procedure SetTextBuf(var f: Text; var Buf);

Ustawia rozmiar bufora plików

60

procedure SetTextBuf(var f: Text; var Buf; Size: SizeInt);

Ustawia rozmiar bufora plików

61

procedure Truncate(var F: file);

Obetnij plik na pozycji

62

procedure Write(Args: Arguments);

Zapisuje zmienną do pliku

63

procedure Write(var F: Text; Args: Arguments);

Zapisz zmienną do pliku

64

procedure Writeln(Args: Arguments);

Zapisuje zmienną do pliku i dołącza znak nowej linii

65

procedure WriteLn(var F: Text; Args: Arguments);

Zapisuje zmienną do pliku i dołącza znak nowej linii

Ten rozdział wyjaśnia dynamiczne zarządzanie pamięcią w Pascalu. Język programowania Pascal zapewnia kilka funkcji do przydzielania i zarządzania pamięcią.

Dynamiczne przydzielanie pamięci

Podczas programowania, jeśli jesteś świadomy rozmiaru tablicy, jest to łatwe i możesz zdefiniować ją jako tablicę. Na przykład, aby zapisać imię i nazwisko dowolnej osoby, może mieć maksymalnie 100 znaków, więc możesz zdefiniować coś w następujący sposób -

var
name: array[1..100] of char;

Ale teraz rozważmy sytuację, w której nie masz pojęcia o długości tekstu, który chcesz przechowywać, na przykład chcesz przechowywać szczegółowy opis tematu. Tutaj musimy zdefiniować wskaźnik do łańcucha bez definiowania wymaganej ilości pamięci.

Pascal zapewnia procedurę newdo tworzenia zmiennych wskaźnikowych.

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   new(description);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Teraz, jeśli chcesz zdefiniować wskaźnik z określoną liczbą bajtów, do których ma on się później odwoływać, powinieneś użyć getmem funkcja lub getmem procedura, która ma następującą składnię -

procedure Getmem(
   out p: pointer;
   Size: PtrUInt
);

function GetMem(
   size: PtrUInt
):pointer;

W poprzednim przykładzie zadeklarowaliśmy wskaźnik do łańcucha. Ciąg ma maksymalną wartość 255 bajtów. Jeśli naprawdę nie potrzebujesz tak dużo miejsca lub większej przestrzeni pod względem bajtów, podprogram getmem pozwala to określić. Przepiszmy poprzedni przykład, używając getmem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;

begin
   name:= 'Zara Ali';
   
   description := getmem(200);
      if not assigned(description) then
         writeln(' Error - unable to allocate required memory')
      else
         description^ := 'Zara ali a DPS student in class 10th';
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

Masz więc pełną kontrolę i możesz przekazać dowolną wartość rozmiaru podczas przydzielania pamięci, w przeciwieństwie do tablic, w których raz zdefiniowanego rozmiaru nie można zmienić.

Zmiana rozmiaru i zwalnianie pamięci

Kiedy program się pojawia, system operacyjny automatycznie zwalnia całą pamięć przydzieloną przez program, ale jako dobrą praktykę, gdy nie potrzebujesz już pamięci, powinieneś zwolnić tę pamięć.

Procedurę zapewnia Pascal dispose aby zwolnić dynamicznie utworzoną zmienną za pomocą procedury new. Jeśli przydzieliłeś pamięć za pomocą getmem podprogramu, musisz użyć podprogramu freememaby uwolnić tę pamięć. W freemem podprogramy mają następującą składnię -

procedure Freemem(
   p: pointer;
  Size: PtrUInt
);

function Freemem(
   p: pointer
):PtrUInt;

Alternatywnie możesz zwiększyć lub zmniejszyć rozmiar przydzielonego bloku pamięci, wywołując funkcję ReAllocMem . Sprawdźmy jeszcze raz powyższy program i skorzystajmy z podprogramów ReAllocMem i freemem . Poniżej znajduje się składnia ReAllocMem -

function ReAllocMem(
   var p: pointer;
   Size: PtrUInt
):pointer;

Poniżej znajduje się przykład wykorzystujący podprogramy ReAllocMem i freemem -

program exMemory;
var
name: array[1..100] of char;
description: ^string;
desp: string;

begin
   name:= 'Zara Ali';
   desp := 'Zara ali a DPS student.';
   
   description := getmem(30);
      if not assigned(description) then
         writeln('Error - unable to allocate required memory')
      else
         description^ := desp;

   (* Suppose you want to store bigger description *)
   description := reallocmem(description, 100);
   desp := desp + ' She is in class 10th.';
   description^:= desp; 
   
   writeln('Name = ', name );
   writeln('Description: ', description^ );
   
   freemem(description);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Name = Zara Ali
Description: Zara ali a DPS student. She is in class 10th

Funkcje zarządzania pamięcią

Pascal zapewnia mnóstwo funkcji zarządzania pamięcią, które są używane do implementacji różnych struktur danych i implementacji programowania niskiego poziomu w Pascalu. Wiele z tych funkcji jest zależnych od implementacji. Free Pascal zapewnia następujące funkcje i procedury zarządzania pamięcią -

SN Nazwa i opis funkcji
1

function Addr(X: TAnytype):Pointer;

Zwraca adres zmiennej

2

function Assigned(P: Pointer):Boolean;

Sprawdza, czy wskaźnik jest prawidłowy

3

function CompareByte(const buf1; const buf2; len: SizeInt):SizeInt;

Porównuje 2 bajty buforów pamięci na bajt

4

function CompareChar(const buf1; const buf2; len: SizeInt):SizeInt;

Porównuje 2 bajty buforów pamięci na bajt

5

function CompareDWord(const buf1; const buf2; len: SizeInt):SizeInt;

Porównuje 2 bajty buforów pamięci na bajt

6

function CompareWord(const buf1; const buf2; len: SizeInt):SizeInt;

Porównuje 2 bajty buforów pamięci na bajt

7

function Cseg: Word;

Zwraca segment kodu

8

procedure Dispose(P: Pointer);

Zwalnia dynamicznie alokowaną pamięć

9

procedure Dispose(P: TypedPointer; Des: TProcedure);

Zwalnia dynamicznie alokowaną pamięć

10

function Dseg: Word;

Zwraca segment danych

11

procedure FillByte(var x; count: SizeInt; value: Byte);

Wypełnia obszar pamięci 8-bitowym wzorem

12

procedure FillChar( var x; count: SizeInt; Value: Byte|Boolean|Char);

Wypełnia obszar pamięci określonym charakterem

13

procedure FillDWord( var x; count: SizeInt; value: DWord);

Wypełnia obszar pamięci wzorcem 32-bitowym

14

procedure FillQWord( var x; count: SizeInt; value: QWord);

Wypełnia obszar pamięci wzorcem 64-bitowym

15 procedure FillWord( var x; count: SizeInt; Value: Word);

Wypełnia obszar pamięci 16-bitowym wzorem

16

procedure Freemem( p: pointer; Size: PtrUInt);

Zwalnia przydzieloną pamięć

17

procedure Freemem( p: pointer );

Zwalnia przydzieloną pamięć

18

procedure Getmem( out p: pointer; Size: PtrUInt);

Przydziela nową pamięć

19

procedure Getmem( out p: pointer);

Przydziela nową pamięć

20

procedure GetMemoryManager( var MemMgr: TMemoryManager);

Zwraca aktualny menedżer pamięci

21

function High( Arg: TypeOrVariable):TOrdinal;

Zwraca najwyższy indeks otwartej tablicy lub wyliczenie

22

function IndexByte( const buf; len: SizeInt; b: Byte):SizeInt;

Znajduje wartość o rozmiarze bajtu w zakresie pamięci

23

function IndexChar( const buf; len: SizeInt; b: Char):SizeInt;

Znajduje wartość o rozmiarze znaku w zakresie pamięci

24

function IndexDWord( const buf; len: SizeInt; b: DWord):SizeInt;

Znajduje wartość o rozmiarze DWord (32-bitowa) w zakresie pamięci

25

function IndexQWord( const buf; len: SizeInt; b: QWord):SizeInt;

Znajduje wartość wielkości QWord w zakresie pamięci

26

function Indexword( const buf; len: SizeInt; b: Word):SizeInt;

Znajduje wartość wielkości słowa w zakresie pamięci

27

function IsMemoryManagerSet: Boolean;

Czy menedżer pamięci jest ustawiony

28

function Low( Arg: TypeOrVariable ):TOrdinal;

Zwraca najniższy indeks otwartej tablicy lub wyliczenie

29

procedure Move( const source; var dest; count: SizeInt );

Przenosi dane z jednego miejsca w pamięci do drugiego

30

procedure MoveChar0( const buf1; var buf2; len: SizeInt);

Przenosi dane do pierwszego znaku zera

31

procedure New( var P: Pointer);

Dynamicznie przydziel pamięć dla zmiennej

32

procedure New( var P: Pointer; Cons: TProcedure);

Dynamicznie przydziela pamięć dla zmiennej

33

function Ofs( var X ):LongInt;

Zwraca przesunięcie zmiennej

34

function ptr( sel: LongInt; off: LongInt):farpointer;

Łączy segment i przesunięcie do wskaźnika

35

function ReAllocMem( var p: pointer; Size: PtrUInt):pointer;

Zmienia rozmiar bloku pamięci na stercie

36

function Seg( var X):LongInt;

Segment zwrotów

37

procedure SetMemoryManager( const MemMgr: TMemoryManager );

Ustawia menedżera pamięci

38

function Sptr: Pointer;

Zwraca bieżący wskaźnik stosu

39

function Sseg: Word;

Zwraca wartość rejestru segmentu stosu

Program Pascal może składać się z modułów zwanych jednostkami. Jednostka może składać się z niektórych bloków kodu, które z kolei składają się ze zmiennych i deklaracji typu, instrukcji, procedur itp. W Pascalu i Pascalu jest wiele wbudowanych jednostek, które pozwalają programistom definiować i zapisywać własne jednostki do użycia później w różnych programach.

Korzystanie z jednostek wbudowanych

Zarówno jednostki wbudowane, jak i jednostki zdefiniowane przez użytkownika są zawarte w programie przez klauzulę use. Skorzystaliśmy już z jednostki wariantów w samouczku Pascal - Variants . W tym samouczku wyjaśniono tworzenie i dołączanie jednostek zdefiniowanych przez użytkownika. Jednak najpierw zobaczmy, jak uwzględnić jednostkę wbudowanącrt w twoim programie -

program myprog;
uses crt;

Poniższy przykład ilustruje użycie crt jednostka -

Program Calculate_Area (input, output);
uses crt;
var 
   a, b, c, s, area: real;

begin
   textbackground(white); (* gives a white background *)
   clrscr; (*clears the screen *)
   
   textcolor(green); (* text color is green *)
   gotoxy(30, 4); (* takes the pointer to the 4th line and 30th column) 
   
   writeln('This program calculates area of a triangle:');
   writeln('Area = area = sqrt(s(s-a)(s-b)(s-c))');
   writeln('S stands for semi-perimeter');
   writeln('a, b, c are sides of the triangle');
   writeln('Press any key when you are ready');
   
   readkey;
   clrscr;
   gotoxy(20,3);
   
   write('Enter a: ');
   readln(a);
   gotoxy(20,5);
   
   write('Enter b:');
   readln(b);
   gotoxy(20, 7);
   
   write('Enter c: ');
   readln(c);

   s := (a + b + c)/2.0;
   area := sqrt(s * (s - a)*(s-b)*(s-c));
   gotoxy(20, 9);
   
   writeln('Area: ',area:10:3);
   readkey;
end.

Jest to ten sam program, którego użyliśmy na początku samouczka Pascala, skompiluj go i uruchom, aby znaleźć efekty zmiany.

Tworzenie i używanie jednostki paskalowej

Aby utworzyć jednostkę, należy zapisać moduły lub podprogramy, które chcesz w niej przechowywać i zapisać w pliku z .pasrozbudowa. Pierwsza linia tego pliku powinna zaczynać się słowem kluczowym jednostka, po której następuje nazwa jednostki. Na przykład -

unit calculateArea;

Oto trzy ważne kroki w tworzeniu jednostki Pascal -

  • Nazwa pliku i nazwa jednostki powinny być dokładnie takie same. Tak więc nasza jednostka ObliczArea zostanie zapisana w pliku o nazwie ObliczArea.pas.

  • Następny wiersz powinien zawierać jedno słowo kluczowe interface. Po tej linii napiszesz deklaracje dla wszystkich funkcji i procedur, które pojawią się w tym urządzeniu.

  • Zaraz po deklaracjach funkcji wpisz słowo implementation, co znowu jest słowem kluczowym. Po wierszu zawierającym implementację słowa kluczowego podaj definicję wszystkich podprogramów.

Poniższy program tworzy jednostkę o nazwie calcArea -

unit CalculateArea;
interface

function RectangleArea( length, width: real): real;
function CircleArea(radius: real) : real;
function TriangleArea( side1, side2, side3: real): real;

implementation

function RectangleArea( length, width: real): real;
begin
   RectangleArea := length * width;
end;

function CircleArea(radius: real) : real;
const
   PI = 3.14159;
begin
   CircleArea := PI * radius * radius;
end;

function TriangleArea( side1, side2, side3: real): real;
var
   s, area: real;

begin
   s := (side1 + side2 + side3)/2.0;
   area := sqrt(s * (s - side1)*(s-side2)*(s-side3));
   TriangleArea := area;
end;

end.

Następnie napiszmy prosty program, który użyje jednostki, którą zdefiniowaliśmy powyżej -

program AreaCalculation;
uses CalculateArea,crt;

var
   l, w, r, a, b, c, area: real;

begin
   clrscr;
   l := 5.4;
   w := 4.7;
   area := RectangleArea(l, w);
   writeln('Area of Rectangle 5.4 x 4.7 is: ', area:7:3);

   r:= 7.0;
   area:= CircleArea(r);
   writeln('Area of Circle with radius 7.0 is: ', area:7:3);

   a := 3.0;
   b:= 4.0;
   c:= 5.0;
  
   area:= TriangleArea(a, b, c);
   writeln('Area of Triangle 3.0 by 4.0 by 5.0 is: ', area:7:3);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Area of Rectangle 5.4 x 4.7 is: 25.380
Area of Circle with radius 7.0 is: 153.938
Area of Triangle 3.0 by 4.0 by 5.0 is: 6.000

Większość programów, które piszesz, wymaga implementacji jakiejś formy funkcji daty zwracającej aktualną datę i godzinę. Daktyle są tak ważną częścią codziennego życia, że ​​łatwo jest z nimi pracować bez zastanowienia. Pascal zapewnia również potężne narzędzia do arytmetyki dat, które ułatwiają manipulowanie datami. Jednak rzeczywista nazwa i działanie tych funkcji są różne dla różnych kompilatorów.

Pobieranie aktualnej daty i godziny

Funkcja TimeToString Pascala podaje aktualny czas w postaci rozdzielanej dwukropkami (:). Poniższy przykład pokazuje, jak uzyskać aktualny czas -

program TimeDemo;
uses sysutils;

begin
   writeln ('Current time : ',TimeToStr(Time));
end.

Kiedy powyższy kod został skompilowany i wykonany, daje następujący wynik -

Current time : 18:33:08

Plik Date funkcja zwraca bieżącą datę w formacie TDateTimeformat. TDateTime to podwójna wartość, która wymaga pewnego dekodowania i formatowania. Poniższy program demonstruje, jak używać go w programie do wyświetlania bieżącej daty -

Program DateDemo;
uses sysutils;
var
   YY,MM,DD : Word;

begin
   writeln ('Date : ',Date);
   DeCodeDate (Date,YY,MM,DD);
   writeln (format ('Today is (DD/MM/YY): %d/%d/%d ',[dd,mm,yy]));
end.

Kiedy powyższy kod został skompilowany i wykonany, daje następujący wynik -

Date: 4.111300000000000E+004
Today is (DD/MM/YY):23/7/2012

Funkcja Now zwraca bieżącą datę i godzinę -

Program DatenTimeDemo;
uses sysutils;
begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
end.

Kiedy powyższy kod został skompilowany i wykonany, daje następujący wynik -

Date and Time at the time of writing : 23/7/2012 18:51:

Free Pascal zapewnia prostą strukturę znaczników czasu o nazwie TTimeStamp, który ma następujący format -

type TTimeStamp = record
   Time: Integer;
   Date: Integer;
end;

Różne funkcje daty i czasu

Free Pascal zapewnia następujące funkcje daty i czasu -

Sr.No. Nazwa i opis funkcji
1

function DateTimeToFileDate(DateTime: TDateTime):LongInt;

Konwertuje typ DateTime na datę pliku.

2

function DateTimeToStr( DateTime: TDateTime):;

Konstruuje ciąg znaków reprezentujący DateTime

3

function DateTimeToStr(DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Konstruuje ciąg znaków reprezentujący DateTime

4

procedure DateTimeToString(out Result: ;const FormatStr: ;const DateTime: TDateTime);

Konstruuje ciąg znaków reprezentujący DateTime

5

procedure DateTimeToString(out Result: ; const FormatStr: ; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Konstruuje ciąg znaków reprezentujący DateTime

6

procedure DateTimeToSystemTime(DateTime: TDateTime; out SystemTime: TSystemTime);

Konwertuje DateTime na czas systemowy

7

function DateTimeToTimeStamp( DateTime: TDateTime):TTimeStamp;Konwertuje DateTime na znacznik czasu

8

function DateToStr(Date: TDateTime):;

Konstruuje ciąg znaków reprezentujący datę

9

function DateToStr(Date: TDateTime; const FormatSettings: TFormatSettings):;

Konstruuje ciąg znaków reprezentujący datę

10

function Date: TDateTime;

Pobiera aktualną datę

11

function DayOfWeek(DateTime: TDateTime):Integer;

Pobiera dzień tygodnia

12

procedure DecodeDate(Date: TDateTime; out Year: Word; out Month: Word; out Day: Word);

Dekoduje datę i godzinę do roku, miesiąca i dnia

13

procedure DecodeTime(Time: TDateTime; out Hour: Word; out Minute: Word; out Second: Word; out MilliSecond: Word);

Dekoduje DateTime na godziny, minuty i sekundy

14

function EncodeDate(Year: Word; Month: Word; Day: Word):TDateTime;

Koduje rok, dzień i miesiąc do DateTime

15

function EncodeTime(Hour: Word; Minute: Word; Second: Word; MilliSecond: Word):TDateTime;

Koduje godziny, minuty i sekundy do DateTime

16

function FormatDateTime(const FormatStr: ; DateTime: TDateTime):;

Zwraca ciąg znaków reprezentujący DateTime

17

function FormatDateTime(const FormatStr: ; DateTime: TDateTime; const FormatSettings: TFormatSettings):;

Zwraca ciąg znaków reprezentujący DateTime

18

function IncMonth(const DateTime: TDateTime; NumberOfMonths: Integer = 1):TDateTime;

Dodaje 1 do miesiąca

19

function IsLeapYear(Year: Word):Boolean;

Określa, czy rok jest rokiem przestępnym

20

function MSecsToTimeStamp(MSecs: Comp):TTimeStamp;

Konwertuje liczbę milisekund na znacznik czasu

21

function Now: TDateTime;

Pobiera aktualną datę i godzinę

22

function StrToDateTime(const S:):TDateTime;

Konwertuje ciąg na DateTime

23

function StrToDateTime(const s: ShortString; const FormatSettings: TFormatSettings):TDateTime;

Konwertuje ciąg na DateTime

24

function StrToDateTime(const s: AnsiString; const FormatSettings: TFormatSettings):TDateTime;

Konwertuje ciąg na DateTime

25

function StrToDate(const S: ShortString):TDateTime;

Konwertuje ciąg na datę

26

function StrToDate(const S: Ansistring):TDateTime;

Konwertuje ciąg na datę

27

function StrToDate(const S: ShortString; separator: Char):TDateTime;

Konwertuje ciąg na datę

28

function StrToDate(const S: AnsiString; separator: Char):TDateTime;

Konwertuje ciąg na datę

29

function StrToDate(const S: ShortString; const useformat: ; separator: Char):TDateTime;

Konwertuje ciąg na datę

30

function StrToDate(const S: AnsiString; const useformat: ; separator: Char):TDateTime;

Konwertuje ciąg na datę

31

function StrToDate(const S: PChar; Len: Integer; const useformat: ; separator: Char = #0):TDateTime;

Konwertuje ciąg na datę

32

function StrToTime(const S: Shortstring):TDateTime;

Konwertuje ciąg na czas

33

function StrToTime(const S: Ansistring):TDateTime;

Konwertuje ciąg na czas

34

function StrToTime(const S: ShortString; separator: Char):TDateTime;

Konwertuje ciąg na czas

35

function StrToTime(const S: AnsiString; separator: Char):TDateTime;

Konwertuje ciąg na czas

36

function StrToTime(const S: ; FormatSettings: TFormatSettings):TDateTime;

Konwertuje ciąg na czas

37

function StrToTime(const S: PChar; Len: Integer; separator: Char = #0):TDateTime;

Konwertuje ciąg na czas

38

function SystemTimeToDateTime(const SystemTime: TSystemTime):TDateTime;

Konwertuje czas systemowy na datę i godzinę

39

function TimeStampToDateTime(const TimeStamp: TTimeStamp):TDateTime;

Konwertuje sygnaturę czasową na DateTime

40

function TimeStampToMSecs(const TimeStamp: TTimeStamp):comp;

Konwertuje znacznik czasu na liczbę milisekund

41

function TimeToStr(Time: TDateTime):;

Zwraca ciąg znaków reprezentujący czas

42

function TimeToStr(Time: TDateTime; const FormatSettings: TFormatSettings):;

Zwraca ciąg znaków reprezentujący czas

43

function Time: TDateTime;

Uzyskaj aktualny czas

Poniższy przykład ilustruje użycie niektórych z powyższych funkcji -

Program DatenTimeDemo;
uses sysutils;
var
year, month, day, hr, min, sec, ms: Word;

begin
   writeln ('Date and Time at the time of writing : ',DateTimeToStr(Now));
   writeln('Today is ',LongDayNames[DayOfWeek(Date)]);
   writeln;
   writeln('Details of Date: ');
   
   DecodeDate(Date,year,month,day);
   writeln (Format ('Day: %d',[day]));
   writeln (Format ('Month: %d',[month]));
   writeln (Format ('Year: %d',[year]));
   writeln;
   writeln('Details of Time: ');
   
   DecodeTime(Time,hr, min, sec, ms);
   writeln (format('Hour: %d:',[hr]));
   writeln (format('Minutes: %d:',[min]));
   writeln (format('Seconds: %d:',[sec]));
   writeln (format('Milliseconds: %d:',[hr]));
end.

Kiedy powyższy kod został skompilowany i wykonany, dał następujący wynik:

Date and Time at the time of writing : 7/24/2012 8:26:
Today is Tuesday
Details of Date:
Day:24
Month:7
Year: 2012
Details of Time:
Hour: 8
Minutes: 26
Seconds: 21
Milliseconds: 8

Możemy wyobrazić sobie nasz wszechświat złożony z różnych obiektów, takich jak słońce, ziemia, księżyc itp. Podobnie, możemy wyobrazić sobie nasz samochód złożony z różnych obiektów, takich jak koło, kierownica, przekładnia itp. Tak samo, istnieją koncepcje programowania obiektowego, które zakładaj wszystko jako obiekt i wdrażaj oprogramowanie przy użyciu różnych obiektów. W Pascalu istnieją dwa strukturalne typy danych używane do implementacji obiektu świata rzeczywistego -

  • Typy obiektów
  • Typy klas

Koncepcje zorientowane obiektowo

Zanim przejdziemy do szczegółów, zdefiniujmy ważne terminy Pascal związane z Pascalem zorientowanym obiektowo.

  • Object- Obiekt to specjalny rodzaj rekordu, który zawiera pola takie jak rekord; jednak w przeciwieństwie do rekordów obiekty zawierają procedury i funkcje jako część obiektu. Te procedury i funkcje są przechowywane jako wskaźniki do metod skojarzonych z typem obiektu.

  • Class- Klasa jest definiowana prawie tak samo jak obiekt, ale istnieje różnica w sposobie ich tworzenia. Klasa jest umieszczana na stercie programu, a obiekt na stosie. Jest to wskaźnik do obiektu, a nie sam obiekt.

  • Instantiation of a class- Tworzenie instancji oznacza tworzenie zmiennej tego typu klasy. Ponieważ klasa jest tylko wskaźnikiem, kiedy deklarowana jest zmienna typu klasy, pamięć jest przydzielana tylko dla wskaźnika, a nie dla całego obiektu. Tylko wtedy, gdy jest tworzony przy użyciu jednego z jego konstruktorów, przydzielana jest pamięć dla obiektu. Instancje klasy są również nazywane „obiektami”, ale nie należy ich mylić z obiektami Object Pascal. W tym samouczku napiszemy „Object” dla Pascal Objects i „object” dla obiektu koncepcyjnego lub instancji klasy.

  • Member Variables - Są to zmienne zdefiniowane wewnątrz klasy lub obiektu.

  • Member Functions - Są to funkcje lub procedury zdefiniowane w klasie lub obiekcie i służą do uzyskiwania dostępu do danych obiektu.

  • Visibility of Members- Składowe obiektu lub klasy są również nazywane polami. Te pola mają różną widoczność. Widoczność odnosi się do dostępności członków, tj. Dokładnie tam, gdzie ci członkowie będą dostępni. Obiekty mają trzy poziomy widoczności: publiczny, prywatny i chroniony. Klasy mają pięć typów widoczności: publiczne, prywatne, ściśle prywatne, chronione i publikowane. Szczegółowo omówimy widoczność.

  • Inheritance- Gdy Klasa jest zdefiniowana przez dziedziczenie istniejących funkcji Klasy nadrzędnej, mówi się, że jest dziedziczona. Tutaj klasa potomna odziedziczy wszystkie lub kilka funkcji składowych i zmiennych klasy nadrzędnej. Obiekty mogą być również dziedziczone.

  • Parent Class- Klasa, która jest dziedziczona przez inną klasę. Nazywa się to również klasą podstawową lub superklasą.

  • Child Class- Klasa, która dziedziczy po innej klasie. Nazywa się to również podklasą lub klasą pochodną.

  • Polymorphism- Jest to koncepcja zorientowana obiektowo, w której ta sama funkcja może być używana do różnych celów. Na przykład nazwa funkcji pozostanie taka sama, ale może mieć różną liczbę argumentów i może wykonywać różne zadania. Klasy Pascala implementują polimorfizm. Obiekty nie implementują polimorfizmu.

  • Overloading- Jest to rodzaj polimorfizmu, w którym niektóre lub wszystkie operatory mają różne implementacje w zależności od typów ich argumentów. Podobnie funkcje mogą być przeciążane przy różnych implementacjach. Klasy Pascal implementują przeciążenie, ale Objects nie.

  • Data Abstraction - Dowolna reprezentacja danych, w której szczegóły implementacji są ukryte (abstrakcyjne).

  • Encapsulation - Odnosi się do koncepcji, w której wszystkie dane i funkcje składowe hermetyzujemy razem, aby utworzyć obiekt.

  • Constructor - Odnosi się do specjalnego typu funkcji, która będzie wywoływana automatycznie, gdy pojawi się formacja obiektu z klasy lub obiektu.

  • Destructor - Odnosi się do specjalnego typu funkcji, która będzie wywoływana automatycznie, gdy obiekt lub klasa zostanie usunięty lub wyjdzie poza zakres.

Definiowanie obiektów Pascal

Obiekt jest deklarowany przy użyciu deklaracji typu. Ogólna forma deklaracji obiektu jest następująca -

type object-identifier = object  
   private
   field1 : field-type;  
   field2 : field-type;  
   ...
   public
   procedure proc1;  
   function f1(): function-type;
   end;  
var objectvar : object-identifier;

Zdefiniujmy obiekt Rectangle, który ma dwóch członków danych typu całkowitego - length i width i niektóre funkcje składowe do manipulowania tymi składowymi danych i procedurę rysowania prostokąta.

type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      constructor init;  
      destructor done;  
      
      procedure setlength(l: inteter);  
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

Po utworzeniu obiektów będziesz mógł wywoływać funkcje składowe związane z tym obiektem. Jedna funkcja członkowska będzie mogła przetwarzać zmienną składową tylko powiązanego obiektu.

Poniższy przykład pokazuje, jak ustawić długości i szerokości dla dwóch obiektów prostokątnych i narysować je, wywołując funkcje składowe.

r1.setlength(3);
r1.setwidth(7);

writeln(' Draw a rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
r1.draw;
new(pr1);
pr1^.setlength(5);
pr1^.setwidth(4);

writeln(' Draw a rectangle: ', pr1^.getlength(), ' by ' ,pr1^.getwidth());
pr1^.draw;
dispose(pr1);

Poniżej znajduje się kompletny przykład pokazujący, jak używać obiektów w Pascalu -

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   
   public  
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;
var
   r1: Rectangle;
   pr1: ^Rectangle;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
     for j:= 1 to width do
        write(' * ');
     writeln;
   end;
end;

begin
   r1.setlength(3);
   r1.setwidth(7);
   
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1);
   pr1^.setlength(5);
   pr1^.setwidth(4);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *

Widoczność elementów składowych obiektu

Widoczność wskazuje dostępność elementów składowych obiektu. Elementy składowe obiektu Pascal mają trzy typy widoczności -

Sr.No Widoczność i dostępność
1

Public

Członkowie mogą być wykorzystywani przez inne jednostki poza jednostką programu

2

Private

Członkowie są dostępni tylko w bieżącej jednostce.

3

Protected

Składowe są dostępne tylko dla obiektów pochodzących z obiektu nadrzędnego.

Domyślnie pola i metody obiektu są publiczne i są eksportowane poza bieżącą jednostkę.

Konstruktory i destruktory dla obiektów Pascal -

Constructorssą specjalnymi typami metod, które są wywoływane automatycznie za każdym razem, gdy tworzony jest obiekt. Tworzysz konstruktor w Pascalu, po prostu deklarując metodę z konstruktorem słowa kluczowego. Zwykle nazwa metody to Init, jednak można podać dowolny poprawny własny identyfikator. Możesz przekazać dowolną liczbę argumentów do funkcji konstruktora.

Destructorsto metody wywoływane podczas niszczenia obiektu. Metody destruktora niszczą alokację pamięci utworzoną przez konstruktory.

Poniższy przykład dostarczy konstruktora i destruktora dla klasy Rectangle, które zainicjują długość i szerokość prostokąta w momencie tworzenia obiektu i zniszczą go, gdy wyjdzie poza zakres.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      constructor init(l, w: integer);
      destructor done;
      
      procedure setlength(l: integer);
      function getlength(): integer;  
      
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      
      procedure draw;
end;

var
   r1: Rectangle;
   pr1: ^Rectangle;

constructor Rectangle.init(l, w: integer);
begin
   length := l;
   width := w;
end;

destructor Rectangle.done;
begin
   writeln(' Desctructor Called');
end; 

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;  
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1.init(3, 7);
   writeln('Draw a rectangle:', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   new(pr1, init(5, 4));
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ',pr1^.getwidth());
   pr1^.draw;
   pr1^.init(7, 9);
   
   writeln('Draw a rectangle:', pr1^.getlength(), ' by ' ,pr1^.getwidth());
   pr1^.draw;
   dispose(pr1);
   r1.done;
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Draw a rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw a rectangle: 5 by 4
* * * *
* * * *
* * * *
* * * *
* * * *
Draw a rectangle: 7 by 9
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Destructor Called

Dziedziczenie dla obiektów Pascal

Obiekty Pascal mogą opcjonalnie dziedziczyć po obiekcie nadrzędnym. Poniższy program ilustruje dziedziczenie w obiektach Pascal. Stwórzmy kolejny obiekt o nazwieTableTop, który dziedziczy po obiekcie Rectangle.

program exObjects;
type 
   Rectangle = object  
   private  
      length, width: integer; 
   public  
      procedure setlength(l: integer);  
      function getlength(): integer;  
      procedure setwidth(w: integer);  
      function getwidth(): integer;  
      procedure draw;
end;

TableTop = object (Rectangle)
   private
     material: string;
   public
      function getmaterial(): string;
      procedure setmaterial( m: string);
      procedure displaydetails;
      procedure draw;
end;

var
   tt1: TableTop;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;  
begin
   getlength := length;
end;

function Rectangle.getwidth():integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var 
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
  end;
end;

function TableTop.getmaterial(): string;
begin
   getmaterial := material;
end;

procedure TableTop.setmaterial( m: string);
begin
   material := m;
end;

procedure TableTop.displaydetails;
begin
   writeln('Table Top: ', self.getlength(), ' by ' , self.getwidth());
   writeln('Material: ', self.getmaterial());
end;

procedure TableTop.draw();
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
   writeln;
   end;
   writeln('Material: ', material);
end;

begin
   tt1.setlength(3);
   tt1.setwidth(7);
   tt1.setmaterial('Wood');
   tt1.displaydetails();
   writeln;
   writeln('Calling the Draw method');
   tt1.draw();
end.

Poniżej przedstawiono ważne punkty, na które należy zwrócić uwagę -

  • Obiekt Tabletop odziedziczył wszystkie elementy członkowskie obiektu Rectangle.

  • W TableTop jest również metoda losowania . Gdy remis metoda jest wywoływana za pomocą blatem obiekt, rysować blatem dostaje wywoływany.

  • Istnieje niejawna instancja o nazwie self która odnosi się do bieżącego wystąpienia obiektu.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Widzieliście, że obiekty Pascal wykazują pewne cechy paradygmatu zorientowanego obiektowo. Wdrażają enkapsulację, ukrywanie danych i dziedziczenie, ale mają też ograniczenia. Na przykład obiekty Pascal nie biorą udziału w polimorfizmie. Dlatego klasy są szeroko stosowane do implementacji prawidłowego zachowania zorientowanego obiektowo w programie, zwłaszcza w oprogramowaniu opartym na graficznym interfejsie użytkownika.

Klasa jest definiowana prawie tak samo jak obiekt, ale jest wskaźnikiem do obiektu, a nie do samego obiektu. Z technicznego punktu widzenia oznacza to, że klasa jest przydzielona na stercie programu, podczas gdy obiekt jest przydzielony na stosie. Innymi słowy, kiedy deklarujesz zmienną typu obiektu, zajmie ona tyle miejsca na stosie, ile rozmiar obiektu, ale kiedy deklarujesz zmienną typu klasy, zawsze będzie miała rozmiar wskaźnika na stosie. Rzeczywiste dane klasy będą na stercie.

Definiowanie klas Pascala

Klasa jest deklarowana w taki sam sposób jak obiekt, przy użyciu deklaracji typu. Ogólna forma deklaracji klasy jest następująca -

type class-identifier = class  
   private
      field1 : field-type;  
      field2 : field-type;  
        ...
   
   public
      constructor create();
      procedure proc1;  
      function f1(): function-type;
end;  
var classvar : class-identifier;

Warto zwrócić uwagę na następujące ważne punkty -

  • Definicje klas powinny znajdować się tylko w części programu zawierającej deklarację typu.

  • Klasa jest definiowana przy użyciu class słowo kluczowe.

  • Pola to elementy danych, które istnieją w każdym wystąpieniu klasy.

  • Metody są deklarowane w definicji klasy.

  • Istnieje predefiniowany konstruktor o nazwie Createw klasie Root. Każda klasa abstrakcyjna i każda klasa konkretna jest potomkiem klasy Root, więc wszystkie klasy mają co najmniej jednego konstruktora.

  • Istnieje predefiniowany destruktor o nazwie Destroyw klasie Root. Każda klasa abstrakcyjna i każda klasa konkretna jest potomkiem klasy Root, więc wszystkie klasy mają co najmniej jeden destruktor.

Zdefiniujmy klasę Rectangle, która ma dwa składowe danych typu całkowitego - długość i szerokość oraz niektóre funkcje składowe do manipulowania tymi elementami składowymi danych oraz procedurę rysowania prostokąta.

type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      function getlength(): integer;
      procedure setwidth(w: integer);
      function getwidth(): integer;
      procedure draw;
end;

Napiszmy kompletny program, który utworzy instancję klasy rectangle i narysuje prostokąt. To jest ten sam przykład, którego użyliśmy podczas omawiania obiektów Pascal. Przekonasz się, że oba programy są prawie takie same, z następującymi wyjątkami -

  • Aby używać klas, musisz dołączyć dyrektywę {$ mode objfpc}.

  • Aby używać konstruktorów, musisz dołączyć dyrektywę {$ m +}.

  • Tworzenie instancji klasy różni się od tworzenia instancji obiektu. Tylko zadeklarowanie zmiennej nie tworzy miejsca na instancję, użyjesz konstruktora create do przydzielenia pamięci.

Oto pełny przykład -

{$mode objfpc} // directive to be used for defining classes {$m+}		   // directive to be used for using constructor

program exClass;
type
   Rectangle = class
   private
      length, width: integer;
   
   public
      constructor create(l, w: integer);
      procedure setlength(l: integer);
      
      function getlength(): integer;
      procedure setwidth(w: integer);
      
      function getwidth(): integer;
      procedure draw;
end;
var
   r1: Rectangle;

constructor Rectangle.create(l, w: integer);
begin
   length := l;
   width := w;
end;

procedure Rectangle.setlength(l: integer);
begin
   length := l;
end;

procedure Rectangle.setwidth(w: integer);
begin
   width :=w;
end;

function Rectangle.getlength(): integer;
begin
   getlength := length;
end;

function Rectangle.getwidth(): integer;
begin
   getwidth := width;
end;

procedure Rectangle.draw;
var
   i, j: integer;
begin
   for i:= 1 to length do
   begin
      for j:= 1 to width do
         write(' * ');
      writeln;
   end;
end;

begin
   r1:= Rectangle.create(3, 7);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
   r1.setlength(4);
   r1.setwidth(6);
   
   writeln(' Draw Rectangle: ', r1.getlength(), ' by ' , r1.getwidth());
   r1.draw;
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * *

Widoczność członków klasy

Widoczność wskazuje na dostępność członków klasy. Członkowie klasy Pascal mają pięć typów widoczności -

Sr.No Widoczność i dostępność
1

Public

Ci członkowie są zawsze dostępni.

2

Private

Dostęp do tych elementów członkowskich można uzyskać tylko w module lub jednostce, która zawiera definicję klasy. Dostęp do nich można uzyskać z wewnątrz metod klas lub spoza nich.

3

Strict Private

Dostęp do tych elementów członkowskich można uzyskać tylko z metod samej klasy. Inne klasy lub klasy potomne w tej samej jednostce nie mają do nich dostępu.

4

Protected

Działa tak samo jak private, z tym wyjątkiem, że te elementy członkowskie są dostępne dla typów podrzędnych, nawet jeśli są zaimplementowane w innych modułach.

5

Published

Działa tak samo jak Public, ale kompilator generuje informacje o typie, które są potrzebne do automatycznego przesyłania strumieniowego tych klas, jeśli kompilator jest w stanie {$ M +}. Pola zdefiniowane w opublikowanej sekcji muszą być typu klasowego.

Konstruktory i destruktory dla klas Pascal

Konstruktory to specjalne metody, które są wywoływane automatycznie za każdym razem, gdy tworzony jest obiekt. Dlatego w pełni wykorzystujemy to zachowanie, inicjując wiele rzeczy za pomocą funkcji konstruktora.

Pascal udostępnia specjalną funkcję o nazwie create () do definiowania konstruktora. Możesz przekazać dowolną liczbę argumentów do funkcji konstruktora.

Poniższy przykład utworzy jeden konstruktor dla klasy o nazwie Books i zainicjuje cenę i tytuł książki w momencie tworzenia obiektu.

program classExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors
type
   Books = Class 
   private 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); // display details of a book
end;
var
   physics, chemistry, maths: Books;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
end;

begin 
   physics := Books.Create('Physics for High School', 10);
   chemistry := Books.Create('Advanced Chemistry', 15);
   maths := Books.Create('Algebra', 7);
   
   physics.Display;
   chemistry.Display;
   maths.Display;
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Podobnie jak niejawny konstruktor o nazwie create, istnieje również niejawna metoda destructor zniszcz, za pomocą której można zwolnić wszystkie zasoby używane w klasie.

Dziedzictwo

Definicje klas Pascala mogą opcjonalnie dziedziczyć z definicji klasy nadrzędnej. Składnia jest następująca -

type
childClas-identifier = class(baseClass-identifier) 
< members >
end;

Poniższy przykład przedstawia klasę powieści, która dziedziczy klasę Books i dodaje więcej funkcji w oparciu o wymaganie.

program inheritanceExample;

{$MODE OBJFPC} //directive to be used for creating classes
{$M+} //directive that allows class constructors and destructors

type
   Books = Class 
   protected 
      title : String; 
      price: real;
   
   public
      constructor Create(t : String; p: real); //default constructor
      
      procedure setTitle(t : String); //sets title for a book
      function getTitle() : String; //retrieves title
      
      procedure setPrice(p : real); //sets price for a book
      function getPrice() : real; //retrieves price
      
      procedure Display(); virtual; // display details of a book
end;
(* Creating a derived class *)

type
   Novels = Class(Books)
   private
      author: String;
   
   public
      constructor Create(t: String); overload;
      constructor Create(a: String; t: String; p: real); overload;
      
      procedure setAuthor(a: String); // sets author for a book
      function getAuthor(): String; // retrieves author name
      
      procedure Display(); override;
end;
var
   n1, n2: Novels;

//default constructor 
constructor Books.Create(t : String; p: real);
begin
   title := t;
   price := p;
end;

procedure Books.setTitle(t : String); //sets title for a book
begin
   title := t;
end;

function Books.getTitle() : String; //retrieves title
begin
   getTitle := title;
end;

procedure Books.setPrice(p : real); //sets price for a book
begin
   price := p;
end;

function Books.getPrice() : real; //retrieves price
begin
   getPrice:= price;
end;

procedure Books.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price);
end;

(* Now the derived class methods  *)
constructor Novels.Create(t: String);
begin
   inherited Create(t, 0.0);
   author:= ' ';
end;

constructor Novels.Create(a: String; t: String; p: real);
begin
   inherited Create(t, p);
   author:= a;
end;

procedure Novels.setAuthor(a : String); //sets author for a book
begin
   author := a;
end;

function Novels.getAuthor() : String; //retrieves author
begin
   getAuthor := author;
end;

procedure Novels.Display();
begin
   writeln('Title: ', title);
   writeln('Price: ', price:5:2);
   writeln('Author: ', author);
end;

begin 
   n1 := Novels.Create('Gone with the Wind');
   n2 := Novels.Create('Ayn Rand','Atlas Shrugged', 467.75);
   n1.setAuthor('Margaret Mitchell');
   n1.setPrice(375.99);
   n1.Display;
   n2.Display;
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Warto zwrócić uwagę na następujące ważne punkty -

  • Członkowie klasy Książki mają protected widoczność.

  • Klasa Novels ma dwa konstruktory, więc overload operator służy do przeciążania funkcji.

  • Zadeklarowano procedurę Books.Display virtual, więc ta sama metoda z klasy Novels może override to.

  • Konstruktor Novels.Create wywołuje konstruktor klasy bazowej przy użyciu inherited słowo kluczowe.

Interfejsy

Interfejsy są zdefiniowane, aby zapewnić implementującym wspólną nazwę funkcji. Różni realizatorzy mogą implementować te interfejsy zgodnie ze swoimi wymaganiami. Można powiedzieć, że interfejsy to szkielety, które są implementowane przez programistów. Poniżej znajduje się przykład interfejsu -

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;

Należy pamiętać, że gdy klasa implementuje interfejs, powinna implementować wszystkie metody interfejsu. Jeśli metoda interfejsu nie jest zaimplementowana, kompilator zgłosi błąd.

Klasy abstrakcyjne

Klasa abstrakcyjna to taka, której nie można utworzyć, a jedynie dziedziczyć. Klasa abstrakcyjna jest określana przez dołączenie słowa abstrakcyjnego symbolu w definicji klasy, na przykład:

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

Podczas dziedziczenia z klasy abstrakcyjnej wszystkie metody oznaczone jako abstrakcyjne w deklaracji klasy rodzica muszą być zdefiniowane przez dziecko; dodatkowo metody te muszą być zdefiniowane z taką samą widocznością.

Statyczne słowo kluczowe

Zadeklarowanie elementów członkowskich lub metod klas jako statycznych sprawia, że ​​są one dostępne bez konieczności tworzenia wystąpienia klasy. Nie można uzyskać dostępu do elementu członkowskiego zadeklarowanego jako statyczny za pomocą utworzonego obiektu klasy (chociaż metoda statyczna może). Poniższy przykład ilustruje koncepcję -

program StaticExample;
{$mode objfpc}
{$static on}
type
   myclass=class
      num : integer;static;
   end;
var
   n1, n2 : myclass;
begin
   n1:= myclass.create;
   n2:= myclass.create;
   n1.num := 12;
   writeln(n2.num);
   n2.num := 31;
   writeln(n1.num);
   writeln(myclass.num);
   myclass.num := myclass.num + 20;
   writeln(n1.num);
   writeln(n2.num);
end.

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

12
31
31
51
51

Aby używać statycznych elementów członkowskich, musisz użyć dyrektywy {$ static on}.