Введение 8 Этапы создания Windowsприложения 8
Скачать 6.98 Mb.
|
7.8. Поиск первого элемента массива, удовлетворяющего некоторому условиюПри решении задача поиска первого элемента массива, удовлетворяющего некоторому условию, предполагается, что таких элементов в массиве несколько. Найти первый из подходящих элементов, значит, найти его номер. Считается, что поиск идет слева направо, от нулевого элемента к последнему элементу. Но при этом нельзя исключать ситуацию, когда в массиве вообще нет искомых элементов. Сначала предполагают, что в массиве нет искомого элемента. Поэтому его номер задается равным -1. Затем последовательно проверяются все элементы массива. Если какой-нибудь элемент удовлетворяет поставленному условию, его номер запоминается в специальной переменной, а сам цикл немедленно прерывается. Так как по условию задачи требуется найти только первый элемент, удовлетворяющий условию, то после его обнаружения анализ других элементов массива является бессмысленным. Рассмотрим особенности реализации данного алгоритма на примере задачи поиска номера первого элемента массива, равного нулю. Объявляем переменную, в которой будет храниться номер искомого элемента. Очевидно, что эта переменная всегда будет иметь целочисленный тип данных. Dim perv As Integer Задаем начальное значение этой переменной. Так как мы предполагаем, что нужных элементов в массиве нет, то начальное значение возьмем равным -1. perv = -1 Организуем цикл для анализа всех элементов массива, от нулевого до последнего, который имеет номер n. For i = 0 To n Анализируем очередной элемент массива. If a(i) = 0 Then Если он равен нулю, значит, мы нашли первый из подходящих элементов. Запоминаем его номер в специальной переменной. perv = i И прерываем цикл, так как продолжать поиск не требуется. Exit For End If Next После завершения цикла выводим полученные результаты в окно списка. Сначала выводим горизонтальную черту, чтобы зрительно отделить ответы от исходных данных. lstA.Items.Add("-------------------------------") Затем анализируем полученный результат. If perv = -1 Then Если номер первого искомого элемента равен -1, значит, в массиве не было ни одного элемента, удовлетворяющего поставленному условию. В этом случае вместо ответа надо вывести поясняющий текст. lstA.Items.Add("В массиве нет нулей") Else В противном случае мы выводим найденное значение. lstA.Items.Add("Первый нулевой элемент: " + _ Str(perv)) End If Полный текст программы представлен в приложении 27. Примеры работы программы при различных исходных данных приведены на рис. 42. Рис. 42. Пример работы программы поиска первого нулевого элемента 7.9. Поиск последнего элемента массива, удовлетворяющего некоторому условиюЗадача поиска последнего элемента, удовлетворяющего некоторому условию, имеет два разных решения. Первый способ предлагает анализировать массив от нулевого элемента к последнему. Как только в нем встречается очередной элемент, удовлетворяющий поставленному условию, его номер запоминается в специальной переменной. Но в отличие от предыдущей задачи цикл не прерывается, а продолжается дальше. Так как все номера последовательно записываются в одну и ту же переменную, то после завершения цикла в ней будет храниться номер последнего элемента, удовлетворяющего заданному условию. Второй способ позволяет свести данную задачу к предыдущей. Очевидно, если анализировать массив в обратном направлении, то есть от последнего элемента к нулевому (от конца к началу), то первый же элемент, удовлетворяющий поставленному условию, и будет искомым элементом. Достаточно запомнить его номер и прервать цикл. Рассмотрим особенности реализации обоих алгоритмов на примере решения задачи поиска последнего элемента массива, равного нулю. Первый способ. Объявляем переменную, в которой будет храниться номер искомого элемента. Очевидно, что эта переменная всегда будет иметь целочисленный тип данных. Dim posled As Integer Задаем начальное значение этой переменной. Так как мы предполагаем, что нужных элементов в массиве нет, то начальное значение возьмем равным -1. posled = -1 Организуем цикл для анализа всех элементов массива, от нулевого до последнего, который имеет номер n. For i = 0 To n Анализируем текущий элемент массива. If a(i) = 0 Then Если он равен нулю, значит, мы нашли очередной подходящий элемент. Запоминаем его номер в специальной переменной. posled = i End If Next После завершения цикла выводим полученные результаты в окно списка. Сначала выводим горизонтальную черту, чтобы зрительно отделить ответы от исходных данных. lstA.Items.Add("-------------------------------") Затем анализируем полученный результат. If posled = -1 Then Если номер искомого элемента равен -1, значит, в массиве не было ни одного элемента, удовлетворяющего поставленному условию. В этом случае вместо ответа надо вывести поясняющий текст. lstA.Items.Add("В массиве нет нулей") Else В противном случае мы выводим найденное значение. lstA.Items.Add("Последний нулевой элемент: " + _ Str(posled)) End If Второй способ. Объявляем переменную, в которой будет храниться номер искомого элемента. Очевидно, что эта переменная всегда будет иметь целочисленный тип данных. Dim posled As Integer Задаем начальное значение этой переменной. Так как мы предполагаем, что нужных элементов в массиве нет, то начальное значение возьмем равным -1. posled = -1 Организуем цикл для анализа всех элементов массива, от последнего, имеющего номер n, до нулевого. Так как движение по массиву идет в обратную сторону, то мы должны задать шаг изменения счетчика. На каждом шаге цикла номер очередного элемента массива будет уменьшаться на единицу. Поэтому шаг цикла надо задать равным -1. Для этого используется ключевое слово Step. For i = n To 0 Step -1 Анализируем очередной элемент массива. If a(i) = 0 Then Если он равен нулю, значит, мы нашли подходящий элемент. Запоминаем его номер в специальной переменной. posled = i И прерываем цикл, так как продолжать поиск не требуется. Exit For End If Next После завершения цикла выводим полученные результаты в окно списка. Сначала выводим горизонтальную черту, чтобы зрительно отделить ответы от исходных данных. lstA.Items.Add("-------------------------------") Затем анализируем полученный результат. If posled = -1 Then Если номер искомого элемента равен -1, значит, в массиве не было ни одного элемента, удовлетворяющего поставленному условию. В этом случае вместо ответа надо вывести поясняющий текст. lstA.Items.Add("В массиве нет нулей") Else В противном случае мы выводим найденное значение. lstA.Items.Add("Последний нулевой элемент: " + _ Str(posled)) End If Полный текст программы представлен в приложении 28. Примеры работы программы при различных исходных данных приведены на рис. 43. Рис. 43. Примеры работы программы поиска последнего нулевого элемента |