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}.