Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Задачник на VBA (часть I)*

.pdf
Скачиваний:
366
Добавлен:
10.06.2015
Размер:
916.18 Кб
Скачать

41

3.4Примеры программирования задач с алгоритмом накопления суммы

ипроизведения, табулирования математических функций

Пример 3.3. Составить

программу

для

 

вычисления

суммы

 

1

N

(k+1)

 

 

N

 

kx

 

 

 

 

 

 

 

S(x) =

x

k

и произведения P =

x

 

для произвольно

 

N

 

 

 

 

2

 

 

 

k=1

 

 

 

k =0

 

 

 

 

заданных x и N.

1. Решение: Для вычисления суммы воспользуемся программой процедурой.

Sub summa()

Dim k As Byte

x = Val(InputBox("Ввести x"))

N = Val(InputBox("Ввести N"))

Sum = 0

For k = 1 To N

U = x ^ ((k + 1) / k)

Sum = Sum + U

Next k

Sum = Sum / N

MsgBox "Сумма = " & Str(Sum)

End Sub

Начало программы Переменной цикла приписываем тип

Byte, так как k N и k< 255

Ввод значений x, N через функцию окна ввода. Функция Val преобразует символьное значение из поля ввода в

числовую переменную Запасаем переменную Sum для накопления суммы.

Начало цикла Вычисление очередного члена ряда,

зависящего от x и k, и очередной суммы Следующее k

Вычисление итоговой суммы по формуле Окно сообщения, выводящее результат расчета

Завершение программы

Комментарии к программе.

Запрос ввода переменных x и N, реализованный через функции диалоговых окон, выдаст величины в текстовом формате, поэтому перед присвоением введенных значений на переменные x и N, выполняем функцию Val, конвертирующую введенные значения в числовой формат.

42

В операторе MsgBox производится слияние (&) строковой (текстовой) константы «Сумма =» с преобразованным в текстовый формат (через функцию Str) результат, накопленного на числовой переменной Sum.

2. Решение: Для вычисления произведения

P =

N

 

kx

воспользуемся

 

x

 

 

 

 

 

 

 

 

 

2

 

 

 

k =0

 

 

 

программой-функцией, передавая значение переменной x и N, через формальные параметры.

Function proizv

Начало программы-функции

(x,N)

 

Dim k As Byte

Описание переменной цикла

P = 1

ЗапасаемпеременнуюP = 1 длянакопленияпроизведения.

For k = 0 To N

Начало цикла

U = x – k * x / 2

Вычислениеочередногочленаряда, зависящегоотx иk, и

P = P * U

очередногопроизведенияP

Next k

Следующее k = k + 1

proizv=P

Передача результата на возвращаемое значение proizv.

End Function

Завершение программы

Вызвать данную программу можно либо с листа Excel, либо из процедуры, например, следующим образом:

Sub main

x = Val(InputBox("Ввести x")): N = Val(InputBox("Ввести N")) PR=proizv(x,N): MsgBox "Произведение = " & Str(PR)

End Sub

Пример 3.4. Составить программу для получения таблицы функции y = lg x / x + 2x , заданной на множестве x {–3; 4;11;18;25}.

Решение: Прежде чем приступать к написанию программы, обратим внимание, что набор точек, в которых задана функция y, представляет собой арифметическую прогрессию с разностью h = 7, следовательно, мы имеем возможность использовать арифметический оператор цикла с шагом 7. Запишем программу-процедуру, в которой в качестве формальных параметров зададим начальное (x0), конечное значение (x1) аргумента x, и его шаг (h).

43

Sub y(x0, x1, h)

k = 1: cells(k,1)=”x”: Cells(k,2) = ”y”

For x = x0 To x1 Step h

y=log(x) / log(10) / x +exp (x * log( 2 ))

k=k+1

Cells(k, 1) = x: Cells (k, 2) = y Next x

End Sub

Начало программы-функции Выбор счетчика k для адресации к ячейкам листа Excel и формирование подписи к столбцам для аргумента x и значения y. Начало цикла

