Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования для студентов технологического профиля. Учебное пособие
.pdf
131
LOOP{ WHILE / UNTIL } условное выражение
)
100
1(
100
0001
p
S
p
SSS
)
100
1(
100
1112
p
S
p
SSS
Оператор c ключевым словом While обеспечивает
выполнение группы операторов до тех пор, пока значение
условного выражения True. Если результат проверки условного
выражение False, то цикл прекращает свою работу и выполнятся
оператор, следующий за ключевым словом Loop или за
ключевыми словами Loop While.
Оператор c ключевым словом Until обеспечивает
выполнение группы операторов до тех пор, пока результат
условного выражения False. Если результат проверки условного
выражения True, то выполняется оператор, следующий за
ключевым словом Loop или за ключевыми словами Loop While.
Если условное выражение проверяется в конце цикла, то
цикл выполняется хотя бы один раз вне зависимости от
результата проверки.
Программа 3.9.2. Вычислить сумму чисел от 1 до 10,
используя оператор DO … LOOP.
SUM = 0 : I = 1
DO UNTIL I > 10
SUM = SUM +i : i=i+1
LOOP
PRINT SUM
- выводится число 55.
Программа 3.9.3. Вычислить какую сумму денег получит
вкладчик банка через N лет, если начальная сумма вклада равна
S0 , а банковский процент по вкладу равен p.
Анализ задачи:
Рассчитаем сумму вклада вкладчика, через один год (S1):
.
Рассчитаем сумму вклада вкладчика, через два года (S2):
.

132
Очевидно, что через N лет сумма вклада составит (Sn):
)
100
1(
100
*
111
p
S
p
SSS
nnnn
2
12
3,06,0
nnn
VVV
2
102
3,06,0 VVV
2
213
3,06,0 VVV
В качестве основной рекуррентной формулы используем
первую формулу.
Программа в QBasic:
СLS
INPUT ″ Введите начальную сумму вклада ″; s
INPUT ″ Введите число лет ″; n
INPUT ″ Введите процент по вкладу ″; р
FOR i = 1 ТO n
s1 = s*(1+p/100)
s = s1 ´замена начального значения вычисленным
NEXT i
? ″Сумма вклада через″ n ″лет равна″ s1
ЕND
Программа 3.9.4. Задана рекуррентная формула, связывающая
последующий элемент ряда с предыдущими значениями ряда:
,
где V0 = 1 : V1 = 0.5
Вычислить первые 5 членов ряда и вывести их значения на
экран.
Анализ задачи:
Учитывая, что нулевой и первый член ряда известны,
вычислим второй член ряда, задав n = 0, тогда:
Если задать n=1, тогда третий член ряда равен:
Если для вычисления третьего члена ряда использовать
первую формулу, то тогда для вычисления V3 необходимо
положить:
V0 = V1 ; V1 = V2
и т.д.

133
В качестве рекуррентной формулы используем формулу
EVn
для вычисления V2.
Программа на Qbasic:
CLS
v = 1 : v 1 = 0.5
? ″Нулевой член ряда равен″ v
? ″Первый член ряда равен″ v1
FOR i = 2 TO 4
v2=0.6* v -0.3* v1^2
v = v1 : v1 = v2
Read n$
? n$ ″член ряда равен″ v2
NEXT i
END
Data ″Второй″ , ″Третий″ , ″Четвертый″
После запуска программы на экране появляются
следующие сообщения:
Нулевой член ряда равен 1
Первый член ряда равен 0,5
Второй член ряда равен 0,525
Третий член ряда равен 0,217
Четвертый член ряда равен 0,301
Программа 3.9.5. (См. Программy 3.9.4.). Вычислить n –й
член ряда. Вычисления проводить до тех пор, пока n –й член
ряда по модулю не станет меньше наперед заданного малого
положительного числа E =0,1:
В программе использовать цикл DO… LOOP.
Программа на Qbasic:
CLS
v = 1 : v1 = 0.5
INPUT ″Введите малое положительное число″; e
DO

134
v2 = 0.6* v - 0.3* v1^2
n
xxxx
xx
n
n
1
.......
432
)1(
432
)1ln(
,
n
x
n
.
11
1
1
n
xx
n
x
a
nn
n
,
)1(
1
nn
nxx
a
n
n
.
)1(1
n
nx
aa
nn
;aan
11aan
.
)1(1
n
nx
aa
v = v1 : v1 = v2
LOOP WHILE аbs(v2) > e
? ″Член ряда равен″ v2
END
После запуска программы на экране появляются
следующее сообщение:
Член ряда равен 5.25116E-02
Программа 3.9.6. Вычислить сумму ряда для заданного
значения аргумента x=0.5
Вычисление суммы ряда производить до тех пор, пока
очередной член ряда по модулю не станет меньше заданной
точности Е. Функцию в левой части ряда вычислить, используя
стандартную функцию бейсика - LOG(x).
Анализ задачи:
Для вычисления членов ряда выведем рекуррентную
формулу, связывающую последующий член ряда (a
n+1
) с
предыдущим ( аn).
Пусть: a
Умножим числитель и знаменатель последней дроби на n,
тогда:
в результате получим:
Введем обозначения:
тогда:
n
=
тогда
,

135
Таким образом, получена рекуррентная формула,
.
22
1
2
xx
xa
2
2
x
33
2
2
32
xxx
' Программа для вычисления суммы ряда
1
'Название файла программы: RJD.bas
2
'Дата составления программы : 14.12.98
3
'Программист: Юнусов А.A.
4
x = .5 : CLS
5
INPUT "Введите точность вычислений"; e
6
a = x : n = 1 : k = -1 : s = a
7
DO WHILE abs( a) > e
8
a1 = a * x * n / (n + 1)
9
s = s + a1 * k ' накопление суммы
10
n = n + 1 : k = -1 * k : a = a1
11
LOOP
12
CLS : PRINT USING "Сумма ряда равна ##.##^^^^"; s
13
PRINT USING "Контрольная сумма = ##.##^^^^"; LOG(1+x)
14
END
15 136
связывающая каждый последующий член ряда (а1) с
предыдущим членом (а).
Подберем значения a, и n для которых возможно
вычисление очередного члена ряда. Первый член ряда
вычислять не будем, т.к. он задан. Вычислим второй член ряда,
если a=x, n=1 и тогда, используя рекуррентную формулу,
получим:
.
Вычислим третий член ряда, если a=
a1=
; n=2 , тогда:
.
Вычисления следующих членов ряда можно выполнить
аналогичным образом.
Для изменения знака члена ряда введем коэффициент
k= - 1, знак которого будем менять в программе.
Программа на QBasic:

Обсуждение программы:
1-4
-шапка программы;
5
-присваивание переменной x заданного значения и
очистка экрана;
6
-ввод погрешности. Обычно задается достаточно малое
положительное число, например, 0.01;
7
-присваивание идентификаторам начальных значений:
а=x (первый член ряда); s=a (начальное значение суммы
ряда); n=1. Коэффициент k задаем отрицательным, т.к.
вычисляется второй член ряда;
8-12
-цикл DO ... LOOP:
8
-открытие цикла с проверкой условия в начале цикла.
Условие проверяется перед выполнением цикла, и цикл
будет выполняться до тех пор, пока проверяемое
условие имеет значение True. Вначале проверяемое
значение имеет значение True, т.к. abs(a)>e и поэтому
управление будет передано в строку 9. Если
проверяемое условие будет имеет значение False, то
управление будет передано к строке 13, т.е. к
оператору, расположенному за оператором LOOP. В
проверяемом условии необходимо использовать
модуль, т.к. члены ряда могут быть отрицательными;
9
-вычисление очередного члена ряда по рекуррентной
формуле;
10
-накопление суммы ряда Первоначальное значение s
равно a, т.е. x. К этому значению прибавляется a1*k и
результат записывается в ячейку s;
11
-изменение параметров, что необходимо для
вычисления следующего члена ряда. Знак
коэффициента k изменен на противоположный;
12
-конец цикла LOOP;
13
-очистка экрана вывода и вывод вычисленной суммы
ряда. Результат выводится в экспоненциальной форме.
Для записи мантиссы выделено две позиции под целую
часть числа и две позиции под дробную;
137

окончание таблицы
14
-вывод контрольной суммы ряда. Осуществляется
вычисление натурального логарифма и вывод
полученного значения;
15
- конец программы.
После запуска программы на экран выводится:
'Программа для вычисления суммы ряда
1
'Название файла программы: RJD1.bas
2
'Дата составления: 14.12.98
3
'Программист: Богданов Р.И.
4
' Защита от дурака
5
DO
6
SLEEP 2 : CLS
7
INPUT "Введите значение аргумента"; x
8
IF x < .5 OR x > 1.2 THEN
9
PRINT "Аргумент вне диапазона. Повторите ввод! "
10
END IF
11 138
Введите точность вычислений E=0.01
Затем экран очищается от информации и выводится:
Сумма ряда равна 4.07Е-01
Контрольная сумма ряда = 4.05Е-01
Вычисленная сумма ряда и контрольная сумма совпали,
что свидетельствуют о правильной работе программы.
Программа 3.9.7. Вычислить сумму ряда (см. предыдущую
Программу 3.9.6.) для произвольного значения аргумента,
взятого из интервала 0.5<= x <= 1.2
Вычисление суммы ряда производить до тех пор, пока
разность между двумя членами ряда по модулю не станет
меньше заданной точности Е.
Вычислить функцию в левой части ряда, используя
стандартную функцию бейсика.
Защитить аргумент x от «дурака», т.е. от ввода значения,
выходящего за указанный интервал.
Программная реализация на QBasic:

окончание таблицы
LOOP UNTIL x >= .5 AND x <= 1.2
12
INPUT "Введите точность вычислений", e
13
a1 = x : n = 1 : k = -1 : s = a1
14
DO
15
a=a1
16
a1 = a * x * n / (n + 1)
17
s = s + a1 * k
18
n = n + 1: k = -1 * k
19
LOOP UNTIL abs(abs(a)-abs(a1)) <= e
20
CLS : PRINT USING " Сумма ряда равна ##.##^^^^"; s
21
? USING "Контрольная сумма ряда = ##.##^^^^"; LOG(1 + x)
22
END
23
Обсуждение программы:
1-4
-шапка программы;
5
-подсказка;
6-12
-цикл DO ... LOOP:
6
-начало цикла DO:
7
-задержка выполнения операторов на 2 секунды и
очистка экрана
8
-ввод значения x;
9-11
-блочный IF;
9
-начало цикла IF. Анализ x. Если x вне заданного
диапазона, то выполняется строка 10, в противном
случае управление передается строке 12;
10
-вывод сообщения о неверном вводе x;
11
-конец блочного оператора IF;
12
-конец цикла DO LOOP с условием. Если проверяемое
условие имеет значение False, то управление передается
к началу цикла, т.е. в строку 6. Если проверяемое
условие имеет значение True, то управление передается
в 13 строку.
13
-ввод точности (погрешности вычисления ряда);
139

окончание таблицы
14
-присваивание переменным (идентификаторам)
начальных значений: a1=x (первый член ряда); s= a1;
n=1. Коэффициент k задаем отрицательным, т.к.
вычисляется второй член ряда;
15-20
-цикл DO ... LOOP
15
-открытие цикла с проверкой условия в конце. Вначале
цикл будет выполнен без проверки условия;
16
-переменная a принимает значение a1, т. е. x, т.к. в
следующей строке используется выражение с
переменной a;
17
-вычисление последующего члена ряда;
18
-накопление суммы ряда;
19
-изменение параметров n и k, что необходимо для
вычисления следующего члена ряда. Знак
коэффициента k меняется на противоположный;
20
-конец цикла. Проверяется условие. Вначале
проверяемое значение имеет значение False, поэтому
управление будет передано к началу цикла, т.е. в строку
16. Если значение проверяемого условия станет True,
то управление будет передано в строку 21.
21
-вывод вычисленной суммы ряда;
22
-вычисление и вывод значения ряда с использованием
стандартной функции бейсика. Внимание! Оператор
PRINT позволяет не только вывести значение
выражения на экран, но и вычислить его значение;
23
-конец программы.
После запуска программы через 2 секунды на экран
выводится:
Введите значение аргумента 1
Введите точность вычислений 0.01
После очистки экрана на нем появляется:
Сумма ряда равна 4.07D-01
Контрольная сумма ряда = 4.05D-01

140
Учитывая, что контрольная сумма практически равна
контрольной сумме ряда, можно сделать вывод о правильности
работы программы.
3.10 Программы для работы с массивами
Оператор DIM - основной оператор, который используется
для работы с массивами (упрощенное описание приведено
ранее).
Рассмотрим более полный формат этого оператора.
Оператор DIM для описания массивов
(DIMension – резервирование места )
Формат оператора:
DIM переменная [(индексы)] [AS тип][,переменная [(индексы)] [ AS тип ]
переменная - имя массива или простой переменной. Правила
написания имени массива такое же, как у простой переменной;
индексы -константы, переменные или арифметические
выражения, разделенные запятыми, максимальные значения
которых определяют величину массива, а число индексов размерность массива. Формат индексов:
[ начало TO] конец
начало и конец устанавливают нижнюю и верхнюю границы
индексов массива из диапазона ц е л ы х чисел: -32768 до
+32767. Если параметр начало не указан, то он равен нулю.
Параметр начало должен быть меньше параметра конец; тип
устанавливает тип элементов массива или простой переменной
(INTEGER, LONG, SINGLE, DOUBLE, STRING). Если параметр
тип не задан, то тип по умолчанию устанавливается SINGLE.
Назначение оператора: объявляет массивы или устанавливает
тип данных для простых переменных, например:
DIM A(50), B (10 TO 100) AS Double
- описан одномерный массив одинарной точности с именем А,
содержащий 51 элемент: А(0), А(1),...А(50); и двухмерный
массив с именем В, индексы которого меняются от 10 до
100.Оба массива двойной точности;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
