- •Краткий справочник по языку Паскаль Этапы разработки программы
- •Оформление решений
- •Структура программы
- •Типы данных
- •Целые числа
- •Алфавит языка
- •Специальные символы
- •Составные символы
- •Зарезервированные слова
- •Некоторые стандартные функции и процедуры языка
- •Комментарии и директивы
- •Операторы
- •Простые операторы
- •Writeln; -выводит пустую строку. Выражения и операции
- •Арифметические операции
- •Операция @
- •Операции с указателями
- •Операции с множествами
- •Приоритет операций
- •Структурные операторы
- •Полезные формулы
- •Подпрограммы
Операции с множествами
К множествам применимы операции + (объединение), - (разность) и * (пересечение):
var s1,s2,s: set of byte; begin s1:=[1..4]; s2:=[2..5]; s:=s1+s2; // s=[1..5] s:=s1-s2; // s=[1] s:=s1*s2; // s=[2..4]
К множествам применимы также операции отношения = (равенство), <> (неравенство), <= (вложено) и >= (содержит):
var s1,s2,s: set of byte; b: boolean; begin s1:=[1..4]; s2:=[2..5]; s:=[1,2]; b:=s1=s2; // b=False b:=s2<>s; // b=True b:=s<=s2; // b=False b:=s1>=s; // b=True
Наконец, операция in определяет, принадлежит ли элемент множеству:
1 in [2..5] // False 3 in [2..5] // True
Приоритет операций
Приоритет определяет порядок выполнения операций в выражении. Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие одинаковый приоритет, выполняются слева направо.
Таблица приоритетов операций
@, not, ^ |
1 (наивысший) |
*, /, div, mod, and, shl, shr |
2 |
+, -, or, xor |
3 |
=, <>, <, >, <=, >=, in |
4 (низший) |
Структурные операторы
Структурные (сложные) операторы представляют собой конструкции, содержащие простые операторы. К этой группе операторов относятся: составной оператор, оператор условного перехода, операторы цикла (For, repeat, while), оператор выбора, оператор присоединения в записях.
Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга точками с запятой, и ограниченную операторными скобками begin и and.
begin
Оператор1;
Оператор2;
...
ОператорN;
end;
Обратите внимание - составной оператор воспринимается как один оператор и обычно используется в том месте, где по правилам языка может стоять только один оператор, а требуется использование нескольких.
Полезные формулы
Вычисление степени числа: ax =x*ln(a)=exp()x*ln(a));
Таким образом, нельзя возвести в степень отрицательное число. Для этого можно использовать операторы циклов.
Для вычисления логарифма с основанием а используем: loga(x)=ln(x)/ln(a)
В Turbo Pascal определены только три тригонометрические функции: sin, cos, arctg. Для вычисления остальных тригонометрических функций необходимо использовать известные соотношения:
tg(x)=sin(x)/cos(x);
ctg(x)=cos(x)/sin(x);
csc(x)=1*sin(x);
Оператор if используется для выбора одного из двух направлений дальнейшего хода программы (последовательности инструкций, которые должны быть выполнены). Выбор последовательности инструкций осуществляется во время выполнения программы в зависимости от выполнения условия.
Алгоритм программы с разветвляющей структурой может быть представлен следующим образом:
Формат записи.
Вариант 1.
if <Условие> then
begin
{эти инструкции выполняются, если Условие истинно}
end
else
begin
{эти инструкции выполняются, если Условие ложно}
end;
Вариант 2.
if <Условие> then
begin
{эти инструкции выполняются, если Условие истинно}
end.
Один оператор if может входить в состав другого оператора if. В таком случае говорят о вложенности операторов:
if <условие> then
if < условие > then <операнд>
else < операнд >;
При вложенности операторов каждое else соответствует тому then, которое не-посредственно ему предшествует.
Пример:
if A < B then
begin
writeln( A < B );
D:=A*B;
end
else
begin
writeln( A>=B );
D:=A/B;
end;
Обычно при написании программы не рекомендуется использовать многократно вложенные друг в друга условные операторы if - программа становится громоздкой и ее трудно понимать. Считается, что число уровней вложения не должно превышать двух-трех. Но как быть, если необходимо проверить достаточно много условий и в зависимости от них выполнять те или иные действия? Для этих целей существует специальный оператор выбора case. Оператор выбора case является обобщением оператора if и позволяет сделать выбор из произвольного числа имеющихся вариантов. Как и в операторе if здесь может присутствовать слово else, имеющее тот же смысл.
Инструкция case имеет вид:
case <выражение -селектор> of
<список констант 1>: begin
<Инструкции 1;>
end;
<список констант 2>: begin
<Инструкции 2;>
end;
.................................
<список констант N>: begin
<Инструкции N;>
end
else
begin
<Инструкции>
end;
end;
Выполнение оператора case начинается с вычисления выражения - селектора. Инструкции между begin и end выполняются в том случае, если выражения после слова case совпадает с константой из соответствующего списка. Если это не так, то выполняются инструкции, идущие после else, расположенные между begin и end. Если else отсутствует, выполняется оператор программы, следующий за case.
Обратите внимание - в конце оператора case стоит ключевое слово end, для которого нет парного слова begin.
При использовании оператора варианта должны выполнятся следующие правила: значение выражения, записанного после служебного слова Case, должно принадлежать дискретному типу; для целого типа они должны лежать в диапазоне - 32768 ... 32767.
Использование вещественного и строкового типа не допустимо.
Все константы, предшествующие операторам альтернатив, должны иметь тип, совместимый с типом выражения.
Все константы в альтернативах должны быть уникальны в пределах оператора варианта (то есть повторения констант в альтернативах не допускаются); диапазоны не должны пересекаться и не должны содержать констант, указанных в данной или других альтернативах.
Часто при решении задач приходится многократно вычислять значения по одним и тем же зависимостям для различных значений входящих в их величины.
Такие многократно повторяемые участки вычислительного процесса называются циклами.
Использование циклов позволяет существенно сократить объем схемы алгоритма и длину соответствующей ей программы. Различают циклы с заданным и неизвестным числом повторений. С заданным числом повторений - цикл со счетчиком. С неизвестным числом повторений - цикл с предусловием, цикл с постусловием.
Для организации цикла необходимо выполнить следующие действия:
Задать перед циклом начальное значение переменной, изменяющейся в цикле.
Изменять переменную перед каждым новым повторением цикла. проверять условие окончания или повторения цикла.
Управлять циклом, т.е. переходить к его началу, если он не закончен, или выходить из него по окончанию.
Алгоритм цикла с предусловием - While. Серия команд будет исполняться до тех пор, пока выполняется условие, если условие не выполняется, то цикл завершает работу и выполняется следующая за циклом команда. Следует отметить, что число повторений серии команд цикла заранее не определено и, если при первом входе в цикл условие уже не выполняется, то серия команд в цикле не будет выполнена ни одного раза.
Формат записи:
while Условие выполнения цикла do
begin
{Инструкции}
end;
Алгоритм цикла с постусловием - Repeat. Серия команд будет исполняться до тех пор, пока не выполнится условие, если условие выполняется, то цикл завершает работу и выполняется следующая за циклом команда. Следует отметить, что число выполнений серии команд цикла заранее не определено и если при первом входе в цикл условие уже выполняется, то серия команд в цикле будет выполняться один раз.
Формат записи:
repeat
{Инструкции}
until Условие выхода из цикла
Алгоритм цикла со счетчиком - For. Цикл со счетчиком или цикл с параметром является частным случаем цикла с предусловием. Отличие состоит в том, что в цикле со счетчиком задаются границы диапазона, по которым определяется количество повторений тела цикла.
Формат записи:
Вариант 1 (с увеличением счетчика)
for Счетчик := НачальноеЗначение to КонечноеЗначение do
begin
{Инструкции}
end;
Вариант 2 (с уменьшением счетчика)
for Счетчик := КонечноеЗначение downto НачальноеЗначение do
begin
{Инструкции}
end;
Вложенные циклы. В цикл, называемый внешним, могут входить один или несколько вложенных циклов, называемых внутренними. Организация как внешнего, так и внутреннего цикла осуществляется по тем же правилам, что и простого цикла. Параметры внешнего и внутреннего циклов разные и изменяются не одновременно, т.е. при одном значении параметра внешнего цикла параметр внутреннего цикла принимает поочередно все значения.
Все простые типы данных (целые, вещественные, символьные, логические) имеют два характерных свойства: неделимость и упорядоченность их значений.
Составные, или структурные, типы данных в отличие от простых задают множества сложных значений с одним общим именем. Структурные типы определяют некоторый способ образования новых типов из уже имеющихся.
Существует несколько методов структурирования, каждый из которых отличается способом обращения к отдельным компонентам и, следовательно, способом обозначения компонентов, входящих в структурные данные. По способу организации и типу компонентов в сложных типах данных выделяют следующие разновидности:
Регулярный тип (массивы);
Комбинированный тип (записи);
Файловый тип (файлы);
Множественный тип (множества);
Строковый тип (строки).
В отличие от простых типов данных данные структурированного типа характеризуются множественностью образующих этот тип элементов, т.е. переменная или константа структурированного типа всегда имеет несколько компонентов. Каждый компонент в свою очередь может принадлежать структурированному типу, т.е. возможна вложенность типов.
Если работа программы связана с хранением и обработкой большого количества однотипных переменных, для их представления в программе можно использовать массивы.
Массив – это совокупность конечного числа элементов одного и того же типа, в котором каждый элемент имеет номер, а все элементы общее имя. Номер элемента называется индексом.
Характеристики массива:
тип - общий тип всех элементов массива;
размерность (ранг) - количество индексов максима;
диапазон изменения индекса (индексов) - определяет количество элементов в массиве.
Одномерный массив (вектор) - это пример массива, в котором элементы нумеруются одним индексом.
В качестве номера (индекса) элемента массива используется выражение порядкового типа (чаще integer).
Описание массива
Способ 1. В разделе описания переменных
var
ИмяМассива: array[НижняяГраница..ВерхняяГраница] of ТипЭлементов;
Способ 2. В разделе описания типов
type
ИмяМассива: array[НижняяГраница..ВерхняяГраница] of ТипЭлементов;
Способ 3. В разделе описания констант
const
ИмяМассива: array[1..10] of integer=(5, 78, -45, 14, -63, 100, -789, 10, 1, 0);
Заполнение массива данными (ввод элементов)
Массив, описанный как типизированная константа, уже содержит данные. Массивы, объявленные в разделе описания переменных, необходимо заполнить данными, прежде чем выполнять с ними какие-либо действия.
Значения элементов массива также можно задать следующими способами:
при вводе данных с клавиатуры:
write('Введите количество элементов в массиве');
readln(n);
for i:=1 to n do
begin
writeln('a[',i,']='); {Можно эту строчку в программе не использовать}
readln (a[i]);
end;
с помощью датчика случайных чисел:
randomize;
writeln('Введите количество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=random(50);
writeln('a(',i,')=',a[i]);
end;
присваением заданных значений (например по формуле i*i/i+2):
writeln('Введите количество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=i*i/i+2;
writeln('a(',i,')=',a[i]);
end;
Вывод массива
вывод в столбец:
for i:=1 to n do
writeln(a[i]);
в одну строку, через пробел-разделитель:
for i:=1 to n do
writeln(a[i],' ');
с заданием формата (например, где под каждый элемент отводится 4 позиции):
for i:=1 to n do
writeln(a[i]:4);
Обработка массивов
Часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значения и номера максимального и минимального элементов, а также изменить значения элементов массива и т.д. Подробно все действия можно рассмотреть в задачах разобранных в этом разделе.
Сортировка элементов массива
Сортировка один из наиболее распространенных процессов современной обработки данных. Сортировкой называется распределение элементов множества по группам в соответствии с определенными правилами. Например, сортировка элементов массива, в результате которой получается массив, каждый элемент которого, начиная со второго, не больше стоящего от него слева, называется сортировкой по невозрастанию.
Выделяют несколько методов сортировки:
линейная сортировка (сортировка отбором);
метод пузырька;
метод быстрой сортировки с разделением;
Идея линейной сортировки по невозрастанию (убыванию) заключается в том, чтобы, последовательно просматривая весь массив, отыскать наибольшее число и поместить его на первую позицию, обменяв его с элементом, который ранее занимал первую позицию. Затем просматриваются все остальные элементы массива и выполняется аналогичная операция по отбору из рассматриваемой части массива максимального элемента и обмену местами этого элемента и первого в рассматриваемой части и т.д.
Фрагмент программы:
for i:=1 to n-1 do {Изменять размер неотсортированной части массива}
for j:=i+1 to n do {Сравниваем поочередно i-й элемент неотсортированной части массива
со всеми от i+1 – го элемента до конца}
begin
if a[i] < a[j ] then {Если в неотсортированной части массива нашли элемент,
больший, чем i-й , то обменять их местами}
begin
k:=a[i];
a[i]:= a[j];
a[j]:= k;
end;
end;
Один из самых популярных методов сортировки – «пузырьковый» метод основан на том, что в процессе исполнения алгоритма более «легкие» элементы массива постепенно «всплывают». Особенностью данного метода является сравнение не каждого элемента со всеми, а сравнение в парах соседних элементов. Алгоритм пузырьковой сортировки по убыванию состоит в последовательных просмотрах снизу вверх (от начала к концу) массива. Если соседние элементы таковы, что выполняется условие. Согласно которому элемент справа больше элемента слева, то выполняется обмен значениями этих элементов.
Фрагмент программы:
for i:=2 to n do {Сортировка «пузырьковым» методом по невозрастанию}
for j:=n downto i do
begin
if a[j] < a[j+1 ] then {Если элемент справа больше элемента слева, т
о «вытеснить» его влево – пузырек «всплывет»}
begin
k:=a[j];
a[j]:= a[j+1];
a[j+1]:= k;
end;
end;
Прочти и усвой
Массив – это совокупность конечного числа элементов одного и того же типа, в котором каждый элемент имеет номер, а все элементы общее имя. Номер элемента называется индексом.
Характеристики массива:
тип - общий тип всех элементов массива;
размерность (ранг) - количество индексов максима;
диапазон изменения индекса (индексов) - определяет количество элементов в массиве.
Двумерный массив (прямоугольная таблица (матрица, набор векторов)) - это пример массива, в котором элементы нумеруются двумя индексами.
В качестве номера (индекса) элемента массива используется выражение порядкового типа (чаще integer).
Двумерным массивом называется таблица, состоящая из строк и столбцов. Для описания массива используются два индекса.
А11 А12 А13 ... А1m
A21 A22 A23 ... А2m
... ... ... ... ...
... ... ... ... ...
... ... ... ... ...
An1 An2 An3 ... Anm
Описание массива
Способ 1. В разделе описания переменных
var
ИмяМассива: array [Верх.Гр.1..Ниж.Гр.1,Верх.Гр.2..Ниж.Гр.2] of ТипЭлементов;
Способ 2. В разделе описания типов
type
ИмяМассива: array [Верх.Гр.1..Ниж.Гр.1,Верх.Гр.2..Ниж.Гр.2] of ТипЭлементов;
Способ 3. В разделе описания констант
const
ИмяМассива: array[1..3,1..3] of real=((1.2,2.4,0.4),(0.045,-0.47,0.003),(1.24,1,-7.4));
Заполнение массива данными (ввод элементов)
Массив, описанный как типизированная константа, уже содержит данные. Массивы, объявленные в разделе описания переменных, необходимо заполнить данными, прежде чем выполнять с ними какие-либо действия.
Значения элементов массива также можно задать следующими способами:
при вводе данных с клавиатуры:
write('Введите количество строк и столбцов');
readln(n,m);
for i:=1 to n do
for j:=1 to m do
begin
write('a[',i,',',j,']='); {Можно эту строчку в программе не использовать}
readln(a[i,j]);
end;
с помощью датчика случайных чисел:
randomize;
writeln('Введите количество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=random(50);
writeln('a[',i,',',j,']=',a[i,j]);
end;
присваением заданных значений (например по формуле i*i/i+2):
writeln('Введите количество элементов массива');
readln(n);
for i:=1 to n do
begin
a[i]:=i*i/i+2;
writeln('a[',i,',',j,']=',a[i,j]);
end;
Вывод массива
вывод в столбец:
for i:=1 to n do
writeln(a[i,j]);
по строкам и столбцам:
for i:=1 to n do
begin
for j:=1 to m do
begin
write(a[i,j]:3);
end;
readln;
end;
Обработка массивов
Часто требуется вычислить сумму элементов массива, их среднее арифметическое значение или найти значения и номера максимального и минимального элементов, а также изменить значения элементов массива и т.д. Особенность работы с двумерными массивами заключается в том, что расширяется возможность обработки массива (появились новые элементы: строки, столбцы - являющиеся одномерными массивами). Подробно все действия можно рассмотреть в задачах разобранных в этом разделе.
Квадратная матрица
Квадратной называется такая матрица, в которой количество строк равно количеству столбцов. Выделяют следующие элементы квадратной матрицы:
главная диагональ;
побочная диагональ;
элементы, расположенные выше главной диагонали;
элементы, расположенные ниже главной диагонали;
элементы, расположенные выше побочной диагонали;
элементы, расположенные ниже побочной диагонали;
Главная диагональ. Если значения индексов (i, j) элемента равны, то элементы расположены на главной диагонали.
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
if i=j then <инструкции>
Побочная диагональ. Если для значений индексов (i, j) элементов выполняется равенство: i+j=n+1, то элементы расположены на побочной диагонали.
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
if i+j=n+1 then <инструкции>
Для элементов, расположенных выше главной диагонали необходимо использовать один из следующих фрагментов программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i < j then <инструкции>
for i:=1 to n-1 do
for j:=i+1 to n do
<инструкции>
Если элементы расположены на главной диагонали и выше её необходимо использовать следующий фрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i<=j then <инструкции>
Для элементов, расположенных ниже главной диагонали необходимо использовать следующий фрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i>j then <инструкции>
Для элементов, расположенных ниже главной диагонали и не ней необходимо использовать следующий фрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n do
for j:=1 to n do
if i>=j then <инструкции>
Если элементы, расположены выше побочной диагонали, то необходимо использовать следующий фрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=1 to n-1 do
for j:=1 to n-1 do
if i+j<=n then <инструкции>
Если элементы, расположены ниже побочной диагонали, то необходимо использовать следующий фрагмент программы:
А11 А12 А13 А14
A21 A22 A23 А24
A31 A32 A33 А34
A41 A42 A43 А44
for i:=2 to n do
for j:=2 to n-1 do
if i+j>n+1 then <инструкции>
Транспонирование матрицы.
Транспонированной матрицей называется матрица, у которой столбцы соответствуют строкам исходной квадратной матрицы. При этом элементы главной диагонали исходной и транспонированной матриц, одни и те же.
Операция транспонирования сводится к обмену элементов матрицы, расположенных симметрично главной диагонали.
Исходная матрица
Транспонированная матрица
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
Фрагмент программы транспонирования матрицы:
for i:=1 to n do {Просмотр всех строк матрицы}
for j:=i+1 to n do {Просмотр всех элементов в строке, расположенных выше главной диагонали}
begin
k:=a[i,j];
a[i,j]:= a[j,i];
a[j,i]:= k;
end;
СТРОКИ
В информатике часто используются массивы типа char, которые выделены в отдельный строковый тип - string[n] - где n<=255.
Способы описания переменных - строк аналогичны описанию массивов:
В разделе описания типов:
type
word=string [ 20 ];
var
a:word;
В разделе описания переменных:
var
a,b,c:string [ 30 ];
d:string [ 54 ];
Можно определить строковую переменную и ее начальное значение как констант-строку:
const
st:string[11]='информатика';
Символы, составляющие строку, занумерованы слева направо, начиная с нуля. К ним можно обращаться с помощью индексов, как к элементам одномерного массива. Ввод и вывод элементов массива осуществляется с помощью циклов.
Над строками можно выполнять следующие действия:
Сцепление (сложение)
A1:='привет '; (string [7])
A2:='друг'; (string [4])
A3:=A1+A2;
значение A3 стало:'привет друг' (string[11])
Следует учитывать, что в операциях сцепления длина результирующей строки не должна превышать 255.
Операция сравнения.
Сравниваются первые символы двух строк. Если они не равны, то большим считается то значение строковой переменной, код первого символа которого больше. Если первые символы одинаковы, то сравниваются следующие. Если все символы одной строки совпадают с символами другой строки, то они считаются равными. В случае, когда последовательное сравнение пар символов не обнаружило различия, но одна строка длиннее другой, то ее значение считается большим.
'пролив' > 'прилив'
'11111' > '111'
'11111' < '2'
'fbr' > 'cru' т.к. 'f'>'c'
Функции:
функция соединения: CONCAT(s1,s2,...,sn) - складывает строки s1,s2,...,sn (результат не должен превышать 255);
функция выделения: COPY(S,T,K) где S - какая строка, T - с какого элемента, K - сколько элементов выделять;
st:='Привет!'; s:=copy(st,4,3); {Результатом будет следующая строка} s='вет';
st1:='Привет!'; s1:=copy(st,4,10); {Результатом будет следующая строка} s1='вет!';
функция определения длины строки: LENGTH(S) - результатом является число;
st:='Привет!'; k:=length(st); {Длина результирующей строки равна} k=7;
st1:='Всем привет!'; k1:=length(st1); {Длина результирующей строки равна} k1=12;
функция определения позиции: POS(T,S), где T - элемент, позицию которого надо определить, S - строка, в которой будет определение;
st1:='abcdef';
pos('de',st1)=4;
pos('r',st1)=0;
Процедуры:
процедура вырезания: DELETE(S,T,K), где S - какая строка, T - с какого элемента, K - сколько элементов вырезать;
st:='abcdef';
delete(st,2,3);
{Результатом будет следующая строка} st='aef';
процедура вставки: INSERT(T,S,K), где T - что вставлять, S - в какую строку, K - с какой позиции;
st1:='12389';
st2:='4567';
insert(st2,st1,4);
{Результатом будет следующая строка} st1='123456789';
процедура преобразования числа в строку: STR(T,S), где T - число, которое будет преобразовано, S - строка, в которую будет преобразовано число;
str(1500,st)='1500';
str(1500:6,st)=' 1500';
процедура преобразования строки в число: VAL(S,K,T), где S - из какой строки, K - будущее число, T - с какого места.
Символьный тип(char)
K типу char относится любой символ заключенный в апострофы. Для представления апострофа как символьную переменную, надо заключить его в апостроф.
Каждый символ имеет свой код и номер. Порядковые номера цифр 0,1..9 упорядочены по возрастанию. Порядковые номера букв также упорядочены по возрастанию, но не обязательно следуют друг за другом.
К символьным данным применимы знаки сравнения: > , < , >=, <=, <> .
Например: 'A' < 'W'
Функции, которые применимы к символьным переменным:
ORD(X) - определяет порядковый номер символа Х.
Пример: ord('a')=97.
CHR(X) - определяет символ по номеру.
Пример: chr(97)='a'.
PRED(X) - выдает символ, стоящий перед символом Х
Пример: pred('B')='A'
SUCC(X) - выдает символ, следующий после символа Х
Пример: succ('A')='B'.
UPCASE(ch) - преобразует строчную букву в прописную. Обрабатывает только буквы латинского алфавита.
ЗАПИСИ
При решении задач обработки большого количества значений используются массивы. Но при работе с массивами основное ограничение заключается в том, что каждый элемент массива должен иметь один и тот же тип данных. Иногда для решения задач, в которых возникает необходимость хранить и обрабатывать данные различных типов, используются отдельные массивы для каждого типа данных, а установление соответствия между ними выполняется при помощи индексов. Но есть способ лучше.
Распространенным случаем является необходимость описать атрибуты (характеристики) некоторого объекта, представляемого и обрабатываемого в программе. Таким объектом может быть человек, некоторый вычислительный комплекс и т.д. В этих и во всех подобных случаях атрибуты объекта представляются значениями различных типов и поэтому для их описания не могут быть использованы массивы. Для описания объекта человек могут понадобиться, например, следующие характеристики:
Фамилия, имя, отчество (символьные массивы или строки);
Пол (перечислимый тип из двух значений);
Индекс специальности (целое) и т.д.
Таким образом, описание комбинированного типа представляет собой список описаний его элементов (которое называется также полями записи);
Для записи комбинации данных разных типов в Turbo Pascal применяется комбинированный тип данных запись . Запись представляет собой наиболее общий и гибкий структурированный тип данных, т.к. она может быть образована из неоднотипных компонентов, и в ней явным образом выражена связь между элементами данных, которые характеризуют реальный объект.
Запись - это структурированный тип данных, состоящий из фиксированного числа компонентов одного или нескольких типов, называемых полями записи. Каждое поле имеет свое имя.
Объявление типа записи.
type
ИмяТипа= record
ИмяПоля1: ТипПоля1;
ИмяПоля2: ТипПоля2;
ИмяПоляN: ТипПоляN;
end;
Затем объявляются переменные соответствующего типа.
var
ИмяПеременной: ИмяТипа;
Например:
Пример 1.
type
avto=record
number: integer; {номер автомобиля}
marka: string[20]; {марка автомобиля}
fio: string[40]; {фамилия, инициалы владельца}
address: string[60]; {адрес владельца}
end;
var
m: avto;
Пример 2.
type address=record
k: longint; {почтовый индекс}
city: string[10]; {название города}
street: string; {название улицы}
house: integer; {номер дома}
flat: integer; {номер квартиры}
end;
Значение полей записи могут использоваться в выражениях. Обращение к значению поля осуществляется с помощью имени переменной и имени поля, разделенных точкой. Такая комбинация называется составным именем. Например, чтобы получить доступ к полям записи avto, надо записать:
m.number, m.marka, m.fio, m.address
Составное имя можно использовать везде, где допустимо применение типа поля: в операторах присваивания, операторах ввода и вывода.
Обращение к полям записи имеет несколько громоздкий вид. Для решения этой проблемы в языке Turbo Pascal имеется оператор присоединения with , в виде:
with m do
begin
number:=1954;
marka:='Audi - 100'
fio:='Иванов И.И.';
address:='ул. Бочкарева 7 кв.38';
end;
Записи могут быть элементами массивов. Отдельные поля записей тоже могут быть записями. За счет этого в Паскале можно создавать сложные структуры данных:
type
anketa=record
facult: string;
group: 1..6;
fio: string;
address=record
k: longint;
city: string[10];
street: string;
house, flat: integer;
flat: integer; {номер квартиры}
end;
bd=record
date: 1..31;
month: 1..12;
year: integer;
end;
end;
var
ved: array[1..20] of anketa;
Здесь переменная ved – это массив записей. Каждая запись состоит из пяти полей, причем два последних поля сами являются записями. Обращение к элементам таких сложных структур происходит по составным именам, например: ved[5].address.city:=’Корытово’.
