Материал: Лабораторная работа №4 Массивы. Сортировка и поиск

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Лабораторная работа № 4 Структурные типы данных. Множества. Массивы.

Введение

В лабораторной работе рассмотрен тип-множество, основные операторы для работы с этим типом. Рассмотрено описание массивов в языке Object Pascal. Рассмотрены алгоритмы ввода-вывода одно и многомерных массивов, а также алгоритмы вставки и удаления элементов. Рассмотрены некоторые алгоритмы сортировки и поиска данных в массивах.

Структурные типы данных

Структурированные типы

Массивы

 

Множества

 

Записи

 

Файлы

 

 

 

 

 

 

 

Рисунок 1 – Структурированные типы данных

В Object Pascal определено четыре структурированных типа данных: массивы, записи, множества и файлы (Рисунок 1). Все эти типы характеризуются множественностью образующих их элементов. Каждая переменная структурированного типа содержит в себе несколько компонентов, каждый компонент, в свою очередь, может также принадлежать к структурированному типу. В Object Pascal произвольная глубина вложенности типов, однако размер переменной не может превышать 2 Гб*.

Множества

Множества – это наборы однотипных логически связанных друг с другом объектов. Количество элементов, входящих в множество, может изменяться от 0 до 256. Два множества называются эквивалентными если все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, то говорят о включении первого множества во второе. Пустое множество включается в любое другое. Синтаксис описания типа множества имеет вид

<имя типа> = set of <базовый тип>;

Здесь имя типа – правильный идентификатор; set, of – зарезервированные слова (множество, из);

базовый тип – базовый тип элементов множества в качестве которого может использоваться любой порядковый тип число значений которого не превосходит 256. Например:

type

TChars

= set of char;

 

TDigitsChar

= set

of

‘0’..’9’;

 

TDigits

= set

of

0..9;

* Это ограничение связано с ограничениями Windows. Для Windows 3.x это ограничение 64 Кб. Для

Windows 9x, Windows NT/2000/XP это ограничение 2Гб.

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

При объявлении типа TChars в качестве базового типа используется тип char т.к. число различных значений его не превосходит 256. Для остальных двух типов используется тип диапазон. Обратите внимание, что следующее определение типа ошибочно, т.к. тип Integer имеет более 256 различных значений.

type TInt=set of Integer;

Заполнить множество элементами можно с помощью конструктора множества, конструктор множества имеет следующий синтаксис

<имя множества>:=[<список элементов множества>];

Например

var

s1:TChars;

 

s2: TDigits;

begin

 

…

 

s1:=[‘a’..’d’, ‘e’, ‘h’]; s2:=[1, 2, 5];

…

end.

Описание операций определенных над множествами приведено в таблице 1.

Таблица 1 – Операции над множествами

Операция Описание

*Пересечение множеств

+Объединение множеств

-Разность множеств

=Проверка эквивалентности, возвращает true если множества эквивалентны

<>

Проверка не эквивалентности

<=

Проверка вхождения, возвращает true, если первое множество включено во

 

второе

>=

Проверка вхождения, возвращает true, если второе множество включено в

 

первое

in

Проверка принадлежности, возвращает true, если элемент принадлежит

 

множеству.

Демонстрация некоторых операций со множествами приведена в листинге 1.

Листинг 1

program Sets;

{$APPTYPE CONSOLE}

type TWeekDays=(mo, tu, we, th, fr, sa, su); TDays=set of TWeekDays;

var Days:TDays;

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

I :TWeekDays;

begin Days:=[mo..fr];

//вывод списка рабочих дней writeln('Rabochie dni:'); for i:=mo to su do

if i in Days then case i of

mo: writeln('monday'); tu: writeln('tuesday'); we: writeln('wednesday'); th: writeln('thursday'); fr: writeln('friday'); sa: writeln('saturday'); su: writeln('sunday');

end;

readln;

end.

