Операции целочисленной арифметики

ДАННЫЕ

 

Все данные, в зависимости от способа их хранения и обработки, можно разделить на две группы: константы и переменные.

Константами называются элементы данных, значения которых установлены в описательной части программы и в процессе выполнения программы они не изменяются.

Формат описания констант:

Const

идентификатор=значение;

Стандартные виды констант

1. Целочисленные – определяются посредством чисел, записанных в десятичном или шестнадцатеричном формате, не содержащих десятичной точки.

2. Вещественные – определяются посредством чисел, записанных в десятичном формате данных.

3. Символьные – это любой символ персонального компьютера, заключенный в апострофы.

4. Строковые – определяются последовательностью произвольных символов, заключенных в апострофы.

5. Логические – это либо False, либо True.

6. Типизированные – это переменные с начальным значением. Каждой типизированной константе ставится в соответствие имя, тип и начальное значение.

Описание типизированных констант:

Const

идентификатор:тип=значение;

7. Зарезервированные константы:

Идентификатор Тип Значение Описание
Pi Real 3.1415926536 Число
True Boolean True Истина
False Boolean False Ложь
Maxint Integer Максимальное целое число

Пример:

Const

A=2; {целая}

B=2.35; {вещественная}

St=’g’; {символьная}

R=’ПРИВЕТ !’; {строковая}

Year:Integer=2005; {типизированная}

Переменные в отличие от констант могут менять свои значения в процессе выполнения программы. Каждая константа и переменная принадлежат к определенному типу данных. Тип констант автоматически распознается компилятором без предварительного описания. Тип переменной должен быть описан перед тем, как с переменными будут выполняться какие-либо действия.

Формат описания переменных:

Var

идентификатор:тип;

 

Типы данных

 

Тип – это множество значений, которые могут принимать объекты программы, и совокупность операций, допустимых над этими значениями.

Типы Скалярные Стандартные Целые

Определенные Вещественные

пользователем Логический

Структурированные Массивы Символьный

Указатели Записи Перечисляемый

Процедурные Множества Тип-диапазон

Объекты Файлы

Строки

 

Целые типы. Диапазон возможных значений целых типов зависит от их внутреннего представления.

Тип Название Длина, байт Диапазон значений
Byte Длиной в байт 0..255
ShortInt Короткое целое -128..127
Word Длиной в слово 0..65535
Integer Целое -32768..32767
LongInt Длинное целое -2147483648.. 2147483647

Логический тип (Boolean). Значениями логического типа может быть одна из констант False или True.

 

Символьный тип (Char). Значениями символьного типа является множество всех символов персонального компьютера. Для кодировки используется код ASCII (American Standart Code for Information Interchange – американский стандартный код для обмена информации).

 

Перечисляемый тип. Перечисляемый тип задается перечислением тех значений, которые он может получить. Каждое значение именуется некоторым идентификатором и располагается в списке, обрамленном круглыми скобками.

Формат задания типа:

Type

имя_типа=тип_значений;

Var

идентификатор: имя_типа;

Пример задания перечисляемого типа:

Type

Colors=(black, red, white);

Var Col:colors;

Переменные перечисляемого типа можно объявлять без предварительного описания типа:

Var

Col:(black, white, green);

 

Тип-диапазон. Тип-диапазон есть подмножество своего базового типа, в качестве которого может выступать любой скалярный тип, кроме вещественного и типа-диапазона. Тип-диапазон задается границами своих значений внутри базового типа:

минимальное_значение .. максимальное_значение

Пример:

Type

Digit=’0’..’9’;

Dig2=48..57;

Var

D1:Digit;

D2:Dig2;

Тип-диапазон можно непосредственно указывать при объявлении переменной. Пример:

Var

Date:1..31;

Month:1..12;

 

Вещественные типы. Значения вещественных типов определяют произвольное вещественное число с некоторой конечной точностью, зависящей от внутреннего формата числа.

Тип Название Длина, байт Кол-во цифр мантисы Диапазон десятичного порядка
Real Вещественный 11..12 -39..38
Single С одинарной точностью 7..8 -45..38
Double С двойной точностью 15..16 -324..308
Extended С повышенной точностью 19..20 -4932..4932
Comp Сложный 10..20 -2*1063+1.. 2*1063-1

Пример:

Var

