Лекция 1 Правила записи программ на Object Pascal
Переменные и их описание
Основные сведения
Переменная — это ячейка памяти компьютера, имеющая имя и тип.
Тип определяет размер переменной и множество принимаемых ею значений.
В языке Pascal любая переменная перед использованием должна быть описана. Обычно переменные описываются в разделе описаний.
Синтаксис в виде РБНФ
<программа> ::= [program <имя>;]
<раздел описаний>
begin
<операторы>
end.
<операторы> ::= <оператор>{; <оператор>}
<раздел описаний> ::= {<секция раздела описаний>}
<секция раздела описаний> ::= <секция описания переменных> | <с.о. констант> | <с.о. типов> | <с.о. подпрограмм>...
Пример секции описания переменных.
var
a,b: real;
i: integer;
<секция описания переменных> ::= var<подсекция>{< подсекция>}
<подсекция> ::= <список имен>: <тип>;
<список имен> ::= <имя>{,<имя>}
<тип> ::= <имя>
Внутриблочные переменные
В PascalABC.NET возможно внутриблочное описание переменных:
begin
var i,j: integer;
var r: real := 5.2;
var Pi := 3.14;
В последнем случае происходит автоопределение типов.
Типы
Целые
integer (4 байта)
shortint (1 байт)
smallint (2 байт)
int64 (8 байт)
Вещественные
real (8 байт)
single (4 байт)
Символьные
char (2 — Unicode)
Строковые
string
string[200]
shortstring = string[255]
Логический
boolean (1) [True False]
Лекция 3 Основные операторы
Оператор присваивания :=
Синтаксис <переменная> := <выражение>
Пример использования оператора присваивания.
a := (3 + 5) * 8;
b := a + 2;
Семанитика
Вычисляется выражение в правой части, при этом, вместо имен переменных подставляются их значения. Затем результат вычисления записывается в переменную в левой части.
Ограничение. Тип выражения должен быть совместим по присваиванию с переменной. Например:
одинаковые типы совместимы.
выражение типа integer можно присвоить переменной типа real. Обратное неверно.
Операторы присваивания += и *=
Пример.
d += 1; //прибавить 1 к d
d *= 2; //умножить d на 2
Примеры использования :=
Пример 1. Перемена местами двух значений. Дано: x, y;
var x, y: integer;
begin
read(x,y);
var v := x;
x := y;
y := v;
writeln(x, ' ', y);
end.
Это стандартное решение. В PascalABC.NET на основе этого алгоритма определена стандартная процедура Swap(x, y).
Однако, существуют и другие решения. Например:
var x, y: integer;
begin
read(x, y);
x := x + y;
y := x - y;
x := x - y;
writeln (x, ' ', y);
end.
Пример 2. Использование промежуточных переменных в вычислениях Дано: x: real; Найти: x15;
Решение 1.
y := x * x;
z := y * y;
t := z * z;
p := t * z;
q := p * x * y;
Решение 2.
y := x * x;
z := y * x;
t := z * y;
p := t * t * t;
Решение 3.
y := x * x;
x := x * y * y;
t := x * x * x;
Заметим, что в первом решении используется 6 операций умножения, в во 2м и 3м — 5. Возникает задача: найти xn за минимальное число умножений. Об этом читай тему.
Оператор ввода
Синтаксис read (<список переменных>) | readln (<список переменных>)
Семантика
Происходит считывание данных с клавиатуры и запись их в переменные из <списка переменных>. Вводить данные нужно либо через пробел, либо по нажатию <Enter>, при этом программа не перейдет к выполнению следующего оператора, пока не будут считаны все данные.
С процедурой ввода связан ряд ошибок (например, если переменная используется в качестве делителя, и вводится 0, или, если должно быть получено целое число, а вводится 'ABC'). Эти ошибки нужно уметь обрабатывать.
Оператор try/except и обработка ошибок ввода
Операторы, которые могут получать ошибку, заключаются специальный охранный блок - оператор try.
Синтаксис
try
...
readln(a);
...
except
<обработка ошибки>
end;
<продолжение работы>
Семантика
Если внутри блока try происходит ошибка выполнения, то все последующие операторы в блоке игнорируются, и выполнение программы переходит к блоку except. По выходе из except программа продолжает работу.
Если ошибки не происходит, то выполняются все операторы в блоке try, блок except не выполняется, и программа продолжает работу.
Оператор вывода
Синтаксис
write(<список выражений>) | writeln(<список выражений>)
Семантика
Выражения в списке вычисляются, и их значения выводятся на экран. В случае writeln после вывода осуществляется переход на новую строку.
Форматы вывода
После каждого выражения в списке вывода можно использовать формат вывода в виде :a, где a — выражение целого типа. После вещественного типа — :a:b (a задает ширину поля вывода (выравнивание по правому краю), b — количество знаков в дробной части).
Вывод с помощью write[ln]Format
writelnFormat('<форматная строка>', <список выражений>)
Пример вывода с использованием форматной строки.
writelnFormat('{0} * {1} = {2}', a, b, a * b)
Будет выведено:
a * b = a * b
В форматной строке тоже можно использовать формат вывода. {0, 10}: 10 — это ширина поля вывода {0, 10:f3}: 3 — это количество знаков в дробной части для вещественного числа (показывает это спецификатор f).
Условный оператор
Синтаксис
if <условие> then <оператор1>
[else <оператор2>]
Семантика
Примеры использования для решения задач
Пример 1. Нахождение минимума Дано: x, y; Найти: min;
if x > y then
min := y
else
min := x;
Пример 2. Упорядочение a, b по возрастанию. Ясно, что если a > b, — нужно поменять их местами. Но тут одним оператором не обойтись. Для этого можно использовать составной оператор — один или больше операторов, заключенных в операторные скобки begin - end;:
if a > b then
begin
var v := b;
b := a;
a := v;
end;
Пример 3. Вычисление функции по взаимоисключающим веткам
if x < 2 then
y := x
else
if x < 3 then
y := x * x
else
y := 1 - x;
Замечание. Если по ветви else располагается другой оператор if, то говорят, что возникает цепочка вложенных операторов if.
Пример 4. Найти среднее среди a, b, c (a, b, c попарно не равны) Эта задача имеет несколько вариантов решения.
if a < b then
if a < c then
if b < c then
sr := b
else
sr := c
else
sr := a
else
if a > c then
if b > c then
sr := b
else
sr := c
else sr := a;
Очевидно, это не самое лучшее решение. Можно воспользоваться стандартными функциями сравнения.
sr := min(a,b);
if sr < c then
sr := min(max(a,b), c);
Самостоятельно.
Даны координаты вершин треугольника и точка M. Принадлежит ли M треугольнику.
Является ли 4-угольник ABCD корректно заданным.