Скачать презентацию function IOResult Integer возвращает — число 0 если Скачать презентацию function IOResult Integer возвращает — число 0 если

lec_06_07.ppt

  • Количество слайдов: 46

function IOResult: Integer; возвращает - число 0, если последняя операция ввода/вывода завершилась успешно, - function IOResult: Integer; возвращает - число 0, если последняя операция ввода/вывода завершилась успешно, - другое число в противном случае. При использовании IOResult необходимо установить директиву игнорирования ошибок ввода/вывода (I/O-checking) {$I-} или в Delphi {$IOChecks off} а затем вновь ее переключить {$I+} или в Delphi {$IOChecks on} 1

var Vf: file of Byte; begin Assign. File(Vf, 'myfile. txt'); {$I-} Reset(Vf); if IOResult<>0 var Vf: file of Byte; begin Assign. File(Vf, 'myfile. txt'); {$I-} Reset(Vf); if IOResult<>0 then Message. Dlg('Ошибка открытия файла', mt. Error, [mb. Ok], 0); {$I+}. . . end; 2

Нетипизированные, или бестиповые файлы Бестиповые файлы применяются для быстрой работы с данными на физическом Нетипизированные, или бестиповые файлы Бестиповые файлы применяются для быстрой работы с данными на физическом уровне в соответствии с их внутренним форматом. Объявление файловой переменной: var f: file; 3

Процедуры и функции для работы с бестиповыми файлами procedure Reset(F, Size); procedure Rewrite(F, Size); Процедуры и функции для работы с бестиповыми файлами procedure Reset(F, Size); procedure Rewrite(F, Size); Параметр Size определяет размер пересылаемого элемента информации в байтах (по умолчанию Size =128) Универсальное значение Size для физического доступа к любым файлам =1 4

Ввод и вывод procedure Block. Read(F, Buf, N, Result); читает из файла N или Ввод и вывод procedure Block. Read(F, Buf, N, Result); читает из файла N или менее (если достигнут конец файла) компонент и помещает их в переменную Buf. Необязательный параметр Result возвращает фактическое количество считанных компонент. Максимальный размер переносимой информации= N* Size 5