Min:Real;

Операции

 

Операции делятся на 4 категорий согласно приоритету:

1) унарный минус, not — логическое отрицание; @ – получение адреса операнда;

2) операции группы умножения — * (умножить), mod (деление по модулю), div (целочисленное деление), / (деление), and (логическое "и"), shl – сдвиг влево, shr – сдвиг вправо;

3) операции группы сложения: + (сложение), – (вычитание), or (логическое "или"), xor (исключающее "или");

4) операции отношения: = (равно), <> (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), in (проверка принадлежности множеству).

Пример:

F:=2*sin(x)+3/sqrt(1+x*x);

 

Операции целочисленной арифметики

Целочисленное деление (div) – возвращает целую часть частного, дробная часть отбрасывается. Результат целочисленного деления всегда равен нулю, если делимое меньше делителя.

 

Деление по модулю (mod) – возвращает остаток, полученный в результате целочисленного деления.

Пример:

11 div 5 = 2; 2 div 3=0;

11 mod 5=1; 14 mod 5=4

 

Таблица истинности для логических операций

Операция Пример Значение A Значение B Результат
not Логическое отрицание Not A True False   False True
and Логическое умножение A and B True True False False True False True False True False False False
or Логическое сложение A or B True True False False True False True False True True True False
xor Исключающее или A xor B True True False False True False True False False True True False

Сдвиговые операции (shl, shr):

i shl j – сдвиг содержимого i на j разрядов влево; освободившиеся младшие разряды заполняются нулями (сдвиг влево на 1 разряд эквивалентен умножения числа i на 2);

i shr j – сдвиг содержимого i на j разрядов вправо; освободившиеся старшие разряды заполняются нулями (сдвиг вправо на 1 разряд эквивалентен делению числа i на 2).

Выражения

Выражения — алгоритмические конструкции, задающие правила вычисления значений. Выражения состоят из операндов и знаков операций.

Стандартные математические функции:

abs(x) – |x|,

arctan(x) – arctgx,

cos(x) – cosx,

exp(x) – ex,

int(x) – целая часть выражения x,

frac(x) – дробная часть выражения x,

ln(x) – lnx,

sin(x) – sinx,

sqr(x) – x2,

sqrt(x) – ,

Random – псевдослучайное число, равномерно распределенное в диапазоне 0..1;

Random(x) – псевдослучайное число, равномерно распределенное в диапазоне 0..x-1;

Randomize – инициация генератора псевдослучайных чисел.

Скалярные функции обрабатывают данные любого скалярного типа, кроме вещественного:

Pred (S) — возвращает элемент, предшествующий S;

Succ (S) — возвращает значение, следующее за S;

Odd (I) — возвращает значение булевского типа, равное True, если I нечетное, и False, если I четное.

Функции преобразования типов:

Round(x) – возвращает значение x, округленное до ближайшего целого числа, результат имеет целочисленный тип;

Trunc(x) – возвращает ближайшее целое число меньшее или равное x, если x 0, большее или равное x, если x<0. Результат имеет целочисленный тип;

Chr(i) – возвращает символ стандартного кода обмена информацией с номером, равным значению i.

Ord(s) – возвращает порядковый номер значения s во множестве, определенном типом s.

 

Пример:

Round(3.7); результат 4

Round(-46.317) результат –46

Trunc(3.7); результат 3

 

Стандартные процедуры и функции, применяемые к целым типам:

Dec(i) – уменьшает значение переменной I на единицу (аналог оператора i:=i-1);

Inc(i) – увеличивает значение переменной I на единицу (аналог оператора i:=i+1);

Hi(i) – возвращает старший байт аргумента (тип аргумента byte или word);

Lo(i) – возвращает младший байт аргумента (тип аргумента byte или word);

Swap(i) – меняет местами байты в слове.

 

Стандартные функции, применимые к символьному типу:

Chr(I) – возвращает символ стандартного кода обмена информацией с номером, равным значению I;

UpCase(ch) – функция меняет регистр латинских букв со строчной на прописную.

Стандартные функции, поддерживающие работу с типами-диапазонами:

High(x) – возвращает максимальное значение типа-диапазона, к которому принадлежит переменная x;

Low(x) – возвращает минимальное значение типа-диапазона.

 

ПРОЦЕДУРЫ ВВОДА-ВЫВОДА

 

