Программирование. Числовые типы данных Pascal-Паскаль. Pascal. Типы данных

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

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

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

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

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

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

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

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

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

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

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

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

– файловые;

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

– строковые;

– объекты.

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

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

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

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

Таблица 6

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

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

i, j, k: integer;

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

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

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

Перечень процедур и функций, применимых к целочисленным типам, приведен в табл. 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

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

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

Вещественное число в памяти компьютера состоит из 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

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

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

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

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

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

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

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

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

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

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

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

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

‘F’ ‘8’ ‘*’

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

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

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

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

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

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

p1, p2: boolean;

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

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

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

a, d, g, b: boolean;

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

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

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

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

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

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

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

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

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

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

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

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

Эти значения являются упорядоченными w1

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

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

color=(red, black, yellow, green)

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

f: array of ww;

succ(d) = yellow;

Переменные а и в имеют тип w. они могут принимать одно из трех значений, причем on

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

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

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

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

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

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

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

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

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

col = red.. yellow;

letter = ‘a’..’f’;

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

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

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

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

a: array of t2;

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

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

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

4.6 6.23 12 -4.8 0.7

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

c: array of real;

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

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

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

b of integer;

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

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

a: array of real;

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

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

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

b: string ;

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

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

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

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

a: string ;

a1: string ;

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

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

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

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

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

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.

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

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

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

ЛЕКЦИЯ 2

Основы программирования.

Введение в Pascal. Типы данных. Операции.

Алфавит языка Pascal

Любой естественный язык состоит из таких элементов, как символы, слова, словосочетания, предложения. В языке программирования также есть аналогичные элементы: символы, слова, выражения (словосочетания), операторы (предложения).

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

Алфавит языка Pascal состоит из:

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

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z - прописные буквы;

A b c d e f g h i j k l m n o p q r s t u v w x y z - строчные буквы;

2. десятичные арабские цифры: 0 1 2 3 4 5 6 7 8 9;

3. шестнадцатеричные цифры (строятся из десятичных цифр и букв от A до F);

4. 32 прописные и строчные буквы русского алфавита;

5. специальные символы:

Комбинации специальных символов могут образовывать составные символы:

: = присваивание;

< > не равно;

>= больше или равно;

<= меньше или равно;

Диапазон значений;

(* *) или { }- комментарий.

Структура Pascal-программы

Для того чтобы Pasсal-компилятор правильно понял, какие именно действия от него ожидаются, ваша программа должна быть оформлена в полном соответствии с синтаксисом (правилами построения программ) этого языка.

Любая Pascal-программа может состоять из следующих блоков (квадратными скобками здесь и далее помечены необязательные части):

program <имя_программы>;

[ uses <имена_подключаемых_модулей>;]

[ label <список_меток>;]

[ const <имя_константы> = <значение_константы>;]

[ type <имя_типа> = <определение_типа>;]

[ var <имя_переменной> : <тип_переменной>;]

[ procedure <имя_процедуры> <описание_процедуры>;]

[ function <имя_функции> <описание_функции>;]

begin {начало основного тела программы}

<операторы>

end. (* конец основного тела программы *)

Поздние версии компиляторов языка Pascal уже не требуют указывать название программы, то есть строку program <имя_программы>; можно опустить. Но это возможно только в том случае, если вся программа содержится в одном модуле-файле. Если же программа состоит из нескольких самостоятельных кусков - модулей, то каждый из них должен иметь заголовок (program или unit).

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

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

Директивы компилятора

