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

Стандартные процедуры для целых

Inc(x)

x:=x+1

Dec(x)

x:=x-1

Inc(x,n)

x:=x+n

Dec(x,n)

x:=x-n

Явление переполнения

Пример.

var x: real; begin   x:=MaxDouble;   x:=x*2;  // ошибка времени выполнения

Для избежания ошибки переполнения можно воспользоваться директивами процессора {$Q-}, {$Q+}:

var i: integer; begin   i:=MaxInt; {$Q-} // отключение контроля за переполнением   i:=i+1; {$Q+} // включение контроля за переполнением

Погрешность округления и вычислительная погрешность

1.7E8, где после семерки идут еще 15-16 значащих цифр, называемые погрешностью округления.

Вещественные числа представляются в памяти компьютера не точно, а приближенно. Погрешность представления вещественных типов в памяти компьютера называется погрешностью округления. Значения типа real хранят 15-16 значащих цифр, поэтому, например, для числа 1.7 погрешность округления составляет около 1E-16.

При вычислениях погрешность округления может накапливаться; такая погрешность называется вычислительной.

Пример.

x:=0.9-3*0.3 // выведется число 1.11Е-16 x:=(0.9-3*0.3)*1E16 // выведется число 1.11 (вычислительная погрешность)

Правило. Ввиду погрешности округления вещественные числа обычно не сравнивают на равенство.

Неверно:

var x,y: real; ... if x=y then ... // неверно!

Верно:

eps:=1E-14; if abs(x-y)<eps then ...

В Delphi:

if SameValue(x,y,eps) then ...

Условный оператор

if логическое выражение then оператор1 [else оператор2]

Семантика оператора if задается следующей блок-схемой:

Пример. Hайти min из a, b.

if b>a then   min:=a else   min:=b;

Пример. Упорядочить значения в a, b по возрастанию.

if a>b then   поменять значения местами

Составной оператор

begin   операторы end

Необходимость составного оператора: составной оператор объединяет несколько операторов в один:

Пример.

if a>b then begin   v:=a;   a:=b;   b:=v; end;

Вложенные условные операторы

В качестве оператора по ветви if или else может быть другой условный оператор.

Пример. Дано x. Найти y, равное 2*x, при x>3, -x, при 1<x<=3 и x*x, при x<1.

if x>3 then   y:=2*x else if x>1 then   y:=-x else   y:=x*x;

Правило. еlse относится к ближайшему одинокому if.

if B then   if C then     A1   else A2

Оператор выбора варианта

case перeключатель of список выбора1: оператор1; список выбора2: оператор2; ... список выбораN: операторN; else оператор0; end

Списки выбора не должны перекрываться и должны иметь тип, совпадающий с типом выражения-переключателя.

Примечание. Пeреключатель должен быть выражением целого, символьного или перечислимого типа.

Пример.

case DayOfWeek of 1..5: writeln('Будний'); 6,7: writeln('Выходной'); else writeln('Ошибка'); end;

Пример.

case Month of 4,6,9,11: DayInMonth:=30; 2: DayInMonth:=28; else DayInMonth:=31; end.

Циклы while, repeat и for

Оператор цикла с предусловием (цикл ПОКА)

while B do   оператор

где оператор образует тело цикла, B является логическим выражением.

Семантика оператора while задается следующей блок-схемой:

Оператор цикла с постусловием (цикл ДО)

repeat   операторы until B

где операторы образуют тело цикла, B является логическим выражением.

Семантика оператора repeat задается следующей блок-схемой:

Сравнение while и repeat

  • Тело repeat выполняется по крайней мере 1 раз

  • Условия продолжения цикла в while и repeat противоположны

  • В repeat можно записывать несколько операторов без использования begin/end

Оператор цикла с параметром

for x:=x1 to x2 do   оператор

или

for x:=x2 downto x1 do   оператор

где переменная x называется параметром цикла, x1 и x2 – выражения совместимого с x типа.

Важно! Выражения x1 и x2 вычисляются один раз до цикла.

Замечания.

  1. Значение параметра цикла после выполнения цикла считается неопределенным.

  2. В теле цикла нельзя изменять параметр цикла. Например:

for i:=1 to n do   i:=i-1; // ошибка!

