
Тема 5. Алгоритмы работы со структурированными типами данных
Наряду с простыми типами, рассмотренными в предыдущих темах, существуют структурированные типы данных, которые могут представлять совокупность значений. Переменные этих типов имеют структуры, которые определяются Виртом как совокупность связанных данных и множество правит, определяющих их организацию и способ доступа к элементам данных. Выбором той или иной структуры данных определяется и алгоритм обработки данных, от которого зависит эффективность их обработки.
В языке Pascal определены следующие стандартные структурированные типы данных:
массив;
запись;
строка;
множество.
Алгоритм работы со строками были рассмотрены в предыдущей теме. В данной теме будут рассмотрены алгоритмы работы с массивами и записями.
Лабораторная работа № 12. Стандартные алгоритмы работы с одномерными массивами Теория
Массив представляет собой совокупность пронумерованных однотипных значений, имеющих общее имя. Элементы массива обозначаются переменными с индексами. Индексы записывают в квадратных скобках после имени массива. Например:
T[l],T[5],T[i],H[1981,9],H[i,j] и т.п.
Массив, хранящий линейную таблицу, называется одномерным. Тип элементов массива называется его базовым типом.
Массив описывается в разделе описания переменных в следующей форме:
Var ИмяМассива: Array[ТипИндекса] Of ТипЭлемента
Чаще всего в качестве типа индекса употребляется интервальный тип. Например:
Var T: Array[1..12] Of Real;
Описание массива определяет, во-первых, размещение массива в памяти, во-вторых, правила его дальнейшего употребления в программе. Последовательные элементы массива располагаются в последовательных ячейках памяти (Т[1], Т[2] и т. д.), причем значения индекса не должны выходить из диапазона 1... 12. В качестве индекса может употребляться любое выражение соответствующего типа. Например, T[i+j ], T[m div 2].
Тип индекса может быть любым скалярным порядковым типом, кроме integer.
Часто структурированному типу присваивается имя в разделе типов, которое затем используется в разделе описания переменных.
Type
Masl=Array [1..100] Of Integer;
Mas2=Array [-10..10] Of Char;
Var Num: Masl; Sim: Mas2;
В Turbo Pascal существуют только статические массивы, а это означает, что при описании массива надо точно указать границы его индексов. Изменение размеров массива происходит через изменение в тексте программы и повторную компиляцию. Для упрощения таких изменений удобно определять индексные параметры в разделе констант:
Const N=10;
Var Mas: Array[1..N] Of Integer;
Теперь для изменения размеров массива Mas и всех операторов программы, связанных с этими размерами, достаточно отредактировать только одну строку в программе — раздел констант.
Другой вариант использовать в программе массива с изменяющимся количеством элементов – это зарезервировать место для элементов массива с «запасом». А во время работы программы вводить количество используемых элементов массива.
Действия над массивом как единым целым допустимы лишь в двух случаях:
• присваивание значений одного массива другому;
• операции отношения «равно», «не равно».
В обоих случаях массивы должны иметь одинаковые типы (тип индексов и тип элементов). Например:
Var A,B: Array[1..10] Of Real;
При выполнении операции присваивания A: =B все элементы массива A станут равны соответствующим элементам массива B.
Массив можно описать как типизированная константа. В этом случае можно задать начальные значения элементов массива непосредственно в программе:
Type mas=array [1..7] of integer;
Const A: mas = (3, 6, -2, 4, 0, 5, -1);
В
отличие от обычных констант значение
типизированных констант может изменяться
во время работы программы. Таким образом
описание массива через типизированные
константы своеобразная инициализация
массива.
Обработка массивов в программах производится покомпонентно т.е. в цикле. Приведем блок-схему и программу ввода значений в массивы:
program Vvod;
var N,I: integer;
T: array [1..100] of real;
begin
WriteLn(‘Укажите кол-во элементов массива’);
ReadLn(N);
For I:=l To N Do
begin
WriteLn('Введите T[‘,I,’]’);
ReadLn(T[I]);
end;
Здесь каждое следующее значение будет вводиться с новой строки с соответствующими комментариями. Для построчного ввода используется оператор Read.
Для ввода элементов массива можно создать процедуру. Чтобы можно было использовать массив как параметр его надо описать как новый тип.
Пример ввода массива в процедуре:
Type
Msa=Array [1..20] Of Integer;
Var T:Mas,
N: Integer;
Procedure Vvod(Nmas: Integer; Var A: Mas);
Var I: Integer;
begin
For I:=1 To Nmas Do
Read(A[I]);
end;
Следует обратить внимание, что массив определяется как параметр-переменная, т.к.в процедуре изменяется значение элементов массива.
В основной программе ввод будет иметь вид:
begin
WriteLn(‘Укажите кол-во элементов массива’);
ReadLn(N);
WriteLn(‘Введите элементы массива в строчку’);
Vvod(N,T);
Аналогично в цикле по индексной переменной организуется вывод значений массива. Блок-схема этого алгоритма ничем не отличается от блок-схемы ввода.
Пример программы вывода элементов массива.
For I:=l То N Do
WriteLn(‘T[‘,I,’]= ’, T[I]) ;
Эта программа выводит каждый элемент в отдельной строке.
Процедура вывода элементов массива в строчку будет иметь вид:
Procedure Vivod(Nmas:Integer, A:Mas);
Var I:Integer;
begin
For I:=1 To Nmas Do
Write(A[I]:5);
WriteLn;
end;
Обратите внимание, что при выводе массив описывается как параметр значение, а не как параметр переменная.
В
дальнейшем ввод и вывод элементов
массива будет выполняться в
процедурах.