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

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

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

 

 

 

 

 

 

 

31

 

 

 

 

 

 

 

 

 

 

x,

 

 

x 1

 

 

x +5,

 

 

x 9

 

y =

 

 

 

 

2 x >1

 

y =

 

 

 

 

9 < x <10

21.

2x,

 

22.

x 7,

 

 

 

 

 

 

 

 

x > 2

 

 

 

 

 

 

x 10

 

 

3x,

 

 

 

 

x +8,

 

 

 

x,

 

 

 

x e

 

 

 

tgx

,

 

x π

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

23.

y =

 

,

 

 

x e / 2

24.

y =

 

 

 

 

π < x < 2π

x

 

 

 

x7 ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

x,

 

e / 2 > x > 0

 

 

 

 

 

 

 

 

 

 

 

 

ctg(x

+8),

x 2π

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

x,

 

x ≤ −3 102

 

 

cos2 x,

 

x 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

25.

y =

log

2

x,

x 3 102

26.

y =

sin x2

,

 

x π/ 2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3 102 > x > −3 102

 

 

 

 

 

 

 

π/ 2 > x > 0

 

 

ln x,

 

 

 

сtg 2x ,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.6. Примеры разработки программ с алгоритмом «ветвление» для задач с неявным алгоритмом

Пример 2.4 Составить программу для вычисления корней квадратного

уравнения a x2 +b x +c = 0 . Результаты вывести в ячейки листа Excel.

Решение:

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

Sub sqr_equ(a, b, c, i, j)

Название программы с формальными параметрами

D = b ^ 2 - 4 * a * c

Вычисление дискриминанта D

If D > 0 Then

Если D > 0, то

x1 = (-b - Sqr(D)) / 2 / a

вычисляем первый корень

x2 = (-b + Sqr(D)) / 2 / a

вычисляем второй корень

ElseIf D = 0 Then

Если D = 0, то

x1 = -b / 2 / a

вычисляем 1-й корень, а 2-й корень приравнивается

x2 = x1

1-му корню

Else

Остался единственный случай : D < 0, то

Cells(i, j) = "Корней нет" выводится сообщение об отсутствии корней и

Exit Sub

осуществляется выход из программы

End If

Конец блочного оператора If

Cells(i, j) = x1:

Вывод 1-го корня в запланированную ячейку

Cells(i + 1, j) = x2

Вывод 2го корня в следующую ячейку того же

End Sub

столбца

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

32

В представленной программе используется досрочный выход из п/п - Exit Sub, чтобы не «забить» сообщение "Корней нет" последними операторами вывода в ячейки листа, которые работают при неотрицательном корней. Чтобы по этой программе получить решение, например, уравнения

5 x2 +8 x 31 = 0, достаточно в вызывающей программе записать оператор Call sub_equ(5,8,-30,1,1).Результаты будут выведены в ячейки А1, А2.

Пример 2.4. Дана плоская фигура c вырезанным изнутри квадратом со стороной а = 3 см, а снаружи окружностью радиуса R = 5 см. Центры квадрата и окружности находятся в начале координат (Рис. 2.1). Определить, попадает ли точка с координатами x, y внутрь данной фигуры.

Решение:

Нанесем заданные параметры фигуры и координаты точки на лист Excel:

 

A

B

С

D

1

R =

5

x =

1

2

A =

3

y =

3

Текст соответствующей программы:

Sub Figure () r = cells(1,2)

a = cells(2,2)

x = cells(1,4) : y = cells(2,4) rp = SQR(x ^ 2 + y ^ 2)

ah = a / 2

IF rp <= r AND ABS(x) >= ah AND ABS(y) >= ah THEN

text$= "точка внутри фигуры" ELSE: text$= "точка вне фигуры"

END IF cells(5,1)=text$ END Sub

y

 

r

 

 

 

 

a

 

0

 

rp

 

x

 

 

 

 

 

 

(x,y)

 

 

Рис. 2.1

 

Начало программы Ввод радиуса окружности Ввод стороны квадрата

Ввод координат точки Вычисление радиуса век тора точки. Вычисление половины стороны квадрата. Определение, удовлетво ряют ли координаты точ ки условиям попадания в фигуру.

Формирование текстовой переменной с результата ми сравнения

Конец блока IF Вывод результата в А5 Конец программы

33

2.6. Задания для программирования задач с неявно заданным алгоритмом «ветвление»

1.Написатьпрограммудлявыборанаибольшегоизтрехзаданныхчисел.

2.Написатьпрограммудлявыборанаибольшегоизчетырехзаданныхчисел.

3.Написать программу полного исследования совокупности корней биквад-

ратного уравнения a x4 +b x2 +c =0. Если корнейнет, то должнобытьвыведено сообщениеобэтом, иначедолжныбытьвыведеныдваиличетырекорня.

4. Даны три числа: X, Y, Z. Составить программу для нахождения минимального из них.

5. Даны три числа: X, Y, Z. Удвоить эти числа, если X < Y < Z,

изаменить их абсолютными значениями, если это не так.

6.На плоскости даны две точки: P(x1,y1) и Q(x2,y2). Составьте программу, определяющую, находится ли каждая из этих точек на прямой, заданной уравнением: y = a x + b. Значения координат точек P и Q, а также коэффициенты уравнения прямой задайте самостоятельно – через формальные параметры или с ячеек листа.

7.На плоскости заданы три точки A(x1,y1), B(x2,y2) и C(x3,y3). Составьте программу, определяющую с некоторой погрешностью, является ли

треугольник ABC прямоугольным. Если заданный треугольник является прямоугольным, укажите вершину треугольника, при которой угол равен 90о. Координаты точек задайте через формальные параметры.

8.Составьте программу, определяющую название дня недели по его номеру: 1 – Понедельник, 2 – Вторник и т.д. При вводе числа вне диапазона [1–7] программа должна выдать сообщение об ошибке.

9. Составьте программу, определяющую

стадию жизни человека

по его возрасту: 0–11 – Детство, 12–30 – Юность,

31–65 – Зрелость, 66–100 –

Старость.

 

Шкала возрастов может быть произвольной. При вводе числа вне диапазона[0–100] программадолжнавыдатьсообщение«Такдолгонеживут!».

10. Составьте программу, определяющую цвет по длине волны. Используйте приведенные ниже приближенные интервалы длин волн и соответствующие им цвета видимой части спектра.

Цвет спектра

Длина волны, нм

Цвет спектра

Длина волны, нм

Красный

760620

Голубой

500480

Оранжевый

620590

Синий

480450

Желтый

590560

Фиолетовый

450380

Зеленый

560500

 

 

34

При вводе значения длины волны вне оптического диапазона спектра [380–760] нм программа должна выдать сообщение об ошибке.

11. Составить программу, определяющую, могут ли три числа a, b и c быть сторонами треугольника, и если да, то определить его тип: равносторонний, равнобедренный, разносторонний. При составлении программы используйте условия существования треугольника: a b +c; b a +c; c a +b . При

решении задачи следует учитывать экстремальные ситуации, когда одна или несколько сторон равны нулю либо когда одно из неравенств переходит в равенство(треугольникнулевойплощади).

12. Составить

программу,

опреде-

 

 

y

 

 

 

 

ляющую, попадает ли точка

P(x,y) в

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

прямоугольник со сторонами a и b и

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

центромвточкескоординатами(x0, y0).

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

13. Составьте

программу,

опреде-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ляющую, принадлежит ли точка P(x,y)

 

 

 

 

 

 

 

 

 

 

 

 

х

 

 

 

 

 

 

 

 

 

 

 

закрашеннойобласти(Рис. 2.2)

-2

-1

 

 

 

-

1

2

14. Определить, что

при

делении

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

двух положительных целых чисел A и B,

 

 

 

 

 

 

-2

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

заданных чисел L или R.

 

 

 

 

 

 

Рис. 2.2.

 

 

 

 

15. Решить

задачу

примера 1.4

 

 

 

 

 

 

(стр. 18) с условием возможной кратности числаV числу512.

III. Алгоритм циклической структуры

Цикл – это оператор или группа операторов, которые программа многократно выполняет до тех пор, пока не получит команду начать выполнение чего-либо другого. Такая последовательность команд называется телом цикла. Циклические алгоритмические структуры бывают двух типов:

Циклы со счетчиком (арифметические циклы), в которых тело цикла выполняется определенное количество раз;

Циклы с условием (итерационные циклы), в которых тело цикла выполняется, пока условие истинно.

3.1.Оператор арифметического цикла For…Next

Формат записи оператора:

FOR_перем._ц.=нач.знач.ц._TO_кон.зн._[STEP_ знач_шага_ц.]

35

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

NEXT [перем._ц.]

Здесь:

перем.ц. – переменная цикла - числовая переменная, нач.зн.ц. и кон.зн.ц. – начальное и конечное значение цикла:

может быть числовой константой, именем переменной или арифметическим выражением.

знач._шага_ц.– шаг изменения переменной на очередном цикле: может быть числовой константой, именем переменной или арифметическим выражением. Если операнд STEP опущен, то значение шага = 1.

При обращении к оператору For…Next сначала вычисляется шаг, начальное и конечное значение. Если при положительном значении шага полученное значение переменной цикла меньше или равно конечному значению, то выполняется последовательность операторов, следующая за оператором For-To – операторы тела цикла. Если полученное значение переменной цикла больше конечного значения, то происходит выход из цикла и управление передается оператору, следующему за Next. При отрицательном значении шага значение переменной цикла уменьшается с каждым циклом. Цикл выполняется до тех пор, пока значение переменной цикла не станет меньше конечного значения. Если при входе в блок For…Next заданное условие не выполняется, то управление сразу передается оператору, следующему за оператором Next.

