Введение 8 Этапы создания Windowsприложения 8
Скачать 6.98 Mb.
|
10.5. Поиск в массиве структурАлгоритмы обработки массивов структур практически не отличаются от аналогичных алгоритмов обработки одномерных массивов. Рассмотрим задачу поиска минимального и максимального элементов в массиве структур. В качестве примера будем использовать массив городов, описанный в предыдущих разделах. В этом массиве будем искать город с максимальной дневной температурой и город с минимальной ночной температурой. Для решения задач нам потребуются переменные для хранения максимального и минимального элементов массива. Очевидно, что эти переменные будут иметь такой же тип данных, что и обрабатываемый массив. Dim max, min As Gorod Поиск, как обычно, начинаем с нулевого элемента массива. max = a(0) min = a(0) Организуем цикл для обработки всех элементов массива. Так как нулевой элемент мы же использовали при задании начальных значений переменных, то обработку массива можно начать с первого элемента. For i = 1 To n На каждом шаге массива сравниваем дневную температуру в текущем городе с дневной температурой в ранее найденном городе. Обратите внимание на то, что структуры сравниваются по значению одного конкретного поля. Сравнивать структуры полностью нельзя. Сравнение всегда должно происходить по одинаковым полям. If a(i).Den > max.Den Then Если в текущем городе температура выше, то мы должны обновить максимум, записав в него анализируемый элемент массива. Заметьте, что элемент массива запоминается целиком, хотя сравнение было только по одному полю. Это делается для того, чтобы в переменной максимум сохранилось вся информация о данном городе, а не только значение дневной температуры. max = a(i) End If Теперь мы сравниваем ночную температуру в текущем городе с ночной температурой в ранее найденном городе. If a(i).Noch < min.Noch Then Если в текущем городе температура ниже, то мы должны обновить минимум, записав в него анализируемый элемент массива. min = a(i) End If Next После завершения цикла нам остается только вывести полученные значения. Сначала выводим горизонтальную черту, чтобы зрительно отделить исходные данные от результатов. lstGorod.Items.Add("-------------------------------") Выводим поясняющий текст. lstGorod.Items.Add("Город с макс. дневной темп.") С помощью специального метода (см. раздел 10.1) формируем строку из данных, записанных в переменной max. Эту строку выводим в окно списка. lstGorod.Items.Add(max.Print) Выводим поясняющий текст. lstGorod.Items.Add("Город с мин. ночной темп.") С помощью метода Print формируем строку из данных, записанных в переменной min. Эту строку выводим в окно списка. lstGorod.Items.Add(min.Print) Полный текст программы представлен в приложении 49. Пример работы программы приведен на рис. 67. Рис. 67. Пример работы программы обработки массива структур 10.6. Формирование нового массива из некоторых элементов исходного массиваВ качестве примера возьмем задачу формирования массива городов, в которых дневная температура выше средней. Эта задача решается в два этапа. На первом этапе вычисляется средняя дневная температура. Для этого находится сумма всех дневных температур и делится на количество городов. На втором этапе происходит непосредственное формирование нового массива. Анализируется каждый элемент исходного массива. Если дневная температура в этом городе больше средней, то он переносится в новый массив. Рассмотрим особенности программной реализации этого алгоритма. Начнем с описания необходимых переменных. Для решения задачи нам потребуется еще один массив. В него мы перенесем те элементы исходного массива, которые будут удовлетворять оставленному условию. Другими словами, это результирующий массив. Очевидно, что тип элементов в этом массиве должен совпадать с типом элементов в исходном массиве. Dim b() As Gorod В отдельной переменной будем хранить номер последнего элемента в формируемом массиве. Dim k As Integer Для вычисления средней дневной температуры нам необходимо вычислить сумму всех дневных температур. Значение этой суммы будем записывать в специальную переменную. Dim Summa As Integer Для средней дневной температуры заведем отдельную переменную. Так как средняя температура получается в результате деления, то эта переменная должна иметь рациональный тип данных. Dim Sred As Single Первый этап решения задачи – это вычисление средней дневной температуры. Для этого необходимо вычислить сумму всех дневных температур. Задаем начальное значение суммы. Summa = 0 Организуем цикл для обработки всех элементов исходного массива. For i = 0 To n На каждом шаге цикла добавляем очередное значение дневной температуры к ранее накопленной сумме. Summa += a(i).Den Next После завершения цикла можно вычислить среднее значение дневной температуры. Для этого необходимо найденную сумму разделить на количество городов. Заметим, что n – это номер последнего города. Так как нумерация городов в массиве идет с нуля, то количество городов будет на единицу больше, чем номер последнего элемента массива. sred = Summa / (n + 1) Выводим горизонтальную черту, чтобы зрительно отделить промежуточные результаты от исходных данных. lstGorod.Items.Add("-------------------------------") Выводим значение средней дневной температуры, чтобы пользователь мог проконтролировать правильность работы программы. lstGorod.Items.Add("Средняя дневная температура:" + _ Str(Sred)) Переходим ко второму этапу – формированию нового массива. До начала формирования массив пуст. В нем не содержится ни одного элемента. Поэтому номер последнего элемента в этом массиве находится за его пределами и равен -1. k = -1 Организуем цикл для обработки всех элементов исходного массива. For i = 0 To n На каждом шаге цикла анализируем очередной город. If a(i).Den > Sred Then Если дневная температура в этом городе больше средней, то мы должны перенести всю информацию об этом городе в новый массив. При этом номер последнего элемента в новом массиве увеличится на единицу. k += 1 Изменяем размер результирующего массива. Использование ключевого слова Preserve позволит нам сохранить в массиве все ранее найденные элементы. ReDim Preserve b(k) В новый массив на последнюю позицию записываем анализируемый элемент. Обратите внимание на то, что элемент записывается целиком, хотя сравнение проводится только по одному полю. Это делается для того, чтобы в новом массиве сохранялась вся информация о городе, а не только значение дневной температуры. b(k) = a(i) End If Next После завершения цикла выводим полученный массив. Сначала печатаем горизонтальную черту, чтобы зрительно отделить полученные результаты от исходных данных. lstGorod.Items.Add("-------------------------------") Затем печатаем поясняющий заголовок и еще одну горизонтальную черту. lstGorod.Items.Add("Результирующий массив") lstGorod.Items.Add("-------------------------------") Анализируем номер последнего элемента в сформированном массиве. If k < 0 Then Если номер последнего элемента меньше нуля, значит, в новом массиве нет ни одного элемента. Поэтому вместо значений элементов массива выводим поясняющее сообщение. lstGorod.Items.Add("Таких городов нет") Else В противном случае, организуем цикл для вывода полученного массива. For i = 0 To k На каждом шаге цикла с помощью метода Print (см. раздел 10.1) формируем строку из данных, записанных в очередном элементе массива. Эту строку выводим в окно списка. lstGorod.Items.Add(b(i).Print) Next End If Полный текст программы представлен в приложении 50. Пример работы программы приведен на рис. 68. Рис. 68. Пример работы программы формирования нового массива структур из элементов исходного массива |