Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
билеты с 1-12 по новому листку.docx
Скачиваний:
23
Добавлен:
09.02.2015
Размер:
95.39 Кб
Скачать

11.Тип данных массив, описание, возможные действия с массивами

Массивы. Массивэто структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя. Массивы удобно использовать для хранения однородной по своей природе информации, например, таблиц, коэффициентов уравнений, матриц.

Объявление массива. Массив, как и любая переменная, перед использованием должен быть объявлен в разделе объявления переменных. В общем случае объявление массива выглядит следующим образом:

Имя : array [нижний_индекс..верхний_индекс] of тип

где

Имя – имя переменной-массива;

array зарезервированное слово языка Паскаль, обозначающее, что переменная является массивом;

нижний_индекс,

верхний_индекс – целые константы, определяющие диапазон изменения индекса элементов массива и неявно – количество элементов массива;

тип – тип элементов массива.

Если необходимо объявить несколько элементов типа «массив», целесообразно создать новый тип «массив» в разделе описания типов, а в разделе описания переменных указать в качестве типа созданный тип. В этом случае описание массива будет следующим:

type {Раздел описания типов}

ИмяТипа = array [нижний_индекс..верхний_индекс] of тип;

var {Раздел описания переменных}

Имя : ИмяТипа;

При объявлении массива удобно использовать именованные константы.

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

В общем случае описание, например, двухмерного массива будет таким:

Имя : array [н_и1..в_и1, н_и2..в_и2] of тип

где

н_и1, в_и1, н_и2, в_и2 – целые константы, определяющие диапазон изменения верхнего и нижнего индексов первой и второй размерностей.

Для того чтобы в программе использовать элемент массива, надо указать имя массива и номер элемента (индекс), заключив его в квадратные скобки. Индекс может быть константой или выражением целого типа.

Типичные действия с массивом. Вывод массива; ввод массива; поиск максимального или минимального элемента массива; поиск в массиве заданного элемента; сортировка массива.

Под выводом массива понимается вывод в диалоговом окне значений элементов массива. Для вывода всех элементов массива можно использовать оператор цикла For, при этом параметр цикла может служить в качестве индекса элементов массива.

При выводе элементов массива можно, например, использовать следующие элементы: метка (элемент Label, вкладка Standard, значок), строка ввода (Edit, Standard,).

Под вводом массива понимается получение от пользователя во время работы программы значений элементов массива. Способ ввода зависит от алгоритма программы – можно вводить каждый элемент массива отдельно, а можно вводить сразу все элементы, используя, например, элемент строка ввода и разделяя элементы определенным символом, например пробелом, с последующей обработкой строки.

Для ввода элементов массива можно использовать: для ввода целых чисел элемент Ввод целых чисел (SpinEdit, Samples,); при вводе/выводе массива (особенно двухмерного) очень удобен элемент Таблица (StringGrid, Additional,).

12. Алгоритмы поиска элементов в массиве, алгоритмы сортировки.

Генератор псевдослучайных чисел. Если необходимо получить числа, содержащие случайные значения, то можно использовать генератор псевдослучайных чисел. Существует 2 оператора:

Randomizeслужит для «запуска» генератора чисел (иначе последовательность генерируемых чисел всегда будет одна и та же).

Random[(R)] – служит для генерации случайного числа в диапазоне от 0 до R, включая значение R. Квадратные скобки при описании какого-либо оператора обозначают, что часть кода помещённая в них, может не указываться, тогда будут использованы начальные установки для этого оператора. Если в операторе Random граница R не указана, то числа будут генерироваться в диапазоне от 0 до 1, включая значение 1.

Для генерации случайного числа по нормальному распределению необходима функция RandG(m,sd) из модуля Math (задается математическое ожидание m и стандартное отклонение sd).

Поиск минимального (максимального) элемента. В качестве примера рассмотрим одномерный массив целых чисел.

Алгоритм поиска минимального (максимального) элемента массива довольно очевиден: сначала делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива последовательно сравниваются с этим элементом. Если при очередной проверке обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент принимается за минимальный (максимальный) и продолжается проверка оставшихся элементов.

Поиск заданного элемента. Самый простой способ – перебора – последовательный перебор значений массива и сравнение с искомым. Но при большой размерности массива это приведет к неоправданным затратам времени. Оптимальным является метод бинарного поиска. Алгоритм предполагает, что исходный массив отсортирован.

Сортировка данных. Для ускорения поиска, как уже отмечалось, удобно использовать отсортированный массив. Рассмотрим алгоритмы сортировки данных. Наиболее популярным является «метод пузырька». В основе алгоритма лежит обмен соседних элементов массива. Каждый элемент массива, начиная с первого, сравнивается со следующим и если он больше следующего, то элементы меняются местами. Таким образом, элементы с меньшими значениями передвигаются к началу массива («всплывают»), а с большими значениями – к концу массива («тонут»). Отсюда и название «пузырьковая сортировка». Процесс сравнения повторяется столько раз, сколько элементов в массиве минус единица, поэтому при большом количестве элементов процесс сортировки требует много времени.

13. Графические примитивы, пропорциональная печать изображения с экрана

Графические примитивы. При создании программы может возникнуть ситуация, когда, используя видимые элементы Delphi, не удается сформировать нужное изображение (это могут быть чертежи, иллюстрации, графики и т. п.). В этом случае можно использовать программирование изображения.

