Отрезок типа

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

<константа>.. <константа>

Обе константы должны иметь один и тот же порядковый тип. Отрезки типов, имеющие вид a..b, предполагают, что a меньше или равно b.

Приведем примеры отрезков типов:

0..99

128..127

club..heart

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

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

К вещественному типу относится подмножество вещественных чисел, которые могут быть представлены в формате с плавающей запятой и фиксированным числом цифр. Запись значения в формате с плавающей запятой обычно включает три значения - m, b и e - таким образом, что m × b ** e=n, где b всегда равен 10, а m и e являются целочисленными значениями в диапазоне вещественного типа. Эти значения m и e далее определяют диапазон представления и точность вещественного типа.

Имеется пять видов вещественных типов:

Real (вещественное),

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

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

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

сложное.

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

Сложный тип содержит только целочисленные значения в диапазоне от -2**63+1 до 2**63-1, что приблизительно равно -9.2x10**18 и 9.2x10**18.

Паскаль поддерживает две модели генерации кода для выполнения действий над вещественными типами: программную для чисел с плавающей запятой и аппаратную для чисел с плавающей запятой. Выбор соответствующей модели осуществляется с помощью директивы компилятора $N.

В состоянии $N-, которое устанавливается по умолчанию, генерируемый код выполняет все вычисления с вещественными типами программно, через вызов подпрограмм библиотеки исполняющей системы. Из-за соображений скорости и размера кода в этом состоянии допускаются только действия над переменными типа real (вещественное). Любая попытка оттранслировать операторы, выполняющие действия над типами с одинарной точностью, с двойной точностью, с повышенной точностью и над сложными типами, вызовет сообщение об ошибке.

В состоянии $N+ генерируемый код выполняет все вычисления над вещественными типами. Это состояние позволяет использовать все пять вещественных типов.

Строковые типы.

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

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

String [ n ],

где n – целое без знака в диапазоне 1..255.

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

Отношение между любыми двумя строковыми значениями устанавливается согласно отношению порядка между значениями символов в соответствующих позициях. В двух строках разной длины каждый символ более длинной строки без соответствующего символа в более короткой строке принимает значение «больше»; например, 'Xs' больше, чем 'X'. Нулевые строки могут быть равны только другим нулевым строкам, и они являются наименьшими строковыми значениями.

Тип массив.

Массив – это индексированная совокупность переменных одного типа. Массивы бывают одномерными и многомерными. В одномерных массивах элементы имеют один индекс, в многомерных – два и более.

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

array [n1.. n2] of <тип>;

где n1 и n2 – начальное и конечное значения индексов элементов массива. Заметим, что n1 и n2 могут быть любых перечислимых типов. При этом обращение к элементам массива осуществляется в следующей форме: <имя массива>[i], где i – индекс, принадлежащий диапазону [n1, n2].

Например, если задан массив:

a: array [1..3] of integet;

то его элементами будут a[1], a[2], a[3], причем все три элемента являются переменными целыми типа.

Многомерный массив можно задать один из следующих двух способов:

1. array [n1.. n2, m1.. m2,…,k1.. k2] of <тип>;

2. array [n1.. n2][m1.. m2]…[k1.. k2] of <тип>;

В первом случае элементы массива имеют формат:

<имя массива> [i, j,…,k], где i, j и k – индексы.

Во втором случае формат следующий:

<имя массива> [i][j]…[k].

При задании массива можно сразу задать значения его элементов (инициализировать массив). Для этого после описания массива ставится знак равенства «=» и в круглых скобках через запятую перечисляются значения всех его элементов.

Тип запись.

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

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

Записи с фиксированными полями объявляются в следующем формате:

Record

<имя поля 1>: <тип>;

………………………

<имя поля n>: <тип>

end;

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

Синтаксис обращения к полям записи следующий:

<имя записи>. <имя поля>

В том случае, если доступ к полям записи осуществляется многократно, целесообразно обращаться к полям записи с использованием оператора присоединения with:

with <имя записи/поля> do <имя поля> := <значение>;

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

Тип множество.

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

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

Множественный тип объявляется как совокупность элементов некоторого базового типа.

set of <базовый тип>;

Допускается объявлять только конечные множества, количество элементов которых может меняться от 0 до 255.

Базовым типом может быть любой порядковый тип за исключением типов integer и longint, количество возможных значений которых превышает 255. В качестве базового типа могут использоваться только диапазоны значений этих типов.

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

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

Для работы со значениями множественного типа предусмотрены специальные операции, в основном соответствующие операциям, определенным в теории множеств: объединение, пересечение и разность множеств. Это двуместные операции, операндами которых являются данные множественного типа - множества и выражения, принимающие значение множественного типа. Оба операнда должны принадлежать одному и тому же множественному типу. В Паскале операции объединения соответствует символ «+», пересечению – «*», дополнению – «-».

Наряду с рассмотренными выше операциями над значениями множественного типа определены и операции отношения. Операндами отношений в этом случае являются переменные или выражения множественного типа.

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

<выражение> in <множество>

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

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

Файловый тип.

С точки зрения программирования под файлами понимают именованную последовательность элементов данных (компонент файла), расположенных, как правило, во внешней памяти: на дискетах, винчестере, CD или других устройствах хранения информации, также устройствах ввода-вывода. В файле может храниться текст, программа, числовые данные, графическое изображение и т.д. Для организации работы с файлами программа на Паскале взаимодействует с операционной системой MS DOS.

