Способы описания синтаксиса языка программирования
Алгоритмы
Определение. Алгоритм — описание последовательности действий для решения поставленной задачи. Близкие по смыслу слова: рецепт, метод, способ, процедура.
Свойства алгоритма
- Дискретность (алгоритм состоит из отдельных действий, следующих одно за другим).
- Элементарность действий (шаги не могут подразделяться на более мелкие шаги).
- Определенность действий (каждый шаг имеет ясную и однозначную трактовку).
- Конечность (завершимость).
- Результативность (после завершения алгоритма известно, что считать результатом).
- Массовость (алгоритм применим для множества наборов исходных данных).
Для алгоритма необходимо задать исполнителя, который умел бы выполнять некоторое множество элементарных действий. Все действия в алгоритме должны быть из этого множества. В качестве исполнителя может выступать человек, компьютер, робот и т.д. Для одной задачи может быть несколько алгоритмов.
Пример. Найти max из чисел x, y, z.
Алгоритм 1. (Словесное описание)
Если x>=y и x>=z, то положить max:=x и завершить алгоритм
Если y>=x и y>=z, то положить max:=y и завершить алгоритм
Если z>=x и z>=y, то положить max:=z и завершить алгоритм
Алгоритм 2. (Описание на псевдокоде)
max:=x
Если y>max то max:=y
Если z>max тоmax:=z
Определение. Два алгоритма называются эквивалентными, если множества допустимых исходных данных для них совпадают и применение этих алгоритмов к одинаковым исходным данным дает одинаковые результаты.
Способы описания алгоритмов
3. C помощью блок-схем.
Пример. (алгоритм 2, представленный блок-схемой)
Альтернативная современная нотация — диаграмма деятельности (Activity Diagram) в языке UML (Universal Modelling Language).
4. C помощью языка программирования.
Язык программирования
Язык программирования (ЯП) характеризуется используемым алфавитом, синтаксисом и семантикой. Элементарные действия в языке программирования называют инструкциями, операторами или командами.
Синтаксис ЯП определяет правила записи основных конструкций ЯП и устанавливает, какие фрагменты текста программы следует считать неделимыми (например, :=, = =
ограничители: ; , (
зарезервированные слова: begin end var
2) Идентификаторы (используются в качестве имен объектов программы).
Определение. Идентификатор — последовательность латинских букв или цифр, начинающаяся с буквы. К буквам также относят символ _ (подчеркивания).
_a1 — идентификатор
3dnews — не идентификатор
3) Константные значения
Раздел описаний
Любой объект в программе (переменная, константа, именованный тип, подпрограмма, метка) перед использованием должен быть описан в разделе описаний. Он состоит из разделов описания переменных, констант, типов, меток, подпрограмм, чередующихся в произвольном порядке.
Раздел описания переменных
var i,j: integer;
s: string;
b: boolean;
r1,r2: real;
c: char;
Раздел описания типов
type int = integer;
IArr = array [1..100] of real;
Оператор присваивания
Оператор присваивания имеет вид:
имя переменной := выражение
Пример 1. Вычислить x 16 .
Пример 2. Вычислить x 15 =(x 5 ) 3 .
Присваивание переменной некоторого начального значения называется инициализацией этой переменной.
Если переменной можно присвоить выражение, то говорят, что они совместимы по присваиванию. Переменная и выражение совместимы по присваиванию:
- если они имеют один тип;
- если переменная и выражение имеют целый тип (например, выражение имеет тип byte, а переменная — тип integer или наоборот);
- если выражение имеет целый, а переменная — вещественный тип;
- если выражение имеет символьный, а переменная — строковый тип.
Во всех случаях, кроме первого, происходит неявное преобразование типов, в процессе которого может меняться внутреннее представление данных. Заметим также, что при присваивании типа integer типу byte может произойти выход за границы диапазона меньшего типа byte.
var i: integer;
.
i:=2.0; // неверно!
Для преобразования вещественного в целое следует использовать функции round и trunc.
Операторы ввода/вывода
Оператор вызова процедуры ввода имеет одну из следующих форм:
read(список переменных);
readln(список переменных);
readln;
Оператор вызова процедуры вывода имеет одну из следующих форм:
write(список выражений);
writeln(список выражений);
writeln;
Для перехода на новую строку в процессе вывода можно использовать следующий прием:
const newline = #10;
.
writeln(x, newline, y);
Форматы вывода
Для любых типов:
write(x:а); // а — ширина поля вывода
Если число не помещается в указанные позиции, то формат игнорируется. Вещественные числа в этом формате выводятся в экспоненциальной форме.
Для вещественного типа:
write(x:а:b); // a — ширина поля вывода, b — количество цифр в дробной части
Вещественные числа в этом формате выводятся в виде с фиксированной точкой.
Неправильный формат вывода игнорируется. Например, если x=14.457, то после
будет выведено 14.46.
Выражения и операции
Выражения
Выражения — конструкции, задающие правила вычисления. Выражения состоят из операндов и операций. Для группировки в выражениях могут использоваться круглые скобки. В качестве операндов могут выступать также вызовы функций.
Каждое выражение имеет тип, зависящий от типов входящих в него операндов. Выражение называют арифметическим, если его значением является число. Выражение называют логическим, если его значение имеет логический тип.
Логическое выражение всегда имеет тип boolean.
Тип арифметического выражения определяется типом операнда «старшего» типа: если в выражении есть хотя бы один операнд типа real, то выражение имеет тип real, если нет операндов типа real, но есть операнды типа integer, то выражение имеет тип integer. Исключение составляет операция деления: результатом деления целого на целое является вещественное.
Не все типы совместимы в выражении: к примеру, нельзя сложить целое и строку, нельзя из строки вычесть символ.
При вычислениях выражений со смешанными типами также происходит неявное преобразование типов. Например, если i имеет тип integer, а bt — тип byte, то при вычислении выражения i+bt происходит вначале преобразование значения bt к «старшему» типу integer и только после этого выполняется операция сложения.
Операции
Операции в выражении вычисляются в порядке приоритетов: вначале операции с большим приоритетом, затем — с меньшим. Операции с одинаковым приоритетом вычисляются слева направо. Операции в скобках выполняются в первую очередь.
Таблица приоритетов операций языка Pascal
- + - (унарные)
- * / div mod shl shr and
- + -(бинарные)or xor
- = = <>in
2-1+3=(2-1)+3
4/2*2=(4/2)*2
4/2/2=(4/2)/2
1*2+3*4 — операции умножения вычисляются в непредсказуемом порядке.
Логические операции
Простые: x>0 или 2*2=4
Составные: состоят из простых + логические операции (and, or, not, xor)
(x>=3) and (x 5) = not ((x>=3) or (x B) and (A C) and (A x1) and (x y1) and (y x2) or (y y2);
OnTheBoundary:=not Inside and not Outside;
Стандартные функции
abs(x) | |x| |
sqr(x) | х^2 |
sqrt(x) | корень квадратный из х |
ln(x) | ln x |
exp(x) | е^х |
sin(x) | sin x |
cos(x) | cos x |
arctan(x) | arctan x |
int(x) | целая часть х (вещественный результат) |
trunc(x) | целая часть х (целый результат) |
frac(x) | дробная часть х (вещественный результат) |
round(x) | округление вещественного х (целый результат) |
Odd(i) | True, если i — нечетно, False в противном случае |
sizeof(n) | Размер значения выражения n в байтах. В качестве n может также использоваться имя типа |
Pi | возвращает число «пи» = 3.141592. |
Стандартные функции в Dephi
Требуется подключение модуля Math:uses Math;
power(x,y) | x^у |
arccos(x) | |
arcsin(x) | |
sec(x) | |
cosec(x) | |
tan(x) | |
DivMod(x,y,d,m) | d:=x div y; m:=x mod y; |
InRange(x,min,max) | min a then min:=a else min:=b; Пример. Упорядочить значения в a, b по возрастанию. if a>b then Составной оператор begin Необходимость составного оператора: составной оператор объединяет несколько операторов в один: if a>b then Пример. case Month of Циклы while, repeat и for Оператор цикла с предусловием (цикл ПОКА) while B do где оператор образует тело цикла, B является логическим выражением. Семантика оператора while задается следующей блок-схемой: Сравнение while и repeat
Оператор цикла с параметром for x:=x1 to x2 do for x:=x2 downto x1 do где переменная x называется параметром цикла, x1 и x2 – выражения совместимого с x типа. Важно! Выражения x1 и x2 вычисляются один раз до цикла.
for i:=1 to n do for i:=1 to n do for i:=1 to n do Определение. Инвариант цикла – это предикат, который истинен перед выполнением цикла и после каждой его итерации. Например, если находится сумма чисел, то инвариант цикла – сумма уже введенных чисел. Если находится минимум, то инвариант цикла: в min – минимальные из уже введенных. Инвариант цикла служит для доказательства правильности алгоритма. Зацикливание repeat while True do Примеры использования циклов Пример 1. Сумма n чисел. s:=0; Пример 2. Произведение n чисел. p:=1; Пример 3. n!!=n*(n-2)*(n-4)*. *2 (или 1) p:=1; Пример 4. Сколько нечетных среди 10 введенных. c:=0; Пример 5. Защита от неверного ввода. repeat Пример 6. Табулирование функции f(x) на отрезке [a,b] в точках, разбивающих [a,b] на N частей. assert(N>0); Пример 7. Вывод 10 первых степеней двойки. x:=10; Пример 8. Вывод всех двузначных чисел, кратных 5. x:=1; Пример 11. Найти НОД (А,В), где А,В — целые положительные. Алгоритм Евклида: НОД (А,В) = НОД (В, А mod B); НОД (А,0)=А read(A,B); Замечание. Доказательство того, что цикл завершится: С уменьшается на каждом шаге, оставаясь >=0. Пример 12. Найти max из N введенных чисел. Алгоритм 1. max:= первое введенное read(x); Алгоритм 2. max:= самое маленькое число (-MaxInt или -MaxDouble) for i:=1 to N do Пример 13. Разложение числа на простые множители. Алгоритм на псевдокоде цикл Алгоритм на Паскале read(x); Пример 14. Даны a0, . an, x Вычислить значение многочлена f(x)=a0x n +a1x n-1 +. +an в точке x. read(x); n+1 операций «+» и n+1 операций «* « Примеры на суммирование рядов x:=x0; Пример 15. Вычислить сумму x:=1; Если существует предел суммы Пример 16. Знакопеременный ряд z:=1; Пример 17. Вычислить сумму for i:=0 to n do Пример 18. Метод половинного деления Задача. Дана непрерывная на [a,b] функция f(x),имеющая на [a,b] ровно один корень (т.е. f(a)*f(b) eps do Метод окаймления «Заморозим» А и составим алгоритм при фиксированном А. for A:=2 to 10do Разморозим А и окаймим данный участок цикла по А от 2 до 10. Задача. Вывести все простые числа от 100 до 999. Переборные задачи Задача. Вывести все тройки целых положительных a, b, c 2 +b 2 =c 2 for a:=1 to 99 do Решение 1а. for a:=1 to 99 do Решение 1б. for a:=1 to 99 do Но! Нельзя заниматься преждевременной оптимизацией! Процедуры Пример. Составить процедуру вычисления среднего арифметического и среднего геометрического А и В. С ее помощью найти среднее арифметическое и среднее геометрическое пар A,B; A,C; B,C. procedure Mean(A,B: real; var MA,MG: real); var A,B,C: real; begin Оператор вызова процедуры имя[(список фактических параметров)] Количество и типы фактических параметров при вызове процедуры должны соответствовать количеству и типам формальных параметров. Функции Функция — это подпрограмма, возвращающая одно значение особым образом так, что это значение может быть непосредственно использовано в выражении. Пример. Функция function sign(x: real): integer; Для того, чтобы функция вернула значение необходимо в её теле имени функции присвоить некоторое значение. Имя функции в этом контексте ведет себя как обычная переменная, но имя функции нельзя использовать в правой части оператора присваивания в качестве значения этой переменной. vars,a: real; Для сравнения реализуем вычисление sign в виде процедуры. procedure CalcSign(x: real; varsign: integer); vara: real; begin Переменная Result В Delphi и FreePascal неявно определена переменная Result, присваивание которой равносильно и хранит результат функции. function Sum(n: integer): integer; Локальные переменные подпрограмм не инициализируются (место на программном стеке под них отводится при выделении памяти под запись активации), поэтому их явная инициализация обязательна. Способы передачи параметров Перегрузка имен подпрограмм Перегрузка имен подпрограмм имеется в Delphi, FreePascal и отсутствует в Turbo Pascal. В одном пространстве имен процедуры (функции) могут иметь одинаковые имена, если они имеют различные списки параметров. procedure swap(var a,b: integer); overload; Это явление называется полиморфизмом. Полиморфизм – использование одного имени (одного знака операции) для выполнения родственных действий. writeln(a,b) – полиморфная процедура: параметры различных типов. a+b – операция «+» используется для различных типов. Тонкости перегрузки procedure A(i: integer); overload; var b: byte; function f: integer; overload; Правило: тип возвращаемого значения не участвует в разрешении перегрузки. Параметры по умолчанию Параметры по умолчанию имеются в Delphi, FreePascal и отсутствуют в Turbo Pascal. procedure DoOperation(a,b: real; var res: real; op: char=’+’); Правило. Параметры по умолчанию всегда должны идти последними. Предварительное объявление подпрограмм procedure p(i: integer); forward; // Предварительное объявление. p будет определена далее procedure q; procedure p(i: integer); Методы разработки программ Шаг. x:=2; Источник |