В теоретической части изучения дисциплины Вас ознакомили с понятием циклов, циклических алгоритмов. Циклический алгоритм – алгоритм, предусматривающий многократное повторение одного и того же действия (одних и тех же операций) над новыми исходными данными. К циклическим алгоритмам сводится большинство методов вычислений, перебора вариантов.
Цикл программы – последовательность команд (серия, тело цикла), которая может выполняться многократно (для новых исходных данных) до удовлетворения некоторого условия.
Программную реализацию организации циклов с использованием IF..THEN продемонстрируем на достаточном количестве различных примеров. Самые “яркие” и популярные задачи – это задачи на суммирование, с них и начнем демонстрацию программ по организации циклов.
1.Найти сумму всех двузначных чисел. Программа может выглядеть, например, так.
…………………Программа 8.1…………………………………….
s = 0: n = 9
10 n = n + 1
if n < 100 then s = s + n: goto 10
?”Сумма двузначных чисел равна”; s
Проверка условия n<100 проводится ДО операции суммирования.
Обратите внимание на конструкции типа n = n + 1 и s = s + n. Они на первых порах трудно воспринимаются студентами т.к. с точки зрения математики они бессмысленны.
Составим эту же программу, организовав проверку условия “число двузначное” ПОСЛЕ операции суммирования.
…………………Программа 8.1.2…………………………………….
s = 0: n = 9
10 n = n + 1
s = s + n
if n < 100 then 10
?”Сумма двузначных чисел равна”; s
Одними из самых популярных задач являются задачи на суммирование по формуле с прекращением его по различным условиям.
Обратите внимание на “золотое правило” организации суммирования: s = 0
2.Найти сумму членов числовой последовательности с общим членом an = ,
используя различные варианты по завершению суммирования, например: 2.1 сумму k членов, 2.2 суммировать до тех пор, пока общий член не станет меньше заданного ε.
…………………Программа 8.2…………………………………….
s = 0: i = 0
input”Задайте точность ε”;e
10 i = i +1: a = i^3/(2^i + i)
if a > e then s = s + a: goto 10
?”Запишите сумму”;s
Переработайте программу и найдите сумму 50 членов числовой последовательности.
Как и прежде, и в дальнейшем подчеркиваем, что приводится один из возможных вариантов программы, рекомендуем и коллегам и студентам искать и обязательно находить другие варианты.
3.Аналогично организуются циклы по нахождению произведений. Пример: найти произведение 50 сомножителей числовой последовательности с общим членом: an =
…………………Программа 8.3…………………………………….
i = :0 p = 1: ‘******Золотое правило нахождения произведения**********
10 i = i + 1
p = p*(i + 1)/(i^2 + 3)
if < 50 then 10
?”Пишите искомое произведение”;p
В QB существуют и другие способы организации циклических программ. Наиболее удобной является конструкция DO…LOOP. Законспектируйте ее форматы.
DO WHILE <условие, при ВЫПОЛЕНИИ которого выполняется цикл>
<операторы, тело цикла>
LOOP
Обратите внимание, что выполняемое условие проверяется ДО операторов цикла. Возможна проверка ПОСЛЕ цикла:
DO
<операторы, тело цикла>
LOOP WHILE <условие, при ВЫПОЛЕНИИ которого выполняется цикл>
Иногда удобнее использовать конструкции “отрицания”, т.е. исполнение цикла происходит при НЕВЫПОЛНЕНИИ условия.
DO UNTIL <условие, при НЕВЫПОЛЕНИИ которого выполняется цикл>
<операторы, тело цикла>
LOOP
или
DO
<операторы, тело цикла>
LOOP UNTIL <условие, при НЕВЫПОЛЕНИИ которого выполняется цикл>
Приведем конкретные примеры.
4.Дано a и n. Вычислить сумму .
…………………Программа 8.4…………………………………….
LOCATE 10, 25: INPUT "Введите значение а "; a
LOCATE 12, 25: INPUT "Число слагаемых"; n
i = 0: s = 0
DO WHILE i < n
i = i + 1
s = s + 1 / a ^ i
LOOP
LOCATE 14, 25: PRINT "Запишите сумму"; s
5. Вывести на экран таблицу умножения по требованию.
…………………Программа 8.5…………………………………….
REM****Таблица умножения по требованию******
LOCATE 3, 4
INPUT "Введите число для распечатки таблицы умножения"; a
n = 0
DO WHILE n < 10
n = n + 1
PRINT TAB(10); a; "x"; n; "="; a * n
LOOP
Или так:
…………………Программа 8.5.1…………………………………….
LOCATE 3, 4
INPUT "Введите число для распечатки таблицы умножения"; a
n = 0
DO
n = n + 1
PRINT TAB(10); a; "x"; n; "="; a * n
LOOP WHILE n < 10
6.Вы знаете две знаменитые математические константы: число p и число e. Эйлер открыл число, названное его именем, так: это предел на бесконечности выражения
Составим программу вычисления числа Эйлера, выдавая результат через n, кратные 10000, чтобы убедиться, что такой предел действительно существует. Эта программа не имеет естественного окончания, потому выход из нее только через “аварийный” останов.
Один из вариантов программы.
…………………Программа 8.6…………………………………….
CLS : s# = 0: n = 0
10 n = n + 1: m# = LOG(n + 1)
s = s + 1 / n
IF n / 10000 = n \ 10000 THEN PRINT "при n="; n; "c= "; s# - m#
GOTO 10
В этой программе использовались переменные, имя которых оканчивается знаком #. Это признак переменной ДВОЙНОЙ точности, запустив программу, Вы в этом убедитесь.
8.Условия могут быть “вложенными”. Рассмотрим популярную задачу. Найти все числа в пределах 1000, делящиеся, например, на 73
…………………Программа 8.8………………………………….
10 IF i < 1000 THEN
i = i + 1
IF i MOD (73) = 0 THEN PRINT i
GOTO 10
END IF
Использовалась функция MOD. Конструкцию i MOD (73) = 0 можно описать так: остаток от деления числа i на 73 равен нулю.
9.Еще одна популярная задача. Найти все делители введенного пользователем числа.
…………………Программа 8.9………………………………….
LOCATE 2, 29: INPUT "Введите число"; n
10 IF i < n THEN
i = i + 1
IF n MOD (i) = 0 THEN PRINT TAB(10); i
GOTO 10
END IF
10.В заключение урока рассмотрим еще одну задачу на суммирование.
В операторе DATA заданы 10 целых, среди которых положительные и отрицательные, чисел. Найдите количество и суммы положительных и отрицательных чисел.
…………………Программа 8.10…………………………………….
DATA 1,-3,9,-4,7,8,-3,0,-4,2
k = 0:’****Это счетчик чтения чисел
kp = 0:’****Это счетчик числа положительных чисел
kо = 0:’****Это счетчик числа отрицательных чисел
sp = 0:’****Это сумма положительных чисел
so = 0:’****Это сумма отрицательных чисел
5 READ a: k = k + 1
IF a > 0 THEN kp = kp + 1: sp = sp + a
IF a < 0 THEN ko = ko + 1: so = so + a
IF k < 10 THEN 5
?”Сумма положительных чисел”;sp;”таковых”; kp
?”Сумма отрицательных чисел”;sо;” таковых”; kо
Вам предлагается интересное домашнее задание.
.Двое любителей азартных игр поочередно бросают по две игральных кости, первый поставил на сумму очков 7, второй – на 8. Игра продолжается бесконечно. Кто из них выиграет? Генерируя бросание костей случайными числами, зациклите программу и выдавайте результат в процентах для каждого игрока через каждые 1000 бросаний костей каждым игроком. Таким образом, Вы узнаете, что чаще выпадает в сумме 7 или 8.
Что нового Вы узнали и чему научились на занятии №8