Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmy.doc
Скачиваний:
3
Добавлен:
27.04.2019
Размер:
550.91 Кб
Скачать

Примеры на суммирование рядов

Если xi = f(xi-1), то

x:=x0; S:=x; for i:=2 to n do begin  x:=f(x);  S:=S+x end;

Пример 15. Вычислить сумму

x:=1; S:=x; for i:=2 to n do begin  x:=x*y/i;  S:=S+x; end;

Если существует предел суммы

Пример 16. Знакопеременный ряд xi = xi-1 + 0.1 zi=(-1)i zi=-zi-1

z:=1; s:=0; x:=1;    // эта часть может меняться for i:=0 to n do begin   s:=s+z*x;   x:=x+0.1;    // эта часть может меняться   z:=-z; end;

Пример 17. Вычислить сумму

xi=xi-1*y*(i-1)/i - неэффективно.

Лучше pi=yi,   pi=pi-1*y

Код программы.

for i:=0 to n do begin   p:=p*y;   s:=s+p/i; end;

Пример 18. Метод половинного деления

Задача. Дана непрерывная на [a,b] функция f(x),имеющая на [a,b] ровно один корень (т.е. f(a)*f(b)<=0). Найти его с точностью eps.

Алгоритм.

fa:=f(a); fb:=f(b); while b-a>eps do begin  x:=(b+a)/2;   fx:=f(x);   if fa*fx<=0 then // корень расположен на (a,x]    begin     b:=x;     fb:=fx   end   else   begin     a:=x;     fa:=fx   end; end; writeln('корень=', (b+a)/2);

Процедуры break и continue

Задача. Есть ли среди введенных 10 чисел число К?

Решение. Способ 1.

flag:=false; for i:=1 to 10 do begin   read(x);   if x=k then     flag:=True end; write(flag);

Недостаток: после того как flag получит значение True, он уже не поменяется, поэтому дальнейшее выполнение цикла бесполезно.

Для решения подобных проблем используются специальные процедуры, меняющие порядок выполнения операторов: break и continue.

Вызов процедуры break завершает цикл досрочно.

Вызов процедуры continue досрочно завершает текущую итерацию цикла.

Процедуры break и continue могут вызываться только в цикле.

Мнение автора. Позволю себе заметить, что решение назвать break и continue процедурами мне не нравится. В C, Java это - операторы, как и goto. И правильно: обычная процедура не может менять порядок выполнения операторов: это удел синтаксических конструкций (операторов).

Решение. Способ 2.

flag:=false; for i:=1 to 10 do begin   read(x);   if x=k then   begin     flag:=True;     break;   end; end; write(flag);

Приведем другие примеры использования процедур break и continue.

Пример 1. Является ли число N простым?

IsSimple:=True; for i:=2 to round(sqrt(N)) do   if N mod i=0 then   begin     IsSimple:=false;     break;   end;

Пример 2. Вводятся ненулевые числа, конец ввода - 0. Найти сумму и произведение положительных.

S:=0; P:=1; repeat   read(x);   if x=0 then break;   if x<0 then continue;   S:=S+x;   P:=P*x; until False;

Всегда можно обойтись без break или continue, введя дополнительные логические переменные.

while B do begin   S1   if B1 then break   S2 end;

Так выглядит программа без break:

B1:=false; while B and not B1 do begin   S1;   if not B1 then     S2 end;

Вложенные циклы

Цикл, вызываемый в другом цикле, называется вложенным.

Задача. Вывести таблицу значений Аk, где А=2..10.

Метод окаймления

"Заморозим" А и составим алгоритм при фиксированном А.

for A:=2 to 10 do begin   p:=1;   for i:=1 to k do     p:=p*A;   writeln(p); end.

Разморозим А и окаймим данный участок цикла по А от 2 до 10.

Задача. Вывести все простые числа от 100 до 999.

Метод последовательной детализации

x:=101; while x<999 do begin    Если x-простое, то       вывести x            x:=x+2 end.

Следующим шагом детализируем действие "x-простое".

Переборные задачи

Задача. Вывести все тройки целых положительных a, b, c <100: a2+b2=c2 Решение 1. (В лоб)

for a:=1 to 99 do for b:=1 to 99 do for c:=1 to 99 do   if a*a+b*b=c*c then     writeln(a:3;b:3;c:3)

Решение 1а.

for a:=1 to 99 do for b:=a+1 to 99 do for c:=b+1 to 99 do   if a*a+b*b=c*c tnen     writeln(a:3;b:3;c:3)

Решение 1б.

for a:=1 to 99 do for b:=a+1 to 99 do   c:=round(sqrt(a*a+b*b));   if a*a+b*b=c*c tnen     writeln(a:3;b:3;c:3)

Но! Нельзя заниматься преждевременной оптимизацией!

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]