Вычисление y для очередного x Переход к следующей строке листа

Excel

Вывод данных на лист Следующее x = x + h Завершение программы

Комментарии к программе.

Обратим внимание на программирование математического выражения y: длявычисления 2х мы использовали функциюExp( ): 2x = exln2, анестепенную

функцию 2 ^ x. Это более корректное и универсальное решение задачи. Многие языки программирования, такие, как, например, Фортран, не выполняют операцию возведения в степень с вещественным показателем, с отрицательным основанием, такиежепроблемымогутвозникатьинаVBA.

Вызвать данную процедуру на выполнение можно, например, с помощью оператора call y(–3, 25, 7).

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

Составить программы для вычисления заданных сумм (А), произведений (Б) и табулирования функций на заданном множестве точек (В).

А

Б

В

вар.

 

 

 

 

1.

N

 

N

y = lg x3 , x [10,25] с шагом h = 3

S = 3i

 

P = cosi

 

 

i=1

 

i=1

 

2.

N

+1)2

N

y = sin2(x +1) ,

S = (i

P = (i 3)

х(30°, 45°, 60°, 75°, 90°)

 

i=1

 

i=1

44

3.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = 3x2 7 , на x [3,15]

S = i3

 

 

 

 

 

P = ai2

 

 

 

с шагом h = 2

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

4.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = sin2 x , x [10,50]с шагом h = 5

S = sin i2

 

P = cosi + 2

 

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = 3x2 7 ,

S = i2

 

 

 

 

 

P = ei

 

 

 

 

 

 

x [3,15] с шагом h = 2

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

N

+1)2

 

N

 

 

 

 

1

 

 

 

y = x

3

+ x 1, x(3, 5, 7, 9, 11)

6.

