Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BILYeT_17.doc
Скачиваний:
1
Добавлен:
30.07.2019
Размер:
79.36 Кб
Скачать

БИЛЕТ 17

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

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

TYPE<имя файлового типа>FILEOF<тип компонент>:

<тип компонент> не может быть:

- файловым типом;

- в ряде версий перечислимым типом;

- как правило, указателем.

К файловым переменным применима стандартная функция EOF(<файловая переменная>), которая принимает булевское значение TRUE, если достигнут конец файла, и FALSE - в противном случае.

Открытие файла для записи.

REWRITE (<файловая переменная>{,<внешнее имя>});

Запись в файл.

PUT (<файловая переменная>);

Открытие файла для чтения.

RESET (<файловая переменная> {, <внешнее имя>} );

Получить следующую компоненту из файла.

GET (<файловая переменная>);

Закрытие файла.

CLOSE (<файловая переменная>);

ОДИН И ТОТ ЖЕ ФАЙЛ И ДЛЯ ЧТЕНИЯ, И ДЛЯ ЗАПИСИ ОДНОВРЕМЕННО ОТКРЫТЬ НЕЛЬЗЯ. Поэтому открыть для чтения файл, в который производилась запись в программе, можно только предварительно закрыв его.

Запись в файл.

WRITE (<файловая переменная>, <выражение типа char>);

Чтение из файла.

READ (<файловая переменная>, <переменная типа char>);

БИЛЕТ 12

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

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

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

Описание и вызов процедур и функций

Формат описания процедуры имеет вид:

procedureимя процедуры (формальные параметры);

раздел описаний процедуры

begin

исполняемая часть процедуры

end;

Формат описания функции:

functionимя функции (формальные параметры):тип результата;

раздел описаний функции

begin

исполняемая часть функции

end;

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

varимя праметра: имя типа

и отделяются друг от друга точкой с запятой.

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

имя процедуры(список фактических параметров);

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

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

имя функции := результат;

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

  • количество фактических параметров должно совпадать с количеством формальных;

  • соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

БИЛЕТ 13

Параметры-значения

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

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

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

Параметры-переменные

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

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

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

Директива компилятора $P управляет смыслом параметра-переменной, описываемого с ключевым словом string. В состоянии по умолчанию ({$P-}) string соответствует строковому типу с атрибктом размера 255. В состоянии {$P+}string указывает, что параметр является открытым строковым параметром (см. ниже).

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

Правила совместимости по присваиванию для объектного типа применяются также к параметрам-переменным объектного типа. Для формального параметра типа T1 фактический параметр должен быть типа T2, если T2 находится в домене T1. Например, с учетом описаний Главы 4, методу TField.Copy может передаваться экземплярTField, TStrField, TNumField, TZipField или любой другой экземпляр потомка TField.

БИЛЕТ 15

Основное свойство динамических переменных заключается в том,  что они создаются и память для них выделяется во время выполнения программы.Размещаются динамические переменные  в  динамической  области  памяти(heap - области)

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

Работа с динамической областью памяти в TURBO PASCAL реализуется спомощьюпроцедурифункцийNew,  Dispose,  GetMem,FreeMem, Mark,Release, MaxAvail, MemAvail, SizeOf.

динамические объекты представлены не явно, а через некоторую статическую переменную, которая указывает на место расположения динамического объекта, если он существует, либо содержит специальное значение - объект отсутствует. Что значит указывает? Это значит что ее значение - "имя" динамического объекта. Это специальное имя, называемое ссылкой (саму переменную, при этом, часто называют указателем) и которое указывает где размещается, как найти объект и получить доступ к значению.

Синтаксис задания ссылочного типа:

 <задание ссылочного типа>::= ^<имя типа>

^ - признак ссылочного типа; <имя типа> - имя стандартного либо описанного ранее типа. Это тип динамических объектов, которые может представлять переменная ссылочного типа. Надо подчеркнуть , что здесь может быть только имя типа.