Как сказано выше, каждый файл обязательно имеет имя. Имена файлов в MS DOS подчиняются определенным правилам:

1. имя файла должно содержать не менее одного и не более восьми символов;

2. имя файла может иметь расширение, которое отделяется от имени точкой и содержит не более трех символов;

3. для записи имен и расширений могут использоваться строчные и прописные буквы латинского алфавита a-z, A-Z, арабские цифры и некоторые специальные символы, например, символ подчеркивания «_» или знак доллара «$»;

4. в качестве имен запрещается использовать некоторые буквенные сочетания, которые зарезервированы операционной системой для обозначения устройств, например: PRN, CON, NUL, COMI, COM2, AUX, LPT1, LPT2, LPT3.

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

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

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

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

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

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

CON - консоль: при выводе данных соответствует экрану, при вводе- клавиатуре;

PRN - принтер;

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

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

Доступ к компоненту файла осуществляется через указатель файла. При выполнении операции чтения или записи указатель автоматически перемещается на следующий компонент.

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

Типизированные файлы. Файловая переменная типизированного файла описывается так:

type <имя файловой переменной> = file of <тип>,

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

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

Текстовые файлы - тип файловой переменной описывается так:

tуре <имя файловой переменной> = text;

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

Нетипизированные файлы:

tуре <идентификатор файловой переменной> = file;

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

Работа с файлом включает:

1. инициализацию файловой переменной - установление связи файловой переменной с файлом;

2. открытие файла - подготовку файла для выполнения операций ввода/вывода;

3. обработку компонентов файла - выполнение операций ввода-вывода;

4. закрытие файла (при повторном открытии файл закрывается автоматически).

Инициализация файловой переменной. Связь между физическим устройством (дисководом или внешним устройством) и файловой переменной устанавливается специальной процедурой.

Процедура Assign (f; st:string) - инициализирует файловую переменную f, связывая ее с файлом или логическим устройством, определенным строкой st.

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

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

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

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

При открытии для чтения несуществующего файла регистрируется ошибка выполнения, а функция IOResult типа Word возвращает значение, отличное от 0 (см. далее описание функции). Отключив контроль операций ввода-вывода и используя функцию IOResult, можно организовать проверку наличия файла с указанным именем на диске.

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

Логическое устройство при этом подготавливается к приему информации.

3. Процедура AppEnd (f) - открывает текстовый файл, определенный файловой переменной f (должна быть только типа text), для добавления строк. При открытии для добавления строк указатель файла устанавливается на конец файла, и, соответственно, все строки, выводимые в файл, дописываются к уже существующему файлу.

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

INPUT - чтение со стандартного устройства ввода;

OUTPUT - вывод на стандартное устройство вывода.

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

Стандартным устройством ввода MS DOS по умолчанию является клавиатура. Стандартным устройством вывода - экран дисплея.

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

· создание файла - занесение в файл требуемых записей;

· модификация файла - изменение всех или нескольких записей, добавление и удаление записей;

· поиск нужной информации в файле.

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

Закрытие файла. Закрытие файла, открытого для записи или чтения, осуществляется процедурой Close (f).

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

Стандартные процедуры и функции обслуживания файлов. Для взаимодействия с файловой системой MS DOS в Паскале определены стандартные процедуры и функции, которые применимы к файлам любых типов.

1. Процедура ReName (f; name) - осуществляет переименование файла, определенного файловой переменной f. Новое имя файла задается параметром name (строкового типа). Если в процессе работы программы требуется переименовать файл, открытый для чтения или записи, необходимо предварительно закрыть этот файл. При совпадении нового имени файла с каким-либо уже существующим выдается сообщение об ошибке.

2. Процедура Erase (f) - осуществляет удаление созданного или находящегося в процессе формирования файла. Перед уничтожением файл должен быть закрыт, так как разрешается удалять только закрытые файлы.

3. Функция EOF (f) (результат всегда логического типа) - определяет конец файла. Как было отмечено выше, размер файла при его создании не фиксируется. Поэтому в процессе работы требуется проверка достижения конца файла. Функция принимает значение TRUE, если указатель стоит в конце файла (после последней записи). При этом, если производится чтение, то это означает, что файл исчерпан, а если идет запись, то новая запись дописывается в конец файла. Функция принимает значение FALSE, если конец файла еще не достигнут.

4. Функция IOResult (f) (результат типа word) - возвращает код правильности выполнения операций ввода/вывода. Если ошибок не зафиксировано, то функция возвращает 0. Информация об ошибках может быть получена и обработана в режиме компилятора {$!-} - отключение контроля ошибок ввода/вывода.

5. Процедура Truncate (f) - обрезает файл, оставляя компоненты до того, на который ссылается указатель файла (кроме текстовых файлов).

6. Процедура ChDir (path) - изменяет текущий каталог: назначает текущим каталог, указанный параметром path (строкового типа).

7. Процедура GetDir (drive; dir) - возвращает имя текущего каталога на указанном устройстве, где устройство drive (типа word): 0 – устройство по умолчанию; 1 - диск А; 2 - диск В и т.д.

8. Процедура MkDir (dir) - создает новый каталог. Строка dir определяет путь и новое имя.

9. Процедура RmDir (dir) - удаляет каталог с указанным именем. Каталог должен быть пустым.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: