ЛАБОРАТОРНАЯ РАБОТА №4
ПРОГРАММИРОВАНИЕ ЗАДАЧ С ЦИКЛИЧЕСКИМ АЛГОРИТМОМ
Цель работы:
Изучить логические конструкции организации циклов.
Получить практические навыки решения задач с циклическим алгоритмом.
Получить практические навыки использования различных видов циклов.
1. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
Изучить методические указания к лабораторной работе.
Подготовить задачу для решения на ПК (постановка задачи, алгоритм, код программы).
Запустить Microsoft Excel и подготовить макет таблицы для вывода исходных данных и результата.
Запустить редактор VBA.
Создать модуль и процедуру для решения поставленной задачи.
Запустить процедуру.
Распечатать полученные результаты и код программы.
2. ЛОГИЧЕСКИЕ КОНСТРУКЦИИ
Данная лабораторная работа посвящена изучению способов решения задач с циклической структурой.
Циклические вычисления основаны на способности вычислительных машин многократно повторять одинаковые или похожие действия. Совокупность арифметических и логических действий, выполняемых многократно, называется телом цикла. В процессе представления логических конструкций организации циклов под телом цикла будет подразумеваться один оператор или группа операторов выполняемых циклически.
VBA предлагает два основных типа конструкций, организующих циклы: Do…Loop и For…Next. При этом рассматриваются три базовые типы циклов:
Цикл «с предусловием»;
Цикл «с постусловием»;
Цикл с заданным количеством раз повторений тела цикла.
Первые два типа циклов используются, когда заранее не известно количество раз повторений. В связи с этим, в теле данных циклов в обязательном порядке, необходимо предусмотреть действия которые изменяют значение переменной цикла (переменная, участвующая в условии повторения цикла или выхода из него).
Цикл третьего типа применяется, когда количество раз повторений тела цикла заранее известно и переменная цикла изменяется в заданных пределах с постоянным шагом.
2.1. Организация циклов «с предусловием»
Характерной особенностью циклов данного типа является то, что условие повторения цикла или выхода из него, проверяется перед выполнением тела цикла. Структуры, реализующие цикл «с предусловием» представлены на рис. 8а, 8б.
|
|
а)
|
б)
|
Рис. 8. Структура цикла «с предусловием»
Отличием представленных структур является то, что в первой схеме рассматривается условие повторения цикла, а во второй – выхода из него. Структура (рис. 8а) является классическим циклом, встречающимся во всех языках программирования, и называется циклом «Пока». Для реализации данного цикла в VBA используется конструкция Do While…Loop,синтаксис которой имеет вид:
Do While условие
тело цикла
Loop.
Обнаружив оператор Do While, VBA начинает проверять условие. Если проверяемое условие не выполняется, т.е. оно принимает значение «ложь», VBA игнорирует остальную часть цикла (тело цикла) и переходит сразу к операторам в программе, следующим за оператором Loop. Если же условие приобретает значение «истина», VBA выполняет операторы тела цикла и снова переходит к оператору Do While. При этом, в структуре Do While…Loop, если условие принимает значение «ложь», в случае когда программа впервые обращается к циклу, тело цикла не выполнится ни разу.
Структура, приведенная на рис. 8б, в свою очередь, реализуется конструкцией Do Until…Loop, синтаксис которой имеет вид:
Do Until условие
тело цикла
Loop.
Кардинальным отличием рассматриваемой конструкции Do Until…Loop от конструкции Do While…Loop, является то, что тело цикла в данной конструкции выполняется, если проверяемое условие принимает значение «ложь».
2.2. Организация циклов «с постусловием»
Для реализации циклов «с постусловием» в VBA используется, как классическая конструкция – цикл «До» Do…Loop Until (рис. 9а), так и конструкция Do…Loop While (рис. 9б), присущая только VBA.
|
|
а)
|
б)
|
Рис. 9. Структура цикла «с постусловием»
Цикл «До» применяется в случае, когда группа операторов, которая относится к телу цикла, должна повторяться, до тех пор, пока не выполнится условие выхода из цикла. Синтаксис данного цикла имеет вид:
Do
тело цикла
Loop Until условие.
В конструкции, же Do…Loop While тело цикла, выполняется, пока заданное условие принимает значение истинно, при этом синтаксис записи рассматриваемой конструкции особо не отличается от цикла «До» и имеет вид:
Do
тело цикла
Loop Until условие.
При выборе типа цикла необходимо учитывать, тот факт, что в циклах «с постусловием», в отличии от циклов «с предусловием», тело цикла всегда выполнится, по крайней мере один раз, поскольку программа сперва проходит весь блок программного кода, а лишь затем выполняется проверка условия, чтобы повторить выполнение цикла или выйти из него.
2.3. Организация цикла с заранее заданным количеством раз повторений
Как правило, рассмотренные выше циклы, применяются в случаях с заранее неизвестным числом повторений (итерационные циклы). Однако если количество раз повторений указано явным образом – фиксированное число, или известны пределы и шаг изменения переменной цикла, тогда целесообразно использовать так называемый цикл «с параметром» (цикл с заранее известным количеством раз повторений). Типичная структура данного цикла приведена на рис. 10.
Рис. 10. Структура цикла «с параметром»
Для реализации цикла «с параметром» в VBA используется конструкция For…Next. Рассмотрим ее синтаксис:
For ПЦ=НЗ To КЗ [Step шаг]
тело цикла
Next ПЦ, где:
ПЦ –переменная цикла;
НЗ –начальное значение переменной цикла;
КЗ – конечное значение переменной цикла;
шаг – шаг изменения переменной цикла.
Для использования конструкции For…Next необходимо четко усвоить следующие нюансы:
В качестве значений НЗ, КЗ и шаг могут выступать константы (целые и дробные числа), переменные любого числового типа и результаты сложных выражений;
Для выполнения тела цикла, хотя бы один раз, должно выполняться условие: НЗКЗ;
-
В случае если, шаг изменения переменной цикла равен единице, тогда параметр Step указывать не обязательно;
В VBA, при использовании конструкции For…Next, включена возможность принудительного выхода из цикла, для этого, в случае необходимости, используется оператор Exit For, который будет являться частью тела цикла.
3. ИСПОЛЬЗОВАНИЕ СВОЙСТВА CELLS
При решении задач циклической структуры, зачастую возникает необходимость вывода всех значений, которые принимает, как переменная цикла, так и переменные которые изменяют свои значения в процессе выполнения цикла. При этом для дальнейшего анализа полученных результатов, каждое значение необходимо выводить в отдельную ячейку рабочего листа Excel. Для организации такого вывода в VBA используется свойство Cells объекта Range.
Форма записи:
Range("БЯ").Cells(I,J).Value=имя_переменной.
Свойство Cells(I,J) объекта Range("БЯ") позволяет поместить значение переменной «имя_переменной» в рядом расположенные ячейки, по отношению к базовой ячейке с адресом «БЯ», со смещением на (I-1) ячеек по вертикали (по строкам) и (J-1) ячеек по горизонтали (по столбцам). Например: при выполнении строки Range("С2").Cells(2,1).Value=a, значение переменной «a» будет помещено не в ячейке «С2», а в ячейке «С3».
Необходимо отметить, используя свойство Cells, есть возможность не только передавать определенное количество значений переменной, но и также организовать передачу значений из рабочего листа в программу. В этом случае используют следующую форму записи:
имя_переменной=Range("БЯ").Cells(I,J).Value
4. ПРИМЕР РЕШЕНИЯ ЗАДАЧ С ЦИКЛИЧЕСКИМ АЛГОРИТМОМ
4.1. Пример использования оператора Do While…Loop
Вычислить значение функции , при a=2.1, b=-5.45 и значении аргумента х,который изменяетсяот хн до хкс шагом dx.
Блок-схема алгоритма решения задачи приведена на рис. 14.
Рис. 14. Блок-схема алгоритма решения поставленной задачи
Листинг программы, которая соответствует данной блок-схеме алгоритма, имеет вид:
Public Sub Cikl()
Dim i As Byte 'переменная для организации вывода
Dim x, Y, xn, xk, dx As Single
Const a = 2.1
Const b = -5.45
xn = Val(InputBox("Введите начальное значение x", "Ввод данных"))
xk = Val(InputBox("Введите конечное значение x ", " Ввод данных "))
dx = Val(InputBox("Введите шаг изменения x ", " Ввод данных "))
Range("B1").Value = "Начальное значение x"
Range("B2").Value = xn
Range("C1").Value = "Конечное значение x"
Range("C2").Value = xk
Range("D1").Value = "Шаг изменения х"
Range("D2").Value = dx
Range("B3").Value = "Шаг вычисления"
Range("C3").Value = "Значение х"
Range("D3").Value = "Значение функции"
x = xn
i = 1
Do While x <= xk
Y = a * Sin(x) + b
Range("B4").Cells(i, 1).Value = i
Range("C4").Cells(i, 1).Value = x
Range("D4").Cells(i, 1).Value = Y
i = i + 1
x = x + dx
Loop
End Sub.
Результаты выполнения программы представлены на рис. 15.
|
A
|
B
|
C
|
D
|
1
|
|
Начальное значение x
|
Конечное значении x
|
Шаг изменения х
|
2
|
|
0
|
4
|
0,5
|
3
|
|
Шаг вычисления
|
Значение x
|
Значение функции
|
4
|
|
1
|
0
|
-5,45
|
5
|
|
2
|
0,5
|
-4,44
|
6
|
|
3
|
1
|
-3,68
|
7
|
|
4
|
1,5
|
-3,35
|
8
|
|
5
|
2
|
-3,51
|
9
|
|
6
|
2,5
|
-4,19
|
10
|
|
7
|
3
|
-5,15
|
11
|
|
8
|
3,5
|
-6,18
|
12
|
|
9
|
4
|
-7,03
|
13
|
|
|
|
|
Рис. 15. Результаты выполнения программы
4.2. Пример использования оператора Do…Loop Until
Вычислить по итерационной формуле , . Точность вычислений . Исходные данные: a, .
Блок-схема алгоритма решения задачи приведена на рис. 16.
Рис. 16. Блок-схема алгоритма решения поставленной задачи
Листинг программы, которая соответствует данной блок-схеме алгоритма, имеет вид:
Public Sub Cikl()
Dim e As Single 'точность вычисления
Dim Yi, Yi_1 As Single 'значение корня на i и i+1 шаге
Dim i As Byte 'шаг итерации
Dim a As Single 'число под корнем
a = Val(InputBox("Введите число под корнем ", "Ввод данных"))
e = Val(InputBox("Введите точность вычисления", "Ввод данных"))
Yi = 1
Do
Yi_1 = (Yi + a / Yi) / 2
Yi = Yi_1
i = i + 1
Loop Until Abs(Yi_1 ^ 2 - a) <= e
Range("B1").Value = "Точность вычисления равна " + Str(e)
Range("B2").Value = "Корень числа " + Str(a) + " равен " + Str(Yi_1)
Range("B3").Value = "Количество итераций равно " + Str(i)
End Sub.
Результаты выполнения программы представлены на рис. 17.
|
A
|
B
|
C
|
1
|
|
Точность вычисления равна .0001
|
|
2
|
|
Корень числа 67 равен 8.185355
|
|
3
|
|
Количество итераций равно 6
|
|
4
|
|
|
|
Рис. 17. Результаты выполнения программы
4.3. Пример использования оператора For…Next
Вычислить n значений ряда, заданного формулой , где i=1..n. Исходные данные: n,h,x.
Блок-схема алгоритма решения задачи приведена на рис. 18.
Листинг программы, которая соответствует данной блок-схеме алгоритма, имеет вид:
Public Sub Cikl()
Dim i, n As Integer
Dim Y, x, h As Single
n = Val(InputBox("Введите количество членов ряда ", "Ввод данных"))
x = Val(InputBox("Введите значение х", "Ввод данных"))
h = Val(InputBox("Введите значение h", "Ввод данных"))
Range("B1").Value = "n"
Range("B2").Value = n
Range("C1").Value = "h"
Range("C2").Value = h
Range("D1").Value = "x"
Range("D2").Value = x
Range("B3").Value= "Номер члена ряда"
Range("С3").Value= "Значение члена ряда"
For i=1 To n
Y=(cos(x)+(i-1)*h)/(sin(x)+i*h)
Range("B4").Cells(i,1).Value=i
Range("C4").Cells(i,1).Value=Y
Next i
End Sub.
Рис. 18. Блок-схема алгоритма решения поставленной задачи
Результаты выполнения программы представлены на рис. 19.
|
A
|
B
|
C
|
D
|
E
|
1
|
|
n
|
h
|
x
|
|
2
|
|
5
|
1,5
|
0,24
|
|
3
|
|
Номер члена ряда
|
Значение члена ряда
|
|
|
4
|
|
1
|
0,558978251
|
|
|
5
|
|
2
|
0,763299864
|
|
|
6
|
|
3
|
0,838241293
|
|
|
7
|
|
4
|
0,877139919
|
|
|
8
|
|
5
|
0,900957081
|
|
|
9
|
|
|
|
|
|
Рис. 19. Результаты выполнения программы
5. СОДЕРЖАНИЕ ОТЧЕТА
Номер, тема и цель лабораторной работы.
Краткие теоретические сведения:
2.1.Базовые структуры циклического вычислительного процесса;
2.2. Операторы, реализующие циклические алгоритмы;
2.3. Использование свойство Cells.
Этапы решения задачи:
3.1. Условие задачи;
3.2. Математическая постановка;
3.3. Блок-схема алгоритма;
3.4. Таблица соответствия переменных.
Распечатка листинга программы.
Распечатка результатов работы программы.
6. КОНТРОЛЬНЫЕ ВОПРОСЫ
Чем характеризуется циклический вычислительный процесс?
Какие базовые типы циклов, используются для реализации задач?
Особенности применения циклов «с предусловием» и операторов, реализующие данный цикл.
Особенности применения циклов «с постусловием» и операторов, реализующие данный цикл.
В каких случаях используется конструкция For…Next?
Правила использования свойства Cells.
|