Как пишется язык программирования паскаль

Pascal

LagrangePAS.png
Paradigm
  • Imperative
  • structured
Family Wirth Pascal
Designed by Niklaus Wirth
First appeared 1970; 53 years ago
Typing discipline
  • Static
  • strong
  • safe
Scope Lexical
Filename extensions .pp, .pas, .inc
Major implementations
  • CDC 6000
  • Embarcadero Delphi
  • ICL 1900
  • Pascal-P
  • PDP-11
  • PDP-10
  • IBM System/370
  • VSI Pascal
  • Free Pascal
  • GNU Pascal
Dialects
  • Delphi
  • Turbo Pascal
  • UCSD Pascal
Influenced by
  • ALGOL W
  • Simula 67
Influenced
  • Ada
  • C/AL
  • Component Pascal
  • Go
  • Java[1][2][3]
  • Modula / -2 / -3
  • Oberon / -2
  • Object Pascal
  • Oxygene
  • Power Fx
  • Seed7
  • Standard ML
  • VHDL
  • Structured text

Pascal is an imperative and procedural programming language, designed by Niklaus Wirth as a small, efficient language intended to encourage good programming practices using structured programming and data structuring. It is named in honour of the French mathematician, philosopher and physicist Blaise Pascal.

Pascal was developed on the pattern of the ALGOL 60 language. Wirth was involved in the process to improve the language as part of the ALGOL X efforts and proposed a version named ALGOL W. This was not accepted, and the ALGOL X process bogged down. In 1968, Wirth decided to abandon the ALGOL X process and further improve ALGOL W, releasing this as Pascal in 1970.

On top of ALGOL’s scalars and arrays, Pascal enables defining complex datatypes and building dynamic and recursive data structures such as lists, trees and graphs. Pascal has strong typing on all objects, which means that one type of data cannot be converted to or interpreted as another without explicit conversions. Unlike C (and most languages in the C-family), Pascal allows nested procedure definitions to any level of depth, and also allows most kinds of definitions and declarations inside subroutines (procedures and functions). A program is thus syntactically similar to a single procedure or function. This is similar to the block structure of ALGOL 60, but restricted from arbitrary block statements to just procedures and functions.

Pascal became very successful in the 1970s, notably on the burgeoning minicomputer market. Compilers were also available for many microcomputers as the field emerged in the late 1970s. It was widely used as a teaching language in university-level programming courses in the 1980s, and also used in production settings for writing commercial software during the same period. It was displaced by the C programming language during the late 1980s and early 1990s as UNIX-based systems became popular, and especially with the release of C++.

A derivative named Object Pascal designed for object-oriented programming was developed in 1985. This was used by Apple Computer (for the Lisa and MacIntosh machines) and Borland in the late 1980s and later developed into Delphi on the Microsoft Windows platform. Extensions to the Pascal concepts led to the languages Modula-2 and Oberon.

History[edit]

Earlier efforts[edit]

Much of the history of computer language design during the 1960s can be traced to the ALGOL 60 language. ALGOL was developed during the 1950s with the explicit goal of being able to clearly describe algorithms. It included a number of features for structured programming that remain common in languages to this day.

Shortly after its introduction, in 1962 Wirth began working on his dissertation with Helmut Weber on the Euler programming language. Euler was based on ALGOL’s syntax and many concepts but was not a derivative. Its primary goal was to add dynamic lists and types, allowing it to be used in roles similar to Lisp. The language was published in 1965.

By this time, a number of problems in ALGOL had been identified, notably the lack of a standardized string system. The group tasked with maintaining the language had begun the ALGOL X process to identify improvements, calling for submissions. Wirth and Tony Hoare submitted a conservative set of modifications to add strings and clean up some of the syntax. These were considered too minor to be worth using as the new standard ALGOL, so Wirth wrote a compiler for the language, which became named ALGOL W.

The ALGOL X efforts would go on to choose a much more complex language, ALGOL 68. The complexity of this language led to considerable difficulty producing high-performance compilers, and it was not widely used in the industry. This left an opening for newer languages.

Pascal[edit]

Pascal was influenced by the ALGOL W efforts, with the explicit goals of teaching programming in a structured fashion and for the development of system software.[4]
A generation of students used Pascal as an introductory language in undergraduate courses.

One of the early successes for the language was the introduction of UCSD Pascal, a version that ran on a custom operating system that could be ported to different platforms. A key platform was the Apple II, where it saw widespread use as Apple Pascal. This led to Pascal becoming the primary high-level language used for development in the Apple Lisa, and later, the Macintosh. Parts of the original Macintosh operating system were hand-translated into Motorola 68000 assembly language from the Pascal source code.[5]

The typesetting system TeX by Donald E. Knuth was written in WEB, the original literate programming system, based on DEC PDP-10 Pascal. Successful commercial applications like Adobe Photoshop[6] were written in Macintosh Programmer’s Workshop Pascal, while applications like Total Commander, Skype[7] and Macromedia Captivate were written in Delphi (Object Pascal). Apollo Computer used Pascal as the systems programming language for its operating systems beginning in 1980.

Variants of Pascal have also been used for everything from research projects to PC games and embedded systems. Newer Pascal compilers exist which are widely used.[8]

Object Pascal[edit]

During work on the Lisa, Larry Tesler began corresponding with Wirth on the idea of adding object-oriented extensions to the language, to make Pascal a Multi-paradigm programming language. This led initially to Clascal, introduced in 1983. As the Lisa program faded and was replaced by the Macintosh, a further version was created and named Object Pascal. This was introduced on the Mac in 1985 as part of the MacApp application framework, and became Apple’s main development language into the early 1990s.

The Object Pascal extensions were added to Turbo Pascal with the release of version 5.5 in 1989.[9] Over the years, Object Pascal became the basis of the Delphi system for Microsoft Windows, which is still used for developing Windows applications, and can cross-compile code to other systems. Free Pascal is an open source, cross-platform alternative with its own graphical IDE called Lazarus.

Implementations[edit]

Early Pascal compilers[edit]

The first Pascal compiler was designed in Zürich for the CDC 6000 series mainframe computer family. Niklaus Wirth reports that a first attempt to implement it in FORTRAN 66 in 1969 was unsuccessful due to FORTRAN 66’s inadequacy to express complex data structures. The second attempt was implemented in a C-like language (Scallop by Max Engeli) and then translated by hand (by R. Schild) to Pascal itself for boot-strapping.[10] It was operational by mid-1970. Many Pascal compilers since have been similarly self-hosting, that is, the compiler is itself written in Pascal, and the compiler is usually capable of recompiling itself when new features are added to the language, or when the compiler is to be ported to a new environment. The GNU Pascal compiler is one notable exception, being written in C.

The first successful port of the CDC Pascal compiler to another mainframe was completed by Welsh and Quinn at the Queen’s University of Belfast (QUB) in 1972. The target was the International Computers Limited (ICL) 1900 series. This compiler, in turn, was the parent of the Pascal compiler for the Information Computer Systems (ICS) Multum minicomputer. The Multum port was developed – with a view to using Pascal as a systems programming language – by Findlay, Cupples, Cavouras and Davis, working at the Department of Computing Science in Glasgow University. It is thought that Multum Pascal, which was completed in the summer of 1973, may have been the first 16-bit implementation.

A completely new compiler was completed by Welsh et al. at QUB in 1977. It offered a source-language diagnostic feature (incorporating profiling, tracing and type-aware formatted postmortem dumps) that was implemented by Findlay and Watt at Glasgow University. This implementation was ported in 1980 to the ICL 2900 series by a team based at Southampton University and Glasgow University. The Standard Pascal Model Implementation was also based on this compiler, having been adapted, by Welsh and Hay at Manchester University in 1984, to check rigorously for conformity to the BSI 6192/ISO 7185 Standard and to generate code for a portable abstract machine.

The first Pascal compiler written in North America was constructed at the University of Illinois under Donald B. Gillies for the PDP-11 and generated native machine code.

The Pascal-P system[edit]

To propagate the language rapidly, a compiler porting kit was created in Zürich that included a compiler that generated so called p-code for a virtual stack machine, i.e., code that lends itself to reasonably efficient interpretation, along with an interpreter for that code – the Pascal-P system. The P-system compilers were named Pascal-P1, Pascal-P2, Pascal-P3, and Pascal-P4. Pascal-P1 was the first version, and Pascal-P4 was the last to come from Zürich. The version termed Pascal-P1 was coined after the fact for the many different sources for Pascal-P that existed. The compiler was redesigned to enhance portability, and issued as Pascal-P2. This code was later enhanced to become Pascal-P3, with an intermediate code backward compatible with Pascal-P2, and Pascal-P4, which was not backward compatible.

The Pascal-P4 compiler–interpreter can still be run and compiled on systems compatible with original Pascal. However, it only accepts a subset of the Pascal language.

Pascal-P5, created outside the Zürich group, accepts the full Pascal language and includes ISO 7185 compatibility.

UCSD Pascal branched off Pascal-P2, where Kenneth Bowles used it to create the interpretive UCSD p-System. It was one of three operating systems available at the launch of the original IBM Personal Computer.[11] UCSD Pascal used an intermediate code based on byte values, and thus was one of the earliest bytecode compilers. Apple Pascal was released in 1979 for the Apple 2 and Apple 3 computer systems. It was an implementation of, or largely based on, UCSD Pascal. Pascal-P1 through Pascal-P4 was not, but rather based on the CDC 6600 60-bit word length.

A compiler based on the Pascal-P5 compiler, which created native binary object files, was released for the IBM System/370 mainframe computer by the Australian Atomic Energy Commission; it was named the AAEC Pascal 8000 Compiler after the abbreviation of the name of the commission.[12]

Object Pascal and Turbo Pascal[edit]

Apple Computer created its own Lisa Pascal for the Lisa Workshop in 1982, and ported the compiler to the Apple Macintosh and MPW in 1985. In 1985 Larry Tesler, in consultation with Niklaus Wirth, defined Object Pascal and these extensions were incorporated in both the Lisa Pascal and Mac Pascal compilers.

In the 1980s, Anders Hejlsberg wrote the Blue Label Pascal compiler for the Nascom-2. A reimplementation of this compiler for the IBM PC was marketed under the names Compas Pascal and PolyPascal before it was acquired by Borland and renamed Turbo Pascal.

Turbo Pascal became hugely popular, thanks to an aggressive pricing strategy, having one of the first full-screen IDEs, and very fast turnaround time (just seconds to compile, link, and run). It was written and highly optimized entirely in assembly language, making it smaller and faster than much of the competition.

In 1986, Anders ported Turbo Pascal to the Macintosh and incorporated Apple’s Object Pascal extensions into Turbo Pascal. These extensions were then added back into the PC version of Turbo Pascal for version 5.5. At the same time Microsoft also implemented the Object Pascal compiler.[13][14] Turbo Pascal 5.5 had a large influence on the Pascal community, which began concentrating mainly on the IBM PC in the late 1980s. Many PC hobbyists in search of a structured replacement for BASIC used this product. It also began to be adopted by professional developers. Around the same time a number of concepts were imported from C to let Pascal programmers use the C-based application programming interface (API) of Microsoft Windows directly. These extensions included null-terminated strings, pointer arithmetic, function pointers, an address-of operator, and unsafe typecasts.

Turbo Pascal and other derivatives with unit or module structures are modular programming languages. However, it does not provide a nested module concept or qualified import and export of specific symbols.

Other variants[edit]

Super Pascal is a variant that added non-numeric labels, a return statement and expressions as names of types.

TMT Pascal was the first Borland-compatible compiler for 32-bit DOS protected mode, OS/2, and Win32 operating systems. The TMT Pascal language was the first one to allow function and operator overloading.

The universities of Wisconsin-Madison, Zürich, Karlsruhe, and Wuppertal developed the Pascal-SC[15][16] and Pascal-XSC[17][18][19] (Extensions for Scientific Computation) compilers, aimed at programming numerical computations. Development for Pascal-SC started in 1978 supporting ISO 7185 Pascal level 0, but level 2 support was added at a later stage.[20] Pascal-SC originally targeted the Z80 processor, but was later rewritten for DOS (x86) and 68000. Pascal-XSC has at various times been ported to Unix (Linux, SunOS, HP-UX, AIX) and Microsoft/IBM (DOS with EMX, OS/2, Windows) operating systems. It operates by generating intermediate C source code which is then compiled to a native executable. Some of the Pascal-SC language extensions have been adopted by GNU Pascal.

Pascal Sol was designed around 1983 by a French team to implement a Unix-like system named Sol. It was standard Pascal level-1 (with parameterized array bounds) but the definition allowed alternative keywords and predefined identifiers in French and the language included a few extensions to ease system programming (e.g. an equivalent to lseek).[21] The Sol team later on moved to the ChorusOS project to design a distributed operating system.[22]

IP Pascal was an implementation of the Pascal programming language using Micropolis DOS, but was moved rapidly to CP/M-80 running on the Z80. It was moved to the 80386 machine types in 1994, and exists today as Windows/XP and Linux implementations. In 2008, the system was brought up to a new level and the resulting language termed «Pascaline» (after Pascal’s calculator). It includes objects, namespace controls, dynamic arrays, and many other extensions, and generally features the same functionality and type protection as C#. It is the only such implementation that is also compatible with the original Pascal implementation, which is standardized as ISO 7185.

Language constructs[edit]

Pascal, in its original form, is a purely procedural language and includes the traditional array of ALGOL-like control structures with reserved words such as if, then, else, while, for, and case, ranging on a single statement or a beginend statements block. Pascal also has data structuring constructs not included in the original ALGOL 60 types, like records, variants, pointers, enumerations, and sets and procedure pointers. Such constructs were in part inherited or inspired from Simula 67, ALGOL 68, Niklaus Wirth’s own ALGOL W and suggestions by C. A. R. Hoare.

Pascal programs start with the program keyword with a list of external file descriptors as parameters[23] (not required in Turbo Pascal etc.); then follows the main block bracketed by the begin and end keywords. Semicolons separate statements, and the full stop (i.e., a period) ends the whole program (or unit). Letter case is ignored in Pascal source.

Here is an example of the source code in use for a very simple «Hello, World!» program:

program HelloWorld(output);
begin
    Write('Hello, World!')
    {No ";" is required after the last statement of a block -
        adding one adds a "null statement" to the program, which is ignored by the compiler.}
end.

Data types[edit]

A Type Declaration in Pascal is used to define a range of values which a variable of that type is capable of storing. It also defines a set of operations that are permissible to be performed on variables of that type. The predefined types are:

Data type Type of values which the variable is capable of storing
integer integer (whole) numbers
real floating-point numbers
boolean the values True or False
char a single character from an ordered character set
set equivalent to an array of boolean values
array a countable group of any of the preceding data types or records
record A collection of any of the preceding data types
string a sequence or «string» of characters is declared as a «packed array of char» with a starting index of 1. These can be assigned string constants and individual characters can be accessed as elements of the array.

The range of values allowed for the basic types (except boolean) is implementation defined. Functions are provided for some data conversions. For conversion of real to integer, the following functions are available: round (which rounds to integer using banker’s rounding) and trunc (rounds towards zero).

The programmer has the freedom to define other commonly used data types (e.g. byte, string, etc.) in terms of the predefined types using Pascal’s type declaration facility, for example

type
    byte        = 0..255;
    signed_byte = -128..127;
    string      = packed array[1..255] of char;

Often-used types like byte and string are already defined in many implementations.

Normally the system will use a word to store the data. For instance, the byte type may be stored in a machine integer — 32 bits perhaps — rather than an 8-bit value. Pascal does not contain language elements that allow the basic storage types to be defined more granularly. This capability was included in a number of Pascal extensions and follow-on languages, while others, like Modula-2, expanded the built-in set to cover most machine data types like 16-bit integers.

The packed keyword tells the compiler to use the most efficient method of storage for the structured data types: sets, arrays and records, rather than using one word for each element. Packing may slow access on machines that do not offer easy access to parts of a word.

Subrange types[edit]

Subranges of any ordinal data type (any simple type except real) can also be made:

var
    x : 1..10;
    y : 'a'..'z';

Set types[edit]

In contrast with other programming languages from its time, Pascal supports a set type:[24]

var
    Set1 : set of 1..10;
    Set2 : set of 'a'..'z';

A set is a fundamental concept for modern mathematics, and they may be used in many algorithms. Such a feature is useful and may be faster than an equivalent construct in a language that does not support sets. For example, for many Pascal compilers:

executes faster than:

if (i > 4) and (i < 11) then ...

Sets of non-contiguous values can be particularly useful, in terms of both performance and readability:

if i in [0..3, 7, 9, 12..15] then ...

For these examples, which involve sets over small domains, the improved performance is usually achieved by the compiler representing set variables as bit vectors. The set operators can then be implemented efficiently as bitwise machine code operations.

Union types[edit]

In Pascal, there are two ways to create unions. One is the standard way through a variant record. The second is a nonstandard means of declaring a variable as absolute, meaning it is placed at the same memory location as another variable or at an absolute address. While all Pascal compilers support variant records, only some support absolute variables.

For the purposes of this example, the following are all integer types: a byte is 8-bits, a word is 16-bits, and an integer is 32-bits.

The following example shows the non-standard absolute form:

VAR
    A: Integer;
    B: Array[1..4] of Byte absolute A;
    C: Integer absolute 0;

In the first example, each of the elements of the array B maps to one of the specific bytes of the variable A. In the second example, the variable C is assigned to the exact machine address 0.

In the following example, a record has variants, some of which share the same location as others:

TYPE
     Shape = (Circle, Square, Triangle);
     Dimensions = record
        case Figure: Shape of 
           Circle: (Diameter: real);
           Square: (Width: real);
           Triangle: (Side: real; Angle1, Angle2: 0..360)
        end;

Type declarations[edit]

Types can be defined from other types using type declarations:

type
    x = integer;
    y = x;
...

Further, complex types can be constructed from simple types:

type
    a = array[1..10] of integer;
    b = record
        x : integer;
        y : char  {extra semicolon not strictly required}
    end;
    c = file of a;

File type[edit]

As shown in the example above, Pascal files are sequences of components. Every file has a buffer variable which is denoted by f^. The procedures get (for reading) and put (for writing) move the buffer variable to the next element. Read is introduced such that read(f, x) is the same as x := f^; get(f);. Write is introduced such that write(f, x) is the same as f^ := x; put(f); The type text is predefined as file of char. While the buffer variable could be used for inspecting the next character to be used (check for a digit before reading an integer), this leads to serious problems with interactive programs in early implementations, but was solved later with the «lazy I/O» concept.

In Jensen & Wirth Pascal, strings are represented as packed arrays of chars; they therefore have fixed length and are usually space-padded.

Pointer types[edit]

Pascal supports the use of pointers:

type
    pNode = ^Node;
    Node  = record
        a : integer;
        b : char;
        c : pNode  
    end;
var
    NodePtr : pNode;
    IntPtr  : ^integer;

Here the variable NodePtr is a pointer to the data type Node, a record. Pointers can be used before they are declared. This is a forward declaration, an exception to the rule that things must be declared before they are used.

To create a new record and assign the value 10 and character A to the fields a and b in the record, and to initialise the pointer c to the null pointer («NIL» in Pascal), the statements would be:

New(NodePtr);
...
NodePtr^.a := 10;
NodePtr^.b := 'A';
NodePtr^.c := NIL;
...

This could also be done using the with statement, as follows:

New(NodePtr);
...
with NodePtr^ do
begin
    a := 10;
    b := 'A';
    c := NIL
end;
...

Inside of the scope of the with statement, a and b refer to the subfields of the record pointer NodePtr and not to the record Node or the pointer type pNode.

Linked lists, stacks and queues can be created by including a pointer type field (c) in the record.

Unlike many languages that feature pointers, Pascal only allows pointers to reference dynamically created variables that are anonymous, and does not allow them to reference standard static or local variables. Pointers also must have an associated type, and a pointer to one type is not compatible with a pointer to another type (e.g. a pointer to a char is not compatible with a pointer to an integer). This helps eliminate the type security issues inherent with other pointer implementations, particularly those used for PL/I or C. It also removes some risks caused by dangling pointers, but the ability to dynamically deallocate referenced space by using the dispose function (which has the same effect as the free library function found in C) means that the risk of dangling pointers has not been eliminated[25] as it has in languages such as Java and C#, which provide automatic garbage collection (but which do not eliminate the related problem of memory leaks).

Some of these restrictions can be lifted in newer dialects.

Control structures[edit]

Pascal is a structured programming language, meaning that the flow of control is structured into standard statements, usually without ‘goto’ commands.

while a <> b do  WriteLn('Waiting');

if a > b then WriteLn('Condition met')   {no semicolon allowed before else}
    else WriteLn('Condition not met');

for i := 1 to 10 do  {no semicolon here as it would detach the next statement}
    WriteLn('Iteration: ', i);

repeat
    a := a + 1
until a = 10;

case i of
    0 : Write('zero');
    1 : Write('one');
    2 : Write('two');
    3,4,5,6,7,8,9,10: Write('?')
end;

Procedures and functions[edit]

Pascal structures programs into procedures and functions. Generally, a procedure is used for its side effects, whereas a function is used for its return value.

program Printing;

var i : integer;

procedure PrintAnInteger(j : integer);
begin
    ...
end;

function triple(const x: integer): integer;
begin
	triple := x * 3
end;

begin { main program }
    ...
    PrintAnInteger(i);
    PrintAnInteger(triple(i))
end.

Procedures and functions can be nested to any depth, and the ‘program’ construct is the logical outermost block.

By default, parameters are passed by value. If ‘var’ precedes a parameter’s name, it is passed by reference.

Each procedure or function can have its own declarations of goto labels, constants, types, variables, and other procedures and functions, which must all be in that order.
This ordering requirement was originally intended to allow efficient single-pass compilation. However, in some dialects (such as Delphi) the strict ordering requirement of declaration sections has been relaxed.

Semicolons as statement separators[edit]

Pascal adopted many language syntax features from the ALGOL language, including the use of a semicolon as a statement separator. This is in contrast to other languages, such as PL/I and C, which use the semicolon as a statement terminator. No semicolon is needed before the end keyword of a record type declaration, a block, or a case statement; before the until keyword of a repeat statement; and before the else keyword of an if statement.

The presence of an extra semicolon was not permitted in early versions of Pascal. However, the addition of ALGOL-like empty statements in the 1973 Revised Report and later changes to the language in ISO 7185:1983 now allow for optional semicolons in most of these cases. A semicolon is still not permitted immediately before the else keyword in an if statement, because the else follows a single statement, not a statement sequence. In the case of nested ifs, a semicolon cannot be used to avoid the dangling else problem (where the inner if does not have an else, but the outer if does) by putatively terminating the nested if with a semicolon – this instead terminates both if clauses. Instead, an explicit beginend block must be used.[26]

Resources[edit]

Compilers and interpreters[edit]

Several Pascal compilers and interpreters are available for general use:

  • Delphi is Embarcadero’s (formerly Borland/CodeGear) flagship rapid application development (RAD) product. It uses the Object Pascal language (termed ‘Delphi’ by Borland), descended from Pascal, to create applications for Windows, macOS, iOS, and Android. The .NET support that existed from D8 through D2005, D2006, and D2007 has been terminated, and replaced by a new language (Prism, which is rebranded Oxygene, see below) that is not fully backward compatible. In recent years Unicode support and generics were added (D2009, D2010, Delphi XE).
  • Free Pascal is a cross-platform compiler written in Object Pascal (and is self-hosting). It is aimed at providing a convenient and powerful compiler, both able to compile legacy applications and to be the means to develop new ones. It is distributed under the GNU General Public License (GNU GPL), while packages and runtime library come under a modified GNU Lesser General Public License (GNU LGPL). In addition to compatibility modes for Turbo Pascal, Delphi, and Mac Pascal, it has its own procedural and object-oriented syntax modes with support for extended features such as operator overloading. It supports many platforms and operating systems. Current versions also feature an ISO mode.
  • Turbo51 is a free Pascal compiler for the Intel 8051 family of microcontrollers, with Turbo Pascal 7 syntax.
  • Oxygene (formerly named Chrome) is an Object Pascal compiler for the .NET and Mono platforms. It was created and is sold by RemObjects Software, and sold for a while by Embarcadero as the backend compiler of Prism.
  • Kylix was a descendant of Delphi, with support for the Linux operating system and an improved object library. It is no longer supported. Compiler and IDE are available now for non-commercial use.
  • GNU Pascal Compiler (GPC) is the Pascal compiler of the GNU Compiler Collection (GCC). The compiler is written in C, the runtime library mostly in Pascal. Distributed under the GNU General Public License, it runs on many platforms and operating systems. It supports the ANSI/ISO standard languages and has partial Turbo Pascal dialect support. One of the more painful omissions is the absence of a 100% Turbo Pascal-compatible (short)string type. Support for Borland Delphi and other language variants is quite limited. There is some support for Mac-pascal, however.
  • Virtual Pascal was created by Vitaly Miryanov in 1995 as a native OS/2 compiler compatible with Borland Pascal syntax. Then, it had been commercially developed by fPrint, adding Win32 support, and in 2000 it became freeware. Today it can compile for Win32, OS/2, and Linux, and is mostly compatible with Borland Pascal and Delphi. Development was canceled on April 4, 2005.
  • P4 compiler, the basis for many subsequent Pascal-implemented-in-Pascal compilers. It implements a subset of full Pascal.
  • P5 compiler is an ISO 7185 (full Pascal) adaption of P4.
  • Smart Mobile Studio is a Pascal to HTML5/Javascript compiler
  • Turbo Pascal was the dominant Pascal compiler for PCs during the 1980s and early 1990s, popular both because of its powerful extensions and extremely short compilation times. Turbo Pascal was compactly written and could compile, run, and debug all from memory without accessing disk. Slow floppy disk drives were common for programmers at the time, further magnifying Turbo Pascal’s speed advantage. Currently, older versions of Turbo Pascal (up to 5.5) are available for free download from Borland’s site.
  • IP Pascal implements the language «Pascaline» (named after Pascal’s calculator), which is a highly extended Pascal compatible with original Pascal according to ISO 7185. It features modules with namespace control, including parallel tasking modules with semaphores, objects, dynamic arrays of any dimensions that are allocated at runtime, overloads, overrides, and many other extensions. IP Pascal has a built-in portability library that is custom tailored to the Pascal language. For example, a standard text output application from 1970’s original Pascal can be recompiled to work in a window and even have graphical constructs added.
  • Pascal-XT was created by Siemens for their mainframe operating systems BS2000 and SINIX.
  • PocketStudio is a Pascal subset compiler and RAD tool for Palm OS and MC68xxx processors with some of its own extensions to assist interfacing with the Palm OS API. It resembles Delphi and Lazarus with a visual form designer, an object inspector and a source code editor.
  • MIDletPascal – A Pascal compiler and IDE that generates small and fast Java bytecode specifically designed to create software for mobiles.
  • Vector Pascal is a language for SIMD instruction sets such as the MMX and the AMD 3d Now, supporting all Intel and AMD processors, and Sony’s PlayStation 2 Emotion Engine.
  • Morfik Pascal allows the development of Web applications entirely written in Object Pascal (both server and browser side).
  • WDSibyl – Visual Development Environment and Pascal compiler for Win32 and OS/2.
  • PP Compiler, a compiler for Palm OS that runs directly on the handheld computer.
  • CDC 6000 Pascal compiler is the source code for the first (CDC 6000) Pascal compiler.
  • Pascal-S[27]
  • AmigaPascal is a free Pascal compiler for the Amiga computer.
  • VSI Pascal for OpenVMS (formerly HP Pascal for OpenVMS, Compaq Pascal, DEC Pascal, VAX Pascal and originally VAX-11 Pascal[28]) is a Pascal compiler that runs on OpenVMS systems.[29] It was also supported under Tru64.[30][31] VSI Pascal for OpenVMS is compatible with ISO/IEC 7185:1990 Pascal as well some of ISO/IEC 10206:1990 Extended Pascal, and also includes its own extensions.[29] The compiler frontend is implemented in BLISS.[32]
  • Stony Brook Pascal+ was a 16-bit (later 32-bit) optimizing compiler for DOS and OS/2, marketed as a direct replacement for Turbo Pascal, but producing code that executed at least twice as fast.

IDEs[edit]

  • Dev-Pascal is a Pascal IDE that was designed in Borland Delphi and which supports Free Pascal and GNU Pascal as backends.
  • Lazarus is a free Delphi-like visual cross-platform IDE for rapid application development (RAD). Based on Free Pascal, Lazarus is available for numerous platforms including Linux, FreeBSD, macOS and Microsoft Windows.
  • Fire (macOS) and Water (Windows) for the Oxygene and the Elements Compiler

Libraries[edit]

  • WOL Library for creating GUI applications with the Free Pascal Compiler.

Standards[edit]

ISO/IEC 7185:1990 Pascal[edit]

In 1983, the language was standardized in the international standard IEC/ISO 7185[33] and several local country-specific standards, including the American ANSI/IEEE770X3.97-1983, and ISO 7185:1983. These two standards differed only in that the ISO standard included a «level 1» extension for conformant arrays (an array where the boundaries of the array are not known until run time), where ANSI did not allow for this extension to the original (Wirth version) language. In 1989, ISO 7185 was revised (ISO 7185:1990) to correct various errors and ambiguities found in the original document.

