ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.10.2024
Просмотров: 7
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
САОД
Лабораторная работа № 1 1
Лабораторная работа № 1
Статические и динамические массивы
Цель работы: изучение статических и динамических массивов в Delphi и ос- воение приемов работы с ними.
Общие сведения
По признаку размещения в памяти массивы подразделяются на статические
(static) и динамические (dynamic).
Статические массивы
Статический массив представляет собой массив, границы индексов и, соответ- ственно, размеры которого задаются при объявлении, т. е. они известны еще до ком- пиляции программы.
Описание массивов
Простые типы данных определяют различные множества атомарных (неразде- лимых) значений. В отличие от них структурные типы данных задают множества сложных значений, каждое из которых образует совокупность нескольких значений другого типа. В структурных типах выделяют регулярный тип (массивы).
С понятием "массив" приходится сталкиваться при решении научно- технических и экономических задач обработки совокупностей большого количества значений. В общем случае массив - это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип.
Название регулярный тип (или ряды) массивы получили за то, что в них объе- динены однотипные (логически однородные) элементы, упорядоченные по индек- сам, определяющим положение каждого элемента в массиве.
В качестве элементов массива можно использовать и любой другой ранее опи- санный тип, поэтому вполне правомерно существование массивов записей, массивов указателей, массивов строк, массивов и т.д. Элементами массива могут быть данные любого типа, включая структурированные. Тип элементов массива называется базо-
вым. Особенностью языка Паскаль является то, что число элементов массива фик-
сируется при описании и в процессе выполнения программы не меняется.
Элементы, образующие массив, упорядочены таким образом, что каждому эле- менту соответствует совокупность номеров (индексов), определяющих его местопо- ложение в общей последовательности. Доступ к каждому отдельному элементу осуществляется путем индексирования элементов массива. Индексы представляют собой выражения любого скалярного типа, кроме вещественного. Тип индекса опре- деляет границы изменения значений индекса. Для описания массива предназначено словосочетание: array of (массив из).
Формат записи массивов:
Type
САОД
Лабораторная работа № 1 2
<имя типа> = array [тип индекса] of <тип компонента>;
Var
<идентификатор,..> : <имя типа>;
Массив может быть описан и без представления типа в разделе описания типов данных:
Var
<идентификатор,...> : array [тип индекса] of <тип компонента>;
Примеры описания одномерных и двумерных массивов
Если в описании массива задан один индекс, массив называется одномерным, если два индекса - двумерным, если n индексов — n-мерным массивом. Одномерный массив соответствует понятию линейной таблицы (вектора), двумерный - понятию прямоугольной таблицы (матрицы, набору векторов). Размерность ограничена толь- ко объемом памяти конкретного компьютера.
Одномерные массивы обычно используются для представления векторов, а
двумерные - для представления матриц.
Одномерные массивы:
Type
Klass = (К1, К2, КЗ, К4) ;
Znak = array [1..255] of char;
Var
Ml: Znak; {Тип Znak предварительно описан в разделе типов}
М2: array[1..60] of integer; {Прямое описание массива М2}
МЗ: array[1..4] of Klass;
Mas: array[1..4] of integer;
Если в качестве базового типа взят другой массив, образуется структура, кото- рую принято называть многомерным массивом.
Двумерные массивы:
Type
Vector = array[1..4] of integer;
Massiv = array[1..4] of Vector;
Var
Matrix : Massiv;
Ту же структуру можно получить, используя другую форму записи:
Var
Matrix : array[1..4,1..4] of integer ;
Для описания массива можно использовать предварительно определенные кон- станты:
Const
G1 = 4; G2 = 6;
Var
MasY: array[1..Gl, l..G2] of real;
САОД
Лабораторная работа № 1 3
Элементы массива располагаются в памяти последовательно. Элементы с
меньшими значениями индекса хранятся в более низких адресах памяти. Многомер-
ные массивы располагаются таким образом, что самый правый индекс возрастает
самым первым.
Например, если имеется массив:
A:array[1..5,1..5] of integer; то в памяти элементы массива будут размещены по возрастанию адресов:
А[1,1] А[1,2] … А[1,5] А[2,1] А[2,2] … А[5,5]
В Паскале количество элементов массива всегда должно быть фиксировано, т. е. определяться при трансляции программы. Но не во всех программах можно зара- нее предсказать необходимый размер массива (который может определяться в зави- симости от тех или иных условий, возникающих в процессе исполнения). В про- граммах, обрабатывающих массивы, помимо использования для определения разме- ра массива предварительно определенных констант иногда используется прием, по- зволяющий имитировать работу с массивами переменной длины, который заключа- ется в следующем: в разделе описания констант предварительно определяют воз- можное максимальное значение размера массива, а затем в программе запрашивают текущее значение размера и используют это значение далее при заполнении и обра- ботке массива.
Действия над массивами
Для работы с массивом как единым целым используется идентификатор масси- ва без указания индекса в квадратных скобках. Массив может участвовать только в операциях отношения "равно", "не равно" и в операторе присваивания. Массивы, участвующие в этих действиях, должны быть идентичны по структуре, т. е. иметь одинаковые типы индексов и одинаковые типы компонентов.
Например, если массивы А и В описаны как
Var
А, В ; array[1..20] of real;
то применение к ним допустимых операций даст следующий результат:
Выражение
Результат
А=В
True, если значение каждого элемента массива А равно со- ответствующему значению элемента массива В
А<>В
True, если хотя бы одно значение элемента массива А не равно значению соответствующего элемента массива В
А:=В
Все значения элементов массива В присваиваются соответ- ствующим элементам массива А. Значения элементов мас- сива В остаются неизменны.
Действия над элементами массива
После объявления массива каждый его элемент можно обработать, указав
идентификатор (имя) массива и индекс элемента в квадратных скобках. Например, запись Mas[2], Vector[10] позволяет обратиться ко второму элементу массива Mas и
САОД
Лабораторная работа № 1 4 десятому элементу массива Vector. При работе с двумерным массивом указываются два индекса, с n-мерным массивом - n индексов. Например, запись Matr[4,4] делает доступным для обработки значение элемента, находящегося в четвертой строке
четвертого столбца массива Matr.
Индексированные элементы массива называются индексированными переменны-
ми и могут быть использованы так же, как и простые переменные. Например, они могут находиться в выражениях в качестве операндов, использоваться в операторах
for, while, repeat; им можно присваивать любые значения, соответствующие их типу.
Рассмотрим типичные ситуации, возникающие при работе с данными типа array.
Для этого опишем три массива и четыре вспомогательные переменные:
Var
A,D : array [l.,4] of real;
В : array [1..10,1..15] of integer;
I, J, К : integer;
S : real;
Инициализация (присваивание начальных значений) массива заключается в при- сваивании каждому элементу массива одного и того же значения, соответствующего базовому типу. Наиболее эффективно эта операция выполняется с помощью опера- тора for, например:
Инициализация элементов одномерного массива А:
for I := 1 to 4 do
A[I] := 0;
Для инициализации двумерного массива обычно используется вложенный
оператор for, например:
Инициализация двумерного массива В:
for I := I to 10 do
for J := 1 to 15 do
B[I,J]:= 0;
Визуализации работы с массивами
В Delphi для визуализации работы с одномерным массивом можно использо- вать компонент класса TListBox со страницы Standard палитры компонентов. Этот визуальный компонент представляет собой стандартное окно списка Windows, по- зволяющее работать с отдельными элементами. К элементам списка разрешен ин- дексный способ доступа, как это делается при работе с массивами. В списках могут храниться строковые значения в паре с некоторым целочисленным значением. Кро- ме того, элементы списка могут динамически добавляться и удаляться, что делает этот компонент удобным для отображения меняющихся данных.
САОД
Лабораторная работа № 1 5
Таблица 1. Основные свойства объектов типа TListBox
Свойство
Тип
Комментарий
Items
TStrings
Содержит массив строк, появляющихся в списке. Строки пронумерованы, начиная с 0
Itemlndex
Integer
Номер текущего выбранного элемента в списке. Если не выбрана ни одна строка, то значение свойства равно -1
Таблица 2. Основные свойства объектов типа TStrings
Свойство
Тип
Комментарий
Strings [i: integer]
String
Массив строк с номерами 0... Count-1
Count
Integer
Общее количество элементов
Таблица 3. Основные методы объектов типа TStrings
Метод
Комментарий
Add (s: String)
Добавляет новую строку в массив строк
Clear
Очищает массив (делает Count=0)
Примечание. Индексация элементов таблицы производится с помощью двух чисел - номеров ко- лонки (столбца) и ряда (строки). Нумерация ведется, начиная с 0.
Для визуализации работы с двумерным массивом можно использовать компо- нент TStringGrid со страницы Additional палитры компонентов, предназначенный для создания таблиц, в ячейках которых располагаются произвольные текстовые строки.
В табл. 4 приведены некоторые свойства компонента TStringGrid, необходи- мые для выполнения данной лабораторной работы.
Таблица 4. Основные свойства объектов типа TStringGrid
Свойство
Тип
Комментарий
Cells [ACol, ARow:
Integer]
String
Определяет содержимое ячейки с табличными координатами (ACol, ARow)
Cols[ACol: Integer]
TStrings
Все строки колонки с номером ACol
Rows[ARow:
Integer]
TStrings
Все строки ряда с номером ARow
ColCount
Integer
Общее количество столбцов
RowCount
Integer
Общее количество рядов
FixedCols
Integer
Количество фиксированных (заголовочных) столбцов
FixedRows
Integer
Количество фиксированных (заголовочных) рядов
Col
Integer
Номер столбца текущей ячейки
Row
Integer
Номер ряда текущей ячейки
Options
TGridOptions
Данное свойство множественного типа определяет рад дополнительных парамет- ров таблицы. В частности, нам наиболее важны следующие:
goEditing
Разрешается редактирование ячеек таблицы
САОД
Лабораторная работа № 1 6 goTabs
Разрешается перемещение по ячейкам с помощью клавиши Tab и комбинации
Shift+Tab
Примечание. Для разрешения редактирования в ячейках таблицы необходимо установить значе- ние True для подсвойства goEditing свойства Options компонента TStringGrid.
Все вышесказанное справедливо для статических массивов.
Динамические массивы
Динамический массив представляет собой массив, для которого при объявле- нии указывается только тип его элементов, а размер массива определяется при вы- полнении программы.
При создании приложения, работающего с данными неизвестной заранее раз- мерности, желательно не ограничивать пользователя какими-то жесткими рамками в количестве элементов данных. Поэтому используют списки и таблицы, позволяю- щие динамически менять свои размеры. Для обработки данных часто удобно ис- пользовать динамические массивы. Скорость обращения к ним значительно превос- ходит скорость обращения к элементам списков и ячейкам таблиц.
Размер динамического массива не известен заранее и может изменяться в про- цессе работы программы. Память под динамический массив выделяется не при его объявлении, а при присвоении значения массиву или при вызове процедуры
SetLength. Переменная типа динамического массива является указателем – к ней применимы операции над указателями (кроме ^). Тип индексов для динамического массива – только целый. Нижняя граница индексов – всегда 0.
При объявлении динамических массивов тип индексов не указывается
Type <тип массива > = array of <базовый тип>;
Пример:
Type TArray = array of real;
Var A: TArray;
B: Array of string;
Первоначально переменная имеет значение nil – массив имеет длину 0. Для установки новой длины используется процедура
SetLength(динамический массив, длина).
Пример:
SetLength(A,50);
SetLength(B,I);
Элементы массива A будут иметь номера от 0 до 49. Элементы массива B – от 0 до i-1.
Если новое значение длины больше старого, то происходит добавление новых
САОД
Лабораторная работа № 1 7 элементов в конец массива и их значения будут не определены. Если новое количе- ство элементов меньше старого, то последние элементы массива отбрасываются.
Обращение к элементам массива происходит по номеру:
A[10]:=0.34;
Для освобождения памяти, выделенной под динамический массив необходимо присвоить соответствующей переменной значение NIL.
A:=Nil;
При этом размер массива станет равен нулю.
Присваивание переменных типа динамического массива приводит к тому, что две переменных указывают на один и тот же массив.
Для динамического массива определены функции Low(A) – нижняя граница,
High(A) – верхняя граница индексов элементов, Length(A) – количество элементов массива.
Функция Copy (A, m, n) возвращает отрезок массива начиная с элемента с но- мером m и длиной n.
Если необходимо передавать динамические массивы в качестве фактических параметров в процедуры и функции, то формальные параметры должны являться открытыми массивами.
Динамические массивы могут иметь несколько измерений. Например двумер- ный массив целых чисел можно описать так:
Type TDArray= array of array of integer;
Var A: TDArray;
Далее в программе можно задать размер массива с помощью процедуры
SetLength
SetLength(A,100,200);
Матрица A будет иметь 100 строк (от 0 до 99) и 200 столбцов (от 0 до 199). Обращаться к элементу матрицы можно традиционно – A[i,j].
Можно создать двумерные динамические массивы, которые не будут прямо- угольными. Для этого сначала с помощью SetLength устанавливается количество строк массива:
Var Ints: array of array of Integer;
САОД
Лабораторная работа № 1 8
SetLength(Ints,10); выделит память под 10 строк. Затем указывается количество элементов в каждой строке (оно может быть разным), например
SetLength(Ints[1], 7);
SetLength(Ints[2], 5);
SetLength(Ints[3], 9);
В следующем примере используются динамические массивы для создания треугольной матрицы из строк:
Var
A : array of array of string;
I, J : Integer; begin
SetLength(A, 10); for I := Low(A) to High(A) do begin
SetLength(A[I], I); for J := Low(A[I]) to High(A[I]) do
A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' '; end;
Пример формирования массива для хранения треугольной матрицы
SetLength(a, GridArray.ColCount-2);
{Установка длины массива по столбцам}
for x:=0 to Length(a)-1 do
SetLength (a[x], GridArray.RowCount-2);
{Установка длины массива по рядам}
for x:=0 to Length (a)-1 do for y:=0 to Length (a[x])-l doa[x,y]:=StrToFloat(GridArray.Се11s[x+1,у+1]);
{Копирование значений}
САОД
Лабораторная работа № 1 9
Задание
1. Задание должно быть выполнено обязательно двумя способами:
- с использованием статического массива;
- с использованием динамического массива.
2. При выполнении задания следует стремиться к минимизации объема ис- пользуемой оперативной памяти.
3. Некоторые задания допускают различные способы интерпретации - выбор за студентом!
Вариант 1.
Дана две треугольные матрицы целых чисел. Объединить их в одну квадрат- ную.
Вариант 2.
Дана квадратная матрица целых чисел. Разделить ее на две треугольные.
Вариант 3.
Сформировать матрицу со случайным количеством элементов в строке. Найти наименьший элемент в каждой из строк матрицы. Вычислить сумму этих элементов.
Вариант 4.
Дана квадратная матрица целых чисел. Сформировать новую матрицу, в стро- ки которой поместить положительные элементы соответствующих строк исходной матрицы.
Вариант 5.
Дан массив из ста элементов, значения которых находятся в диапазоне от 1 до
100. Сформировать матрицу, поместив в первую ее строку числа из исходного мас- сива в диапазоне от 1 до 10, во вторую ее строку - числа в диапазоне от 11 до 20 и т.д.
Вариант 6.
Дан массив символов. Сформировать матрицу, поместив в первую ее строку цифры из исходного массива, во вторую ее строку - латинские буквы, в третью ее
САОД
Лабораторная работа № 1 10 строку - русские буквы, в четвертую ее строку - знаки.
Вариант 7.
Дана квадратная матрица целых чисел. Разделить ее на две матрицы, поместив в соответствующие строки положительные и отрицательные элементы исходной матрицы.
Вариант 8.
Дана квадратная матрица символов. Разделить ее на три матрицы, поместив в соответствующие строки латинские буквы, цифры и знаки из исходной матрицы.
Вариант 9.
Дана квадратная матрица целых чисел. Исключить из матрицы все вхождения наибольшего и наименьшего чисел.
Вариант 10.
Дана квадратная матрица целых чисел. Из начала каждой строки матрицы ис- ключить количество элементов равное ее номеру.
Содержание отчета
Титульный лист.
Задание.
Теоретические положения (описание и использование статических и динами- ческих массивов в Delphi; описание средств визуализации массивов в Delphi).
Текст проекта (проектов).
Результаты работы программы, использующей статический массив.
Результаты работы программы, использующей динамический массив.
Список использованных источников.
Отчет оформляется в электронном виде с обязательным приложением
проекта.