Для выполнения операций ввода-вывода служат 4 процедуры: Read, ReadLn, Write, WriteLn.

Процедура чтения Read обеспечивает ввод числовых данных, символов, строк и т.д. для последующей их обработки программой. Формат:

Read (X1,X2,…,Xn);

где X1, X2, …, Xn – переменные допустимых типов.

Значения X1,…,Xn набираются минимум через один пробел на клавиатуре пользователем и высвечиваются на экране. После ввода данных для одной процедуры Read нажимается клавиша ввода Enter. Значения переменных должны вводиться в строгом соответствии с синтаксисом языка.

Если в программе имеется несколько процедур Read, данные для них вводятся потоком, т.е. после считывания значений переменных для одной процедуры Read данные для следующей процедуры Read набираются в той же строке, что и для предыдущей до окончания строки, затем происходит переход на следующую строку.

Пример.

Var A,B: Integer; C,D: Real; Begin Read (A,C); Read (B,D); End. Поток ввода: 25 2.34<Enter> 451 25.685<Enter>

 

Процедура чтения ReadLn аналогична процедуре Read, единственное отличие заключается в том, что после считывания последнего в списке значения для одной процедуры ReadLn данные для следующей процедуры ReadLn будут считываться с начала новой строки. Заменим в предыдущем примере процедуры Read на процедуры ReadLn:

 

Var A,B: Integer; C,D: Real; Begin ReadLn (A,C); ReadLn (B,D); End. Поток ввода: 25 2.34 <Enter> 451 25.685 <Enter>  

Процедура записи Write производит вывод числовых данных, символов, строк и булевских значений. Формат:

Write (Y1,…,Yn);

где Y1,…,Yn – выражения целочисленного, вещественного, символьного, строкового, булевского и др. типов.

Форматы вывода:

Процедура Значение Поток вывода

Write (I); 134 134

Write (I:5); 134 _ _134

(Для вывода целого числа отводится 5 позиций. При выводе число автоматически прижимается к правому краю).

Write (R); 715.342 _ _7.153420000E+02

Write (R:12); 46.78 4.678000E+01

(На вещественное число отводится 12 позиций).

Write (R:6:2); 46.78 _46.78

(На вещественное число отводится 6 позиций, из них 2 знака после запятой. Число прижимается к правому краю).

Write (CH); 'X' X

Write (CH:4); 'X' _ _ _X

Write (S); 'Привет !' Привет !

Write (S:10); 'Привет !' _ _ _Привет !

Write (B); True True

Write (B:6); True _ _True

Процедура записи WriteLn аналогична процедуре Write, но после вывода последнего в списке значения для текущей процедуры WriteLn происходит перевод курсора к началу следующей строки. Процедура WriteLn, записанная без параметров, вызывает перевод строки.

Пример:

Write ('A=',A:3);

WriteLn ('_C=',C:3);

WriteLn ('D=',D:6:2);

Поток вывода

A=_23_C=_34

D=_ _3.24

 

ОПЕРАТОРЫ

 

Операторы выполняются в том порядке, в котором они записаны в программе. Разделителем операторов служит точка с запятой.

Все операторы разделяются на 2 группы: простые и структурные.

Операторы, не содержащие внутри себя других операторов, называются простыми. К ним относятся операторы присваивания, безусловного перехода, пустой оператор и оператор вызова процедур. Структурные операторы представляют собой структуры, построенные из других операторов по строго определенным правилам. Все структурные операторы подразделяются на 3 группы:

· составные,

· условные операторы,

· операторы повтора.

Совместимость типов

Два типа считаются совместимыми, если:

· оба есть один и тот же тип;

· оба вещественные;

· оба целые;

· один тип есть тип-диапазон второго типа;

· оба являются типами-диапазонами одного и того же базового типа.

 

Виды операторов

1. Оператор присваивания выполняет выражение, заданное в его правой части, и присваивает результат переменной, идентификатор которой расположен в левой части.

Формат оператора:

идентификатор:=выражение;

Такое присваивание возможно лишь в следующих случаях:

· идентификатор и значение выражения принадлежат к одному и тому же типу;

· идентификатор и значение выражение являются совместимыми типами и значение выражения лежит в диапазоне возможных значений идентификатора;

