Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Существует ряд стандартных функций и процедур для работы со строками.




· Функция Length (s) возвращает длину строки s.

· Функция Concat (s1,s2,..,sn) возращает строку s1+s2+..+sn.

· Функция Copy (s,p,k) возвращает фрагмент строки s, который начинается в позиции p и имеет длину k.

· Функция Pos (s1,s) ищет первое вхождение подстроки s1 в строку s и возвращает номер первого символа s1 в строке s или 0 если не нашли.

· Процедура Delete (s,p,k) удаляет из строки s фрагмент, который начинается в позиции p и имеет длину k.

· Процедура Insert (s,s1,p) вставляет в строку s подстроку s1, начиная с заданной позиции p.

 

Турбо Паскаль позволяет производить преобразования числовых значений в строковые и наоборот. Для этого используются процедуры:

Str (X:n:d,S) получает их числа X строку S с изображением этого числа, в которой не менее n символов и из них d знаков после запятой. Параметры n и d необязательные.

Val (S,X,e). получает из строки S число X. При успешном результате e=0.

Записи

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

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

Например, товар на складе описывается следующими величинами: наименование, количество, цена, наличие сертификата качества и т. д. В этом примере наименование – величина типа string, количество – integer, цена – real, наличие сертификата качества можно описать величиной типа boolean. Для записи комбинации объектов разных типов в Паскале применяется комбинированный тип данных – запись.

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

 

ОПИСАНИЕ ТИПА ЗАПИСЬ

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

Формат:

Имя типа = RECORD

список полей 1: тип 1;

- - -

список полей N: тип N;

CASE поле выбора: тип OF

значение 1: ( список полей 1: тип 1 );

.....

значение N: ( списокполей N: тип N )

END;

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

Список полей может состоять из двух разделов: постоянной и вариантной части. В постоянной части идет перечисление полей записи (идентификаторов) с указанием их типов. Синтаксис такой же, как в разделе var.

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

После описания постоянных полей может следовать вариантная часть, которая может быть только одна и имеет вид:

CASE поле выбора: тип OF

значение 1: (список полей 1);

- - -

значение N: (список полей N);

 

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

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

 

ПРИМЕР: Запись с вариантами.

var R = Record

rem: string;

Case byte of

3: (n:integer);

5: (x,y,z:char);

'a': (i,j:byte);

end;

Begin

R.rem:='запись с ваpиантами';

R.n:=25000;

write (R.i,R.x,R.j,R.y); {168и97a}

{ord('и')=168, ord('a')=97, 168+97*256=25000}

End.

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

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

• запись может иметь только одну вариантную часть, причем вариантная часть должна размещаться в конце записи;

• если поле, соответствующее какой-либо метке, является пустым, то оно записывается следующим образом: <метка>: ();

 

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

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

WITH переменная DO оператор;

Здесь переменная - это запись, за которой может следовать список вложенных полей,

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

 

type

RecType= Record

x,y: Word;

ch: Char;

dim: Array[1..3] of Byte

end;

const

Rec: RecType= (x: 127; y: 255;

ch: 'A';

dim: (2, 4, 8));

Множества

Понятие множества в языке ПАСКАЛЬ основывается на математическом представлении о множествах: это ограниченная совокупность различных элементов. Для построения конкретного множественного типа используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество, называется базовым типом.

Множественный тип описывается с помощью служебных слов Set of, например:

 

type M= Set of B;

 

Здесь М - множественный тип, В - базовый тип.

Пример описания переменной множественного типа:

 

type

M= Set of 'A'..'D';

var

MS: M;

 

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

var

C: Set of 0..7;

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

['A', 'C'] [0, 2, 7] [3, 7, 11..14].

Константа вида [ ] означает пустое подмножество.

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

 

var P: 1..3;

 

Эта переменная может принимать три различных значения - либо 1, либо 2, либо 3. Переменная Т множественного типа

 

var T: Set of 1..3;

может принимать восемь различных значений:

[ ] [1,2]

[1] [1,3]

[2] [2,3]

[3] [1,2,3]

Порядок перечисления элементов базового типа в константах безразличен.

Значение переменной множественного типа может быть задано конструкцией вида [T], где T - переменная базового типа.

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

 

['A','B'] + ['A','D'] даст ['A','B','D']

['A'] * ['A','B','C'] даст ['A']

['A','B','C'] - ['A','B'] даст ['C'].

 

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

К множественным величинам применимы операции: тождественность (=), нетождественность (<>), содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип, например:

 

['A','B'] = ['A','C'] даст FALSE

['A','B'] <> ['A','C'] даст TRUE

