Алгоритмы и программы Методические указания для подготовительных курсов Ростов-на-Дону

Вид материалаМетодические указания

Содержание


Пример П6.
Sub Обмен() Dim
Подобный материал:
1   2   3   4   5   6   7   8   9

Next


MsgBox max

End Sub

Аналогично решаются задачи на поиск минимума, нужно только заменить знак неравенства на < и переобозначить переменную (для ясности): вместо max взять, например, min.


Пример П6. Обменять значения двух переменных.

Решение. Пусть имена переменных х и у. Задача состоит в том, чтобы переменная х получила значение переменной у и наоборот: у получил значение переменной х. Типичное неправильное решение задач с обменом значений:

x = y 'неверно!

y = x

В этом случае переменная х получит значение у, но переменная у в присваивании y = x получит уже новое значение х, приобретенное в результате первого оператора x =y. Таким образом, у приобретет свое прежнее значение. Необходимо помнить, что в любых операциях обмена значений переменных требуется посредник – дополнительная переменная для хранения промежуточного результата (старого значения одной из исходных переменных). Пусть такой переменной-посредником будет rab. Тогда правильное решение задачи:

rab = x

x = y

y = rab


Программа целиком:


Sub Обмен()

Dim x As Integer, y As Integer, rab As Integer

x = 10

y = 7

rab = x

x = y

y = rab

MsgBox x

MsgBox y

End Sub


Пример П7. Для каждого числа b из 20 чисел, вводимых с клавиатуры, определить наименьшее неотрицательное целое k такое, что b < 2k.


Решение. Алгоритм составляет цикл из 20 шагов, на каждом из которых: вводится очередное число; проверяется, какую (наименьшую) степень двойки оно не превышает; выводится показатель этой степени. Как получить нужную степень двойки? Пусть число b введено. Начинаем процесс проверки с 20, т.е. b < 20? Если да, процесс окончен, ответ k = 0. Если нет, проверяем 21, т.е. b < 21? Если да, процесс окончен, ответ k = 1. Если нет, проверяем 22, b < 22? И так до тех пор, пока не найдем нужное k. Таким образом, на каждом шаге внешнего цикла (ввод очередного числа) работает внутренний цикл, перечисляющий степени k двойки. Условие выхода из этого внутреннего цикла – число b больше или равно 2k. Программа:


Sub MinK ( )

Dim b As Integer, k As Integer

For i = 1 To 20 'внешний цикл вводит очередное b и печатает результат

b = InputBox(''Введите целое число'')

k = 0 'для каждого b начинаем поиск k с нуля!

While b >= 2 k 'условие цикла на каждом его шаге пересчитывается

k = k + 1

Wend

MsgBox "Для b =" & CStr(b) & " k=" & CStr(k)

Next

End Sub


Здесь операция & склейки строк при выводе текста потребовала преобразования типов CStr из целого в строковый, т.к. она определена для аргументов-строк.

5.2. Задачи с данными-массивами


Пример П8. Ввод и вывод одномерного и двумерного массивов.

Ввод массива фиксированной длины можно осуществить с клавиатуры или, в VBA, также с листа Excel. Для ввода проще всего использовать цикл For с числом шагов, равным длине (количеству элементов) массива. Пусть, например, требуется ввести массив М из 10 целых чисел.

Ввод одномерного массива с клавиатуры:


For i = 1 To 10

М(i) = InputBox(''Введите элемент массива'')

Next



Ввод одномерного массива с листа Excel (массив расположен на листе в диапазоне, например, A1:A10):


For i = 1 To 10

М(i) = Cells(i,1) 'номер строки меняется в цикле, столбец первый (А)

Next



Вывод одномерного массива в VBA нагляднее всего реализовать непосредственно на лист Excel, например, в диапазон B1:B10:


For i = 1 To 10

Cells(i,2) = М(i) 'номер строки меняется в цикле, столбец второй (В)

Next



Двумерные массивы вводятся и выводятся с помощью вложенных циклов: один перебирает строки, другой – столбцы массива. Какой из циклов внешний – неважно, главное – вложенные циклы позволяют перечислить все сочетания номеров строк и столбцов, т.е. учесть все элементы массива. Пусть, например, требуется ввести двумерный массив М размера 57.


Ввод двумерного массива с клавиатуры:


For i = 1 To 5 'перебираем строки

For j = 1 To 7 'перебираем столбцы

М(i,j) = InputBox(''Введите элемент массива'')

Next

Next



Ввод двумерного массива с листа Excel (двумерный массив расположен на листе в диапазоне, например, A1:G5):


For i = 1 To 5 'перебираем строки

For j = 1 To 7 'перебираем столбцы от A до G

М(i,j) = Cells(i,j)

Next

Next


Работает вложенный цикл следующим образом. Счетчик строк i получает очередное значение (здесь вначале это 1), затем полностью выполняется цикл со счетчиком j, т.е. перебираются все элементы i строки. После этого значение счетчика строк увеличивается на единицу (i = i +1) и вновь полностью выполняется цикл по j, перебирающий столбцы двумерного массива. Процедура завершается после перебора последней строки.


Если i и j поменять местами в заголовках циклов, т.е.:


For j = 1 To 7

For i = 1 To 5

A(i, j) = Cells(i, j)

Next