Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Bilet_1.docx
Скачиваний:
2
Добавлен:
14.04.2019
Размер:
341.16 Кб
Скачать

Операции со строками

В языке Delphi есть несколько полезных при работе со строками функций и процедур. Ниже приведено их краткое описание и примеры использования.

Функция length

Функция length возвращает длину строки. У этой функции один параметр – выражение строкового типа. Значением функции length является количество символов, из которых состоит строка.

Процедура delete

Процедура delete позволяет удалить часть строки. В общем виде обращение к этой процедуре выглядит так:

delete(Строка, р, п)

где Строка – переменная или константа строкового типа; р – номер символа, с которого начинается удаляемая подстрока; п – длина удаляемой подстроки.

Функция роs

Функция роs позволяет определить положение подстроки в строке. В общем виде обращение к функции выглядит так:

pos(Подстрока, Строка) ;

где Подстрока – строковая константа или переменная, которую надо найти в строковой константе или переменной Cтрока.

Функция сору

Функция сору позволяет выделить фрагмент строки. В общем виде обращение к функции сору выглядит так:

сору(Строка, р, п)

где Строка – выражение строкового типа, содержащее строку, фрагмент которой надо получить; р – номер первого символа, с которого начинается выделяемая подстрока; n – длина выделяемой подстроки.

Билет 32

Массив – это последовательность однотипных данных, обьединенная общим именем, эле­мен­ты (компоненты) которой отличаются (идентифицируются) индексами. Индекс элемента указывает место (номер) элемента в массиве. Количество элементов массива фиксировано и определено в его описании. Доступ к элементу массива осуществляется вычислением значения его индекса. Поэтому массивы – это структуры данных с прямым доступом. Все компо­ненты массива являются одинаково доступными. Массивы удобно использовать для хранения однородной по своей природе информации, например, таблиц и списков.

Объявление массива

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

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

где имя – имя массива; array – зарезервированное слово языка Delphi, обозначающее, что объявляемое имя является именем массива; нижний_индекс и верхний_индекс – целые константы, определяющие диапазон изменения индекса элементов массива и, неявно, количество элементов (размер) массива; тип – тип элементов массива.

При объявлении массива удобно использовать именованные константы. Именованная константа объявляется в разделе объявления констант, который обычно располагают перед разделом объявления переменных. Ниже в качестве примера приведено объявление массива названий команд–участниц чемпионата по футболу, в котором используются именованные константы.

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

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

где список – разделенные запятыми значения элементов массива.

Например:

a: array[10] of integer = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

Team: array[1..5] of String[10]=( 'Зенит', 'Динамо', 'Ротор', 'Спартак', 'СКА');

Обратите внимание, что количество элементов списка инициализации должно соответствовать размерности массива. Если это будет не так, то компилятор выведет сообщения об ошибке: Number of elements differs from declaration (количество элементов не соответствует указанному в объявлении).

При попытке инициализировать локальный массив компилятор выводит сообщение об ошибке: Cannot initialize local variables (локальная переменная не может быть инициализирована). Локальный массив можно инициализировать только во время работы программы, например, так:

for i := 1 to 10 do a[i]:= 0;

Билет 33

Операции с массивами

Типичными операциями при работе с массивами являются:

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

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

Под выводом массива понимается вывод на экран монитора (в диалоговое окно) значений элементов массива.

Если в программе необходимо вывести значения всех элементов массива, то для этого удобно использовать инструкцию for, при этом переменная–счетчик инструкции for может быть использована в качестве индекса элемента массива.

Ввод массива

Под вводом массива понимается процесс получения от пользователя (или из файла) во время работы программы значений элементов массива.

"Лобовое" решение задачи ввода элементов массива – для каждого элемента массива создать поле ввода. Однако если требуется ввести достаточно большой массив, то такое решение неприемлемо. Представьте форму, например, с десятью полями редактирования!

Очевидно, что последовательность чисел удобно вводить в строку таблицы, где каждое число находится в отдельной ячейке. Ниже рассматриваются два варианта организации ввода массива с использованием компонентов StringGrid и Memo.

Использование компонента StringGrid

Для ввода массива удобно использовать компонент StringGrid. Значок компонента StringGrid находится на вкладке Additional.

Компонент StringGrid представляет собой таблицу, ячейки которой содержат строки символов. В табл. 7.1 перечислены некоторые свойства компонента StringGrid.. Свойства компонента StringGrid

Свойство

Определяет

Name

Имя компонента. Используется в программе для доступа к свойствам компонента

ColCount

Количество колонок таблицы

RowCount

Количество строк таблицы

Cells

Соответствующий таблице двумерный массив. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row определяется элементом cells [col, row]

FixedCols

Количество зафиксированных слева колонок таблицы. Зафиксированные колонки выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте

FixedRows

Количество зафиксированных сверху строк таблицы. Зафиксированные строки выделяются цветом и при вертикальной прокрутке таблицы остаются на месте

Options . goEditing

Признак допустимости редактирования содержимого ячеек таблицы. True – редактирование разрешено, False – запрещено

