Материал из Викиучебника — открытых книг для открытого мира
- Основы
- Таблица типов
- Справочные примеры PascalABC
Минимальная структура программы:
begin {main code here} end.
Пример:
begin writeln('Hello world'); end.
В данной секции располагаются определенные пользователем константы. Синтаксис объявления констант выглядит так:
const <имя> = <значение>;
Например:
const a = 12; s = 'ABC.NET';
Данная секция предназначена для переменных и массивов. Переменные объявляются так:
Тип строка — это тип переменных, который позволяет хранить в переменной любой текст. Объявление строковой переменной:
Строки могут быть не более 255 символов. Изначальное значение строковых переменных — это «пустая строка» — ».
| Операция | Описание |
|---|---|
| s1 + s2 | Объединение строк |
| s1*n | Дублирование строки n раз |
Кроме типа string в PascalABC.Net есть еще тип целое число — «integer». Само число a может принимать (в PascalABC.Net) значения от -32768 до 32767. Пример объявления переменной типа integer:
| Операция | Описание |
|---|---|
| a + b | Сложение чисел |
| a — b | Разность чисел |
| a * b | Произведение чисел |
| a div b | Целочисленное деление |
| a mod b | Остаток от деления |
Тип вещественное число real
[править]
Декларация переменной типа real:
Пример присваивания переменной данного типа:
;; a := 1.0; // Не 1,0! a := 1; // Эквивалентно 1.0.
| Операция | Описание |
|---|---|
| a + b | Сложение чисел |
| a — b | Разность чисел |
| a * b | Произведение чисел |
| a / b | Частное чисел |
Тип символ или «char» используется в основном для хранения одного любого символа вне зависимости от того, является ли данный символ буквой или цифрой. Объявление переменной символьного типа:
Данный раздел программы содержит все команды, выполняемые при ее запуске. Данная секция программы выглядит так:
begin <команда_1>; ... <команда_n>; end.
Комментарий — это часть кода, которую игнорирует компилятор. Он создается следующим образом:
Или:
Массивы — это именованный список элементов одного типа.
P. S. Для работы с массивами существует учебный модуль Arrays.
Статические массивы имеют фиксированный размер. Общий синтаксис объявления данных массивов выглядит так:
var <имя>: array [0..N - 1] of <тип>;
, где N — длина массива.
Пример:
const N = 5; var A: array [0..N] of integer; K: integer; j: integer; Found: boolean; begin Found := false; K := ReadInteger('K:'); for var i := 0 to N - 1 do begin if not Found then Readln(A[i]) else Readln(A[i + 1]); if not Found and (A[i] = K) then begin Found := true; j := i + 1; end; end; A[j] := A[N]; for var i := 0 to N do WriteFormat('{0} ', A[i]); end.
Посмотреть статью с примером.
Матрица — это n-мерный список значений, имеющий свой тип и ограниченный некоторыми значениями. Пока будем рассматривать только статические двухмерные и трехмерные матрицы. Перед тем, как перейти к их изучению вспомни таблицы в Excel. Каждая таблица имеет свой размер — ширину и длину. Возьмем за правило ассоциировать двухмерные матрицы с таблицами. Объявление матрицы:
var <имя>: array [0..N - 1, 0..M - 1] of <тип>;
, где N, M количество строчек и столбцов соответственно.
Трехмерный матрицы обладают третьим измерением:
var <имя>: array [0..N - 1, 0..M - 1, 0..K - 1] of <тип>;
Декларация N-мерной матрицы:
var <имя>: array [0..A - 1, 0..B - 1, ..., 0..Z - 1] of <тип>;
, где A..Z означают количество элементов в соответствующем измерении.
Статические и динамические массивы
[править]
Динамические массивы позволяют управлять количеством элементом в каждом из их измерений во время выполнения программы.
| Пример объявления массива: | Статический | Динамический | Вызов SetLength (для динамического массива) |
|---|---|---|---|
| Векторный |
<имя>: array [0..N - 1] of <тип> |
<имя>: array of <тип> |
SetLength(<имя>, N) |
| Двумерный |
<имя>: array [0..N - 1, 0..M - 1] of <тип> |
<имя>: array [,] of <тип> |
SetLength(<имя>, N, M) |
| Трехмерный |
<имя>: array [0..N - 1, 0..M - 1, 0..K - 1] of <тип> |
<имя>: array [,,] of <тип> |
SetLength(<имя>, N, M, K) |
Индекс массива — это номер элемента массива. Индекс может принимать значения [0, N — 1], где N — количество элементов некоторой размерности. Обращение к элементу одномерного массива с некоторым индексом:
Составим таблицу, которую следует запомнить:
| N-мерный массив | Общий синтаксис указания элемента массива | Пример |
|---|---|---|
| Векторный |
<имя>[i] |
A[1] |
| Двумерный |
<имя>[i, j] |
A[1, 1] |
| Трехмерный |
<имя>[i, j, k] |
A[1, 1, 1] |
Где i, j, k — индексы.
Индекс в виде значения элемента массива
[править]
Индексом может быть значение элемента массива:
Операторы, стандартные процедуры и функции
[править]
Вывести текст — это значит отобразить текст на экране. Общий синтаксис для вывода текста выглядит так:
Вывод значений произвольного количества переменных:
Write(<имя_1>, <имя_2>, ... , <имя_n>);
Например:
var A, B, C: integer; begin A := 1; B := 6; C := 2; Write(A, B, C); end.
Для перехода на новую строку после вывода последнего значения используйте Writeln вместо Write.
Чтение с клавиатуры — это процесс ввода данных с клавиатуры и запись в соответствующий элемент программы этих данных. Элементами программы являются как переменные, так и элементы массивов. Тип данных, вводимых с клавиатуры, должен соответствовать типу элемента, в который записываются данные с клавиатуры. Использование Readln для чтения с клавиатуры и перехода на новую строку:
Readln(<имя_переменной_1>, <имя_переменной_2>, ... ,<имя_переменной_n>);
Общий синтаксис условного оператора if:
if (<условие>) then begin <команда_1>; ... <команда_N>; end;
Команды <команда_1>…<команда_N> будут выполнены только при истинности условия.
Условные обозначения в программировании операций сравнения приведены в таблице:
| Операция | Эквивалент в Паскале |
|---|---|
| ≤ (меньше или равно) | <=
|
| ≥ (больше или равно) | >=
|
| < (меньше) | <
|
| > (больше) | >
|
| = (равно) | =
|
| ≠ (не равно) | <>
|
Общий синтаксис сравнения двух величин:
<элемент_1><знак_сравнения><элемент_2>;
Пример:
const N = 10; var A: array of integer; Max: integer; begin SetLength(A, N); for var i := 0 to N - 1 do A[i] := Random(100); Max := integer.MinValue; for var i := 0 to N - 1 do if A[i] > Max then Max := A[i]; Writeln(A); Writeln(Max); end.
Посмотреть статью с примером.
Оператор case используется для сопоставления значения некоторого выражения с константными значениями:
case <выражение> of <константное_значение_1>: begin <операторы_1>; end; ... <константное_значение_n>: begin <операторы_n>; end; else <операторы> end;
Если некоторое i-тое константное выражение совпадает с значением выражения, то i-ая группа операторов будет выполнена. Группа операторов после else будет выполнена, если значение выражения не совпало ни с одной из констант. begin — end не нужны, если после двоеточия только один оператор.
Пример:
var S, S2: string; i: integer := 1; // Выделение слова из строки: function GetWord(s: string; var from: integer): string; begin while (from <= Length(s)) and char.IsLetter(s.Chars[from]) do begin Result += s.Chars[from]; Inc(from); end; end; begin Readln(S); var L := Length(S); while i <= L do begin while (i <= L) and not char.IsLetter(S.Chars[i]) do begin S2 += S.Chars[i]; Inc(i); end; var w := GetWord(S, i); // Преобразование числа в слово: case LowerCase(w) of 'ноль', 'нуль': S2 += '0'; 'один': S2 += '1'; 'два': S2 += '2'; 'три': S2 += '3'; 'четыре': S2 += '4'; 'пять': S2 += '5'; 'шесть': S2 += '6'; 'семь': S2 += '7'; 'восемь': S2 += '8'; 'девять': S2 += '9'; else S2 += w end; end; S := S2; Writeln(S2); end.
Посмотреть статью с примером.
Оператор цикла позволяет выполнять группу операторов (или один) циклически пока условие является истинным.
while (<условие>) do begin <оператор_1>; ... <оператор_n> end;
Пример:
var S, S2: string; i: integer := 1; begin Readln(S); // Пока не дошли до конца строки: while i <= Length(S) do begin if S.Chars[i] = ' ' then begin S2 += ' '; Inc(i); end; // Пропускаем все лишние пробелы. while (i <= Length(S)) and (S.Chars[i] = ' ') do Inc(i); // Бежим по строке до тех пор пока не встретим пробел. while (i <= Length(S)) and (S.Chars[i] <> ' ') do begin S2 += S.Chars[i]; Inc(i); end; end; S := S2; Writeln(S); end.
Посмотреть статью с примером.
«Счетчик» — это оператор цикла for, выполняющий группу операторов определенное количество раз.
Общий синтаксис оператора цикла for:
for var <переменная_цикла> := <значение_1> to <значение_2> do begin <оператор_1>; ... <оператор_n>; end;
Если второе значение меньше первого — используйте downto вместо to.
Пример:
const N = 10; var A: array of integer; begin SetLength(A, N); for var i := 0 to N - 1 do Readln(A[i]); Writeln(A); end.
Посмотреть статью с примером.
Для выхода из цикла можно использовать break:
const N = 9; var A: array [0..N - 1] of integer; begin for var i := 0 to N - 1 do begin Readln(A[i]); if A[i] mod 2 = 0 then break; end; end.
Для завершения текущей итерации цикла и начала другой используйте оператор continue.
Общий синтаксис описания функции:
function <имя>(<описание_параметров>): <тип_возвращаемого_значения>; begin <оператор_1>; ... <оператор_n>; end;
или:
function <имя>(<описание_параметров>) := <выражение>; // Вывод типа возвращаемого значения производится на основе типа выражения.
Можно устанавливать значение переменной Result для указания возвращаемого значения.
Пример:
function F(a, b: integer): integer; begin if a < b then Result := a else Result := F(a - b, b); end; begin Writeln(F(ReadlnInteger('A:'), ReadlnInteger('B:'))); end.
Посмотреть статью с примером.
Синтаксис объявления процедуры:
procedure <имя>(<описание_параметров>); begin <оператор_1>; ... <оператор_n>; end;
или:
procedure <имя>(<описание_параметров>) := <оператор>;
Пример:
uses Crt, GraphABC, ABCButtons; var B: ButtonABC; procedure P() := Writeln('Привет мир!'); // Сокращённый синтаксис объявления процедур, содержащих один оператор. begin B := new ButtonABC(0, 0, 100, 40, 'Button', clRed); B.OnClick := P; end.
Посмотреть статью с примером.
Для выхода из некоторой функции или процедуры можно использовать оператор exit.
Встроенные процедуры и функции
[править]
| Описание | Комментарии |
|---|---|
Random(<максимальное_значение>) |
Генерирует случайное число в диапазоне [0, максимальное_значение — 1]. |
Inc(<имя>) |
Увеличивает значение переменной на 1 (переменная типа real не может быть параметром). |
Dec(<имя>) |
Уменьшает значение переменной на 1 (переменная типа real не может быть параметром). |
Succ(<символ>) |
Возвращает следующий символу символ. |
Pred(<символ>) |
Возвращает предыдущий символу символ. |
Модуль — это часть программы, вынесенная в отдельный файл. Для подключения модуля следует писать в разделе uses его имя:
uses <имя_модуля_1>, <имя_модуля_2>, ... , <имя_модуля_n>;
Примеры объявления своих типов:
type Int = integer; // Тип числа. ShortStr = string[255]; // Тип короткой строки. Numbers = (One, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten); // Тип названия числа. TArray<T> = array of T; // Тип одномерного массива с элементами типа T. TMatrix<T> = array [,] of T; // Тип матрицы с элементами типа T.
Пример вывода обобщённого массива:
type TArray<T> = array of T; procedure Show<T>(a: TArray<T>); begin for var i := 0 to a.Length - 1 do Writeln(a[i]); end; begin Show(ArrRandom()); end.
uses System; begin var rnd := new Random(); while true do begin Console.SetCursorPosition(0, 0); Console.ForegroundColor := ConsoleColor(rnd.Next(15)); Console.Write('Hello world!'); Sleep(200); end; end.
Класс ввода данных пользователя
[править]
uses FormsABC; const Width = 50; type TUserData = class private _Name, _Password: Field; _LogIn: Button; _W: integer; function GetW() := _W; procedure SetW(v: integer); begin _Name.FieldWidth := v; _Password.FieldWidth := v; _W := v; end; public property Name: Field read _Name; property Password: Field read _Password; property LogIn: Button read _LogIn; property W: integer read GetW write SetW; constructor(nText, pText, logInText: string); begin _Name := new Field(nText, Width); _Password := new Field(pText, Width); _LogIn := new Button(logInText); end; end; begin var UserInput := new TUserData('Name', 'Password', 'Ok'); end.
var x, y: real;
begin
writeln('введите введите x');
readln(x);
if x>0 then y:=sqrt(x) else y:=sqr(x);
writeln(y);
writeln('введите x');
readln(x);
if x=0 then y:=0 else y:=0;
writeln(y);
writeln('введите x');
readln(x);
if x<0 then y:=x+x else y:=x+x;
writeln(y);
end.
Распознавание голоса и речи на C#
UnmanagedCoder 05.05.2025
Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .
Реализация своих итераторов в C++
NullReferenced 05.05.2025
Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .
Разработка собственного фреймворка для тестирования в C#
UnmanagedCoder 04.05.2025
C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .
Распределенная трассировка в Java с помощью OpenTelemetry
Javaican 04.05.2025
Микросервисная архитектура стала краеугольным камнем современной разработки, но вместе с ней пришла и головная боль, знакомая многим — отслеживание прохождения запросов через лабиринт взаимосвязанных. . .
Шаблоны обнаружения сервисов в Kubernetes
Mr. Docker 04.05.2025
Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .
Создаем SPA на C# и Blazor
stackOverflow 04.05.2025
Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .
Реализация шаблонов проектирования GoF на C++
NullReferenced 04.05.2025
«Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .
C# и сети: Сокеты, gRPC и SignalR
UnmanagedCoder 04.05.2025
Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .
Создание микросервисов с Domain-Driven Design
ArchitectMsa 04.05.2025
Архитектура микросервисов за последние годы превратилась в мощный архитектурный подход, который позволяет разрабатывать гибкие, масштабируемые и устойчивые системы. А если добавить сюда ещё и. . .
Многопоточность в C++: Современные техники C++26
bytestream 04.05.2025
C++ долго жил по принципу «один поток — одна задача» — как старательный солдатик, выполняющий команды одну за другой. В то время, когда процессоры уже обзавелись несколькими ядрами, этот подход стал. . .
Модули в Паскале по отношению к основной части программы напоминают подпрограммы (процедуры и функции). Но по определению они являются самостоятельными программами, ресурсы которых могут быть задействованы в других программах. Кроме того описание модулей происходит вне вызывающего приложения, а в отдельном файле, поэтому модуль – это отдельно компилируемая программа. Файл скомпилированного модуля (именно такой нужен для использования) будет иметь расширение предусмотренное средой программирования (например, .tpu, .ppu, .pcu).
Модули создаются, как правило, для обеспечения компактности кода, о чем приходиться заботиться крупным проектам. Стоит также отметить, что использование модулей в каком-то смысле снимает ограничение на сегментацию памяти, так как код каждого модуля располагается в отдельном сегменте.
Структура модуля выглядит так:
Unit <имя модуля>; Interface <интерфейсная часть> Implementation <исполняемая часть> Begin <инициализация> End.
Далее мы поочередно рассмотрим каждый из данных разделов.
Имя модуля (Unit)
Имя модуля, следующее после ключевого слова Unit, должно совпадать с названием файла (без .pas), в котором находиться его код. Также с помощью имени, модуль подключается к другому модулю, либо к основной программе. Для этого необходимо указать служебное слово Uses, и перечислить через запятую список подключаемых модулей:
Uses <список имен модулей>; <h3>Интерфейсная часть (Interface)
В интерфейсной части описываются заголовки объектов, к которым будут иметь доступ другие модули и программы. Это константы, типы, переменные и подпрограммы. Например, так может выглядеть интерфейсная часть модуля Search, содержащего в себе алгоритмы поиска элементов в массиве.
unit Search; Interface type arr = array[1..5] of integer; var s: string; procedure binary_search(x: integer; Ar: arr; var s: string); procedure line_search(x: integer; Ar: arr; var s: string);
Для объявления данного модуля, в программе нужно указать его имя:
Uses Search;
После чего станет возможным использование всех описанных в интерфейсной части объектов.
Исполняемая часть (Implementation)
Начинается этот раздел со слова Implementation (реализация). Именно здесь нужно описать подпрограммы, объявленные в интерфейсной части. При этом в их заголовках разрешается не указывать формальные параметры, иначе они должны полностью совпадать с таковыми в интерфейсной части. Кроме этого, интерфейсная часть может содержать локальные (недоступные вызывающей программе) для модуля объекты.
Инициирующая часть
Инициирующая часть начинает свою работу до начала выполнения основной программы. В ней (между Begin и End), как правило, описываются операторы, предназначенные для разного рода вспомогательной работы. Данная часть может отсутствовать, либо не иметь в себе никакого кода. В первом случае нужно указать End с точкой, во втором – оставить пустое место внутри Begin и End.
Компиляция модулей
Использовать в программе можно лишь скомпилированные модули, имеющие расширение, предусмотренное вашей средой разработки приложений. Рассмотрим три наиболее популярные из них:
компиляция модулей в Turbo Pascal
Итогом компиляции модуля в Turbo Pascal, будет файл с расширением .tpu (Turbo Pascal Unit), хранящий его код.
компиляция модулей в Free Pascal
После компиляции модуля в среде Free Pascal, создаются два файла с разными разрешениями: .ppu и .o. Первый содержит интерфейсную часть модуля, а второй (необходим для компоновки программы) – часть реализаций.
компиляция модулей в Pascal ABC.NET
Pascal ABC.Net во время компиляции модуля не генерирует код на машинном языке. В случае, если компиляция выполнена успешна код сохраняется в файле с разрешением .pcu.
Для сред программирования Turbo Pascal и Free Pascal предусмотрены три режима компиляции: Compile, Make и Build. В режиме Compile все используемые в программе модули должны быть заранее скомпилированы. Приложение в режим Make-компиляции проверяет все подключенные модули на наличие файлов с соответствующим для среды программирования разрешением (.tpu или .o). Если какой-то из них не найден, то происходит поиск файла с названием ненайденного модуля и расширением .pas. Самый надежный из режимов – Build. Поиск и компиляция файлов (с расширением .pas) в данном режиме происходит даже тогда, когда модульные файлы уже имеются.
Пример: создадим небольшой модуль, содержащий в себе процедуры двоичного и линейного поиска элементов в массиве. Код модуля:
unit Search;
Interface
type arr = array[1..5] of integer;
var s: string;
procedure binary_search(x: integer; Ar: arr; var s: string);
procedure line_search(x: integer; Ar: arr; var s: string);
Implementation
var a, b, c, i: integer;
procedure binary_search(x: integer; Ar: arr; var s: string);
begin
a:=1; b:=5; s:='NO';
while a<=b do
begin
c:=a+(b-a) div 2;
if (x<Ar[c]) then
b:=c-1
else if (x>Ar[c]) then
a:=c+1
else
begin s:='YES'; break; end;
end;
end;
procedure line_search(x: integer; Ar: arr; var s: string);
begin
s:='NO';
for i:=1 to 5 do
begin
if (Ar[i]=x) then
begin
s:='YES'; break;
end;
end;
end;
end.
Весь этот код должен находиться в отдельном файле. Теперь напишем основную программу, в которую подключим наш модуль Search.
program modul_search;
uses Crt, Search;
var
mas: array[1..5] of integer;
n, j: integer; str: string;
y: char;
begin
clrscr;
writeln('Enter the array elements');
for j:=1 to 5 do
readln(mas[j]);
write('Enter number search: '); readln(n);
write('This array is ordered? (y/n) '); readln(y);
if y='y' then binary_search(n, mas, str)
else line_search(n, mas, str);
write(str);
readkey;
end.
После компиляции файлов данное приложение должно исправно работать. Конечно, если вы, отвечая на вопрос “Этот массив упорядочен?” укажите программе ложную информацию, то и она может ответить тем же.
Uses (зарезервированное слово)
Каждый идентификатор в разделе Uses обозначает имя модуля, используемого текущей программой или модулем.
Синтаксис
Uses идентификатор, … идентификатор;
Замечания
При поиске модуля, указанного в разделе Uses, компилятор сначала проверяет резидентные модули, загружаемые из файла *.TPL при запуске.
Если компилятор не находит нужный модуль в списке резидентных, то он ищет его на диске. Компилятор ищет модуль в файле с именем, равным имени модуля и расширением TPU, TPP или TPW. (TPW — для модулей Windows, TPU — для реального режима DOS и TPP — для защищенного режима DOS).
Компилятор ищет файлы в текущем каталоге и в каталогах, определенных в строке ввода Options|Directories|Unit Directories.
{ Пример для Windows }
Program MyProgram;
Uses WinDos, WinCrt; { программа может использовать }
{ подпрограммы из модулей WinDos и WinCrt }
{ Пример для DOS }
Program MyProgram;
Uses Dos, Crt; { программа может использовать }
{ подпрограммы из модулей Dos и Crt }
См. также
Лекция №13.2: Модульная структура программы