Строка, начинающаяся символами {$, является не комментарием, а директивой компилятора - специальной командой, от которой зависит процесс компиляции и выполнения программы. Директивы мы будем рассматривать в тех разделах, к которым они относятся "по смыслу".

Например, строка {$I-,Q+} отключает контроль правильности ввода-вывода, но включает контроль переполнения при вычислениях.

Идентификаторы

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

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

Приведем список наиболее часто встречающихся зарезервированных слов:

array implementation shl

case interface string

const label then

file pointer uses

far procedure var

for program while

forward record with

function repeat xor

Переменные и типы данных

Переменная - это программный объект, значение которого может изменяться в процессе работы программы.

Тип данных - это характеристика диапазона значений, которые могут принимать переменные, относящиеся к этому типу данных.

Все используемые в программе переменные должны быть описаны в специальном разделе var по следующему шаблону:

var <имя_переменной_1> [, <имя_переменной_2, _>] : <имя_типа_1>;

<имя_переменной_3> [, <имя_переменной_4, _>] : <имя_типа_2>;

Язык Pascal обладает большим набором разнообразных типов данных, однако сейчас мы укажем лишь некоторые из них. Обо всех же типах данных мы поговорим далее.

Константы

Константа - это объект, значение которого известно еще до начала работы программы.

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

В языке Pascal существует три вида констант:

Неименованные константы (цифры и числа, символы и строки, множества);

Именованные нетипизированные константы;

Именованные типизированные константы.

Неименованные константы

Неименованные константы не имеют имен, и потому их не нужно описывать.

Тип неименованной константы определяется автоматически, по умолчанию:

Любая последовательность цифр (возможно, предваряемая знаком "-" или "+" или разбиваемая одной точкой) воспринимается компилятором как неименованная константа - число (целое или вещественное);

Любая последовательность символов, заключенная в апострофы, воспринимается как неименованная константа - строка;

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

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

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

real2:= 12.075 + х;

string4:= "abc" + string44;

set5:= * set55;

boolean6:= true;

Нетипизированные константы

Именованные константы, как следует из их названия, должны иметь имя. Стало быть, эти имена необходимо сообщить компилятору, то есть описать в специальном разделе const.

Если не указывать тип константы, то по ее внешнему виду компилятор сам определит, к какому (базовому) типу ее отнести. Любую уже описанную константу можно использовать при объявлении других констант, переменных и типов данных. Вот несколько примеров описания нетипизированных именованных констант:

Типизированные константы

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

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

const <имя_константы> : <тип_константы> = <начальное_значение>;

Из приведенных ниже примеров видно, как это сделать:

const n: integer = -10;

b: boolean = true;

Примеры типизированных констант других типов мы будем приводить по мере изучения соответствующих типов данных.

Типы данных языка Pascal

Компиляторы языка Pascal требуют, чтобы сведения об объеме памяти, необходимой для работы программы, были предоставлены до начала ее работы. Для этого в разделе описания переменных (var) нужно перечислить все переменные, используемые в программе. Кроме того, необходимо также сообщить компилятору, сколько памяти каждая из этих переменных будет занимать.

Все это можно сообщить программе, просто указав тип будущей переменной. Имея информацию о типе переменной, компилятор "понимает", сколько байт необходимо отвести под нее, какие действия с ней можно производить и в каких конструкциях она может участвовать.

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

Разделение на базовые и конструируемые типы данных в языке Pascal показано в таблице:

Порядковые(дискретные) типы данных

Адресные типы данных

Структурированные типы данных

Арифметические типы данных

Базовые типы данных

Логический

Символьный

Вещественные

Нетипизи

рованный указатель

Конструируемые типы

Перечисляемый

week = (su, mo, tu, we, th, fr,sa);

Типизированный указатель

Массив array

Строка string

Запись record

Процедурный

Объектный

Интервал (диапазон)

Типы данных, конструируемые программистом

Порядковые типы данных

Среди базовых типов данных особо выделяются порядковые типы. Такое название можно обосновать двояко:

1. Каждому элементу порядкового типа может быть сопоставлен уникальный (порядковый) номер. Нумерация значений начинается с нуля. Исключение - типы данных shortint, integer и longint. Их нумерация совпадает со значениями элементов.

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

Стандартные подпрограммы, обрабатывающие порядковые типы данных

Только для величин порядковых типов определены следующие функции и процедуры:

1.Функция ord(x) возвращает порядковый номер значения переменной x (относительно того типа, к которому принадлежит переменная х).

2.Функция pred(x) возвращает значение, предшествующее х (к первому элементу типа неприменима).

3.Функция succ(x) возвращает значение, следующее за х (к последнему элементу типа неприменима).

4.Процедура inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1).

