8. Работа с массивами
Массив – это пронумерованный набор однотипных данных. Тип массива определяется в разделе типов и в общем случае имеет вид
Type имя массива=Array[список индексов и диапазоны их изменения] of тип элемента массива;
Пример объявления массивов:
Type Ta=array[1..10] of integer;
Tb=array[1..5,1..10] of extended;
Var a:Ta; b:Tb;
…………………
a[1]:=25; b[5,10]:=-1.5;
Здесь объявлены: одномерный массив a целого типа, в котором элементы пронумерованы от 1 до 10, и двухмерный массив b вещественного типа, в котором первый индекс может изменяться в пределах от 1 до 5, а второй индекс – от 1 до 10. Индексы для элементов массивов могут быть любыми выражениями целого типа.
Рассмотрим пример написания обработчика нажатия какой–либо кнопки на форме, в котором произведем умножение матрицы A на вектор . В матричной форме это выглядит так:
или или ,
где n – размерность квадратной матрицы A и векторов Y и X.
Для визуализации массивов будем использовать табличные компоненты StringGrid1 для матрицы A, StringGrid2 для вектора X и StringGrid3 для вектора Y. Тогда обработчик события нажатия какой–либо кнопки будет выглядеть следующим образом:
// Обработчик нажатия кнопки
Procedure TForm1.Button1Click(Sender: TObject);
Const Nmax=10; // Максимальная размерность массивов
Type Ta=array[1..Nmax,1..Nmax] of extended;
Txy=array[1..Nmax] of extended;
Var A:Ta; x,y:Txy;n,I,j:integer;
Begin
n:=StrtoInt(Edit1.Text); // Определение текущей размерности массивов
Randomize; // Инициализация датчика случайных чисел
with StringGrid1 do Begin // Подготовка визуальных компонентов
ColCount:=n+1;
RowCount:=n+1;
FixedCols:=1;
FixedRows:=1;
Sells[0,0]:=’A’;
End;
with StringGrid2 do Begin
ColCount:=2;
RowCount:=n+1;
FixedCols:=1;
FixedRows:=0;
Sells[0,0,]:=’X’;
End;
with StringGrid3 do Begin
ColCount:=2;
RowCount:=n+1;
FixedCols:=1;
FixedRows:=0;
Sells[0,0]:=’Y’;
End;
For i:=1 to n do Begin // Заполнение массивов случайными числами
StringGrid1[0,i]:=Inttostr(i);
StringGrid1[i,0]:=Inttostr(i);
StringGrid2[0,i]:=Inttostr(i);
StringGrid3[0,i]:=Inttostr(i);
For j:=1 to n do
A[i,j]:=random;
StringGrid1.Cells[j,i]:=Floattostr(a[i,j]);
X[i]:=ramdom;
StringGrid2.Cells[1,i]:=Floattostr(x[i]);
End;
For i:=1 to n do Begin // Вычисление произведения матрицы на вектор
Y[i]:=0;
For j:=1 to n do
Y[i]:=y[i]+a[i,j]*x[j];
End;
For i:=1 to n do // Заполнение значениями компонента StringGrid3
StringGrid3.Cells[1,i]:=FloattoStr(y[i]);
End;
Рассмотрим теперь задачу сортировки элементов одномерного целого массива в порядке возрастания их значений методом «пузырька», когда можно менять местами только два соседних элемента массива. Размерность массива будет у нас задаваться в компоненте Edit1, начальный массив – в компоненте StringGrid1, а результат сортировки – в компоненте StringGrid2. Обработчик нажатия какой–либо кнопки будут иметь следующий вид:
// Обработчик нажатия кнопки
Procedure TForm1.Button1Click(Sender: TObject);
Const Nmax:=20; // Максимальная размерность массива
Type Ta=array[1..nmax] of integer; // Тип Массива
Var a:Ta; i,j,k,n:integer; // Внутренние переменные
Begin
n:=StrtoInt(Edit1.Text); // Определение размерности массива
StringGrid1.ColCount:=1; // Подготовка визуальных компонентов
StringGrid1.RowCount:=n;
StringGrid2.ColCount:=1;
StringGrid2.RowCount:=n;
Randomize; // Инициализация датчика случайных чисел
// Заполнение начального массива случайными числами
For i:=1 to n do Begin
a[i]:= Random(2*n);
StringGrid1.Cells[0,i-1]:=InttoStr(a[i]);
End;
Repeat // Начало сортировки массива a
J:=0; // Зануление индикатора наличия перестановок
For i:=1 to n-1 do // Проход по всем элементам массива
If a[i]>a[i+1] then Begin
k:=a[i]; // Перестановка двух соседних элементов массива
a[i]:=a[i+1];
a[i+1]:=k;
j:=j+1;
end;
until j<=0; // Проверка наличия перестановок
For i:=1 to n do StringGrid2.Cells[0,i-1]:=inttostr(a[i]); // Вывод результата
End;
Решим теперь эту же задачу, но методом последовательного поиска минимального элемента. Сначала определим среди всех элементов массива минимальный и поменяем его местами с первым. Затем найдем минимальный, начиная со второго элемента, и поменяем найденный минимальный элемент уже со вторым и т.д. Запишем только алгоритм этой сортировки:
For i:=1 to n-1 do Begin // Начало сортировки
j:=a[i]; jmax:=i; // В качестве начального минимального берем i–й эл.
For k:=i+1 to n do // Проходим по всем остальным элементам массива
If j>a[k] then Begin // Сравниваем текущий с запомненным
j:=a[k]; jmax:=k; // Запоминаем новый минимальный элемент
end;
if jmax<>i then Begin
// Если нашли минимальный, то меняем его местами с i–м
a[jmax]:=a[i];
a[i]:=j;
end;
end;
Можно описывать и так называемые динамические массивы без указания диапазона значений индексов, например:
Var A:array of integer;
B:array of array of Byte;
Фактически это означает, что переменные A и B являются указателями на пока еще не выделенную область памяти. Выделение памяти под эти массивы должно происходить на этапе выполнения программой SetLength. В нашем случае это можно сделать, например, так:
SetLength(A, 10);
SetLength(B, 2);
SetLength(B[0],5);
SetLength(B[1],20);
Здесь массиву А выделяется память на 10 элементов массива, причем значение индекса начинается с нуля. Массиву B выделяется память под две строки, в первой строке может быть 5 элементов, а во второй строке 20 элементов.
Освобождение памяти производится процедурой Finalize или присвоением константы Nil, например:
Finalize(A);
B:=Nil;
- Программирование в среде Delphi
- Программирование в среде Delphi
- 1. История развития вычислительной техники, системы счисления и единицы информации.................................................7
- 2. Структура персонального компьютера и операционные системы.........................................................................13
- 3. Основы алгоритмизации и работа в delphi..........................18
- 4. Базовые элементы delphi...................................................................26
- 5. Стандартные функции и подпрограммы................................30
- 6. Операторы delphi......................................................................................33
- 7. Операторы циклов....................................................................................35
- 18. Выделение памяти под объект и прародитель всех классов – tobject..........................................................................................84
- 19. Обработка исключительных ситуаций................................87
- 20. Основные классы и общие свойства компонентов...93
- 26. Технология com.....................................................................................129
- 1. История развития вычислительной техники, системы счисления и единицы информации
- 1.1. История развития вычислительной техники
- 1.2. Системы счисления
- 1.3. Единицы информации
- 2. Структура персонального компьютера и операционные системы
- 2.1. Структура персонального компьютера.
- 2.2. Операционные системы
- 3. Основы алгоритмизации и работа в delphi
- 3.1. Основы программирования
- 3.2. Программирование в среде Delphi
- 4. Базовые элементы delphi
- 4.1. Алфавит среды Delphi
- 4.2. Константы
- 4.3. Переменные
- 4.4. Основные типы переменных
- 4.5. Операции над переменными и константами
- 5. Стандартные функции и подпрограммы
- 5.1. Математические функции
- 5.2. Функции преобразования
- 5.3. Дополнительные системные подпрограммы и функции
- 6. Операторы delphi
- 6.1. Оператор присваивания
- 6.2. Оператор безусловной передачи управления
- 6.3. Условный оператор if
- 6.4. Оператор разветвления Case
- 6.5. Составной оператор
- 7. Операторы циклов
- 7.1. Оператор цикла For
- 7.2. Оператор цикла Repeat
- 7.3. Оператор цикла While
- 8. Работа с массивами
- 9. Работа со строками
- 9.1. Процедуры работы со строками
- 9.2. Функции работы со строками
- 10. Работа с записями
- 11. Процедуры и функции
- 12. Модуль unit
- 13. Работа со множествами
- 14. Работа с файлами
- 14.1. Текстовые файлы
- 14.2. Типированные файлы
- 14.3. Нетипированные файлы
- 15. Работа с файлами и каталогами
- 16. Динамические переменные и структуры данных
- 16.1. Динамические переменные
- 16.2. Работа со стеком
- 16.3. Работа со списками или очередями
- 16.4. Работа с деревьями
- 17. Основы объектно–ориентированного программирования
- 17.1. Объекты и классы
- 17.2. Области видимости класса
- 17.3. Свойства (Property) и инкапсуляция
- 17.4. Методы, наследование и полиморфизм
- 17.5. События (Events)
- 18. Выделение памяти под объект и прародитель всех классов – tobject
- 18.1. Выделение памяти под объект
- 18.2. Описание класса tObject
- 18.3. Операторы приведения типов классов
- 19. Обработка исключительных ситуаций
- 19.1. Два вида оператора Try
- 19.2. Программное создание исключительной ситуации
- 19.3. Основные исключительные ситуации
- 20. Основные классы и общие свойства компонентов
- 20.1. Класс tList
- 20.2. Класс tStrings
- 20.3. Общие свойства компонентов
- 21. Графические возможности delphi
- 21.1. Класс Tcanvas
- 21.2. Классы тGгарhic и тРicture
- 21.3. Классы tFont, tPen и tBrush
- 21.4. Работа с изображениями
- 22. Визуальные компоненты delphi
- 22.1. Компонент tBitBtn
- 22.2. Компоненты tDrawGrid и tStringGrid
- 22.3. Компонент tPageControl
- 22.4. Компонент tTimer
- 22.5. Компонент tGauge
- 22.6. Компонент tСolorGrid
- 23. Стандартные диалоговые окна и типовые диалоги
- 23.1. Стандартные диалоговые окна
- 23.2. Типовые диалоги
- 24. Форма, приложение и глобальные объекты
- 24.1. Форма и ее свойства
- 24.2. Объект Application
- 24.3. Глобальные объекты
- Объект ClipBoard
- Объект Screen
- Объект Printer
- 25. Межпрограммное взаимодействие
- 25.1. Обмен сообщениями
- 25.2. Динамический обмен данными
- 25.3. Совместное использование общей памяти
- 25.4. Каналы
- 25.5. Сокеты
- 26. Технология com
- 26.1. Интерфейс
- 27. Технология автоматизации
- 27.1. Основы ole Automation
- 27.2. Примеры использования серверов автоматизации
- 27.3. Компоненты ActiveX
- 28. Динамические библиотеки
- 28.1. Создание dll
- 28.2. Использование dll
- 28.3. Пример написания dll
- 29. Работа с базами данных
- 29.1. Основные определения
- 29.2. Взаимодействие приложения на Delphi с базами данных
- 29.3. Компоненты взаимодействия с базами данных
- If adoTable1.Locate(’fio,stag’,varArrayOf([’Иванов’,’10’]),[])Then …;
- 29.4. Работа с локальной базой данных
- 30. Основы языка sql
- 30.1. Составные части sql
- 30.2. Команда select
- 30.3. Пример использования запросов в Delphi
- 31. Создание собственных компонентов
- 32. Работа с реестром
- 33. Перспективы программирования в delphi
- Литература
- 220013, Минск, п.Бровки, 6