· идентификатор вещественного типа – значение выражения целочисленного типа;

· идентификатор – строка, выражение – символ.

В программе данные одного типа могут преобразовываться в данные другого типа. Такое преобразование может быть явным и неявным. Явное преобразование типов может осуществляться двумя способами:

1. Использование функций преобразование типов.

2. Преобразование типов может осуществляться применением идентификатора (имени) стандартного типа или типа определенного пользователем, как идентификатора функции преобразования к выражению преобразуемого типа, например:

Var

k:Integer;

Begin

Byte(k); {переменная k преобразована в целочисленный тип}

End.

Неявное преобразование типов возможно в двух случаях:

· в выражениях, составленных из вещественных и целочисленных переменных, целочисленные переменные автоматически преобразуются к вещественному типу, и все выражение в целом приобретает вещественный тип;

· одна и та же область памяти попеременно трактуется как содержащая данные то одного, то другого типа (совмещение в памяти данных разного типа).

2. Оператор безусловного перехода Goto. Служит для передачи управления оператору, помеченному меткой. Метка отделяется от оператора двоеточием. Оператор Goto применяется в случаях, когда после выполнения некоторого оператора надо выполнить не следующий по порядку, а какой-либо другой, отмеченный меткой оператор.

Формат оператора:

Goto метка;

Формат описания меток:

Label

имя_метки;

При записи оператора Goto необходимо помнить следующее:

1. Метка, на которую передается управление, должна быть описана в разделе описания меток того блока процедуры, функции, основной программы, в котором эта метка используется.

2. Областью действия метки является тот блок, в котором она описана.

3. Попытка выйти за пределы блока или передать управление внутрь другого блока вызывает программное прерывание.

Пример:

Goto met1;

met1: оператор;

Обычно оператор Goto применяется для преждевременного выхода из цикла или при обработке ошибок. В других случаях его использовать не рекомендуется.

3. Пустой операторне содержит ни одного символа и не выполняет никаких действий. Он может быть использован там, где синтаксис языка требует наличие оператора, но никакие действия выполнять не нужно. Пустой оператор – это лишняя точка с запятой (;).

Пример:

Goto m7;

...

m7: ;

4. Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой и ограниченную операторными скобками begin и end. Составной оператор воспринимается как единое целое и может находиться в любом месте программы, где синтаксис языка допускает наличие оператора.

Формат оператора:

 

begin

Оператор 1;

Оператор N;

еnd;

 

5. Условные операторы обеспечивают выполнение или невыполнение некоторого оператора, группы операторов или блока в зависимости от заданных условий. В Паскале используются два условных оператор: If и Case.

Оператор условия If. Может принимать одну из форм:

If условие then оператор_1

else оператор_2; {полная условная конструкция}

If условие then оператор; {неполная условная конструкция}

В первом случае говорят о полном операторе If, а во втором – о неполном операторе If. Условие – это выражение булевского типа. Оно может быть простым или сложным. Сложные условия образуются с помощью логических операций. При записи условия могут использоваться все возможные операции отношения.

В первом случае если условие истинно, то выполняется оператор_1, если условие ложно – оператор_2. Во втором случае если условие истинно, выполняется оператор, если ложно – оператор, следующий за оператором If.

Оператор If может входить в состав другого оператора If. В этом случае говорят о вложенности операторов:

If условие then

If условие then оператор1

else оператор2;

При вложенности операторов каждое else соответствует тому then, которое непосредственно ему предшествует.

Пример:

If ((A>B) and (C<D)) then

If (Z>=X) then Writeln ('Норма')

else Writeln ('Превышение нормы')

else WriteLn ('Недобор');

 

Оператор выбора Case является обобщением оператора If и позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором, и списка параметров, каждому их которых предшествует список констант выбора (список может состоять и из одной константы). Как и в операторе If, здесь может присутствовать слово Else, имеющее тот же смысл. Формат оператора:

Сase выражение-селектор of

Список_1: оператор_1;

Список_2: оператор_2;

...

Список_N: оператор_N

else оператор

end;

Оператор Case передает управление тому оператору, с одним из значений списка которого совпало значение выражения-селектора. Если ни одно из значений списков не совпадает со значением селектора, то либо такой оператор Case эквивалентен пустому оператору и затем выполняется оператор, следующий за словом Еnd, либо выполняется оператор, следующий за словом Else.