5.Процедура inc(x,k) возвращает k-е значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+k).

6.Процедура dec(x) возвращает значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-1).

7.Процедура dec(x,k) возвращает k-e значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-k).

На первый взгляд кажется, будто результат применения процедуры inc(x) полностью совпадает с результатом применения функции succ(x). Однако разница между ними проявляется на границах допустимого диапазона. Функция succ(x) неприменима к максимальному элементу типа, а вот процедура inc(x) не выдаст никакой ошибки, но, действуя по правилам машинного сложения, прибавит очередную единицу к номеру элемента. Номер, конечно же, выйдет за пределы диапазона и за счет усечения превратится в номер минимального значения диапазона. Получается, что процедуры inc() и dec() воспринимают любой порядковый тип словно бы "замкнутым в кольцо": сразу после последнего вновь идет первое значение.

Поясним все сказанное на примере. Для типа данных

type sixteen = 0..15;

попытка прибавить 1 к числу 15 приведет к следующему результату:

Начальная единица будет отсечена, и потому получится, что inc(15)=0.

Аналогичная ситуация на нижней границе допустимого диапазона произвольного порядкового типа данных наблюдается для процедуры dec(x) и функции pred(x):

dec(min_element)= max_element

Типы данных, относящиеся к порядковым

1. Логический тип boolean имеет два значения: false и true, и для них выполняются следующие равенства:

ord(false)=0, ord(true)=1, false

pred(true)=false, succ(false)=true,

inc(true)=false, inc(false)=true,

dec(true)=false, dec(false)=true.

2. В символьный тип char входит 256 символов расширенной таблицы ASCII (например, "a", "b", "я", "7", "#"). Номер символа, возвращаемый функцией ord(), совпадает с номером этого символа в таблице ASCII.

3. Целочисленные типы данных сведем в таблицу:

Тип данных

Количество байтов

Диапазон

2147483648..2147483647

4. Перечисляемые типы данных задаются в разделе type явным перечислением их элементов. Например:

type week =(sun,mon,tue,wed,thu,fri,sat)

Напомним, что для этого типа данных:

inc(sat) = sun, dec(sun) = sat.

5. Интервальные типы данных задаются только границами своего диапазона. Например:

type month = 1..12;

budni = mon..fri;

6. Типы данных, конструируемые программистом, описываются в разделе type по следующему шаблону:

type <имя_типа> = <описание_типа>;

Например:

type lat_bukvy = "a".."z","A".."Z";

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

type int = integer;

можно немного сократить текст программы.

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

Напомним, что эти типы данных являются арифметическими, но не порядковыми.

Тип данных

Количество байтов

Диапазон (абсолютной величины)

1.5*10-45..3.4*1038

2.9*10-39..1.7*1038

5.0*10-324..1.7*10308

3.4*10-4932..1.1*104932

Конструируемые типы данных

Эти типы данных (вместе с определенными для них операциями) мы будем рассматривать далее на протяжении нескольких лекций.

Операции и выражения

Арифметические операции

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

Замечание: Все перечисленные ниже операции (за исключением унарных "-" и not) требуют двух операндов.

1. Логические операции (and – логическое И, or – логическое ИЛИ, not – логическое НЕ, xor – исключающее ИЛИ) применимы только к значениям типа boolean. Их результатом также служат величины типа boolean. Приведем таблицы значений для этих операций:

true false true

false false false

true false false

2. Операции сравнения (=, <>, >, <, <=, >=) применимы ко всем базовым типам. Их результатами также являются значения типа boolean.

3. Операции целочисленной арифметики применимы только к целым типам. Их результат - целое число, тип которого зависит от типов операндов.

