Основы программирования — Осенний семестр; Михалкович С.С.; 2008; II — различия между версиями
Admin (обсуждение | вклад) (→Условный оператор) |
Admin (обсуждение | вклад) (→Логические выражения) |
||
Строка 266: | Строка 266: | ||
* Даны координаты вершин треугольника и точка M. Принадлежит ли M треугольнику. | * Даны координаты вершин треугольника и точка M. Принадлежит ли M треугольнику. | ||
* Является ли 4-угольник ABCD корректно заданным. | * Является ли 4-угольник ABCD корректно заданным. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Побитовые операции === | === Побитовые операции === |
Версия 21:53, 1 сентября 2013
Содержание
Основные операторы
Оператор присваивания :=
<xh4> Синтаксис </xh4>
<переменная> := <выражение>
Пример использования оператора присваивания.
a := (3 + 5) * 8;
b := a + 2;
<xh4> Семанитика </xh4>
Вычисляется выражение в правой части, при этом, вместо имен переменных подставляются их значения.
Затем результат вычисления записывается в переменную в левой части.
Ограничение. Тип выражения должен быть совместим по присваиванию с переменной.
Например:
- одинаковые типы совместимы.
- выражение типа integer можно присвоить переменной типа real. Обратное неверно.
<xh4> Операторы присваивания += и *= </xh4> Пример.
d += 1; //прибавить 1 к d
d *= 2; //умножить d на 2
<xh4> Примеры использования := </xh4> Пример 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 за минимальное число умножений.
Об этом читай тему.
Оператор ввода
<xh4> Синтаксис </xh4>
read (<список переменных>) | readln (<список переменных>)
<xh4> Семантика </xh4> Происходит считывание данных с клавиатуры и запись их в переменные из <списка переменных>. Вводить данные нужно либо через пробел, либо по нажатию <Enter>, при этом программа не перейдет к выполнению следующего оператора, пока не будут считаны все данные.
Имеются также стандартные функции ReadInteger, ReadReal, ReadlnInteger, ReadlnReal:
var n := ReadInteger;
var r := ReadlnReal;
С процедурой ввода связан ряд ошибок времени выполнения (например, если переменная используется в качестве делителя, и вводится 0, или, если должно быть получено целое число, а вводится 'ABC'). Эти ошибки нужно уметь обрабатывать.
Оператор try/except и обработка ошибок ввода
Операторы, которые могут получать ошибку, заключаются специальный охранный блок - оператор try.
<xh4> Синтаксис </xh4>
try
...
readln(a);
...
except
<обработка ошибки>
end;
<продолжение работы>
<xh4> Семантика </xh4> Если внутри блока try происходит ошибка выполнения, то все последующие операторы в блоке игнорируются, и выполнение программы переходит к блоку except. По выходе из except программа продолжает работу.
Если ошибки не происходит, то выполняются все операторы в блоке try, блок except не выполняется, и программа продолжает работу.
Оператор вывода
<xh4> Синтаксис </xh4>
write(<список выражений>) | writeln(<список выражений>)
<xh4> Семантика </xh4>
Выражения в списке вычисляются, и их значения выводятся на экран.
В случае writeln после вывода осуществляется переход на новую строку.
<xh4> Форматы вывода </xh4>
После каждого выражения в списке вывода можно использовать формат вывода в виде :a, где a — выражение целого типа.
После вещественного типа — :a:b (a задает ширину поля вывода (выравнивание по правому краю), b — количество знаков в дробной части).
<xh4> Вывод с помощью write[ln]Format </xh4>
writelnFormat('<форматная строка>', <список выражений>)
Пример вывода с использованием форматной строки.
writelnFormat('{0} * {1} = {2}', a, b, a * b)
Будет выведено:
a * b = a * b
В форматной строке тоже можно использовать формат вывода.
{0, 10}: 10 — это ширина поля вывода
{0, 10:f3}: 3 — это количество знаков в дробной части для вещественного числа (показывает это спецификатор f).
Арифметические выражения
<xh4> Основные сведения </xh4>
Каждое выражение имеет тип. Выражение называется арифметическим, если его тип — числовой.
Выражение строится посредством операций (унарных или бинарных) и операндов.
В арифметических выражениях если a и b — одного типа, то и a op b принадлежит к тому же типу. Исключением является операция "/":
- a / b — вещественное.
Если a и b принадлежат к различным типам, то выражение принадлежит к "старшему" типу.
Например:
byte < integer < int64 integer < real
В арифметические выражения могут входить стандартные функции:
exp(x) ln(x) abs(x) // модуль x sin(x) cos(x) sqr(x) // квадрат x sqrt(x) // корень из x min(x,y) max(x,y) pow(x,y)// x в степени y
<xh4> Порядок выполнения операций в арифметических выражениях </xh4>
- Операции с большим приоритетом выполняются первыми
- Функции вычисляются до операций
- Выражение в скобках вычисляется раньше
- Операции с одинаковым приоритетом выполняются слева направо, если идут подряд.
<xh4> Операции div и mod для целых </xh4>
x div y = x / y, округленное до ближайшего целого по направлению к нулю. Это результат от целочисленного деления.
x mod y = x - (x div y) * y. Это остаток от целочисленного деления.
Пример использования
Целочисленные операции часто применяются для определения четности числа:
x mod 2 = 0 <-> x — четное x mod 2 <> 0 <-> x — нечетное
Условный оператор
<xh4> Синтаксис </xh4>
if <условие> then <оператор1> [else <оператор2>]
<xh4> Примеры использования для решения задач </xh4>
Пример 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. Вычисление функции по взаимоисключающим веткам
<math>y = \begin{cases} x, & x < 2 \\ x^2, & 2 < x < 3 \\ 1-x, & x \ge\; 3 \end{cases}</math>
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 корректно заданным.
Побитовые операции
<xh4> Побитовые операции and, or, xor, not </xh4> Замечание. Работают только с целыми.
Смысл такой — каждое целое переводится в двоичную систему счисления и производится побитовое применение этих операций.
Пример.
5 and 10
510 = 1012
710 = 1112
101 ( and ) 111 ——— 1012 = 510
<xh4> Операции shl и shr </xh4> Побитовый сдвиг влево и сдвиг вправо соответственно.
<xh4> shl </xh4>
x shl n = x * 2n
Сдвигает двоичное представление x на n позиций влево.
<xh4> shr </xh4>
x shr n = x div 2n
Сдвигает двоичное представление x на n позиций вправо.
<xh4> Примеры </xh4>
x = 510 = 1012 x shl 2 = <—(2)101 101002 = 2010 x shr 2 = 101—>(2) 0012 = 110
Таблица приоритетов операций языка Object Pascal
- унарные + - not
- имеющие смысл умножения * / div mod and shl shr
- имеющие смысл сложения + - or xor
- операции отношения <> <= >= < > in
Оператор case выбора варианта
<xh4> Синтакстис </xh4>
case <переключатель> of {<список выбора>: <оператор>;} [else <оператор>[;]] end
<xh4> Семантика </xh4>
Вначале вычисляется выражение-<переключатель>, после чего его значение ищется в одном из <списков выбора>.
Если значение попадает в какой-то <список выбора>, то выполняется соответствующий ему оператор, иначе, если есть ветвь else, то выполняется оператор по ветке else.
<xh4> Ограничения </xh4>
- выражение-переключатель должно иметь так называемый порядковый тип:
- целый
- символьный
- перечислимый
НО НЕ строковый или вещественный.
- значения в <списках выбора> не должны пересекаться.
<xh4> Примеры использования оператора выбора </xh4> Пример 1. День недели
case DayOfWeek of
1..5: writeln('Будний');
6, 7: writeln('Выходный');
else writeln('Ошибка');
end;
Пример 2. Цифра или буква
var c: char;
read(c);
case c of
'0'..'9': writeln('Цифра');
'A'..'Z', 'a'..'z', 'а'..'я', 'А'..'Я', 'ё', 'Ё': writeln('Буква');
end;