Выражения и операции языка Паскаль 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Выражения и операции языка Паскаль



 

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

Частным случаем выражения может быть просто одиночная константа, переменная или обращение к функции. Значение такого выражения имеет тот же тип, что и сам элемент. В более общем случае выражение состоит из нескольких элементов (операндов) и знаков операций, а тип его значения определяется типом операндов и видом примененных к ним операций.

Примеры:

Y

(a + b) / c

sin (t)

a > 2

not Flag and (a = b)

NIL

 

Операции

В Турбо Паскале определены следующие операции:

– унарные not, @;

– мультипликативные *, /, div, mod, and, shl, shr;

– аддитивные +, -, or, xor;

– отношения =, <>, <, >, <=, >=, in.

Приоритет операций убывает в указанном порядке, т.е. наивысшим приоритетом обладают унарные операции, низшим – операции отношения. Порядок выполнения нескольких операций равного приоритета устанавливается компилятором из условия оптимизации кода программы и не обязательно слева направо.

Правила использования операций с операндами различного типа приводятся в табл. 3.

 

Таблица 3

Правила использования операций

Операция Действие Тип операндов Тип результата
not Отрицание Логический Логический
not То же Любой целый Тип операнда
@ Адрес Любой Указатель
* Умножение Любой целый Наименьший целый
* То же Любой вещественный Extended (или Real)

Продолжение табл. 3

* Пересечение множеств Множественный Множественный
/ Деление Любой вещественный Extended (или Real)
div Целочисленное деление Любой целый Наименьший целый
mod Остаток от деления То же То же
and Логическое И Логический Логический
and То же Любой целый Наименьший целый
shl Левый сдвиг То же То же
shr Правый сдвиг То же То же
+ Сложение То же То же
+ То же Любой вещественный Extended (или Real)
+ Объединение множеств Множественный Множественный
+ Сцепление строк Строковый Строковый
- Вычитание Любой целый Наименьший целый
- То же Любой вещественный Extended (или Real)
or Логическое ИЛИ Логический Логический
or То же Любой целый Наименьший целый
= Равно Любой простой или строковый Логический
<> Не равно То же То же
< Меньше Логический Логический
<= Меньше или равно То же То же

 

Окончание табл. 3

> Больше То же То же
>= Больше или равно То же То же

 

При действии с вещественным типом одним из операндов может быть значение любого целого типа. Результат операций имеет указанный в таблице тип Extended только для установленного в среде Турбо Паскаля режима генерации кода, рассчитанного на арифметический сопроцессор или на его эмуляцию. Если этот режим не установлен, результат будет иметь значение типа Real.

В Турбо Паскале имеются следующие логические операции:

not – логическое НЕ;

and – логическое И;

or – логическое ИЛИ;

xor – исключающее ИЛИ.

Логические операции применимы к операндам целого и логического типов. Если операнды – целые числа, то результат логической операции есть тоже целое число, биты которого (двоичные разряды), формируются из битов операндов по правилам, приведенным в табл. 4.

 

Таблица 4

Логические операции над данными типа INTEGER

Операнд 1 Операнд 2 not and or xor
  -   - - -
  -   - - -
    -      
    -      
    -      
    -      

 

 

К логическим также относятся операции сдвига, применяемые к целым числам:

i shl j – сдвиг содержимого i на j разрядов влево – освободившиеся младшие разряды заполняются нулями;

i shr j – сдвиг содержимого i на j разрядов вправо – освободившиеся старшие разряды заполняются нулями.

i и j – выражения целого типа.

Логические операции над логическими данными дают результат логического типа согласно правилам, указанным в табл. 5.

Таблица 5

Логические операции над данными логического типа

Операнд 1 Операнд 2 not and or xor
True - False - - -
False - True - - -
False False - False False False
False True - False True True
True False - False True True
True True - True True False

 

Операция отношения in применяется к двум операндам. Первым (левым) операндом должно быть выражение любого порядкового типа, вторым – множество, состоящее из элементов того же типа, или идентификатор множественного типа. Операция дает true, если левый операнд принадлежит множеству.

 

Типы данных языка Паскаль

 

Любые данные (константы, переменные, значения функций или выражения) в Турбо Паскале характеризуются своими типами. Тип определяет множество допустимых значений, которые может иметь тот или иной объект, а также множество допустимых операций, которые применимы к нему. Тип также определяет формат внутреннего представления данных в памяти компьютера.