Options . goTab

Разрешает (True) или запрещает (False) использование клавиши <ТаЬ> для перемещения курсора в следующую ячейку таблицы

Options . GoAlways–ShowEditor

Признак нахождения компонента в режиме редактирования. Если значение свойства False, то для того, чтобы в ячейке появился курсор, надо начать набирать текст, нажать клавишу <F2> или сделать щелчок мышью

DefaultColWidth

Ширину колонок таблицы

DefaultRowHeight

Высоту строк таблицы

GridLineWi–dth

Ширину линий, ограничивающих ячейки таблицы

Top

Расстояние от верхней границы поля таблицы до верхней границы формы

Height

Высоту поля таблицы

Width

Ширину поля таблицы

Font

Шрифт, используемый для отображения содержимого ячеек таблицы

ParentFont

Признак наследования характеристик шрифта формы

Использование компонента Memo

В некоторых случаях для ввода массива можно использовать компонент Memo. Компонент Memo позволяет вводить текст, состоящий из достаточно большого количества строк, поэтому его удобно использовать для ввода символьного массива. Компонент Memo добавляется в форму обычным образом. Значок компонента находится на вкладке Standard.

Билет 34

Поиск минимального (максимального) элемента массива

Задачу поиска минимального элемента массива рассмотрим на примере массива целых чисел.

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

Диалоговое окно приложения поиска минимального элемента массива содержит соответствующим образом настроенный компонент stringGrid1, который применяется для ввода элементов массива, два поля меток (Label1 и Label2), использующиеся для вывода информационного сообщения и результата работы программы, и командную кнопку (Buttonl), при щелчке на которой выполняется поиск минимального элемента массива. В табл. 7.4 приведены значения свойств компонента stringGridi.

Таблица 7.4. Значения свойств компонента stringGridi

Свойство

Значение

ColCount

005

FixedCols

000

RowCount

001

DefaultRowHeight

024

Height

024

DefaultColWidth

064

Width

328

Options . goEditing

True

Options . AlwaysShowEditing

True

Options .goTabs

True

Билет 35

Поиск в массиве заданного элемента

При решении многих задач возникает необходимость определить, содержит ли массив определенную информацию или нет. Например, проверить, есть ли в списке студентов фамилия Петров. Задачи такого типа называются поиском в массиве.

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

Алгоритм простого перебора

Ниже приведен текст программы поиска в массиве целых чисел. Перебор элементов массива осуществляется инструкцией repeat, в теле которой инструкция if сравнивает текущий элемент массива с образцом и присваивает переменной found значение true, если текущий элемент и образец равны.

Цикл завершается, если в массиве обнаружен элемент, равный образцу (в этом случае значение переменной found равно true), или если проверены все элементы массива. По завершении цикла по значению переменной found можно определить, успешен поиск или нет.

Щелчок на командной кнопке Поиск (Button1) запускает процедуру TForm1.Button1Click (ее текст приведен в листинге 7.7), которая из компонента stringGrid1 вводит массив, а из поля редактирования Edit2 – число (образец). Затем выполняется проверка, содержит ли массив введенное число. После завершения проверки процедура showMessage выводит сообщение о результате поиска.

Очевидно, что чем больше элементов в массиве и чем дальше расположен нужный элемент от начала массива, тем дольше программа будет искать необходимый элемент.

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

Метод бинарного поиска

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

В случае, если массив упорядочен, то применяют другие, более эффективные по сравнению с методом простого перебора алгоритмы, один из которых – метод бинарного поиска.

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

Метод (алгоритм) бинарного поиска реализуется следующим образом:

1. Сначала образец сравнивается со средним (по номеру) элементом массива (рис. 7.10, а).

  • Если образец равен среднему элементу, то задача решена.

  • Если образец больше среднего элемента, то это значит, что искомый элемент расположен ниже среднего элемента (между элементами с номерами sred+1 и niz), и за новое значение verb принимается sred+i, а значение niz не меняется (рис. 7.10, б).

  • Если образец меньше среднего элемента, то это значит, что искомый элемент расположен выше среднего элемента (между элементами с номерами verh и sred–1), и за новое значение niz принимается sred–1, а значение verh не меняется (рис. 5.10,

  • 2. После того как определена часть массива, в которой может находиться искомый элемент, по формуле (niz–verh) /2+verh вычисляется новое значение sred и поиск продолжается.

Билет 36

Сортировка массива

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

а[1] < а[2] < ...< a[SIZE]

где SIZE – верхняя граница индекса массива.

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

Существует много методов (алгоритмов) сортировки массивов.

Рассмотрим два из них:

  • метод прямого выбора;

  • метод прямого обмена.

Сортировка методом прямого выбора

Алгоритм сортировки массива по возрастанию методом прямого выбора может быть представлен так:

1. Просматривая массив от первого элемента, найти минимальный элемент и поместить его на место первого элемента, а первый – на место минимального.

2. Просматривая массив от второго элемента, найти минимальный элемент и поместить его на место второго элемента, а второй – на место минимального.

3. И так далее до предпоследнего элемента.

Сортировка методом обмена

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

Следует отметить, что максимальное необходимое количество циклов проверки соседних элементов массива равно количеству элементов массива минус один. Вместе с тем возможно, что массив реально будет упорядочен за меньшее число циклов. Например, последовательность чисел 5 1 2 3 4, если ее рассматривать как представление массива, будет упорядочена за один цикл, и выполнение оставшихся трех циклов не будет иметь смысла.

Билет 37

Многомерные массивы

В повседневной жизни довольно часто приходится иметь дело с информацией, которая представлена в табличной форме. Колонки и (или) строки таблицы, как правило, состоят из однородной информации. Поэтому в программе, обрабатывающей табличные данные, имеет смысл использовать массивы для хранения и обработки таблиц. Так, приведенная выше таблица может быть представлена как совокупность одномерных массивов:

vaz2106: array [1..12] of integer;

vaz2107: array [1..12] of integer;

vaz2108: array [1..12] of integer;

vaz2109: array [1..12] of integer;

vaz2110: array [1..12] of integer;

vaz2111: array [1..12] of integer;

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

Возможно и такое представление таблицы:

jan: array [1..6] of integer;

feb: array [1..6] of integer;

mar: array [1..6] of integer;

dec: array [1..6] of integer;

В этом случае каждый массив предназначен для хранения информации о количестве проданных за месяц автомобилей, причем значение элемента массива отражает проданное количество автомобилей одной марки.

Если вся таблица содержит однородную информацию, например, только целые числа, то такая таблица может быть представлена как двумерный массив.

В общем виде инструкция объявления двумерного массива выглядит так:

Имя:array[НижняяГраница1..ВерхняяГраница1, НижняяГраница2..ВерхняяГраница2] of Тип;

где Имя – имя массива; array – слово языка Delphi, указывающее, что объявляемый элемент данных является массивом; НижняяГраница1, ВерхняяГраница1, НижпяяГраница2, ВерхняяГраница2 – целые константы, определяющие диапазон изменения соответственно первого и второго индексов и, следовательно, число элементов массива; Тип – тип элементов массива.

Табл. 7.7 может быть представлена в виде двумерного массива следующим образом:

itog: array [1..12, 1..6] of integer

Количество элементов двумерного массива можно вычислить по формуле:

(ВГ1–НГ1+1)  (ВГ2–НГ2+1):

где ВГ1 и ВГ2 – верхняя граница первого и второго индексов; НГ1 и НГ2 – нижняя граница первого и второго индексов. Таким образом, массив itog состоит из 60 элементов типа integer.

Для того чтобы использовать элемент массива, нужно указать имя массива и индексы элемента. Первый индекс соответствует номеру строки таблицы, второй – номеру колонки. Так, элемент itog [2,3] содержит число проданных в марте (третий месяц) автомобилей марки ВАЗ 2107 (данные о продаже ВАЗ 2107 находятся во второй строке таблицы).

При работе с таблицами (массивами) удобно использовать инструкцию for.

Билет 38

Часто, работая над программой, программист замечает, что некоторая последовательность инструкций встречается в разных частях программы несколько раз. Например, в листинге 8.1 приведена программа пересчета веса из фунтов в килограммы. Обратите внимание, что инструкции, обеспечивающие ввод исходных данных из полей редактирования, расчет и вывод результата (в листинге они выделены фоном), есть как в процедуре обработки события на кнопке Вычислить, так и в процедуре обработки события OnKeyPress в поле Edit1..

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

Подпрограмма – это небольшая программа, которая решает часть общей задачи. В языке Delphi есть два вида подпрограмм – процедура и функция.

У каждой подпрограммы есть имя, которое используется в программе для вызова подпрограммы (процедуры).

Отличие функции от процедуры состоит в том, что с именем функции связано значение, поэтому функцию можно использовать в качестве операнда выражения, например, инструкции присваивания.

Как правило, подпрограмма имеет параметры. Различают формальные и фактические параметры.

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

Параметры используются:

  • для передачи данных в подпрограмму;

  • для получения из результата подпрограммы.

В общем случае в качестве фактического параметра процедуры можно использовать выражение, тип которого должен совпадать с типом соответствующего формального параметра.

Функция

Функция – это подпрограмма, т.е. последовательность инструкций, имеющая имя.

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

В общем виде инструкция обращения к функции выглядит так:

Переменная := Функция (Параметры) ;

где Переменная – имя переменной, которой надо присвоить значение, вычисляемое функцией; Функция – имя функции, значение которой надо присвоить переменной; Параметры – список формальных параметров, которые применяются для вычисления значения функции. В качестве параметров обычно используют переменные или константы.

Следует обратить внимание на то, что:

  • каждая функция возвращает значение определенного типа, поэтому тип переменной, которой присваивается значение функции, должен соответствовать типу функции;

  • тип, количество и последовательность параметров при вызове для каждой конкретной функции строго определены.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]