The ISO 7185 was stated to be a clarification of Wirth’s 1974 language as detailed by the User Manual and Report [Jensen and Wirth], but was also notable for adding «Conformant Array Parameters» as a level 1 to the standard, level 0 being Pascal without conformant arrays. This addition was made at the request of C. A. R. Hoare, and with the approval of Niklaus Wirth. The precipitating cause was that Hoare wanted to create a Pascal version of the (NAG) Numerical Algorithms Library, which had originally been written in FORTRAN, and found that it was not possible to do so without an extension that would allow array parameters of varying size. Similar considerations motivated the inclusion in ISO 7185 of the facility to specify the parameter types of procedural and functional parameters.

Niklaus Wirth himself referred to the 1974 language as «the Standard», for example, to differentiate it from the machine specific features of the CDC 6000 compiler. This language was documented in The Pascal Report,[34] the second part of the «Pascal users manual and report».

On the large machines (mainframes and minicomputers) Pascal originated on, the standards were generally followed. On the IBM PC, they were not. On IBM PCs, the Borland standards Turbo Pascal and Delphi have the greatest number of users. Thus, it is typically important to understand whether a particular implementation corresponds to the original Pascal language, or a Borland dialect of it.

The IBM PC versions of the language began to differ with the advent of UCSD Pascal, an interpreted implementation that featured several extensions to the language, along with several omissions and changes. Many UCSD language features survive today, including in Borland’s dialect.

ISO/IEC 10206:1990 Extended Pascal[edit]

[icon]

This section needs expansion. You can help by adding to it. (February 2018)

In 1990, an extended Pascal standard was created as ISO/IEC 10206,[35] which is identical in technical content[36] to IEEE/ANSI 770X3.160-1989[37]
As of 2019, Support of Extended Pascal in FreePascal Compiler is planned.[38]

Variations[edit]

Niklaus Wirth’s Zürich version of Pascal was issued outside ETH in two basic forms: the CDC 6000 compiler source, and a porting kit called Pascal-P system. The Pascal-P compiler left out several features of the full language that were not required to bootstrap the compiler. For example, procedures and functions used as parameters, undiscriminated variant records, packing, dispose, interprocedural gotos and other features of the full compiler were omitted.

UCSD Pascal, under Professor Kenneth Bowles, was based on the Pascal-P2 kit, and consequently shared several of the Pascal-P language restrictions. UCSD Pascal was later adopted as Apple Pascal, and continued through several versions there. Although UCSD Pascal actually expanded the subset Pascal in the Pascal-P kit by adding back standard Pascal constructs, it was still not a complete standard installation of Pascal.

In the early 1990s, Alan Burns and Geoff Davies developed Pascal-FC, an extension to Pl/0 (from the Niklaus’ book Algorithms + Data Structures = Programs). Several constructs were added to use Pascal-FC as a teaching tool for Concurrent Programming (such as semaphores, monitors, channels, remote-invocation and resources). To be able to demonstrate concurrency, the compiler output (a kind of P-code) could then be executed on a virtual machine. This virtual machine not only simulated a normal – fair – environment, but could also simulate extreme conditions (unfair mode).

Borland-like Pascal compilers[edit]

Borland’s Turbo Pascal, written by Anders Hejlsberg, was written in assembly language independent of UCSD and the Zürich compilers. However, it adopted much of the same subset and extensions as the UCSD compiler. This is probably because the UCSD system was the most common Pascal system suitable for developing applications on the resource-limited microprocessor systems available at that time.

The shrink-wrapped Turbo Pascal version 3 and later incarnations, including Borland’s Object Pascal and Delphi and non-Borland near-compatibles became popular with programmers including shareware authors, and so the SWAG library of Pascal code features a large amount of code written with such versions as Delphi in mind.

Software products (compilers, and IDE/Rapid Application Development (RAD)) in this category:

  • Turbo Pascal – «TURBO.EXE» up to version 7, and Turbo Pascal for Windows («TPW») and Turbo Pascal for Macintosh.
  • Pure Pascal and HiSPeed Pascal 2 Pascal language Environment for the Atari ST range of computers.
  • Borland Pascal 7 – A professional version of Turbo Pascal line which targeted both DOS and Windows.
  • Object Pascal – an extension of the Pascal language that was developed at Apple Computer by a team led by Larry Tesler in consultation with Niklaus Wirth, the inventor of Pascal; its features were added to Borland’s Turbo Pascal for Macintosh and in 1989 for Turbo Pascal 5.5 for DOS.
  • Delphi – Object Pascal is essentially its underlying language.
  • Free Pascal compiler (FPC) – Free Pascal adopted the de facto standard dialect of Pascal programmers, Borland Pascal and, later, Delphi. Freepascal also supports both ISO standards.
  • PascalABC.NET – a new generation Pascal programming language including compiler and IDE.
  • Borland Kylix is a compiler and IDE formerly sold by Borland, but later discontinued. It is a Linux version of the Borland Delphi software development environment and C++Builder.
  • Lazarus – similar to Kylix in function, is a free cross-platform visual IDE for RAD using the Free Pascal compiler, which supports dialects of Object Pascal to varying degrees.
  • Virtual Pascal – VP2/1 is a fully Borland Pascal– and Borland Delphi–compatible 32-bit Pascal compiler for OS/2 and Windows 32 (with a Linux version «on the way»).[39]
  • Sybil is an open source Delphi-like IDE and compiler; implementations include:
    • WDSibyl[40] for Microsoft Windows and OS/2, a commercial Borland Pascal compatible environment released by a company named Speedsoft that was later developed into a Delphi-like rapid application development (RAD) environment named Sybil and then open sourced under the GPL when that company closed down;
    • Open Sybil, which is an ongoing project, an open source tool for OS/2 and eCS that was originally based on Speedsoft’s WDsybl Sibyl Portable Component Classes (SPCC) and Sibyl Visual Development Tool (SVDE) sources, but now its core is IBM System Object Model (SOM), WPS and OpenDoc.[41]

List of related standards[edit]

  • ISO 8651-2:1988 Information processing systems – Computer graphics – Graphical Kernel System (GKS) language bindings – Part 2: Pascal

Reception[edit]

Pascal generated a wide variety of responses in the computing community, both critical and complimentary.

Early criticism[edit]

While very popular in the 1980s and early 1990s, implementations of Pascal that closely followed Wirth’s initial definition of the language were widely criticized as being unsuitable for use outside teaching. Brian Kernighan, who popularized the C language, outlined his most notable criticisms of Pascal as early as 1981 in his article «Why Pascal is Not My Favorite Programming Language».[42] The most serious problem Kernighan described was that array sizes and string lengths were part of the type, so it was not possible to write a function that would accept variable-length arrays or even strings as parameters. This made it unfeasible to write, for example, a sorting library. Kernighan also criticized the unpredictable order of evaluation of boolean expressions, poor library support, and lack of static variables, and raised a number of smaller issues. Also, he stated that the language did not provide any simple constructs to «escape» (knowingly and forcibly ignore) restrictions and limitations. More general complaints from other sources[25][43] noted that the scope of declarations was not clearly defined in the original language definition, which sometimes had serious consequences when using forward declarations to define pointer types, or when record declarations led to mutual recursion, or when an identifier may or may not have been used in an enumeration list. Another difficulty was that, like ALGOL 60, the language did not allow procedures or functions passed as parameters to predefine the expected type of their parameters.

Despite initial criticisms, Pascal continued to evolve, and most of Kernighan’s points do not apply to versions of the language which were enhanced to be suitable for commercial product development, such as Borland’s Turbo Pascal. As Kernighan predicted in his article, most of the extensions to fix these issues were incompatible from compiler to compiler. Since the early 1990s, however, most of the varieties seem condensed into two categories: ISO and Borland-like. Extended Pascal addresses many of these early criticisms. It supports variable-length strings, variable initialization, separate compilation, short-circuit boolean operators, and default (otherwise) clauses for case statements.[44]

See also[edit]

  • Ada (programming language)
  • Concurrent Pascal
  • Comparison of Pascal and Delphi
  • Comparison of Pascal and C
  • Modula-2
  • Oberon (programming language)
  • Object Pascal
  • PascalCase
  • Standard ML

References[edit]

  1. ^ «About Microsoft’s «Delegates»«. Archived from the original on 2012-06-27. We looked very carefully at Delphi Object Pascal and built a working prototype of bound method references in order to understand their interaction with the Java programming language and its APIs … Our conclusion was that bound method references are unnecessary and detrimental to the language. This decision was made in consultation with Borland International, who had previous experience with bound method references in Delphi Object Pascal.
  2. ^ TechMetrix Research (1999). «History of Java» (PDF). Java Application Servers Report. Archived from the original (PDF) on 2010-12-29. The project went ahead under the name «green» and the language was based on an old model of UCSD Pascal, which makes it possible to generate interpretive code
  3. ^ «A Conversation with James Gosling – ACM Queue». Archived from the original on 16 July 2015. Retrieved 11 August 2015.
  4. ^ Wirth, Niklaus (2000). «The Development of Procedural Programming Languages Personal Contributions and Perspectives». Modular Programming Languages. Lecture Notes in Computer Science. Vol. 1897. pp. 1–10. doi:10.1007/10722581_1. ISBN 978-3-540-67958-5.
  5. ^ Hertzfeld, Andy. «Hungarian folklore.org Archived 2015-11-18 at the Wayback Machine: Macintosh Stories. Retrieved 2012-03-06.
  6. ^ https://www.computerhistory.org/atchm/adobe-photoshop-source-code/ Archived 2014-05-07 at the Wayback Machine, Adobe Photoshop Source Code
  7. ^ «RAD Studio Application Showcase». 2021-10-29.
  8. ^ tiobe.com Archived 2012-03-15 at the Wayback Machine, Programming Community Index for January 2011.
  9. ^ «Antique Software: Turbo Pascal v5.5».
  10. ^ Computers and Computing. A Personal Perspective. Archived 2017-05-10 at the Wayback Machine by Niklaus Wirth
  11. ^ cbi.umn.edu, «An Interview with John Brackett and Doug Ross»[permanent dead link], p15, Charles Babbage Institute, 2004
  12. ^ Australian Atomic Energy Commission Research Establishment, Lucas Heights, Nuclear Science and Technology Branch Report, Divisional Research (PDF). International Atomic Energy Agency (IEAE) (Report). 1977. p. 22.
  13. ^ Jon Udell, Crash of the Object-Oriented Pascals, BYTE, July, 1989.
  14. ^ M. I. Trofimov, The End of Pascal?, BYTE, March, 1990, p. 36.
  15. ^ Rall, L. B. (1987). «An introduction to the scientific computing language Pascal-SC». Computers. 14: 53–69. doi:10.1016/0898-1221(87)90181-7.
  16. ^ PI (1986-08-29). «Cadmus jetzt mit Kulisch-Arithmetik — Uni Karlsruhe gibt Pascal-Compiler nach München» [Cadmus now comes with Kulisch arithmetic — University Karlsruhe delivers Pascal compiler to Munich]. Computerwoche (in German). Munich – Karlsruhe, Germany: IDG Business Media GmbH. Archived from the original on 2016-05-30. Retrieved 2016-05-30.
  17. ^ «Pascal-XSC: Pascal for Extended Scientific Computing». Archived from the original on 2014-01-05.
  18. ^ «XSC Software». Archived from the original on 1 November 2015. Retrieved 11 August 2015.
  19. ^ «Universitaet Wuppertal: Wissenschaftliches Rechnen / Softwaretechnologie». Archived from the original on 6 November 2015. Retrieved 11 August 2015.
  20. ^ Bamberger, Lothar; Davenport, James H.; Fischer, Hans-Christoph; Kok, Jan; Schumacher, Günter; Ullrich, Christian; Wallis, Peter J. L.; Winter, Dik T.; Wolff von Gudenberg, Jürgen (1990). Wallis, Peter J. L. (ed.). Improving Floating-Point Programming (1st ed.). Bath, United Kingdom: John Wiley & Sons Ltd. ISBN 0-471-92437-7.
  21. ^ Michel Gien, «The SOL Operating System», in Usenix Summer ’83 Conference, Toronto, ON, (July 1983), pp. 75–78
  22. ^ cs.berkeley.edu Archived 2015-02-07 at the Wayback Machine
  23. ^ Pascal ISO 7185:1990 Archived 2012-06-17 at the Wayback Machine 6.10
  24. ^ Mandell, Steven L. (1987). Pascal Programming Today. West Publishing Company. ISBN 978-0-314-33935-5.
  25. ^ a b J. Welsh, W. J. Sneeringer, and C. A. R. Hoare, «Ambiguities and Insecurities in Pascal», Software: Practice and Experience 7, pp. 685–696 (1977)
  26. ^ Pascal, Nell Dale and Chip Weems, «Dangling Else», p. 160–161 Archived 2017-03-18 at the Wayback Machine
  27. ^ «Pascal-S: A Subset and Its Implementation», N. Wirth in Pascal – The Language and Its Implementation, by D.W. Barron, Wiley 1979.
  28. ^ «VAX-11 Pascal V1.0 User’s Guide» (PDF).
  29. ^ a b «VSI Pascal for OpenVMS Software Product Description» (PDF). VSI. 2017. Retrieved 2022-02-07.
  30. ^ «Interview with a Pascal Architect — Compaq Pascal». Archived from the original on 2021-10-19. Retrieved 2022-05-28.
  31. ^ «Compaq Pascal Version 5.8 for Tru64 UNIX Software Product Description». Archived from the original on 2020-07-25. Retrieved 2022-05-28.
  32. ^ «VSI’s John Reagan Interview on GEM vs. LLVM for X86/64». eCube Systems. 2019-03-12. Archived from the original on 2020-08-12. Retrieved 2022-02-07.
  33. ^ ISO/IEC 7185:1990 Pascal (PDF). Archived from the original (PDF) on 27 January 2016. Retrieved 16 September 2014.
  34. ^ Wirth, Niklaus (July 1973). The Programming Language Pascal (Revised Report). ETH Zürich. doi:10.3929/ethz-a-000814158.
  35. ^ Extended Pascal: ISO/IEC 10206:1990. Archived from the original on 2016-03-27. Retrieved 16 September 2014.
  36. ^ «Language standards: Pascal, Extended Pascal, Fortan». Archived from the original on 2014-07-14. Retrieved 16 September 2014.
  37. ^ 770X3.160-1989 – IEEE/ANSI Standard for the Programming Language Extended Pascal. 1990. doi:10.1109/IEEESTD.1990.101061. ISBN 978-0-7381-4247-0.
  38. ^ «Extended Pascal — Free Pascal wiki».
  39. ^ «Virtual Pascal for OS/2». Archived from the original on 30 August 2011. Retrieved 3 April 2016.
  40. ^ Wolfgang (October 15, 2020). «WDSibyl: Visual Development Environment». WDSibyl.org. Archived from the original on 2020-02-12. Retrieved 2020-04-20.
  41. ^ «netlabs.org – Project: Open Sibyl». Archived from the original on 4 March 2016. Retrieved 3 April 2016.
  42. ^ Brian W. Kernighan (1981). «Why Pascal is Not My Favorite Programming Language». Archived 2009-04-28 at the Wayback Machine
  43. ^ O. Lecarme, P. Desjardins, «More Comments on the Programming Language Pascal», Acta Informatica 4, pp. 231–243 (1975).
  44. ^ «Extended Pascal». Archived from the original on 2015-10-18.

Further reading[edit]

Wikibooks has a book on the topic of: Pascal

  • Niklaus Wirth: The Programming Language Pascal. 35–63, Acta Informatica, Volume 1, 1971.
  • C. A. R. Hoare: «Notes on data structuring». In O.-J. Dahl, E. W. Dijkstra and C. A. R. Hoare, editors, Structured Programming, pages 83–174. Academic Press, 1972.
  • C. A. R. Hoare, Niklaus Wirth: An Axiomatic Definition of the Programming Language Pascal. 335–355, Acta Informatica, Volume 2, 1973.
  • Kathleen Jensen and Niklaus Wirth: Pascal – User Manual and Report. Springer-Verlag, 1974, 1985, 1991, ISBN 0-387-97649-3 and ISBN 3-540-97649-3.
  • Niklaus Wirth: Algorithms + Data Structures = Programs. Prentice-Hall, 1975, ISBN 0-13-022418-9.
  • Niklaus Wirth: An assessment of the programming language Pascal. 23–30 ACM SIGPLAN Notices Volume 10, Issue 6, June 1975.
  • N. Wirth, and A. I. Wasserman, ed: Programming Language Design. IEEE Computer Society Press, 1980
  • D. W. Barron (Ed.): Pascal – The Language and its Implementation. John Wiley 1981, ISBN 0-471-27835-1
  • Peter Grogono: Programming in Pascal, Revised Edition, Addison-Wesley, 1980
  • Richard S. Forsyth: Pascal in Work and Play, Chapman and Hall, 1982
  • N. Wirth, M. Broy, ed, and E. Denert, ed: Pascal and its Successors in Software Pioneers: Contributions to Software Engineering. Springer-Verlag, 2002, ISBN 3-540-43081-4
  • N. Wirth: Recollections about the Development of Pascal. ACM SIGPLAN Notices, Volume 28, No 3, March 1993.
Pascal

LagrangePAS.png
Paradigm
  • Imperative
  • structured
Family Wirth Pascal
Designed by Niklaus Wirth
First appeared 1970; 53 years ago
Typing discipline
  • Static
  • strong
  • safe
Scope Lexical
Filename extensions .pp, .pas, .inc
Major implementations
  • CDC 6000
  • Embarcadero Delphi
  • ICL 1900
  • Pascal-P
  • PDP-11
  • PDP-10
  • IBM System/370
  • VSI Pascal
  • Free Pascal
  • GNU Pascal
Dialects
  • Delphi
  • Turbo Pascal
  • UCSD Pascal
Influenced by
  • ALGOL W
  • Simula 67
Influenced
  • Ada
  • C/AL
  • Component Pascal
  • Go
  • Java[1][2][3]
  • Modula / -2 / -3
  • Oberon / -2
  • Object Pascal
  • Oxygene
  • Power Fx
  • Seed7
  • Standard ML
  • VHDL
  • Structured text

Pascal is an imperative and procedural programming language, designed by Niklaus Wirth as a small, efficient language intended to encourage good programming practices using structured programming and data structuring. It is named in honour of the French mathematician, philosopher and physicist Blaise Pascal.

Pascal was developed on the pattern of the ALGOL 60 language. Wirth was involved in the process to improve the language as part of the ALGOL X efforts and proposed a version named ALGOL W. This was not accepted, and the ALGOL X process bogged down. In 1968, Wirth decided to abandon the ALGOL X process and further improve ALGOL W, releasing this as Pascal in 1970.

On top of ALGOL’s scalars and arrays, Pascal enables defining complex datatypes and building dynamic and recursive data structures such as lists, trees and graphs. Pascal has strong typing on all objects, which means that one type of data cannot be converted to or interpreted as another without explicit conversions. Unlike C (and most languages in the C-family), Pascal allows nested procedure definitions to any level of depth, and also allows most kinds of definitions and declarations inside subroutines (procedures and functions). A program is thus syntactically similar to a single procedure or function. This is similar to the block structure of ALGOL 60, but restricted from arbitrary block statements to just procedures and functions.

Pascal became very successful in the 1970s, notably on the burgeoning minicomputer market. Compilers were also available for many microcomputers as the field emerged in the late 1970s. It was widely used as a teaching language in university-level programming courses in the 1980s, and also used in production settings for writing commercial software during the same period. It was displaced by the C programming language during the late 1980s and early 1990s as UNIX-based systems became popular, and especially with the release of C++.

A derivative named Object Pascal designed for object-oriented programming was developed in 1985. This was used by Apple Computer (for the Lisa and MacIntosh machines) and Borland in the late 1980s and later developed into Delphi on the Microsoft Windows platform. Extensions to the Pascal concepts led to the languages Modula-2 and Oberon.

History[edit]

Earlier efforts[edit]

Much of the history of computer language design during the 1960s can be traced to the ALGOL 60 language. ALGOL was developed during the 1950s with the explicit goal of being able to clearly describe algorithms. It included a number of features for structured programming that remain common in languages to this day.

Shortly after its introduction, in 1962 Wirth began working on his dissertation with Helmut Weber on the Euler programming language. Euler was based on ALGOL’s syntax and many concepts but was not a derivative. Its primary goal was to add dynamic lists and types, allowing it to be used in roles similar to Lisp. The language was published in 1965.

By this time, a number of problems in ALGOL had been identified, notably the lack of a standardized string system. The group tasked with maintaining the language had begun the ALGOL X process to identify improvements, calling for submissions. Wirth and Tony Hoare submitted a conservative set of modifications to add strings and clean up some of the syntax. These were considered too minor to be worth using as the new standard ALGOL, so Wirth wrote a compiler for the language, which became named ALGOL W.

The ALGOL X efforts would go on to choose a much more complex language, ALGOL 68. The complexity of this language led to considerable difficulty producing high-performance compilers, and it was not widely used in the industry. This left an opening for newer languages.

Pascal[edit]

Pascal was influenced by the ALGOL W efforts, with the explicit goals of teaching programming in a structured fashion and for the development of system software.[4]
A generation of students used Pascal as an introductory language in undergraduate courses.

One of the early successes for the language was the introduction of UCSD Pascal, a version that ran on a custom operating system that could be ported to different platforms. A key platform was the Apple II, where it saw widespread use as Apple Pascal. This led to Pascal becoming the primary high-level language used for development in the Apple Lisa, and later, the Macintosh. Parts of the original Macintosh operating system were hand-translated into Motorola 68000 assembly language from the Pascal source code.[5]

The typesetting system TeX by Donald E. Knuth was written in WEB, the original literate programming system, based on DEC PDP-10 Pascal. Successful commercial applications like Adobe Photoshop[6] were written in Macintosh Programmer’s Workshop Pascal, while applications like Total Commander, Skype[7] and Macromedia Captivate were written in Delphi (Object Pascal). Apollo Computer used Pascal as the systems programming language for its operating systems beginning in 1980.

Variants of Pascal have also been used for everything from research projects to PC games and embedded systems. Newer Pascal compilers exist which are widely used.[8]

Object Pascal[edit]

During work on the Lisa, Larry Tesler began corresponding with Wirth on the idea of adding object-oriented extensions to the language, to make Pascal a Multi-paradigm programming language. This led initially to Clascal, introduced in 1983. As the Lisa program faded and was replaced by the Macintosh, a further version was created and named Object Pascal. This was introduced on the Mac in 1985 as part of the MacApp application framework, and became Apple’s main development language into the early 1990s.

The Object Pascal extensions were added to Turbo Pascal with the release of version 5.5 in 1989.[9] Over the years, Object Pascal became the basis of the Delphi system for Microsoft Windows, which is still used for developing Windows applications, and can cross-compile code to other systems. Free Pascal is an open source, cross-platform alternative with its own graphical IDE called Lazarus.

Implementations[edit]

Early Pascal compilers[edit]

The first Pascal compiler was designed in Zürich for the CDC 6000 series mainframe computer family. Niklaus Wirth reports that a first attempt to implement it in FORTRAN 66 in 1969 was unsuccessful due to FORTRAN 66’s inadequacy to express complex data structures. The second attempt was implemented in a C-like language (Scallop by Max Engeli) and then translated by hand (by R. Schild) to Pascal itself for boot-strapping.[10] It was operational by mid-1970. Many Pascal compilers since have been similarly self-hosting, that is, the compiler is itself written in Pascal, and the compiler is usually capable of recompiling itself when new features are added to the language, or when the compiler is to be ported to a new environment. The GNU Pascal compiler is one notable exception, being written in C.

The first successful port of the CDC Pascal compiler to another mainframe was completed by Welsh and Quinn at the Queen’s University of Belfast (QUB) in 1972. The target was the International Computers Limited (ICL) 1900 series. This compiler, in turn, was the parent of the Pascal compiler for the Information Computer Systems (ICS) Multum minicomputer. The Multum port was developed – with a view to using Pascal as a systems programming language – by Findlay, Cupples, Cavouras and Davis, working at the Department of Computing Science in Glasgow University. It is thought that Multum Pascal, which was completed in the summer of 1973, may have been the first 16-bit implementation.

A completely new compiler was completed by Welsh et al. at QUB in 1977. It offered a source-language diagnostic feature (incorporating profiling, tracing and type-aware formatted postmortem dumps) that was implemented by Findlay and Watt at Glasgow University. This implementation was ported in 1980 to the ICL 2900 series by a team based at Southampton University and Glasgow University. The Standard Pascal Model Implementation was also based on this compiler, having been adapted, by Welsh and Hay at Manchester University in 1984, to check rigorously for conformity to the BSI 6192/ISO 7185 Standard and to generate code for a portable abstract machine.

The first Pascal compiler written in North America was constructed at the University of Illinois under Donald B. Gillies for the PDP-11 and generated native machine code.

The Pascal-P system[edit]

To propagate the language rapidly, a compiler porting kit was created in Zürich that included a compiler that generated so called p-code for a virtual stack machine, i.e., code that lends itself to reasonably efficient interpretation, along with an interpreter for that code – the Pascal-P system. The P-system compilers were named Pascal-P1, Pascal-P2, Pascal-P3, and Pascal-P4. Pascal-P1 was the first version, and Pascal-P4 was the last to come from Zürich. The version termed Pascal-P1 was coined after the fact for the many different sources for Pascal-P that existed. The compiler was redesigned to enhance portability, and issued as Pascal-P2. This code was later enhanced to become Pascal-P3, with an intermediate code backward compatible with Pascal-P2, and Pascal-P4, which was not backward compatible.

The Pascal-P4 compiler–interpreter can still be run and compiled on systems compatible with original Pascal. However, it only accepts a subset of the Pascal language.

Pascal-P5, created outside the Zürich group, accepts the full Pascal language and includes ISO 7185 compatibility.

UCSD Pascal branched off Pascal-P2, where Kenneth Bowles used it to create the interpretive UCSD p-System. It was one of three operating systems available at the launch of the original IBM Personal Computer.[11] UCSD Pascal used an intermediate code based on byte values, and thus was one of the earliest bytecode compilers. Apple Pascal was released in 1979 for the Apple 2 and Apple 3 computer systems. It was an implementation of, or largely based on, UCSD Pascal. Pascal-P1 through Pascal-P4 was not, but rather based on the CDC 6600 60-bit word length.

A compiler based on the Pascal-P5 compiler, which created native binary object files, was released for the IBM System/370 mainframe computer by the Australian Atomic Energy Commission; it was named the AAEC Pascal 8000 Compiler after the abbreviation of the name of the commission.[12]

Object Pascal and Turbo Pascal[edit]

Apple Computer created its own Lisa Pascal for the Lisa Workshop in 1982, and ported the compiler to the Apple Macintosh and MPW in 1985. In 1985 Larry Tesler, in consultation with Niklaus Wirth, defined Object Pascal and these extensions were incorporated in both the Lisa Pascal and Mac Pascal compilers.

In the 1980s, Anders Hejlsberg wrote the Blue Label Pascal compiler for the Nascom-2. A reimplementation of this compiler for the IBM PC was marketed under the names Compas Pascal and PolyPascal before it was acquired by Borland and renamed Turbo Pascal.

Turbo Pascal became hugely popular, thanks to an aggressive pricing strategy, having one of the first full-screen IDEs, and very fast turnaround time (just seconds to compile, link, and run). It was written and highly optimized entirely in assembly language, making it smaller and faster than much of the competition.

In 1986, Anders ported Turbo Pascal to the Macintosh and incorporated Apple’s Object Pascal extensions into Turbo Pascal. These extensions were then added back into the PC version of Turbo Pascal for version 5.5. At the same time Microsoft also implemented the Object Pascal compiler.[13][14] Turbo Pascal 5.5 had a large influence on the Pascal community, which began concentrating mainly on the IBM PC in the late 1980s. Many PC hobbyists in search of a structured replacement for BASIC used this product. It also began to be adopted by professional developers. Around the same time a number of concepts were imported from C to let Pascal programmers use the C-based application programming interface (API) of Microsoft Windows directly. These extensions included null-terminated strings, pointer arithmetic, function pointers, an address-of operator, and unsafe typecasts.

Turbo Pascal and other derivatives with unit or module structures are modular programming languages. However, it does not provide a nested module concept or qualified import and export of specific symbols.

Other variants[edit]

Super Pascal is a variant that added non-numeric labels, a return statement and expressions as names of types.

TMT Pascal was the first Borland-compatible compiler for 32-bit DOS protected mode, OS/2, and Win32 operating systems. The TMT Pascal language was the first one to allow function and operator overloading.

The universities of Wisconsin-Madison, Zürich, Karlsruhe, and Wuppertal developed the Pascal-SC[15][16] and Pascal-XSC[17][18][19] (Extensions for Scientific Computation) compilers, aimed at programming numerical computations. Development for Pascal-SC started in 1978 supporting ISO 7185 Pascal level 0, but level 2 support was added at a later stage.[20] Pascal-SC originally targeted the Z80 processor, but was later rewritten for DOS (x86) and 68000. Pascal-XSC has at various times been ported to Unix (Linux, SunOS, HP-UX, AIX) and Microsoft/IBM (DOS with EMX, OS/2, Windows) operating systems. It operates by generating intermediate C source code which is then compiled to a native executable. Some of the Pascal-SC language extensions have been adopted by GNU Pascal.