Существуют следующие типы данных в Турбо-Паскале.

1) Простые типы:

– вещественные;

– целые;

– символьные;

– булевские (логические);

– перечисляемые;

– ограниченные (диапазонные).

2) Составные (структурированные) типы:

– регулярные (массивы);

– комбинированные (записи);

– файловые;

– множественные;

– строковые;

– объекты.

3) Ссылочные типы (типизированные и нетипизированные указатели).

4) Процедурные типы.

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

 

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

 

Таблица 6

Целые типы данных

Тип Диапазон значений Длина, байт
Shortint -128..127 1 байт
Integer -32768..32767 2 байта
Longint 2147483648..2147483647 4 байта
Byte 0..255 1 байт
Word 0..65535 2 байта

 

Целые переменные описываются с использованием указанных выше зарезервированных слов:

Var

i, j, k: integer;

f, h: word;

Данные целого типа хранятся в памяти точно. Например, переменные типа integer занимают в памяти 2 байта (16 бит), которые распределяются следующим образом: 1 бит отводится для хранения знака числа (0, если число положительное, и 1, если число отрицательное) и 15 бит для хранения числа в двоичной системе счисления. Максимальное десятичное число, которое можно записать как двоичное в 15 бит – это 32767.

При использовании процедур и функций с целочисленными параметрами следует руководствоваться «вложенностью» типов, т.е. везде где используется word, допускается использование byte (но не наоборот), в longint «входит» integer, который, в свою очередь, включает в себя shortint.

Для целого типа определены пять основных операций, результатом которых также является целое число: +, -,*, div, mod (сложение, вычитание, умножение, целочисленное деление и остаток от целочисленного деления). В арифметических выражениях операции *, div, mod имеют более высокий приоритет по сравнению с операциями +, -. Примеры записи выражений:

i div j

a + c * d

k mod l

Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 7. Буквами b, s, w, i, l обозначены выражения соответственно типа byte, shortint, word, integer, и longint; x – выражение любого из этих типов; идентификаторы vb, vs, vw, vi, vl, vx обозначают переменные соответствующих типов. В квадратных скобках указывается необязательный параметр.

 

Таблица 7

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

Обращение Тип результата Действие
Abs (x) x Возвращает модуль x
Chr (b) Char Возвращает символ по его коду
Dec (vx [, i]) - Уменьшает значение vx на i, а при отсутствии i – на 1
Inc (vx [, i]) - Увеличивает значение vx на i, а при отсутствии i – на 1
Hi (i) Byte Возвращает старший байт аргумента
Hi (i) Byte То же
Lo (i) Byte Возвращает младший байт аргумента
Lo (w) Byte То же
Odd (l) Byte Возвращает true, если аргумент – нечетное число
Random (w) Как у параметра Возвращает псевдослучайное число, равномерно распределенное в диапазоне 0…(w-1)
Sqr (x) x Возвращает квадрат аргумента
Swap (i) Integer Меняет местами байты в слове
Swap (w) Word Меняет местами байты в слове
Succ(x) Как у параметра Возвращает следующее целое значение, т.е. x+1
Pred(x) Как у параметра Возвращает предшествующее целое значение, т.е. x-1

 

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

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

Таблица 8

Вещественные типы данных

Тип Диапазон Число цифр в мантиссе Длина, байт
Real 2.9e-39..1.7e38 11-12 6 байт
Single 1.5e-45..3.4e38 7-8 4 байта
Double 5.0e-324..1.7e308 14-16 8 байт
Extended 3.4e-4951..1.1e4932 19-20 10 байт
Comp (только целые числа) -2e63+1..2e62-1 19-20 8 байт

Вещественные переменные описываются с использованием указанных выше зарезервированных слов:

Var

a, d, k: real;

p, r: single;

Вещественное число в памяти компьютера состоит из 3-х частей:

- знаковый разряд числа;

- экспоненциальная часть;

- мантисса числа.

Мантисса имеет длину от 23 (Single) до 63 (Extended) двоичных разрядов, что и обеспечивает точность 7-8 для Single и 19-20 для Extended десятичных цифр. Десятичная точка (запятая) подразумевается перед левым (старшим) разрядом мантиссы, но при действиях с числом ее положение сдвигается влево или вправо в соответствии с двоичным порядком числа, хранящимся в экспоненциальной части, поэтому действия над вещественными числами называют арифметикой с плавающей точкой (запятой).

