- •Программирование наDelphi. Содержание
- •Лабораторная работа №1. Основные этапы создания программ (на примере программы для решения квадратных уравнений)
- •1. Проектирование программы
- •(Рис. 1.1) Программа.
- •2. Создание проекта приложения
- •(Рис. 2.1) Среда Delphi
- •(Рис. 2.2) Панель кнопок среды Delphi
- •(Рис. 2.3)Панель для сохранения и восстановления внешнего вида среды Delphi
- •(Рис. 2.4)Параметры проекта
- •3. Разработка пользовательского интерфейса
- •4. Кодирование алгоритма
- •5. Компиляция и исправление синтаксических ошибок
- •6. Запуск программы
- •7. Отладка программы и исправление логических ошибок.
- •Контрольные вопросы
- •Лабораторная работа №2. Оператор присваивания
- •Задачи по лабораторной работе №2
- •Контрольные вопросы
- •Лабораторная работа №3. Оператор ветвления if
- •Задачи по лабораторной работе №3
- •Контрольные вопросы
- •Лабораторная работа №4. Оператор ветвления case
- •Задачи по лабораторной работе №4
- •Контрольные вопросы
- •Лабораторная работа №5. Циклы с предварительным условием
- •Задачи по лабораторной работе №5
- •Контрольные вопросы
- •Лабораторная работа №6. Циклы с параметром
- •Задачи по лабораторной работе №6
- •Контрольные вопросы
- •Лабораторная работа №7. Массивы
- •Задачи по лабораторной работе №7
- •Контрольные вопросы
- •Лабораторная работа №8. Двумерные массивы
- •Задачи по лабораторной работе №8
- •Контрольные вопросы
Контрольные вопросы
Опишите синтаксис оператора for.
Когда нужно использовать цикл for?
Работают ли операторы Break и Continueв циклеfor?
Лабораторная работа №7. Массивы
Объявление массива
Массив — это составной тип данных, состоящий из фиксированного числа элементов одного и того же типа. Для описания массива предназначено словосочетание array of. После слова array в квадратных скобках записываются границы массива, а после слова of — тип элементов массива, например:
type TStates = array[1..50] of string; TCoordinates = array[1..3] of Integer; |
После описания типа можно переходить к определению переменных и типизированных констант:
var States: TStates; { 50 strings } const Coordinates: TCoordinates = (10, 20, 5); { 3 integers } |
Обратите внимание, что инициализация элементов массива происходит в круглых скобках через запятую.
Массив может быть определен и без описания типа:
var Symbols: array[0..80] of Char; { 81 characters } |
Чтобы получить доступ к отдельному элементу массива, нужно в квадратных скобках указать его индекс, например
Symbols[0] |
Работа с массивами
Массивы в целом участвуют только в операциях присваивания. При этом все элементы одного массива копируются в другой. Например, если объявлены два массива A и B,
var A, B: array[1..10] of Integer; |
то допустим следующий оператор:
A := B; |
Оба массива-операнда в левой и правой части оператора присваивания должны быть не просто идентичны по структуре, а описаны с одним и тем же типом, иначе компилятор сообщит об ошибке. Именно поэтому все массивы рекомендуется описывать в секции type.
С элементами массива можно работать, как с обычными переменными. В следующей программе элементы численного массива последовательно вводятся с клавиатуры, а затем суммируются. Результат выводится на экран.
program Console;
{$APPTYPE CONSOLE}
uses SysUtils;
var A: array[1..5] of Double; Sum: Double; I: Integer;
begin for I := 1 to 5 do Readln(A[I]); Sum := 0; for I := 1 to 5 do Sum := Sum + A[I]; Writeln(Sum); Writeln('Press Enter to exit...'); Readln; end. |
Для массивов определены две встроенные функции — Low и High. Они получают в качестве своего аргумента имя массива. Функция Low возвращает нижнюю, а High — верхнюю границу этого массива. Например, Low(A) вернет значение 1, а High(A) — 5. Функции Low и High чаще всего используются для указания начального и конечного значений в операторе цикла for. Поэтому вычисление суммы элементов массива A лучше переписать так:
for I := Low(A) to High(A) do Sum := Sum + A[I]; |
Массивы в параметрах процедур и функций
Массивы, как и другие типы данных, могут выступать в качестве параметров процедур и функций. Вот как может выглядеть функция, вычисляющая среднее значение в массиве действительных чисел:
const Max = 63; type TStatistics = array [0..Max] of Double;
function Average(const A: TStatistics): Double; var I: Integer; begin Result := 0; for I := Low(A) to High(A) do Result := Result + A[I]; Result := Result / (High(A) - Low(A) + 1); end; |
Функция Average принимает в качестве параметра массив известной размерности. Требование фиксированного размера для массива-параметра часто является чрезмерно сдерживающим фактором. Процедура для нахождения среднего значения должна быть способна работать с массивами произвольной длины. Для этой цели в язык Delphi введены открытые массивы-параметры. Такие массивы были заимствованы разработчиками языка Delphi из языка Modula-2. Открытый массив-параметр описывается с помощью словосочетания array of, при этом границы массива опускаются:
function Average(const A: array of Double): Double; var I: Integer; begin Result := 0; for I := Low(A) to High(A) do Result := Result + A[I]; Result := Result / (High(A) - Low(A) + 1); end; |
Внутри подпрограммы Average нижняя граница открытого массива A равна нулю (Low(A) = 0), а вот значение верхней границы (High(A)) неизвестно и выясняется только на этапе выполнения программы.
Существует только два способа использования открытых массивов: обращение к элементам массива и передача массива другой подпрограмме, принимающей открытый массив. Нельзя присваивать один открытый массив другому, потому что их размеры заранее неизвестны.
Вот пример использования функции Average:
var Statistics: array[1..10] of Double; Mean: Double; begin ... Mean := Average(Statistics); Mean := Average([0, Random, 1]); ... end; |
Заметьте, что во втором операторе открытый массив конструируется в момент вызова функции Average. Конструктор открытого массива представляет собой заключенный в квадратные скобки список выражений. В выражениях могут использоваться константы, переменные и функции. Тип выражений должен быть совместим с типом элементов массива. Конструирование открытого массива равносильно созданию и инициализации временной переменной.
И еще одно важное замечание по поводу открытых массивов. Некоторые библиотечные подпрограммы языка Delphi принимают параметры типа array of const — открытые массивы констант. Массив, передаваемый в качестве такого параметра, обязательно конструируется в момент вызова подпрограммы и может состоять из элементов различных типов (!). Физически он состоит из записей типа TVarRec, кодирующих тип и значение элементов массива (записи рассматриваются ниже). Открытый массив констант позволяет эмулировать подпрограммы с переменным количеством разнотипных параметров и используется, например, в функции Format для форматирования строки (см. выше).
Уплотнение структурных данных в памяти
С целью экономии памяти, занимаемой массивами и другими структурными данными, вы можете предварять описание типа зарезервированным словом packed, например:
var A: packed array[1..10] of Byte; |
Ключевое слово packed указывает компилятору, что элементы структурного типа должны храниться плотно прижатыми друг к другу, даже если это замедляет к ним доступ. Если структурный тип данных описан без ключевого слова packed, компилятор выравнивает его элементы на 2- и 4-байтовых границах, чтобы ускорить к ним доступ.
Заметим, что ключевое слово packed применимо к любому структурному типу данных, т.е. массиву, множеству, записи, файлу, классу, ссылке на класс.