a div b - деление а на b нацело (не нужно, наверное, напоминать, что деление на 0 запрещено, поэтому в таких случаях операция выдает ошибку). Результат будет принадлежать к типу данных, общему для тех типов, к которым принадлежат операнды.

Например, (shortint div byte = integer). Пояснить это можно так: integer - это минимальный тип, подмножествами которого являются одновременно и byte, и shortint.

a mod b - взятие остатка при делении а на b нацело. Тип результата, как и в предыдущем случае, определяется типами операндов, а 0 является запрещенным значением для b. В отличие от математической операции mod, результатом которой всегда является неотрицательное число, знак результата "программистской" операции mod определяется знаком ее первого операнда. Таким образом, если в математике (-2 mod 5)=3, то у нас (-2 mod 5)= -2.

a shl k - сдвиг значения а на k битов влево (это эквивалентно умножению значения переменной а на 2k). Результат операции будет иметь тот же тип, что и первый ее операнд (а).

a shr k - сдвиг значения а на k битов вправо (это эквивалентно делению значения переменной а на 2k нацело). Результат операции будет иметь тот же тип, что и первый ее операнд (а).

and,or,not,xor - операции двоичной арифметики, работающие с битами двоичного представления целых чисел, по тем же правилам, что и соответствующие им логические операции.

4. Операции общей арифметики (+, -, *, /) применимы ко всем арифметическим типам. Их результат принадлежит к типу данных, общему для обоих операндов (исключение составляет только операция дробного деления /, результат которой всегда относится к вещественному типу данных).

Другие операции

Существуют и другие операции, специфичные для значений некоторых стандартных типов данных языка Pascal. Эти операции мы рассмотрим в соответствующих разделах:

#, in, +, *, : см. лекцию 5 «Символы. Строки. Множества»

@, ^ : см. лекцию 7 «Адреса и указатели»

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

К арифметическим операциям примыкают и стандартные арифметические функции. Их список с кратким описанием мы приводим в таблице.

Функция

Описание

Тип аргумента

Тип результата

Абсолютное значение (модуль) числа

Арифметический

Совпадает с типом аргумента

Арктангенс (в радианах)

Арифметический

Вещественный

Косинус (в радианах)

Арифметический

Вещественный

Экспонента (ex)

Арифметический

Вещественный

Взятие дробной части числа

Арифметический

Вещественный

Взятие целой части числа

Арифметический

Вещественный

Натуральный логарифм (по основанию e)

Арифметический

Вещественный

Проверка нечетности числа

Значение числа

Вещественный

Округление к ближайшему целому

Арифметический

Округление "вниз" - к ближайшему меньшему целому

Арифметический

Синус (в радианах)

Арифметический

Вещественный

Возведение в квадрат

Арифметический

Вещественный

Извлечение квадратного корня

Арифметический

Вещественный

Арифметические выражения

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

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

Примеры арифметических выражений:

(x<0) and (y>0) - выражение, результат которого принадлежит к типу boolean;

z shl abs(k) - вторым операндом является вызов стандартной функции;

(x mod k) + min(a,b) + trunc(z) - сочетание арифметических операций и вызовов функций;

odd(round(x/abs(x))) - "многоэтажное" выражение.

Порядок вычислений

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

Таблица 2.1. Приоритеты (для всех) операций языка Pascal

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

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

Например, тип данных Integer в Delphi имеет диапазон -2147483648…2147483647, в то время как в Turbo Pascal тип данных Integer представляет числа в диапазоне -35768…32767. В Free Pascal диапазон значений типа Integer определяется выбранным режимом.

Так как Lazarus использует компилятор Free Pascal, то всё сказанное о типах данных по отношению к Free Pascal справедливо и для Lazarus.

Итак, целочисленные типы данных Free Pascal перечислены в таблице 13.1.

Таблица 13.1. Целочисленные типы данных Free Pascal (Lazarus).

