Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика VBA.pdf
Скачиваний:
891
Добавлен:
27.03.2016
Размер:
1.1 Mб
Скачать

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

For Each Элемент_массива In Selection

,

выделив предварительно нужную группу данных. Программа в таком варианте ввода может иметь следующий вид.

Sub Пример_5_5б()

Dim Mas() As Single 'объявляем динамический массив веществ. типа Dim Elem ' переменная для обозначения элемента выделенной группы Dim i As Integer ' рабочая переменная целого типа

Dim kol As Integer ' переменнаядляколичества чиселвмассиве

kol = 0 ' обнуляем переменную Kol

For Each Elem In Selection

kol = kol + 1 ' подсчитываем количество прочмтанных данных ReDim Preserve Mas(1 To kol) ' увеличиваем размер массива

' с сохранением ранее введенной информации Mas(kol) = Elem ' записываем в массив очередное число из группы

Debug.Print "Mas(";kol;")=";Mas(kol) ' контрольный вывод в окно отладки

Next

. . . ' продолжение программы

Следует отметить, что, если на активном листе таблицы Excel не будет выделена группа чисел, то будет прочитан массив из одного элемента с нулевым значением.

5.2 Программирование обработки одномерных массивов

Обработка массивов может выполняться по следующей схеме:

-ввод и контрольный вывод массива;

-обработка элементов массива;

-вывод полученного результата.

Варианты ввода и контрольного вывода массива были рассмотрены выше.

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

75

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

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

1.Проверка знака элемента массива – положительный, отрицательный или нулевой элемент. Анализ осуществляется оператором If, в котором очередной элемент массива сравнивается с нулем

>

If mas(i) = 0 Then

<

Знаку «больше» соответствуют положительные числа, знаку «меньше» – отрицательные числа, знак «равно» определяет нулевые элементы массива.

2.Проверка наличия или отсутствия дробной части у элемента массива. Оператор If, для такого анализа может использовать функцию int() – определения целой части числа

If int(mas(i)) <>= mas(i) Then

Если левая и правая части логического выражения одинаковы (знак «равно»), то у элемента массива нет дробной части (число целое). Если левая и правая части логического выражения различны (знак «не равно»), то у элемента массива есть дробная часть (число не целое). Этот же анализ можно выполнить с использованием функции Fix(),

76

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

3.Проверка кратности элемента массива какому либо числу. Наиболее часто возникает необходимость проверки числа на четность или нечетность. Оператор If для такого анализа может использовать функцию int()

If int( mas(i)/2 ) <>= mas(i)/2 Then

Если левая и правая части логического выражения одинаковы (знак «равно»), то элемент кратен двум (число четное). Если левая и правая части логического выражения различны (знак «не равно»), то элемент массива является нечетным числом. Этот же анализ можно выполнить с использованием функции Fix(), операции целочисленного деления ( mas(i)\2 ? mas(i)/2), либо операции вычисления остатка от деления - mas(i) mod 2 ? 0 (если остаток равен нулю, то число четное).

Пример 5.6. Написать фрагмент программы для определения наибольшего числа в массиве D(1 To K), содержащем K элементов.

. . .

'фрагмент программы определения максимального элемента в массиве

'D_max - вспомогательная переменная, в которой будет

'сохраняться максимальное число из массива D

D_max=D(1) ' задаем начальное значение переменной D_max

For i=2 To K ' цикл для просмотра остальных элементов массива

IF D_max < D(i) Then D_max=D(i)

Next

. . .

В примере рассматривается задача на полную выборку массива. Для поиска максимального числа в массиве переменной D_max присваивается значение первого элемента массива, а затем последовательно его значение сравнивается со всеми другими элементами. Ес-

77

ли текущее значение переменной D_max меньше, чем очередной элемент массива, то значение этого элемента записывается в D_max. Если D_max больше или равно D(i), то значение D_max не изменяется. Таким образом, в переменной D_max всегда сохраняется наибольшее число из просмотренных элементов, а после завершения цикла - из всех элементов массива. Иногда переменную D_max называют буферной переменной.

Пример 5.7. Написать фрагмент программы для определения индекса наибольшего отрицательного числа в массиве D, содержащего K элементов.

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

Для определения начального значения вспомогательной переменной можно организовать цикл с поиском первого отрицательного элемента массива. Если он завершится досрочно через команду Exit For, то параметр цикла i будет равен индексу первого отрицательного элемента. Если же цикл завершится нормально (через оператор Next), то это будет означает, что в массиве нет отрицательных элементов и надо выдать сообщение об этом. Фрагмент программы для такого подхода может быть следующим.

78

' поиск первого максимального отрицательного элементаи его индекса

For i=1 To k

If D(i) < 0 Then Exit For

Next

If i > k Then ' если параметр цикла i равен значению k+1, то цикл ' завершился нормально, т.е. в массиве нет отрицательных чисел

MsgBox " В массиве нет отрицательных чисел"

Else

Buf=D(i) ' первое отрицательное число заносим в Buf

Ind=i

' и запоминаем его индекс - i

For j=i+1 To k

 

If

D(j) <0 AND Buf < D(j) Then

 

Buf=D(j)

' сохраняем значение очередного

 

 

' элемента в буферной переменной

 

Ind=j '

сохраняем значение индекса

 

' очередного претендента на максимум

End If

Next j ' Конец цикла For j=i+1 To k

'печать результата

MsgBox "Максимальный отрицательный элемент D(" _

&Ind & ")=" & Buf

End If ' конец оператора If i > k Then . . .

Однако более эффективным можно считать способ, когда в начале цикла буферной переменной задается достаточно большое число при определении минимального значения или очень маленькое число при поиске максимального элемента. Для практических задач можно задавать соответственно 1010 или –1010 (константы 1.Е10 или –1.Е10). Если в процессе выполнения программы заданное значение буферной переменной не изменится, то в массиве нет отрицательных чисел, если изменится – в переменной Buf будет находится максимальное отрицательное число массива, а в переменной Ind его индекс. Фрагмент программы для этого способа может быть следующим.

79