Pascal Sol was designed around 1983 by a French team to implement a Unix-like system named Sol. It was standard Pascal level-1 (with parameterized array bounds) but the definition allowed alternative keywords and predefined identifiers in French and the language included a few extensions to ease system programming (e.g. an equivalent to lseek).[21] The Sol team later on moved to the ChorusOS project to design a distributed operating system.[22]

IP Pascal was an implementation of the Pascal programming language using Micropolis DOS, but was moved rapidly to CP/M-80 running on the Z80. It was moved to the 80386 machine types in 1994, and exists today as Windows/XP and Linux implementations. In 2008, the system was brought up to a new level and the resulting language termed «Pascaline» (after Pascal’s calculator). It includes objects, namespace controls, dynamic arrays, and many other extensions, and generally features the same functionality and type protection as C#. It is the only such implementation that is also compatible with the original Pascal implementation, which is standardized as ISO 7185.

Language constructs[edit]

Pascal, in its original form, is a purely procedural language and includes the traditional array of ALGOL-like control structures with reserved words such as if, then, else, while, for, and case, ranging on a single statement or a beginend statements block. Pascal also has data structuring constructs not included in the original ALGOL 60 types, like records, variants, pointers, enumerations, and sets and procedure pointers. Such constructs were in part inherited or inspired from Simula 67, ALGOL 68, Niklaus Wirth’s own ALGOL W and suggestions by C. A. R. Hoare.

Pascal programs start with the program keyword with a list of external file descriptors as parameters[23] (not required in Turbo Pascal etc.); then follows the main block bracketed by the begin and end keywords. Semicolons separate statements, and the full stop (i.e., a period) ends the whole program (or unit). Letter case is ignored in Pascal source.

Here is an example of the source code in use for a very simple «Hello, World!» program:

program HelloWorld(output);
begin
    Write('Hello, World!')
    {No ";" is required after the last statement of a block -
        adding one adds a "null statement" to the program, which is ignored by the compiler.}
end.

Data types[edit]

A Type Declaration in Pascal is used to define a range of values which a variable of that type is capable of storing. It also defines a set of operations that are permissible to be performed on variables of that type. The predefined types are:

Data type Type of values which the variable is capable of storing
integer integer (whole) numbers
real floating-point numbers
boolean the values True or False
char a single character from an ordered character set
set equivalent to an array of boolean values
array a countable group of any of the preceding data types or records
record A collection of any of the preceding data types
string a sequence or «string» of characters is declared as a «packed array of char» with a starting index of 1. These can be assigned string constants and individual characters can be accessed as elements of the array.

The range of values allowed for the basic types (except boolean) is implementation defined. Functions are provided for some data conversions. For conversion of real to integer, the following functions are available: round (which rounds to integer using banker’s rounding) and trunc (rounds towards zero).

The programmer has the freedom to define other commonly used data types (e.g. byte, string, etc.) in terms of the predefined types using Pascal’s type declaration facility, for example

type
    byte        = 0..255;
    signed_byte = -128..127;
    string      = packed array[1..255] of char;

Often-used types like byte and string are already defined in many implementations.

Normally the system will use a word to store the data. For instance, the byte type may be stored in a machine integer — 32 bits perhaps — rather than an 8-bit value. Pascal does not contain language elements that allow the basic storage types to be defined more granularly. This capability was included in a number of Pascal extensions and follow-on languages, while others, like Modula-2, expanded the built-in set to cover most machine data types like 16-bit integers.

The packed keyword tells the compiler to use the most efficient method of storage for the structured data types: sets, arrays and records, rather than using one word for each element. Packing may slow access on machines that do not offer easy access to parts of a word.

Subrange types[edit]

Subranges of any ordinal data type (any simple type except real) can also be made:

var
    x : 1..10;
    y : 'a'..'z';

Set types[edit]

In contrast with other programming languages from its time, Pascal supports a set type:[24]

var
    Set1 : set of 1..10;
    Set2 : set of 'a'..'z';

A set is a fundamental concept for modern mathematics, and they may be used in many algorithms. Such a feature is useful and may be faster than an equivalent construct in a language that does not support sets. For example, for many Pascal compilers:

executes faster than:

if (i > 4) and (i < 11) then ...

Sets of non-contiguous values can be particularly useful, in terms of both performance and readability:

if i in [0..3, 7, 9, 12..15] then ...

For these examples, which involve sets over small domains, the improved performance is usually achieved by the compiler representing set variables as bit vectors. The set operators can then be implemented efficiently as bitwise machine code operations.

Union types[edit]

In Pascal, there are two ways to create unions. One is the standard way through a variant record. The second is a nonstandard means of declaring a variable as absolute, meaning it is placed at the same memory location as another variable or at an absolute address. While all Pascal compilers support variant records, only some support absolute variables.

For the purposes of this example, the following are all integer types: a byte is 8-bits, a word is 16-bits, and an integer is 32-bits.

The following example shows the non-standard absolute form:

VAR
    A: Integer;
    B: Array[1..4] of Byte absolute A;
    C: Integer absolute 0;

In the first example, each of the elements of the array B maps to one of the specific bytes of the variable A. In the second example, the variable C is assigned to the exact machine address 0.

In the following example, a record has variants, some of which share the same location as others:

TYPE
     Shape = (Circle, Square, Triangle);
     Dimensions = record
        case Figure: Shape of 
           Circle: (Diameter: real);
           Square: (Width: real);
           Triangle: (Side: real; Angle1, Angle2: 0..360)
        end;

Type declarations[edit]

Types can be defined from other types using type declarations:

type
    x = integer;
    y = x;
...

Further, complex types can be constructed from simple types:

type
    a = array[1..10] of integer;
    b = record
        x : integer;
        y : char  {extra semicolon not strictly required}
    end;
    c = file of a;

File type[edit]

As shown in the example above, Pascal files are sequences of components. Every file has a buffer variable which is denoted by f^. The procedures get (for reading) and put (for writing) move the buffer variable to the next element. Read is introduced such that read(f, x) is the same as x := f^; get(f);. Write is introduced such that write(f, x) is the same as f^ := x; put(f); The type text is predefined as file of char. While the buffer variable could be used for inspecting the next character to be used (check for a digit before reading an integer), this leads to serious problems with interactive programs in early implementations, but was solved later with the «lazy I/O» concept.

In Jensen & Wirth Pascal, strings are represented as packed arrays of chars; they therefore have fixed length and are usually space-padded.

Pointer types[edit]

Pascal supports the use of pointers:

type
    pNode = ^Node;
    Node  = record
        a : integer;
        b : char;
        c : pNode  
    end;
var
    NodePtr : pNode;
    IntPtr  : ^integer;

Here the variable NodePtr is a pointer to the data type Node, a record. Pointers can be used before they are declared. This is a forward declaration, an exception to the rule that things must be declared before they are used.

To create a new record and assign the value 10 and character A to the fields a and b in the record, and to initialise the pointer c to the null pointer («NIL» in Pascal), the statements would be:

New(NodePtr);
...
NodePtr^.a := 10;
NodePtr^.b := 'A';
NodePtr^.c := NIL;
...

This could also be done using the with statement, as follows:

New(NodePtr);
...
with NodePtr^ do
begin
    a := 10;
    b := 'A';
    c := NIL
end;
...

Inside of the scope of the with statement, a and b refer to the subfields of the record pointer NodePtr and not to the record Node or the pointer type pNode.

Linked lists, stacks and queues can be created by including a pointer type field (c) in the record.

Unlike many languages that feature pointers, Pascal only allows pointers to reference dynamically created variables that are anonymous, and does not allow them to reference standard static or local variables. Pointers also must have an associated type, and a pointer to one type is not compatible with a pointer to another type (e.g. a pointer to a char is not compatible with a pointer to an integer). This helps eliminate the type security issues inherent with other pointer implementations, particularly those used for PL/I or C. It also removes some risks caused by dangling pointers, but the ability to dynamically deallocate referenced space by using the dispose function (which has the same effect as the free library function found in C) means that the risk of dangling pointers has not been eliminated[25] as it has in languages such as Java and C#, which provide automatic garbage collection (but which do not eliminate the related problem of memory leaks).

Some of these restrictions can be lifted in newer dialects.

Control structures[edit]

Pascal is a structured programming language, meaning that the flow of control is structured into standard statements, usually without ‘goto’ commands.

while a <> b do  WriteLn('Waiting');

if a > b then WriteLn('Condition met')   {no semicolon allowed before else}
    else WriteLn('Condition not met');

for i := 1 to 10 do  {no semicolon here as it would detach the next statement}
    WriteLn('Iteration: ', i);

repeat
    a := a + 1
until a = 10;

case i of
    0 : Write('zero');
    1 : Write('one');
    2 : Write('two');
    3,4,5,6,7,8,9,10: Write('?')
end;

Procedures and functions[edit]

Pascal structures programs into procedures and functions. Generally, a procedure is used for its side effects, whereas a function is used for its return value.

program Printing;

var i : integer;

procedure PrintAnInteger(j : integer);
begin
    ...
end;

function triple(const x: integer): integer;
begin
	triple := x * 3
end;

begin { main program }
    ...
    PrintAnInteger(i);
    PrintAnInteger(triple(i))
end.

Procedures and functions can be nested to any depth, and the ‘program’ construct is the logical outermost block.

By default, parameters are passed by value. If ‘var’ precedes a parameter’s name, it is passed by reference.

Each procedure or function can have its own declarations of goto labels, constants, types, variables, and other procedures and functions, which must all be in that order.
This ordering requirement was originally intended to allow efficient single-pass compilation. However, in some dialects (such as Delphi) the strict ordering requirement of declaration sections has been relaxed.

Semicolons as statement separators[edit]

Pascal adopted many language syntax features from the ALGOL language, including the use of a semicolon as a statement separator. This is in contrast to other languages, such as PL/I and C, which use the semicolon as a statement terminator. No semicolon is needed before the end keyword of a record type declaration, a block, or a case statement; before the until keyword of a repeat statement; and before the else keyword of an if statement.

The presence of an extra semicolon was not permitted in early versions of Pascal. However, the addition of ALGOL-like empty statements in the 1973 Revised Report and later changes to the language in ISO 7185:1983 now allow for optional semicolons in most of these cases. A semicolon is still not permitted immediately before the else keyword in an if statement, because the else follows a single statement, not a statement sequence. In the case of nested ifs, a semicolon cannot be used to avoid the dangling else problem (where the inner if does not have an else, but the outer if does) by putatively terminating the nested if with a semicolon – this instead terminates both if clauses. Instead, an explicit beginend block must be used.[26]

Resources[edit]

Compilers and interpreters[edit]

Several Pascal compilers and interpreters are available for general use:

  • Delphi is Embarcadero’s (formerly Borland/CodeGear) flagship rapid application development (RAD) product. It uses the Object Pascal language (termed ‘Delphi’ by Borland), descended from Pascal, to create applications for Windows, macOS, iOS, and Android. The .NET support that existed from D8 through D2005, D2006, and D2007 has been terminated, and replaced by a new language (Prism, which is rebranded Oxygene, see below) that is not fully backward compatible. In recent years Unicode support and generics were added (D2009, D2010, Delphi XE).
  • Free Pascal is a cross-platform compiler written in Object Pascal (and is self-hosting). It is aimed at providing a convenient and powerful compiler, both able to compile legacy applications and to be the means to develop new ones. It is distributed under the GNU General Public License (GNU GPL), while packages and runtime library come under a modified GNU Lesser General Public License (GNU LGPL). In addition to compatibility modes for Turbo Pascal, Delphi, and Mac Pascal, it has its own procedural and object-oriented syntax modes with support for extended features such as operator overloading. It supports many platforms and operating systems. Current versions also feature an ISO mode.
  • Turbo51 is a free Pascal compiler for the Intel 8051 family of microcontrollers, with Turbo Pascal 7 syntax.
  • Oxygene (formerly named Chrome) is an Object Pascal compiler for the .NET and Mono platforms. It was created and is sold by RemObjects Software, and sold for a while by Embarcadero as the backend compiler of Prism.
  • Kylix was a descendant of Delphi, with support for the Linux operating system and an improved object library. It is no longer supported. Compiler and IDE are available now for non-commercial use.
  • GNU Pascal Compiler (GPC) is the Pascal compiler of the GNU Compiler Collection (GCC). The compiler is written in C, the runtime library mostly in Pascal. Distributed under the GNU General Public License, it runs on many platforms and operating systems. It supports the ANSI/ISO standard languages and has partial Turbo Pascal dialect support. One of the more painful omissions is the absence of a 100% Turbo Pascal-compatible (short)string type. Support for Borland Delphi and other language variants is quite limited. There is some support for Mac-pascal, however.
  • Virtual Pascal was created by Vitaly Miryanov in 1995 as a native OS/2 compiler compatible with Borland Pascal syntax. Then, it had been commercially developed by fPrint, adding Win32 support, and in 2000 it became freeware. Today it can compile for Win32, OS/2, and Linux, and is mostly compatible with Borland Pascal and Delphi. Development was canceled on April 4, 2005.
  • P4 compiler, the basis for many subsequent Pascal-implemented-in-Pascal compilers. It implements a subset of full Pascal.
  • P5 compiler is an ISO 7185 (full Pascal) adaption of P4.
  • Smart Mobile Studio is a Pascal to HTML5/Javascript compiler
  • Turbo Pascal was the dominant Pascal compiler for PCs during the 1980s and early 1990s, popular both because of its powerful extensions and extremely short compilation times. Turbo Pascal was compactly written and could compile, run, and debug all from memory without accessing disk. Slow floppy disk drives were common for programmers at the time, further magnifying Turbo Pascal’s speed advantage. Currently, older versions of Turbo Pascal (up to 5.5) are available for free download from Borland’s site.
  • IP Pascal implements the language «Pascaline» (named after Pascal’s calculator), which is a highly extended Pascal compatible with original Pascal according to ISO 7185. It features modules with namespace control, including parallel tasking modules with semaphores, objects, dynamic arrays of any dimensions that are allocated at runtime, overloads, overrides, and many other extensions. IP Pascal has a built-in portability library that is custom tailored to the Pascal language. For example, a standard text output application from 1970’s original Pascal can be recompiled to work in a window and even have graphical constructs added.
  • Pascal-XT was created by Siemens for their mainframe operating systems BS2000 and SINIX.
  • PocketStudio is a Pascal subset compiler and RAD tool for Palm OS and MC68xxx processors with some of its own extensions to assist interfacing with the Palm OS API. It resembles Delphi and Lazarus with a visual form designer, an object inspector and a source code editor.
  • MIDletPascal – A Pascal compiler and IDE that generates small and fast Java bytecode specifically designed to create software for mobiles.
  • Vector Pascal is a language for SIMD instruction sets such as the MMX and the AMD 3d Now, supporting all Intel and AMD processors, and Sony’s PlayStation 2 Emotion Engine.
  • Morfik Pascal allows the development of Web applications entirely written in Object Pascal (both server and browser side).
  • WDSibyl – Visual Development Environment and Pascal compiler for Win32 and OS/2.
  • PP Compiler, a compiler for Palm OS that runs directly on the handheld computer.
  • CDC 6000 Pascal compiler is the source code for the first (CDC 6000) Pascal compiler.
  • Pascal-S[27]
  • AmigaPascal is a free Pascal compiler for the Amiga computer.
  • VSI Pascal for OpenVMS (formerly HP Pascal for OpenVMS, Compaq Pascal, DEC Pascal, VAX Pascal and originally VAX-11 Pascal[28]) is a Pascal compiler that runs on OpenVMS systems.[29] It was also supported under Tru64.[30][31] VSI Pascal for OpenVMS is compatible with ISO/IEC 7185:1990 Pascal as well some of ISO/IEC 10206:1990 Extended Pascal, and also includes its own extensions.[29] The compiler frontend is implemented in BLISS.[32]
  • Stony Brook Pascal+ was a 16-bit (later 32-bit) optimizing compiler for DOS and OS/2, marketed as a direct replacement for Turbo Pascal, but producing code that executed at least twice as fast.

IDEs[edit]

  • Dev-Pascal is a Pascal IDE that was designed in Borland Delphi and which supports Free Pascal and GNU Pascal as backends.
  • Lazarus is a free Delphi-like visual cross-platform IDE for rapid application development (RAD). Based on Free Pascal, Lazarus is available for numerous platforms including Linux, FreeBSD, macOS and Microsoft Windows.
  • Fire (macOS) and Water (Windows) for the Oxygene and the Elements Compiler

Libraries[edit]

  • WOL Library for creating GUI applications with the Free Pascal Compiler.

Standards[edit]

ISO/IEC 7185:1990 Pascal[edit]

In 1983, the language was standardized in the international standard IEC/ISO 7185[33] and several local country-specific standards, including the American ANSI/IEEE770X3.97-1983, and ISO 7185:1983. These two standards differed only in that the ISO standard included a «level 1» extension for conformant arrays (an array where the boundaries of the array are not known until run time), where ANSI did not allow for this extension to the original (Wirth version) language. In 1989, ISO 7185 was revised (ISO 7185:1990) to correct various errors and ambiguities found in the original document.

The ISO 7185 was stated to be a clarification of Wirth’s 1974 language as detailed by the User Manual and Report [Jensen and Wirth], but was also notable for adding «Conformant Array Parameters» as a level 1 to the standard, level 0 being Pascal without conformant arrays. This addition was made at the request of C. A. R. Hoare, and with the approval of Niklaus Wirth. The precipitating cause was that Hoare wanted to create a Pascal version of the (NAG) Numerical Algorithms Library, which had originally been written in FORTRAN, and found that it was not possible to do so without an extension that would allow array parameters of varying size. Similar considerations motivated the inclusion in ISO 7185 of the facility to specify the parameter types of procedural and functional parameters.

Niklaus Wirth himself referred to the 1974 language as «the Standard», for example, to differentiate it from the machine specific features of the CDC 6000 compiler. This language was documented in The Pascal Report,[34] the second part of the «Pascal users manual and report».

On the large machines (mainframes and minicomputers) Pascal originated on, the standards were generally followed. On the IBM PC, they were not. On IBM PCs, the Borland standards Turbo Pascal and Delphi have the greatest number of users. Thus, it is typically important to understand whether a particular implementation corresponds to the original Pascal language, or a Borland dialect of it.

The IBM PC versions of the language began to differ with the advent of UCSD Pascal, an interpreted implementation that featured several extensions to the language, along with several omissions and changes. Many UCSD language features survive today, including in Borland’s dialect.

ISO/IEC 10206:1990 Extended Pascal[edit]

[icon]

This section needs expansion. You can help by adding to it. (February 2018)

In 1990, an extended Pascal standard was created as ISO/IEC 10206,[35] which is identical in technical content[36] to IEEE/ANSI 770X3.160-1989[37]
As of 2019, Support of Extended Pascal in FreePascal Compiler is planned.[38]

Variations[edit]

Niklaus Wirth’s Zürich version of Pascal was issued outside ETH in two basic forms: the CDC 6000 compiler source, and a porting kit called Pascal-P system. The Pascal-P compiler left out several features of the full language that were not required to bootstrap the compiler. For example, procedures and functions used as parameters, undiscriminated variant records, packing, dispose, interprocedural gotos and other features of the full compiler were omitted.

UCSD Pascal, under Professor Kenneth Bowles, was based on the Pascal-P2 kit, and consequently shared several of the Pascal-P language restrictions. UCSD Pascal was later adopted as Apple Pascal, and continued through several versions there. Although UCSD Pascal actually expanded the subset Pascal in the Pascal-P kit by adding back standard Pascal constructs, it was still not a complete standard installation of Pascal.

In the early 1990s, Alan Burns and Geoff Davies developed Pascal-FC, an extension to Pl/0 (from the Niklaus’ book Algorithms + Data Structures = Programs). Several constructs were added to use Pascal-FC as a teaching tool for Concurrent Programming (such as semaphores, monitors, channels, remote-invocation and resources). To be able to demonstrate concurrency, the compiler output (a kind of P-code) could then be executed on a virtual machine. This virtual machine not only simulated a normal – fair – environment, but could also simulate extreme conditions (unfair mode).

Borland-like Pascal compilers[edit]

Borland’s Turbo Pascal, written by Anders Hejlsberg, was written in assembly language independent of UCSD and the Zürich compilers. However, it adopted much of the same subset and extensions as the UCSD compiler. This is probably because the UCSD system was the most common Pascal system suitable for developing applications on the resource-limited microprocessor systems available at that time.

The shrink-wrapped Turbo Pascal version 3 and later incarnations, including Borland’s Object Pascal and Delphi and non-Borland near-compatibles became popular with programmers including shareware authors, and so the SWAG library of Pascal code features a large amount of code written with such versions as Delphi in mind.

Software products (compilers, and IDE/Rapid Application Development (RAD)) in this category:

  • Turbo Pascal – «TURBO.EXE» up to version 7, and Turbo Pascal for Windows («TPW») and Turbo Pascal for Macintosh.
  • Pure Pascal and HiSPeed Pascal 2 Pascal language Environment for the Atari ST range of computers.
  • Borland Pascal 7 – A professional version of Turbo Pascal line which targeted both DOS and Windows.
  • Object Pascal – an extension of the Pascal language that was developed at Apple Computer by a team led by Larry Tesler in consultation with Niklaus Wirth, the inventor of Pascal; its features were added to Borland’s Turbo Pascal for Macintosh and in 1989 for Turbo Pascal 5.5 for DOS.
  • Delphi – Object Pascal is essentially its underlying language.
  • Free Pascal compiler (FPC) – Free Pascal adopted the de facto standard dialect of Pascal programmers, Borland Pascal and, later, Delphi. Freepascal also supports both ISO standards.
  • PascalABC.NET – a new generation Pascal programming language including compiler and IDE.
  • Borland Kylix is a compiler and IDE formerly sold by Borland, but later discontinued. It is a Linux version of the Borland Delphi software development environment and C++Builder.
  • Lazarus – similar to Kylix in function, is a free cross-platform visual IDE for RAD using the Free Pascal compiler, which supports dialects of Object Pascal to varying degrees.
  • Virtual Pascal – VP2/1 is a fully Borland Pascal– and Borland Delphi–compatible 32-bit Pascal compiler for OS/2 and Windows 32 (with a Linux version «on the way»).[39]
  • Sybil is an open source Delphi-like IDE and compiler; implementations include:
    • WDSibyl[40] for Microsoft Windows and OS/2, a commercial Borland Pascal compatible environment released by a company named Speedsoft that was later developed into a Delphi-like rapid application development (RAD) environment named Sybil and then open sourced under the GPL when that company closed down;
    • Open Sybil, which is an ongoing project, an open source tool for OS/2 and eCS that was originally based on Speedsoft’s WDsybl Sibyl Portable Component Classes (SPCC) and Sibyl Visual Development Tool (SVDE) sources, but now its core is IBM System Object Model (SOM), WPS and OpenDoc.[41]

List of related standards[edit]

  • ISO 8651-2:1988 Information processing systems – Computer graphics – Graphical Kernel System (GKS) language bindings – Part 2: Pascal

Reception[edit]

Pascal generated a wide variety of responses in the computing community, both critical and complimentary.

Early criticism[edit]

While very popular in the 1980s and early 1990s, implementations of Pascal that closely followed Wirth’s initial definition of the language were widely criticized as being unsuitable for use outside teaching. Brian Kernighan, who popularized the C language, outlined his most notable criticisms of Pascal as early as 1981 in his article «Why Pascal is Not My Favorite Programming Language».[42] The most serious problem Kernighan described was that array sizes and string lengths were part of the type, so it was not possible to write a function that would accept variable-length arrays or even strings as parameters. This made it unfeasible to write, for example, a sorting library. Kernighan also criticized the unpredictable order of evaluation of boolean expressions, poor library support, and lack of static variables, and raised a number of smaller issues. Also, he stated that the language did not provide any simple constructs to «escape» (knowingly and forcibly ignore) restrictions and limitations. More general complaints from other sources[25][43] noted that the scope of declarations was not clearly defined in the original language definition, which sometimes had serious consequences when using forward declarations to define pointer types, or when record declarations led to mutual recursion, or when an identifier may or may not have been used in an enumeration list. Another difficulty was that, like ALGOL 60, the language did not allow procedures or functions passed as parameters to predefine the expected type of their parameters.

Despite initial criticisms, Pascal continued to evolve, and most of Kernighan’s points do not apply to versions of the language which were enhanced to be suitable for commercial product development, such as Borland’s Turbo Pascal. As Kernighan predicted in his article, most of the extensions to fix these issues were incompatible from compiler to compiler. Since the early 1990s, however, most of the varieties seem condensed into two categories: ISO and Borland-like. Extended Pascal addresses many of these early criticisms. It supports variable-length strings, variable initialization, separate compilation, short-circuit boolean operators, and default (otherwise) clauses for case statements.[44]

See also[edit]

  • Ada (programming language)
  • Concurrent Pascal
  • Comparison of Pascal and Delphi
  • Comparison of Pascal and C
  • Modula-2
  • Oberon (programming language)
  • Object Pascal
  • PascalCase
  • Standard ML

References[edit]

  1. ^ «About Microsoft’s «Delegates»«. Archived from the original on 2012-06-27. We looked very carefully at Delphi Object Pascal and built a working prototype of bound method references in order to understand their interaction with the Java programming language and its APIs … Our conclusion was that bound method references are unnecessary and detrimental to the language. This decision was made in consultation with Borland International, who had previous experience with bound method references in Delphi Object Pascal.
  2. ^ TechMetrix Research (1999). «History of Java» (PDF). Java Application Servers Report. Archived from the original (PDF) on 2010-12-29. The project went ahead under the name «green» and the language was based on an old model of UCSD Pascal, which makes it possible to generate interpretive code
  3. ^ «A Conversation with James Gosling – ACM Queue». Archived from the original on 16 July 2015. Retrieved 11 August 2015.
  4. ^ Wirth, Niklaus (2000). «The Development of Procedural Programming Languages Personal Contributions and Perspectives». Modular Programming Languages. Lecture Notes in Computer Science. Vol. 1897. pp. 1–10. doi:10.1007/10722581_1. ISBN 978-3-540-67958-5.
  5. ^ Hertzfeld, Andy. «Hungarian folklore.org Archived 2015-11-18 at the Wayback Machine: Macintosh Stories. Retrieved 2012-03-06.
  6. ^ https://www.computerhistory.org/atchm/adobe-photoshop-source-code/ Archived 2014-05-07 at the Wayback Machine, Adobe Photoshop Source Code
  7. ^ «RAD Studio Application Showcase». 2021-10-29.
  8. ^ tiobe.com Archived 2012-03-15 at the Wayback Machine, Programming Community Index for January 2011.
  9. ^ «Antique Software: Turbo Pascal v5.5».
  10. ^ Computers and Computing. A Personal Perspective. Archived 2017-05-10 at the Wayback Machine by Niklaus Wirth
  11. ^ cbi.umn.edu, «An Interview with John Brackett and Doug Ross»[permanent dead link], p15, Charles Babbage Institute, 2004
  12. ^ Australian Atomic Energy Commission Research Establishment, Lucas Heights, Nuclear Science and Technology Branch Report, Divisional Research (PDF). International Atomic Energy Agency (IEAE) (Report). 1977. p. 22.
  13. ^ Jon Udell, Crash of the Object-Oriented Pascals, BYTE, July, 1989.
  14. ^ M. I. Trofimov, The End of Pascal?, BYTE, March, 1990, p. 36.
  15. ^ Rall, L. B. (1987). «An introduction to the scientific computing language Pascal-SC». Computers. 14: 53–69. doi:10.1016/0898-1221(87)90181-7.
  16. ^ PI (1986-08-29). «Cadmus jetzt mit Kulisch-Arithmetik — Uni Karlsruhe gibt Pascal-Compiler nach München» [Cadmus now comes with Kulisch arithmetic — University Karlsruhe delivers Pascal compiler to Munich]. Computerwoche (in German). Munich – Karlsruhe, Germany: IDG Business Media GmbH. Archived from the original on 2016-05-30. Retrieved 2016-05-30.
  17. ^ «Pascal-XSC: Pascal for Extended Scientific Computing». Archived from the original on 2014-01-05.
  18. ^ «XSC Software». Archived from the original on 1 November 2015. Retrieved 11 August 2015.
  19. ^ «Universitaet Wuppertal: Wissenschaftliches Rechnen / Softwaretechnologie». Archived from the original on 6 November 2015. Retrieved 11 August 2015.
  20. ^ Bamberger, Lothar; Davenport, James H.; Fischer, Hans-Christoph; Kok, Jan; Schumacher, Günter; Ullrich, Christian; Wallis, Peter J. L.; Winter, Dik T.; Wolff von Gudenberg, Jürgen (1990). Wallis, Peter J. L. (ed.). Improving Floating-Point Programming (1st ed.). Bath, United Kingdom: John Wiley & Sons Ltd. ISBN 0-471-92437-7.
  21. ^ Michel Gien, «The SOL Operating System», in Usenix Summer ’83 Conference, Toronto, ON, (July 1983), pp. 75–78
  22. ^ cs.berkeley.edu Archived 2015-02-07 at the Wayback Machine
  23. ^ Pascal ISO 7185:1990 Archived 2012-06-17 at the Wayback Machine 6.10
  24. ^ Mandell, Steven L. (1987). Pascal Programming Today. West Publishing Company. ISBN 978-0-314-33935-5.
  25. ^ a b J. Welsh, W. J. Sneeringer, and C. A. R. Hoare, «Ambiguities and Insecurities in Pascal», Software: Practice and Experience 7, pp. 685–696 (1977)
  26. ^ Pascal, Nell Dale and Chip Weems, «Dangling Else», p. 160–161 Archived 2017-03-18 at the Wayback Machine
  27. ^ «Pascal-S: A Subset and Its Implementation», N. Wirth in Pascal – The Language and Its Implementation, by D.W. Barron, Wiley 1979.
  28. ^ «VAX-11 Pascal V1.0 User’s Guide» (PDF).
  29. ^ a b «VSI Pascal for OpenVMS Software Product Description» (PDF). VSI. 2017. Retrieved 2022-02-07.
  30. ^ «Interview with a Pascal Architect — Compaq Pascal». Archived from the original on 2021-10-19. Retrieved 2022-05-28.
  31. ^ «Compaq Pascal Version 5.8 for Tru64 UNIX Software Product Description». Archived from the original on 2020-07-25. Retrieved 2022-05-28.
  32. ^ «VSI’s John Reagan Interview on GEM vs. LLVM for X86/64». eCube Systems. 2019-03-12. Archived from the original on 2020-08-12. Retrieved 2022-02-07.
  33. ^ ISO/IEC 7185:1990 Pascal (PDF). Archived from the original (PDF) on 27 January 2016. Retrieved 16 September 2014.
  34. ^ Wirth, Niklaus (July 1973). The Programming Language Pascal (Revised Report). ETH Zürich. doi:10.3929/ethz-a-000814158.
  35. ^ Extended Pascal: ISO/IEC 10206:1990. Archived from the original on 2016-03-27. Retrieved 16 September 2014.
  36. ^ «Language standards: Pascal, Extended Pascal, Fortan». Archived from the original on 2014-07-14. Retrieved 16 September 2014.
  37. ^ 770X3.160-1989 – IEEE/ANSI Standard for the Programming Language Extended Pascal. 1990. doi:10.1109/IEEESTD.1990.101061. ISBN 978-0-7381-4247-0.
  38. ^ «Extended Pascal — Free Pascal wiki».
  39. ^ «Virtual Pascal for OS/2». Archived from the original on 30 August 2011. Retrieved 3 April 2016.
  40. ^ Wolfgang (October 15, 2020). «WDSibyl: Visual Development Environment». WDSibyl.org. Archived from the original on 2020-02-12. Retrieved 2020-04-20.
  41. ^ «netlabs.org – Project: Open Sibyl». Archived from the original on 4 March 2016. Retrieved 3 April 2016.
  42. ^ Brian W. Kernighan (1981). «Why Pascal is Not My Favorite Programming Language». Archived 2009-04-28 at the Wayback Machine
  43. ^ O. Lecarme, P. Desjardins, «More Comments on the Programming Language Pascal», Acta Informatica 4, pp. 231–243 (1975).
  44. ^ «Extended Pascal». Archived from the original on 2015-10-18.