Массивы

Отличительной чертой массивов является то, что они содержат компоненты только одного типа (в том числе и структурированного).Эти компоненты легко упорядочить и обеспечить доступ к любому из них указав его порядковый номер, индекс. Описание массива имеет следующий вид

<имя типа>=array [<список индексов>] of <тип элемента>;

Здесь <имя типа> – правильный идентификатор; array, of – зарезервированные слова;

<список индексов> – список из одного или нескольких индексных типов; <тип элемента> – тип элементов массива.

В качестве индексного типа может использоваться любой порядковый тип, кроме типов число значений которых превосходит 232. Обычно в качестве индексного типа используется тип-диапазон в котором задаются границы изменения индексов. Примеры объявлений массива приведены ниже.

type TByteArray=array [byte] of Integer; TAZCharArray=array['a'..'z'] of char; TMyArray=array[1..100] of real;

//массивы можно объявлять сразу в разделе var var a:array [1..5] of Integer;

b:array [5..9] of string;

Так как тип элемента идущий за of может быть любым, в том числе с структурированным, то он может быть и другим массивом, например

TMatrix=array [0..5] of array [-2..7] of real;

Такую запись обычно заменяют более компактной

TMatrix=array [0..5, -2..7] of real;

Глубина вложенности структурированных типов, как отмечалось выше не ограничена, но существует ограничение на максимальный размер переменной в 2 Гб. Массивы

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

объявленные выше называют многомерными. Трехмерный массив объявляется следующим образом.

TMatrix=array [0..5, -2..7, 0..7] of real;

В Object Pascal можно одним оператором присваивания передать все элементы одного массива другому массиву того же типа, например.

var

a,b: array [0..5] of real; begin

…

a:=b;

…

end.

Следует отметить, что объявление

var

a:array [0..5] of real;

b:array [0..5] of real;

создаст разные типы массивов, поэтому при их присваивании возникнет ошибка (несоответствие типов).

Для доступа к элементу массива применяется оператор [], например

var

a: array [0..5] of real;

c: array [0..5, 0..2] of real;

begin a[1]:=1.0; a[2]:=3.5; c[0, 1]:=a[1];

end.

Операция сравнения массивов в Object Pascal не определена, сравнить два массива можно поэлементно. Пример программы для сравнения двух массивов приведен в листинге 2.

Листинг 2

program Arrays2;

{$APPTYPE CONSOLE}

const n=10;

var a, b:array [1..n] of real; equal:Boolean;

i:Integer;

begin

…

equal:=True;

for i:=Low(a) to High(a) do if a[i]<>b[i] then

begin equal:=False; break;

end;

if not equal then writeln('Masivi ne ravni');

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

…

end.

Обратите внимание на использование функций Low, High при работе с массивами. Для массива функция Low возвращает значение минимального индекса массива, а функция High значение максимального индекса массива.

Ввод-вывод массивов

Программа приведенная в следующем листинге осуществляет ввод и вывод данных из массива.

Листинг 3

program InOut;

{$APPTYPE CONSOLE}

const n=5; //длина массива var a:array [1..n] of real;

i:Integer;

begin

//Ввод одномерного массива for i:=Low(a) to High(a) do

begin

write('a[', i, ']='); readln(a[i]);

end;

{Здесь происходит обработка данных массива}

//Вывод элементов одномерного массива на экран for i:=Low(a) to High(a) do

writeln('a[', i, ']=', a[i]:6:2);

readln;

end.

Для ввода двумерных массивов можно использовать следующий код

Листинг 4

program InOut2;

{$APPTYPE CONSOLE}

const n=5; //число строк матрицы m=2; //число столбцов

var a:array [1..n, 1..m] of real; i, j:Integer;

begin

//Ввод массива for i:=1 to n do

for j:=1 to m do begin

write('a[', i, ',', j, ']=');

Источник: https://studfile.net/preview/15720458/