Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций для студентов направления 230100 ту...doc
Скачиваний:
0
Добавлен:
25.12.2019
Размер:
7.52 Mб
Скачать

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

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

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

Вид диалогового окна программы Поиск в массиве приведен на Рисунок 19 .8

Рисунок 19.8 - Диалоговое окно программы Поиск в массиве

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

Листинг 7. Поиск в массиве

unit s_found_; interface

uses

Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Button1: TButton;

Edit2: TEdit;

StringGridi: TStringGrid;

procedure ButtonlClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations )

end;

var

Form1: TForm1 ;

implementation

{$R *.DFM}

{ поиск в массиве перебором }

procedure TForml.ButtonlClick(Sender: TObject);

const

SIZE=5;

var

a: array[1..SIZE] of integer; //массив

obr: integer; // образец для поиска

found: boolean; // TRUE — совпадение образца с элементом

// массива

i: integer; // индекс элемента массива

begin

// ввод массива

for i:=l to SIZE do

a[i] := StrToInt(StringGridl.Cells[i-1,0]);

// ввод образца для поиска

obr := StrToInt(edit2.text);

// поиск

found := FALSE; // пусть нужного элемента в массиве нет

i:= 1;

repeat

if a[i] = obr

then found := TRUE else i := i+1;

until (i > SIZE) or (found = TRUE);

if found

then ShowMessage('Совпадение с элементом номер '

+IntToStr(i)+#13+'Поиск успешен.')

else ShowMessage('Совпадений с образцом нет.');

end;

end.

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

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

18.3. Ошибки при использовании массивов

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

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

day : array[0..6] of string[ll],

то во время компиляции программы инструкция

day [7] := 'Воскресенье';

будет помечена как ошибочная.

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

tab1: array [1..N] of integer;

то инструкция

for i:=0 to N do tab1[i] := 5;

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

Однако во время выполнения программы, при попытке присвоить значение несуществующему нулевому элементу массива tab, на экран будет выведено сообщение об ошибке. Вид окна и текст сообщения зависит от того, откуда запущена программа.

При запуске рассматриваемой программы из Delphi возникает исключение, и сообщение имеет вид, приведенный на Рисунок 19 .9.

Рисунок 19.9 - Сообщение об ошибке при обращении к несуществующему элементу массива (программа запущена из Delphi)

Если программа запущена из Windows, то при попытке присвоить значение несуществующему элементу массива на экран будет выведено сообщение Range check error (ошибка контроля диапазона). В заголовке окна будет указано имя приложения, в процессе выполнения которого произошла ошибка (Рисунок 19 .10).

Рисунок 19.10 - Сообщение об ошибке при обращении к несуществующему элементу массива (программа запущена из Windows)

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

Для того чтобы программа контролировала значения индексных выражений (в этом случае Delphi добавляет в выполняемую программу инструкции, обеспечивающие этот контроль), необходимо на вкладке Compiler диалогового окна Project Options, которое открывается выбором из меню Project команды Options, установить флажок Range checking (Контроль диапазона), находящийся в группе Runtime errors (Ошибки времени выполнения) (Рисунок 18 .117).

Рисунок 18.117 - Вкладка Compiler диалогового окна Project Options