Экзамен на максимум (839218), страница 2
Текст из файла (страница 2)
а) неявно – с использованием свойства доступности глобальных переменных;
Неявная передача:
1) приводит к большому количеству ошибок;
2) жестко связывает подпрограмму и данные.
б) явно – через параметры.
7
Процедуры и функции Delphi Pascal. Формальные и фактические параметры. Параметры-строки, параметры-массивы.
Список параметров описывается в заголовке:
Параметры, описанные в заголовке – формальные.
При вызове подпрограммы необходимо определить фактические значения этих параметров – аргументы (константы и переменные).
Формальные и фактические параметры должны соответствовать по количеству, типу и порядку:
function proc(a:integer; b:single):byte; … {формальные}
n:= proc(5, 2.1); {фактические}
Способы передачи параметров
Параметры - значения – в подпрограмму передаются копии фактических параметров, и никакие изменения этих копий не возвращаются в вызывающую программу.
function Beta(x:single; n:byte):integer;
Параметры - переменные – в подпрограмму передаются адреса фактических параметров, соответственно все изменения этих параметров в подпрограмме происходят с переменными основной программы.
function Alpha(x:single; Var n:byte):integer;
Параметры-константы – в подпрограмму, так же как и в случае параметров-переменных, передаются адреса фактических параметров, но при попытке изменить значение параметра компилятор выдает сообщение об ошибке; такие параметры при описании подпрограммы помечаются служебным словом const.
function Alpha(const x:single; n:byte); .
8
Процедуры и функции Delphi Pascal. Принципы разработки универсальных подпрограмм. «Открытые» массивы и строки.
Открытый массив – конструкция описания типа массива без указания типа индексов. Используется только при объявлении формальных параметров.
Примеры:
array of single;
array of integer;
Индексы открытого массива всегда начинаются с 0.
Размер можно:
-
передать через дополнительный параметр;
-
получить, используя функцию High().
Чтобы в программе выделить память под открытый массив, следует воспользоваться процедурой setlength, которая принимает два фактических параметра – имя открытого массива и устанавливаемое количество элементов в нем. В результате работы setlength в памяти выделяется столько байт, сколько необходимо для хранения n-го количества элементов определенного типа. Так, если массив ранее описан как real и задано 5 элементов, то процедура setlength выделит под него 40 байт, т.к. для хранения каждого числа типа real требуется 8 байт памяти
Чтобы освободить, выделенную под массив память, используется оператор nil.
Открытые строки. Если строка передается в программу как параметр-значение, то длина ее не контролируется. Контроль длины осуществляется только для строк, передаваемых в программу как параметр-переменная. Поэтому при написании универсальных подпрограмм, работающих со строками произвольного размера, необходимо включать режим открытых строк {$P+} или объявлять параметр-строки как openstring.
9
Процедуры и функции Delphi Pascal. Принципы разработки универсальных подпрограмм. Нетипизированные параметры, параметры процедурного типа.
Нетипизированные параметры – параметры-переменные, тип которых при объявлении не указан.
Для приведения нетипизированного параметра к определенному типу можно использовать:
1) автоопределенное преобразование типов:
Procedure Proc(Var a); ...
...b:= Integer(а)+10; ...
2) наложенное описание переменной определенного типа:
Procedure Proc(Var a); ...
Var r:real absolute a;...
При этом переменная r оказывается в памяти, размещенной в том же месте, что и нетипизированный параметр a, и, соответственно, любое изменение r приведет к изменению a.
Параметры процедурного типа.
Параметры процедурного типа используются для передачи в подпрограмму имен процедур и функций.
Для объявления процедурного типа используется заголовок подпрограммы, в котором отсутствует имя:
Type proc=procedure (a,b,c:real;Var d:real);
func=function(x:real):real;
Значениями переменных процедурных типов являются идентификаторы процедур и функций с соответствующими заголовками:
Var f:func;
...
f:=fun1;...
10
Модули Delphi Pascal. Структура модуля. Законы видимости идентификаторов. Доступ к «перекрытым» идентификаторам.
Модуль – это автономно компилируемая коллекция программных ресурсов, предназначенных для использования другими модулями и программами.
Ресурсы – переменные, константы, описания типов и подпрограммы.
Все ресурсы, определенные в модуле делят на:
1) внешние – предназначенные для использования другими программами и модулями.
2) внутренние – предназначенные для использования внутри модуля.
Структура модуля:
Unit ; {Имя модуля должно совпадать с именем файла, в котором он описан}
Interface
{объявление ресурсов (в т.ч. заголовки подпрограмм)}
Implementation
{описание подпрограмм, внутренних ресурсов модуля}
[Initialization
[Finalization
]] Содержит операторы, которые выполняются при завершении работы приложения.
End.
Подключение модуля к программе осуществляется по имени:
Uses <Имя модуля1>, <Имя модуля2>, ...;
Объявление модулей в файле проекта
Если:
-
к проекту подключается модуль, который находится в каталоге, не совпадающем с каталогом проекта и не указанном в путях компилятора;
-
в путях компилятора имеется несколько модулей с одинаковыми именами,
то необходимо указать местонахождение модуля:
Uses Strings in 'C:\Classes\Strings.pas';
Uses Strings in '..\Strings.pas'; {относительно текущего кат.}
Модули, объявленные в файле проекта с указанием in …, считаются частью проекта, т. е. доступны через средства работы с проектом среды.
Все ресурсы, объявленные в интерфейсной части модуля, доступны в основной программе.
В случаях перекрытия имен, когда основная программа и подключенный модуль содержат ресурсы с одинаковыми именами, при обращении к ресурсам модуля используют точечную нотацию.
Пример:
Unit A;
Interface
Var X:real; …
End.
Program ex;
Uses A;
Var X:integer;
Begin
X:=10;
A.X:=0.45; …
11
Рекурсия. Особенности программирования. Достоинства и недостатки.
Рекурсия – организация вычислений, при которой процедура или функция обращаются к самим себе.
Различают явную и косвенную рекурсии. При явной – в теле подпрограммы существует вызов самой себя, при косвенной – вызов осуществляется в подпрограммах, вызываемых из рассматриваемой. Цепочка вызовов в конечном счете приведет к вызову исходной.
Косвенная рекурсия требует предопределения forward:
procedure B(j:byte); forward;
procedure A(j:byte);
begin ...B(i);
...
end;
procedure B;
begin ... A(j);
...
end;
Каждое обращение к рекурсивной подпрограмме вызывает независимую активацию этой подпрограммы.
Совокупность данных, необходимых для одной активации рекурсивной подпрограммы, называется фреймом активации.
Фрейм активации включает
-
локальные переменные подпрограммы;
-
копии параметров-значений;
-
адреса параметров-переменных и параметров-констант (4 байта);
-
копию строки результата (для функций типа string);
-
служебную информацию (12 байт, точный размер этой области зависит от способа передачи параметров).
«Операторы после вызова», выполняются после возврата управления из рекурсивно вызванной подпрограммы.
Программы, в которых используются рекурсивные подпрограммы, отличаются простотой, наглядностью и компактностью кода. Однако за эту простоту приходится расплачиваться неэкономным использованием оперативной памяти, так как выполнение рекурсивных подпрограмм требует значительно большего размера оперативной памяти во время выполнения, чем нерекурсивных. При каждом рекурсивном вызове для локальных переменных, а также для параметров подпрограмм, которые передаются по значению, выделяются новые ячейки памяти в программном стеке.
12
Адресация динамической памяти: понятие адреса, операции получения адреса и разыменования. Процедуры получения памяти и освобождения ее.
Минимальная адресуемая единица памяти – байт.
Физический адрес Аф – номер байта оперативной памяти.
Адресация по схеме «база+смещение»:
Аф = Аб + Асм,
где Аб – адрес базы – адрес, относительно которого считают
остальные адреса;
Асм – смещение – расстояние от базового адреса до физического.
Указатель – тип данных, используемый для хранения смещений.
В памяти занимает 4 байта, адресует сегмент размером V = 232 = 4 Гб.
Базовый адрес = адрес сегмента.
Получение адреса. Результат операции – указатель типа pointer – может присвоен любому указателю.
Пример:
Var i:integer;
pi: ^integer;
... pi:=@i;
Доступ к данным по указателю (операция разыменования). Полученное значение имеет тип, совпадающий с базовым типом данных указателя. Нетипизированные указатели разыменовывать нельзя.
Примеры:
j:=pi^;
pi^:= pi^+2;
Управление выделением и освобождением памяти осуществляется посредством специальных процедур и функций:
1. Процедура New(var P: ^) – выделяет память для размещения переменной, размер определяется типом указателя.
2. Процедура Dispose(var P: ^) – освобождает выделенную память.
13
Списковые структуры данных и основные приемы работы с ними: создание элемента, добавление элемента к списку, удаление элемента из списка. Область применения списковых структур данных.
Д инамические линейные структуры
1. Очередь – структура данных, реализующая: добавление – в конец, а удаление – из начала.
2. Стек – структура данных, реализующая: добав-ление и удаление с одной стороны.
3. Дек – структура данных, реализующая: добав-ление и удаление с двух сторон.
Список – способ организации данных, предполагающий использова-ние указателей для определения следующего элемента.
Элемент списка состоит из двух частей: информационной и адресной.
Информационная часть содержит поля данных.
Адресная – включает от одного до n указателей, содержащих адреса следующих элементов. Количество связей, между соседними элементами списка определяет его связность: односвязные, двусвязные, n-связные.
Описание типа элемента:
Type tpel=^element; {тип «указатель на элемент»}
element=record
num:integer; {число}
p:tpel; {указатель на следующий элемент}
end;
Описание переменной – указателя списка и несколько переменных-указателей в статической памяти:
Var first, {адрес первого элемента}
n,f,q:tpel; {вспомогательные указатели}
1 Добавление элемента к пустому списку:
new(first);
first ^.num:=5;
first ^.p:=nil;
2 Добавление элемента перед первым (по типу стека):
new(q);
q^.num:=4;
q^.p:=first;
first:=q;
3 Добавление элемента после первого (по типу очереди):
new(q);
q^.num:=4;
q^.p:=nil;
first^.p:=q;
Аналогично одномерным массивам реализуют последовательность элементов. Однако в отличие от одномерных массивов позволяют:
-
работать с произвольным количеством элементов, добавляя и удаляя их по мере необходимости;
-
осуществлять вставку и удаление записей, не перемещая остальных элементов последовательности;
но
-
не допускают прямого обращения к элементу по индексу;
-
требуют больше памяти для размещения.
14
Основы файловой системы: файл, каталог, дисковод, полное имя файла, внутреннее представление информации в файле. Текстовый и нетипизированный файлы. Операции над файлами.
Файл – поименованная последовательность элементов данных (компонентов файла), хранящихся, как правило, во внешней памяти.
Путь к файлу вместе с именем файла называют полным именем файла.
:\.
Имя файла в Windows составляют из строчных и прописных букв латинского и русского алфавитов, арабских цифр и некоторых специальных символов, например, символов подчеркивания «_» или доллара «$».
Дисковод — устройство компьютера, позволяющее осуществить чтение и запись информации на съёмный носитель информации. Основное назначение дисковода в рамках концепции иерархии памяти — организация долговременной памяти. Основные характеристики дисковода — тип и ёмкость используемого сменного носителя информации, скорость чтения/записи, тип интерфейса и форм-фактор (встраиваемый (внутренние) или внешние).
В зависимости от способа представления информации различают три типа файлов.
file of <Тип компонента>
File
Работа с файлами включает:
-
инициализацию файловой переменной – установление связи файловой переменной с файлом;
-
открытие файла – подготовку файла для выполнения операций ввода-вывода;
-
обработку компонентов файла – выполнение операций ввода-вывода элементов данных;
-
закрытие файла.
Процедура Assign или AssignFile (Var f; st:string) – связывает файловую переменную f с файлом, имя которого указано в строке st.
При открытии файла необходимо задать направление передачи данных: запись или чтение. Кроме того текстовый файл можно открыть для добавления компонентов.
1. Процедура ReSet(Var f) – открывает файл для чтения данных.
Устанавливает указатель файла на первый компонент. Если файл не существует, выдается сообщение об ошибке.
2. Процедура ReWrite(Var f) – открывает файл для записи.
Если указанный файл существовал, то он уничтожается без выдачи предупреждения пользователю, иначе он создается и указатель устанавливается на начало.
3. Процедура AppEnd(Var f:text) – открывает текстовый файл для добавления данных.
Указатель файла устанавливается на конец файла.
4. Функция IOResult:Word – возвращает код завершения операции ввода-вывода: 0 – если операция прошла нормально, код ошибки, если нет. Функция применяется при отключенном контроле операций ввода-вывода {$I-}.
Основные операции над компонентами – операции записи и чтения. На базе этих операций выполняют более сложные операции:
-
создание файла – занесение в файл требуемых записей;
-
модификация файла – изменение всех или нескольких записей, добавление и удаление записей;
-
поиск нужной информации в файле.
Процедура Close или CloseFile(Var f) - выполняет закрытие файла. При этом вновь созданный файл регистрируется в каталоге.
1. Процедура ReName(Var f; name:string) – выполняет переименование файла f, где name – новое имя файла.
При совпадении нового имени файла с ранее существовавшим выдается сообщение об ошибке.
2. Процедура Erase(Var f) – выполняет удаление файла. Перед уничтожением файл должен быть закрыт.
3. Функция EOF(Var f):boolean – проверяет конец файла, возвращает TRUE, если указатель стоит после последней записи и FALSE, если нет.
Текстовый файл – файл, компонентами которого являются символьные строки переменной длины, заканчивающиеся специальным маркером – маркером «Конец строки».
Текстовые файлы используют для хранения и обработки символов, строк, символьных массивов. Числовые и логические данные при записи в текстовые файлы должны преобразовываться в символьные строки.
Текстовый файл можно открыть для записи, чтения и добавления записей в конец. Файл, открытый для записи, не может использоваться для чтения и наоборот.
-
Функция EOLn([Var f]): Boolean – возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки; при отсутствии файловой переменной проверяется файл INPUT, связанный с клавиатурой.
-
Процедура Read([Var f:text;]v1,v2,...vn) – обеспечивает ввод символов, строк и чисел. При вводе чисел пробелы и символы табуляции игнорируются. Если файловая переменная не указана, то ввод осуществляется из файла INPUT.
-
Процедура ReadLn([Var f;][v1,v2,...,vn]) – осуществляет ввод символов, строк и чисел. После чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается так, что следующее обращение к ReadLn или Read начинается с первого символа новой строки.
-
4. Процедура Write([Var f;]v1,v2, ...,vn ) – осуществляет вывод одного или более выражений типа CHAR, STRING, BOOLEAN, а также целого или вещественного типов. При выводе числовых значений последние преобразуются в символьное представление. Если файловая переменная не указана, то вывод осуществляется в файл OUTPUT.
-
Процедура WriteLn([Var f;][v1,v2, ...,vn]) – осуществляет вывод в текстовый файл. Если файловая переменная не указана, то вывод осуществляется в файл OUTPUT.
Выводимая строка символов завершается маркером конца строки. Если список вывода не указан, то в файл передается только маркер конца строки.
-
Функция SeekEOLn([Var f]):boolean – пропускает пробелы и знаки табуляции до маркера конца строки или до первого значащего символа и возвращает TRUE, при обнаружении маркера. Если файловая переменная не указана, то функция проверяет файл INPUT.
-
7. Функция SeekEOF([Var f]):boolean – пропускает все пробелы, знаки табуляции и маркеры конца строки до маркера конца файла или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная отсутствует, то функция проверяет файл INPUT.
Нетипизированными называют файлы, объявленные без указания типа компонентов.
Операции чтения и записи с такими файлами осуществляются блоками, что позволяет организовать высокоскоростной обмен данными между диском и памятью. Отсутствие типа делает эти файлы совместимыми с любыми другими.
Нетипизированные файлы, как и типизированные, допускают организацию прямого доступа.
Нетипизированный файл можно открыть для записи и для чтения:
ReSet(Var f;[recsize:word]);
ReWrite(Var f;[recsize:word]);
1. Процедура
BlockRead(Var f:file; Var buf;Count:word[;Var res:word])– осуществляет чтение блока записей из файла в буфер buf.
Параметр res будет содержать количество фактически обработанных записей. Если последняя запись – неполная, то значение параметра res ее не учтет.
2. Процедура
BlockWrite(Var f:file;Var buf;Count:word[;Var res:word])– осуществляет запись блока из буфера buf в файл.
15
Типизированные файлы: внутреннее представление информации в файле, особенности обработки. Файловая переменная. Операции над файлом.
Типизированный файл – файл, все компоненты которого одного типа, заданного при объявлении файловой переменной.
Компоненты хранятся на диске во внутреннем (двоичном) формате.
Типизированный файл можно открыть для записи и чтения. Файл, открытый для записи, может использоваться для чтения. В файл, открытый для чтения, можно писать.
Поскольку размер компонентов одинаков, принципиально возможен не только последовательный, но и прямой доступ.
1. Процедура Read(Var f; c1,c2,...,cn) – осуществляет чтение компонентов типизированного файла. Список ввода содержит одну или несколько переменных того же типа, что и компоненты файла. Если файл исчерпан, обращение к процедуре вызывает ошибку ввода-вывода.
2. Процедура Write(Var f; c1,c2,...,cn) – осуществляет запись компонентов в типизированный файл. Список вывода содержит одно или более выражений того же типа, что и компоненты файла.
3. Процедура Seek(Var f; numcomp:longint) – осуществляет установку указателя файла на компонент с номером numcomp.
4. Функция FileSize(Var f):longint – возвращает количество компонентов файла. Может использоваться для установки на конец файла совместно с Seek():
Seek(f, FileSize(f));
5. Функция FilePos(Var f):longint – возвращает порядковый номер компонента, который будет обрабатываться следующим.
6. Процедура Truncate(Var f) – выполняет «усечение» файла
16
Классы консольного режима Delphi: описание классов, поля и методы, объявление объектов класса, доступ к полям и методам объекта, ограничение доступа.
C точки зрения синтаксиса класс – структурный тип данных, в котором помимо полей разрешается описывать прототипы (заголовки) процедур и функций, работающих с этими полями данных.
Type TRoom = object
length, width:single;
function Square: single; {прототип функции}
end;
Function TRoom.Square;
Begin
Result:= length*width;
End;
Поскольку данные и методы инкапсулированы в пределах класса, все поля автоматически доступны из любого метода
ОБЪЯВЛЕНИЕ ОБЪЕКТОВ КЛАССА
Var A:TRoom; {объект А класса TRoom}
B:array[1..5] of TRoom; {массив объектов типа TRoom}
Type pTRoom=^TRoom; {тип указателя на объекты класса TRoom}
Var pC: pTRoom; {указатель на объекта класса TRoom}
Обращение к полям и методам аналогично доступу к полям записей:
Примеры:
а) v:=A.length;
б) s:= A.Square;
в) s:=s+B[i].Square;
г) pC^.length:=3;
17
Классы консольного режима Delphi: Способы инициализация полей. Неявный параметр Self.
Любой метод неявно получает параметр Self – ссылку (адрес) на поля объекта, и обращение к полям происходит через это имя.
Function TRoom.Square;
Begin
Result:= Self.length* Self.width;
End;
При необходимости эту ссылку можно указывать явно:
@Self – адрес области полей данных объекта.
1) A.length:=3.5;
A.width:=5.1;
2) Var A:TRoom = (length:3.5; width:5.1);
3) Procedure TRoom.Init;
Begin length:=l; width:=w; End;
Var A:TRoom;
Begin
A.Init(3.5,5.1);
18
Процедурная и объектная декомпозиция. Диаграммы классов. Отношения между классами.
Процедурная декомпозиция – процесс разбиения программы на подпрограммы.
Структурной называют декомпозицию, если:
-
каждая подпрограмма имеет один вход и один выход;
-
подпрограммы нижних уровней не вызывают подпрограмм верхних уровней;
-
размер подпрограммы не превышает 40-50 операторов;
-
в алгоритме использованы только структурные конструкции.
Процедурной декомпозицией называют представление разрабатываемой программы в виде совокупности вызывающих друг друга подпрограмм. Каждая подпрограмма в этом случае выполняет некоторую операцию, а вся совокупность подпрограмм решает поставленную задачу.
Слабое место – большая вероятность испортить глобальные данные.
Структурная декомпозиция – частный случай процедурной, при структурной декомпозиции запрещены «циклические» или обратные вызовы подпрограмм. Схема структурной декомпозиции иерархическая и напоминает дерево, перевернутое корнем вверх. На верхнем уровне, в корне дерева находится основная программа, которая вызывает подпрограммы следующего уровня, а эти подпрограммы, в свою очередь, вызывают только подпрограммы более низких уровней. Вызов подпрограмм, расположенных в иерархии вызовов выше или на том же уровне, что и вызывающая подпрограмма, является циклическим и, следовательно, запрещен.
Объектной декомпозицией называют процесс представления предметной области задачи в виде совокупности функциональных элементов (объектов), обменивающихся в процессе выполнения программы входными воздействиями (сообщениями).
Объект отвечает за выполнение некоторых действий, инициируемых сообщениями и зависящих от параметров объекта.
-
Н
аследование – механизм, позволяющий строить класс на базе более простого посредством добавления полей и определения новых методов.
При этом исходный класс, на базе которого выполняется построение, называют родительским или базовым, а строящейся класс – потомком или производным классом.
Если при наследовании какие-либо методы переопределяются, то такое наследование называется полиморфным.
2. Композиция – механизм, позволяющий
включать несколько объектов других
классов в конструируемый.
3. Наполнение – механизм, позволяющих
включать указатели на объекты других
классов в конструируемый.
19
Динамические объекты и объекты с динамическими полями в консольном режиме Delphi.
20