Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник 140.docx
Скачиваний:
16
Добавлен:
30.04.2022
Размер:
209.86 Кб
Скачать
    1. Типы данных

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

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

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

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

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

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

Число отдельных значений, принадлежащих некоторому типу, называется «мощностью» типа. Например, мощность логического типа есть 2.

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

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

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

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

  1. В соответствии с описанием выделяется область памяти для переменных.

  2. Описание не определяет конкретное значение переменной, то есть считается, что в выделенной памяти при ее распределении (до использования) находится некоторый «мусор» (случайные неопределенные числа).

  3. Описание определяет способ представления элементов в памяти персонального компьютера (ПК). Например, вещественные переменные или константы в отличие от целых, представляются в машине в виде мантиссы и порядка.

  4. Описание определяет набор допустимых операций.

  5. Описание определяет область действия переменных (локальные или глобальные).

В Турбо Паскале можно выделить следующие основные типы:

- простые (скалярные);

- сложные (структурированные).

Среди типов есть стандартные (предопределенные) и определенные программистом.

В Паскале реализованы, в частности, следующие типы данных (рис.1):

а) простые типы:

- целые;

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

- логический;

- символьный;

- перечисляемый;

- тип-диапазон (ограниченный);

б) структурированные типы:

- массив;

- множество;

- запись;

- файл и другие.

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

Рис. 1. Типы данных

Все простые типы за исключением вещественных являются порядковыми (ординальными) типами.

ПРОСТЫЕ ТИПЫ ДАННЫХ

Целые типы

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

Таблица 1

Типы представления целых чисел в языке Паскаль

Тип

Диапазон

Размер в байтах

BYTE

(целое длиной в байт)

SHORTINT

(короткое целое)

INTEGER (целое)

WORD

(длиной в слово)

LONGINT

(длинное целое)

0..255

-128..127

-32768..32767

0..65535

-2147483648..2147483647

1

1

2

2

4

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

Данные вещественного (действительного) типа представлены в памяти ЭВМ приближенными значениями, поэтому и результат операции с этими числами является приближенным.

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

± m.n E±p,

где m – целая часть числа, n – дробная часть числа, Е – основание, равное 10, p – показатель степени.

В Турбо Паскале имеется пять стандартных вещественных типов (табл.2).

Таблица 2

Стандартные вещественные типы в языке Паскаль

Тип

Диапазон

Размер в байтах

REAL

(вещественный)

SINGLE

(с одинарной точностью)

DOUBLE

(двойной точностью)

EXTENDED

(повышенной точностью)

COMP

(сложный)

2.9·10-39 .. 1.7·1038

1.5·10-45 .. 3.4·1038

5.0·10-324 .. 1.7·10308

1.9·10-4951 .. 1.1·104932

-2·1063+1 .. 2·1063-1

6

4

8

10

8

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

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

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

Стандартный символьный тип CHAR (размер 1 байт) представляет собой символ (литеру) из набора символов данного компьютера. Каждой литере сопоставляется некоторый числовой эквивалент, служащий ее внутримашинным представлением и называемым кодом ASCII (американский стандартный код для обмена информацией). Полный перечень кодов ASCII приведен в приложении 3. Каждое значение CHAR имеет свой порядковый номер (код). Например, символ А имеет код 65, символ В имеет код 66, символ z имеет код 122. Величины символьного типа сравниваются по своим кодам, например, А<В, так как 65<66.

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

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

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

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

Пример: TYPE

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

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

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

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

var d1,d2,d3 : day;

означает, что переменные d1, d2, d3 типа day при выполнении программы могут принимать только одно из семи указанных значений. Объект, указанный в списке, может присутствовать не более, чем в одном описании. Например, описание

type t1= (one, two, three, four);

type t2 = (four, five, six);

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

Имена объектов, указанных в описании перечисляемого типа, являются константами этого типа. Поэтому, имея описания

type name = (John, Tom, Nick, Ann, Jane );

type color = (red, blue, black);

var x, y, z : name; c1, c2, c3 :color;

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

c1:= blue; x:= Ann; y:= Tom; c2:= red;

Нельзя присвоить переменной значение из описания другого типа, например, недопустимы присваивания

z:= black; c3:= Tom;

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

x>John , c2<c1, y<x имеют значение true.