3.2. Примеры чтения программ с алгоритмом «арифметический цикл»

Пример 3.1. Прочесть команды п/п Summation и определить, какой результат и в какой форме будет выдан после ее выполнения.

Sub summation()

S = 0

For i = 5 To 10 Step 2

S = S + i

Next i

MsgBox Str$(S), vbExclamation, "Пример накопления Суммы" End Sub

Начало программы Засылка число

0 на S

Начало оператора цикла Тело цикла

Конец оператора цикла Результат посылает

ся в окно сообщения Конец программы

36

Решение:

цикл й-1

1.S = 0

2.Первое действие оператора For…Next: i = 5. Проверяется i 10 ? Если

«да!», то компьютер приступает к выполнению операторов тела цикла, а именно:

3.S = 0 + 5 = 5 – вячейкеОПсименемS число0 заменяетсяначисло5.

4.ПК приступает к выполнению оператора Next: i = 5 + 2 = 7 – значение переменнойциклаизменяетсянавеличинушагаStep = 2.

5.Возврат к оператору For…To…: снова проверяется i = 7 10 ? Да!

Происходитвозвраткпункту3:

й-2

3. S = 5 + 7 = 12

цикл

4. i = 7 + 2 = 9 – здесьзнак« = » - этооператорприсваивания

5. i = 9 10 ? Да! здесьзнак« = » - этознакравенства

 

й-3

3. S = 5 + 7 = 12 здесьпервыйзнак« = » - этооператорприсваивания,

второй– знакравенства.

цикл

4. i = 9 + 2 = 11

 

 

5. i = 11 10 ? Нет! происходитвыходизцикланавыполнениефунк-

 

ции MsgBox

 

 

6. Функция

MsgBox формирует окно

сообщения, где

vbExclamation – аргумент

опции button для отображения значка «!»,

аргумент title =

"Пример накопления Суммы"

отображен в строке заголовка окна сообщения. MsgBox использует функцию Str(S), преобразующую числовую переменную S в символьную типа String – это необходимое условие для вывода числового значения в окне сообщений.

В ходе работы цикла происходит накопление суммы на переменной S за счет оператора присваивания. Результат – накопленная сумма представлен

в поле окна сообщения. Это – 21.

Ответ: 21

Function D(i1%, i2%, i3%)

 

Пример

3.2. На

рисунке

представлен

 

Dim y As Integer

фрагмент листа Excel. Справа представлен текст

Dim i As Integer

подпрограммы

функции.

Чему

будет равен

Dim s As Single

результат в ячейке D1?

 

 

 

 

s = -2

 

 

 

 

 

 

 

 

 

For i = i1% To i2% Step i3%

 

 

 

 

 

 

 

 

 

y = (i ^ 2 - 10) / (i + 1)

 

A

 

B

 

C

 

D

 

 

 

 

 

 

s = s + y

1

1,26E+01

0,1E - 03

-5,23E 0

=D(A1;B1;C1)

 

 

Next i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D = s

 

 

 

 

 

 

 

 

 

End Function

 

 

 

 

 

 

 

 

 

 

37

Решение: Опуская подробные объяснения, данные в предыдущем примере, покажемлишь, какменяютсязначенияпеременныхвходеработы.

1. Передача фактических данных с листа Excel на формальные параметры, которые являются целочисленными переменными, поэтому происходит округлениедо«ближайшего» целогочисла:

i1% = 1,26E + 01 = 1,26 101 = 12,6 13; i2% = 0,13E – 03 = 0,13 10-3 = 0,00013 0; i3% = – 5,23E 0 = – 5,23 100 = – 5,23 – 5.

2.Переменные y, i объявлены как целочисленные, поэтому при операциях с ними также будем делать округление до целого числа. Переменная s – вещественная, расчеты для нее ведутся без округления.

3.s = – 2.

4.i = 13 0 ? Да!

 

5. y =

132

10

=

159

=11,3... 11

1-й цикл

 

13

+1

 

14

 

 

 

6.s = -2 + 11 = 9

7.i = 13 – 5 = 8 0 ? Да!

 

5. y =

82

10

=

54

 

= 6

2-й цикл

8

+1

9

 

 

 

 

 

 

6. s = 9 + 6 = 15

 

 

 

 

7. i = 8 – 5 = 3 0 ? Да!

 

5. y =

 

32

10

=

1

= −0,25... 0

3-й цикл

 

3

+1

4

 

 

 

 

 

 

6. s = 15 + 0 = 15

 

7. i = 3 – 5 = – 2 0 ? Нет! выход из цикла.

