
- •ОСновы программирования
- •Содержание
- •Введение
- •1 Основы алгоритмизации.
- •1 Программирование.
- •2. Раздел описания меток.
- •2.11 Файловый тип данных.
- •2.13 Модульное программирование
- •1 Введение в объектно-ориентированное программирование
- •1.1 Основные понятия объектно-ориентированного программирования
- •1.2 Соотношение основных понятий ооп
- •2 Основные характеристические свойства понятий
- •3 Достоинства и недостатки ооп
- •4 Наследование записей
- •4.1 Правила наследования
- •4.2 Объекты, наследующие записи. Использование Типа Object
- •4.3 Списковые структуры
- •Список использованных источников
1 Программирование.
1.1 Структура программы в Турбо Паскале
Программа в Турбо Паскале состоит из двух частей: заголовка и блока (тело программы). Заголовок отделяется от блока точкой с запятой. За блоком ставится точка, что является признаком конца программы.
Заголовок начинается со служебного слова Program <Имя программы>. В нутрии тела программы могут быть объявлены объекты, имена которых не могут совпадать с именем программы. Строки программы должны выделять некоторые смысловые фрагменты. Пробел используется как обязательный разделитель. Каждая строка самостоятельная и в конце неё ставиться точка с запятой.
Слова Program, Begin , End - обязательно используются в программах.
Тело программы в Турбо Паскале состоит из 7 разделов
1. Раздел объявления модулей;
2. Раздел описания меток;
3. Раздел определения констант;
4. Раздел определения типов;
5. Раздел описания переменных;
6. Раздел описания процедур и функций;
7. Раздел операторов.
Таким образом, тело программы состоит из двух частей:
- Декларативная часть - здесь происходит описание обрабатываемых данных.
- Исполнимая часть - здесь происходит описание алгоритмических действий над данными.
В декларативной части расположены первые 6 разделов. В исполнимой части присутствует только раздел операторов. Раздел операторов обязательно должен присутствовать в любой программе. В декларативной части разделы могут писаться в любом порядке за исключением модулей, который пишется сразу после заголовка.
Рассмотрим разделы:
1. Раздел обьявления модулей.
Uses <список имен модулей через запятую>
Например: Uses Crt, Graph.
Данный раздел подключает к программе системные модули из библиотек.
2. Раздел описания меток.
Любой оператор в программе может быть помечен меткой.
<метка>:<оператор>;
Все метки должны быть различны. Оператор должен быть помечен не более оного раза. В качестве меток обычно используют числа от 0- 999. Все метки должны быть предварительно описаны.
Label<Список меток через запятую>;
3. Раздел определения констант.
Константа имеет имя и определенное значение, которое остается постоянным во время работы программы.
Const <имя>=<значение>;
Например:
Const C1=17;
C2=3.14;
C3=’A’;
C4=False;
4. Раздел определения типов.
В Паскале существуют стандартные типы, которые описывать не надо (они считаются уже описанными: integer, real, char, boolean и т.д.). В Паскале есть возможность создать свой новый тип данных.
Type<имя>=<определение>;
Различают такие типы данных:
Integer - целочисленные данные;
Real - это вещественные (действительные числа);
Char - это символьный тип;
String - строковый тип;
Boolean - логический тип.
5. Раздел описания переменных.
Переменная - это величина способная изменяться в процессе выполнения программы. Каждая переменная, до работы с ней должна быть описана, т.е. указано имя переменной и тип переменной. Попытка в процессе выполнения программы присвоить переменной значение иного типа расценивается как ошибка в программе.
Var <список имен переменных>:<тип переменной>;
Пример:
Var I, j, r: integer;
X, h, sum: real;
D, 1, r: string;
6. Раздел описания процедур и функций.
Раздел процедур и функций не начинается каким-то специальным служебным словом - начало данного раздела легко определяется по служебным словам procedure or function.
Procedure<имя процедуры>(<список формальных параметров>);
Function<имя функции>(<список формальных параметров >):<тип результата>;
7. Раздел операторов.
Это основной раздел программы - именно здесь задаются те действия, которые должны быть выполнены по данной программе.
Выполнение программы сводится к выполнению раздела операторов, т.е. к выполнению последовательности операторов, заключенных в операторные скобки
begin
Оператор 1;
Оператор 2;
……………
Оператор N;
end.
2.2 Операторы ввода-вывода
Ввод данных с клавиатуры выполняется оператором Read (список переменных через запятую). При выполнении этого оператора программа останавливается и ждет, пока нужное количество чисел не будет введено с клавиатуры. Вводимые числа разделяют пробелом или нажатием клавиши Enter. Readln - ввод данных осуществляется с использованием клавиши Enter.
Вывод данных на экран осуществляется оператором Write(выражение). В качестве выражения может быть предложение, записанное в апострофах или конкретное значение переменной или сама переменная.
Пусть х:Real
Write(x:5:2)
Write(x:m:n)
m - Общее количества знаков, отведенное под выводимое число.
n - Количество знаков после запятой.
Любое сообщение, выводимое на экран можно сдвинуть:
Write (‘сообщение’:N);
Ввод данных можно комментировать:
Write(‘Ответ’,х:5:3,’км.ч.’);
Ответ: 10.135 км.ч.
Writeln - после ввода всех значений переводит курсор в начало следующей строки.
Пустой оператор Readln - ожидает нажатия клавиши Enter перед словом End. Пустой оператор Writeln - вставляет, пустую строку.
2.3 Разветвляющиеся структуры
В Турбо Паскаль включены два условных оператора if и case. If - условный оператор, case - оператор выбора.
Условный оператор if позволяет выполнять или попускать операторы программы, в зависимости от некоторого условия. Оператор if может быть записан в полной и неполной формах.
Неполная форма условного оператора:
If <условие> then <оператор>;
Если после слова then стоит несколько операторов, то к ним необходимо применить составной оператор Begin…End. Оператор выполняется если условие истинно.
Полная форма условного оператора:
If<условие> then <оператор1> else <оператор2>
В качестве условия применяются знаки сравнения.
Например: If x<>0 then z:=y/x else Writeln(‘На ноль делить нельзя’);
Перед else точка с запятой не ставится. Составной оператор нужен, когда надо пропустить или выполнить несколько операторов подряд.
Сложное условие состовляется из простых при помощи логических операций. (and - и, or - или, not - логическое отрицание).
If (a>0) and (a<=1) then
if (x=0) or (abs(x)<5) then
Оператор выбора Case является обобщением оператора if. Он дает возможность выполнить одно из нескольких действий.
Case <ключ выбора> of <список выбора>
Else <оператор> end;
В качестве ключа выбора можно использовать переменную целого или символьного типа.
2.4 Циклические структуры
В языке Турбо Паскаль имеются три оператора с помощью которых можно запрограммировать повторяющиеся фрагменты программ.
Оператор цикла с предусловием
While<условие> do <оператор>
Если после do стоит несколько операторов, то нужно поставить составной оператор Begin…End.
Цикл While является самой универсальной циклической конструкцией, с помощью которой можно записать любое циклическое действие. Оператор позволяет многократно выполнять одни и те же действия в зависимости от условия. Условие может принимать два значения True и Falsh.
Схема работы цикла While:
При входе в цикл проверяется условие, если оно ложно (-), то тело цикла не выполняется и управление передается оператору стоящему непосредственно за телом цикла. Если же условие истинно (+), то происходит однократное выполнение тела цикла. После этого управление переходит на проверку условия, где снова поверятся это условие и т.д.
Оператор цикла с последующим условием.
Repeat<оператор> Until <условие>
В отличие от цикла While цикл Repeat не требует использования составного оператора Begin…End, когда в его теле находится более одного оператора. Данный оператор не совсем универсален т.к. его условие располагается в конце тела цикла и операторы тела всегда будут выполнятся, как минимум один раз, поэтому он не пригоден для записи цикла, в которых может возникнуть ситуация, когда тело цикла не должно выполнятся ни разу.
Схема работы цикла Repeat:
Прямо противоположна циклу While, т.е. цикл продолжается пока условие ложно и заканчивается когда условие становится истинным. В цикле Repeat это условие выполняется как условие выхода из цикла.
Оператор цикла со счетчиком.
For <параметр цикла>:=<начальное значение> to < конечное значение> do< оператор>
Параметр цикла (счетчик) увеличивается на единицу от начального значения n до конечного значения m, при каждом новом значении исполняется оператор внутри цикла.
Вложенные циклы
Циклы могут быть вложены один в другой, такие циклы называются сложными. При использовании вложенных циклов необходимо, чтобы внутренний цикл полностью укладывался в циклическую часть внешнего цикла.
2.5 Процедуры и функции
Процедурой в Турбо Паскале называется оформленный фрагмент программы, имеющий собственное имя.
Procedure<имя>(список формальных параметров: тип)
<Раздел описаний>
begin
<Раздел операторов>
End;
Схема взаимодействия основной программы и процедуры
Все данные, описанные в разделе описания процедуры, называются локальными переменными по отношению к основной программе. Данные, описанные вне процедуры, называются глобальными. Допускается использование процедуры без параметров, описанные в основной программе.
Procedure ALRHA(x:Integer, y:Real, z:Char)
Любой из формальных параметров может быть либо параметром значения, либо параметром переменной, либо параметром константы const.
Пример: Procedure M(x,y:Real, b:Integer)
Procedure N(Var x,y:Real)
Procedure P(Const a:String)
Вызов процедуры осуществляется по имени с указанием фактических параметров. Между фактическими и формальными параметрами должно быть соответствие по каличеству, по типу, по порядку следования.
Описание функций происходит до исполняемой части и является маленькой программой внутри большой.
Function<имя>(<список формальных параметров>: тип):<тип результата>
<раздел описания>
Begin
<тело>
End.
Формальные параметры бывают двух видов: параметры значений и параметры переменных. В теле функции должен присутствовать оператор присваивания, в левой части которого стоит имя функции, а в правой выражение для возвращаемого значения.
Вызов функции осуществляется следующим образом: Переменной присваивается имя функции с указанием фактических параметров.
2.6 Массивы одномерные
2.7Массивы двумерные
Все простые типы данных, рассматриваемые ранее, имеют два характерных свойства: неделимость и упорядоченность их значений. Составные, или структурированные, типы данных задают множество сложных значений с одним общим именем. Существует несколько методов структурирования, каждый из которых отличается способом обращения к отдельным компонентам.
С понятием «массив» приходится встречаться при решении научно-технических, экономических задач обработки большого количества однотипных значений.
Таким образом, массив – это упорядоченная последовательность данных, состоящая из фиксированного числа элементов, имеющих один и тот же тип, и обозначаемая одним именем.
Название регулярный тип массивы получили за то, что в них объединены однородные элементы, упорядоченные (урегулированные) по индексам, определяющим положение каждого элементы в массиве.
Массиву присваивается имя, посредством которого можно ссылаться на него, как на единое целое. Элементы, образующие массив, упорядочены так, что каждому элементу соответствует совокупность номеров (индексов), определяющих его место в общей последовательности.
Индексы представляют собой выражения простого типа. Доступ к каждому отдельному элементу осуществляется обращением к имени массива с указанием индекса нужного элемента:
<имя массива>[<индекс>].
Описание массива определяет его имя, размер массива и тип данных. Общий вид описания массива:
Type <имя нового типа данных>=array[<тип индекса>] of <тип компонентов>;
Далее, в перечне переменных указывается имя массива, и через двоеточие указывается имя нового типа данных. Массив может быть описан и без представления типа в разделе описания типов данных:
Var <имя массива>: array [<тип индекса>] of <тип компонентов>;
Чаще всего в качестве типа индекса используется интервальный целый тип.
Линейный (одномерный) массив – массив, у которого в описании задан только один индекс, если два индекса – то это двумерный массив и т.д. Одномерные массивы часто называют векторами, т.е. они представляют собой конечную последовательность пронумерованных элементов.
Присваивание начальных значений (заполнение массива) заключается в присваивании каждому элементу массива некоторого значения, заданного типа. Наиболее эффективно эта операция осуществляется при помощи оператора for. Ввод данных может осуществляться: с клавиатуры, при помощи различных формул, в том числе и датчика случайных чисел.
Индексированные элементы массива называются индексированными переменными и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, им можно присваивать любые значения, соответствующие их типу и т.д.
Алгоритм решения задач с использованием массивов:
-Описание массива;
-Заполнение массива;
-Вывод (распечатка) массива;
-Выполнение условий задачи;
-Вывод результата.
Двумерный массив – структура данных, хранящая прямоугольную матрицу. В матрице каждый элемент определяется номером строки и номером столбца, на пересечении которых он расположен. В Паскале двумерный массив представляется массивом, элементами которого являются одномерные массивы. Два следующих описания двумерных массивов тождественны:
Var a: array [1..10] of array [1.. 20] of real;
Var a: array [1..10, 1..20] of real;
Чаще всего при описании двумерного массива используют второй способ. Доступ к каждому отдельному элементу осуществляется обращением к имени массива с указанием индексов (первый индекс – номер строки, второй индекс – номер столбца). Все действия над элементами двумерного массива идентичны действиям над элементами линейного массива.
Только для инициализации двумерного массива используется вложенный цикл for.
Например, For i:= 1 to 10 do
For j:= 1 to 20 do
A[i, j] := 0;
При организации вложенных (сложных) циклов необходимо учитывать:
·Все правила, присущие простому циклу, должны соблюдаться.
·Имена параметров для циклов, вложенных один в другой, должны быть различными.
·Внутренний цикл должен полностью входить в тело внешнего цикла. Пересечение циклов недопустимо.
2.8 Строковый тип данных
Строки занимают промежуточное положение между простыми и структурированными типами данных. После этого утверждения резонно возникает вопрос: почему строки нельзя отнести к простым или структурированным типам данных?
Ответ на первую часть вопроса: Строка – это последовательность символов, иными словами структура, состоящая из элементов простого типа.
Теперь вернемся ко второй части вопроса: Во-первых, строковый тип в ТР относится к стандартным типам данных, а ни один из структурированных типов стандартным не является. Во-вторых, над строками применимы некоторые действия, допустимые для данных простых типов и не применимые к структурированным. Например, Строку можно ввести с клавиатуры или вывести на экран, воспользовавшись стандартными Read(x) и Write(x) соответственно, где х – строковая переменная. Также допустимо сравнивать целые строки. Однако эти действия невозможны с данными структурированных типов – массивами или записями.
Строка – это последовательность символов кодовой таблицы персонального компьютера.
При использовании в выражениях, строка записывается в виде ограниченной апострофами последовательности символов. Пример: ‘Кузьмич’; ’Введите значение А’; ’123’; и т. д.
Количество символов в строке (длина строки) может динамически изменяться от 0 до 255.
Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа.
Если это значение не указывается, то по умолчанию длина строки равна 255 байт.
Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе описания переменных. Строковые данные могут использоваться в программе также в качестве констант.
type <имя типа> = String[макс. дина строки];
var <идентификатор, …> : <имя типа>;
var <идентификатор, …> : String[макс. дина строки];
К отдельным символам в строке можно обратиться по номеру (индексу) данного символа в строке. Индекс определяется выражением целочисленного типа, которое записывается в квадратных скобках сразу за идентификатором строковой переменной или константы.
Выражения, в которых операндами служат строковые данные, называются строковыми. Они состоят из строковых констант, переменных, указателей функций и знаков операций. Строки можно присваивать, сравнивать всеми возможными способами, вводить, выводить и соединять.
Действия со строками:
Операция объединения (или сцепления, или конкатенации) «+»
При ее выполнении начало строки, идущей после знака «+», присоединяется к концу строки, указанной до этого знака. При этом если длина объединенной строки превысит максимальную длину, допустимую для получившейся строки, «лишние» символы будут отброшены.
Операции отношения (+, <>, >, <, >=, <=) проводят сравнение двух строковых операндов и имеют приоритет более низкий, чем операции сцепления, если они присутствуют, и лишь потом реализуются операции отношения.
Сравнение строк приводится слева направо до первого несовпадающего символа, и та сторона считается большей, в которой несовпадающий символ имеет больший код. Результат выполнения операций отношения всегда имеет тип Boolean (True – правда, False – ложь).
Буквы закодированы по алфавиту, отдельно – строчные и отдельно – прописные. Равны лишь абсолютно идентичные строки.
Более короткая строка меньше, чем более длинная. Сравнивать можно не только строковые значения, заданные явно, но и переменные строкового типа.
Подпрограммы, предназначенные для работы со строками, содержатся в модуле System.
Функция Length(St: String): Integer;
Возвращает (вычисляет) текущую длину строки St (фактическое число символов) St – строковое выражение.
Функция Pos(Str1, Str2: String): Byte;
Ищет подстроку в строке.
Str1 – искомая строка;
Str2 – строка, в которой производится поиск.
Результат равен номеру той позиции, где находится первый символ подстроки Str1. Если в Str2 подстроки Str1 нет, то результат равен 0.
Если имеется несколько подстрок, то результат относится к первой.
Функция Copy(St: String, Index, N: Integer): String;
Выделяет из St подстроку, длиной N символов, начиная с позиции Index.
Если Index > Length(St) => результатом будет пробел; если Index > 255 , то возникнет ошибка при выполнении.
Функция Concat(S1, S2 … Sn): String;
S1 … Sn – объединяемые строки.
Выполняет сцепление (объединение) нескольких строк, в том порядке, в котором они указаны в списке параметров.
Функция UpCase(Ch: Char): Char;
Преобразует строчные буквы в прописные. Обрабатывает буквы только латинского алфавита. Если параметр Ch не принадлежит диапазону ‘a’ … ‘z’, то функция оставляет значение параметра без изменений.
Процедура Val(s; Var V; Var code: Integer);
Преобразует строковые значения в величину целочисленную или вещественного типа.
S – строка цифр.
V – возвращаемая переменная типа Real или Integer.
Code – номер позиции в строке, в которой при преобразовании произошла ошибка; если ошибки не было, параметр Code возвращает 0.
Если параметр V имеет целочисленное значение, параметр S представляет собой просто строку цифр. Если параметр V имеет вещественное значение, параметр S представляет собой строку цифр с десятичной точкой.
Процедура Str(x: Size: Dec; Var St: String);
Преобразует числовое значение в строку цифр.
X – преобразуемое число;
S – возвращаемая строка.
Size и Dec – необязательные параметры, представляющие собой спецификатор ширины поля и спецификатор числа знаков после десятичной точки. Эти параметры имеют тот же смысл, что и аналогичные параметры процедуры Write.
Процедура Insert(St1: String; Var St2: String; Index: Integer);
Вставляет подстроку St1 в строку St2 начиная с позиции, заданной Index.
St1 – вставляемая подстрока;
St2 – строка, содержащая подстроку;
Index – позиция в строке St2, куда вставляется подстрока St1.
Если возникающая в результате вставки строка оказывается чересчур длинной, все, что имеется в ней после 255-го символа, отбрасывается.
Процедура Delete(Var St: String; Index: Integer; Count: Integer);
Удаляет подстроку из строки.
St – строка, из которой удаляется подстрока;
Index – номер позиции в строке, с которой начинается удаляемая подстрока.
Count – число символов в удаляемой подстроке.
2.9 Множественный тип данных
Под множеством понимают ограниченный, неупорядоченный набор различных элементов одного типа.
В отличие от массивов к элементам множества нет прямого доступа (по индексам этих элементов, как в массивах). Поэтому ввод-вывод множеств производится с использованием операций объединения (при вводе) и проверки принадлежности (при выводе).
Под мощностью множества понимают количество элементов, содержащихся в данном множестве.
Для построения конкретного множественного типа используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество, называется базовым типом.
Множественный тип описывается с помощью служебных слов Set of, например: type M= Set of B;
Здесь М - множественный тип, В - базовый тип.
Пример описания переменной множественного типа:
type
M= Set of 'A'..'D';
var
MS: M;
Принадлежность переменных к множественному типу может быть определена прямо в разделе описания переменных: var C : Set of 0..7;
Константы множественного типа записываются в виде заключенной в квадратные скобки последовательности элементов или интервалов базового типа, разделенных запятыми, например: ['A', 'C'] [0, 2, 7] [3, 7, 11..14].
Константа вида [] означает пустое подмножество.
К переменным и константам множественного типа применимы операции присваивания(:=), объединения(+), пересечения(*) и вычитания(-):
['A','B'] + ['A','D'] даст ['A','B','D']
['A'] * ['A','B','C'] даст ['A']
['A','B','C'] - ['A','B'] даст ['C'].
Результат выполнения этих операций есть величина множественного типа.
К множественным величинам применимы операции: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например:
['A','B'] = ['A','C'] даст FALSE
['A','B'] <> ['A','C'] даст TRUE
['B'] <= ['B','C'] даст TRUE
['C','D'] >= ['A'] даст FALSE.
Кроме этих операций для работы с величинами множественного типа в языке ПАСКАЛЬ используется операция in проверяющая принадлежность элемента базового типа, стоящего слева от знака операции, множеству, стоящему справа от знака операции. Результат выполнения этой операции - булевский. Операция проверки принадлежности элемента множеству часто используется вместо операций отношения, например:
A in ['A', 'B'] даст TRUE,
2 in [1, 3, 6] даст FALSE.
2.10 Структурированный тип данных – записи
Компьютеры широко используются в различных информационно-поисковых системах (адресное бюро, телефонная справочная служба и т. д.). В реальных информационных системах приходится обрабатывать и хранить большие объемы данных.
При решении научно-технических и экономических задач обработки совокупности больших объемов значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что каждый элемент массива должен иметь один и тот же тип данных. В работе «Поиск в массиве по критерию» мы использовали процедуру Val. Мы все элементы массива объявляли типа String (строка), а затем, с помощью процедуры Val, значение возраста учащихся из типа String преобразовывали в величину целочисленного типа (Integer). Решение задачи получилось громоздким, затрачивалось время на преобразование типа.
Иногда для решения задач, в которых возникает необходимость хранить и обрабатывать совокупности данных различного типа, используются отдельные массивы для каждого типа данных, а для установления соответствия между ними вводятся соответствующие индексы.
Итак, реальные данные об объектах часто описываются величинами разных типов. Например, товар на складе описывается следующими величинами: наименование, количество, цена, наличие сертификата качества и т. д. В этом примере наименование – величина типа String, количество – Integer цена – Real,, наличие сертификата качества можно описать величиной типа Boolean.
Для записи комбинации объектов разных типов в Паскале применяется комбинированный тип данных запись.
Запись – это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов.
В отличие от массива, запись может содержать элементы, принадлежащие разным типам.
Определение типа записи начинается зарезервированным словом Record (запись) и заканчивается зарезервированным словом end (конец). Между ними заключен список компонентов, называемых полями, с указанием идентификаторов полей и типа каждого поля.
Итак: Элементы, образующие запись, называются полями.
Формат записи:
Type <имя типа> = Record
<идентификатор поля 1>: <тип компонента>;
…
<идентификатор поля N>: <тип компонента>;
end;
var <идентификатор, …>: <имя типа>;
Идентификатор поля должен быть уникален только в пределах записи, однако во избежание ошибок лучше делать их уникальными в пределах всей программы, т. е. Имена полей в пределах записи не должны повторяться, чтобы они не использовались. Следует стремиться, чтобы имена полей соответствовали смыслу информации в том или ином поле, а информация, в свою очередь, должна соответствовать своему полю.
Организация данных о людях – один из наиболее типичных случаев применения записей. Например, если существует информация о какой-то группе людей, объединенных в производственный коллектив, то эту информацию лучше всего организовывать в виде набора записей, где для каждого члена коллектива предусмотрена своя запись. При этом все записи буду принадлежать одному типу, структуру которого определяет характер данных.
Обращение к значению поля осуществляется с помощью идентификатора переменной (имя записи) и идентификатора поля (имя поля), разделенных точкой. Такая комбинация называется составным именем. Составные имена можно использовать в операторах ввода-вывода.
Указывать каждый раз составное имя – занятие не из самых увлекательных и к тому же текст программы получается громоздким, особенно если в операторах используются длинные имена. Ситуация еще больше ухудшится, если несколько подобных операторов окажутся сосредоточены в одном месте программы.
Для решения этой проблемы в языке Паскаль предназначен оператор With(в переводе «с»):
With <переменная типа запись> do <оператор>
Один раз, указав переменную типа, запись в операторе With, можно работать с именем полей как с обычными переменными, т. е. без указания перед идентификатором поля имени переменной, определяющей запись.
Возможно существование записей, отдельные поля которых представляют собой также записи следовательно оператор With тоже может быть вложенным.