Тип Размер, байт Диапазон значений
Byte 1 0…255
Shortint 1 -128…127
Smallint 2 -35768…32767
Word 2 0…65535
Integer 2 или 4 Зависит от режима компиляции
Cardinal 4 0…4294967295
Longint 4 -2147483648…2147483647
Longword 4 0...4294967295
Int64 8 -9223372036854775808...9223372036854775807
QWord 8 0...18446744073709551615

ПРИМЕЧАНИЕ
В Free Pascal типы Int64 и QWord не являются ! Это означает, что вы не можете использовать их, например, для индексных переменных в циклах. Однако я привёл их здесь, чтобы отдельно не описывать в будущем и собрать в одном месте все целочисленные типы Free Pascal. Если какие-то слова вам не понятны - не пугайтесь. В своё время я обо всём расскажу подробнее.

А теперь несколько пояснений к таблице.

В колонке ТИП приведены идентификаторы типов данных (ключевые слова, которые указывают компилятору, к какому типу относятся те или иные данные). Как использовать эти идентификаторы, вы узнаете в следующих уроках.

В колонке РАЗМЕР указан размер, который занимает тип данных в памяти компьютера. Например, целое положительное число можно представить разными типами: Byte , Word , Cardinal и др. Однако число типа Cardinal будет занимать в памяти 4 байта, в то время как число типа Byte – всего лишь 1 байт. Поэтому, если вы точно знаете, что число, с которым вы работаете, никогда не примет значение больше 255, то лучше определять его как тип Byte , так как это позволит сэкономить место в памяти компьютера. Хотя здесь не всё так однозначно (нюансы распределения памяти и других ресурсов компьютера выходят за рамки ).

В колонке ДИАПАЗОН указан диапазон значений, которым оперирует тип данных. Например, число типа Byte может принимать значения от 0 до 255.

А теперь практика. Напишем программу, которая выводит на экран диапазоны значений всех целочисленных типов данных. Исходный код этой программы приведён ниже:

Листинг 13.1. Программа вывода на экран диапазонов целых чисел. program td; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes { you can add units after this }; begin Writeln("Byte: ", Low(Byte), "..", High(Byte)); Writeln("Shortint: ", Low(Shortint), "..", High(Shortint)); Writeln("Smallint: ", Low(Smallint), "..", High(Smallint)); Writeln("Word: ", Low(Word), "..", High(Word)); Writeln("Integer: ", Low(Integer), "..", High(Integer)); Writeln("Cardinal: ", Low(Cardinal), "..", High(Cardinal)); Writeln("Longint: ", Low(Longint), "..", High(Longint)); Writeln("Longword: ", Low(Longword), "..", High(Longword)); Writeln("Int64: ", Low(Int64), "..", High(Int64)); Writeln("QWord: ", Low(QWord), "..", High(QWord)); Readln; end.

Стандартная функция Low определяет минимальное значение типа данных. Фунцкия High определяет максимальное значение. С функциями WriteLn и ReadLn вы уже немного знакомы. Более подробно о подпрограммах (процедурах и функциях) мы будем говорить в соответствующем разделе .

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

10
178
35278

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

Free Pascal поддерживает четыре формата записи целого числа:

  1. Десятичная запись . Просто число, например 10.
  2. Шестнадцатеричная запись . Число с префиксом $. Например, шестнадцатеричное число $10 равно десятичному 16.
  3. Восьмеричная запись . Число с префиксом &. Например, восьмеричное число &10 равно десятичному 8.
  4. Двоичная запись . Число с префиксом %. Например, двоичное число %10 равно десятичному 2.

Домашнее задание:

Создайте программу, которая выводит на экран диапазоны значений целых чисел (листинг 13.1). Откомпилируйте программу и запустите её. Убедитесь, что эти значения соответствуют указанным в таблице 13.1.

В исходном коде программы найдите строку, которая задаёт режим компиляции:

{$mode objfpc}{$H+}

В этой строке вместо слова objfpc напишите слово tp . То есть итоговая строка должна выглядеть так:

{$mode tp}{$H+}

Запустите программу. Посмотрите диапазон значений типа Integer . Сделайте выводы.