Further reading[edit]

Wikibooks has a book on the topic of: Pascal

  • Niklaus Wirth: The Programming Language Pascal. 35–63, Acta Informatica, Volume 1, 1971.
  • C. A. R. Hoare: «Notes on data structuring». In O.-J. Dahl, E. W. Dijkstra and C. A. R. Hoare, editors, Structured Programming, pages 83–174. Academic Press, 1972.
  • C. A. R. Hoare, Niklaus Wirth: An Axiomatic Definition of the Programming Language Pascal. 335–355, Acta Informatica, Volume 2, 1973.
  • Kathleen Jensen and Niklaus Wirth: Pascal – User Manual and Report. Springer-Verlag, 1974, 1985, 1991, ISBN 0-387-97649-3 and ISBN 3-540-97649-3.
  • Niklaus Wirth: Algorithms + Data Structures = Programs. Prentice-Hall, 1975, ISBN 0-13-022418-9.
  • Niklaus Wirth: An assessment of the programming language Pascal. 23–30 ACM SIGPLAN Notices Volume 10, Issue 6, June 1975.
  • N. Wirth, and A. I. Wasserman, ed: Programming Language Design. IEEE Computer Society Press, 1980
  • D. W. Barron (Ed.): Pascal – The Language and its Implementation. John Wiley 1981, ISBN 0-471-27835-1
  • Peter Grogono: Programming in Pascal, Revised Edition, Addison-Wesley, 1980
  • Richard S. Forsyth: Pascal in Work and Play, Chapman and Hall, 1982
  • N. Wirth, M. Broy, ed, and E. Denert, ed: Pascal and its Successors in Software Pioneers: Contributions to Software Engineering. Springer-Verlag, 2002, ISBN 3-540-43081-4
  • N. Wirth: Recollections about the Development of Pascal. ACM SIGPLAN Notices, Volume 28, No 3, March 1993.

В этой статье я расскажу вам про основные принципы работы с языком Pascal. Информация, выложенная здесь, проста и понятна для начинающих программистов. После изучения этой статьи вы будете владеть первоначальными знаниями о Pascal, и ваш дальнейший процесс обучения будет проходить намного легче чем мог бы быть.

Паскаль - рабочая среда (интрефейс)

Pascal – один из самых известных языков программирования. Создан в 1968 – 1969 годах швейцарским ученым Никлаусом Виртом, был назван в честь французского математика и физика Блеза Паскаля, и используется для обучения программированию по сей день.

1. Подготовка к работе

Итак, вы решили научиться программировать и начать с языка наиболее для этого подходящего – Pascal. Для начала работы вы должны приобрести (скачать) компилятор.

А что же собственно, такое, этот «компилятор»? Это специальная программа, которая считывает код программы, а затем переводит его на язык машинных кодов. То есть, по сути, все языки программирования – это способ “общения” с компьютером, а компилятор помогает перевести нашу “речь” на понятную ему.

Для Pascal существует немало компиляторов, самые известные из них: Pascal ABC, Free Pascal, Pascal ABC.NET, Turbo Pascal. Все эти программы по-своему хороши, но лично для меня (автора), очень удобен Pascal ABC (или Pascal ABC.NET), поскольку он имеет весьма удобный интерфейс, подробную справку, и даже специально подготовленный для новичков сборник задач.

2. Начало работы

Что ж, перед нами открыто окно компилятора. Чистый, белый (или синий?) лист. Здесь и будут появляться на свет наши первые программы. Перед началом работы следует запомнить, что язык Pascal – это совокупность трёх составляющих: алфавита, синтаксиса (правил написания объектов языка) и семантики (правил использования этих объектов).
Алфавит Pascal состоит из:

  1. Прописных и строчных букв латиницы: A…Z, a…z;
  2. Цифр: 0…9;
  3. Специальных символов: + — * / = < >.,:; ‘ # ( ) { } [ ] и их комбинаций: «>=» «

Задача же синтаксиса и семантики состоит в том чтобы, правильно написать раздел программы и правильно составить ее структуру, в противном же случае наша программа будет работать неправильно (или же не работать вовсе!).
Вам наверное уже не терпится приступить к самой интересной части, так что сейчас мы с вами попробуем написать ваши первые программы.

Структура программы выглядит так:

Program «имя программы»; — заголовок программы;
(Примечание: в конце строки ставится точка с запятой, не во всех, но в большинстве)
Uses (название библиотеки); здесь подключаются библиотеки, которые дают дополнительные возможности при создании программ;
Label (имя метки); здесь, если необходимо, прописываются метки, позволяющие переходить в разные места программы (о них позже);
Const тут указываем переменные с постоянной величиной, например, p=3.14;
Var тут через запятую перечисляем все переменные, а затем, указываем тип данных (Пример: Var: K, L, M: integer; N, O: real; (если несколько типов));
Begin (здесь без точки с запятой)
Дальше следует основной блок программы;
end. – конец программы (обязательно после “end” точка, если только это конец программы, а не операторные скобки).

3. Создание первых программ

Теперь вы знакомы с основной структурой программы. Следует заметить, что из вышеперечисленных разделов обязательными есть только «Var», «Begin» и «end», остальные же могут применяться, если это требуется в ходе выполнения поставленной задачи.

Откройте окно вашого компилятора, и введите следующие строки:

program Programma1;
begin
end.

Нажмите кнопку «Выполнить»(«Run»). Ничего не происходит? Так и есть, ведь наша программа «пустая», мы не указали что она должна делать, потому ничего и не произошло. Обычно принцип работы программы написанной на языке Pascal состоит из трёх этапов: ввод данных – обработка данных – вывод даннных. Теперь познакомимся с оператором “write”. Он служит для как раз для вывода данных без перехода на новую строку. Попробуем его применить, тем самым сделав нашу программу чуть сложнее и интереснее:

program Programma1;
begin
write(‘ Pascal ‘);
end.

Собственно, так он и применяется. Между апострофами мы можем ввести любой текст, на любой раскладке, и после выполнения программы он появится в окне вывода (или в командной строке, смотря какой у вас компилятор). В данном случае, должно появиться слово «Pascal».

3.1. Операторы write, writeln, read, readln

Теперь поговорим о вводе данных. Мы уже познакомились с оператором write, но существуют также и другие. Writeln, к примеру, используется для вывода данных с переходом на новую строку. Зачем? Ну, например чтобы дать какой-нибудь переменной значение:

program Programma1;
var A:integer;
begin
writeln(‘A= ‘); read(A); {ввести значение и «прикрепить» его к переменной A}
write(A); {Вывести значение переменной A}
end.

Как вы видите, я вкратце описал каждое действие в фигурных скобках. Это называется комментарий. В дальнейшем я также буду использовать их для объяснений.
В этом примере для присваивания к переменной значения, введенного с клавиатуры используется оператор read. Мы видим, что при выполнении он прочитал строку в переменную А. А другой оператор, readln работает по другому. Используя его, мы можем сразу ввести нужную строку, и она прочитается в переменную:

program Programma1;
var A:integer;
begin
readln(A);
write(‘A= ‘, A); {строка будет выглядеть так: «А= ‘ введенное значение А ‘ „}
end.

Теперь, когда вы немного знаете о вводе данных, поговорим о том, какие могут быть данные, и как их обрабатывать.

3.2. Типы данных в Pascal

Пока вы читали эту статью, вы, наверное, уже пару раз натыкались на непонятное вам integer. Внимательно изучив основную структуру программы, вы наверняка поняли, что это тип данных. Но что это означает? Давайте поближе с этим познакомимся.

Исходные данные, которые вводятся с клавиатуры или читаются из файла, находяться в переменных, а они, в свою очередь, хранятся в оперативной памяти. Тип данных определяет, какие именно данные можно хранить, и сколько они займут оперативной памяти. Типы данных бывают целыми и вещественными.

•Целые типы данных (для целых чисел):
— byte
Объем памяти значений этого типа составляет 1 байт. Диапазон значений для данного типа: от 0 до 255.
— word
Значения этого типа занимают уже 2 байта памяти, а диапазон значений уже побольше: от 0 до 65535.
— integer (уже нам знакомый)
Значения также занимают 2 байта памяти, диапазон такого же размера, но включает уже и отрицательные числа: -32786…32787.
— LongInt
Объем памяти, занимаемый значением типа равняется 4 байтам. Диапазон значений же полностью соответствует названию типа данных: от -2147483648 до 2147483647
— ShortInt
Значение типа потребляет 1 байт памяти, диапазон относительно небольшой: -128…127.

•Вещественные типы данных (для чисел с дробной частью):
— Real
Занимаемая значением типа память – 6 байт. Число значащих цифр – 11-12. (значащие цифры – это точные цифры, т.е. не округленные). Диапазон значений типа: от 2.9*10-39 до 1.7*1038.
— Double
Размер значения типа – 8 байт. Число значащих цифр – 15-16. Диапазон: 5.0*10324…1.7*10308.
— Extended
Занимает 10 байт. Число значущих цифр – 19-20. Диапазон: 3.4*10-4932…1.1*104932.
Помимо этих, существуют также символьный тип данных (char) и даже логический тип данных (boolean), переменные которого могут принимать значения только true или false.

Итак, мы уже немало узнали о вводе и выводе данных. Теперь же перейдем к самой сложной части – обработке данных.

3.3. Обработка данных. Математические операции. Условия. Логические операции.

Мы уже научились вводить данные в программу, теперь попробуем научиться их обрабатывать. Первое, и самое главное, что нам пригодится в этом деле – оператор присваивания. Выражается он вот так: «:=», и используется для присваивания значения переменной. Примеры: A:=1.5; B:=2+A. Теперь, когда мы знакомы с оператором присваивания, можем рассмотреть математические операции Pascal:

  1. Сложение (+);
  2. Вычитание (-);
  3. Умножение (*);
  4. Деление (/);
  5. Целочисленное деление (div) – возвращает целую часть от деления (Пример: 10 div 3 = 3);
  6. Остаток от деления (mod) – возвращает только остаток от деления (Пример: 5 mod 2 = 1);

Помимо приведенных, существуют еще такие операции и функции для работы с числами:

abs(x) – возвращает модуль от x;
sin(x) – синус угла x (в радианах);
cos(x) – косинус угла x (в радианах);
int(x) – возвращает целую часть от x;
random(число) – случайное число от 0 до заданного;
sqr(x) – квадрат x;
sqrt(x) – квадратный корень x;
inc(x) – увеличить x на 1;
dec(x) – уменьшить x на 1.

Условия

Условия в Pascal играют очень большую роль, особенно если алгоритм выполнения программы разветвленный. Формулируется условие следующим образом:

if (условие 1) then (действие 1 — основное) else (действие 2 — альтернативное)
(if – если, then – то, else – иначе)

При построении условия пользуются логическими операциями and, not, or, xor:

• and – операнд, объединяющий несколько условий в одно. Действие будет выполняться, только если все перечисленные условия будут верны.
program Usloviya;
var a:integer;
begin
readln(a);
if (2*2=4) and (3+2=5) then a:=a+1 else a:=a-1;
write(a);
end.

На этом примере мы видим, что все условия, перечисленные через and верны, потому выполнялось только первое действие, идущее через than. Если хотя бы одно условие не было верно, тогда выполнилось бы второе действие.

• not – логическое действие с условием из одной части. Если условие неверно, то будет выполняться основное действие (первое), если верно – то альтернативное (второе).

program Usloviya;
var b:integer;
begin
readln (b);
if not 5=4 then b:=b+1 else b:=b-1;
write (b);
end.

Условие 5=4 неверно, следовательно, будет выполняться первое действие.

• or (или) – логический оператор для условия из нескольких частей. Основное действие будет выполняться, если верно хотя бы одно условие.
program Usloviya;
var d:integer;
begin
readln (d);
if (5=4+1) or (5=4) then d:=d+1 else d:=d-1;
write(d);
end.

Одно из условий верно, поэтому программа перейдет к основному действию. Тоже повторится, если верными будут все условия. Если же ни одно условие не будет верно, то выполниться альтернативное действие.

• xor – с этим оператором основное действие выполняется, если верно только одно условие. Если верны несколько условий, или же ни одного, то выполнится альтернативное действие.

program Usloviya;
var n:integer;
begin
readln(n);
if (6=4) xor (3=5-2) then n:=n+1 else n:=n-1;
write (n);
end.

(Примечание: Не стоит забывать что приоритет логических операций выше чем математических, поэтому, если одни совмещаются с другими, то желательно выделять математические операции скобками, чтобы не возникало ошибок при выполнении программы.)

Теперь мы с вами знакомы и с основами обработки данных. Осталось поговорить о некоторых дополнительные процедурах, и функциях для управления программой, которые вам не раз пригодяться при дальнейшем обучении на Pascal.

3.4. Процедуры и функции для управления программой

Поговорим о упомянутой раньше метке. Эта процедура очень легка в использовании и позволяет при надобности перейти в любую часть программы, «перескочив» одну из следующих частей, или же наоборот, вернуться в предыдущую часть. Прописывается метка очень просто: сперва описываем метку в разделе меток (см. п. 3. Начало работы. Структура программы), а затем указывается место перехода, а нужный оператор помечается меткой.

program Metka;
label 1,2;
var A, B:integer;
begin
readln (A);
2: if A=5 then goto 1; {2: — действие после перехода на соответствующую метку,}
A:=A+1; {goto — переход на метку}
goto 2;
1: write (A);
end.

На данном примере, программа увеличивает на 1 введенное число, пока оно не станет равным пяти. Тут мы и можем проследить действие метки.

•Delay(время) – остановка программы с задержкой, время в кавычках указывается в миллисекундах.
•Readkey – остановка программы до нажатия клавиши, значение функции – код нажатой клавиши.
•Exit – досрочное завершение процедуры.
Следует заметить, что для работы delay, readkey, и exit необходимо подключить модуль crt (uses crt).

Также посмотрите видео: Паскаль с нуля — первая программа.

4. Заключение

Прочитав эту статью, вы получили базовые знания по языку программирования Pascal. В доступных и понятных формулировках здесь были выложены основные понятия, принципы работы с данным языком. Теперь дело переходит к вам в руки. Если вы правильно воспользуетесь этой информацией, и продолжите обучаться языку Pascal, то вскоре сможете владеть им в совершенстве.

Поняв принцип работы с Pascal, вы сможете изучить и другие языки программирования, и в будущем писать уже более «серьезные» программы, чем те с которыми вы познакомились при изучении этой статьи. Продолжайте учиться! Удачи!

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.

На чтение 6 мин. Опубликовано 09.12.2020

Паскаль – один из наиболее популярных языков программирования. Его создателем стал Николаус Вирт в 1968-1969 годах. Швейцарский ученый назвал его в честь талантливого физика и математика Блеза Паскаля. При создании языка преследовал несколько целей. Но самая главная – структурное программирование, которому он планировал обучить студентов. Pascal успешно используется и по сегодняшний день.

Известные модификации языка Паскаль

Сейчас Pascal по праву считается одним из лучших языков для новичков в программировании. Одна из его модификаций (ObjectPascal) эффективно применяется в промышленном программировании. Но существуют и другие не менее известные модификации:

TurboPascal

Модифицированный язык программирования, созданный компанией Borland. Это интегрированная среда создания ПО для платформ Windows 3.x и DOS и язык программирования для данной среды.

FreePascal

Встречается два названия: сокращенное FPC — и полное — FreePascalCompiler. Это компилятор языка программирования ObjectPascal, находящийся в свободном доступе.

Lazarus

Полное название — FreePascalCompiler, сокращенное – FPC. Представляет собой открытую среду создания ПО на языке ObjectPascal для компилятора FreePascal. Интегрированная среда разработки позволяет кроссплатформунное создание программного обеспечения в Delphi-подобном окружении.

PascalABC.NET

Модифицированный язык программирования Pascal. Он объединяет классический Паскаль, основные возможности Delphi и многие собственные расширения. В его основе лежит платформа Microsoft.NET. Язык программирования нового поколения включает: классы, интерфейсы, перезагрузку операций, обобщенные классы и программы, обработку исключений, лямбда-выражения, сборку мусора, средства параллельного программирования.

Отличительные черты PascalABC.NET – строгая типизация и наличие средств процедурного (структурного) программирование. Николаус Вирт утверждал, что язык должен учить дисциплинарному программированию, поэтому, одновременно со строгой типизацией, в Pascal минимизированы синтаксические неоднозначности. При этом сам синтаксис ученый сделал интуитивно понятным. Это делает язык Паскаль доступным для начинающих.

Основы программирования Паскаль для начинающих. Написание первой программы

При первом знакомстве языка все его недостатки оборачиваются в преимущества. К тому же, по сравнению с языком программирования Фортраном, который использовался в академический среде 1970-х годов и считался основным, Паскаль сделал существенный прорыв.

К 1980-м годам Pascal был заложен как основа во многие ученые программы. При этом на его основе выпускались специализированные обучающие языки программирования. Одним из ярких примеров – «учебный алгоритмический язык» от Андрея Ершова. Он использовался для обучения школьников вычислительной техники и информатики.

Основы программирования Паскаль для начинающих. Написание первой программы

Начинать стоит с изучения основных принципов работы с языком программирования. Постараемся изложить информацию максимально доступно для новичков, что откроет им путь в дальнейший процесс обучения программирования.

Подготовка к работе

Выбрав язык Pascal для обучения вы не ошиблись, так как он самый простой и интуитивно понятный. Чтобы начать с ним работать нужно скачать комплятор (программу, которая будет считывать код и переводить его на язык машинных кодов). Другими словами, все языки программирования представляют собой способ взаимодействия или общения с компьютером. Благодаря комплиляторуваша речь будет понятна машине.

Самые известные компиляторы, которые вы можете скачать:

  • Pascal ABC;
  • TurboPascal;
  • Pascal ABC.NET;
  • FreePascal.

Внимание! Все из перечисленных программ отлично подходят для обучения. Но многие новички отмечают, что самые удобные для них — Pascal ABC и Pascal ABC.NET. Их интерфейс отличается простотой и наличием сборника задач для начинающих.

Алфавит и словарь языка

Все языки программирования, в том числе и Паскаль используют основу – алфавит (символы), который применяется для записи программы. Алфавит Паскаль включает:

  • прописные латинские буквы — А, В, С, D …, X, Y, Z
  • строчные латинские буквы — а, Ь, с, d… х, у, z;
  • арабские цифры – (0, 1,2,3 …,7, 8, 9);
  • набор специальных символов: скобки (квадратные, круглые, фигурные), знаки: препинания, подчеркивания, знаки арифметических операций и так далее.

В роле состаных символов (неделимых элементов) рассматриваются такие последовательности символов:

  • := (знак операции присваивания);
  • >= и <= (знаки < и >);
  • (* и *) (начало и конец комментария).

Также, в языке Паскаль существует определенное количество разных цепочек символов, которые представляют собой единые смысловые элементы с фиксированным значением. Эти цепочки символов принято называть служебными словами.

Основы программирования Паскаль для начинающих. Написание первой программы

Для обозначения переменных, констант, программ и прочих объектов применяются имена – любые отличные от служебных слов последовательности цифр, букв и символа подчеркивания, начинающиеся с символа подчеркивания или буквы. Строчные и прописные буквы в именах не различаются.

При этом длина имени может быть достаточно внушительной. Для наглядности мы приведем имена, длина которых не больше 8 символов.

Типы данных Паскаль

Pascal позволяет использовать разные типы данных. Перечислим наиболее простые из них:

Основы программирования Паскаль для начинающих. Написание первой программы

Важно! Integer – основной, но далеко не единственный тип для работы с целочисленными данными.

Целая часть в вещественном числе отличается от дробной точкой. Но перед и после точки должно быть хотя бы по одной цифре. Не допускаются пробелы внутри числа.

В вещественном числе целая часть от дробной отделяется точкой, при этом перед точкой и после неё должно быть, по крайней мере, по одной цифре. Пробелы внутри числа недопустимы.

Структура программы на языке Pascal

В програмном обеспечении, созданном на языке Pascal выделяют следующее:

  1. Заголовок (не обязательно).
  2. Блок описания данных, которые были использованы.
  3. Программный блок (описываются действия по преобразованию данных).

Заголовок строится из служебного слова program и названии программы. В конце ставится точка с запятой. Описание данных включает раздел описания const(констант), раздела описания var (переменных) и прочих разделов.

Описание переменных состоит из перечисления их имен и типов. Если они относятся к одному типу, то разделяются запятой. Тип указывается после двоеточия. Затем идет описание типа, которое заканчивается точкой с запятой.

Пример блока описания переменных:

Основы программирования Паскаль для начинающих. Написание первой программы

У программы может отсутствовать заголовок и раздел описания данных. Но программный блок является обязательным. Он состоит из команд, которые описывают алгоритм решения задачи. Его начало – слово begin, а в конце – словно end с точкой.

Пример программы:

Основы программирования Паскаль для начинающих. Написание первой программы

С помощью специальных языковых конструкций (операторов), в программах записываются действия, которые были выполнены над данными во время решения задачи. В качестве разделителя между операторами используется точка с запятой.

Обратите внимание, что перед оператором end точка с запятой не ставится.

Оператор присваивания

Главное преобразование данных компьютером – присваивание переменного нового значения. Это означает изменение содержимого области памяти, за что отвечает оператор присваивания (аналог команде присваивания алгоритмического языка).

Пример оператора:

Основы программирования Паскаль для начинающих. Написание первой программы

Операция присваивания может использоваться для всех типов данных, которые вы видели в нашей таблице. Выражение в языке Pascal конструируется по вышеприведенным правилам алгоритмического языка.

Пример процесса выполнения операторов присваивания:

  • а:=10;
  • b:=5;
  • s:=a+b;

При выполнении оператора а:=10 в ячейку оперативной памяти ПК с именем а заносится значение 10. При выполнении оператора b:=5 в ячейку оперативной памяти b заносится значение 5. При выполнении оператора s:=a+b; значение одноименных ячеек переносятся в процессор, где они суммируются. Результат заносится в ячейку оперативной памяти и ему присваивается имя s.

Пример выполнения оператора присваивания в виде таблицы:

Основы программирования Паскаль для начинающих. Написание первой программы

Видео уроки PascalABC.NET

Изучение интерфейса редактора.



Работа с числами и создание таймера.



Как комплировать исходный код. Часть 1.

Компиляторы. Часть 2.



Решение школьной задачи с помощью Pascal.



Создание виртуального синтезатора.



Создание простого калькулятора.



Оказался ли полезным наш путеводитель по языку программирования Pascal? Поделитесь своимвпечатлением от знакомства с этим языком в комментариях.

Паскаль – Обзор

Паскаль – это язык высокого уровня общего назначения, который был первоначально разработан Никлаусом Виртом в начале 1970-х годов. Он был разработан для преподавания программирования как систематической дисциплины и для разработки надежных и эффективных программ.

Паскаль является языком на основе Алгола и включает в себя множество конструкций Алгола. Алгол 60 является подмножеством Паскаля. Паскаль предлагает несколько типов данных и структур программирования. Программы Pascal легко понять и поддерживать.

Паскаль приобрел популярность в сфере преподавания и обучения по разным причинам:

  • Легко обучаема.
  • Структурированный язык.
  • Он производит прозрачные, эффективные и надежные программы.
  • Он может быть скомпилирован на различных компьютерных платформах.

Особенности языка Паскаль

Паскаль имеет следующие особенности –

  • Паскаль является строго типизированным языком.
  • Он предлагает обширную проверку ошибок.
  • Он предлагает несколько типов данных, таких как массивы, записи, файлы и наборы.
  • Он предлагает множество структур программирования.
  • Он поддерживает структурированное программирование через функции и процедуры.
  • Он поддерживает объектно-ориентированное программирование.

Факты о Паскале

  • Язык Паскаль был назван в честь Блеза Паскаля, французского математика и пионера в разработке компьютеров.

  • Никлаус Вирт завершил разработку оригинального языка программирования Pascal в 1970 году.

  • Паскаль основан на блочно-структурированном стиле языка программирования Algol.

  • Паскаль был разработан как язык, подходящий для преподавания программирования как систематической дисциплины, реализация которой может быть как надежной, так и эффективной.

  • Стандарт Паскаля ISO 7185 был впервые опубликован в 1983 году.

  • Паскаль был основным языком высокого уровня, который использовался для разработки в Apple Lisa и в первые годы существования Mac.

  • В 1986 году Apple Computer выпустила первую реализацию Object Pascal, а в 1993 году Комитет по стандартам Pascal опубликовал объектно-ориентированное расширение для Pascal.

Язык Паскаль был назван в честь Блеза Паскаля, французского математика и пионера в разработке компьютеров.

Никлаус Вирт завершил разработку оригинального языка программирования Pascal в 1970 году.

Паскаль основан на блочно-структурированном стиле языка программирования Algol.

Паскаль был разработан как язык, подходящий для преподавания программирования как систематической дисциплины, реализация которой может быть как надежной, так и эффективной.

Стандарт Паскаля ISO 7185 был впервые опубликован в 1983 году.

Паскаль был основным языком высокого уровня, который использовался для разработки в Apple Lisa и в первые годы существования Mac.

В 1986 году Apple Computer выпустила первую реализацию Object Pascal, а в 1993 году Комитет по стандартам Pascal опубликовал объектно-ориентированное расширение для Pascal.

Зачем использовать Паскаль?

Паскаль позволяет программистам определять сложные структурированные типы данных и строить динамические и рекурсивные структуры данных, такие как списки, деревья и графики. Паскаль предлагает такие функции, как записи, перечисления, поддиапазоны, динамически распределенные переменные со связанными указателями и наборами.

Паскаль позволяет определения вложенных процедур на любой уровень глубины. Это действительно обеспечивает отличную среду программирования для обучения программированию как систематической дисциплине, основанной на фундаментальных понятиях.

Среди самых удивительных реализаций Паскаля –

  • Skype
  • Total Commander
  • TeX
  • Macromedia Captivate
  • Яблочная Лиза
  • Различные компьютерные игры
  • Встроенные системы

Паскаль – настройка среды