['B'] <= ['B','C'] даст TRUE

['C','D'] >= ['A'] даст FALSE.

 

Кроме этих операций для работы с величинами множественного типа в языке ПАСКАЛЬ используется операция in проверяющая принадлежность элемента базового типа, стоящего слева от знака операции, множеству, стоящему справа от знака операции. Результат выполнения этой операции - булевский. Операция проверки принадлежности элемента множеству часто используется вместо операций отношения, например:

A in ['A', 'B'] даст TRUE,

2 in [1, 3, 6] даст FALSE.

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

['A','B','C','D']

представлено в памяти ЭВМ битовой строкой

1 1 1 1.

 

Подмножества этого множества представлены строками:

['A','B','D'] 1 1 0 1

['B','C'] 0 1 1 0

['D'] 0 0 0 1

Величины множественного типа не могут быть элементами списка ввода - вывода.

В каждой конкретной реализации транслятора с языка ПАСКАЛЬ количество элементов базового типа, на котором строится множество, ограничено. В TURBO PASCAL количество базовых элементов не должно превышать 256.

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

 

const seLit: Set of 'A'..'D'= [];

Проиллюстрируем применение данных множественного типа на примере.

Работа с файлами

Введение файлового типа в язык ПАСКАЛЬ вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных.

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

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

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

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

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

 

'c:\ABC150\pr.pas'

'lab3.pas'.

 

Операционная система MS-DOS не делает особого различия между файлами на дисках и лентах и устройствами ЭВМ и портами коммуникаций. В TURBO PASCAL могут использоваться имена устройств и портов, определенные в MS-DOS, например:

 

'CON', 'LPT1', 'PRN', 'COM1', 'AUX', 'NUL'.

 

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

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

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

Файл

Элемент1 Элемент2 Элемент3 · · ·

Текущий указатель

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

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

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

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

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

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

Средства обработки файлов.

TURBO PASCAL вводит ряд процедур и функций, применимых для любых типов файлов: Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult.

 

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

 

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

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

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

 

Процедура Reset (var f) открывает логический файл f для последующего чтения данных или, как говорят, открывает входной файл. После успешного выполнения процедуры Reset файл готов к чтению из него первого элемента.

Имеются некоторые отличия в использовании процедуры Reset при открытии различных типов файлов. В отношении текстовых файлов (тип Text) действие процедуры означает открытие файла только для чтения. Дня нетипизированных файлов в описание процедуры добавляется еще один параметр RecSize типа word, который устанавливает длину записи для функций обмена с файлом.

 

Процедура Rewrite(var f) открывает логический файл f для последующей записи данных (открывает выходной файл). После успешного выполнения этой процедуры файл готов к записи в него первого элемента.

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

При открытии новых нетипизированных файлов для задания длины записи в описание процедуры Rewrite добавляется дополнительный параметр RecSize типа word.

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

 

Процедура Close(var f) закрывает открытый до этого логический файл.

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

 

Логическая функция EOF(var f): Boolean возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

 

Процедура Rename(var f; NewName: String) позволяет переименовать физический файл на диске, связанный с логическим файлом f. Переименование возможно после закрытия файла.

 

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

 

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

При обращении к стандартным функциям и процедурам ввода/вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение. Иногда это не удобно. С помощью директив компилятора {$I+} и {$I-} автоматическую проверку ошибок ввода/вывода можно включить или выключить. Если автоматическая проверка отключена, ошибки ввода/вывода, возникающие при работе программы, не приводят к ее останову. Стандартная функция IOResult возвращает код ошибки. Использование этой функции в программах возможно лишь в том случае, если на время выполнения файловых операций отключена стандартная проверка операций ввода-вывода. Нулевое значение кода ошибки означает нормальное завершение операции ввода/вывода.

 

Рассмотренные операции ввода-вывода охватывают все типы файлов в Турбо Паскале и характеризуют взаимоотношения файловой и операционной систем.

Текстовые файлы

Текстовый файл содержит последовательность символов, организованных в строки, причем каждая строка заканчивается специальным символом возврата каретки CR=#13 и перевода строки LF=#10. Эти два символа задают стандартные действия по управлению текстовыми файлами. Стандартно открываемые предопределении файлы Input и Output в модуле System имеют тип Text. Заканчивается файл признаком конца файла.

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

var f: Text; {F — файловая переменная}

Далее переменная f сопоставляется внешнему файлу на диске или какому-нибудь устройству процедурой Assign:

Assign(in_file, ‘primer.txt’);

Assign(in_file, ‘C:\text\primer.txt’);

Assign(in_file, ‘prn’);

 