Для объектов перечисляемых типов определены системные стандартные функции odd, pred и succ (таблица 8, стр.37), имеющие тот же смысл, что и для стандартных скалярных типов. Например, для типа color результатом функции succ (red) является значение blue, результатом функции pred (black) – blue. Функция ord (blue) (таблица 7, стр.37) выработает значение, равное единице, так как нумерация объектов в списке начинается с нуля.

Ограниченный тип

Множество значений стандартных скалярных типов данных и перечисляемых скалярных типов упорядочено и конечно (кроме вещественного типа). Подмножество последовательных значений порядкового типа, заданное минимальным и максимальным значениями, определяет тип-диапазон (интервальный, ограниченный тип). Границы разделяются двумя точками.

Пример: TYPE

Dozen = 1..12; {числа от 1 до 12}

Name = ′A′ .. ′ F ′; {буквы от A до F}

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

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

nom = 10 .. 25;

sss = ‘c’ .. ‘x’;

wd = sa .. su;

для ограниченного типа nom базовым является целый тип, для sss – символьный, для wd – определенный ранее перечисляемый тип day. Сначала указывается нижняя граница, потом верхняя (при этом нижняя граница не должна быть больше верхней). Попытка присвоить переменной ограниченного типа значение, не входящее в заданный диапазон, будет диагностирована как ошибка.

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

СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ

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

По способу организации структур различают: массив (ARRAY), запись (RECORD), множество (SET), файл (FILE).

Массив (Array) является структурированным типом данных, состоящим из упорядоченного набора значений одного типа, имеющих общее имя. Для обращения к отдельному значению из этого набора используется переменная с индексом (индексами). Количество индексов определяет размерность массива. Для одномерного массива любой элемент обозначается именем, после которого в квадратных скобках указывается порядковый номер (индекс) этого элемента в массиве. Для двумерного массива после имени в квадратных скобках указываются через запятую номер строки и номер столбца, на пересечении которых стоит интересующий нас элемент. В качестве индексов используются целые числа, переменные или арифметические выражения целого типа, численное значение которых к данному моменту определено. Тип индекса должен быть простым, содержащим конечное число элементов. Действительным тип индекса быть не может. Компоненты массива при записи ограничиваются [ и ]. Например,

array [ 1..80 ] of char; array[ 1 .. 5, 1 .. 3 ] of real;

Компонентная переменная как элемент массива называется индексированной переменной. Например, a[3], a[2,4].

Если индекс задается выражением, то тип выражения должен совпадать с индексным типом: b[i+1, j+1].

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

Общий вид:

type r = record v1 : t1;

v2 : t2;

………

vk : tk

end;

где vi – идентификатор (или список идентификаторов) поля (полей);

ti – тип поля (полей), является базовым по отношению к типу r;

r – имя типа.

Операции над объектами типа r – это доступ к отдельным полям записей посредством указания имен полей, а также изменения полей с помощью операций, применимых к базовым типам.

Например, пусть переменные x и y описаны в программе как переменные типа r:

var x,y : r;

Тогда для переменных одного и того же типа можно использовать оператор присваивания x:=y;

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

Пример. В Паскале отсутствует стандартный тип для комплексных чисел. Однако для их представления можно воспользоваться определением типа запись

type complex = record

re, im :real;

end;

var z : complex;

Здесь complex – имя типа, а z – имя переменной.

Переменная z состоит из двух полей re (от Real) и im (от Imaginary), имеющих один и тот же базовый тип (real). Обращение к этим полям осуществляется с помощью составных имен z.re и z.im соответственно.

z.re: = 5. 2; z.im: = 3.1;

Пример.

type date = record

d: 1.. 31;

m: 1 .. 12;

y: integer;

end;

var dt: date;

Для того, чтобы записать в dt дату 25.04.2017, надо выполнить следующие операторы

dt. d: = 25;

dt.m: = 4;

dt.y: = 2017;

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

Разрешается использовать тип записи (record) при описании других структурированных типов данных (например, можно построить массив записей).

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

Общий вид

with v do s;

Здесь v – имя переменной (или список имен переменных) типа record;

s – оператор (один).

В операторе s при ссылках на компоненты (поля) записи имя v можно опускать. Возвращаясь к предыдущему примеру, получим

with dt do

begin

d: = 25;

m: = 4;

y: = 2017

end;

Множественные типы данных (множества – Set) представляют собой ограниченный набор различных элементов базового типа – скалярный или ограниченный тип (рис. 2).

Рис. 2. Синтаксическая диаграмма множественного типа

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

Примеры записи:

type stud = 1.. 25;

grup = set of stud;

var stud 3, stud 4, stud5: grup;

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

Конструкция М.. N обозначает множество всех элементов I базового типа, для которых выполняется условие М <= I <= N. При М > N множество [М .. N] является пустым.

Например, если переменная определена как Set of 1..3, то она может принимать одно значение из множеств [1, 2, 3], [1,2], [1,3], [2,3], [1], [2], [3], [ ]. Каждое из этих значений является элементом базового типа множества.

Если множество состоит полностью или частично из диапазона упорядоченных значений, то можно использовать сокращенный вид записи. Например, [1,2,3,4,5,6] то же, что и [1..6].

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

type stud = 1..25;

var grup: set of stud;

stud 3, stud 4, stud 5: grup;

Ко всем объектам множественного типа применимы операции объединения ( + ), пересечения ( * ) и вычитания ( - ).

Объединением двух множеств называется множество элементов, принадлежащих к обоим множествам.

Пересечением двух множеств называется множество тех элементов, которые принадлежат одновременно двум множествам.

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

Пример. Если определены два множества

var p1 : set of ’A’..’F’;

p2 : set of 0..9;

то [ ’B’ , ’F’] + [ ’B’.. ’D’] = [ ’B’, ’C’, ’D’, ’F’ ];

[1,2] + [1,3] = [1,2,3];

[ 0..4 ] * [ 3..7 ] = [ 3,4]; [1,2] * [1,2,3] =[ 1,2]; [ 0..4 ] * [ 5,6 ] = [ ];

[ 1,5,9 ] – [ 2,4,8,9 ] = [ 1,5 ]; [1,2,3] – [1,2] = [3].

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

Пример. [2,3 ] = [0] результат false;

[1,3 ] = [ 3,1] результат true;

[1,2] < = [1,2,3] результат true ( содержится в );

[2,3] > = [1] результат false ( не содержится в ).

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

Например, определение типа

type

days = (mon, tue, wed, thu, sat, sun ) ;

months = ( yan, feb, mar, apr, may, jun, jul, aug,sep,oct, nov, dec);

а отношение feb in days примет значение false.

Проверка на принадлежность множеству используется в программах для исключения сложных условий. Так, выражение с использованием логических операций вида ( ch > = ’0’) and ( ch <=’9’) с использованием операции in имеет вид CH in [ ’0’ ..’9’].

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

Язык Паскаль допускает использование множественного типа в качестве любого другого структурированного типа (массива, записи), что значительно расширяет возможности языка.

Файл (File) – именованная область памяти персонального компьютера (ПК), предназначенная для хранения программы или данных.

Понятие файла распространяется также на логические устройства (логические имена, которые связаны со стандартными аппаратными средствами ПК, например, CON – клавиатура, экран дисплея, PRN – печатающее устройство и т. д.), рассматриваемые как потенциальные источники или приемники текстовой информации.

Любой файл имеет следующие характерные особенности:

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

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

  3. Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только ёмкостью памяти.

Существует три вида файлов:

  1. типизированные (file of …);

  2. текстовые (text);

  3. нетипизированные (file),

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

type

t1= file of < тип >;

t2 = text;

t3 = file;

Var f1, f2: t1;

f3, f4, f5: t2;

f6: t3;

где t1,t2,t3 – имена типов файлов (t1 – типизированный, t2 – текстовый, t3 – нетипизированный),

f1,f2, f3, f4, f5, f6 – имена файловых переменных,

< тип > – любой тип ТП, кроме файлов.

Вышеприведенное описание может быть представлено в следующей эквивалентной форме:

var f1, f2 : file of < тип >;

f3, f4, f5: text ;

f6: file;

Имя файла состоит из двух слов: имени и расширения, разделяемых точкой.

Пример: gg. pas gg. exe d1. dat.

Текстовый файл в ТР – это совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой.

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

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

Строка. В Турбо Паскале строковый тип STRING – последовательность символов произвольной длины (до 255 символов). У типа-строки в квадратных скобках может быть указан его размер от 1 до 255. Если размер строки не указан, то он считается равным 255.

Пример: Var

FAM: STRING [20];

TEL: STRING[12];

MAXSTR: STRING; {строка в 255 символов}

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

Например, ’A’, ’Х’, ’I’ – символьные константы;

’Шевалье д’’Артаньян’ – строка, при этом апостроф внутри строки записывается дважды.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]