Существует несколько компиляторов и интерпретаторов Pascal, доступных для общего пользования. Среди них –

  • Turbo Pascal – предоставляет IDE и компилятор для запуска программ Pascal на CP / M, CP / M-86, DOS, Windows и Macintosh.

  • Delphi – предоставляет компиляторы для запуска Object Pascal и генерирует собственный код для 32- и 64-битных операционных систем Windows, а также 32-битных Mac OS X и iOS. Embarcadero планирует создать поддержку операционной системы Linux и Android.

  • Free Pascal – это бесплатный компилятор для запуска программ на Pascal и Object Pascal. Компилятор Free Pascal – это 32- и 64-битный компилятор Pascal, совместимый с Turbo Pascal и Delphi, для Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS и некоторых других платформ.

  • Turbo51 – это бесплатный компилятор Pascal для семейства микроконтроллеров 8051 с синтаксисом Turbo Pascal 7.

  • Oxygene – это компилятор Object Pascal для платформ .NET и Mono.

  • GNU Pascal (GPC) – это компилятор Pascal, состоящий из внешнего интерфейса к коллекции компиляторов GNU.

Turbo Pascal – предоставляет IDE и компилятор для запуска программ Pascal на CP / M, CP / M-86, DOS, Windows и Macintosh.

Delphi – предоставляет компиляторы для запуска Object Pascal и генерирует собственный код для 32- и 64-битных операционных систем Windows, а также 32-битных Mac OS X и iOS. Embarcadero планирует создать поддержку операционной системы Linux и Android.

Free Pascal – это бесплатный компилятор для запуска программ на Pascal и Object Pascal. Компилятор Free Pascal – это 32- и 64-битный компилятор Pascal, совместимый с Turbo Pascal и Delphi, для Linux, Windows, OS / 2, FreeBSD, Mac OS X, DOS и некоторых других платформ.

Turbo51 – это бесплатный компилятор Pascal для семейства микроконтроллеров 8051 с синтаксисом Turbo Pascal 7.

Oxygene – это компилятор Object Pascal для платформ .NET и Mono.

GNU Pascal (GPC) – это компилятор Pascal, состоящий из внешнего интерфейса к коллекции компиляторов GNU.

В этих уроках мы будем использовать Free Pascal. Вы можете скачать Free Pascal для вашей операционной системы по ссылке: Скачать Free Pascal

Установка Free Pascal на Linux

Дистрибутив Free Pascal для Linux представлен в трех формах:

  • версия tar.gz , также доступная в виде отдельных файлов.

  • версия .rpm (Red Hat Package Manager).

  • версия .deb (Debian).

версия tar.gz , также доступная в виде отдельных файлов.

версия .rpm (Red Hat Package Manager).

версия .deb (Debian).

Установочный код для версии .rpm ::

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

Где XYZ – номер версии файла .rpm, а ARCH – одна из поддерживаемых архитектур (i386, x86_64 и т. Д.).

Код установки для версии Debian (например, Ubuntu) –

dpkg -i fpc-XXX.deb

Где XXX – номер версии файла .deb.

Подробности читайте в бесплатном руководстве по установке Pascal.

Установка Free Pascal на Mac

Если вы используете Mac OS X, самый простой способ использовать Free Pascal – это загрузить среду разработки Xcode с веб-сайта Apple и следовать простым инструкциям по установке. После настройки Xcode вы сможете использовать компилятор Free Pascal.

Установка Free Pascal в Windows

Для Windows вы загрузите установщик Windows, setup.exe. Это обычная программа установки. Вам нужно предпринять следующие шаги для установки –

  • Выберите каталог.

  • Выберите части пакета, которые вы хотите установить.

  • При желании можно связать расширения .pp или .pas с IDE Free Pascal.

Выберите каталог.

Выберите части пакета, которые вы хотите установить.

При желании можно связать расширения .pp или .pas с IDE Free Pascal.

Подробности читайте в бесплатном руководстве по установке Pascal.

Текстовый редактор

Это будет использоваться для ввода вашей программы. Примерами немногих редакторов являются Блокнот Windows, команда редактирования ОС, Brief, Epsilon, EMACS и vim или vi.

Имя и версия текстового редактора могут различаться в разных операционных системах. Например, Блокнот будет использоваться в Windows, а vim или vi могут использоваться в Windows, а также в Linux или UNIX.

Файлы, которые вы создаете в редакторе, называются исходными файлами и содержат исходный код программы. Исходные файлы для программ на Pascal обычно называются с расширением .pas .

Перед началом программирования убедитесь, что у вас есть один текстовый редактор, и у вас достаточно опыта, чтобы написать компьютерную программу, сохранить ее в файле, скомпилировать и, наконец, выполнить.

Паскаль – Структуры программы

Прежде чем мы изучим основные строительные блоки языка программирования Pascal, давайте рассмотрим минимальную структуру программы Pascal, чтобы мы могли взять ее в качестве справочного материала в следующих главах.

Структура программы Pascal

Программа 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 }

Pascal Hello World Пример

Ниже приведен простой паскаль-код, который напечатал бы слова “Hello, World!”

Live Demo

program HelloWorld;
uses crt;

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

Это даст следующий результат –

Hello, World!

Давайте посмотрим различные части вышеуказанной программы –

  • Первая строка программы программы HelloWorld; указывает на название программы.

  • Вторая строка программы использует crt; это команда препроцессора, которая говорит компилятору включить модуль crt перед тем, как перейти к фактической компиляции.

  • Следующие строки, заключенные в операторы начала и конца, являются основным программным блоком. Каждый блок в Паскале заключен в оператор начала и оператора конца . Однако за оператором завершения, указывающим конец основной программы, следует точка (.) Вместо точки с запятой (;).

  • Оператор начала основного блока программы – это место, где начинается выполнение программы.

  • Строки внутри (* … *) будут игнорироваться компилятором, и он был добавлен для добавления комментария в программу.

  • Заявление writeln («Привет, мир!»); использует функцию writeln, доступную в Pascal, которая вызывает сообщение «Hello, World!» быть отображенным на экране.

  • Оператор readkey; позволяет отображать паузу, пока пользователь не нажмет клавишу. Это часть КТО. Блок похож на библиотеку в Паскале.

  • Последнее утверждение заканчивается. заканчивает вашу программу

Первая строка программы программы HelloWorld; указывает на название программы.

Вторая строка программы использует crt; это команда препроцессора, которая говорит компилятору включить модуль crt перед тем, как перейти к фактической компиляции.

Следующие строки, заключенные в операторы начала и конца, являются основным программным блоком. Каждый блок в Паскале заключен в оператор начала и оператора конца . Однако за оператором завершения, указывающим конец основной программы, следует точка (.) Вместо точки с запятой (;).

Оператор начала основного блока программы – это место, где начинается выполнение программы.

Строки внутри (* … *) будут игнорироваться компилятором, и он был добавлен для добавления комментария в программу.

Заявление writeln («Привет, мир!»); использует функцию writeln, доступную в Pascal, которая вызывает сообщение «Hello, World!» быть отображенным на экране.

Оператор readkey; позволяет отображать паузу, пока пользователь не нажмет клавишу. Это часть КТО. Блок похож на библиотеку в Паскале.

Последнее утверждение заканчивается. заканчивает вашу программу

Компиляция и выполнение программы Pascal

  • Откройте текстовый редактор и добавьте вышеупомянутый код.

  • Сохраните файл как hello.pas

  • Откройте командную строку и перейдите в каталог, где вы сохранили файл.

  • Введите в командной строке fpc hello.pas и нажмите Enter, чтобы скомпилировать код.

  • Если в вашем коде нет ошибок, командная строка переместит вас на следующую строку и сгенерирует приветственный исполняемый файл и объектный файл hello.o .

  • Теперь введите hello в командной строке, чтобы выполнить вашу программу.

  • Вы сможете увидеть «Hello World», напечатанный на экране, и программа будет ждать, пока вы не нажмете любую клавишу.

Откройте текстовый редактор и добавьте вышеупомянутый код.

Сохраните файл как hello.pas

Откройте командную строку и перейдите в каталог, где вы сохранили файл.

Введите в командной строке fpc hello.pas и нажмите Enter, чтобы скомпилировать код.

Если в вашем коде нет ошибок, командная строка переместит вас на следующую строку и сгенерирует приветственный исполняемый файл и объектный файл hello.o .

Теперь введите hello в командной строке, чтобы выполнить вашу программу.

Вы сможете увидеть «Hello World», напечатанный на экране, и программа будет ждать, пока вы не нажмете любую клавишу.

$ 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!

Убедитесь, что в вашем пути есть бесплатный компилятор паскаля fpc и вы запускаете его в каталоге, содержащем исходный файл hello.pas.

Паскаль – основной синтаксис

Вы увидели базовую структуру программы на Паскале, поэтому вам будет легко понять другие основные строительные блоки языка программирования на Паскале.

переменные

Определение переменной помещается в блок, начинающийся с ключевого слова var , за которым следуют следующие определения переменных:

var
A_Variable, B_Variable ... : Variable_Type;

Переменные Паскаля объявляются вне тела кода функции, что означает, что они не объявляются в парах начала и конца , но они объявляются после определения процедуры / функции и перед ключевым словом begin . Для глобальных переменных они определяются после заголовка программы.

Функции / Процедуры

В Паскале процедура – это набор инструкций, которые должны быть выполнены без возвращаемого значения, а функция – это процедура с возвращаемым значением. Определение функции / процедур будет следующим:

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

Комментарии

Многострочные комментарии заключены в фигурные скобки и звездочки как {* … *}. Паскаль допускает однострочный комментарий, заключенный в фигурные скобки {…}.

{* This is a multi-line comments
   and it will span multiple lines. *}

{ This is a single line comment in pascal }

Чувствительность к регистру

Pascal – это не чувствительный к регистру язык, что означает, что вы можете написать свои переменные, функции и процедуры в любом случае. Как и переменные A_Variable, a_variable и A_VARIABLE имеют одинаковое значение в Паскале.

Заявления Паскаля

Программы на Паскале состоят из заявлений. Каждое утверждение определяет определенную работу программы. Этими заданиями могут быть декларация, назначение, чтение данных, запись данных, принятие логических решений, передача управления потоком программ и т. Д.

Например –

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

Зарезервированные слова на Паскале

Утверждения в Паскале составлены с некоторыми определенными словами Паскаля, которые называются зарезервированными словами. Например, слова, программа, ввод, вывод, var, real, begin, readline, writeline и end являются зарезервированными словами.

Ниже приведен список зарезервированных слов, доступных в Паскале.

а также массив начать дело Const
ДИВ делать Downto еще конец
файл за функция идти к если
в этикетка модификация ноль не
из или же уплотненный процедура программа
запись повторение задавать затем в
тип до тех пор вар в то время как с

Набор символов и идентификаторы в Паскале

Набор символов Паскаль состоит из –

  • Все заглавные буквы (А-Я)

  • Все строчные буквы (аз)

  • Все цифры (0-9)

  • Специальные символы – + * /: =,. ;. () [] = {} `пробел

Все заглавные буквы (А-Я)

Все строчные буквы (аз)

Все цифры (0-9)

Специальные символы – + * /: =,. ;. () [] = {} `пробел

Сущности в программе на Паскале, такие как переменные и константы, типы, функции, процедуры и записи и т. Д., Имеют имя или идентификатор. Идентификатор – это последовательность букв и цифр, начинающаяся с буквы. Специальные символы и пробелы не должны использоваться в идентификаторе.

Паскаль – Типы данных

Типы данных объекта указывают значение, ограничения, возможные значения, операции, функции и режим хранения, связанные с ним.

Целочисленные, действительные, логические и символьные типы называются стандартными типами данных. Типы данных могут быть классифицированы как скалярные, указательные и структурированные типы данных. Примерами скалярных типов данных являются целочисленные, вещественные, логические, символьные, поддиапазонные и перечисляемые. Структурированные типы данных состоят из скалярных типов; например, массивы, записи, файлы и наборы. Мы обсудим типы данных указателя позже.

Паскаль Типы данных

Типы данных Pascal можно обобщить, как показано ниже на следующей диаграмме:

Паскаль Типы данных

Объявления типов

Объявление типа используется для объявления типа данных идентификатора. Синтаксис объявления типа –

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

Например, следующее объявление определяет переменные days и age как целочисленный тип, yes и true как логический тип, name и city как строковый тип, сборы и расходы как реальный тип.

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

Целочисленные типы

В следующей таблице приведены подробные сведения о стандартных целочисленных типах с их размерами хранения и диапазонами значений, используемыми в Object Pascal.

Тип минимальный максимальная Формат
целое число -2147483648 2147483647 подписанный 32-разрядный
кардинальный 0 4294967295 32-разрядный без знака
SHORTINT -128 127 8-битный со знаком
Smallint -32768 32767 подписанный 16-битный
Longint -2147483648 2147483647 подписанный 32-разрядный
Int64 -2 ^ 63 2 ^ 63 – 1 подписанный 64-разрядный
Байт 0 255 8-битный без знака
слово 0 65535 16-разрядный без знака
LongWord 0 4294967295 32-разрядный без знака

Константы

Использование констант делает программу более читабельной и помогает хранить специальные количества в одном месте в начале программы. Паскаль допускает числовые, логические, строковые и символьные константы. Константы могут быть объявлены в части объявлений программы, указав объявление const .

Синтаксис объявления константного типа следующий –

const
Identifier = contant_value;

Ниже приведены некоторые примеры постоянных объявлений –

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

Все объявления констант должны быть даны до объявления переменных.

Перечисляемые типы

Перечисляемые типы данных являются пользовательскими типами данных. Они позволяют указывать значения в списке. Только перечисленные операторы и реляционные операторы разрешены для перечисляемых типов данных. Перечисляемые типы данных могут быть объявлены следующим образом:

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

Ниже приведены некоторые примеры перечислимых объявлений типов:

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

Порядок, в котором элементы перечислены в домене перечисляемого типа, определяет порядок элементов. Например, в перечисляемом типе SUMMER апрель наступает до мая, май – до июня и т. Д. Домен перечисляемых идентификаторов типов не может состоять из числовых или символьных констант.

Типы поддиапазонов

Типы поддиапазонов позволяют переменной принимать значения, лежащие в определенном диапазоне. Например, если возраст избирателей должен составлять от 18 до 100 лет, переменная с именем age может быть объявлена ​​как –

var
age: 18 ... 100;

Подробнее об объявлении переменных мы рассмотрим в следующем разделе. Вы также можете определить тип поддиапазона, используя объявление типа. Синтаксис объявления типа поддиапазона следующий:

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

Ниже приведены некоторые примеры объявлений поддиапазонных типов:

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

Типы поддиапазонов могут быть созданы из подмножества уже определенного перечислимого типа, например:

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

Паскаль – Типы переменных

Переменная – это не что иное, как имя, данное области памяти, которой могут манипулировать наши программы. Каждая переменная в Паскале имеет определенный тип, который определяет размер и расположение памяти переменной; диапазон значений, которые могут быть сохранены в этой памяти; и набор операций, которые могут быть применены к переменной.

Имя переменной может состоять из букв, цифр и символа подчеркивания. Он должен начинаться либо с буквы, либо с подчеркивания. Паскаль не чувствителен к регистру , поэтому заглавные и строчные буквы здесь означают одно и то же. Основываясь на базовых типах, описанных в предыдущей главе, будут следующие базовые типы переменных:

Основные переменные в Паскале

Sr.No Тип и описание
1

символ

Обычно один октет (один байт). Это целочисленный тип.

2

целое число

Наиболее натуральный размер целого числа для машины.

3

реальный

Значение с плавающей запятой одинарной точности.

4

логический

Указывает истинные или ложные логические значения. Это также целочисленный тип.

5

Перечислимый

Определяет пользовательский список.

6

Поддиапа- зон

Представляет переменные, значения которых лежат в диапазоне.

7

строка

Хранит массив символов.

символ

Обычно один октет (один байт). Это целочисленный тип.

целое число

Наиболее натуральный размер целого числа для машины.

реальный

Значение с плавающей запятой одинарной точности.

логический

Указывает истинные или ложные логические значения. Это также целочисленный тип.

Перечислимый

Определяет пользовательский список.

Поддиапа- зон

Представляет переменные, значения которых лежат в диапазоне.

строка

Хранит массив символов.

Язык программирования Pascal также позволяет определять различные другие типы переменных, которые мы рассмотрим в следующих главах, таких как Pointer, Array, Records, Sets, Files и т. Д. В этой главе мы изучим только основные типы переменных.

Объявление переменных в Паскале

Все переменные должны быть объявлены до того, как мы используем их в программе Pascal. Все объявления переменных сопровождаются ключевым словом var . Объявление определяет список переменных, за которыми следует двоеточие (:) и тип. Синтаксис объявления переменной –

var
variable_list : type;

Здесь тип должен быть допустимым типом данных Pascal, включая символьные, целые, действительные, логические или любые другие определяемые пользователем типы данных и т. Д., А variable_list может состоять из одного или нескольких имен идентификаторов, разделенных запятыми. Некоторые действительные объявления переменных показаны здесь –

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

В предыдущем уроке мы обсуждали, что Pascal позволяет объявлять тип. Тип может быть идентифицирован по имени или идентификатору. Этот тип может использоваться для определения переменных этого типа. Например,

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

Теперь определенные типы могут использоваться в объявлениях переменных –

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

Обратите внимание на разницу между объявлением типа и объявлением var . Объявление типа указывает категорию или класс типов, таких как целое число, вещественное и т. Д., Тогда как спецификация переменной указывает тип значений, которые может принимать переменная. Вы можете сравнить объявление типа в Pascal с typedef в C. Самое главное, имя переменной относится к области памяти, где будет храниться значение переменной. Это не так с объявлением типа.

Инициализация переменной в Паскале

Переменным присваивается значение с двоеточием и знаком равенства, за которым следует постоянное выражение. Общая форма присвоения значения –

variable_name := value;

По умолчанию переменные в Паскале не инициализируются с нуля. Они могут содержать мусорные значения. Поэтому лучше инициализировать переменные в программе. Переменные могут быть инициализированы (им присвоено начальное значение) в их объявлении. За инициализацией следует ключевое слово var, а синтаксис инициализации следующий:

var
variable_name : type = value;

Вот некоторые примеры:

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

Давайте посмотрим на пример, который использует различные типы переменных, которые обсуждались до сих пор –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Перечисляемые переменные

Вы видели, как использовать простые типы переменных, такие как integer, real и boolean. Теперь давайте посмотрим переменные перечислимого типа, которые можно определить как –

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

Когда вы объявили перечислимый тип, вы можете объявить переменные этого типа. Например,

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

Следующий пример иллюстрирует концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Which drink do you want?
You can drink limejuice

Переменные поддиапазона

Переменные поддиапазона объявляются как –

var
subrange-name : lowerlim ... uperlim;

Примеры поддиапазонных переменных:

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

Следующая программа иллюстрирует концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – Константы

Константа – это сущность, которая остается неизменной во время выполнения программы. Паскаль позволяет объявлять только константы следующих типов:

  • Порядковые типы
  • Набор типов
  • Типы указателей (но единственное допустимое значение – Nil).
  • Реальные типы
  • голец
  • строка

Объявление констант

Синтаксис объявления констант следующий:

const
identifier = constant_value;

В следующей таблице приведены примеры некоторых допустимых объявлений констант –

Константа реального типа

Sr.No Тип и примеры констант
1

Порядковая (целочисленная) константа типа

valid_age = 21;

2

Установить постоянную типа

Гласные = набор (A, E, I, O, U);

3

Константа типа указателя

P = ноль;

4

е = 2,7182818;

скорость света = 3.0E + 10;

5

Тип символа константа

Оператор = ‘+’;

6

Константа типа строки

президент = ‘Джонни Депп’;

Порядковая (целочисленная) константа типа

valid_age = 21;

Установить постоянную типа

Гласные = набор (A, E, I, O, U);

Константа типа указателя

P = ноль;

е = 2,7182818;

скорость света = 3.0E + 10;

Тип символа константа

Оператор = ‘+’;

Константа типа строки

президент = ‘Джонни Депп’;

Следующий пример иллюстрирует концепцию –

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Соблюдайте форматирование в выводе программы. Переменная c должна быть отформатирована с общим количеством цифр 7 и 2 цифр после десятичного знака. Паскаль позволяет такое форматирование вывода с числовыми переменными.

Паскаль – Операторы

Оператор – это символ, который указывает компилятору выполнять определенные математические или логические манипуляции. Паскаль допускает следующие типы операторов –

  • Арифметические операторы
  • Реляционные операторы
  • Булевы операторы
  • Битовые операторы
  • Операторы множества
  • Строковые операторы

Давайте обсудим один за другим арифметические, реляционные, булевы и битовые операторы. Мы обсудим операторы множеств и строковые операции позже.

Арифметические Операторы

В следующей таблице приведены все арифметические операторы, поддерживаемые Паскалем. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда –

Показать примеры

оператор Описание пример
+ Добавляет два операнда А + Б даст 30
Вычитает второй операнд из первого A – B даст -10
* Умножает оба операнда А * Б даст 200
/ Делит числитель на знаменатель Б / у даст 2
% Оператор модуля и остаток от целочисленного деления B% A даст 0

Операторы отношений

Следующая таблица показывает все реляционные операторы, поддерживаемые Pascal. Предположим, что переменная A содержит 10, а переменная B содержит 20, тогда –

Показать примеры

оператор Описание пример
знак равно Проверяет, равны ли значения двух операндов или нет, если да, то условие становится истинным. (A = B) не соответствует действительности.
<> Проверяет, равны ли значения двух операндов или нет, если значения не равны, тогда условие становится истинным. (A <> B) верно.
> Проверяет, больше ли значение левого операнда, чем значение правого операнда, если да, то условие становится истинным. (A> B) не соответствует действительности.
< Проверяет, меньше ли значение левого операнда, чем значение правого операнда, если да, то условие становится истинным. (A <B) верно.
> = Проверяет, больше ли значение левого операнда или равно значению правого операнда, если да, то условие становится истинным. (A> = B) не соответствует действительности.
<= Проверяет, меньше ли значение левого операнда или равно значению правого операнда, если да, то условие становится истинным. (A <= B) верно.

Булевы операторы

В следующей таблице приведены все логические операторы, поддерживаемые языком Паскаль. Все эти операторы работают с булевыми операндами и дают булевы результаты. Предположим, что переменная A имеет значение true, а переменная B содержит значение false, тогда –

Показать примеры

оператор Описание пример
а также Вызывается логическим оператором AND. Если оба операнда истинны, тогда условие становится истинным. (А и В) ложно.
а потом Он аналогичен оператору AND, однако гарантирует порядок, в котором компилятор вычисляет логическое выражение. Слева направо и правые операнды оцениваются только при необходимости. (A, а затем B) ложно.
или же Вызывается логическим оператором ИЛИ Если любой из двух операндов является истинным, тогда условие становится истинным. (А или В) это правда.
или еще Он похож на логическое ИЛИ, однако он гарантирует порядок, в котором компилятор вычисляет логическое выражение. Слева направо и правые операнды оцениваются только при необходимости. (A или иначе B) верно.
не Вызывается логическое НЕ оператор. Используется для изменения логического состояния своего операнда. Если условие истинно, то оператор Логический НЕ сделает его ложным. не (А и В) верно.

Битовые операторы

Битовые операторы работают с битами и выполняют побитовые операции. Все эти операторы работают с целочисленными операндами и дают целочисленные результаты. Таблица истинности для побитового и (&), побитового или (|) и побитового не (~) выглядит следующим образом:

п Q P & Q р | 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

Предположим, если А = 60; и B = 13; теперь в двоичном формате они будут выглядеть следующим образом –

A = 0011 1100

B = 0000 1101

—————–

A & B = 0000 1100

A ^ B = 0011 0001

~ A = 1100 0011

Побитовые операторы, поддерживаемые Pascal, перечислены в следующей таблице. Предположим, что переменная A содержит 60, а переменная B содержит 13, тогда:

Показать примеры

оператор Описание пример
& Двоичный оператор AND немного копирует результат, если он существует в обоих операндах. (A & B) даст 12, что составляет 0000 1100
| Оператор двоичного ИЛИ копирует немного, если он существует в любом из операндов. (A | B) даст 61, что составляет 0011 1101
! Оператор двоичного ИЛИ копирует немного, если он существует в любом из операндов. Это так же, как | оператор. (A! B) даст 61, что составляет 0011 1101
~ Оператор дополнения двоичных единиц является унарным и имеет эффект «переворачивания» битов. (~ A) даст -61, что составляет 1100 0011 в форме дополнения 2 из-за двоичного числа со знаком.
<< Двоичный оператор левого сдвига. Значение левого операнда перемещается влево на количество битов, указанное правым операндом. А << 2 даст 240, что составляет 1111 0000
>> Оператор двоичного правого сдвига. Значение левого операнда перемещается вправо на количество битов, указанное правым операндом. A >> 2 даст 15, что составляет 0000 1111

Обратите внимание, что разные реализации Паскаля отличаются по битовым операторам. Free Pascal, используемый здесь компилятор, поддерживает следующие побитовые операторы:

операторы операции
не Побитовое НЕ
а также Побитовое И
или же Побитовое ИЛИ
исключающее Побитовое исключающее ИЛИ
ЗЫ Побитовый сдвиг влево
SHR Побитовый сдвиг вправо
<< Побитовый сдвиг влево
>> Побитовый сдвиг вправо

Приоритет операторов в Паскале

Приоритет оператора определяет группировку терминов в выражении. Это влияет на то, как оценивается выражение. Некоторые операторы имеют более высокий приоритет, чем другие; например, оператор умножения имеет более высокий приоритет, чем оператор сложения.

Например, х = 7 + 3 * 2; здесь x назначено 13, а не 20, потому что оператор * имеет более высокий приоритет, чем +, поэтому он сначала умножается на 3 * 2, а затем прибавляется к 7.

Здесь операторы с самым высоким приоритетом отображаются вверху таблицы, а операторы с самым низким – внизу. Внутри выражения операторы с более высоким приоритетом будут оцениваться первыми.

Показать примеры

оператор старшинство
~ не Наибольший
*, /, div, mod, и, &
|,!, +, -, или,
=, <>, <, <=,>,> =, в
или еще, а потом низший

Паскаль – Принятие решений

Структуры принятия решений требуют, чтобы программист указал одно или несколько условий, которые должны быть оценены или протестированы программой, вместе с оператором или инструкциями, которые должны быть выполнены, если условие определено как истинное, и, необязательно, другие операторы, которые должны быть выполнены, если условие определяется как ложный.

Ниже приводится общая форма типичной структуры принятия решений, встречающейся в большинстве языков программирования.

Принятие решений в Паскале

Язык программирования Pascal предоставляет следующие типы операторов принятия решений. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No Заявление и описание
1 если – то заявление

Оператор if – then состоит из логического выражения, за которым следует один или несколько операторов.

2 Оператор if-then-else

За оператором if – then может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false.

3 вложенные операторы if

Вы можете использовать один оператор if или else if внутри другого оператора if или else if .

4 постановка дела

Оператор case позволяет проверять переменную на соответствие списку значений.

5 case – другое заявление

Это похоже на оператор if-then-else . Здесь другой термин следует за падежом .

6 вложенный регистр

Вы можете использовать один оператор case внутри другого оператора (ов) case .

Оператор if – then состоит из логического выражения, за которым следует один или несколько операторов.

За оператором if – then может следовать необязательный оператор else , который выполняется, когда логическое выражение имеет значение false.

Вы можете использовать один оператор if или else if внутри другого оператора if или else if .

Оператор case позволяет проверять переменную на соответствие списку значений.

Это похоже на оператор if-then-else . Здесь другой термин следует за падежом .

Вы можете использовать один оператор case внутри другого оператора (ов) case .

Паскаль – Петли

Может возникнуть ситуация, когда вам нужно выполнить блок кода несколько раз. В общем случае операторы выполняются последовательно: первый оператор в функции выполняется первым, затем второй и так далее.

Языки программирования предоставляют различные управляющие структуры, которые допускают более сложные пути выполнения.

Оператор цикла позволяет нам выполнять оператор или группу операторов несколько раз, и в большинстве языков программирования ниже приводится общая форма инструкции цикла.

Петлевая архитектура

Язык программирования Pascal предоставляет следующие типы конструкций цикла для обработки требований цикла. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No Тип и описание петли
1 цикл пока дела

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

2 цикл for-do

Выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла.

3 цикл повторения

Как оператор while, за исключением того, что он проверяет условие в конце тела цикла.

4 вложенные циклы

Вы можете использовать один или несколько циклов внутри любого другого while, for или повторять до цикла.

Повторяет оператор или группу операторов, пока данное условие выполняется. Он проверяет условие перед выполнением тела цикла.

Выполняет последовательность операторов несколько раз и сокращает код, который управляет переменной цикла.

Как оператор while, за исключением того, что он проверяет условие в конце тела цикла.

Вы можете использовать один или несколько циклов внутри любого другого while, for или повторять до цикла.

Заявления о контроле цикла

Операторы управления циклом изменяют выполнение от его нормальной последовательности. Когда выполнение покидает область действия, все автоматические объекты, созданные в этой области, уничтожаются.

Паскаль поддерживает следующие управляющие операторы. Нажмите на следующие ссылки, чтобы проверить их детали.

Sr.No Контрольное заявление и описание
1 заявление о нарушении