После установления связи внешнего файла с файловой переменной внешний фал надо открыть для записи или чтения. Текстовый файл можно открыть процедурой Reset(my_file) только для чтения, процедурой Rewrite(my_file) – только для записи, и процедурой Append(my_file) – для добавления информации.

 

Procedure Reset(var F) Открывает существующий файл, связанный с файловой переменной F. При отсутствии файла, выдается сообщение об ошибке. Текущий указатель устанавливается в начало файла. Текстовый файл открывается только для чтения
Procedure Rewrite(var F) Создает и открывает новый файл, связанный с файловой переменной F. Если файл с указанным именем уже существует, старый файл будет стерт, а на его месте создан новый пустой файл. Текущий указатель устанавливается в начало файла
Procedure Append(var F: text) Открывает существующий файл, связанный с файловой переменной F, для добавления в него новых записей

 

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

Для записи в текстовый файл или чтения из него можно использовать процедуры Write, WriteLn, Read, ReadLn. В этом случае в качестве первого параметра в этих процедурах указывается файловая переменная, например: Read(f, a, x).

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

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

 

Procedure Read(var F:Text, v1,…) Считывает одно или несколько значений из файла, связанного с файловой переменной F, в одну или несколько переменных v1,…
Procedure ReadLn(var F:Text, v1,…) То же, что и Read, но выполняет после считывания пропуск до начала следующий строки текстового файла
ReadLn(F) пропускает строку до начала следующей;
Procedure Write(var F:Text, v1,…) Записывает в файл, связанный с файловой переменной F, одно или несколько значений, хранящихся в переменных v1,… Значения могут иметь целый, вещественный, строковый, символьный или булевский тип
Procedure WriteLn(var F:Text, v1,…) То же, что и Write, но затем записывает в текстовый файл признак конца строки
WriteLn(F) -   Завершает строку файла, в которую производится запись, признаком конца строки и переходит к началу следующей.

 

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

Function SeekEOF(var F: text): Boolean возвращает значение True, если до конца файла остались строки, заполненные пробелами.
Function SeekEOLn(var F: text): Boolean возвращает значение True, если до конца строки остались только пробелы.
Функция Eoln(var F: text) возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки

 

Типизированные файлы

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

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

 

Описание типизированного файла имеет вид:

 

var ftable: file of type_ID;

 

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

При работе с типизированными файлами используются уже знакомые процедуры Assign, Reset и ReWrite. Однако следует заметить, что текстовый файл, открытый процедурой Reset, доступен только для чтения, а типизированный – еще и для записи. Процедуры Read и Write здесь используются по-другому. Отличие заключается в том, что каждый из параметров в рассматриваемом случае должен быть переменной типа type_ID, а выражения и константы недопустимы. Процедуры ReadLn и WriteLn к типизированным файлам не применяются.

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

 

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

 

Function EOF(var F): Boolean Возвращает для файла, связанного с файловой переменной F, состояние End-Of-File (конец файла); True – если текущее положение указателя находится в конце файла или файл пустой; False – во всех остальных случаях
Function FilePos(var F): LongInt Возвращает текущую позицию для файла, связанного с файловой переменной F. При положении текущего указателя в начале файла возвращается нулевое значение
Function FileSize(var F): LongInt Возвращает текущий размер файла, связанного с файловой переменной F. Если файл пустой, возвращается нулевое значение
Procedure Seek (var F: N: LongInt) Перемещает текущую позицию в файле, связанным с файловой переменной F, на заданный элемент. Началу файла соответствует нулевое значение N
Процедура Truncate(var f) Устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.
   

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

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

var untypfile: file;

Такая файловая переменная связывается с внешним файлом обычным образом. В числе параметров процедур Reset и Rewrite для нетипизированных файлов кроме файловой переменной имеется необязательный второй параметр типа Word:

Reset(untypfile, n);

Rewrite(untypfile, n);

Дополнительный параметр n описывает размер индивидуальной записи в файле (в байтах). Если параметр n отсутствует, его значение по умолчанию принимается равным 128, однако рекомендуется явно указывать значение 1.

Для операций ввода/вывода в нетипизированных файлах используются следующие низкоуровневые операции:

Procedure BlockRead (var F: File; var Buf; Count:Word) Считывает из нетипизированного файла, связанного с файловой переменной F, одну или несколько записей (их количество задается целочисленным выражением Count) в переменную Buf
Procedure BlockWrite (var F: File; var Buf; Count:Word) Записывает в нетипизированный файл, связанный с файловой переменной F, одну или несколько записей (их количество задается целочисленным выражением Count) из переменной Buf

 

 

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...