![](/user_photo/2706_HbeT2.jpg)
- •Раздел 2 Программирование на языке
- •Лабораторная работа № 1
- •1 Порядок решения задач на компьютере
- •2 Разработка линейных программ
- •Input "Ввести d, k,n"; d, k,n
- •3 Операторы read, datа, restore
- •3 Запуск qbasic, ввод и редактирование программ
- •Лабораторная работа № 2
- •2 Программы ветвления
- •Input X
- •Лабораторная работа № 3
- •1 Операторы цикла qb
- •2 Примеры программ с циклами
- •3 Контрольные вопросы
- •4 Задание
- •Лабораторная работа № 4
- •1 Программа вычисления арифметического ряда
- •2 Программы вычисления факториалов
- •3 Алгоритм итерационного цикла
- •4 Контрольные вопросы
- •5 Задания
- •Лабораторная работа № 5
- •1 Программа "цикл в цикле"
- •2 Программа "цикл и ветвление"
- •3 Программа "цикл в цикле и ветвление"
- •4 Контрольные вопросы
- •5 Задания
- •Лабораторная работа № 6
- •1 Одномерные массивы - векторы
- •2 Двумерные массивы – матрицы. Обработка массивов
- •3 Контрольные вопросы
- •4 Задания
- •Лабораторная работа № 7
- •1 Функции пользователя
- •3 Процедуры. Операторы sub и end sub
- •Лабораторная работа № 8
- •1 Графические операторы qbasic
- •2 Программа рисования графических объектов
- •3 Построение графиков функций
- •4 Контрольные вопросы
- •5 Задание
Лабораторная работа № 3
Арифметические циклы
Цель работы: изучение циклических вычислительных процессов,
операторов FOR…NEXT, WHILE…WEND, DO…LOOP
Содержание работы:
1 Операторы цикла QB
2 Примеры программ с циклами
1 Операторы цикла qb
Программа циклической структуры позволяет многократно выполнять группу операторов при одновременном изменении одного или нескольких параметров.
Арифметическими циклами называются циклы, число повторений которых известно или его можно определить. В зависимости от постановки задачи различают циклы с известным и неизвестным числом повторений (циклы с неизвестным числом повторений рассматриваются в лабораторной работе №4 "Итерационные циклы").
Циклы с известным числом повторений – это арифметические циклы, которые могут быть организованы в QB четырьмя способами:
С помощью условного оператора IF…THEN.
Оператором цикла FOR…NEXT.
Оператором цикла WHILE…WEND.
Оператором цикла DO…LOOP
Если c помощью оператора IF…THEN можно выполнять различные вычислительные процессы (ветвление программы, нахождение максимума и минимума переменных , проверка условий и др.), то операторы цикла FOR… NEXT, WHILE…WEND, DO…LOOP предназначены в среде QBASIC только для организации циклических вычислений.
Оператор FOR…NEXT имеет формат:
FOR V=A1 TO A2 STEP ∆А…(тело цикла)…NEXT V,
(для) (к) (шаг) (следующий)
где
V – имя управляющей переменной цикла;
A1 - начальное значение V;
A2 – конечное значение V;
∆A – величина приращения V.
66
Тело цикла - это последовательность операторов, которые выполняются многократно (в цикле).
Этот оператор удобен тем, что в одной строке указываются и начальное А1, и конечное А2 значения, и шаг приращения ∆А. Если STEP ∆А в операторе не указан, то шаг ∆А автоматически принимается равным 1.
Оператор WHILE…WEND имеет формат:
WHILE L<=A2…(тело цикла)……WEND.
While переводится как "пока", а WEND – это сокращение слов while end, т.е. "конец while"
Оператор DO…LOOP имеет формат:
DO…(тело цикла)…LOOP UNTIL V>A2
(делать) (петля) (до)
или DO UNTIL V>A2…(тело цикла)…LOOP
Цикл WHILE…WEND является циклом "Пока", а цикл DO…LOOP – циклом "До".
В цикле "Пока" (while) вычисления повторяются, пока его условие выполняется. Особенность цикла в том, что проверка условия производится в начале цикла. Если при первой проверке условие не выполняется, то тело цикла не будет выполнено ни разу.
В цикле "До" (until) вычисления повторяются до тех пор, пока выполняется его условие. Особенность этого цикла заключается в том, что он всегда выполняется хотя бы один раз, так как первая проверка условия происходит в конце цикла, т.е. после того, как тело цикла выполнено хотя бы один раз.
Количество повторений цикла определяется по формуле
2 Примеры программ с циклами
Пример 1. Вычислить и вывести на печать значения функции y = x+ex sin x , если аргумент х изменяется от -1 до 2 с шагом 0,1.
Составим схему алгоритма (рис. 1).
Она работает следующим образом: в блоке 2 аргументу х присваивается начальное значение, равное -1, в блоке 3 вычисляется значение функции у при х = -1, в блоке 4 значения у и х выводится на экран. В блоке 5 аргумент получает приращение, т.е. увеличивается на 0,5, в блоке 6 выполняется проверка на достижения аргументом конечного значения, равного 2. Если аргумент х ещё не превысил конечное значение, то
67
управление передаётся блоку 3, в котором вычисляется новое значение функции у при новом значении х. Если значение х становится больше, чем 2, то вычисления прекращаются, конец программы.
По этому алгоритму можно составить четыре варианта программы.
Схема алгоритма:
Рисунок 1 Схема алгоритма
циклической программы
Программа, вариант 1
REM Цикл с оператором IF…THEN
CLS ' очистка экрана
х =-1 ' присвоение х начального значения
m: у =х + EXP(х)*SIN(х) ' вычисление у при хнач
PRINT "у =";у, "х ="; х ' вывод на экран у и х
х =х + 0.1 ' увеличение х на шаг 0,1
IF х <= 2 THEN m ' если х ещё меньше или равен хкон, то
END ' управление передаётся по метке m, если
' нет, то следующему оператору – END
В программе варианта 1 для организации цикла использован оператор условного перехода IF…THEN (что указано в комментарии – оператор REM).
Действие каждого оператора указано в комментариях под знаком апострофа (это невыполняемая часть программы, которая записывается только для программиста). Возврат в начало цикла организован передачей управления с помощью оператора условного перехода по метке m.
68
Вариант 2
REM Цикл с оператором FOR…NEXT
CLS ' очистка экрана
FOR х =-1 TO 2 STEP .2 ' задание параметров цикла: хнач, хкон, шага ∆х
у =х + EXP(х)*SIN(х) ' вычисление у в цикле
PRINT "у =";у, "х ="; х ' вывод на экран у и х
NEXT x ' возврат к началу цикла
END
Описание программы:
в операторе цикла FOR…задаётся первое значении х=-1, следующим оператором вычисляется значение функции у, затем оно распечатывается на экране (оператор PRINT) вместе со значением х, потом оператор NEXT x передаёт управление назад, оператору FOR…, где к величине х прибавляется шаг, т.е число 0,2, новое значение х составляет -0,8, в следующем операторе вычисляется значение у при х=-0,8, распечатывается, вновь производится возврат в оператор FOR…, вновь увеличивается аргумент х на 0,2 и становится равным 0,6 и т.д. Последний раз цикл выполнится при х=2, а потом, т.к. заданный интервал х[-1;2] уже просчитан, программа переходит к следующему оператору, т.е.END – конец программы.
Вариант 3
REM Цикл с оператором WHILE…WEND
CLS ' очистка экрана
х = -1 ' задание начального значения: хнач = -1
WHILE x <= 2 ' проверка условия: пока х ещё <= хкон = 2
у =х + EXP(х)*SIN(х) ' вычисление у в цикле
PRINT "у =";у, "х ="; х ' вывод на экран у и х
х = х + 0.2 ' увеличение х на шаг 0.2
WEND ' возврат к началу цикла - WHILE…
END
Описание программы:
Начальное значение х = -1 задаётся до тела цикла WHILE…WEND,
затем в операторе WHILE проверяется достижение конца цикла х = 2. Поскольку х = -1 ещё меньше, чем 2, то программа переходит к следующему оператору, где вычисляется значение у при первом х = -1. затем оно и значение х распечатываются (на экране), потом значение х увеличивает-
69
ся на шаг (х = х + 0.1) и оператор WEND передаёт управление оператору WHILE, где снова проверяется, достигло ли новое значение х = -0,8 значения 2. Т.к. -0,8 ещё меньше 2, то вычисляется у при этом значении х = -0,8 ,распечатывается вместе с х, снова х увеличивается на шаг 0,2, затем WEND возвращает управление началу цикла, где WEND вновь проверяет х = -0,6 на достижение хкон = 2 и т.д.
Особенностью цикла является то, что он может быть не выполнен ни разу, если значение хнач пройдет проверку в операторе WHILE, т.е. окажется больше хкон.
Вариант 4
REM Цикл с оператором DO…LOOP
CLS ' очистка экрана
х = -1 ' задание начального значения: хнач = -1
DO
у =х + EXP(х)*SIN(х) ' вычисление у в цикле
PRINT "у =";у, "х ="; х ' вывод на экран у и х
х = х + 0.2 ' увеличение х на шаг 0.2
LOOP UNTIL x > 2 ' проверка превышения конца цикла х > 2
END
Описание программы:
До тела цикла вводится хнач= -1, потом следует оператор "Делать" – что именно: вычислять у, распечатывать его и аргумент х. Затем идёт проверка: делать петлю до того, как величина х станет больше хкон. В условии проверки должен стоять знак ">", чтобы цикл был просчитан и при последнем значении х = хкон. Если записать LOOP UNTIL x = 2, то последним значением х, которое будет до х = 2, является х = 1,8, т.е. при х = хкон= 2 цикл просчитан не будет. Если записать LOOP UNTIL x < 2, то все значения х окажутся меньше хкон и цикл просчитается только один раз, при х = хнач= -1, затем он увеличится на шаг и станет равным -0,8, но это значение является значением до х = 2, поэтому "петля" на слово DO делаться не будет. Поэтому, для того, чтобы цикл был
просчитан и при конечном значении аргумента х, в условии LOOP UNTIL должен быть только знак ">".
Структура программы такая же, как и для цикла WHILE…WEND, т.е. до тела цикла вводится начальное значение х = -1, а в теле цикла вычисляется и выводится у, а также задаётся приращение аргумента х = х + 0,1, но:
проверка достижения хкон выполняется в конце цикла, поэтому он обязательно будет просчитан хотя бы один раз (при х = хнач),
в условии проверки достижения конечного значения должен стоять знак ">", чтобы цикл был просчитан и при последнем значении аргумента.
Вариант 5
REM Цикл с оператором DO UNTIL…LOOP
CLS ' очистка экрана
х = -1 ' задание начального значения: хнач = -1
DO UNTIL x > 2 ' проверка превышения конца цикла х > 2
у =х + EXP(х)*SIN(х) ' вычисление у в цикле
PRINT "у =";у, "х ="; х ' вывод на экран у и х
х = х + 0.2 ' увеличение х на шаг 0.2
LOOP
END
Работа программы происходит также, как и в варианте 4, но, поскольку проверка конца цикла производится в его начале, то он тоже может быть не выполнен ни разу (как и в цикле WHILE…WEND).
Пример 2 Вычислить с помощью оператора цикла и вывести на печать сумму всех значений у = sin3х, где х изменяется от 1 до 10 с шагом 0.1.
S
=
Программа
REM цикл For…Next
CLS
S = 0 ' задание начального значения суммы S
FOR x = 1 TO 10 STEP .1 ' ввод параметров цикла
Y = SIN(х)^3 ' вычисление у = sin3x
S = S + Y ' прибавление текущего у к предыдущему S
NEXT x ' переход к началу цикла – следующему х
PRINT "S=", S
END
Описание программы:
До начала цикла вводится начальное значение суммы S = 0. К нему будут добавляться все значения функции у = sin(х), поэтому, чтобы итоговая сумма не искажалась, оно должно быть равно нулю.
71
Затем оператором FOR аргументу х присваивается первое значение, равное 1, вычисляется Y = sin3x = 0,59 и сумма S = S + Y как S = 0 + 0,59, потом NEXT х передаёт управление строке FOR, где х увеличивается на приращение 0,1 и становится равным 1,1. Вычисляется значение функции при новом х = 1,1 (т.е. Y = 0,707) и прибавляется к предыдущему значению S (S = 0,59 + 0,707 = 1,297, затем NEXT x снова возвращает процесс вычисления на FOR, где х увеличивается на 0.1 и т.д. Последний раз цикл будет просчитан при х = 10, потом значение накопленной суммы S выводится на экран и - конец программы. Если бы оператор PRINT стоял внутри цикла (например, после вычисления S = S + Y, Ио на печать выводились бы все промежуточные значения суммы S.
Та же программа с оператором цикла WHILE…WEND примет вид
CLS ' очистка экрана
х = 1 : S = 0 ' задание начальных значений х = 1и S = 0
WHILE x <= 10 ' проверка условия: пока х ещё <= хкон = 10
Y = SIN(х)^3 ' вычисление у = sin3x
S = S + Y ' прибавление текущего у к предыдущему S
х = х + 0.1 ' увеличение х на шаг 0.1
WEND ' возврат к началу цикла - WHILE…
PRINT "S ="; S ' вывод на экран S
END
Пример 3 Вычислить с помощью оператора цикла и вывести на печать произведение положительных значений функции p = е4x, где х изменяется от 0.1 до 0.5 с шагом 0.1
Программа с оператором FOR…NEXT примет вид:
CLS
p = 1 ' присвоение 1 начальному р
FOR x = 0.1 TO 0.5 STEP .1 ' ввод параметров цикла
Y = ЕХР(4*х) ' вычисление у = e4х
p = p*Y ' умножение текущего у на предыдущее р
NEXT x ' переход к началу цикла – следующему х
PRINT "p=", p
END
72
Пример 4 Вычислить сумму первых 20 членов ряда
S
=при х=1.05.
В
общем виде i-тый
член ряда можно записать как
,
где N – числитель, который увеличивается через 2,
k – показатель степени при х, увеличивающийся на 1.
Обозначим символом m счётчик слагаемых (челнов ряда) для определения конца цикла при m = 20.
Программа
CLS
X=1.05 'присвоение Х значения 1,05
S=0 ' начальное значение суммы S
N=2 ' начальное значение числителя N
k = 1 ' начальное значение показателя степени при х
m = 0 ' начальное значение счётчика циклов сложения
М: Y = N/X^k ' вычисление i-го члена ряда
S=S+Y ' вычисление суммы слагаемых: предыдущее S+Yi
N = N + 2 ' увеличение числителя N на 2
k = k + 1 ' увеличение показателя степени k на 1
m = m + 1 ' увеличение счётчика слагаемых m на 1
IF m <=20 THEN M ' переход к строке с меткой М, если m <= 20
PRINT "S="; S '
END '
Описание программы:
После очистки экрана (CLS) вводится значение для Х оператором присваивания (Х=1.05), задаётся начальные значения суммы S=0, числителя N=2, показателя степени в знаменателе k=1 и счётчика слагаемых m=0. Затем вычисляется первый член ряда при начальных N и k, т.е Y=2/k^1 и его значение прибавляется к сумме S=S+Y как S=0+2/х. Потом все коэффициенты – N, k, m получают свои приращения и выполняется проверка: если число слагаемых m ещё меньше или равно 20, то программа возвращается по метке М к вычислению следующего i-го члена ряда с новыми значениями N и k, если m>20, т.е. все 20 членов уже ссумированы, то программа автоматически переходит к следующему оператору, т.е.выводу суммы S и завершению программы.
Та же программа может быть записана с операторами цикла WHILE… WEND и DO…LOOP:
73
CLS X=1.05: S=0: N=2: k=1: m=0 WHILE m<=20 S=S+N/X^k N=N+2: k=k+1: m=m+1 WEND ? "S="; S END |
или CLS X=1.05: S=0: N=2: k=1: m=0 DO S=S+N/X^N N=N+2: k=k+1: m=m+1 LOOP UNTIL m >20 ? "S="; S END |
В этих программах значение Yi вычисляется не отдельно, а сразу в выражениях для суммы S.
Оператор цикла FOR…NEXT здесь не может быть использован, т.к. его формат (конструкция) такова, что он сам задаёт и сам изменяет переменную цикла, а в данной задаче переменная цикла m должна не задаваться, а отслеживаться, т.е. быть не первичным (задающим) , а вторичным, зависящим от других операций параметром.
В примерах 2-4 для вычисления суммы или произведения ряда значений используется прием накопления (суммы или произведения).