Завершает цикл или оператор case и переносит выполнение в оператор сразу после оператора loop или case.

2 продолжить заявление

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

3 Перейти к заявлению

Передает управление помеченному выражению. Хотя не рекомендуется использовать оператор goto в вашей программе.

Завершает цикл или оператор case и переносит выполнение в оператор сразу после оператора loop или case.

Заставляет петлю пропускать оставшуюся часть своего тела и немедленно проверять свое состояние перед повторением.

Передает управление помеченному выражению. Хотя не рекомендуется использовать оператор goto в вашей программе.

Паскаль – Функции

Подпрограммы

Подпрограмма – это программный модуль / модуль, который выполняет определенную задачу. Эти подпрограммы объединяются в большие программы. Это в основном называется «Модульный дизайн». Подпрограмма может быть вызвана подпрограммой / программой, которая называется вызывающей программой.

Паскаль предоставляет два вида подпрограмм –

  • Функции – эти подпрограммы возвращают одно значение.

  • Процедуры – эти подпрограммы не возвращают значение напрямую.

Функции – эти подпрограммы возвращают одно значение.

Процедуры – эти подпрограммы не возвращают значение напрямую.

функции

Функция – это группа операторов, которые вместе выполняют задачу. Каждая программа на Паскале имеет как минимум одну функцию, которая является самой программой, и все самые тривиальные программы могут определять дополнительные функции.

Объявление функции сообщает компилятору об имени функции, типе возврата и параметрах. Определение функции обеспечивает фактическое тело функции.

Стандартная библиотека Pascal предоставляет множество встроенных функций, которые может вызывать ваша программа. Например, функция AppendStr () добавляет две строки, функция New () динамически выделяет память для переменных и многие другие функции.

Определение функции

В Паскале функция определяется с помощью ключевого слова function. Общая форма определения функции следующая:

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

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

Определение функции в Pascal состоит из заголовка функции, локальных объявлений и тела функции. Заголовок функции состоит из ключевого слова function и имени, данного функции. Вот все части функции –

  • Аргументы – Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами функций, а также вызывают формальные параметры. Параметр похож на заполнитель. Когда вызывается функция, вы передаете значение параметру. Это значение называется фактическим параметром или аргументом. Список параметров относится к типу, порядку и количеству параметров функции. Использование таких формальных параметров не является обязательным. Эти параметры могут иметь стандартный тип данных, определенный пользователем тип данных или тип данных поддиапазона.

    Список формальных параметров, появляющийся в операторе функции, может быть простыми или индексированными переменными, массивами или структурированными переменными или подпрограммами.

  • Возвращаемый тип – все функции должны возвращать значение, поэтому всем функциям должен быть присвоен тип. Тип функции – это тип данных значения, которое возвращает функция. Это может быть стандартный, определенный пользователем скалярный или поддиапазонный тип, но он не может быть структурированным типом.

  • Локальные объявления – Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применяются только к телу функции.

  • Тело функцииТело функции содержит набор операторов, которые определяют, что делает функция. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть функции, в которой выполняются все вычисления. Должен быть оператор присваивания типа – имя: = выражение; в теле функции, которая присваивает значение имени функции. Это значение возвращается как и когда функция выполняется. Последнее утверждение в теле должно быть конечным утверждением.

Аргументы – Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами функций, а также вызывают формальные параметры. Параметр похож на заполнитель. Когда вызывается функция, вы передаете значение параметру. Это значение называется фактическим параметром или аргументом. Список параметров относится к типу, порядку и количеству параметров функции. Использование таких формальных параметров не является обязательным. Эти параметры могут иметь стандартный тип данных, определенный пользователем тип данных или тип данных поддиапазона.

Список формальных параметров, появляющийся в операторе функции, может быть простыми или индексированными переменными, массивами или структурированными переменными или подпрограммами.

Возвращаемый тип – все функции должны возвращать значение, поэтому всем функциям должен быть присвоен тип. Тип функции – это тип данных значения, которое возвращает функция. Это может быть стандартный, определенный пользователем скалярный или поддиапазонный тип, но он не может быть структурированным типом.

Локальные объявления – Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применяются только к телу функции.

Тело функцииТело функции содержит набор операторов, которые определяют, что делает функция. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть функции, в которой выполняются все вычисления. Должен быть оператор присваивания типа – имя: = выражение; в теле функции, которая присваивает значение имени функции. Это значение возвращается как и когда функция выполняется. Последнее утверждение в теле должно быть конечным утверждением.

Ниже приведен пример, показывающий, как определить функцию на паскале:

(* 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;

Объявления функций

Объявление функции сообщает компилятору об имени функции и о том, как вызывать функцию. Фактическое тело функции может быть определено отдельно.

Объявление функции состоит из следующих частей:

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

Для определенной выше функции max () ниже приводится объявление функции –

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

Объявление функции требуется, когда вы определяете функцию в одном исходном файле и вызываете эту функцию в другом файле. В таком случае вы должны объявить функцию в начале файла, вызывающего функцию.

Вызов функции

При создании функции вы даете определение того, что должна делать функция. Чтобы использовать функцию, вам нужно будет вызвать эту функцию для выполнения определенной задачи. Когда программа вызывает функцию, управление программой передается вызываемой функции. Вызываемая функция выполняет определенную задачу, и когда выполняется оператор return или когда достигается последний оператор end, она возвращает управление программой обратно в основную программу.

Чтобы вызвать функцию, вам просто нужно передать необходимые параметры вместе с именем функции, и если функция возвращает значение, вы можете сохранить возвращаемое значение. Ниже приведен простой пример, чтобы показать использование –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Max value is : 200 

Паскаль – Процедуры

Процедуры – это подпрограммы, которые вместо того, чтобы возвращать одно значение, позволяют получить группу результатов.

Определение процедуры

В Паскале процедура определяется с помощью ключевого слова процедуры . Общая форма определения процедуры следующая:

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

Определение процедуры в Pascal состоит из заголовка , локальных объявлений и тела процедуры. Заголовок процедуры состоит из ключевого слова процедуры и имени, присвоенного процедуре. Вот все части процедуры –

  • Аргументы – Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами процедур, а также вызывают формальные параметры. Правила для аргументов в процедурах такие же, как и для функций.

  • Локальные объявления – Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применимы только к основной части процедуры.

  • Тело процедурыТело процедуры содержит набор операторов, которые определяют, что делает процедура. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть процедуры, в которой выполняются все вычисления.

Аргументы – Аргументы (аргументы) устанавливают связь между вызывающей программой и идентификаторами процедур, а также вызывают формальные параметры. Правила для аргументов в процедурах такие же, как и для функций.

Локальные объявления – Локальные объявления относятся к объявлениям для меток, констант, переменных, функций и процедур, которые применимы только к основной части процедуры.

Тело процедурыТело процедуры содержит набор операторов, которые определяют, что делает процедура. Он всегда должен быть заключен между зарезервированными словами начало и конец. Это часть процедуры, в которой выполняются все вычисления.

Ниже приведен исходный код процедуры с именем findMin () . Эта процедура принимает 4 параметра x, y, z и m и сохраняет минимум среди первых трех переменных в переменной с именем m. Переменная m передается по ссылке (мы обсудим передачу аргументов по ссылке чуть позже) –

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 }  

Процедурные объявления

Объявление процедуры сообщает компилятору об имени процедуры и о том, как вызвать процедуру. Фактическое тело процедуры может быть определено отдельно.

Объявление процедуры имеет следующий синтаксис –

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

Обратите внимание, что название процедуры не связано ни с каким типом . Для описанной выше процедуры findMin () ниже приводится объявление –

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

Вызов процедуры

При создании процедуры вы даете определение того, что процедура должна делать. Чтобы использовать процедуру, вам придется вызвать эту процедуру для выполнения определенной задачи. Когда программа вызывает процедуру, управление программой передается вызываемой процедуре. Вызываемая процедура выполняет определенную задачу, и когда ее последний оператор завершения достигнут, она возвращает элемент управления обратно вызывающей программе.

Чтобы вызвать процедуру, вам просто нужно передать необходимые параметры вместе с именем процедуры, как показано ниже –

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Enter three numbers:
89 45 67
Minimum: 45

Рекурсивные подпрограммы

Мы видели, что программа или подпрограмма может вызывать другую подпрограмму. Когда подпрограмма вызывает себя, она называется рекурсивным вызовом, а процесс называется рекурсией.

Чтобы проиллюстрировать концепцию, давайте вычислим факториал числа. Факториал числа n определяется как –

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

Следующая программа вычисляет факториал данного числа, вызывая себя рекурсивно.

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Enter a number:
5
Factorial 5 is: 120

Ниже приведен еще один пример, который генерирует ряд Фибоначчи для заданного числа с использованием рекурсивной функции –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

0 1 1 2	3 5 8 13 21 34

Аргументы подпрограммы

Если подпрограмма ( функция или процедура ) должна использовать аргументы, она должна объявлять переменные, которые принимают значения аргументов. Эти переменные называются формальными параметрами подпрограммы.

Формальные параметры ведут себя как другие локальные переменные внутри подпрограммы и создаются при входе в подпрограмму и уничтожаются при выходе.

При вызове подпрограммы есть два способа передачи аргументов в подпрограмму:

Sr.No Тип звонка и описание
1 Звонок по значению

Этот метод копирует фактическое значение аргумента в формальный параметр подпрограммы. В этом случае изменения, внесенные в параметр внутри подпрограммы, не влияют на аргумент.

2 Звоните по ссылке

Этот метод копирует адрес аргумента в формальный параметр. Внутри подпрограммы адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.

Этот метод копирует фактическое значение аргумента в формальный параметр подпрограммы. В этом случае изменения, внесенные в параметр внутри подпрограммы, не влияют на аргумент.

Этот метод копирует адрес аргумента в формальный параметр. Внутри подпрограммы адрес используется для доступа к фактическому аргументу, используемому в вызове. Это означает, что изменения, внесенные в параметр, влияют на аргумент.

По умолчанию Паскаль использует вызов по значению для передачи аргументов. В общем, это означает, что код внутри подпрограммы не может изменять аргументы, используемые для вызова подпрограммы. Пример программы, которую мы использовали в главе «Паскаль – Функции», вызывал функцию max () с использованием вызова по значению .

Принимая во внимание, что пример программы, представленной здесь ( exProcedure ), вызывает процедуру findMin (), используя вызов по ссылке .

Паскаль – переменная область

Область действия в любом программировании – это область программы, в которой может существовать определенная переменная, и за пределами этой переменной нет доступа. Есть три места, где переменные могут быть объявлены на языке программирования Pascal –

  • Внутри подпрограммы или блока, который называется локальными переменными

  • За пределами всех подпрограмм, которые называются глобальными переменными

  • При определении параметров подпрограммы, которая называется формальными параметрами

Внутри подпрограммы или блока, который называется локальными переменными

За пределами всех подпрограмм, которые называются глобальными переменными

При определении параметров подпрограммы, которая называется формальными параметрами

Поясним, что такое локальные и глобальные переменные и формальные параметры.

Локальные переменные

Переменные, которые объявлены внутри подпрограммы или блока, называются локальными переменными. Они могут использоваться только операторами, которые находятся внутри этой подпрограммы или блока кода. Локальные переменные не известны подпрограммам вне их собственных. Ниже приведен пример использования локальных переменных. Здесь все переменные a , b и c являются локальными для программы с именем exLocal .

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

value of a = 10 b = 20 c = 30

Теперь давайте немного расширим программу, создадим процедуру с именем display, которая будет иметь собственный набор переменных a , b и c и отображать их значения прямо из программы exLocal .

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Глобальные переменные

Глобальные переменные определяются вне функции, обычно в верхней части программы. Глобальные переменные будут сохранять свое значение на протяжении всего жизненного цикла вашей программы, и к ним можно получить доступ в любой из функций, определенных для программы.

Глобальная переменная может быть доступна любой функции. То есть глобальная переменная доступна для использования во всей вашей программе после ее объявления. Ниже приведен пример использования глобальных и локальных переменных:

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Обратите внимание, что процедура display имеет доступ к переменным a, b и c, которые являются глобальными переменными по отношению к отображению, а также к своим собственным локальным переменным. Программа может иметь одинаковые имена для локальных и глобальных переменных, но предпочтение будет отдаваться значению локальной переменной внутри функции.

Давайте немного изменим предыдущий пример, теперь локальные переменные для отображения процедуры имеют те же имена, что и a , b , c

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – Струны

Строка в Паскале на самом деле представляет собой последовательность символов с необязательной спецификацией размера. Символы могут быть числовыми, буквами, пробелами, специальными символами или их комбинацией. Extended Pascal предоставляет множество типов строковых объектов в зависимости от системы и реализации. Мы обсудим более распространенные типы строк, используемые в программах.

Вы можете определить строку многими способами –

  • Символьные массивы – это символьная строка, представляющая собой последовательность из нулевых или более байтовых символов, заключенных в одинарные кавычки.

  • Строковые переменные – переменная типа String, как определено в Turbo Pascal.

  • Короткие строки – переменная типа String с указанием размера.

  • Строки с нулевым символом в конце – переменная типа pchar .

  • AnsiStringsAnsistrings – это строки без ограничения длины.

Символьные массивы – это символьная строка, представляющая собой последовательность из нулевых или более байтовых символов, заключенных в одинарные кавычки.

Строковые переменные – переменная типа String, как определено в Turbo Pascal.

Короткие строки – переменная типа String с указанием размера.

Строки с нулевым символом в конце – переменная типа pchar .

AnsiStringsAnsistrings – это строки без ограничения длины.

Паскаль предоставляет только один строковый оператор, оператор конкатенации строк (+).

Примеры

Следующая программа печатает первые четыре вида строк. Мы будем использовать 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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

В следующем примере используются еще несколько функций, давайте посмотрим –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Строковые функции и процедуры Паскаля

Паскаль поддерживает широкий спектр функций и процедур, которые манипулируют строками. Эти подпрограммы варьируются в зависимости от реализации. Здесь мы перечисляем различные подпрограммы для работы со строками, предоставляемые Free Pascal –

Sr.No. Функция и цель
1

функция AnsiCompareStr (const S1:; const S2 :): целое число;

Сравнивает две строки

2

function AnsiCompareText (const S1:; const S2 :): целое число;

Сравнивает две строки без учета регистра

3

функция AnsiExtractQuotedStr (var Src: PChar; Цитата: Char) :;

Удаляет кавычки из строки

4

функция AnsiLastChar (const S :): PChar;

Получает последний символ строки

5

функция AnsiLowerCase (const s :):

Преобразует строку в строчные буквы

6

функция AnsiQuotedStr (const S:; Цитата: Char) :;

Цитирует строку

7

функция AnsiStrComp (S1: PChar; S2: PChar): целое число;

Сравнивает строки с учетом регистра

8

функция AnsiStrIComp (S1: PChar; S2: PChar): целое число;

Сравнивает строки без учета регистра

9

функция AnsiStrLComp (S1: PChar; S2: PChar; MaxLen: кардинал): целое число;

Сравнивает L символов строк с учетом регистра

10

функция AnsiStrLIComp (S1: PChar; S2: PChar; MaxLen: кардинал): целое число;

Сравнивает L символов строк без учета регистра

11

функция AnsiStrLastChar (Str: PChar): PChar;

Получает последний символ строки

12

функция AnsiStrLower (Str: PChar): PChar;

Преобразует строку в строчные буквы

13

function AnsiStrUpper (Str: PChar): PChar;

Преобразует строку в верхний регистр

14

