Учебники

Паскаль — Краткое руководство

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

Паскаль — это язык высокого уровня общего назначения, который был первоначально разработан Никлаусом Виртом в начале 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} для использования статических членов.