Учитесь думать как программист, то есть логически. Никто вам до пенсии не будет всё разжёвывать, как это делаю сейчас я. Надо привыкать думать самостоятельно. Иначе вы скатитесь к “обезьяньему принципу обучения”, и тогда ваши шансы стать классным программистом приблизятся к нулю. Чтобы помочь вам не скатиться на уровень “зубрёжки”, я буду периодически оставлять пробелы в вашем обучении, чтобы вы постарались сами додуматься до каких-то вещей.

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

3.2. Простые типы данныхв Turbo Pascal 7

Простой тип определяет упорядоченное множество значений параметра. В Turbo Pascal имеются следующие группы простых типов:

  • целые типы;
  • логический тип;
  • символьный тип;
  • перечисляемый тип;
  • тип-диапазон;
  • вещественные типы.

Все простые типы, за исключением вещественных, называются порядковыми типами. Для величин порядковых типов определены стандартные процедуры и функции: Dec, Inc, Ord, Pred, Succ (см. п. 13.1).

3.2.1. Целые типы

В отличие от языка Паскаль, где определен единственный целый тип Integer, в Turbo Pascal имеется пять стандартных типов целых чисел: Shortint, Integer, Longint, Byte, Word. Характеристики этих типов приведены в табл. 2.

Таблица 2. Целые типы данных

Тип Диапазон Формат Размер в байтах
Shortint -128 .. 127 Знаковый 1
Integer -32768 .. 32767 Знаковый 2
Longint -2147483648 .. 2147483647 Знаковый 4
Byte 0 .. 255 Беззнаковый 1
Word 0 .. 65535 Беззнаковый 2

3.2.2. Логический тип

Стандартный логический тип Boolean (размер - 1 байт) представляет собой тип данных, любой элемент которого может принимать лишь два значения: True и False. При этом справедливы следующие условия:
False Ord (False) = 0
Ord (True) = 1
Succ (False) = True
Pred (True) = False

В Turbo Pascal 7.0 добавлено еще три логических типа ByteBool (размер - 1 байт), WordBool (размер - 2 байта) и LongBool (размер - 4 байта). Они введены для унификации с другими языками программирования и со средой Windows. Отличие их от стандартного типа Boolean заключается в фактической величине параметра этого типа, соответствующей значению True. Для вех логических типов значению False соответствует число 0, записанное в соответствующее количество байтов. Значению же True для типа Boolean соответствует число 1, записанное в его байт, а для других типов значению True соответствует любое число, отличное от нуля (хотя функция Ord в этом случае дает значение 1).

3.2.3. Символьный тип

Стандартный символьный тип Char определяет полный набор ASCII-символов. Функция Ord от величины типа Char дает код соответствующего символа. Сравниваются величины символьного типа по своим кодам.

3.2.4. Перечисляемый тип

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

type
= ();)

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

Пример. Перечисляемый тип.

type Operat = (Plus, Minus, Mult, Divide);

Логический тип является частным случаем перечисляемого типа:

type Boolean = (False, True);

3.2.5. Тип-диапазон

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

type = . . ;

Минимальное значение при определении такого типа не должно быть больше максимального.

Пример. Определение типов-диапазонов.

type
Dozen = 1..12; {числа от 1 до 12}
AddSub = Plus..Minus; {операции сложения и вычитания}

3.2.6. Вещественные типы

В отличие от стандарта языка Паскаль, где определен только один вещественный тип Real, в Turbo Pascal имеется пять стандартных вещественных типов: Real, Single, Double, Extended, Соmр. Характеристики этих типов см. в табл. 3. Таблица 3. Вещественные типы данных

Тип Диапазон Число значащих цифр Размер в байтах
Real 2.9*10-39..1.7*1038 11-12 6
Single 1.5*10-45..3.4*1038 7-8 4
Double 5.0*10-324.-1.7*10308 15-16 8
Extended 3.4*10-4932..1.1*104932 19-20 10
Comp -263+1..263-1 19-20 8

