Машинное представление множества 


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



ЗНАЕТЕ ЛИ ВЫ?

Машинное представление множества



В памяти множества хранятся очень компактно: каждому элементу базового типа выделяется один бит. Таким образом, тип множество занимает (n-1)div8+1 байтов, где n - число элементов базового типа. Значением типа множество является подмножество тех элементов базового типа, которым соответствуют ненулевые биты.

Операции над множествами

Над множествами Паскаля определены общепринятые в математике операции: пересечение (*), объединение (+) и вычитание (-). В скобках указан знак операции. Кроме этого, определены следующие операции отношения:

1) равенство множеств (=);

2) неравенство множеств (<>);

3) левый операнд - подмножество правого операнда (<=);

4) правый операнд - подмножество левого операнда (>=);

5) принадлежность элемента множеству (in).

Логическое выражение «Символ сh - латинская буква» может быть компактно записано с помощью операции проверки принадлежности элемента множеству: сh in [‘a’..‘z’, ‘A’..‘Z’].

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

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

Приоритеты операций в порядке убывания:

1) пересечение;

2) объединение и вычитание;

3) операции отношения.

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

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

Program single_char;

var c: char;

s, sd: set of char;

begin

s:=[ ]; {Инициализация множества входных символов}

sd:=[ ]; {Инициализация множества повторяющихся символов}

repeat

read(c);

if c in s

then sd:=sd+[c] {Накопление множества повторяющихся символов}

else s:=s+[c]; {Накопление множества всех символов}

until c='.';

s:=s-sd-[‘.’]; {Получение множества неповторяющихся символов}

writeln(‘ Неповторяющиеся символы входной последовательности:’)

for c:=#33 to #255 do

if (c in s) then write(c:3)

end.

 

25. ФАЙЛЫ

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

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

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

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

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

Последовательный файл обрабатывается сначала. Нельзя обработать n-ю запись, не обработав (n-1)-ю. Обработка представляет собой или только чтение или только запись.

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

 

Файлы в Паскале

 

В стандартном Паскале все файлы обрабатываются как последовательные.

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

В ТР связь между логическим и физическим файлами устанавливается процедурой Assign(var f:<файл>, f_name:string).

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

var f:text; {Описание файловой переменной}

... {Другие описания}

begin Assign(f, ’A:\LAB\myfile.txt’);

... {Операторы}

end.

 

После связи логического файла с физическим файл должен быть открыт одной из процедур: Reset(f:<файл>) или Rewrite(f:<файл>).

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

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

Функция EoF(f:<файл>):boolean позволяет определить, достигнут ли конец файла. Она возвращает true, если указатель файла находится в конце файла, и false - в противном случае.

Завершается работа с файлом обращением к процедуре закрытия файла Close(var f:<файл>).

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

Процедура ReName (f:<файл>; new_name: string) переименовывает физический файл, связанный с логическим файлом f. После ее выполнения именем файла будет значение переменной new_name.

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

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

Логический файл в Паскале может быть текстовым или типизованным, в ТР помимо этого - нетипизованным.

 

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

Текстовый файл представляет собой последовательность символов, которые сформированы в строки. Признаком конца строки служит символ #13 (CR), он может быть объединен с символом перевода строки #10 (LF). Конец файла - символ #26 (^Z).

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

SetTextBuf(var f:text; var Buf [; BufSize:word]).

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

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

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

Append(var f:text).

Чтение и запись выполняются процедурами Read и Write или Readln, Writeln так же, как и при стандартном вводе-выводе, но в качестве первого параметра должна быть файловая переменная, например: read(f, i, r), f - файловая переменная.

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

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

Функция Eoln(var f:text):boolean позволяет определить, достигнут ли конец строки. Если указатель установлен на конец строки, функция возвращает true, иначе - false.

Функция SeekEoln(var f:text):boolean возвращает значение true, если между указателем файла и концом текущей строки находятся только пробелы и символы табуляции, иначе - false.

Функция SeekEoF(var f:text):boolean возвращает значение true, если между указателем файла и концом файла находятся только пробелы, символы табуляции и символы перехода к новой строке, иначе - false.

Функции SeekEoln и SeekEoF обычно используются при считывании из файла числовых данных.

 

 


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

Типизованный файл - это последовательность данных одного типа (базового). Его описание:

 
 

 


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

Данные в типизованных файлах хранятся в машинном представлении.

При работе с типизованными файлами ввод-вывод выполняется процедурами read(f,<список переменных>), write(f,<список переменных >). Все переменные в списках ввода и вывода должны иметь базовый тип файла.

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

 

Пример 3. В файле записаны квадратные матрицы 3-го порядка. Сохранить в файле с таким же именем только первые строки каждой из матриц данного файла.

Type t_row=array[1..3] of real;

t_matr=array[1..3] of t_row;

Var f_matr:file of t_matr;

f_row:file of t_row;

a:t_matr;

s:string;

Begin write(‘ Введите имя файла матриц ’); readln(s);

Assign(f_matr, s);

Assign(f_row, ’temp’);{temp - временный внешний файл}

Reset(f_matr);

Rewrite(f_row);

while not Eof(f_matr) do

begin

read(f_matr, a);

Rewrite(f_row, a[1])

end;

Close(f_marr);

Close(f_row);

Erase(f_matr);

Rename(f_row, s)

End.

 

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

 

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

Нетипизованный файл (файл с именем типа file) - последовательность записей фиксированного размера. Размер записей равен размеру буфера, определяемого при открытии файла процедурами

Reset(var f:file[; BufSize:word]) или Rewrite(var f:file[; BufSize:word]).

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

Для чтения из нетипизованного файла используется процедура

BlokRead (var f:file; var Buf; Count:word [;var Result:word]),

а для записи -

BlokWrite (var f:file; var Buf; Count:word [;var Result:word]).

Параметр Buf указывает, откуда считывать или куда записывать данные. Count - количество блоков, которые должны быть считаны или записаны. При этом должно выполняться условие Cоunt*BufSize<64Кб.

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

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

 



Поделиться:


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

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