Доступ к типам Single, Double и Extended осуществляется только при особых режимах компиляции. Для включения данных режимов следует выбрать пункт меню Options, Compiler… и включить опцию 8087/80287 в группе Numeric processing.

Особое положение в Турбо Паскаль занимает тип Comp, который трактуется как вещественное число без экспоненциальной и дробной частей. Фактически, Comp – Это большое целое число со знаком, сохраняющее 19…20 значащих десятичных цифр. В то же время в выражениях Comp полностью совместим с любыми другими вещественными типами: над ним определены все вещественные операции, он может использоваться как аргумент математических операций и т.д.

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

В форме с фиксированной точкой запись состоит из целой и дробной частей, отделенных друг от друга точкой, например:

0.087 4.0 23.5 0.6

В форме с плавающей точкой запись содержит букву Е, которая означает «умножить на десять в степени», причем степень является целым числом, например:

7Е3 6.9Е-8 0.98Е-02 45Е+04

Над объектами вещественного типа определены следующие операции: +, -, *, /.

Операции «*» и «/» имеют более высокий приоритет по сравнению с операциями «+» и «-».

Если хотя бы один операнд вещественный, то операции +, -, *, / приводят к вещественному результату. Операция деления / приводит к вещественному результату и в случае двух целых операндов, например: 9/3 = 3.0.

Для работы с вещественными данными могут использоваться стандартные математические функции, представленные в табл. 9. Результат работы этих функций также является вещественным.

Таблица 9

Математические функции, работающие с вещественными данными

Обращение Назначение
Abs (x) Возвращает модуль аргумента
ArcTan (x) Арктангенс аргумента (значение угла в радианах)
Cos (x) Косинус аргумента (значение угла в радианах)
Exp (x) Экспонента
Frac (x) Дробная часть числа
Int (x) Целая часть числа
Ln (x) Натуральный логарифм
Pi Возвращает значение числа π
Random Псевдослучайное число из диапазона 0…1
Sin (x) Синус аргумента (значение угла в радианах)
Sqr (x) Квадрат аргумента
Sqrt (x) Квадратный корень аргумента

 

Переменные и константы типа REAL запрещается использовать:

– в функциях pred(x), succ(x), ord(x);

– в качестве индексов массивов;

– в качестве меток в операторах передачи управления;

– в качестве управляющих переменных (параметров цикла).

Для перевода вещественного числа в целое можно воспользоваться функциями:

trunc(x) – целая часть х (х – вещественное);

round(x) – округление до ближайшего целого (х- вещественное).

 

Символьный тип. Символьные переменные описываются с помощью зарезервированного слова char:

Var

s, t, e: char;

Значения этого типа выбираются из упорядоченного множества символов (из множества ASCII), состоящего из 256 символов. Каждому символу приписывается целое число из диапазона 0..255. Например, прописные буквы латинского алфавита A..Z имеют коды 65..90, а строчные буквы – коды 97..122.

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

‘F’ ‘8’ ‘*’

Символьные переменные можно сравнивать между собой, при этом сравниваются коды символов.

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

ord(с) – выдает номер символа с;

chr(i) – выдает символ с номером i.

Эти функции являются обратными по отношению друг к другу.

Логический тип. Логические переменные описываются с помощью зарезервированного слова boolean:

Var

p1, p2: boolean;

Переменные логического типа принимают два значения: true (истина), false (ложь).

Эти величины упорядочены следующим образом: false < true. false имеет порядковый номер 0, true имеет порядковый номер 1.

Переменным логического типа можно либо присвоить значение непосредственно, либо использовать логическое выражение. Например,

Var

a, d, g, b: boolean;

x, y: real;

Begin

a:= true;

d:= false;

g:= x > y;

b:= x < y;

End.

 

Операции отношения (<, <=, >, >=, =, <>), применяемые к целым, вещественным и символьным переменным, дают логический результат.

Логические операции над операндами логического типа также дают логический результат (операции приведены в порядке убывания приоритета) (подробнее см. табл. 3 и 5):

not – отрицание (операция НЕ);

and – логическое умножение (операция И);

or – логическое сложение (операция ИЛИ);

xor – исключающее ИЛИ.

Выражение (not a) имеет значение, противоположное значению а.