for i:=1 to n do   read(i); // ошибка!

for i:=1 to n do   for i:=1 to m do // ошибка!

Определение. Инвариант цикла – это предикат, который истинен перед выполнением цикла и после каждой его итерации. Например, если находится сумма чисел, то инвариант цикла – сумма уже введенных чисел. Если находится минимум, то инвариант цикла: в min – минимальные из уже введенных. Инвариант цикла служит для доказательства правильности алгоритма.

Моделирование цикла for с помощью цикла while

for x:=x1 to x2 do   оператор

эквивалентно

x:=x1; while x<=x2 do begin   оператор   x:=x+1; end;

Моделирование цикла repeat с помощью цикла while

repeat   S until B;

эквивалентно

S; while not B do   S;

Зацикливание

repeat   write(i); until False;

или

while True do   write(i);

Примеры использования циклов

Пример 1. Сумма n чисел.

s:=0; for i:=1 to n do   s:=s+xi

Пример 2. Произведение n чисел.

p:=1; for i:=1 to n do   p:=p*xi

Пример 3. n!!=n*(n-2)*(n-4)*...*2 (или 1)

p:=1; x:=n; while x>=2 do begin   p:=p*x;   x:=x-2; end;

Пример 4. Сколько нечетных среди 10 введенных.

c:=0; for i:=1 to n do begin   read(x);   if x mod 2 <> 0 then     c:=c+1; // if Odd(x) then Inc(c); // вариант end;

Пример 5. Защита от неверного ввода.

repeat   write('Введите x (>0): ');   readln(x);   if x<=0 then     writeln('Неверный ввод'); until x>0;

Пример 6. Табулирование функции f(x) на отрезке [a,b] в точках, разбивающих [a,b] на N частей.

assert(N>0); h:=(b-a)/N; x:=a; for i:=0 to N do begin   writeln(x:5:2, f(x):10:4);   x:=x+h; end;

Пример 7. Вывод 10 первых степеней двойки.

x:=10; for i:=1 to 10 do begin   writeln(i:2,x:5);   x:=x*2; end;

Пример 8. Вывод всех двузначных чисел, кратных 5.

x:=1; while x<100 do begin   write(x:3);   x:=x+5; end;

Пример 9. Вывести n первых чисел Фибоначчи. Числа Фибоначчи определяются следующим образом:

a:=1; b:=1; write(1,' ',1,' '); for i:=3 to n do begin   c:=a+b;   write(c,' ');   a:=b;   b:=c; end;

Пример 10. Найти сумму цифр целого положительного числа.

read(m); S:=0; while m>0 do begin   S:=S + m mod 10;   m:=m div 10; end;

Пример 11. Найти НОД (А,В), где А,В - целые положительные.

Алгоритм Евклида: НОД (А,В) = НОД (В, А mod B);  НОД (А,0)=А

read(A,B); repeat   C:=A mod B;   A:=B;   B:=C until C=0; NOD:=A;

Замечание. Доказательство того, что цикл завершится: С уменьшается на каждом шаге, оставаясь >=0.

Пример 12. Найти max из N введенных чисел.

Алгоритм 1. max:= первое введенное

read(x); max:=x; // Инвариант I: max = максимальное из всех введенных for i:=2 to N do begin   read(x);   if max:=x then     max:=x   // I выполняется end;

Алгоритм 2. max:= самое маленькое число (-MaxInt или -MaxDouble)

for i:=1 to N do   ...

Пример 13. Разложение числа на простые множители.

Алгоритм на псевдокоде

цикл   если х делится на i, то   {     вывод i     x:=x/i   }   иначе увеличить i на 1 до х=1

Алгоритм на Паскале

read(x); assert(x>1); i:=2; repeat   if x mod i = 0 then   begin     write(i,' ');     x:=x div i;   end   else Inc(i); until x=1;

Пример 14. Даны a0, ..., an, x  Вычислить значение многочлена f(x)=a0xn+a1xn-1+...+an в точке x.

Схема Горнера: f(x)=(...((a0x+a1)x+a2)x+a3...)x+an

read(x); S:=0; for i:=0 to n do begin   read(a);   S:=S*x+a; end;

n+1 операций "+" и n+1 операций "* "

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