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