Выражение (a and b) дает значение true, если только и а и b имеют значение true, в остальных случаях значение этого выражения есть false.

Выражение (a or b) дает значение false, если только и а и b имеют значение false, во всех остальных случаях результат true.

 

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

Type

x = (w1, w2, …, wn);

Var

a: x;

где х – имя типа, w1, w2,…, wn – значения, которые может принимать переменная типа х.

Эти значения являются упорядоченными w1<w2<…<wn и перенумерованными, начиная с нуля. Максимум в списке может быть 65536 значений.

К аргументу w перечисляемого типа применимы следующие стандартные функции:

succ(w), pred(w), ord(w).

Пример.

Type

w=(on, off);

color=(red, black, yellow, green)

ww=(left, up, right, down);

Var

a, b: w;

c, d: color;

f: array [1..4] of ww;

Begin

a:= on;

b:= off;

d:= black;

f[1]:= up;

ord(d)= 1;

pred(d) = red;

succ(d) = yellow;

End.

Переменные а и в имеют тип w. они могут принимать одно из трех значений, причем on<off. Переменные c и d имеют тип color и принимают одно из четырех значений, причем red< black< yellow< green. Пусть переменная d имеет значение black. Тогда succ(d) есть blue, pred(d) есть red, ord(d) есть 1.

К величинам перечисляемого типа применимы операции отношения: =, <>, <=, >=, <, >.

Допускается указывать константы перечисляемого типа непосредственно в разделе var без использования раздела type, например

Var

c,d: (red, black, yellow, green);

 

Диапазонный (ограниченный) тип. При определении ограниченного типа указывают начальное и конечное значения, которые может принимать переменная диапазонного типа. Значения разделяют двумя точками.

Описание ограниченного типа имеет вид

Type

a = min..max;

Здесь а – имя типа, min, max – константы.

При задании ограниченного типа должны выполняться следующие правила:

– обе граничные константы min и max должны быть одинакового типа;

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

Type

index = 1..20;

col = red.. yellow;

letter = ‘a’..’f’;

Var

i: index;

d: col;

f: letter;

– переменные ограниченного типа можно описать в разделе var, не обращаясь к разделу type:

Var

i: 1..20;

– ограниченный тип наследует все свойства базового типа, из которого он создается;

– граница min всегда должна быть меньше границы max.

 

Массивы. Массив – это сложный тип, представляющий собой структуру, состоящую из фиксированного числа компонент одного типа. Тип компонента называется базовым типом. Все компоненты массива можно легко упорядочить и обеспечить доступ к любому из них простым указанием его порядкового номера. Описание массива в разделе var имеет вид:

Var

a: array [t1] of t2;

где а – имя массива, array, of – служебные слова (означают «массив из…»), t1 – тип индексов; t2 – тип компонент (базовый тип).

Количество индексов определяет размерность массива. Индексы могут быть целого (кроме longint), символьного, логического, перечисляемого и диапазонного типов. Индексы разделяются запятыми и заключаются в квадратные скобки. Компоненты массива могут быть любого типа, кроме файлового.

Пример 1. Рассмотрим одномерный массив С, значениями которого являются пять вещественных чисел:

4.6 6.23 12 -4.8 0.7

Описание этого массива выглядит следующим образом:

Var

c: array [1..5] of real;

По конкретному значению индекса можно выбрать определенную компоненту массива (например, C[3] означает третий элемент массива С, т.е. число 12).

Пример 2. Рассмотрим двумерный массив В (матрицу В), значением которого является таблица из целых чисел:

45 5 -4 6

12 7 -8 15

Описание данного массива выглядит следующим образом:

Var

b [1..2, 1..4] of integer;

Здесь b – имя массива, первый индекс является номером строки и принимает значения от 1 до 2, второй – номер столбца и принимает значения от 1 до 4. По конкретным значениям индексов можно выбрать определенную компоненту массива (например, b[1,3] означает элемент таблицы, стоящий в первой строке и третьем столбце, т.е. число -4).

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

Var

a: array [1..10] of real;

i: integer;

Begin

a[3]:= 5;

a[i]:= 12;

a[(i+1)*2]:= 24;

End.

Набор операций над элементами массива полностью определяется типом этих элементов.

 

Строковый тип. Строковый тип – множество символьных цепочек произвольной длины (от нуля до заданного числа). Переменные строкового типа описываются с помощью служебного слова string:

