Паскаль — Обзор
Паскаль — это язык высокого уровня общего назначения, который был первоначально разработан Никлаусом Виртом в начале 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!» —
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';
Давайте посмотрим на пример, который использует различные типы переменных, которые обсуждались до сих пор —
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;
Следующий пример иллюстрирует концепцию —
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;
Следующая программа иллюстрирует концепцию —
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, она возвращает управление программой обратно в основную программу.
Чтобы вызвать функцию, вам просто нужно передать необходимые параметры вместе с именем функции, и если функция возвращает значение, вы можете сохранить возвращаемое значение. Ниже приведен простой пример, чтобы показать использование —
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
Ниже приведен еще один пример, который генерирует ряд Фибоначчи для заданного числа с использованием рекурсивной функции —
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 .
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 .
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
Глобальные переменные
Глобальные переменные определяются вне функции, обычно в верхней части программы. Глобальные переменные будут сохранять свое значение на протяжении всего жизненного цикла вашей программы, и к ним можно получить доступ в любой из функций, определенных для программы.
Глобальная переменная может быть доступна любой функции. То есть глобальная переменная доступна для использования во всей вашей программе после ее объявления. Ниже приведен пример использования глобальных и локальных переменных:
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 —
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 .
-
AnsiStrings — Ansistrings — это строки без ограничения длины.
Символьные массивы — это символьная строка, представляющая собой последовательность из нулевых или более байтовых символов, заключенных в одинарные кавычки.
Строковые переменные — переменная типа String, как определено в Turbo Pascal.
Короткие строки — переменная типа String с указанием размера.
Строки с нулевым символом в конце — переменная типа pchar .
AnsiStrings — Ansistrings — это строки без ограничения длины.
Паскаль предоставляет только один строковый оператор, оператор конкатенации строк (+).
Примеры
Следующая программа печатает первые четыре вида строк. Мы будем использовать 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
В следующем примере используются еще несколько функций, давайте посмотрим —
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;
пример
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.
Ниже приведен пример, который будет использовать все три вышеупомянутых понятия, а именно. декларация, назначение и доступ к массивам —
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;
Следующий пример проиллюстрирует эту концепцию —
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 —
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, указывает на никуда. Рассмотрим следующую программу —
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;
Доступ к полям записи
Для доступа к любому полю записи мы используем оператор доступа участника (.). Оператор доступа к элементу закодирован как точка между именем переменной записи и полем, к которому мы хотим получить доступ. Ниже приведен пример, объясняющий использование структуры:
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
Записи как аргументы подпрограммы
Вы можете передать запись в качестве аргумента подпрограммы таким же образом, как и любую другую переменную или указатель. Вы получите доступ к полям записи аналогично тому, как вы использовали в приведенном выше примере —
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);
Давайте перепишем первый пример, используя указатель на запись Книги. Надеюсь, вам будет легко понять концепцию —
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;
пример
Следующий пример иллюстрирует концепцию —
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’]
пример
Следующий пример иллюстрирует использование некоторых из этих операторов —
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('[email protected]'); close(myfile); (* let us read from this file *) assign(myfile, 'contact.txt'); reset(myfile); while not eof(myfile) do begin readln(myfile, info); writeln(info); end; close(myfile); end.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Contact Details [email protected] 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 —
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:
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 дает вам текущее время в форме с разделителями (:). В следующем примере показано, как получить текущее время —
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 возвращает текущую дату и время —
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;
Получить текущее время
Следующий пример иллюстрирует использование некоторых из вышеуказанных функций —
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);
Ниже приведен полный пример, демонстрирующий использование объектов в Паскале.
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, который будет инициализировать длину и ширину для прямоугольника во время создания объекта и уничтожать его, когда он выходит из области видимости.
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.
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 для выделения памяти.
Вот полный пример —
{$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 и инициализирует цену и заголовок для книги во время создания объекта.
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 и добавляет дополнительные функциональные возможности в зависимости от требований.
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;
При наследовании от абстрактного класса все методы, помеченные как абстрактные в объявлении класса родителя, должны быть определены дочерним объектом; Кроме того, эти методы должны быть определены с одинаковой видимостью.
Статическое ключевое слово
Объявление членов класса или методов как статических делает их доступными без необходимости создания экземпляра класса. Член, объявленный как статический, не может быть доступен с экземпляром объекта класса (хотя статический метод может). Следующий пример иллюстрирует концепцию —
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} для использования статических членов.