8. D = s = 15 – возвращаемое значение. Ответ: в ячейке D1 будет 15

38

3.3. Задания для самостоятельного чтения программ с алгоритмом «арифметический цикл»

Прочесть программу, написанную в модуле, сопровождающем лист Excel, записать результат, который появится после выполнения программы в ячейке листа С1.

 

 

 

 

 

 

 

 

 

 

Function D(j1%, j2%, j3%)

Задание 1.

 

 

 

 

 

 

 

Dim y As Integer

 

 

 

 

 

 

 

 

 

 

Dim i As Integer

 

A

 

B

C

D

 

 

 

 

Dim s As Single

1

1,99E+01

 

2,5E-03

-10,3E0

=D(A1;B1;C1)

 

 

 

s = 7

 

 

 

 

 

 

 

 

 

 

For i = j1% To j2% Step j3%

 

 

 

 

 

 

 

 

 

 

y = (i - 9) / (i - 7)

 

 

 

 

 

 

 

 

 

 

s = s + y

 

 

 

 

 

 

 

 

 

 

Next i

 

 

 

 

 

 

 

 

 

 

D = s

 

 

 

 

 

 

 

 

 

 

End Function

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Function P(i1%, i2%, i3%)

Задание 2.

 

 

 

 

 

 

 

Dim t As Integer

 

 

 

 

 

 

 

Dim i As Integer

 

A

 

 

B

C

 

D

 

 

 

 

 

 

 

Dim s As Single

1

20E–01

 

0,12E+02

4,15E0

 

= P(A1;B1;C1)

 

 

s = 1

 

 

 

 

 

 

 

 

 

 

For i = i1% To i2% Step i3%

 

 

 

 

 

 

 

 

 

 

t = (i + 10) / i ^ 2

 

 

 

 

 

 

 

 

 

 

s = s + t

 

 

 

 

 

 

 

 

 

 

Next i

 

 

 

 

 

 

 

 

 

 

P = s

 

 

 

 

 

 

 

 

 

 

End Function

 

 

 

 

 

 

 

 

 

 

 

Задание 3.

 

A

B

C

D

1

1,0E–02

0,18E+02

7,24E0

= z(A1;B1;C1)

Function z(i1%, i2%, i3%) Dim x As Integer

Dim i As Integer

Dim q As Single q = 0

For i = i1% To i2% Step i3% x = (i + 10) / (i + 1)

q = q + x Next i

z = q

End Function

 

39

Задание 4.

 

Sub sqrt()

 

For i = 1 To 3

 

x = Cells(i, 1): xx = Sqr(x): Cells(i, 2) = xx

 

Next i

 

End Sub

 

 

Задание 5.

 

 

 

 

Function G(i1%, i2%, i3%)

 

 

 

 

Dim z As Integer

 

A

B

C

D

 

Dim i As Integer

1

1,6E+01

0,21E-03

-7,3E0

= G(A1;B1;C1)

 

Dim s, z As Single

 

 

 

 

 

 

s = – 10

 

 

 

 

 

 

For i = i1% To i2% Step i3%

 

 

 

 

 

 

z = (i – 10) ^ 2 / (i + 1)

 

 

 

 

 

 

s = s + z

 

 

 

 

 

 

Next i

 

 

 

 

 

 

G = s

 

 

 

 

 

 

End Function

 

 

 

 

 

 

 

Задание 6.

Sub trig_fun() Pi = Cells(1, 1) For i = 2 To 4

Cells(i – 1, 2) = Sin(Pi / i): Cells(i – 1, 3) = Cos(Pi / i) Next i

End Sub

Задание 7.

 

A

B

C

1

1,6E+02

4

 

2

2,5E+01

5

 

3

2,4E+02

3

 

Sub prog2() sm = 1.E2 For i = 1 To 3

x = Cells(i, 1): c = Cells(i, 2) y = x / c: Cells(i, 3) = y

sm = sm + y Next i

Cells(i, 3) = sm End Sub

Задание 8.

 

A

B

C

1

3,6E+02

90

 

2

2,0E+01

4

 

3

5,4E+02

27

 

40

Sub prog3() pp = 1

For i = 1 To 3

x = Cells(i, 1): c = Cells(i, 2) y = x / c: Cells(i, 3) = y

pp = pp* y Next i

Cells(i, 3) = pp End Sub

Задание 9.

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

Sub main()

sm = Sum_gp(3, 3, 3)

MsgBox Str(sm), , "Sum of geometrical progression" End Sub

Function Sum_gp(b0, q, n) b = b0

s = 0

For i = 2 To n

b = b * q: s = s + b Next i

Sum_gp = s

End Function

Задание 10.

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

Sub prog1()

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

For i = 5 To 2 Step –2 xr = xr * i

Next i x$ = xr

MsgBox x$, , "Накопление произведения" End Sub