Var

b: string [100];

Особенности:

– значение строковой переменной может быть введено с помощью клавиатуры, присвоено в операторе присваивания, прочитано из файла. При этом длина введенной строки может быть любой (меньше указанного размера, равна размеру или больше, в последнем случае, лишние символы отбрасываются); a:= ‘Результаты’;

– допускается использовать операцию конкатенации в операторе присваивания, так как строки могут динамически изменять свою длину: а:= a + ‘ вычислений’;

– максимальная длина строковой переменной 255 символов, это указание длины может быть опущено:

Var

a: string;

a1: string [255];

Переменные а и а1 – одинаковы (эквивалентное описание).

– память под переменные строкового типа отводится по максимуму, но используется лишь часть памяти, реально занятая символами строки в данный момент. Для описания строковой переменной длины n используется n+1 байт памяти: n байтов - для хранения символов строки, n+1 –й байт – для хранения текущей длины.

– над значениями строковых типов определены операции сравнения: < <= > >= = <>. Короткая строка всегда меньше длинной. Если строки имеют одинаковую длину, то сравниваются коды символов.

– возможен доступ к отдельным элементам строки аналогично доступу к элементам массива: а[1], a[5]. В квадратных скобках указывается номер элемента строки.

 

Процедуры и функции, ориентированные на работу со строками.

concat (s1, s2,…) – функция слияния строк, s1, s2, …- строки, число строк может быть произвольным. Результатом работы функции является строка. Если длина результирующей строки больше 255 символов, то строка усекается до 255 символов.

copy (s, index, count) – функция выделения строки из исходной строки s длиной count символов, начиная с символа под номером index.

delete (s, index, count) – процедура удаления из строки s подстроки длиной count символов, начиная с символа с номером index.

insert (s1, s2, index) – процедура вставки строки s1 в строку s2, начиная с символа с номером index.

length(s) – функция определения текущей длины строки, возвращает число равное текущей длине строки.

pos(s1, s2) – функция поиска в строке s2 подстроки s1. выдает номер позиции первого символа подстроки s1 в строке s2 (или 0, если этой строки нет).

val (st, x, code) – процедура преобразования строки s в целую или вещественную переменную x. Параметр code содержит 0, если преобразование прошло успешно (и в x помещается результат преобразования), или номер позиции строки, где обнаружен ошибочный символ (в таком случае значение x не меняется).

 

Совместимость и преобразование типов. Турбо Паскаль – это типизированный язык. Он построен на основе строго соблюдения концепции типов, в соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов.

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

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

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

– оба целые;

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

– оба являются типами диапазонами одного и того же базового типа;

– оба являются множествами, составленными из элементов одного и того же базового типа;

– оба являются упакованными строками (определены с предшествующим словом packed) одинаковой максимальной длины;

– один есть тип-строка, а другой – тип-строка или символ;

– один тип есть любой указатель, а другой – указатель на родственный ему объект;

– оба есть процедурные типы с одинаковым типом результата (для типа-функции), количеством параметров и типом взаимно соответствующих параметров.

Совместимость типов приобретает особое значение в операторах присваивания. Пусть t1 – тип переменной, а t2 – тип выражения, то есть выполняется присваивание t1:=t2. Это присваивание возможно в следующих случаях:

– t1 и t2 есть один и тот же тип, и этот тип не относится к файлам, массивам файлов, записям, содержащим поля-файлы, или массивам таких записей;

– t1 и t2 являются совместимыми порядковыми типами, и значение t2 лежит в диапазоне возможных значений t1;

– t1 и t2 являются вещественными типами, и значение t2 лежит в диапазоне возможных значений t1;

– t1 – вещественный тип и t2 – целый тип;

– t1 – строка и t2 – символ;

– t1 – строка и t2 – упакованная строка;

– t1 и t2 – совместимые упакованные строки;

– t1 и t2 – совместимые множества и все члены t2 принадлежат множеству возможных значений t1;

– t1 и t2 – совместимые указатели;

– t1 и t2 – совместимые процедурные типы;

– t1 – объект и t2 – его потомок.

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

При явном преобразовании типов вызываются специальные функции преобразования, аргументы которых принадлежат одному типу, а значения – другому. Пример – уже рассмотренные функции ord, trunc, round, chr.

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

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

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

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 751; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.83.150 (0.196 с.)