Тип Comp фактически является типом целых чисел увеличенного диапазона, однако порядковым не считается.

Типы Single, Double, Extended и Comp можно использовать в программах только при наличии арифметического сопроцессора или при включенном эмуляторе сопроцессора (см. пп. 17.5.8 и 17.7.1).

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

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

По способу представления и обработки типы данных бывают:

  • простые
  • структурированные
  • указатели
  • объекты
  • процедуры

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

Целочисленный тип

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

Тип Диапазон Размер в байтах
shortint -128…127 1
integer -32 768…32 767 2
longint -2 147 483 648…2 147 483 647 4
byte 0…255 1
word 0…65 535 2

Объявить целочисленную переменную можно в разделе Var, например:

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

Вещественный тип

В Паскале бывают следующие вещественные типы данных:

Тип Диапазон Память, байт Количество цифр
Real 2.9e-39 … 1.7e38 6 11-12
Single 1.5e-45 … 3.4e38 4 7-8
Double 5.0e-324 …1.7e308 8 15-16
Extended 3.4e-4932 … 1.1e493 10 19-20
Comp -9.2e63 … (9.2e63)-1 8 19-20

Над ними может быть выполнено большее количество операций и функций, чем над целыми. Например, эти функции возвращают вещественный результат:

sin(x) – синус;

cos(x) – косинус;

arctan(x) – арктангенс;

ln(x) – натуральный логарифм;

sqrt(x) – квадратный корень;

exp(x) – экспонента;

Логический тип

Переменная, имеющая логический тип данных может принимать всего два значения: true (истина) и false (ложь). Здесь истине соответствует значение 1, а ложь тождественная нулю. Объявить булеву переменную можно так:

Над данными этого типа могут выполняться операции сравнения и логические операции: not , and, or, xor.

Символьный тип

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

  1. как одиночный символ, заключенный в апострофы: ‘W’, ‘V’, ‘п’;
  2. указав код символа, значение которого должно находиться в диапазоне от 0 до 255.
  3. при помощи конструкции ^K, где K – код управляющего символа. Значение K должно быть на 64 больше кода соответствующего управляющего символа.

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

Succ(x) - возвращает следующий символ;

Pred(x) - возвращает предыдущий символ;

Ord(x) - возвращает значение кода символа;

Chr(x) - возвращает значение символа по его коду;

UpCase(x) - переводит литеры из интервала ‘a’..’z’ в верхний регистр.

Для плодотворной работы с символьным типом рекомендую пользоваться .

Строковый тип

Строка в Паскале представляет собой последовательность символов заключенных в апострофы, и обозначается словом String . Число символов (длина строки) должно не превышать 255. Если длину строки не указывать, то она автоматически определиться в 255 символов. Общий вид объявления строковой переменной выглядит так:

Var <имя_переменной>: string[<длина строки>];

Каждый символ в строке имеет свой индекс (номер). Индекс первого байта – 0, но в нем храниться не первый символ, а длина всей строки, из чего следует, что переменная этого типа будет занимать на 1 байт больше числа переменных в ней. Номер первого символа – 1, например, если мы имеем строку S=‘stroka’, то S=s;. В одном из следующих уроков строковый тип данных будет рассмотрен подробнее.

Перечисляемый тип данных

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

Type Day=(Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);

Переменная A может принимать лишь значения определенные в разделе Type. Также можно объявить переменную перечисляемого типа в разделе Var:

Var A: (Monday, Tuesday);

К данному типу применимы операции отношения, при этом заранее определенно, что Monday

Интервальный тип данных

Когда необходимо задать какой то диапазон значений, то в таких ситуациях применяется интервальный тип данных. Для объявления используется конструкция m..n , где m – минимальное (начальное) значение, а n – максимально (конечное); здесь m и n являются константами, которые могут быть целого, символьного, перечисляемого или логического типа. Описываться величины интервального типа могут как в разделе типов, так и в разделе описания переменных.

Общий вид:

TYPE <имя_типа> = <мин. значение>..<макс. значение>;