- •Алгоритмы
- •Свойства алгоритма
- •Способы описания алгоритмов
- •Язык программирования
- •Способы описания синтаксиса языка программирования
- •1. Бнф (Бэкуса-Наура форма)
- •Компиляторы и интерпретаторы
- •Обзор языков программирования высокого уровня (таблица)
- •Язык программирования Паскаль Первая программа на языке программирования Паскаль
- •Типы, переменные и константы
- •Основные типы данных языка Pascal
- •Операторы ввода/вывода
- •Форматы вывода
- •Выражения и операции Выражения
- •Операции
- •Операции div и mod для целых
- •Операции shl и shr для целых
- •Логические операции
- •Часто используемые правила математической логики
- •Стандартные процедуры и функции Стандартные функции
- •Стандартные функции в Dephi
- •Стандартные процедуры для целых
- •Явление переполнения
- •Погрешность округления и вычислительная погрешность
- •Примеры на суммирование рядов
- •Процедуры break и continue
- •Оператор безусловного перехода goto
- •Подпрограммы. Процедуры и функции
- •Процедуры
- •Синтаксис описания процедуры
- •Оператор вызова процедуры
- •Функции
- •Переменная Result
- •Способы передачи параметров Передача по значению. Параметры-значения
- •Передача по ссылке. Параметры-переменные (с ключевым словом var)
- •Семантика вызова подпрограммы
- •Алгоритм вызова подпрограммы
- •Статическая и автоматическая память
- •Локальные и глобальные переменные
- •Обращение к глобальным переменным и побочный эффект
- •Область видимости и время жизни объекта
- •Статическая локальная переменная
- •Перегрузка имен подпрограмм
- •Структура модуля
- •Перечислимый и диапазонный типы Перечислимый тип
- •Записи с вариантами
- •Как записи с вариантами хранятся в памяти
- •Сортировка массивов записей
- •Индексная сортировка
- •Множества
- •Стандартные подпрограммы для работы с символами
- •Виды строк в Delphi
- •Cтроки shortstring
- •Основные подпрограммы для работы со строками
- •Основные подпрограммы для работы со строками (Delphi)
- •Алгоритмы на строках
- •Использование Split
Стандартные процедуры для целых
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 вычисляются один раз до цикла.
Замечания.
Значение параметра цикла после выполнения цикла считается неопределенным.
В теле цикла нельзя изменять параметр цикла. Например:
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 операций "* "