Выражение-селектор может иметь любой скалярный тип. Список констант выбора состоит из произвольного числа значений или диапазонов, отделенных друг от друга запятыми.

Примеры:

Case X of {выражение-селектор целого типа}

1,2,3 : A:=B+C;

4 : A:=B-C;

5..9 : A:=B*C

else A:=B/C

end;

 

Case CH of {выражение-селектор литерного типа}

'A'.. 'z': WriteLn ('Введена латинская буква');

'0'.. '9': WriteLn ('Введена цифра')

end;

6. Операторы циклов. Цикл – это последовательность операторов, которая может выполняться более одного раза. Если количество повторов известно заранее, используется оператор For, если количество повторов неизвестно, применяются операторы Repeat и While.

Оператор повтора For состоит из заголовка и тела цикла. Он может быть представлен в двух форматах:

For параметр_цикла:=начальное_значение to конечное_значение do

оператор;

For параметр_цикла:=начальное_значение downto конечное_значение do

оператор;

Тело цикла может быть простым или составным оператором. Оператор For обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цикла от начального до конечного.

Параметр цикла, его начальное и конечное значения должны принадлежать к одному и тому же типу данных. При этом допустим любой скалярный тип, кроме вещественного. В цикле For…to значение параметра цикла увеличивается на единицу, а в цикле For…downto значение параметра цикла уменьшается на единицу.

Пример. Найти сумму чисел в диапазоне от 0 до 100.

Program DemoFor;

Var

I, Sum: Integer;

Begin

Sum:=0;

For i:=0 to 100 do

Sum:=Sum+I;

WriteLn ('Сумма чисел равна ',Sum);

End.

 

Оператор повтора repeat состоит из заголовка (Repeat), тела и условия окончания (Until).

Формат оператора:

Repeat

оператор_1;

...

оператор_n;

Until условие;

Условие – выражение логического типа. Операторы, заключенные между словами Repeat и Until, являются телом цикла. Вначале выполняется тело цикла, затем проверяется условие выхода из цикла. Если результат равен False, тело цикла активизируется еще раз, если результат True – происходит выход из цикла.

Оператор Repeat имеет три характерные особенности:

· выполняется по крайней мере один раз;

· тело цикла выполняется пока условие равно False;

· в теле может находиться произвольно число операторов без операторных скобок Begin...End.

Пример. Найти сумму нечетных чисел в диапазоне от 0 до 100.

Program DemoRepeat;

Var

I, Sum: Integer;

Begin

I:=3;

Sum:=3;

Repeat

Sum:=Sum+I;

I:=I+2;

Until (I>100);

WriteLn ('Сумма нечетных чисел равна ',Sum);

End.

Оператор While аналогичен оператору Repeat, но проверка условия выполнения тела цикла производится в самом начале цикла.

Формат оператора:

While условие do оператор;

Условие – выражение логического типа, тело цикла – простой или составной оператор. Перед каждым выполнением оператора вычисляется значение выражения условия. Если результат условия равен True, оператор выполняется и снова вычисляется выражение условия. Если результат равен False, происходит выход из цикла и переход к первому после While оператору. Если перед первым выполнением цикла значение выражения было False, оператор вообще не выполняется и происходит переход на следующий оператор.

Операторы For, While, Repeat могут быть вложенными, т.е. в теле цикла может быть другой оператор цикла.

Пример. Найти сумму четных чисел в диапазоне от 0 до 100.

Program DemoWhile;

Var

I, Sum: Integer;

Begin

I:=2;

Sum:=0;

While (i<=100) do

Begin

Sum:=Sum+I;

I:=I+2;

end;

WriteLn ('Сумма четных чисел равна ',Sum);

End.

 

7. Операторы управления работой циклов. Для управления работой цикла используются специальные процедуры-операторы Continue, Break.

Вызов процедуры Continue в теле цикла прерывает выполнение цикла и переходит к проверке условия, минуя все операторы, расположенные ниже Continue.

Repeat оператор; … Continue; … оператор; Until условие; While условие do begin оператор; … Continue; … оператор; end; For i:=1 to N do begin оператор; … Continue; … оператор; end;

Вызов процедуры Break прерывает выполнение цикла и передает управление первому оператору, расположенному за оператором цикла.