Вся поверхность окна представляет собой холст, на который программа может выводить графику. Этот холст задается свойством Canvas, позволяющим выводить графические примитивы (точки, линии, окружности, прямоугольники и т. п.) и задавать их характеристики: цвет, толщину и стиль линий; цвет и вид заполнения областей; характеристики шрифта при выводе текстовой информации. Холст представляет собой систему координат с началом в верхнем левом углу – таким образом, увеличение координаты X идет слева направо, а координаты Y сверху вниз, Холст можно представить как набор пикселей – начало координат имеет координаты (0,0), а правый нижний угол окна –(Client.Width, Client.Height).

Для рисования графических объектов используют карандаш (Pen), а для заполнения замкнутых областей – кисть (Brush). Свойства инструментов Pen и Brush приведены в табл. 5.1

Таблица 5.1

Свойство

Определение

Карандаш – Pen

Color

Цвет линии

Width

Толщина линии

Style

Стиль линии

Mode

Режим отображения

Кисть Brush

Color

Цвет закрашиваемой области

Style

Стиль заполнения области

Рассмотрим графические примитивы: TextOut – вывод текста, Pixels вывод точки, LineTo – вывод линии, PolyLine – вывод ломаной, PolyGon – многоугольник, Rectangle – прямоугольник, RoundRec – прямоугольник с закругленными краями, Ellipse эллипс, Arc – дуга и Pie – сектор.

TextOut(X,Y:Integer; const Text: String) – вывод текста Text в прямоугольник, имеющий координаты верхнего левого угла X,Y. Стиль (Style), цвет (Color), название шрифта (Name), размер шрифта (Size) определяются объектом Font.

Для настройки фона выводимого текста необходимо настроить цвет кисти (Brush.Color), например системный цвет clBtnFace позволит выводить фон текста таким же, как у окна.

Pixels[X,Y:Integer] := цвет – вывод точки с координатами X, Y указанным переменной цвет цветом.

Замечание. Все последующие процедуры чертятся цветом, установленным для инструмента «карандаш» – Pen.Color.

LineTo(X,Y:Integer) – рисует линию от текущей точки окна (позиция курсора) до точки с координатами X и Y. Чтобы установить курсор в определенную точку, необходимо использовать процедуру MoveTo[X,Y:Integer], которая перемещает курсор в точку с координатами X и Y.

PolyLine(array of TPoint) – рисует ломаную кривую по точкам, указанным в массиве точек, соединяя первую со второй, вторую с третьей и т. д. Точки массива могут быть перечислены как непосредственно в процедуре PolyLine, так и описаны ранее.

PolyGon(array of TPoint) – отличается от предыдущей процедуры тем, что соединяет последнюю точку массива с первой, т. е. получаем замкнутую фигуру.

Rectangle(X1,Y1,X2,Y2:Integer) прямоугольник, имеющий левый верхний угол с координатами (X1,Y1) и нижний правый угол с координатами (X2,Y2). Если длина X1Y1 окажется равной X2Y2, то получится квадрат.

RoundRec(X1,Y1,X2,Y2,X3,Y3:Integer) – вычерчивает прямоугольник (X1,Y1,X2,Y2), но со cкругленными углами, размер скругления определяется X3 – диаметром скругления по X и Y3 – диаметром скругления по Y

Ellipse(X1,Y1,X2,Y2:Integer) – эллипс, вписанный в прямоугольник с координатами (X1,Y1,X2,Y2); если это квадрат, то получаем окружность.

Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – вычерчивает дугу эллипса, вписанного в прямоугольник с вершинами (X1,Y1,X2,Y2); X3,Y3 – определяют точку начала дуги; X4,Y4 – определяют точку конца дуги. Начальная (конечная) точка – это точка пересечения границы эллипса с прямой, проведенной из центра эллипса в точки с координатами (X3,Y3) и (X4,Y4). Дуга вычерчивается против часовой стрелки от начальной точки к конечной.

Pie(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer) – строит сектор. Строится по тем же правилам, что и дуга, но отличается тем, что сектор – замкнутая фигура, т. е. имеет цвет заполнения.

Печать изображения. Печать изображения – то же, что и вывод на экран. Принтер, как и форма, имеет свойство Canvas. Здесь действует та же система координат и те же инструменты «карандаш» и «кисть». Отличие состоит лишь в следующем: при печати надо сообщить принтеру, чтобы он начал и закончил печать. Для этого надо поместить в текст программы все графические вызовы, которые должны распечатать изображение между командами принтера: Printer.BeginDoc и Printer.EndDoc. Как толькопринтер получит команду Printer.EndDoc, он сразу отпечатает изображение.

Для печати необходимо настроить принтер с помощью стандартного окна настройки. Для этого Delphi имеет вкладку наиболее популярных диалогов – Dialogs. На этой вкладке есть и диалоги настройки свойств принтера и свойств печати. Для вызова этих диалогов необходимо выполнить команду Execute. Например, команда PrinterDialogSetup1.Execute откроет стандартное окно настройки принтера (считается, что на форму помещён элемент настройки печати с именем PrinterDialog1).

Если при создании программы планируется, что изображение будет печататься, необходимо предусмотреть умножение всех размеров используемых объектов на константу, определяющую различие между размерами окна и размерами бумаги. Для этих целей необходимо использовать свойства принтера Printer.PageWidth и Printer.PageHeight, дающие размеры бумаги – ширину и высоту соответственно. Получить коэффициенты пересчета можно, поделив самые короткие размеры печатаемой страницы на самые короткие размеры отображаемой формы:

.

Таким образом, при печати изображения останется только умножать все размеры на эту константу.

М