

Программирование
циклических алгоритмов

Инструкция цикла с предусловием
false
true
while <лог. выражение> do begin
Пример: вычислить сумму
S = 1 + 1/2 + 1/3 +… + 1/100
<инструкции>
end;
s:=0; n:=1; while n<=100 do begin
s:=s+1/n;
n:=n+1; end;
2

Инструкция цикла с постусловием
true
false
Пример: вычислить сумму
S = 1 + 1/2 + 1/3 +… + 1/100
repeat
<инструкции>
until <лог. выражение>
s:=0; n:=1; repeat
s:=s+1/n;
n:=n+1; until n>100;
3

Инструкция цикла с параметром
for параметр:=нач_знач downto кон_знач do begin
<инструкции>
end;
Пример: |
s:=0; |
|
вычислить сумму |
||
S=1 + 1/2 + 1/3 +… + 1/100 |
for n:=1 to 100 do |
|
begin |
||
|
||
|
s:=s+1/n; |
|
|
end; |
4

Сравнение циклов разных типов
While |
Repeat |
For |
универсальный |
всегда выполняется хотя |
пригоден только при |
|
бы один раз |
заданном числе |
|
|
повторений |
требует инициализации |
требует инициализации |
автоматически |
и изменения |
и изменения |
инициализирует и |
управляющих |
управляющих |
изменяет управляющую |
переменных |
переменных |
переменную |
может приводить к |
может приводить к |
зацикливание |
зацикливанию |
зацикливанию |
исключено |
5

Простейшие вычислительные методы: вычисление площадей
Один из часто встречающихся классов задач в математике – вычисление площадей различных фигур. Для простых фигур (прямоугольник, треугольник, круг) есть простые формулы.
Для более сложных используется определенный интеграл. Однако этими методами охватываются далеко не все случаи, встречающиеся на практике.
Более широкий класс задач решается с помощью приближенных методов.
Рассмотрим некоторые из них.
6

Метод прямоугольников
Задача:
найти приближенно площадь
фигуры, ограниченной осью абсцисс и кривой y = f(x) на промежутке [a;b].
|
a |
b |
w:=(b-a)/n; |
{вычисляем ширину полоски} |
|
s:=0; |
{переменная для накопления площади} |
|
x:=a+w/2; |
{начальное значение х} |
|
while x < b do |
|
|
{продолжаем вычисление, пока не дошли до конца отрезка } |
||
begin |
|
|
s:=s+w*f(x); {добавляем к s площадь очередной полоски} |
|
|
x:=x+w; |
{переходим к следующей полоске} |
|
end; |
|
|
7

Метод Монте-Карло
|
|
|
|
|
|
|
|
|
|
Задача: |
|
|
|
|
|
|
|
||
найти приближенно площадь фигуры, |
|
|
|
|
|
||||
ограниченной осью абсцисс и кривой y = f(x) |
|
|
|||||||
на промежутке [a;b]. |
|
|
|
|
|
|
|
||
|
|
|
|
Sфигуры |
|
k |
|
|
|
|
|
|
|
Sпрямоуг |
n |
|
|
||
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
|
|
|||
|
|
k:=0; |
{количество точек, попавших в фигуру} |
||||||
|
|
for i:=1 to n do |
{моделируем n бросаний } |
||||||
|
|
begin |
|
|
|
|
|
|
|
|
|
x:=random*(b-a)+a; {случайная координата x} |
|||||||
|
|
y:=random*h; |
|
{случайная координата y} |
|||||
|
|
||||||||
|
|
||||||||
|
|
if y<=f(x) |
|
{если точка попала в фигуру} |
then k:=k+1;
end;
s:=(b-a)*h*k/n;{площадь прямоугольника (b-a)*h умножаем на число попавших в фигуру точек и делим на общее число точек }
h
b
8

Решение уравнений методом деления пополам
Задача:
найти приближенно корень уравнения f(x) =0 на промежутке [a;b] с заданной точностью e.
Метод работает только в том случае, |
|
|
|
|
|
|
|
|
|
a |
|
|
|
|
b |
||||
если на указанном промежутке |
|
|
|
|
|
|
|
|
|
уравнение имеет ровно один |
|
|
|
|
|
|
|
|
|
корень! |
|
|
|
|
|
|
|
|
|
while b-a > e do |
{продолжаем вычисление до нужной точности } |
|
|
||||||
begin |
|
|
|
|
|
|
|
|
|
c:=(a+b)/2; |
{середина промежутка [a,b]} |
|
|
||||||
if f(a)*f(c)<0 |
|
|
|
|
|
|
|
|
|
then b:=c |
|
|
|
|
|
|
|
|
|
else a:=c; |
|
|
|
|
|
|
|
|
|
end;
x:=(a+b)/2;
9