S = (i

P =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=11+i2

 

 

 

 

 

 

 

 

 

N 1

 

 

 

 

 

 

N

 

 

 

 

 

m

y = 3x2 + 2x +1,

7.

S =

 

 

 

 

 

P =

 

 

 

 

 

 

 

 

 

 

 

 

i2

 

 

 

 

 

(m i)2

x

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

[

3,10]с шагом h = 2

8.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = ctg x , x [10,170]

S = xi

 

 

 

 

 

P = i

 

 

 

 

 

 

с шагом h = 10

 

i=1

 

 

 

 

 

 

i=1

 

 

 

 

 

 

 

9.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = lg x3, x [30,45] с шагом h = 2

S = tgi

 

 

 

P = sin i2

 

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = cos2 x +1, x [10,40]

S = (i2 +1)

P = cos2 i

с шагом h = 5

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

11.

N

 

 

 

 

 

 

N

 

 

 

2

 

 

 

y = sin2(x +1) ,

S = cosi2

 

P = ei

 

 

 

 

 

 

x (30,45,60,75,90)

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

N

 

 

2

 

3

 

N

 

 

 

 

 

 

3

 

 

y = lg

 

x3

 

, x [10,25] с шагом h = 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12.

S = cos

 

i

 

P = sin i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13.

N

3

 

 

 

 

N

 

 

i

, x R

y = log5 x2 , x [3,20] с шагом h =

S = 3i

 

 

 

 

 

P =x

 

2

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14.

N

 

 

 

 

 

P = (2n +1)!,

y = e2x +cos x 1,

S = (x +1)i

n = 1,2,3,…….M

x [10,10] с шагом h = 3

 

i=1

 

 

 

 

 

 

N

 

 

 

 

 

 

n

2

 

 

 

 

 

 

y = sin x2 + ctgx +3 ,

 

S = sin2 i

 

P =

 

 

 

 

 

,

 

 

 

x [10,80]с шагом h = 5

15.

 

(2n)!

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n = 1,2,3,…….M

 

 

 

 

 

 

 

 

16.

N

 

 

 

 

 

 

N

 

 

 

 

 

 

 

 

 

y = x3 ctgx ex , x = −3,1,5,9,13,17

S = i3

 

 

 

 

 

P = sin2 i

 

 

 

 

 

 

 

 

 

i=1

 

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

45

 

N

 

 

 

N

 

 

 

 

y =

 

x

 

(1 x)2

, x = 0,3,6,9,12,15

 

 

 

 

 

 

 

 

 

 

17.

S = i3

 

 

P = cosi

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i=1

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

N

 

 

 

N

ai

,α R

y = sin x + cos x ctgx , x [10,70]

18.

S = log3 i

 

P = e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i =1

 

 

 

 

с шагом h = 10

 

 

 

 

i=1

 

 

 

 

 

 

 

 

 

 

19.

N

 

 

 

N

 

 

 

 

y = ctgx sin x ,

 

 

S = (i +1)3

P = cosi

 

x [10,85] с шагом h = 5

 

i=1

 

 

i=1

 

 

 

 

20.

N

 

 

 

N

 

 

 

 

y = Ax2 + Bx + cos x ,

S = ei

 

P = lgi

 

 

x [A, B] с шагом H

 

i=1

 

 

i=1

 

 

 

 

21.

N

 

 

 

N

 

 

 

 

y = x2 ex + cos x ,

 

S = (ax)i

 

P = i2

 

 

x = (3,1,1,3)

 

 

 

 

i=1

 

 

i=1

 

 

 

 

 

 

 

 

N

1

 

 

N

 

 

 

 

y = x3 cosea+x , x [7,18]

22.

S =

 

 

 

P = ln2

i

с шагом h = 3

 

 

 

 

 

 

 

 

 

 

i=1i2

 

 

i=1

 

 

 

 

 

 

 

 

N

x

 

 

N

 

2

i

 

y = 5 x cos3 ea+x , x [0,2π]

23.

S =

 

, x R

P = e

 

с шагом h = π/10

 

 

 

 

 

 

 

i=1i2

 

 

i=0

 

 

 

 

 

 

 

N

3 cosi3

N

 

 

 

 

y =

 

x

 

3

mod(1 x)

2

,

 

 

 

 

 

 

 

24.

S =

P =a2i

,a R

 

 

 

 

 

x [10,6;2,2,6,10]

i=1

 

 

i=1

 

 

 

 

 

 

 

 

 

 

 

 

N

cosi

5

N 4

sin i

3

y = e2x +lg

 

x3

 

 

, x [10,25]

 

 

 

25.

S =

 

P =

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

i=1

 

 

 

i=1

 

 

 

 

с шагом h = 3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.5 Примеры задач с неявно заданным арифметическим циклом

6

Пример3.5. Вычислить S = 2i безиспользованияоперациивозведения

i=1

в степень.

Решение: Стандартный алгоритм решения задачи был рассмотрен в п. 3.3. Использовать его не всегда рационально, так как операция возведения числа 2 в степень i выполняется умножением 2 на себя i раз, при очень большом значении i эта процедура будет требовать больших затрат процессорного времени, поэтому рассмотрим более эффективный способ решения такой задачи.

Sub sum(i0, i1, k1, k2)

s = 0: u=1 For i = i0 To i1

u = u * 2

s = s + u Next i

Cells(k1, k2) = s End Sub

46

Начало программы. формальные параметры i0

начало, i1 - конец суммирования,

k1, k2 – номер строки и столбца ячейки листа Excel для вывода результата

Начальные значения переменных Начало цикла

Вычисление очередного члена суммы через предыдущий член Накопление суммы

Следующее i = i + 1 Вывод результата Завершение программы

Пример 3.6. Составить программу для вычисления суммы натуральных чисел, кратных числу m и лежащих в интервале от N1 до N2.

Решение: Для определения кратности используем оператор вычисления остатка от деления Mod. Для того, чтобы не заботиться о выводе данных, составим программу-функцию, с формальными параметрами N1, N,2 m

Function S_nat (N1, N2, m) Dim k As Integer

s = 0

For k = N1 To N2

If k mod m = 0 then s = s + k

Next k

S_nat = s

End Function

Начало программы-функции Описание переменной цикла

Запасаем переменную s=0 для накопления суммы Перебираем все целые числа в заданном интервале

Если очередное число кратно m, то его остаток при делении на m будет равен нулю, в этом случае присоединяем это число к сумме

Следующее k = k + 1

Передача результата на возвращаемое значение S_nat.

Завершение программы

47

3.6 Задания для самостоятельной разработки программ с неявно

заданным циклическим алгоритмом.

10

1. Вычислить S = (1)i i2 , не используя операцию возведения в i =1

степень числа (–1).

2. Плотность воздуха убывает с высотой по закону ρ = ρ0ehz . Считая

что ρ0 =1,29 кг , z =1,25 104 , напечатать таблицу зависимости

м3

плотности от высоты с шагом 100 м от 0 до 1000 м.

3.Осваивая производство нового изделия, предприятие выпустило их в первый день 10 000 шт. Каждый следующий день оно выпускало на 10 % больше от нормы предыдущего дня. Сколько изделий предприятие выпустит на 7 день? Сколько изделий предприятие выпустит за 7 дней?

4.Одноклеточная амеба каждые 3 часа делится на 2 клетки. Определить, сколько клеток будет через 3, 6, 9, 12, 15,…, 24 часа.

5.Вычислить сумму натуральных чисел, кратных 7, начиная с 11 до 29.

6.В столбце таблицы записаны баллы студентов по одному экзамену.

Вгруппе N студентов. Определить средний балл группы.

7.В списке студентов группы из N человек дан возраст студентов в годах на текущий момент. Выбрать студентов, старших 20 лет, и записать их

вотдельный столбец листа Excel.

8. Найти скалярное произведение двух n-мерных векторов (не использовать массивы).

9.Дано целое четырехзначное число в системе счисления с основанием q 10. Перевести это число в десятичную систему счисления.

10.Задан набор из m точек c координатами (x, y). Найти сумму радиусов векторов этих точек (не использовать массивы).

11.В предыдущей задаче (№ 10) отобрать те точки, которые попадают

вкруг радиусом R0. Отобрать точки – значит вписать в строке листа, где хранятся значения (x, y), фразу «лежит в заданном круге».

12.Дана рекуррентная формула для функции yn+1 = 2xyn ynx1 .

Вычислить y15 , если известно, что y0 =3; y1 = −2 .

13. Составить программу для нахождения всех пифагоровых чисел, не превышающих 20. Пифагоровы числа – это натуральные числа n и m, удовлетворяющие условию n2 + m2 = k2 , т.е. такие два числа, сумма квадратов которых равна квадрату другого числа.

48

14.N-угольник задан своими вершинами, т.е. для каждой вершины заданы координаты (x, y). Составить программу для нахождения периметра этого многоугольника.

15.Группа студентов из n человек проходит тестирование по 100балльной системе. Результаты каждого третьего суммируются, и по ним вычисляется средний балл. Сколько студентов было отобрано и какой средний балл получен?

IV. Итерационные алгоритмы

4.1. Оператор цикла с условием Do…Loop

Главной особенностью циклов с условием является условие, которое может быть любым выражением, принимающим значение True (Истина) или False (Ложь). В VBA есть два основных цикла с условием.

Цикл с предусловием

Do While | Until <Условие>

Операторы тела цикла

Loop

Если While, то тело цикла выполняется, когда <Условие> = True, если Until, то тело цикла выполняется, когда <Условие> = False.

Пример 4.1. Переменная а = y(2, 15). Текст пользовательской программы – функции y (i, N) приведен справа. Чему равно значение а?

Решение:

1.Сопоставляем формальные параметры с фактическими: x = 2; Q = 15

2.P = 1; k = 1

3.Так как условие выполнено, т.е. P < Q (1 < 15), то выполняем операторы тела цикла:

4.U = 2 + 1 2 / 2 = 3

5.P = 1 3 = 3

6.k = 1 + 1 = 2

7.Loop (Возврат к Do)

8.Возвращаемся к шагу 3.

Function y (x, Q) Dim k As Byte P = 1: k = 1

Do While P <= Q U = x + k * x / 2 P = P * U

k = k + 1 Loop

y = P

End Function

4. U = 2 + 2 2 / 2 = 4

4. U = 2 + 3 2 / 2 = 5

5. P = 3 4 = 12

5. P = 12 5 = 60

6. k = 2 + 1 = 3

6. k = 3 + 1 = 4

7. Loop (Возврат к Do)

7. Loop (Возврат к Do)

Function z (k, N) Dim i As Byte
S = - 6: i = 4 Do
T = i * Sqr( k ) S = S + T
i = i + 1
Loop Until S > N z = S
End Function

49

8. Условие не выполняется : P = 60 > 15, следовательно происходит выход из цикла к предпоследнему оператору программы: y = 60.

Ответ: а = 60

Цикл с постусловием

Do

Операторы тела цикла

Loop While | Until <Условие>

В этом варианте операторы цикла будут выполнены один раз обязательно, а будет ли их повторение, - зависит от выполнения/невыполненияусловия.

Пример 4.2. Переменная b = z (9, 20). Текст пользовательской программы – функции z (k, N) приведен справа. Чему равно значение а?

Решение:

1. Сопоставляем формальные параметры с фактическими: k = 9; N = 20

2. S = - 6; i = 4

3.Приступаем к выполнению операторов цикла Do

4.T = 4 9 = 12

5.S = - 6 + 12 = 6

6.i = 4 + 1 = 5

7.Проверяем условие S >20 ? Нет!

8.Возвращаемся к Do, т.е.

4.T = 5 9 = 15

5.S = 6 + 15 = 21

6.i = 5 + 1 = 6

7.Проверяем условие S >20 ? Да! Выходим из цикла

8.z = 21.

Ответ: b = 21

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

Пример 4.3 Разложение функции sin x в ряд Маклорена дается

i

x2i+1

 

 

 

x3

 

 

x5

 

формулой: sin x = ∑(1)

 

 

= x

 

 

 

 

+

 

 

+L. Составить

(2 i +1)!

1

2 3

1 2 3 4 5

i=0

 

 

 

 

программу, вычисляющую sin x c точностью ε.

50

Решение: При накоплении суммы ограничимся теми членами, которые по модулю не меньше, чем заданное число ε. Используем программуфункцию. Для эффективности работы программы, будем использовать рекуррентную формулу для каждого последующего члена через предыдущий:

 

Ui+1 = −U i

x2

 

(i +1)(i + 2)

 

Function sinx (x, eps)

Начало программы-функции: x – аргумент,

eps – точность ε

 

i = 1: r = x^2: sg = - 1

Начальные значения для цикла

U = x: s = U

sg – переменная для учета знакопеременности

ряда

 

Do

Начало цикла

U = sg * U * r /(i + 1)/(i + 2) Вычисление очередного члена ряда,

s = s + U

зависящего от x и I и накопление суммы

sg = - sg

Смена знака

Loop While Abs(U) > eps

Возвращаемся, если полученный член ряда

больше заданного eps = ε

 

sinx = s

Передача результата на возвращаемое

значение sinx.

 

End Function

Завершение программы

4.2Задания для самостоятельного чтения программ

ситерационным циклом

Определить значение переменных, вычисляемых по программам, текст которых приводится.

1) a = prog1(2; 5)

 

2) b = prog2(6; 5)

 

3) c = prog3(7; 10)

Function prog1 (x, Z)

 

Function prog2 (q, P)

 

Function prog3 (g, V)

U = - 6: p = 3

 

A = 7: t = 3

 

B = 7: y = 3

Do

 

Do Until A < P

 

Do While B < V

F = x ^ p

 

A = q / t

 

H = (g + y) ^ 2

U = U + F

 

 

 

B = B + H

p = p + 1

 

t = t - 4

 

y = y* 4

Loop Until F < Z

 

Loop

 

Loop

prog1 = U

 

prog2 = A

 

prog3 = y

End Function

 

End Function

 

End Function