функция AnsiUpperCase (const s 🙂 :;

Преобразует строку в верхний регистр

15

процедура AppendStr (var Dest:; const S :);

Добавляет 2 строки

16

процедура AssignStr (var P: PString; const S :);

Назначает значение строк в куче

17

функция CompareStr (const S1:; const S2 :): целое число; перегрузки;

Сравнивает две строки с учетом регистра

18

function CompareText (const S1:; const S2 :): целое число;

Сравнивает две строки без учета регистра

19 процедура DisposeStr (S: PString); перегрузки;

Удаляет строку из кучи

20

процедура DisposeStr (S: PShortString); перегрузки;

Удаляет строку из кучи

21

function IsValidIdent (const Ident :): Boolean;

Является ли строка допустимым идентификатором Паскаля?

22

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

Последнее вхождение символа в строку

23

функция LeftStr (const S:; Count: Integer) :;

Получает первые N символов строки

24

функция LoadStr (Ident: Integer) :;

Загружает строку из ресурсов

25

функция LowerCase (const s:) :; перегрузки;

Преобразует строку в строчные буквы

26

функция LowerCase (const V: вариант) :; перегрузки;

Преобразует строку в строчные буквы

27

function NewStr (const S :): PString; перегрузки;

Выделяет новую строку в кучу

28

функция RightStr (const S:; Count: Integer) :;

Получает последние N символов строки

29

функция StrAlloc (размер: кардинал): PChar;

Выделяет память для строки

30

function StrBufSize (Str: PChar): SizeUInt;

Резервирует память для строки

31

процедура StrDispose (Str: PChar);

Удаляет строку из кучи

32

функция StrPas (Str: PChar) :;

Преобразует PChar в паскаль

33

function StrPCopy (Dest: PChar; Источник :): PChar;

Копирует паскаль

34

Функция StrPLCopy (Dest: PChar; Источник:; MaxLen: SizeUInt): PChar;

Копирует N байт строки паскаля.

35

функция UpperCase (const s 🙂 :;

Преобразует строку в верхний регистр

функция AnsiCompareStr (const S1:; const S2 :): целое число;

Сравнивает две строки

function AnsiCompareText (const S1:; const S2 :): целое число;

Сравнивает две строки без учета регистра

функция AnsiExtractQuotedStr (var Src: PChar; Цитата: Char) :;

Удаляет кавычки из строки

функция AnsiLastChar (const S :): PChar;

Получает последний символ строки

функция AnsiLowerCase (const s :):

Преобразует строку в строчные буквы

функция AnsiQuotedStr (const S:; Цитата: Char) :;

Цитирует строку

функция AnsiStrComp (S1: PChar; S2: PChar): целое число;

Сравнивает строки с учетом регистра

функция AnsiStrIComp (S1: PChar; S2: PChar): целое число;

Сравнивает строки без учета регистра

функция AnsiStrLComp (S1: PChar; S2: PChar; MaxLen: кардинал): целое число;

Сравнивает L символов строк с учетом регистра

функция AnsiStrLIComp (S1: PChar; S2: PChar; MaxLen: кардинал): целое число;

Сравнивает L символов строк без учета регистра

функция AnsiStrLastChar (Str: PChar): PChar;

Получает последний символ строки

функция AnsiStrLower (Str: PChar): PChar;

Преобразует строку в строчные буквы

function AnsiStrUpper (Str: PChar): PChar;

Преобразует строку в верхний регистр

функция AnsiUpperCase (const s 🙂 :;

Преобразует строку в верхний регистр

процедура AppendStr (var Dest:; const S :);

Добавляет 2 строки

процедура AssignStr (var P: PString; const S :);

Назначает значение строк в куче

функция CompareStr (const S1:; const S2 :): целое число; перегрузки;

Сравнивает две строки с учетом регистра

function CompareText (const S1:; const S2 :): целое число;

Сравнивает две строки без учета регистра

Удаляет строку из кучи

процедура DisposeStr (S: PShortString); перегрузки;

Удаляет строку из кучи

function IsValidIdent (const Ident :): Boolean;

Является ли строка допустимым идентификатором Паскаля?

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

Последнее вхождение символа в строку

функция LeftStr (const S:; Count: Integer) :;

Получает первые N символов строки

функция LoadStr (Ident: Integer) :;

Загружает строку из ресурсов

функция LowerCase (const s:) :; перегрузки;

Преобразует строку в строчные буквы

функция LowerCase (const V: вариант) :; перегрузки;

Преобразует строку в строчные буквы

function NewStr (const S :): PString; перегрузки;

Выделяет новую строку в кучу

функция RightStr (const S:; Count: Integer) :;

Получает последние N символов строки

функция StrAlloc (размер: кардинал): PChar;

Выделяет память для строки

function StrBufSize (Str: PChar): SizeUInt;

Резервирует память для строки

процедура StrDispose (Str: PChar);

Удаляет строку из кучи

функция StrPas (Str: PChar) :;

Преобразует PChar в паскаль

function StrPCopy (Dest: PChar; Источник :): PChar;

Копирует паскаль

Функция StrPLCopy (Dest: PChar; Источник:; MaxLen: SizeUInt): PChar;

Копирует N байт строки паскаля.

функция UpperCase (const s 🙂 :;

Преобразует строку в верхний регистр

Паскаль – логическое значение

Pascal предоставляет тип данных Boolean, который позволяет программистам определять, хранить и манипулировать логическими объектами, такими как константы, переменные, функции и выражения и т. Д.

Булевы значения в основном целочисленные. Переменные логического типа имеют два предопределенных возможных значения True и False . Выражения, разрешающие логическое значение, также могут быть назначены логическому типу.

Free Pascal также поддерживает типы ByteBool , WordBool и LongBool . Они имеют тип Byte, Word или Longint, соответственно.

Значение False эквивалентно 0 (нулю), и любое ненулевое значение считается истинным при преобразовании в логическое значение. Булево значение True преобразуется в -1, если оно назначено переменной типа LongBool.

Следует отметить, что логические операторы и , или, и не определены для логических типов данных.

Объявление булевых типов данных

Переменная булева типа объявляется с использованием ключевого слова var.

var
boolean-identifier: boolean;

например,

var
choice: boolean;

пример

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – Массивы

Язык программирования Pascal предоставляет структуру данных, называемую массивом, в которой можно хранить последовательную коллекцию элементов одного и того же типа. Массив используется для хранения коллекции данных, но часто более полезно думать о массиве как о коллекции переменных одного типа.

Вместо того, чтобы объявлять отдельные переменные, такие как number1, number2, … и number100, вы объявляете одну переменную массива, такую ​​как числа, и используете числа [1], числа [2] и …, числа [100] для представления отдельные переменные. Определенный элемент в массиве доступен по индексу.

Все массивы состоят из смежных областей памяти. Самый низкий адрес соответствует первому элементу, а самый высокий адрес – последнему.

Обратите внимание, что если вы хотите, чтобы массив в стиле C начинался с индекса 0, вам просто нужно начать индекс с 0, а не с 1.

Массивы в Паскале

Объявление массивов

Чтобы объявить массив в Pascal, программист может либо объявить тип, а затем создать переменные этого массива, либо напрямую объявить переменную массива.

Общая форма объявления типа одномерного массива –

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

Куда,

  • идентификатор массива – указывает имя типа массива.

  • index-type – указывает индекс массива; это может быть любой скалярный тип данных, кроме реального

  • element-type – определяет типы значений, которые будут сохранены

идентификатор массива – указывает имя типа массива.

index-type – указывает индекс массива; это может быть любой скалярный тип данных, кроме реального

element-type – определяет типы значений, которые будут сохранены

Например,

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

Теперь, скорость – это переменный массив векторного типа, которого достаточно для хранения до 25 действительных чисел.

Чтобы начать массив с индекса 0, объявление должно быть –

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

Типы Array Subscript

В Pascal индекс массива может иметь любой скалярный тип, например, целое число, логическое значение, перечисление или поддиапазон, кроме действительного. Индексы массива также могут иметь отрицательные значения.

Например,

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

Давайте рассмотрим еще один пример, где индекс имеет символьный тип –

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

Индекс может быть перечисляемого типа –

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

Инициализация массивов

В Pascal массивы инициализируются посредством присваивания, либо путем указания конкретного нижнего индекса, либо с помощью цикла for-do.

Например –

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 *)

Доступ к элементам массива

Доступ к элементу осуществляется путем индексации имени массива. Это делается путем помещения индекса элемента в квадратные скобки после имени массива. Например –

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

Вышеприведенный оператор возьмет первый элемент из массива с именем alphabet и присвоит значение переменной a.

Ниже приведен пример, который будет использовать все три вышеупомянутых понятия, а именно. декларация, назначение и доступ к массивам –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Массивы Паскаля в деталях

Массивы важны для Паскаля и должны требовать больше подробностей. Существует несколько важных понятий, связанных с массивом, которые должны быть понятны программисту на Паскале:

Sr.No Концепция и описание
1 Многомерные массивы

Паскаль поддерживает многомерные массивы. Простейшей формой многомерного массива является двумерный массив.

2 Динамический массив

В массивах этого типа начальная длина равна нулю. Фактическая длина массива должна быть установлена ​​с помощью стандартной функции SetLength .

3 Упакованный массив

Эти массивы упакованы битами, т. Е. Каждый символ или значения истинности хранятся в последовательных байтах вместо использования одного блока хранения, обычно слова (4 байта или более).

4 Передача массивов в подпрограммы

Вы можете передать подпрограмме указатель на массив, указав имя массива без индекса.

Паскаль поддерживает многомерные массивы. Простейшей формой многомерного массива является двумерный массив.

В массивах этого типа начальная длина равна нулю. Фактическая длина массива должна быть установлена ​​с помощью стандартной функции SetLength .

Эти массивы упакованы битами, т. Е. Каждый символ или значения истинности хранятся в последовательных байтах вместо использования одного блока хранения, обычно слова (4 байта или более).

Вы можете передать подпрограмме указатель на массив, указав имя массива без индекса.

Паскаль – Указатели

Указатели на Паскале легко и весело выучить. Некоторые задачи программирования на Pascal выполняются с помощью указателей, а другие задачи, такие как динамическое распределение памяти, не могут быть выполнены без использования указателей. Поэтому становится необходимым изучать указатели, чтобы стать идеальным программистом на Паскале. Давайте начнем изучать их в простых и легких шагах.

Как вы знаете, каждая переменная является ячейкой памяти, и каждая ячейка памяти имеет свой адрес, к которому можно обратиться, используя имя переменной-указателя, которая обозначает адрес в памяти.

Что такое указатели?

Указатель – это динамическая переменная, значением которой является адрес другой переменной, т. Е. Прямой адрес ячейки памяти. Как и любая переменная или константа, вы должны объявить указатель, прежде чем использовать его для хранения любого адреса переменной. Общая форма объявления переменной указателя –

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

Тип указателя определяется путем добавления префикса стрелки каретки (^) к базовому типу. Базовый тип определяет типы элементов данных. Как только переменная-указатель определена для определенного типа, она может указывать только на элементы данных этого типа. После определения типа указателя мы можем использовать объявление var для объявления переменных указателя.

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

Ниже приведены некоторые допустимые объявления указателей –

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;

Переменные указателя разыменовываются с помощью того же символа каретки (^). Например, связанная переменная, на которую указывает указатель rptr , это rptr ^ . Это может быть доступно как –

rptr^ := 234.56;

Следующий пример проиллюстрирует эту концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Печать адреса памяти в Паскале

В Паскале мы можем присвоить адрес переменной переменной-указателю, используя оператор адреса (@). Мы используем этот указатель для манипулирования и доступа к элементу данных. Однако, если по какой-то причине нам нужно работать с самим адресом памяти, нам нужно сохранить его в переменной типа слова.

Давайте расширим приведенный выше пример для печати адреса памяти, хранящегося в указателе iptr

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Ноль указатели

Рекомендуется всегда присваивать значение NIL переменной-указателю, если у вас нет точного адреса для назначения. Это делается во время объявления переменной. Указатель, которому назначен NIL, указывает на никуда. Рассмотрим следующую программу –

Live Demo

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

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

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

The value of ptr is 0

Чтобы проверить нулевой указатель, вы можете использовать оператор if следующим образом:

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

Паскаль указатели в деталях

У указателей есть много, но простых концепций, и они очень важны для программирования на Паскале. Существует несколько важных концепций указателей, которые должны быть понятны программисту на Паскале:

Sr.No Концепция и описание
1 Паскаль – арифметика указателя

Для указателей можно использовать четыре арифметических оператора: приращение, уменьшение, +, –

2 Паскаль – Массив указателей

Вы можете определить массивы для хранения нескольких указателей.

3 Паскаль – указатель на указатель

Паскаль позволяет вам иметь указатель на указатель и так далее.

4 Передача указателей на подпрограммы в Паскале

Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей подпрограмме вызываемой подпрограммой.

5 Возврат указателя из подпрограмм в Паскале

Паскаль позволяет подпрограмме возвращать указатель.

Для указателей можно использовать четыре арифметических оператора: приращение, уменьшение, +, –

Вы можете определить массивы для хранения нескольких указателей.

Паскаль позволяет вам иметь указатель на указатель и так далее.

Передача аргумента по ссылке или по адресу позволяет включить переданный аргумент в вызывающей подпрограмме вызываемой подпрограммой.

Паскаль позволяет подпрограмме возвращать указатель.

Паскаль – Отчеты

Массивы Pascal позволяют вам определять тип переменных, которые могут содержать несколько элементов данных одного типа, но запись – это другой определенный пользователем тип данных, доступный в Pascal, который позволяет комбинировать элементы данных разных типов.

Записи состоят из разных полей. Предположим, что вы хотите отслеживать свои книги в библиотеке, вы можете отслеживать следующие атрибуты для каждой книги –

  • заглавие
  • автор
  • Предмет
  • ID книги

Определение записи

Чтобы определить тип записи, вы можете использовать оператор объявления типа. Тип записи определяется как –

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

Вот как бы вы объявили Книжную запись –

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;

Переменные записи определяются обычным образом как

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

Кроме того, вы можете напрямую определить переменную типа записи как –

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;

Доступ к полям записи

Для доступа к любому полю записи мы используем оператор доступа участника (.). Оператор доступа к элементу закодирован как точка между именем переменной записи и полем, к которому мы хотим получить доступ. Ниже приведен пример, объясняющий использование структуры:

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Записи как аргументы подпрограммы

Вы можете передать запись в качестве аргумента подпрограммы таким же образом, как и любую другую переменную или указатель. Вы получите доступ к полям записи аналогично тому, как вы использовали в приведенном выше примере –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Указатели на записи

Вы можете определить указатели на записи очень похожим образом, как вы определяете указатель на любую другую переменную следующим образом:

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

Теперь вы можете сохранить адрес переменной типа записи в определенной выше переменной указателя. Чтобы объявить переменную созданного типа указателя, вы используете ключевое слово var –

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

Перед использованием этих указателей вы должны создать хранилище для переменной типа имя-записи, которой будут манипулировать эти указатели.

new(r1);
new(r2);

Чтобы получить доступ к членам записи, используя указатель на эту запись, вы должны использовать ^. оператор следующим образом –

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

Наконец, не забудьте утилизировать использованное хранилище, когда оно больше не используется –

dispose(r1);
dispose(r2);

Давайте перепишем первый пример, используя указатель на запись Книги. Надеюсь, вам будет легко понять концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

С заявлением

Мы обсудили, что к членам записи можно получить доступ с помощью оператора доступа к члену (.). Таким образом, имя переменной записи должно быть записано каждый раз. Оператор With предоставляет альтернативный способ сделать это.

Посмотрите на следующий фрагмент кода, взятый из нашего первого примера –

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

Такое же назначение может быть записано с использованием оператора With, как –

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

Паскаль – Варианты

Паскаль поддерживает уникальный тип хранения именованных вариантов. Вы можете назначить любой простой тип значений в переменной переменной. Тип значения, хранящегося в варианте, определяется только во время выполнения. Вариантам можно присвоить практически любой простой тип: порядковые типы, строковые типы, типы int64.

Структурированные типы, такие как наборы, записи, массивы, файлы, объекты и классы, не совместимы по назначению с вариантом. Вы также можете назначить указатель на вариант.

Free Pascal поддерживает варианты.

Объявление варианта

Вы можете объявить тип варианта, как и любые другие типы, используя ключевое слово var . Синтаксис объявления типа варианта –

var
   v: variant;

Теперь эту переменную v можно присвоить почти всем простым типам, включая перечисляемые типы, и наоборот.

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;

пример

Следующий пример иллюстрирует концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – Наборы

Набор представляет собой набор элементов одного типа. Паскаль позволяет определить заданный тип данных. Элементы в наборе называются его членами. В математике множества представлены заключением членов в фигурные скобки {} . Однако в Паскале элементы набора заключены в квадратные скобки [], которые называются конструктором набора.

Определение типов набора и переменных

Типы Pascal Set определяются как

type
set-identifier = set of base type;

Переменные типа set определяются как

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

или же,

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

Примеры некоторых допустимых объявлений типов:

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;

Операторы множества

Вы можете выполнить следующие операции над множествами Паскаля.

Sr.No Операции и описания
1

союз

Это объединяет два набора и дает новый набор с членами из обоих наборов.

2

разница

Получает разницу двух наборов и дает новый набор с элементами, не общими для обоих наборов.

3

пересечение

Получает пересечение двух наборов и дает новый набор с элементами, общими для обоих наборов.

4

включение

Набор P включается в набор Q, если все элементы в P также находятся в Q, но не наоборот.

5

Симметричная разница

Получает симметричную разность двух наборов и дает набор элементов, которые находятся в любом из наборов, а не в их пересечении.

6

В

Это проверяет членство.

союз

Это объединяет два набора и дает новый набор с членами из обоих наборов.

разница

Получает разницу двух наборов и дает новый набор с элементами, не общими для обоих наборов.

пересечение

Получает пересечение двух наборов и дает новый набор с элементами, общими для обоих наборов.

включение

Набор P включается в набор Q, если все элементы в P также находятся в Q, но не наоборот.

Симметричная разница

Получает симметричную разность двух наборов и дает набор элементов, которые находятся в любом из наборов, а не в их пересечении.

В

Это проверяет членство.

В следующей таблице показаны все операторы множеств, поддерживаемые Free Pascal. Предположим, что S1 и S2 являются двумя наборами символов, так что –

S1: = [‘a’, ‘b’, ‘c’];

S2: = [‘c’, ‘d’, ‘e’];

оператор Описание пример
+ Союз двух комплектов

S1 + S2 даст набор

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

Разница двух комплектов

S1 – S2 даст набор

[‘a’, ‘b’]

* Пересечение двух множеств

S1 * S2 даст набор

[ ‘С’]

> < Симметричная разность двух множеств S1> <S2 даст набор [‘a’, ‘b’, ‘d’, ‘e’]
знак равно Проверяет равенство двух множеств S1 = S2 даст логическое значение False
<> Проверяет неравенство двух множеств S1 <> S2 даст логическое значение True
<= Содержит (Проверяет, является ли один набор подмножеством другого) S1 <= S2 даст логическое значение False
Включают Включает элемент в набор; в основном это объединение множества и элемента одного базового типа

Включить (S1, [‘d’]) даст набор

[‘a’, ‘b’, ‘c’, ‘d’]

исключать Исключает элемент из набора; в основном это разница набора и элемента того же базового типа

Exclude (S2, [‘d’]) даст набор

[‘c’, ‘e’]

В Проверяет набор членства элемента в наборе [‘e’] в S2 дает логическое значение True

S1 + S2 даст набор

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]

S1 – S2 даст набор

[‘a’, ‘b’]

S1 * S2 даст набор

[ ‘С’]

Включить (S1, [‘d’]) даст набор

[‘a’, ‘b’, ‘c’, ‘d’]

Exclude (S2, [‘d’]) даст набор

[‘c’, ‘e’]

пример

Следующий пример иллюстрирует использование некоторых из этих операторов –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – Обработка файлов

Паскаль рассматривает файл как последовательность компонентов, которые должны быть одинакового типа. Тип файла определяется типом компонентов. Тип данных файла определяется как –

type
file-name = file of base-type;

Где базовый тип указывает тип компонентов файла. Базовый тип может быть чем угодно, целым, действительным, логическим, перечисляемым, поддиапазоном, записью, массивами и наборами, за исключением другого типа файла. Переменные типа файла создаются с помощью объявления var

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

Ниже приведены некоторые примеры определения некоторых типов файлов и переменных файлов:

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;

Создание и запись в файл

Давайте напишем программу, которая создаст файл данных для записей студентов. Это создаст файл с именем student.dat и запишет в него данные студента –

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.

После компиляции и запуска программа создаст файл с именем student.dat в рабочем каталоге. Вы можете открыть файл с помощью текстового редактора, такого как блокнот, чтобы просмотреть данные Джона Смита.

Чтение из файла

Мы только что создали и записали в файл с именем Students.dat. Теперь давайте напишем программу, которая будет считывать данные студента из файла –

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Файлы как параметр подпрограммы

Pascal позволяет использовать файловые переменные в качестве параметров в стандартных и пользовательских подпрограммах. Следующий пример иллюстрирует эту концепцию. Программа создает файл с именем rainfall.txt и хранит некоторые данные об осадках. Затем он открывает файл, читает данные и вычисляет среднее количество осадков.

Обратите внимание, что если вы используете параметр файла с подпрограммами, он должен быть объявлен как параметр var.

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Текстовые файлы

Текстовый файл на языке Pascal состоит из строк символов, каждая строка которых заканчивается маркером конца строки. Вы можете объявить и определить такие файлы как –

type
file-name = text;

Разница между обычным файлом символов и текстовым файлом заключается в том, что текстовый файл делится на строки, каждая из которых заканчивается специальным маркером конца строки, автоматически вставляемым системой. В следующем примере создается и записывается в текстовый файл с именем 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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Enter the file name:
contact.txt 
Completed writing

Присоединение к файлу

Присоединение к файлу означает запись в существующий файл, в котором уже есть некоторые данные, без перезаписи файла. Следующая программа иллюстрирует это –

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

begin
   assign(myfile, 'contact.txt');
   append(myfile);
   
   writeln('Contact Details');
   writeln('webmaster@tutorialspoint.com');
   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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Contact Details
webmaster@tutorialspoint.com
Note to Students:
For details information on Pascal Programming
Contact: Tutorials Point

Функции обработки файлов

Free Pascal предоставляет следующие функции / процедуры для обработки файлов –

Sr.No. Название и описание функции
1

процедура Append (var t: Text);

Открывает файл в режиме добавления

2

Назначение процедуры (out f: file; const Name :);

Присваивает имя файлу

3

Назначение процедуры (out f: file; p: PChar);

Присваивает имя файлу

4

Назначение процедуры (out f: file; c: Char);

Присваивает имя файлу

5

Назначение процедуры (out f: TypedFile; const Name :);

Присваивает имя файлу

6

процедура Assign (out f: TypedFile; p: PChar);

Присваивает имя файлу

7

процедура Assign (out f: TypedFile; c: Char);

Присваивает имя файлу

8

Назначение процедуры (out t: Text; const s :);

Присваивает имя файлу

9

Назначение процедуры (out t: Text; p: PChar);

Присваивает имя файлу

10

Назначение процедуры (out t: Text; c: Char);

Присваивает имя файлу

11

процедура BlockRead (var f: file; var Buf; count: Int64; var Res: Int64);

Читает данные из файла в память

12

процедура BlockRead (var f: file; var Buf; count: LongInt; var Result: LongInt);

Читает данные из файла в память

13

процедура BlockRead (var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Читает данные из файла в память

14

процедура BlockRead (var f: file; var Buf; count: Word; var var: Word);

Читает данные из файла в память

15

процедура BlockRead (var f: file; var Buf; count: Word; var Res: Integer);

Читает данные из файла в память

16

процедура BlockRead (var f: file; var Buf; count: Int64);

Читает данные из файла в память

17

процедура BlockWrite (var f: file; const Buf; Count: Int64; var Res: Int64);

Записывает данные из памяти в файл

18

процедура BlockWrite (var f: file; const Buf; Count: LongInt; var Result: LongInt);

Записывает данные из памяти в файл

19

процедура BlockWrite (var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Записывает данные из памяти в файл

20

процедура BlockWrite (var f: file; const Buf; Count: Word; var Res: Word);

Записывает данные из памяти в файл

21

процедура BlockWrite (var f: file; const Buf; Count: Word; var Result: Integer);

Записывает данные из памяти в файл

22

процедура BlockWrite (var f: file; const Buf; Count: LongInt);

Записывает данные из памяти в файл

23

Закрытие процедуры (var f: file);

Закрывает файл

24

процедура Close (var t: Text);

Закрывает файл

25

функция EOF (var f: file): Boolean;

Проверяет конец файла

26

функция EOF (var t: Text): Boolean;

Проверяет конец файла

27

функция EOF: Boolean;

Проверяет конец файла

28

function EOLn (var t: Text): Boolean;

Проверяет конец строки

29

функция EOLn: Boolean;

Проверяет конец строки

30

процедура Erase (var f: file);

Удаляет файл с диска

31

процедура Erase (var t: Text);

Удаляет файл с диска

32

функция FilePos (var f: file): Int64;

Положение в файле

33

функция FileSize (var f: file): Int64;

Размер файла

34

процедура Flush (var t: Text);

Записывает файловые буферы на диск

35

функция IOResult: Word;

Возвращает результат последней операции ввода-вывода файла

36

процедура Read (var F: Text; Args: Arguments);

Читает из файла в переменную

37

процедура Read (Аргументы: Аргументы);

Читает из файла в переменную

38

процедура ReadLn (var F: Text; Args: Arguments);

Читает из файла в переменную и перейти к следующей строке

39

процедура ReadLn (Args: Аргументы);

Читает из файла в переменную и перейти к следующей строке

40

процедура Rename (var f: file; const s :);

Переименовывает файл на диск

41

процедура Rename (var f: file; p: PChar);

Переименовывает файл на диск

42

процедура Rename (var f: file; c: Char);

Переименовывает файл на диск

43

процедура Rename (var t: Text; const s);

Переименовать файл на диске

44

процедура Rename (var t: Text; p: PChar);

Переименовывает файл на диск

45

процедура Rename (var t: Text; c: Char);

Переименовывает файл на диск

46

процедура Reset (var f: file; l: LongInt);

Открывает файл для чтения

47

Сброс процедуры (var f: file);

Открывает файл для чтения

48

процедура Reset (var f: TypedFile);

Открывает файл для чтения

49

процедура Reset (var t: Text);

Открывает файл для чтения

50

процедура Rewrite (var f: file; l: LongInt);

Открывает файл для записи

51

процедура переписать (var f: file);

Открывает файл для записи

52

процедура переписать (var f: TypedFile);

Открывает файл для записи

53

процедура переписать (var t: Text);

Открывает файл для записи

54

поиск процедуры (var f: file; Pos: Int64);

Устанавливает положение файла

55

function SeekEOF (var t: Text): Boolean;

Устанавливает позицию файла в конец файла

56

function SeekEOF: Boolean;

Устанавливает позицию файла в конец файла

57

function SeekEOLn (var t: Text): Boolean;

Устанавливает позицию файла в конец строки

58

function SeekEOLn: Boolean;

Устанавливает позицию файла в конец строки

59

процедура SetTextBuf (var f: Text; var Buf);

Устанавливает размер файлового буфера

60

процедура SetTextBuf (var f: Text; var Buf; Size: SizeInt);

Устанавливает размер файлового буфера

61

процедура Truncate (var F: file);

Усекать файл в позиции

62

процедура Write (Аргументы: Аргументы);

Записывает переменную в файл

63

процедура Write (var F: Text; Args: Arguments);

Записать переменную в файл

64

процедура Writeln (Аргументы: Аргументы);

Записывает переменную в файл и добавляет новую строку

65

процедура WriteLn (var F: Text; Args: Arguments);

Записывает переменную в файл и добавляет новую строку

процедура Append (var t: Text);

Открывает файл в режиме добавления

Назначение процедуры (out f: file; const Name :);

Присваивает имя файлу

Назначение процедуры (out f: file; p: PChar);

Присваивает имя файлу

Назначение процедуры (out f: file; c: Char);

Присваивает имя файлу

Назначение процедуры (out f: TypedFile; const Name :);

Присваивает имя файлу

процедура Assign (out f: TypedFile; p: PChar);

Присваивает имя файлу

процедура Assign (out f: TypedFile; c: Char);

Присваивает имя файлу

Назначение процедуры (out t: Text; const s :);

Присваивает имя файлу

Назначение процедуры (out t: Text; p: PChar);

Присваивает имя файлу

Назначение процедуры (out t: Text; c: Char);

Присваивает имя файлу

процедура BlockRead (var f: file; var Buf; count: Int64; var Res: Int64);

Читает данные из файла в память

процедура BlockRead (var f: file; var Buf; count: LongInt; var Result: LongInt);

Читает данные из файла в память

процедура BlockRead (var f: file; var Buf; count: Cardinal; var Result: Cardinal);

Читает данные из файла в память

процедура BlockRead (var f: file; var Buf; count: Word; var var: Word);

Читает данные из файла в память

процедура BlockRead (var f: file; var Buf; count: Word; var Res: Integer);

Читает данные из файла в память

процедура BlockRead (var f: file; var Buf; count: Int64);

Читает данные из файла в память

процедура BlockWrite (var f: file; const Buf; Count: Int64; var Res: Int64);

Записывает данные из памяти в файл

процедура BlockWrite (var f: file; const Buf; Count: LongInt; var Result: LongInt);

Записывает данные из памяти в файл

процедура BlockWrite (var f: file; const Buf; Count: Cardinal; var Result: Cardinal);

Записывает данные из памяти в файл

процедура BlockWrite (var f: file; const Buf; Count: Word; var Res: Word);

Записывает данные из памяти в файл

процедура BlockWrite (var f: file; const Buf; Count: Word; var Result: Integer);

Записывает данные из памяти в файл

процедура BlockWrite (var f: file; const Buf; Count: LongInt);

Записывает данные из памяти в файл

Закрытие процедуры (var f: file);

Закрывает файл

процедура Close (var t: Text);

Закрывает файл

функция EOF (var f: file): Boolean;

Проверяет конец файла

функция EOF (var t: Text): Boolean;

Проверяет конец файла

функция EOF: Boolean;

Проверяет конец файла

function EOLn (var t: Text): Boolean;

Проверяет конец строки

функция EOLn: Boolean;

Проверяет конец строки

процедура Erase (var f: file);

Удаляет файл с диска

процедура Erase (var t: Text);

Удаляет файл с диска

функция FilePos (var f: file): Int64;

Положение в файле

функция FileSize (var f: file): Int64;

Размер файла

процедура Flush (var t: Text);

Записывает файловые буферы на диск

функция IOResult: Word;

Возвращает результат последней операции ввода-вывода файла

процедура Read (var F: Text; Args: Arguments);

Читает из файла в переменную

процедура Read (Аргументы: Аргументы);

Читает из файла в переменную

процедура ReadLn (var F: Text; Args: Arguments);

Читает из файла в переменную и перейти к следующей строке

процедура ReadLn (Args: Аргументы);

Читает из файла в переменную и перейти к следующей строке

процедура Rename (var f: file; const s :);

Переименовывает файл на диск

процедура Rename (var f: file; p: PChar);

Переименовывает файл на диск

процедура Rename (var f: file; c: Char);

Переименовывает файл на диск

процедура Rename (var t: Text; const s);

Переименовать файл на диске

процедура Rename (var t: Text; p: PChar);

Переименовывает файл на диск

процедура Rename (var t: Text; c: Char);

Переименовывает файл на диск

процедура Reset (var f: file; l: LongInt);

Открывает файл для чтения

Сброс процедуры (var f: file);

Открывает файл для чтения

процедура Reset (var f: TypedFile);

Открывает файл для чтения

процедура Reset (var t: Text);

Открывает файл для чтения

процедура Rewrite (var f: file; l: LongInt);

Открывает файл для записи

процедура переписать (var f: file);

Открывает файл для записи

процедура переписать (var f: TypedFile);

Открывает файл для записи

процедура переписать (var t: Text);

Открывает файл для записи

поиск процедуры (var f: file; Pos: Int64);

Устанавливает положение файла

function SeekEOF (var t: Text): Boolean;

Устанавливает позицию файла в конец файла

function SeekEOF: Boolean;

Устанавливает позицию файла в конец файла

function SeekEOLn (var t: Text): Boolean;

Устанавливает позицию файла в конец строки

function SeekEOLn: Boolean;

Устанавливает позицию файла в конец строки

процедура SetTextBuf (var f: Text; var Buf);

Устанавливает размер файлового буфера

процедура SetTextBuf (var f: Text; var Buf; Size: SizeInt);

Устанавливает размер файлового буфера

процедура Truncate (var F: file);

Усекать файл в позиции

процедура Write (Аргументы: Аргументы);

Записывает переменную в файл

процедура Write (var F: Text; Args: Arguments);

Записать переменную в файл

процедура Writeln (Аргументы: Аргументы);

Записывает переменную в файл и добавляет новую строку

процедура WriteLn (var F: Text; Args: Arguments);

Записывает переменную в файл и добавляет новую строку

Паскаль – Управление памятью

Эта глава объясняет динамическое управление памятью в Pascal. Язык программирования Pascal предоставляет несколько функций для выделения памяти и управления.

Выделение памяти динамически

Во время программирования, если вы знаете размер массива, это легко, и вы можете определить его как массив. Например, чтобы сохранить имя любого человека, оно может содержать до 100 символов, чтобы вы могли определить что-то следующим образом:

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

Но теперь давайте рассмотрим ситуацию, когда у вас нет представления о длине текста, который нужно сохранить, например, вы хотите сохранить подробное описание по теме. Здесь нам нужно определить указатель на строку, не определяя, сколько памяти требуется.

Паскаль предоставляет новую процедуру для создания переменных указателя.

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Теперь, если вам нужно определить указатель с определенным количеством байтов, чтобы он мог ссылаться на него позже, вы должны использовать функцию getmem или процедуру getmem , которая имеет следующий синтаксис:

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

function GetMem(
   size: PtrUInt
):pointer;

В предыдущем примере мы объявили указатель на строку. Строка имеет максимальное значение 255 байтов. Если вам действительно не нужно так много места или больше места в байтах, подпрограмма getmem позволяет указать это. Давайте перепишем предыдущий пример, используя getmem

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Таким образом, у вас есть полный контроль, и вы можете передавать любое значение размера при выделении памяти в отличие от массивов, где после определения размер не может быть изменен.

Изменение размера и освобождение памяти

Когда ваша программа выходит, операционная система автоматически освобождает всю память, выделенную вашей программой, но в качестве хорошей практики, когда вам больше не нужна память, вы должны освободить эту память.

Паскаль предоставляет процедуру dispose для освобождения динамически создаваемой переменной с использованием процедуры new. Если вы выделили память с помощью подпрограммы getmem , то вам нужно использовать freemem подпрограммы, чтобы освободить эту память. Подпрограммы freemem имеют следующий синтаксис –

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

function Freemem(
   p: pointer
):PtrUInt;

Кроме того, вы можете увеличить или уменьшить размер выделенного блока памяти, вызвав функцию ReAllocMem . Давайте еще раз проверим вышеуказанную программу и воспользуемся подпрограммами ReAllocMem и freemem . Ниже приводится синтаксис для ReAllocMem

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

Ниже приведен пример использования подпрограмм ReAllocMem и freemem:

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Функции управления памятью

Паскаль предоставляет множество функций управления памятью, которые используются для реализации различных структур данных и реализации низкоуровневого программирования на Паскале. Многие из этих функций зависят от реализации. Free Pascal предоставляет следующие функции и процедуры для управления памятью –

SN Название и описание функции
1

function Addr (X: TAnytype): указатель;

Возвращает адрес переменной

2

Назначенная функция (P: указатель): Boolean;

Проверяет правильность указателя

3

функция CompareByte (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

4

функция CompareChar (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

5

функция CompareDWord (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

6

функция CompareWord (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

7

функция Cseg: Word;

Возвращает сегмент кода

8

процедура Dispose (P: указатель);

Освобождает динамически выделяемую память

9

процедура Dispose (P: TypedPointer; Des: TProcedure);

Освобождает динамически выделяемую память

10

функция Dseg: Word;

Возвращает сегмент данных

11

процедура FillByte (var x; count: SizeInt; значение: Byte);

Заполняет область памяти 8-битным шаблоном

12

процедура FillChar (var x; count: SizeInt; Значение: Byte | Boolean | Char);

Заполняет область памяти определенным символом

13

процедура FillDWord (var x; count: SizeInt; значение: DWord);

Заполняет область памяти 32-битным шаблоном

14

процедура FillQWord (var x; count: SizeInt; значение: QWord);

Заполняет область памяти 64-битным шаблоном

15 процедура FillWord (var x; count: SizeInt; Value: Word);

Заполняет область памяти 16-битным шаблоном

16

процедура Freemem (p: указатель; размер: PtrUInt);

Освобождает выделенную память

17

процедура Freemem (p: указатель);

Освобождает выделенную память

18

процедура Getmem (out p: указатель; размер: PtrUInt);

Выделяет новую память

19

процедура Getmem (out p: указатель);

Выделяет новую память

20

процедура GetMemoryManager (var MemMgr: TMemoryManager);

Возвращает текущий менеджер памяти

21

функция High (Arg: TypeOrVariable): TOrdinal;

Возвращает максимальный индекс открытого массива или перечисления

22

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

Находит значение в байтах в диапазоне памяти

23

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

Находит значение размера символа в диапазоне памяти

24

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

Находит значение размера DWord (32-разрядное) в диапазоне памяти

25

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

Находит значение размера QWord в диапазоне памяти

26

Функция Indexword (const buf; len: SizeInt; b: Word): SizeInt;

Находит значение размера слова в диапазоне памяти

27

function IsMemoryManagerSet: Boolean;

Установлен ли менеджер памяти

28

функция Low (Arg: TypeOrVariable): TOrdinal;

Возвращает самый низкий индекс открытого массива или перечисления

29

процедура Move (постоянный источник; var dest; count: SizeInt);

Перемещает данные из одного места в памяти в другое

30

процедура MoveChar0 (const buf1; var buf2; len: SizeInt);

Перемещает данные до первого нулевого символа

31

процедура New (var P: Pointer);

Динамически распределять память для переменной

32

процедура New (вар P: указатель; минусы: TProcedure);

Динамически распределяет память для переменной

33

функция Ofs (var X): LongInt;

Возвращает смещение переменной

34

функция ptr (sel: LongInt; off: LongInt): farpointer;

Объединяет сегмент и смещение к указателю

35

функция ReAllocMem (var p: указатель; размер: PtrUInt): указатель;

Изменяет размер блока памяти в куче

36

функция Seg (var X): LongInt;

Возвращает сегмент

37

процедура SetMemoryManager (const MemMgr: TMemoryManager);

Устанавливает менеджер памяти

38

функция Sptr: указатель;

Возвращает текущий указатель стека

39

функция Sseg: Word;

Возвращает значение регистра сегмента стека

function Addr (X: TAnytype): указатель;

Возвращает адрес переменной

Назначенная функция (P: указатель): Boolean;

Проверяет правильность указателя

функция CompareByte (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

функция CompareChar (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

функция CompareDWord (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

функция CompareWord (const buf1; const buf2; len: SizeInt): SizeInt;

Сравнивает 2 буфера памяти байт на байт

функция Cseg: Word;

Возвращает сегмент кода

процедура Dispose (P: указатель);

Освобождает динамически выделяемую память

процедура Dispose (P: TypedPointer; Des: TProcedure);

Освобождает динамически выделяемую память

функция Dseg: Word;

Возвращает сегмент данных

процедура FillByte (var x; count: SizeInt; значение: Byte);

Заполняет область памяти 8-битным шаблоном

процедура FillChar (var x; count: SizeInt; Значение: Byte | Boolean | Char);

Заполняет область памяти определенным символом

процедура FillDWord (var x; count: SizeInt; значение: DWord);

Заполняет область памяти 32-битным шаблоном

процедура FillQWord (var x; count: SizeInt; значение: QWord);

Заполняет область памяти 64-битным шаблоном

Заполняет область памяти 16-битным шаблоном

процедура Freemem (p: указатель; размер: PtrUInt);

Освобождает выделенную память

процедура Freemem (p: указатель);

Освобождает выделенную память

процедура Getmem (out p: указатель; размер: PtrUInt);

Выделяет новую память

процедура Getmem (out p: указатель);

Выделяет новую память

процедура GetMemoryManager (var MemMgr: TMemoryManager);

Возвращает текущий менеджер памяти

функция High (Arg: TypeOrVariable): TOrdinal;

Возвращает максимальный индекс открытого массива или перечисления

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

Находит значение в байтах в диапазоне памяти

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

Находит значение размера символа в диапазоне памяти

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

Находит значение размера DWord (32-разрядное) в диапазоне памяти

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

Находит значение размера QWord в диапазоне памяти

Функция Indexword (const buf; len: SizeInt; b: Word): SizeInt;

Находит значение размера слова в диапазоне памяти

function IsMemoryManagerSet: Boolean;

Установлен ли менеджер памяти

функция Low (Arg: TypeOrVariable): TOrdinal;

Возвращает самый низкий индекс открытого массива или перечисления

процедура Move (постоянный источник; var dest; count: SizeInt);

Перемещает данные из одного места в памяти в другое

процедура MoveChar0 (const buf1; var buf2; len: SizeInt);

Перемещает данные до первого нулевого символа

процедура New (var P: Pointer);

Динамически распределять память для переменной

процедура New (вар P: указатель; минусы: TProcedure);

Динамически распределяет память для переменной

функция Ofs (var X): LongInt;

Возвращает смещение переменной

функция ptr (sel: LongInt; off: LongInt): farpointer;

Объединяет сегмент и смещение к указателю

функция ReAllocMem (var p: указатель; размер: PtrUInt): указатель;

Изменяет размер блока памяти в куче

функция Seg (var X): LongInt;

Возвращает сегмент

процедура SetMemoryManager (const MemMgr: TMemoryManager);

Устанавливает менеджер памяти

функция Sptr: указатель;

Возвращает текущий указатель стека

функция Sseg: Word;

Возвращает значение регистра сегмента стека

Паскаль – Единицы

Программа на Паскале может состоять из модулей, называемых модулями. Модуль может состоять из нескольких блоков кода, которые, в свою очередь, состоят из переменных и объявлений типов, операторов, процедур и т. Д. В Pascal есть много встроенных модулей, и Pascal позволяет программистам определять и записывать свои собственные используемые модули. позже в различных программах.

Использование встроенных модулей

Как встроенные, так и определяемые пользователем модули включаются в программу с помощью использования. Мы уже использовали модуль вариантов в учебнике по Паскалю – Варианты . В этом руководстве объясняется создание и включение пользовательских единиц. Тем не менее, давайте сначала посмотрим, как включить встроенный модуль CRT в вашу программу –

program myprog;
uses crt;

Следующий пример иллюстрирует использование модуля crt

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.

Это та же самая программа, которую мы использовали в самом начале урока по Паскалю, скомпилируйте и запустите ее, чтобы найти результаты изменений.

Создание и использование модуля Pascal

Чтобы создать модуль, вам нужно написать модули или подпрограммы, которые вы хотите сохранить в нем, и сохранить его в файле с расширением .pas . Первая строка этого файла должна начинаться с ключевого слова unit, за которым следует имя модуля. Например –

unit calculateArea;

Ниже приведены три важных шага в создании модуля Pascal –

  • Название файла и название устройства должны быть точно такими же. Таким образом, наш модуль CalculayArea будет сохранен в файле с именем calcArea.pas.

  • Следующая строка должна состоять из единственного ключевого интерфейса . После этой строки вы напишите декларации для всех функций и процедур, которые появятся в этом модуле.

  • Сразу после объявления функции напишите слово реализация , которое снова является ключевым словом. После строки, содержащей ключевое слово реализации, укажите все подпрограммы.

Название файла и название устройства должны быть точно такими же. Таким образом, наш модуль CalculayArea будет сохранен в файле с именем calcArea.pas.

Следующая строка должна состоять из единственного ключевого интерфейса . После этой строки вы напишите декларации для всех функций и процедур, которые появятся в этом модуле.

Сразу после объявления функции напишите слово реализация , которое снова является ключевым словом. После строки, содержащей ключевое слово реализации, укажите все подпрограммы.

Следующая программа создает модуль с именем 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.

Далее, давайте напишем простую программу, которая будет использовать модуль, который мы определили выше –

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Паскаль – дата и время

Большинство программ, которые вы пишете, нуждаются в реализации некоторой формы функций даты, возвращающих текущую дату и время. Свидания настолько важны в повседневной жизни, что с ними легко работать, не задумываясь. Паскаль также предоставляет мощные инструменты для арифметики дат, которые упрощают манипулирование датами. Однако фактическое имя и работа этих функций различны для разных компиляторов.

Получение текущей даты и времени

Функция Pascal TimeToString дает вам текущее время в форме с разделителями (:). В следующем примере показано, как получить текущее время –

Live Demo

program TimeDemo;
uses sysutils;

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

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат –

Current time : 18:33:08

Функция Date возвращает текущую дату в формате TDateTime . TDateTime – это двойное значение, которое требует некоторого декодирования и форматирования. Следующая программа демонстрирует, как использовать ее в вашей программе для отображения текущей даты:

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.

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат –

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

Функция Now возвращает текущую дату и время –

Live Demo

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

Когда приведенный выше код был скомпилирован и выполнен, он дает следующий результат –

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

Free Pascal предоставляет простую структуру меток времени с именем TTimeStamp , которая имеет следующий формат:

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

Различные функции даты и времени

Free Pascal предоставляет следующие функции даты и времени –

Sr.No. Название и описание функции
1

function DateTimeToFileDate (DateTime: TDateTime): LongInt;

Преобразует тип DateTime в дату файла.

2

Функция DateTimeToStr (DateTime: TDateTime) :;

Создает строковое представление DateTime

3

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

Создает строковое представление DateTime

4

процедура DateTimeToString (out Результат:; const FormatStr:; const DateTime: TDateTime);

Создает строковое представление DateTime

5

процедура DateTimeToString (out Результат:; const FormatStr:; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Создает строковое представление DateTime

6

процедура DateTimeToSystemTime (DateTime: TDateTime; выход SystemTime: TSystemTime);

Преобразует DateTime в системное время

7

function DateTimeToTimeStamp (DateTime: TDateTime): TTimeStamp; Преобразует DateTime в метку времени

8

Функция DateToStr (Date: TDateTime) :;

Создает строковое представление даты

9

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

Создает строковое представление даты

10

Функция Date: TDateTime;

Получает текущую дату

11

function DayOfWeek (DateTime: TDateTime): Integer;

Получает день недели

12

процедура DecodeDate (Дата: TDateTime; год выхода: слово; месяц выхода: слово; день выхода: слово);

Декодирует DateTime в год, месяц и день

13

процедура DecodeTime (время: TDateTime; вне часа: слово; вне минуты: слово; вне секунды: слово; вне миллисекунды: слово);

Декодирует DateTime в часы, минуты и секунды

14

функция EncodeDate (год: слово; месяц: слово; день: слово): TDateTime;

Кодирует год, день и месяц в DateTime

15

функция EncodeTime (час: слово; минута: слово; секунда: слово; миллисекунда: слово): TDateTime;

Кодирует часы, минуты и секунды в DateTime

16

Функция FormatDateTime (const FormatStr:; DateTime: TDateTime) :;

Возвращает строковое представление DateTime

17

функция FormatDateTime (const FormatStr:; DateTime: TDateTime; const FormatSettings: TFormatSettings) :;

Возвращает строковое представление DateTime

18

функция IncMonth (const DateTime: TDateTime; NumberOfMonths: Integer = 1): TDateTime;

Добавляет 1 к месяцу

19

function IsLeapYear (Год: Слово): Boolean;

Определяет, является ли год високосным

20

function MSecsToTimeStamp (MSecs: Comp): TTimeStamp;

Преобразует количество миллисекунд в метку времени

21

функция сейчас: TDateTime;

Получает текущую дату и время

22

function StrToDateTime (const S :): TDateTime;

Преобразует строку в DateTime

23

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

Преобразует строку в DateTime

24

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

Преобразует строку в DateTime

25

function StrToDate (const S: ShortString): TDateTime;

Преобразует строку в дату

26

function StrToDate (const S: Ansistring): TDateTime;

Преобразует строку в дату

27

function StrToDate (const S: ShortString; разделитель: Char): TDateTime;

Преобразует строку в дату

28

function StrToDate (const S: AnsiString; разделитель: Char): TDateTime;

Преобразует строку в дату

29

function StrToDate (const S: ShortString; const useformat:; разделитель: Char): TDateTime;

Преобразует строку в дату

30

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

Преобразует строку в дату

31

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

Преобразует строку в дату

32

function StrToTime (const S: Shortstring): TDateTime;

Преобразует строку во время

33

function StrToTime (const S: Ansistring): TDateTime;

Преобразует строку во время

34

function StrToTime (const S: ShortString; разделитель: Char): TDateTime;

Преобразует строку во время

35

function StrToTime (const S: AnsiString; разделитель: Char): TDateTime;

Преобразует строку во время

36

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

Преобразует строку во время

37

function StrToTime (const S: PChar; Len: Integer; разделитель: Char = # 0): TDateTime;

Преобразует строку во время

38

function SystemTimeToDateTime (const SystemTime: TSystemTime): TDateTime;

Преобразует системное время в datetime

39

function TimeStampToDateTime (const TimeStamp: TTimeStamp): TDateTime;

Преобразует метку времени в DateTime

40

function TimeStampToMSecs (const TimeStamp: TTimeStamp): comp;

Преобразует метку времени в количество миллисекунд

41

функция TimeToStr (Time: TDateTime) :;

Возвращает строковое представление времени

42

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

Возвращает строковое представление времени

43

функция Time: TDateTime;

Получить текущее время

function DateTimeToFileDate (DateTime: TDateTime): LongInt;

Преобразует тип DateTime в дату файла.

Функция DateTimeToStr (DateTime: TDateTime) :;

Создает строковое представление DateTime

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

Создает строковое представление DateTime

процедура DateTimeToString (out Результат:; const FormatStr:; const DateTime: TDateTime);

Создает строковое представление DateTime

процедура DateTimeToString (out Результат:; const FormatStr:; const DateTime: TDateTime; const FormatSettings: TFormatSettings);

Создает строковое представление DateTime

процедура DateTimeToSystemTime (DateTime: TDateTime; выход SystemTime: TSystemTime);

Преобразует DateTime в системное время

function DateTimeToTimeStamp (DateTime: TDateTime): TTimeStamp; Преобразует DateTime в метку времени

Функция DateToStr (Date: TDateTime) :;

Создает строковое представление даты

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

Создает строковое представление даты

Функция Date: TDateTime;

Получает текущую дату

function DayOfWeek (DateTime: TDateTime): Integer;

Получает день недели

процедура DecodeDate (Дата: TDateTime; год выхода: слово; месяц выхода: слово; день выхода: слово);

Декодирует DateTime в год, месяц и день

процедура DecodeTime (время: TDateTime; вне часа: слово; вне минуты: слово; вне секунды: слово; вне миллисекунды: слово);

Декодирует DateTime в часы, минуты и секунды

функция EncodeDate (год: слово; месяц: слово; день: слово): TDateTime;

Кодирует год, день и месяц в DateTime

функция EncodeTime (час: слово; минута: слово; секунда: слово; миллисекунда: слово): TDateTime;

Кодирует часы, минуты и секунды в DateTime

Функция FormatDateTime (const FormatStr:; DateTime: TDateTime) :;

Возвращает строковое представление DateTime

функция FormatDateTime (const FormatStr:; DateTime: TDateTime; const FormatSettings: TFormatSettings) :;

Возвращает строковое представление DateTime

функция IncMonth (const DateTime: TDateTime; NumberOfMonths: Integer = 1): TDateTime;

Добавляет 1 к месяцу

function IsLeapYear (Год: Слово): Boolean;

Определяет, является ли год високосным

function MSecsToTimeStamp (MSecs: Comp): TTimeStamp;

Преобразует количество миллисекунд в метку времени

функция сейчас: TDateTime;

Получает текущую дату и время

function StrToDateTime (const S :): TDateTime;

Преобразует строку в DateTime

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

Преобразует строку в DateTime

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

Преобразует строку в DateTime

function StrToDate (const S: ShortString): TDateTime;

Преобразует строку в дату

function StrToDate (const S: Ansistring): TDateTime;

Преобразует строку в дату

function StrToDate (const S: ShortString; разделитель: Char): TDateTime;

Преобразует строку в дату

function StrToDate (const S: AnsiString; разделитель: Char): TDateTime;

Преобразует строку в дату

function StrToDate (const S: ShortString; const useformat:; разделитель: Char): TDateTime;

Преобразует строку в дату

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

Преобразует строку в дату

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

Преобразует строку в дату

function StrToTime (const S: Shortstring): TDateTime;

Преобразует строку во время

function StrToTime (const S: Ansistring): TDateTime;

Преобразует строку во время

function StrToTime (const S: ShortString; разделитель: Char): TDateTime;

Преобразует строку во время

function StrToTime (const S: AnsiString; разделитель: Char): TDateTime;

Преобразует строку во время

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

Преобразует строку во время

function StrToTime (const S: PChar; Len: Integer; разделитель: Char = # 0): TDateTime;

Преобразует строку во время

function SystemTimeToDateTime (const SystemTime: TSystemTime): TDateTime;

Преобразует системное время в datetime

function TimeStampToDateTime (const TimeStamp: TTimeStamp): TDateTime;

Преобразует метку времени в DateTime

function TimeStampToMSecs (const TimeStamp: TTimeStamp): comp;

Преобразует метку времени в количество миллисекунд

функция TimeToStr (Time: TDateTime) :;

Возвращает строковое представление времени

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

Возвращает строковое представление времени

функция Time: TDateTime;

Получить текущее время

Следующий пример иллюстрирует использование некоторых из вышеуказанных функций –

Live Demo

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.

Когда приведенный выше код был скомпилирован и выполнен, он дал следующий результат:

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

Паскаль – объектно-ориентированный

Мы можем представить нашу вселенную, сделанную из различных объектов, таких как солнце, земля, луна и т. Д. Точно так же мы можем представить нашу машину, сделанную из различных объектов, таких как колесо, рулевое управление, шестерня и т. Д. Таким же образом, существуют концепции объектно-ориентированного программирования, которые принять все как объект и реализовать программное обеспечение, используя различные объекты. В Паскале есть два структурных типа данных, используемых для реализации объекта реального мира –

  • Типы объектов
  • Типы классов

Объектно-ориентированные концепции

Прежде чем мы углубимся в детали, давайте определим важные термины Паскаля, связанные с Объектно-ориентированным Паскалем.

  • Object – объект – это особый вид записи, который содержит поля, подобные записи; однако, в отличие от записей, объекты содержат процедуры и функции как часть объекта. Эти процедуры и функции хранятся как указатели на методы, связанные с типом объекта.

  • Класс – класс определяется почти так же, как и объект, но существует различие в том, как они создаются. Класс размещается в куче программы, а объект – в стеке. Это указатель на объект, а не сам объект.

  • Создание класса – создание означает создание переменной этого типа класса. Поскольку класс является просто указателем, когда объявляется переменная типа класса, память выделяется только для указателя, а не для всего объекта. Только когда он создается с использованием одного из своих конструкторов, память выделяется для объекта. Экземпляры класса также называются «объектами», но не путайте их с объектами Object Pascal. В этом уроке мы напишем «Объект» для объектов Pascal и «Объект» для концептуального объекта или экземпляра класса.

  • Переменные-члены – это переменные, определенные внутри класса или объекта.

  • Функции-члены – это функции или процедуры, определенные внутри класса или объекта и используемые для доступа к данным объекта.

  • Видимость членов – члены объекта или класса также называются полями. Эти поля имеют различную видимость. Видимость относится к доступности членов, т. Е. Точно, где эти члены будут доступны. Объекты имеют три уровня видимости: открытый, закрытый и защищенный. Классы имеют пять типов видимости: публичный, частный, строго приватный, защищенный и опубликованный. Мы обсудим видимость в деталях.

  • Наследование. Когда класс определяется путем наследования существующих функций родительского класса, он считается наследуемым. Здесь дочерний класс будет наследовать все или несколько функций-членов и переменных родительского класса. Объекты также могут быть унаследованы.

  • Родительский класс – класс, который наследуется другим классом. Это также называется базовым классом или суперклассом.

  • Дочерний класс – класс, который наследуется от другого класса. Это также называется подклассом или производным классом.

  • Полиморфизм – это объектно-ориентированная концепция, в которой одна и та же функция может использоваться для разных целей. Например, имя функции останется прежним, но оно может принимать разное количество аргументов и может выполнять разные задачи. Классы Pascal реализуют полиморфизм. Объекты не реализуют полиморфизм.

  • Перегрузка – это тип полиморфизма, при котором некоторые или все операторы имеют разные реализации в зависимости от типов их аргументов. Аналогично функции также могут быть перегружены с другой реализацией. Классы Pascal реализуют перегрузку, а объекты – нет.

  • Абстракция данных – любое представление данных, в котором скрыты (абстрагированы) детали реализации.

  • Инкапсуляция – Относится к концепции, в которой мы инкапсулируем все данные и функции-члены вместе, чтобы сформировать объект.

  • Конструктор. Относится к специальному типу функции, которая будет вызываться автоматически при создании объекта из класса или объекта.

  • Destructor – относится к специальному типу функции, которая будет вызываться автоматически всякий раз, когда объект или класс удаляется или выходит из области видимости.

Object – объект – это особый вид записи, который содержит поля, подобные записи; однако, в отличие от записей, объекты содержат процедуры и функции как часть объекта. Эти процедуры и функции хранятся как указатели на методы, связанные с типом объекта.

Класс – класс определяется почти так же, как и объект, но существует различие в том, как они создаются. Класс размещается в куче программы, а объект – в стеке. Это указатель на объект, а не сам объект.

Создание класса – создание означает создание переменной этого типа класса. Поскольку класс является просто указателем, когда объявляется переменная типа класса, память выделяется только для указателя, а не для всего объекта. Только когда он создается с использованием одного из своих конструкторов, память выделяется для объекта. Экземпляры класса также называются «объектами», но не путайте их с объектами Object Pascal. В этом уроке мы напишем «Объект» для объектов Pascal и «Объект» для концептуального объекта или экземпляра класса.

Переменные-члены – это переменные, определенные внутри класса или объекта.

Функции-члены – это функции или процедуры, определенные внутри класса или объекта и используемые для доступа к данным объекта.

Видимость членов – члены объекта или класса также называются полями. Эти поля имеют различную видимость. Видимость относится к доступности членов, т. Е. Точно, где эти члены будут доступны. Объекты имеют три уровня видимости: открытый, закрытый и защищенный. Классы имеют пять типов видимости: публичный, частный, строго приватный, защищенный и опубликованный. Мы обсудим видимость в деталях.

Наследование. Когда класс определяется путем наследования существующих функций родительского класса, он считается наследуемым. Здесь дочерний класс будет наследовать все или несколько функций-членов и переменных родительского класса. Объекты также могут быть унаследованы.

Родительский класс – класс, который наследуется другим классом. Это также называется базовым классом или суперклассом.

Дочерний класс – класс, который наследуется от другого класса. Это также называется подклассом или производным классом.

Полиморфизм – это объектно-ориентированная концепция, в которой одна и та же функция может использоваться для разных целей. Например, имя функции останется прежним, но оно может принимать разное количество аргументов и может выполнять разные задачи. Классы Pascal реализуют полиморфизм. Объекты не реализуют полиморфизм.

Перегрузка – это тип полиморфизма, при котором некоторые или все операторы имеют разные реализации в зависимости от типов их аргументов. Аналогично функции также могут быть перегружены с другой реализацией. Классы Pascal реализуют перегрузку, а объекты – нет.

Абстракция данных – любое представление данных, в котором скрыты (абстрагированы) детали реализации.

Инкапсуляция – Относится к концепции, в которой мы инкапсулируем все данные и функции-члены вместе, чтобы сформировать объект.

Конструктор. Относится к специальному типу функции, которая будет вызываться автоматически при создании объекта из класса или объекта.

Destructor – относится к специальному типу функции, которая будет вызываться автоматически всякий раз, когда объект или класс удаляется или выходит из области видимости.

Определение объектов Паскаля

Объект объявляется с помощью объявления типа. Общая форма объявления объекта выглядит следующим образом:

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

Давайте определим объект Rectangle, который имеет два элемента данных целочисленного типа – длину и ширину и несколько функций-членов для управления этими элементами данных и процедуру рисования прямоугольника.

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;

После создания ваших объектов вы сможете вызывать функции-члены, связанные с этим объектом. Одна функция-член сможет обрабатывать только переменную-член связанного объекта.

В следующем примере показано, как установить длину и ширину для двух прямоугольных объектов и нарисовать их, вызвав функции-члены.

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);

Ниже приведен полный пример, демонстрирующий использование объектов в Паскале.

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Видимость членов объекта

Видимость указывает на доступность членов объекта. Члены объекта Pascal имеют три типа видимости –

Sr.No Видимость и доступность
1

общественного

Члены могут использоваться другими блоками вне программного блока

2

Частный

Члены доступны только в текущем блоке.

3

защищенный

Члены доступны только для объектов, произошедших от родительского объекта.

общественного

Члены могут использоваться другими блоками вне программного блока

Частный

Члены доступны только в текущем блоке.

защищенный

Члены доступны только для объектов, произошедших от родительского объекта.

По умолчанию поля и методы объекта являются общедоступными и экспортируются за пределы текущей единицы.

Конструкторы и деструкторы для объектов Pascal –

Конструкторы – это особый тип методов, которые вызываются автоматически при создании объекта. Вы создаете конструктор в Pascal, просто объявив метод с помощью конструктора ключевых слов. Условно имя метода – Init, однако вы можете указать любой собственный действительный идентификатор. Вы можете передать столько аргументов, сколько захотите, в функцию конструктора.

Деструкторы – это методы, которые вызываются при уничтожении объекта. Методы деструктора уничтожают любое выделение памяти, созданное конструкторами.

Следующий пример предоставит конструктор и деструктор для класса Rectangle, который будет инициализировать длину и ширину для прямоугольника во время создания объекта и уничтожать его, когда он выходит из области видимости.

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

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

Наследование для объектов Pascal

Объекты Pascal могут при желании наследоваться от родительского объекта. Следующая программа иллюстрирует наследование в объектах Pascal. Давайте создадим еще один объект с именем TableTop , который наследуется от объекта Rectangle.

Live Demo

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.

Ниже приведены важные моменты, которые следует отметить –

  • Объект Tabletop унаследовал все члены объекта Rectangle.

  • В TableTop также есть метод draw. Когда метод draw вызывается с использованием объекта TableTop, вызывается метод рисования TableTop.

  • Существует неявный экземпляр с именем self, который ссылается на текущий экземпляр объекта.

Объект Tabletop унаследовал все члены объекта Rectangle.

В TableTop также есть метод draw. Когда метод draw вызывается с использованием объекта TableTop, вызывается метод рисования TableTop.

Существует неявный экземпляр с именем self, который ссылается на текущий экземпляр объекта.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Table Top: 3 by 7
Material: Wood

Calling the Draw Method 
* * * * * * *
* * * * * * *
* * * * * * *
Material: Wood

Паскаль – Классы

Вы видели, что объекты Pascal обладают некоторыми характеристиками объектно-ориентированной парадигмы. Они реализуют инкапсуляцию, сокрытие данных и наследование, но у них также есть ограничения. Например, объекты Pascal не участвуют в полиморфизме. Поэтому классы широко используются для реализации правильного объектно-ориентированного поведения в программе, особенно в программном обеспечении на основе графического интерфейса.

Класс определяется почти так же, как объект, но является указателем на объект, а не на сам объект. Технически это означает, что класс размещается в куче программы, а объект – в стеке. Другими словами, когда вы объявляете переменную типа объекта, она занимает столько же места в стеке, сколько и размер объекта, но когда вы объявляете переменную типа класса, она всегда принимает размер указателя в стеке. Фактические данные класса будут в куче.

Определение классов Паскаля

Класс объявляется так же, как объект, используя объявление типа. Общая форма объявления класса выглядит следующим образом:

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;

Стоит отметить следующие важные моменты –

  • Определения классов должны входить только в часть описания типа программы.

  • Класс определяется с помощью ключевого слова class .

  • Поля – это элементы данных, которые существуют в каждом экземпляре класса.

  • Методы объявляются в определении класса.

  • Существует предопределенный конструктор с именем Create в классе Root. Каждый абстрактный класс и каждый конкретный класс является потомком Root, поэтому у всех классов есть хотя бы один конструктор.

  • В классе Root есть предопределенный деструктор Destroy . Каждый абстрактный класс и каждый конкретный класс является потомком Root, поэтому у всех классов есть по крайней мере один деструктор.

Определения классов должны входить только в часть описания типа программы.

Класс определяется с помощью ключевого слова class .

Поля – это элементы данных, которые существуют в каждом экземпляре класса.

Методы объявляются в определении класса.

Существует предопределенный конструктор с именем Create в классе Root. Каждый абстрактный класс и каждый конкретный класс является потомком Root, поэтому у всех классов есть хотя бы один конструктор.

В классе Root есть предопределенный деструктор Destroy . Каждый абстрактный класс и каждый конкретный класс является потомком Root, поэтому у всех классов есть по крайней мере один деструктор.

Давайте определим класс Rectangle, который имеет два члена-данных целочисленного типа – длину и ширину, а также некоторые функции-члены для управления этими элементами-данными и процедуру рисования прямоугольника.

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;

Давайте напишем полную программу, которая создаст экземпляр класса прямоугольника и нарисует прямоугольник. Это тот же пример, который мы использовали при обсуждении объектов Pascal. Вы найдете, что обе программы почти одинаковы, за следующими исключениями –

  • Вам нужно будет включить директиву {$ mode objfpc} для использования классов.

  • Вам нужно будет включить директиву {$ m +} для использования конструкторов.

  • Создание экземпляров класса отличается от создания объектов. Только объявление переменной не создает пространство для экземпляра, вы будете использовать конструктор create для выделения памяти.

Вам нужно будет включить директиву {$ mode objfpc} для использования классов.

Вам нужно будет включить директиву {$ m +} для использования конструкторов.

Создание экземпляров класса отличается от создания объектов. Только объявление переменной не создает пространство для экземпляра, вы будете использовать конструктор create для выделения памяти.

Вот полный пример –

Live Demo

{$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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Draw Rectangle: 3 by 7
* * * * * * *
* * * * * * *
* * * * * * *
Draw Rectangle: 4 by 6
* * * * * * 
* * * * * * 
* * * * * * 
* * * * * * 

Видимость участников класса

Видимость указывает на доступность членов класса. Члены класса Паскаль имеют пять видов видимости –

Sr.No Видимость и доступность
1

общественного

Эти участники всегда доступны.

2

Частный

Эти члены могут быть доступны только в модуле или модуле, который содержит определение класса. К ним можно получить доступ из методов класса или извне.

3

Строгий Частный

Эти члены могут быть доступны только из методов самого класса. Другие классы или дочерние классы в том же модуле не могут получить к ним доступ.

4

защищенный

Это то же самое, что и private, за исключением того, что эти члены доступны для потомков, даже если они реализованы в других модулях.

5

опубликованный

Это то же самое, что и Public, но компилятор генерирует информацию о типе, которая необходима для автоматической потоковой передачи этих классов, если компилятор находится в состоянии {$ M +}. Поля, определенные в опубликованном разделе, должны иметь тип класса.

общественного

Эти участники всегда доступны.

Частный

Эти члены могут быть доступны только в модуле или модуле, который содержит определение класса. К ним можно получить доступ из методов класса или извне.

Строгий Частный

Эти члены могут быть доступны только из методов самого класса. Другие классы или дочерние классы в том же модуле не могут получить к ним доступ.

защищенный

Это то же самое, что и private, за исключением того, что эти члены доступны для потомков, даже если они реализованы в других модулях.

опубликованный

Это то же самое, что и Public, но компилятор генерирует информацию о типе, которая необходима для автоматической потоковой передачи этих классов, если компилятор находится в состоянии {$ M +}. Поля, определенные в опубликованном разделе, должны иметь тип класса.

Конструкторы и деструкторы для классов Паскаля

Конструкторы – это специальные методы, которые вызываются автоматически при создании объекта. Таким образом, мы в полной мере используем это поведение, инициализируя многие вещи через функции конструктора.

Паскаль предоставляет специальную функцию create () для определения конструктора. Вы можете передать столько аргументов, сколько захотите, в функцию конструктора.

Следующий пример создаст один конструктор для класса с именем Books и инициализирует цену и заголовок для книги во время создания объекта.

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Title: Physics for High School
Price: 10
Title: Advanced Chemistry
Price: 15
Title: Algebra
Price: 7

Как и неявный конструктор с именем create, существует также неявный метод деструктора destroy, с помощью которого вы можете высвободить все ресурсы, используемые в классе.

наследование

Определения класса Pascal могут при желании наследоваться от определения родительского класса. Синтаксис выглядит следующим образом –

type
childClas-identifier = class(baseClass-identifier) 
< members >
end; 

В следующем примере представлен класс Novel, который наследует класс Books и добавляет дополнительные функциональные возможности в зависимости от требований.

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

Title: Gone with the Wind
Price: 375.99
Author: Margaret Mitchell
Title: Atlas Shrugged
Price: 467.75
Author: Ayn Rand

Стоит отметить следующие важные моменты –

  • Члены класса Книги имеют защищенную видимость.

  • Класс Novels имеет два конструктора, поэтому для перегрузки функций используется оператор перегрузки.

  • Процедура Books.Display объявлена виртуальной , поэтому тот же метод из класса Novels может переопределить ее.

  • Конструктор Novels.Create вызывает конструктор базового класса с использованием унаследованного ключевого слова.

Члены класса Книги имеют защищенную видимость.

Класс Novels имеет два конструктора, поэтому для перегрузки функций используется оператор перегрузки.

Процедура Books.Display объявлена виртуальной , поэтому тот же метод из класса Novels может переопределить ее.

Конструктор Novels.Create вызывает конструктор базового класса с использованием унаследованного ключевого слова.

Интерфейсы

Интерфейсы определены для обеспечения общего имени функции для разработчиков. Различные исполнители могут реализовать эти интерфейсы в соответствии со своими требованиями. Можно сказать, что интерфейсы – это скелеты, которые реализуются разработчиками. Ниже приведен пример интерфейса –

type  
   Mail = Interface  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  
   
   Report = Class(TInterfacedObject,  Mail)  
      Procedure SendMail;  
      Procedure GetMail;  
   end;  

Обратите внимание, что когда класс реализует интерфейс, он должен реализовывать все методы интерфейса. Если метод интерфейса не реализован, компилятор выдаст ошибку.

Абстрактные классы

Абстрактный класс – это класс, который не может быть создан, только наследован. Абстрактный класс задается включением слова «абстрактный» в определение класса, например:

type
   Shape = ABSTRACT CLASS (Root)
      Procedure draw; ABSTRACT;
      ...
   end;

При наследовании от абстрактного класса все методы, помеченные как абстрактные в объявлении класса родителя, должны быть определены дочерним объектом; Кроме того, эти методы должны быть определены с одинаковой видимостью.

Статическое ключевое слово

Объявление членов класса или методов как статических делает их доступными без необходимости создания экземпляра класса. Член, объявленный как статический, не может быть доступен с экземпляром объекта класса (хотя статический метод может). Следующий пример иллюстрирует концепцию –

Live Demo

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.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат –

12
31
31
51
51

Вы должны использовать директиву {$ static on} для использования статических членов.

  • Как пишется ядерно опасный объект
  • Как пишется ягуар по английски
  • Как пишется ягуар машина
  • Как пишется экспресс консультация
  • Как пишется ягода морошка