procedure Block. Write(F, Buf, N, Result); выводит в файл N или менее (если заполнится procedure Block. Write(F, Buf, N, Result); выводит в файл N или менее (если заполнится диск) компонент из переменной Buf. Необязательный параметр Result возвращает фактическое количество записанных компонент. Максимальный размер переносимой информации= N* Size 6

Пример - копирование бестипового файла. При открытии надо указать размер компоненты в байтах. Для Пример - копирование бестипового файла. При открытии надо указать размер компоненты в байтах. Для считывания всего файла его размер должен быть кратен размеру компоненты. Этому требованию всегда удовлетворяет Size=1 Чтение идет по несколько компонент. Оптимальный объем информации – 512 байт (объем физ. сектора на диске). Следовательно, при Size=1, N=512. 7

procedure …………. ; const Size=1; Buf. Size=512; var F 1, F 2: File; Read. procedure …………. ; const Size=1; Buf. Size=512; var F 1, F 2: File; Read. Result, Write. Result: Word; Buf: array[1. . Buf. Size] of char; … begin … 8

Assign. File(F 1, ‘…’); Reset(F 1, Size); Assign. File(F 2, ‘…’); Rewrite(F 2, Size); Assign. File(F 1, ‘…’); Reset(F 1, Size); Assign. File(F 2, ‘…’); Rewrite(F 2, Size); repeat Block. Read(F 1, Buf. Size, Read. Result); Block. Write(F 2, Buf, Read. Result, Write. Result); until (Read. Result=0) or (Read. Result <> Write. Result); if Read. Result=0 then Message. Dlg(‘OK’, mt. Information, [mb. OK], 0) else Message. Dlg(‘диск переполнен’, mt. Error, [mb. OK], 0); Close. File(F 2); Для Windows Close. File(F 1); приложений end; 9

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

В ЯП высокого уровня обычно есть возможность выделять и освобождать память для размещения данных В ЯП высокого уровня обычно есть возможность выделять и освобождать память для размещения данных во время работы программы. Таким образом можно сконструировать динамические структуры данных. Область оперативной памяти для размещения динамических данных называется динамической памятью, или кучей (англ. Heap - куча, множество, накопление). Доступ к динамическим переменным осуществляется через указатели на место их расположения в памяти. 11

Тип-указатель Указатель дает адрес элемента определенного, базового типа Указатель указывает на элемент базового типа. Тип-указатель Указатель дает адрес элемента определенного, базового типа Указатель указывает на элемент базового типа. Стандартный тип-указатель Pointer является бестиповым и совместим с любым указателем. Значение указателя занимает 4 байта 12

 • Адрес – совокупность двух 16 -ти разрядных слов - сегмента и смещения. • Адрес – совокупность двух 16 -ти разрядных слов - сегмента и смещения. • Сегмент - участок памяти, имеющий максимальную длину 64 К. • Сегменты адресуют память с точностью до параграфа (фрагмент памяти =16 байт). • Смещение – линейная адресация в сегменте • Смещение адресует память с точностью до байта. • Глобальные переменные и типизированные константы размещаются в сегменте данных. • Такие переменные называются статическими. • Память, выделяемая компилятором для их хранения, называется статической памятью. 13

Объявление типа type Pбазовый_тип =^базовый_тип; var p 1: Pбазовый_тип; p 2: Pointer; Пример: type Объявление типа type Pбазовый_тип =^базовый_тип; var p 1: Pбазовый_тип; p 2: Pointer; Пример: type PByte =^Byte; var px: PByte; {в рx может храниться адрес области памяти } 14

Операции, изменяющие значения указателей Операция взятия адреса с последующим присваиванием: указатель: =@переменная базового типа; Операции, изменяющие значения указателей Операция взятия адреса с последующим присваиванием: указатель: =@переменная базового типа; Операция присваивания для однотипных указателей. Операция присваивания константы NIL любым указателям. NIL - пусто, ничто переменная ни на что не указывает. 15

Операции над указателями Операции сравнения = <> для однотипных указателей. Операция разыменования – взятие Операции над указателями Операции сравнения = <> для однотипных указателей. Операция разыменования – взятие элемента по указателю: значение элемента, с которым связан указатель: указатель^ 16

Стандартные процедуры для работы с динамической памятью procedure New(P); Процедура выделяет область памяти, соответствующую Стандартные процедуры для работы с динамической памятью procedure New(P); Процедура выделяет область памяти, соответствующую базовому типу указателя P. Переменная P принимает значение указателя на эту область. Можно использовать и как функцию: New(px); или px : = New(PByte); 17

procedure Dispose(P); Процедура освобождает область памяти, на которую указывает P. Переменная P становится неопределенной. procedure Dispose(P); Процедура освобождает область памяти, на которую указывает P. Переменная P становится неопределенной. Переменную Р нельзя применять до присваивания нового значения. 18

procedure Get. Mem(P, Size); Процедура выделяет Size байт памяти. Переменная P принимает значение указателя procedure Get. Mem(P, Size); Процедура выделяет Size байт памяти. Переменная P принимает значение указателя на эту область. procedure Free. Mem(P, Size); Процедура освобождает область памяти, на которую указывает P. Параметр Size – необязателен НО если задается, то должен быть равен размеру области в байтах. Переменная P становится неопределенной Р нельзя применять до присваивания нового значения. 19

Указатели и динамические структуры данных Возможность динамического использования памяти позволяет создавать структуры данных с Указатели и динамические структуры данных Возможность динамического использования памяти позволяет создавать структуры данных с переменным числом элементов - динамические структуры данных. Динамический массив Допускается объявление массива вида: var x: array of тип_элементов; 20

Динамический массив не имеет фиксированного размера. Память под него распределяется динамически - во время Динамический массив не имеет фиксированного размера. Память под него распределяется динамически - во время присваивания значений его элементам, - при вызове процедуры, выделяющей динамическую память: Set. Lengh(имя_массива, кол-во элементов); Индексы динамических массивов всегда начинаются с 0. 21

Текущее максимальное значение индекса определяется с помощью функции function High(имя массива) Фактически, динамический массив Текущее максимальное значение индекса определяется с помощью функции function High(имя массива) Фактически, динамический массив – просто указатель. Следовательно, для освобождения памяти достаточно присваивания: имя массива : = NIL; Замечание. Процедуры New и Dispose с динамическими массивами не используются!!! 22

Связанные динамические структуры данных (ДСД) Связанные структуры данных: между элементами, независимо от их расположения Связанные динамические структуры данных (ДСД) Связанные структуры данных: между элементами, независимо от их расположения в памяти, устанавливаются определенные связи: линейные (списки) иерархические (деревья) 23

Связанный список Граф имеет линейную форму. В каждом элементе (вершине) содержатся данные одного типа: Связанный список Граф имеет линейную форму. В каждом элементе (вершине) содержатся данные одного типа: - информационная часть, - указатель на следующий элемент. Следовательно, это тип-запись. 24

Предпосылки к объявлению типа список Базируемся на типе запись. Поле-указатель на следующий элемент должно Предпосылки к объявлению типа список Базируемся на типе запись. Поле-указатель на следующий элемент должно быть типа указатель на список. Следовательно, тип указатель на список должен быть объявлен до объявления типа списка! Язык Паскаль допускает это как единственное исключение: идентификатор типа используется до того, как он будет объявлен. 25

Объявление типа список: type PList : ^List; {указатель на список} List = record info Объявление типа список: type PList : ^List; {указатель на список} List = record info : Tinfo; next : PList end; Примечание. Тип список относится к рекурсивным - тип определяется через указатель на этот же тип. 26

Операции со списками Создание списка. n Добавление элемента в список. n Удаление элемента из Операции со списками Создание списка. n Добавление элемента в список. n Удаление элемента из списка. n Вставка элемента в список. n Очистка списка. n 27

Частный случай списка: стек - список с одной точкой доступа (вершиной). Операции (удаление и Частный случай списка: стек - список с одной точкой доступа (вершиной). Операции (удаление и добавление элементов) только через вершину. Стек - stack (штабель), другие названия: магазин (в оружии), push-down список, список типа LIFO (last-in-first-out - последний-пришелпервый-ушел). Примеры: ж. д. тупик, организация последовательного вызова процедур, хранение статических переменных… 28

Частный случай списка: очередь - список с двумя точками доступа (начало и конец). Операции Частный случай списка: очередь - список с двумя точками доступа (начало и конец). Операции - удаление из начала, добавление элементов только в конец очереди. Другое название: список типа FIFO (first-in-first-out первый-пришел-первый-ушел). Примеры: последовательное обслуживание заданий различного типа. 29

Процедурный тип Общая структура pascal-программы: Заголовок Раздел объявления (описания) данных Раздел описания действий с Процедурный тип Общая структура pascal-программы: Заголовок Раздел объявления (описания) данных Раздел описания действий с данными состоит из: n n основной части (обязательно!) подпрограмм (необязательно) Подпрограммы располагаются перед основной частью программы. Структура подпрограммы аналогична структуре всей программы. 30

Общая структура подпрограммы: Заголовок Раздел объявления (описания) данных Раздел описания действий с данными 31 Общая структура подпрограммы: Заголовок Раздел объявления (описания) данных Раздел описания действий с данными 31

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

Подпрограммы-функции Функция предназначена для вычисления некоторого значения простого типа. Вызов функции - подстановка имени Подпрограммы-функции Функция предназначена для вычисления некоторого значения простого типа. Вызов функции - подстановка имени функции с перечнем аргументов в соответствующее выражение или оператор - аналогично стандартным функциям. 33

Заголовок функции Общий вид: function идентификатор функции (список формальных параметров) : тип результата ; Заголовок функции Общий вид: function идентификатор функции (список формальных параметров) : тип результата ; Список формальных параметров может включать: Параметры-значения, не изменяются в подпрограмме – идентификатор: тип; Параметры-переменные, могут изменяться в подпрограмме var идентификатор: тип; Тип задается только идентификатором. 34

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

Подпрограммы-процедуры Процедура предназначена для вычисления различных значений любого типа и/или выполнения какихлибо действий. Вызов Подпрограммы-процедуры Процедура предназначена для вычисления различных значений любого типа и/или выполнения какихлибо действий. Вызов процедуры - применение оператора вызова процедуры с указанием имени процедуры с перечнем аргументов - аналогично стандартным процедурам. 36

Заголовок процедуры: procedure идентификатор процедуры(список формальных параметров); Значения, возвращаемые из подпрограммыпроцедуры: значения параметров-переменных. Кроме Заголовок процедуры: procedure идентификатор процедуры(список формальных параметров); Значения, возвращаемые из подпрограммыпроцедуры: значения параметров-переменных. Кроме того, возможно изменение значений глобальных переменных. Оператор вызова процедуры: идентификатор процедуры(список фактических параметров) ; 37

Вызов подпрограммы Фактические параметры При вызове подпрограммы вместо формальных параметров надо подставить фактические с Вызов подпрограммы Фактические параметры При вызове подпрограммы вместо формальных параметров надо подставить фактические с учетом соответствия типов и правила: параметр-значение <-> выражение, параметр-переменная<-> переменная 38

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

Параметры-константы не изменяются в подпрограмме – const идентификатор: тип; Защита от изменения устанавливается при Параметры-константы не изменяются в подпрограмме – const идентификатор: тип; Защита от изменения устанавливается при компиляции В подпрограмму передаются их адреса (это экономит память) Тип параметра -константы может быть любым кроме файлового Соответствующий фактический параметр м. б. выражением совместимого по присваиванию типа 40

Параметры без типа Параметры-константы и параметры- переменные можно использовать без указания типа const идентификатор; Параметры без типа Параметры-константы и параметры- переменные можно использовать без указания типа const идентификатор; Фактический параметр м. б. типизированной константой или переменной любого типа За контроль типов отвечает программист 41

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

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

Объявление процедурного типа type имя_типа=procedure(список формальных параметров); type имя_типа=function(список формальных параметров): тип_результата; Примечание. Список Объявление процедурного типа type имя_типа=procedure(список формальных параметров); type имя_типа=function(список формальных параметров): тип_результата; Примечание. Список формальных параметров может отсутствовать 44

Пример: нахождение таблиц умножения и сложения … type fun= function (x, y: integer): integer; Пример: нахождение таблиц умножения и сложения … type fun= function (x, y: integer): integer; function add (x, y: integer): integer; begin add: =x+y; end; function mult (x, y: integer): integer; begin mult: =x*y; end; 45

procedure printtable(operation: fun); var i, j: byte; begin for i: = 1 to 9 procedure printtable(operation: fun); var i, j: byte; begin for i: = 1 to 9 do begin for j: = 1 to 9 do write (operation(i, j): 4); writeln; end; begin writeln (‘+++’); printtable(add); writeln (‘***’); printtable(mult); end. 46