Рассмотрим задачу, в которой требуется написать программу приближенного вычисления суммы:
1 + х/1! + х2/2! + х3/3! + …
с точностью Е.
Считается, что нужное приближение получено с заданной точностью е (эпсилон), если вычислена сумма нескольких первых слагаемых, и очередное слагаемое оказалось по модулю меньше, чем данное малое положительное число Е. Тогда считается, что это и все последующие слагаемые можно уже не учитывать. На каждом следующем шаге цикла будем максимально использовать сделанное нами на предыдущих шагах. Если уже получено хi-1/(i-l)!, то для вычисления xi/i! достаточно умножить предыдущий результат на x/i.
Блок-схема алгоритма решения задачи приведена на рис. 7.2.
Рис. 7.2. Блок-схема алгоритма приближенного вычисления суммы ряда (пример 7.1)
Пример 7.1. Приближенное вычисление суммы бесконечно убывающего ряда
Program Summer2; var Eps:real; { Заданное число "эпсилон"} X:real; { Основание степени в числителе дроби} S:real; { В этой переменной будем накапливать сумму } Y: real; { Для хранения очередного слагаемого } i:integer; { Счетчик числа шагов } begin write('Введите X и Epsilon:'); readln(X. Eps); Y:=l; { Первое слагаемое } S:=Y; {Положим в сумматор первое слагаемое } i :=0;{ Обнулим счетчик шагов } while abs(Y)>=Eps do { Пока добавленное слагаемое не меньше "эпсилон", считаем сумму. Если "эпсилон" сразу не меньше 1, цикл, не выполнится ни разу! } begin { Началось тело цикла } i:=i+1; { Вычислили номер текущего шага } Y:=Y*X/i; { Посчитали новое слагаемое } S:=S+Y { Увеличили сумму на текущее слагаемое } end; { Тело цикла завершилось. После этой строки компьютер перейдет на оператор while для сравнения переменной "эпсилон" с только что добавленным слагаемым } { Теперь выведем результат на экран } Writeln ('Суммачисел=', S:6:4); readln end.
Задание 7.1. Вычислить сумму ряда: 1/12+ 1/32+ 1/52+ 1/72+ …
Вычисления прекращаются по тому же условию, что и в примере 7.1. Полученная сумма должна быть близка к числу п2/8.
Возведение числа в указанную целую степень
Рассмотрим задачу: возвести число а, введенное с клавиатуры, в степень n. Задачу будем выполнять за n + 1 шаг. Например, возведем число 2 в степень 3 (23):
Пример 7.2. Возведение числа а, введенного с клавиатуры, в степеньn
Program Stp; var Р: real; { Переменная, которая хранит результат очередного шага } N: integer; { Показатель степени } i: integer; { Счетчик числа шагов } A.: real; { Основание степени } begin write('Введите основание степени:'); readln(A); write('Введите показатель степени:'); readln(N); i :=0; { 0-й шаг } Р:=1; { 20=1 } while i<abs(N) do {.Показатель может быть отрицательным, поэтому используем для анализа его абсолютную .величину. Если показатель N=0, то в тело цикла не попадаем ни разу, так как 0-й шаг уже сделан } begin i:=i+l; { Увеличиваемi на 1, то есть i теперь равно номеру текущего шага } Р:=Р*А { Получаем результат i-го шага} end; { В переменной Р на данный момент получен результат для положительного N } if N<0 then { Если показатель N - отрицательный, } Р:=1/Р; {то результат должен иметь обратную величину } writeln ('Результат=',Р:6:3); readln end.
Задание 7.2. Используя цикл с предусловием, написать программу вычисления N!.
Задание 7.3. Выполните задачу из предыдущей темы (задание 6.8), но используйте для этого цикл с предусловием. Блок-схема алгоритма вывода звездочек в верхней (2-й) строке с 3-го столбца (координата х) до 75-го столбца приведена на рис. 7.3. Продолжите блок-схему. Будьте внимательны с условиями!
Рис. 7.3. Блок-схема алгоритма вывода звездочек во 2-й строке экрана с 3-й по 75-ю позицию
Обратите внимание: нам понадобилось самим устанавливать значение х до входа в цикл и увеличивать х на 1 в теле цикла! В цикле со счетчиком это все делалось за нас в самой конструкции цикла.
Задание 7.4. Измените в задании 7.3 в теле цикла шаг счетчика, сделав его равным 3.
Задание 7.5. Проведите звездочки по диагонали из нижнего левого угла в верхний правый. Сначала заполните блок-схему алгоритма (рис. 7.4).
Рис. 7.4. «Слепая» блок-схема алгоритма вывода звездочек по диагонали из левого нижнего в правый верхний угол
Пояснение: координата хизменяется быстрее, чем у,, поскольку экран прямоугольный.
Задание 7.6. Выведите в центр экрана с задержкой друг относительно друга следующие числа: 1,2,4,8,16, 32,64,128,256. Вероятно, вы поняли, что это степени числа 2. Заполните блок-схему алгоритма (рис. 7.5), затем напишите программу.
Рис. 7.5. «Слепая» блок-схема алгоритма вывода в центр экрана степеней числа 2 с временной задержкой
Задание 7.7. Введите два числа (например, А = 5 и В = 8) и найдите их произведение, используя только операцию сложения. Заполните блок-схему алгоритма (рис. 7.6).
Рис 7.6. «Слепая» блок-схема алгоритма вычисления произведения двух чисел с использованием только операции сложения.
Задание 7.8. Введите два числа (например, А = 45 и В = 8) и найдите частное от деления нацело первого числа на второе (А на В) (в переменной к) и остаток от деления нацело (в переменной А), используя только операцию вычитания. Заполните блок-схему алгоритма (рис. 7.7).
Рис. 7.7. «Слепая» блок-схема алгоритма вычисления целого частного и остатка от деления одного числа на другое с использованием только операции вычитания
Пояснение: в переменной к подсчитывайте, СКОЛЬКО раз сделана операция вычитания, то есть СКОЛЬКО раз число В содержится в числе А.