Действия над ссылками

 Над значениями ссылочного типа нет операций, которые бы давали значения ссылочного типа. Над значениями ссылочного типа определены только операции присваивания и сравнения на равенство и не равенство. В операторе присваивания вида p:=e ссылочным выражением может быть: - пустая ссылка nil; -ссылочная переменная; -ссылочная функция (т.е. функция чье значение - ссылка). Значения левой и правой частей должны ссылать на объекты одного и того же типа.

 Пусть  var p, g :^integer. Например, p:=q; приводит к тому что и p и q указывают на один и тот же объект, но если при этом объект, на который указывала ссылочная переменная p, будет утерян, то действия с q станут некорректными!

 Неправильно было бы написать p:=q^ т.к. слева переменная ссылочного типа, а справа значение целого типа; p^:=3.0 - опять несоответствие типов (integer и real); p^:=nil - слева переменная целого типа, справа - ссылочное значение.

 Отличия использования динамических переменных:

динамические переменный представлены через статические переменные ссылочного типа;

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

для доступа к значениям динамической переменной используется переменная с указателем.

БИЛЕТ 16

Списки

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

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

Если для обработки таких данных не использовать внешнюю память (файлы), то разумно расположить их в динамической памяти. Во-первых, динамическая память позволяет хранить больший объем информации, чем статическая. А во-вторых, в динамической памяти эти числа можно организовать в связанный список, который не требует предварительного указания количества чисел, подобно массиву. Что же такое "связанный список"? Схематически он выглядит так:

Здесь Inf — информационная часть звена списка (величина любого простого или структурированного типа, кроме файлового), Next — указатель на следующее звено списка; First — указатель на заглавное звено списка.

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

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

Type U = ^Zveno;

Zveno = RecordInf : BT; Next: U End;

Здесь BT — некоторый базовый тип элементов списка.

Если указатель ссылается только на следующее звено списка (как показано на рисунке и в объявленной выше структуре), то такой список называют однонаправленным, если на следующее и предыдущее звенья — двунаправленным списком. Если указатель в последнем звене установлен не в Nil, а ссылается на заглавное звено списка, то такой список называетсякольцевым. Кольцевыми могут быть и однонаправленные, и двунаправленные списки.

Более подробно рассмотрим работу со связанными списками на примере однонаправленного некольцевого списка.

Выделим типовые операции над списками:

  • добавление звена в начало списка;

  • удаление звена из начала списка;

  • добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан);

  • удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан);

  • проверка, пуст ли список;

  • очистка списка;

  • печать списка.

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

1. Добавление звена в начало списка

{Процедура добавления звена в начало списка; в x содержится добавляемая информация}

Procedure V_Nachalo(Var First : U; X : BT);

VarVsp : U;

Begin

New(Vsp);

Vsp^.Inf := X;

Vsp^.Next := First; {То звено, что было заглавным, становится вторым по счёту}

First := Vsp; {Новое звено становится заглавным}

End;

2. Удаление звена из начала списка

{Процедура удаления звена из начала списка;

в x содержится информация из удалённого звена}

Procedure Iz_Nachala(Var First : U; Var X : BT);

VarVsp : U;

Begin

Vsp := First; {Забираемссылкунатекущеезаглавноезвено}

First := First^.Next; {То звено, что было вторым по счёту, становится заглавным}

X := Vsp^.Inf; {Забираем информацию из удаляемого звена}

Dispose(Vsp); {Уничтожаем звено}

End;

3. Добавление звена в произвольное место списка, отличное от начала (после звена, указатель на которое задан)

{Процедура добавления звена в список после звена,

на которое ссылается указатель Pred;

в x содержится информация для добавления}

Procedure V_Spisok(Pred : U; X : BT);

VarVsp : U;

Begin

New(Vsp); {Создаемпустоезвено}

Vsp^.Inf := X; {Заносим информацию}

Vsp^.Next := Pred^.Next; {Теперь это звено ссылается на то,

что было следом за звеном Pred}

Pred^.Next := Vsp; {Теперь новое звено встало вслед за звеном Pred}

End;

4. Удаление звена из произвольного места списка, отличного от начала (после звена, указатель на которое задан)

{Процедура удаления звена из списка после звена,

на которое ссылается указатель Pred;

в x содержится информация из удалённого звена}

Procedure Iz_Spiska(Pred : U; Var X : BT);

VarVsp : U;

Begin

Vsp := Pred^.Next; {Забираемссылкунаудаляемоезвено}

{Удаляем звено из списка, перенаправив ссылку на следующее

занимзвено}

Pred^.Next := Pred^.Next^.Next;

X := Vsp^.Inf; {Забираем информацию из удаляемого звена}

Dispose(Vsp); {Уничтожаем звено}

End;

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