Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование на Pascal / Delphi / Лекции по Паскалю

.txt
Скачиваний:
46
Добавлен:
02.05.2014
Размер:
76.88 Кб
Скачать
Вопрос. Алгоритмический язык Pascal. Особенности и преимущества. Идея структурного программирования. Нисходящее программирование.
Годом рождения языка Pascal можно считать 1968-ой, именно тогда было опубликовано первое официальное сообщение о нем. Его автор - Никлаус Вирт, директор Института информатики Швейцарской высшей политехнической школы, профессор, лауреат премии Тьюринга. В 1970 г. был разработан первый транслятор, в 1974 г. их насчитывалось не более 10, в 1979 - более 80. За свою тридцатилетнюю историю язык не только не утратил популярности, но и получил мощное развитие в дальнейших реализациях, начиная с объектно-ориентированных версий и заканчивая визуально-ориентированными. Этот язык можно применять с целью описания других языков. Он стал основой для обсуждения языков программирования и своеобразным эталоном для сравнения алгоритмических языков. Среди отличительных особенностей языка отметим следующее:
1.по своей идеологии язык близок к современной методике и технологии программирования. В частности он наиболее полно отражает идеи структурного программирования;
2.язык хорошо приспособлен для применения общепризнанной технологии разработки программ методом нисходящего проектирования (пошаговой детализации). Его успешно используют для записи программ на разных уровнях их детализации, не прибегая при этом к помощи блок-схем и специальных языков проектирования программ;
3.язык предоставляет разработчикам многообразные структуры данных.

Вопрос. Описание синтаксиса языков. Бэкуса-Наура формы и синтаксические диаграммы. Рекурсивные определения.
Всякий язык программирования описывается алфавитом, синтаксисом и семантикой. Синтаксис - набор правил написания отдельных конструкций и предложений языка. Для описания синтаксиса языков используют особый язык - метаязык ("надъязык"). Наиболее распространенные среди метаязыков - БНФ и синтаксические диаграммы.
БНФ - Бэкуса-Наура формы (Дж. Бэкус - автор языка, П.Наур принимал участие в редактировании сообщений перед публикацией) - это язык металингвистических формул (метаформул). При описании синтаксиса языка используют некоторые его понятия. С помощью простейших определяют более сложные понятия, самым главным из которых является "программа". С точки зрения синтаксиса каждое определяемое понятие есть метапеременная БНФ, значением которой может быть любая допустимая конструкция языка. Структура метаформулы такова, что в ее левой части находится определяемое понятие (метапеременная), а в правой - множество всех возможных значений этой переменной, т.е все допустимые конструкции, объединенные в это понятие.
Введем в рассмотрение следующие обозначения: <…> - метапеременная; {…} - повторение конструкции нуль и более раз; | - черта альтернативы; : : = - символ метаприсваивания. Пример: <переменная>: : = A|B, <выражение>: : = <переменная>|<переменная>+<переменная>|<переменная>-<переменная>. Эти БНФ дают выводы следующих цепочек: А,В, А+А, А+В,В+А,В+В,А-А,А-В,В-А,В-В.
Часто невозможно перечислить все допустимые последовательности из основных символов в качестве значений метапеременной. Тогда определяют не множество, а правило построения всех таких последовательностей. Пример: <двоичная цифра>: : = 0|1,<двоичный код>:: =<двоичная цифра>|<двоичный код><двоичная цифра>
В данном примере определяемое понятие находится не только в левой, но и в правой части метаформулы. Определение такого рода называется рекурсивным. Как известно, опасность рекурсивных определений состоит в возможном зацикливании. Для избежания этого необходимо наличие в правой части метаформулы хотя бы одного частного определения, не содержащего определяемого понятия. Пример: <двоичный код>:: = {<двоичная цифра>}|<двоичная цифра>
Синтаксические диаграммы изображают конструкции языка графическими средствами. Элементом диаграммы может быть основной символ или определяемое понятие. Может показаться, что синтаксические диаграммы позволяют избавиться от рекурсии, но это не так. Если между числами повторений отдельных элементов диаграммы существует зависимость, то избежать рекурсии нельзя.

Вопрос. ОСНОВНЫЕ СИМВОЛЫ И ЛЕКСЕМЫ
Рассмотрим понятие «алфавит языка»:
<алфавит> :: = <буква>|<цифра> | <слецсимвол>
<буква> :: = A|В|C|D|E|F|G|H|l|J|K|L|M|N|0|P..
<цифра> :: = 0|1|2|3|4|5|6...
<спецсимвол> :: = <знак арифметической операции>|<знак операции сравнения>|<разделитель>|<слово-символ>
<знак арифметической операции>:: = +|-|•|/
<знак операции сравнения> ::=<|>|<=|>=|=|<>
<разделитель> ::= ,|.|^|:|;|(|)|{|}|[|]|:=|'
<слово-символ>::= and|array|begin|case|...
Всякая программа состоит из лексем и символов-разделителей. К лексемам относят спецсимволы, имена, числа, метки, строки символов,директивы, к символам-разделителям — пробел, разделитель строк и комментарий.

Вопрос. ДАННЫЕ И ИНФОРМАЦИЯ. КОНЦЕПЦИЯ ДАННЫХ. ПОНЯТИЕ СТРУКТУР ДАННЫХ. ИЕРАРХИИ СТРУКТУР ДАННЫХ
Под данными будем понимать представление фактов, идей, знании в формализованном виде, пригодном для обработки в некотором процессе. Информация — смысл, который приписывается данным посредством принятых соглашений. Обрабатываемые в программах данные фигурируют в качестве значений различных програм мных объектов. Данные, которые зафиксированы и не могут быть изменены в процессе выполнения программы, являются значениями программных объектов, именуемых константами, остальные данные — значениями объектов, называемых переменными.
Данные могут объединяться в структуры. Структуру можно рассматривать как нечто целое и как объединение образующих ее элементов. В языке содержится широкий набор классов структур, в рамках которых можно создать новые структуры любой сложности.
В отношении структур данных существуют следующие особенности
1) всякое данное считается входящим в ту или иную структуру, самостоятельное данное рассматривается как простейшая, или тривиальная, структура;
2) элементом, или компонентой, структуры данных может быть не только тривиальная, но и нетривиальная структура, т. e. структуры данных обладают иерархическим характером;
3) в некоторые классы структур могут объединяться данные разных типов.
Как следует из пп. 1) — 3), понятие «значения» трактуется достаточно широко — это вся совокупность значений, образующих структуру. Понятие «тип значения» также понимается широко: это и количество компонент в структуре, и тип каждой из них, и способ их объединения в структуру.
Любой тип определяет множество возможных значений, их свойства, а также набор допустимых операций.

Вопрос. ДВЕ КЛАССИФИКАЦИИ ТИПОВ ДАННЫХ. ПОНЯТИЕ СТАНДАРТНОГО И ОПИСАННОГО ТИПА. ПЕРЕОПРЕДЕЛЕНИЕ ТИПОВ. ОРДИНАЛЬНЫЕ ТИПЫ ДАННЫХ. ОБЩАЯ ХАРАКТЕРИСТИКА
Рассмотрим две различные классификации типов данных:
1.Типы данных делятся на основные и производные (не делятся) -> основные делятся на ссылочный и скалярный (не делятся), скалярные делятся на стандартные и описанные.
2.Типы данных делятся на простые, ссылочные(не делятся) и составные(не делятся); простые делятся на вещественные+совместимые(не делятся) и ординальные; ординальные делятся на перечислимые (не делятся), диапазонные (не делятся), и стандартные, стандартные делятся на логический, символьный и целый+совместимые
ОРДИНАЛЬНЫЕ ТИПЫ ДАННЫХ
Общие черты ординальных типов таковы:
1) всякий ординальный тип описывает конечное и упорядоченное множество значений, которые отображаются на последовательность порядковых номеровО, 1, 2ит. д., исключениемявляетсятип1п^ег, который отображает последовательность значений на себя;
2) для любого ординального типа определены минимальное и максимальное значения;
3) для всякого значения, кроме первого, определено предшествующее, и для всякого значения, кроме последнего, — последующее;
4) для любых пар однотипных значений ординальных типов допустимы операции сравнения;
5) стандартные функции Succ (x), Pred (x), Ord (x) воспринимают аргументы любого ординального типа:Succ (x) — последующее для x значение; Pred (x) — предшествующее для x значение; Ord (x) — ординальный номер значения x.

Вопрос.СТАНДАРТНЫЙ ТИП INTEGER
Отличительные особенности стандартного типа Integer:
1)значения типа — элементы подмножества множества целых чисел
2 )наличие предописанной константы, хранящей максимальное целое — MaxInt, значение которой зависит от реализации языка;
3)точное выполнение операций над целыми, операнды которых также представляются точно, условие корректности операции АхВ имеет вид:
|А|<=MaxInt,|В|<=MaxInt,|AxB|<= MaxInt;
4)целые операции с целыми операндами: *,div,mod,+,-
5) целые функции вещественного аргумента: trunc(x)=[x] (округление отсечением дробной части), round(x)=a)trunc(x+0.5),x>=0;b)trunc(x-0.5)x<0;
6) целые фукции целого аргумента: abs(x)=|x|; sqr(x)=x^2;succ(x)=x+1);pred(x)=x-1;
7) две дополнительные операции над целыми, дающие целый результат: a shl b сдвиг а на b двоичных разрядов влево; а shr b сдвиг а на b двоичных разрядов вправо
Совместиемые типы: integer,word,shortint,byte,longint
СТАНДАРТНЫЙ ТИП BOOLEAN
Стандартный тип Boolean характеризуется следующими особенностями:
1)значения типа — предописанные константы false — ложь и true — истина;
2)Ord (false) = 0; Ord (trae) - 1 ; Succ (false) = true; Pred (true) = = false; false < true;
З)логические операции:Not — логическоеотрицание; And — логическое умножение; Ог — логическое сложение; Xor — исключающее логическое сложение;
4)odd(x),eof(f)
СТАНДАРТНЫЙ ТИП CHAR
Дадим краткую характеристику этому типу.
1. Значения данного типа — это элементы конечного и упорядоченного множества символов. Набор символов определяется реализацией языка.
2. Способы записи констант:
a)'A','a',T,'?' и т.д.;
6)#65, #13, #27,#9и т.д.
3. Набор символов считается пронумерованным начиная с 0. Упорядоченность значений данного типа понимается так, что, к примеру, независимо от реализации языка всегда справедливы следующие отношения:'A' < 'B' и Succ ('A') - 'B'; 'B' < 'C' и Succ ('B') - 'C'; '1' < '2' и Succ ('1') - '2' и т. д.
4. Для отображений множества символов на их порядковые номера и обратно имеется несколько функций:Chr (i) — символ с порядковым номером i; Ord (С) — порядковый номер символа С. Данные функции обратны по отношению к друг другу: Chr (Ord (C))~С;Ord(Chr(i))~i,с их помощью можно выразить стандартные функции Pred () и Succ ():Pred(C) = Chr(Ord(C)- 1);Succ (С) = Chr (Ord(С) + 1).
СТАНДАРТНЫЙ ТИП REAL
Тип Real характеризуется следующими особенностями.
1. Значения типа — подмножество множества вещественных чисел, определяемоереализациейязыка.
2. Значения представляются с точностью, также определяемой реализацией языка.
3. Стандартныеоперации: + , - , * , /.
4. Стандартные функции:Abs(x)—|х|;Ln (x)—ln x;Sqr(x)-x^2;Arctan(x)-arctg(x);Sqrt(x)-x^1/2; Sin(x)—sin x;еxp(x)—e^x;Cos(x)—cos x.
Совместимые типы: real,single,double,extended.

Вопрос.КОНЦЕПЦИЯ ДЕЙСТВИЯ
Действия, реализующие алгоритм, описываются в программе с помощью операторов. Оператор — ведущее понятие языка, это наиболее крупное и содержательное понятие, так как всякий оператор — это законченная фраза языка, определяющая некоторый вполне законченный этап обработки данных.
Рассмотрим классификацию операторов языка):
операторы делятся на основные и производные,основные делятся на пустые, перехода, присваивания, процедуры, производные делятся на составные, выбирающие, цикла, присоединения
СОСТАВНОЙ ОПЕРАТОР
Оператор предназначен для группировки входящих в него операторов-компонент и их последующего выполнения в порядке написания.

Вопрос.ОПЕРАТОРЫ ЦИКЛА
Операторы цикла предусмотрены для многократного повторения входящих в них операторов-компонент. Алгоритмический язык Паскаль определяет три разновидности данных операторов:
1) оператор цикла с параметром;
2) оператор цикла с предусловием;
3) оператор цикла с постусловием.
Когда число итераций цикла заранее известно, используют оператор цикла с параметром, в остальных случаях — оператор цикла с предусловием или постусловием.
Рассмотрим особенности организации указанного оператора.
1. Параметр цикла не должен изменяться в теле цикла:
а) он не должен находиться в левой части оператора присваивания;
б) не может быть параметром стандартных процедур Read и Readln;
в) не может быть параметром другого цикла внутри данного;
г) не может использоваться внутри процедур функций, описанных в даином блоке.
2. Если начальное значение параметра больше конечного при спецификации to, то цикл не выполнится ни разу.
3. Если начальное значение параметра меньше конечного при спецификации downto, то цикл не выполнится ни разу.
Рассмотрим вторую разновидность оператора цикла: (while) где <выражение> имеет тип Boolean. Его значение пересчитывается перед каждой новой итерацией. Данный оператор является реализацией базовой алгоритмической структуры «Цикл-Пока».
Диаграмма третьей разновидности оператора цикла имеет следующий вид: (repeat)где <выражение> также относится к типу Boolean. Его значение пересчитывается после каждой итерации. Последовательность операторов между repeat и until выполняется как минимум один раз. Данный оператор является реализацией базовой алгоритмической структуры «Цикл-До».
ВЫБИРАЮЩИЕ ОПЕРАТОРЫ
Выбирающие операторы предназначены для выбора одного из составляющих их операторов-компонент с целью его последующего выполнения. Имеются две разновидности выбирающих операторов — условный(if) оператор и оператор(case)варианта.

Вопрос.ПЕРЕЧИСЛИМЫЕ ТИПЫ ДАННЫХ
Перечислимые типы данных — совершенно новые, не связанные ни с какими другими типами данных. Определение любого перечислимого типа задает упорядоченное множество значений, которые представляют собой перечисление имен констант, обозначающих эти значения.
В языке над значениями перечислимых типов не определено никаких операций, поэтому в правой части оператора присваивания для переменной такого типа может быть:
1) константа такого же типа;
2) переменная такого же типа;
3) функция, возвращающая значение такого же типа.
Кроме того, стандартные средства ввода/вывода не могут быть применены к значениям перечислимых типов.
ИНТЕРВАЛЬНЫЕ ТИПЫ ДАННЫХ
Интервальный (или ограниченный, диапазонный) тип задается путем наложения ограничений на уже известный (описанный или предописанный) тип, который называется базовым по отношению к новому.
Наложение ограничений на некоторый базовый тип предполагает его ординалыюсть. В качестве базового здесь можно использовать стандартные ординальные и любые перечислимые. Из всего множества значений базового типа берется некоторый диапазон, который и принимается в качестве допустимого множества значений нового типа.
Над значениями диапазонного типа в силу его происхождения допустимы все операции, которые применимы к значениям базового типа.
Диапазонные типы были введены в целях повышения наглядности программ и их надежности.

Вопрос.СОСТАВНЫЕ ТИПЫ ДАННЫХ
Все ранее рассмотренные типы являлись скалярными и не имели выраженной структуры. Напомним, что под данными составного типа понимают и множество значений, и тип каждого из них, и способ их образования. Классификация: составные типы данных делятся на регулярные, комбинированные, множественные, файловые.
Какими бы ни были способ образования и структура значений составного типа, всегда можно указать предпочтительное представление данных в памяти.
В описании типа можно указать префикс packed, что заставит транслятор представить данные в памяти в упакованном виде. Однако экономия памяти требует дополнительного времени на упаковку и распаковку данных во время выполнения программы.

Вопрос.РЕГУЛЯРНЫЙ ТИП ДАННЫХ
Значения регулярного типа — массивы. Как обычно, под массивом будем понимать упорядоченный набор некоторого фиксированного количества однотипных данных, объединенных одним именем.
Говоря о массивах, вводят в рассмотрение понятия полной переменной и частичной переменной.Полная переменная — имя переменной регулярного типа.
Так как значение индекса — всегда конкретное данное, с помощью которого можно однозначно определить местоположение любого элемента в массиве, то тип индекса может быть только скалярным.
В качестве типа индекса можно использовать любой перечислимый тип.
МНОГОМЕРНЫЕ МАССИВЫ
Определение регулярного типа допускает рекурсию. Так как компоненты массива не обязаны быть скалярными, то конструкцию array[<ординальный тип>] of <тип> можно записать следующим образом array[<ординальный тип>] of array[<ординальный тип>] of <тип>

Вопрос.АДРЕСАЦИЯ ПАМЯТИ В ЭВМ.ПОНЯТИЕ ПАРАГРАФА И СМЕЩЕНИЯ
Объем памяти, используемой для программ и данных определяется числом микросхем, физически установленных в ЭВМ. Однако, в плане программирования на память следует смотреть не с точки зрения физического объема, а с точки зрения адресации.К примеру, Intel 8088 может адресовать 1МБ памяти, это максимальное количество байтов(адресов), к которым может обратиться CPU
Обращение к байту памяти происходит с помощью 20-разрядного адреса, т.е. шина адреса Intel8088 является 20-разрядной, диапазон адресов - 00000:FFFFFF
Оперативную память в 1МБ делят на 16 блоков размером по 64 КБ. Нумерация каждого блока совпадает со старшей цифрой адреса. Такое разбиение условно, но оно отражает логическую организацию памяти.
Intel8088 - 16-разрядный CPU, т.е. теоретически он может обратиться к 64 КБ памяти. Однако реально это 1 МБ. Расширение адресации стало возможным благодаря сегментированию памяти. CPU делит адресное пространство на произвольное количество блоков, размером не более 64 КБ. Адрес любого такого блока должен быть кратным 16. Такой адрес называется параграфом сегмента.Для обращения к ячейке внутри такого блока используется еще один адрес, называемый смещением. Он указывает на начало некоторой ячейки относительно параграфа. В результате реальный адрес образуется путем объединения 16-разрядного параграфа и 16 разрядного смещения.
Параграф всегда можно записать в виде 5-значного 16-ричного, последняя цифра которого 0. Смещение записывают в виде 4-значного 16-ричного.
Если заданы FFA20 - параграф и 0015 - смещение, то реальный адрес FFA35 принято записывать в виде FFA2:0015

Вопрос.ТЕКСТОВЫЙ РЕЖИМ ЭКРАНА И СТРУКТУРА БУФЕРА VRAM.
Модуль CRT отвечает за следующие функции: 1)установка текстовых режимов экрана;2)управление выводом на экран;3)управление клавиатурой;4)управление звуком;5)управление буфером видеопамяти.
Дисплей может функционировать в двух режимах: текстовом и графическом. В текстовом режиме минимальный элемент изображения - символ
Текстовый режим устанавливает процедура TextMode(mode:byte);
Устанавливаемый режим должен согласовываться с типом адаптера. Приведем виды адаптеров: MDA - Mono Digita,CGA - Color Graphic,VGA - Video Graphic, EGA - Enhanced Graphic,SVGA - Super Video Graphic
Установка определенного адаптера позволяет зафиксировать сегментный адрес буфера VRAM: $B000:$0000 - для ч/б режима, $B800:$0000 - для цветного режима.
Для стандартного режима 80х25 имеем возможность отразить на экране до 2000 символов, каждый из которых представлен в VRAM 2 байтами: 1 байт - ординальный номер выводимого символа, 2ой - бит яркости и 3 бита цвета (RGB) для фона, и бит яркости и 3 бита цвета (RGB) для символа.
Для доступа к символу в VRAM используют следующие формулы: смещение байта символа=(положение символа на экране по х - 1)*2+(положение символа на экране по e-1)*160
смещение байта аттрибута=смещение байта символа+1
Для установки цветов имеются стандартные процедуры TextColor и TextBackGround
Стандартная write выводит символы на экран в двух режимах: 1) обычный(default) - основан на использовании стандартного прерывания 10Н, а точнее его функции вывода символа на экран. В результате выводимые символы образуют поток, отображаясь друг за другом на экране с текущей позиции и с заданным аттрибутом цветности. При этом символы автоматически записываются в VRAM и отображаются на экране.
2) выводимые символы образуют поток, управляемый программистом. В основе способа лежит возможность вывода символов в VRAM напрямую. Для этого используются специальные массивы: Mem[<параграф>:<смещение>} - доступ к байту; MemW[<параграф>:<смещение>] - доступ к слову
Используется режим DirectVideo:=false, так как подпрограмма обработки прерывания 10h находится в ПЗУ и учитывает все особенности конфигурации данной ЭВМ. При использовании этого режима программист ориентируется на более устойчивый логический стандарт организации вывода, при котором обеспечивается 100% совместимость ПО и ЭВМ других конфигураций.
Буфер VRAM может понадобиться в различных ситуациях, например, для сохранения образа экрана с целью его дальнейшего восстановления

Вопрос.СТРОКИ СИМВОЛОВ И СТРИНГИ.
Если содержимое строки заранее известно, то используют символьную константу, иначе можно применить массив следующего типа: packed array[1..n] of char,n>1. В Паскале такой массив называется строкой символов.
Семейство компиляторов Turbo Pascal(Borland) позволяет использовать еще одно средство для обработки символьных данных - стринги. Следует отметить, что строки символов и стринги различаются по организации и средствам обработки. Для описания стрингов используется идентификатор String
Структура стринга такова, что в памяти он занимает на один больше, чем максимально заявленная в описании длина. Дополнительный байт является служебным. Он хранит символ, ординальный номер которого равен текущей длине данного стринга.
Рассмотрим некоторые стандартные средства обработки стрингов.
1. Присваивание выполняется слева направо с отсечением избыточных символов, если они есть.
2. Сравнение стрингов. Любые пары стрингов можно сравнить. Два стринга равны, если а)они одинаковой длины, б) состоят из одинаковых символов.
Если стринги не равны, то отношение между ними выясняется с помощью отношения первых двух несовпадающих символов. Если два стринга совпадают до последнего символа, то более короткий из них считается меньшим.
3.Катенация(конкатенация)-это операция сцепления двух стрингов в один.Существуют правая и левая катенации.
4. Функция Length возвращает длину данного стринга, обращение к ней имеет вид: length(<стринг>)
5. Процедура str преобразует значение числового выражения в эталонную последовательность, которая затем преобразуется в стринг. str(<числовое выражение>,<стринг-переменная>). Если выражение целое, то эталон-изображение целого числа с минимально необходимым количеством знаков.Если первый параметр дополнить квалификатором длины, то эталон выравнивается по правому полю, а затем формируется стринг.
6. Процедура Val преобразуетс стринг в число, если это возможно. Val(<стринг>,<переменая>,<индикатор>); <индикатор> принимает значение 0, если преобразование прошло нормально, в остальных случаях это значение первого недопустимого символа.
7.Функция Copy выделяет из стринга его часть. Copy(<стринг>,N,M), где N-начальная позиция, M-длина выделяемой части стринга.Если N>length(<стринг>), то результат - пустая строка. Если N+M>length(<стринг>), то M пересчитывается следующим образом: М=length(<стринг>)-N+1
8. Функция Concat позволяет сцепить два и более стринга в один.
9. Функция Pos возвращает позицию начала вхождения <стринга1> в <стринг2>. Pos(<стринг1>,<стринг2>).Если такого вхождения не обнаружено, то функция возвращает нулевой результат.
10. Процедура Insert предназначена для вставки <стринга1> в <стринг2>, начиная с позиции N. Insert(<стринг1>,<стринг2>,N). Если N>Length(<стринг2>),то значение N пересчитывается в следующем порядке: N=length(<стринг2>)+1
11. Процедура Delete используется для удаления из стринга цепочки символов с позиции N длиной M.Delete(<стринг>,N,M)

Вопрос.КОМБИНИРОВАННЫЙ ТИП ДАННЫХ
Комбинированный (записной) тип данных — это мощный механизм для построения структур данных самой произвольной природы. В общем случае значения этого типа представляют нетривиальные структуры данных. Значение комбинированного типа называется записью. Всякий комбинированный тип определяет некоторую структуру, всякий ее элемент в свою очередь может иметь достаточно сложное строение. Однако в качестве концевых структур комбинированного типа могут быть только тривиальные структуры.
Отличия записей от массивов:
1) компоненты записи могут иметь различные типы;
2) доступ к компоненте записи осуществляется не по индексу, а по имени.
Комбинированные типы предназначены для описания объектов, имеющих сложное неоднородное строение. Часто они используются при разработке информационных систем. Действительно, элементы таких систем имеют разнородное содержание.
Компоненты структуры данных комбинированного типа называются полями. Для каждого поля определяются имя и тип. Так как на тип поля нет ограничений, то оно вновь может определять комбинированную структуру. Таким образом, записной тип имеет ярко выраженный иерархический характер. На одном уровне иерархии имена полей должны быть различны, а на разных уровнях могут повторяться.
При работе с конкретными полями значений данного типа необходимо указывать так называемые квалифицированные (уточненные) имена: <имя записи> . <имя поля>
Аналогом селектора записи в массивах является индекс.
При определении комбинированного типа можно использовать любые простые и производные типы.Иногда уточненные имена оказываются слишком длинными, поэтому для их сокращения используют оператор присоединения "with".
В отношении оператора присоединения существует несколько особенностей.
1. Идентификатор поля в операторе присоединения обозначает компоненту комбинированной переменной из ближайшего объемлющего оператора присоединения, в котором указана переменная с таким полем.
2. При определении некоторого комбинированного типа имена полей могут совпадать с именами обычных переменных. Внутри оператора присоединения предпочтение отдается не переменной, а полю записи.
Над значениями комбинированного типа не определено никаких операций, кроме x := у, где x и у — переменные одного типа.
Стандартные процедуры ввода/вывода не позволяют ввести или вывести значение переменной комбинированного типа одной операцией.

Вопрос.ЗАПИСИ С ВАРИАНТАМИ
Иногда содержимое отдельной записи зависит от значения одного из ее полей. Такой тип записи содержит фиксированную часть, общую для всей записи, и вариантную, содержимое которой зависит от значения одного из полей. Первое поле вариантной части предназначено для определения того, какой из вариантов имеет данная запись. Поле признака в вариантной части является необязательным. Если оно указано, то говорят о размеченном объединении типов, в противном случае — о свободном (неразмеченном) объединении типов. Последний способ используется редко, например в случае, когда требуется по-разному трактовать одно и то же поле или последовательность полей. Его можно считать аналогом переопределений, принятых в некоторых языках программирования.
Если поле признака указано, то можно однозначно определить вариант, который активен в данный момент, однако доступ к полям вариантной части возможен только тогда, когда поле признака примет некоторое значение. При доступе к вариантной части выяснение того, какой именно из вариантов будет использован, возлагается на программу.
Когда компилятор выделяет область памяти под переменную комбинированного типа с вариантной частыо, вычисляется наибольший возможный размер записи путем прибавления к размеру фиксиро-вашюй части размера наибольшего варианта. Затем под переменную выделяется память, способная вместить наибольшую запись.
Так как разные вариантные части для своего представления используют один и тот же фрагмент памяти, то требуемый для хранения записи с вариантами объем памяти меньше, чем при описании всех возможных полей в фиксированной части без вариантов.

Вопрос.МНОЖЕСТВЕННЫЙ ТИП ДАННЫХ
Множественный тип данных имеет непосредственное отношение к фундаментальному понятию математики — множеству. В языке программирования Паскаль допустимы только конечные множества. Максимальная мощность множеств в рассматриваемой реализации языка — 256 элементов. В общем случае она определяется реализацией языка. Все элементы множества относятся к одному типу, который должен быть ординальным. Конкретные значения множественного типа образуются из элементов, тип которых называется базовым по отношению к множественному типу.
Значением множественного типа является множество. Конкретные значения данных множественного типа задаются с помощью так называемого конструктора множеств. Он представляет собой список элементов множества, заключенный в квадратные скобки. Заключение в квадратные скобки некоторого количества элементов можно рассматривать как операцию образования множественного значения. Это одна из операций в языке, которая на основе значений одного типа позволяет получить значения совершенно другого типа.Компиляторы семейства Turbo Pascal на каждый элемент множества отводят в памяти 1 бит.
ОПЕРАЦИИ НАД МНОЖЕСТВАМИ
Над множествами допускаются следующие операции:
1) присваивание;
2) объединение, пересечение, разность;
3) сравнение.
Все операции применимы к значениям одного множественного типа:
1) A := В, где А — переменная; В — выражение;
2) А + В - объединение, А * В — пересечени}, А - В — разность;
3) А = В — равенство,А <> В — неравенство, A <= В - А из В, А >= В - В из А, x in А — X из А.

Вопрос.ФАЙЛОВЫЙ ТИП ДАННЫХ
Существование широкого класса задач, в которых количество обрабатываемых данных заранее неизвестно, порождает необходимость использования специального типа — файлового. Его значения представляют собой произвольные последовательности из однотипных элементов. Длина таких последовательностей заранее неизвестна и определяется только в процессе выполнения программы.
Важной особенностью файлов является учет специфики внешних носителей, на которые переносятся данные. Файловый тип в языке Turbo Pascal — этоединственныйтип, посредствомкоторогоданные могут быть получены извне и переданы во внешний мир, который связывает программу с внешними запоминающими устройствами ЭВМ.
Объекты файлового типа в отличие от массивов, записей и множеств представляют собой структуру с последовательным доступом к компонентам.
Определение всякой файловой переменной F автоматически порождает буферную переменную, связанную с F.
Данная переменная относится к типу компонент файла. Буферную переменную можно рассматривать как некое «окно», через которое можно либо прочитать данные, либо записать новые данные. При выполнении ряда операции окно автоматически передвигается. Если указатель достиг конца файла, то значение буферной переменной считается неопределенным.
Рассмотрим стандартные процедуры, которые используют буферную переменную.
1. Reset (F); — открытие файла F на чтение. «Окно» перемещается к первой записи, значение которой присваивается Ft; Eof (F) = = false.
2. Rewrite (F); — файл заменяется на пустой, даже если он не существовал ранее. Значение Ft не определено, Eof (F) = true.
3. Get (F); — продвижение «окна» к следующей компоненте файла и присваивание Ft значения этой компоненты. Если Eof (F) = true, то значение Ft считается неопределенным.
4. Put(F); — запись в файл значения буферной переменной F, т.е. добавление новой записи.Если при этом eof(f)=false, то такая ситуация считается ошибочной.После выполения операции eof(f)=TRUE, значение F не определено.
С помощью процедур 1-4 и функции eof можно описать любые действия по обработке последовательных файлов. Стандартные процедуры Read и Write объединяют в себе перемещение "окна" с обращением к буферной переменной.
В семействе компиляторов Turbo Pascal буферные переменные недоступны, однако это не снижает ценности этого языка.
Рассмотрим стандартные процедуры языка Паскаль для работы с файлами:
1. Процедура Assing организует связь между файловой переменной и реальным файлом на диске.
2. Процедура Close используется для закрытия файла, после чего связь между файловой переменной и файлом не теряется.
3. Процедура Rename предназначена для переименования файла: Rename(<файловая переменная>,<новое имя>)
4. Процедура Erase предназначена для удаления файла с диска: Erase(<файловая переменная>)
5. Процедура Seek предназначена для установки указателя файла на конкретную запись. Записи нумеруются с нуля. Seek(<файловая переменная>,<номер записи>)
6. Функция Filesize возвращает размер файла в логических единицах: Filesize(<файловая переменная>):Longint
7. Функция Filepos возвращает текущую позицию указателя файла.

Вопрос.ТЕКСТОВЫЕ ФАЙЛЫ
Существует особая разновидность файлов — текстовые, которые отличаются по организации от любых других файлов. Текстовый файл представляет собой последовательности из литер (Char), разделенных на строки. Каждая такая строка отделена от другой специальной управляющей комбинацией CR/LF (CR — Carriage Return — возврат каретки; LF — Line Feed — перевод строки). Всякий такой файл завершается символом Ctrl + Z
Для описания текстовых файлов используют спецификатор Text. Следует заметить, что текстовый файл не эквивалентен файлу типа Т, где Type Т = File of char. Файл типа Т — это единая цепочка символов, в то время как в текстовом файле цепочки символов отделены друг от друга управляющей комбинацией CR/LF. Эти цепочки являются логическими строками текста.
Стандартная функция Eoln (F) имеет непосредственное отношение к обработке комбинации CR/LF, а стандартные процедуры Readln и Writeln осуществляют пропуск (при чтении) или добавление в файл (при записи) именно этой комбинации.
Независимо от положения указателя в каком либо месте текста выполнение readln приводит к перемещению указателя к началу следующей строки этого текста.
Для проверки корректности ввода/вывода при работе с файлами используют встроенную функцию IOResult:Integer, которую можно применять только в том случае, когда отключены стандартные средства обработки ошибок ввода/вывода.Эти средства отключаются директивой {$I-}, а включаются директивой {$I+}. Довольно часто встречаются ситуации, когда функция IOResult возвращает следующие значения: 2 - файл не найден, 3 - путь не найден, 105 - файл недоступен для вывода.

Вопрос.ПРОЦЕДУРЫ И ФУНКЦИИ ПОЛЬЗОВАТЕЛЯ
В процессе разработки программ нередко возникают ситуации, когда в различных местах алгоритма выполняются одни и те же или очень похожие действия. Такие действия образуют некоторую подзадачу, имеющую относительно самостоятельное значение. Часто в целях повышения надежности программ и их наглядности эти подзадачи выделяют в самостоятельный программный объект, называемый подпрограммой. В языке Pascal подпрограммы могут быть оформлены в виде процедуры или функции пользователя.
Рассмотрим директивы, которые используются при описании подпрограмм.
1. Assembler. Тело подпрограммы реализуется с помощью встроенного ассемблера.
2. External. Подпрограмма вызывается как внешняя.
3. Far. Генерация кода программы, рассчитанного на дальнюю модель вызова.
4. Near. Генерация кода программы, рассчитанного на ближнюю модель вызова. (По умолчанию все подпрограммы интерфейсной части модуля ориентированы на дальнюю модель вызова, а все остальные — на ближнюю. Ближняя модель предполагает вызов в пределах кодового сегмента CS, т. e. в пределах 64 Кб. Дальняя модель вызова требует дополнительной памяти и несколько больше машинного времени.)
5. Forward. Опережающее (предварительное) описание подпрограммы.
6. Inline. Тело подпрограммы реализуется с помощью встроенных машинных команд.
7. Interrupt. Подпрограмма предназначена для обработки прерывания.

Вопрос.ПОДПРОГРАММЫ.АППАРАТ АРГУМЕНТОВ-ПАРАМЕТРОВ.
Подпрограммы могут не иметь формальных параметров.При этом предполагается, что все неизвестные в подпрограмме переменные и имена констант считаются описанными в блоке, включающем данную подпрограмму. Блок подпрограммы имеет такую же структуру, что и блок основной программы.
Недостаток некоторых подпрограмм в том, что они слишком жестко настроены на конкретные программные объекты основной программы. Избавиться от этого недостатка позволяет механизм аргументов-параметров.Формальные параметры представляют собой не какие-то конкретные значения, а значения вообще.При каждом обращении к процедуре(функции) ее формальные параметры конкретизируются.Конкретизация формальных параметров происходит при активации процедуры(функции). Активация осуществляется с помощью оператора процедуры.При активации процедуры между формальными и фактическими параметрами устанавливается взаимооднозначное соответствие. При этом должно выполняться соглашение о соответствии типов между формальным и фактическим параметром.
Параметры бывают четырех видов: 1)параметры-значения(значение);2)параметры-переменные(var);3)функциональные параметры(функция);4)процедурные параметры(процедура)
Основное назначение процедурных и функциональных типов - дать возможность передать функции и процедуры другим подпрограммам.

Вопрос.ЛОКАЛЬНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ. ЛОКАЛИЗАЦИЯ ПОДПРОГРАММ
При трансляции программы создается список глобальных переменных, т. e. переменных, явно описанных в основной программе. Когда транслируется подпрограмма, то создается список локальных переменных, которые явно описаны в данной подпрограмме.
Когда в подпрограмме встречается имя переменной, оно сначала ищется в списке локальных переменных. Если это имя не найдено, то поиск происходит в списке глобальных переменных.
Таким образом, в подпрограмме предпочтение отдается локальной переменной, а не глобальной. После выполнения подпрограммы выделяемая ею при активации память освобождается. Отсюда следует, что механизм локализации делает невозможным использование локальных программных объектов за пределами подпрограммы.
Идея локализации применима не только к переменным, но и к процедурам и функциям. Любая подпрограмма в своем блоке может содержать описание других подпрограмм, которые будут локализованы в ней. За ее пределами к таким подпрограммам обратиться нельзя.

Вопрос.РЕКУРСИВНЫЕ ВЫЧИСЛЕНИЯ И РЕКУРСИВНО ОПРЕДЕЛЕННЫЕ ДАННЫЕ
Рекурсивным называется объект, частично состоящий или определяемый с помощью самого себя.
Мощность рекурсивных построений заключается в том, что рекурсивное конечное высказывание может прородить бесконечное множество объектов
Аналогично, с помощью конечной рекурсивной программы можно получить бесконечное число вычислений, причем программа не будет содержать явных итераций (повторений)
Подпрограмма называется пряморекурсивной, если она имеет явную ссылку/вызов на саму себя
Если некоторая подпрограмма явно вызывает другую подпрограмму, которая в свою очередь вызывает (явно или косвенно) первую, то первая называется косвенно рекурсивная.Часто с подпрограммами связывают множество локальных объектов, явно описанных в этой подпрограмме и сущесвующих только в процессе ее выполнения. При каждой рекурсивной активации подпрограмма порождает новое множество локальных объектов. Т.к. они имеют те же имена, что и соответствующие им объекты предыдущего поколения, конфликта не возникает - каждый объект имеет в программе свою сферу действия.
Механизм рекурсивных вычислений основан на использовании специальной области памяти - стековой. В процессе выполнения программы данные в стековом сегменте постоянно изменяются. Через него передаются параметры в подпрограммы. Здесь же находятся все программные объекты, явно описанные на уровне подпрограммы. Вложенность в подпрограмме также обеспечивается благодаря стековому сегменту
Переполнение стека приводит к нарушению целостности данных (потеря данных в сегменте данных). Отсюда следует, что максимальный уровень рекурсивных вызовов в каждой программе определяется объемом свободного пространства в стековом сегменте.
Рекомендации по использованию рекурсии:1)рекурсии следует избегать там, где есть очевидные итерационные решения;2)алгоритмы,рекурсивные по своей природе,следует оформлять в виде рекурсивных подпрограмм;3)рекурсивные алгоритмы особенно подходят для обработки структур данных, определеных в терминах рекурсии (списки, деревья и т.д.)
При каждом (рекурсивном) вызове подпрограммы выполняются действия:1)запоминание адреса возврата в стеке;2)переход к выполнению первой команды подпрограммы
При каждом возврате из подпрограммы выполняются действия:1)выборка верхнего адреса из стека2)переход по выбранному адресу
Рекурсивность - это не свойство самой подпрограммы, а лишь свойство ее описания.

Вопрос.СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ ОБЪЕКТЫ
Все ранее рассмотренные программные объекты относились к статическим. Это объекты, которые порождаются перед началом выпол нения программы, существуют в течение всего времени ее выполне ния и размер их значений не изменяется в ходе выполнения про граммы. Статические объекты описываются в соответствующем разделе.
Достоинство данных объектов состоит в том, что размер их значений заранее известен, память для них можно выделить уже на этапе трансляции программы. Ссылка на статический объект записывается виде его имени, т. e. доступ осуществляется по имени. Однако c точки зрения получения эффективной программы использование только статических объектов не всегда оправданно. Действительно, не всегда известен размер значения того или иного объекта, даже неиз^ вестно, понадобится ли вообще тот или иной программный объект в процессе данного выполнения программы. Эти проблемы можно устранить с помощью динамических объектов.
Программные объекты, размер значений которых заранее неизвестен или изменяется в ходе выполнения программы, называются] динамическими объектами. Для работы с ними предусмотрен специальный тип данных — ссылочный.

Вопрос.ПОНЯТИЕ ДАННЫХ ССЫЛОЧНОГО ТИПА.ПЕРЕМЕННЫЕ С УКАЗАТЕЛЕМ.
Значением ссылочного типа является ссылка на некоторый программный объект. На машинном языке такая ссылка представляет собой указатель (адрес) на некоторую ячейку памяти. При работе с динамическими объектами каждому из них соответствует статическая переменная ссылочного типа. С помощыо статических переменных и описываются все действия над динамическими объектами.Переменные ссылочного типа описываются обычным способом в соответствующем разделе. Примеры
1. Type massiv = аггау [1..100] of byte;massiv_ukaz = ^massiv; var ukazl: massiv_ukaz;
2. Type int_ukaz= ^integer;char_ukaz= ^char; var p : int_ukaz; q : char_ukaz;
3. Var p : ^integer;q : ^char;
Из описания следует, что p — ссылка на динамический объект целого типа; q — ссылка на динамический объект символьного типа. Указатель ukazl — это ссылка на объект регулярного типа, значением которого является массив из 100 чисел байтового диапазона. Несмотря на то, что переменные ukazl, p и q связаны с объектами разных типов, все они имеют нечто общее — их значения указывают на определенное место в памяти, соответствующее началу некоторого динамического объекта. Нормальной считается ситуация, когда значение указателя не связывает его с конкретным динамическим объектом, т. e. значение ссылки пусто. Такое значение задается словом-символом NIL.

Вопрос.ПОРОЖДЕНИЕ И УНИЧТОЖЕНИЕ ДИНАМИЧЕСКИХ ОБЪЕКТОВ
Важно отметить факт, что описание ссылочной переменной вовсе не связано с существованием динамического объекта, на который эта Переменная может ссылаться, т. e. описание ссылочной переменной не определяет значения этой переменной. Описание Var P : ^D; говорит лишь о том, что значением P могут быть ссылки на объект типа D. Непосредственное порождение динамического объекта выполняет процедура new(<ссылочная переменная>). В результате ее выполнения реально появляется динамический объект, а <ссылочная переменная> получает значение - ссылку на только что порожденнный динамический объект. При этом он не получает никакого значения, т.е процедура new имеет тот же смысл, что и описание аналогичного статического объекта.
Для доступа к динамическому объекту используется переменная с указателем. Переменную с указателем можно использовать везде, где допустимо применение переменных того же типа, что и тип динамической переменной. В качестве ссылочной переменной может использоваться и более сложная конструкция, например динамический массив (getmem).
Динамический массив порожден с помощью стандартной процедуры getmem, в которой в качестве второго параметра задается количество байтов, необходимых для размещения порождаемого объекта. Первый параметр - адрес, начиная с которого в памяти будет размещен линейный вещественный массив заказанного размера. В процессе работы программы некоторые динамические объекты могут стать ненужными. От них избавляются с помощью стандартной процедуры dispose(<ссылочная переменная>) или freemem (для дин. массивом, например)
В результате динамический объект исчезает, значение ссылочной переменной считается неопределенным, а память, занимаемая динамическим объектом, может быть использована в других целях. Следует отметить, что уничтожается только динамический объект, но не ссылка на него.
ДЕЙСТВИЯ НАД ССЫЛКАМИ
Над значениями ссылочного типа в языке не определено каких-либо операций, которые давали бы результат того же типа. Данное обстоятельство связано с тем, что язык не предусматривает правил размещения программных объектов в памяти (этим занимается транслятор). Над значениями ссылочного типа допустимы только оператор присваивания и некоторые операции сравнения: U:=V. Здесь в качестве V может быть 1) Nil;2) переменная ссылочного типа; 3) функция, возвращающая значения того же ссылочного типа.
Отличительные особенности использования динамических объектов:
1)вместо описания динамического объекта в программе дается описание указателя на него.
2) работа с таким объектом возможна только после его порождения соответствующими программными средствами
3) для доступа к динамическому объекту используется переменная с указателем
Использование динамических объектов имеет ряд недостатков:
1)замена статической переменной на динамическую увеличивает код программы.
2)использование переменных с указателем снижает наглядность программы.
3)применение динамических объектов (создание, обработка, уничтожение) снижает быстродействие программы
Применение операции сравнения по отношению к значениям ссылочного типа сводится лишь к использованию следующих операций: 1) = ; 2) <>. Два значения равны, если они оба пустые ссылки (nil) или указывают на одно место в оперативной памяти

Вопрос.ПРОБЛЕМА ПРОГРАММНОГО МУСОРА И "ВИСЯЧИХ" ССЫЛОК
При использовании динамических объектов необходимо строго следить за процессом их порождения и уничтожения, иначе может быть сбой программы или системы в целом. Одна из причин этого связана с проблемой программного мусора, под которым можно понимать динамические объекты, порожденные в ходе выполнения программы и ставшие недоступными в результате неверных операций:
var p,q:^integer;begin new(p);new(q);p^:=100;q^:=200;p:=q;
Видно, что динамический объект со значением 100 превратился в программный мусор - его нельзя ни использовать, ни уничтожить.
Висячие ссылки возникают при уничтожении динамического объекта, когда на него указывают несколько ссылочных переменных одновременно: var p,q:^integer;begin new(p);new(q);p^:=100;q^:=200;p:=q;dispose(q);

Вопрос.ПОНЯТИЕ ТАБЛИЦЫ
Информационно-справочное обслуживание — широко распространенный вид услуг, эффективно реализуемых с помощью ЭВМ. Хранимые сведения, как правило, представляются записями. Типичные операции в таких системах — поиск и выдача требуемой записи. Для этих целей можно использовать структуру данных, называемую таблицей. В ней любой записи соответствует определенное имя. При этом в заказе на выдачу требуемой информации необходимо указать только имя записи, а реализация структуры должна обеспечить ее быстрый поиск.
Итак, таблица — это некоторый набор поименованных записей. Их имена могут выбираться произвольно, однако любые два имени могут сравниваться. Имена записей называются ключами. Каждая запись содержит свой ключ и некоторую связанную с ним информацию. Над таблицами традиционно определены операции:
1) поиск записи по заданному ключу;
2) включение в таблицу записи с заданным ключом;
3) удаление записи с заданным ключом.
Существует много способов организации таблиц, каждый из кото- j рых имеет свои достоинства и недостатки. Рассмотрим некоторые из них.
ПРОСТАЯ ЦЕПОЧКА
Простейший способ организации таблицы — однонаправленный список. Любое звено имеет следующую структуру:
Достоинства подобной организации списка:
1) экономичность представления информации (дополнительная информация в звене всего лишь ссылка на следующее звено);
2) простота перебора записей при поиске;
З)простота включения в таблицу заведомо новой информации.
Однако имеются и недостатки:
1) поиск может оказаться слишком длительным (здесь под поис-1 ком понимается последовательный перебор записей, в среднем поиск требует перебора [N/2] элементов; если n велико, то время поиска может оказаться неприемлемым);
2) если в таблице нет элемента с заданным ключом, то для установления этого факта необходимо перебрать все n элементов.

Вопрос.ПОНЯТИЕ ТАБЛИЦЫ. ЦЕПОЧКА С УПОРЯДОЧЕННЫМИ ЗАПИСЯМИ
Цепочка с упорядоченными записями
Недостаток, связанный с отсутствием в таблице элемента с заданным ключом, можно устранить, если в таблице поддерживать определенный порядок следования записей, например по возрастанию ключей. Поиск требует в среднем просмотра [N/2] элементов независимо от нахождения в таблице записи с заданным ключом. В этом случае поддержание упорядоченности записей требует определенных затрат, так как включение в таблицу новой записи становится более трудоемкой операцией. Эти затраты оправдываются, если включение производится редко, а поиск — часто.

Вопрос.ДИХОТОМИЧЕСКИЙ ПОИСК В ТАБЛИЦЕ
Основной недостаток представления таблицы в виде списка состоит в том, что для поиска и включения новой записи необходимо последовательно перебирать элементы. Для ускорения поиска применим следующую структуру:
При такой организации информационная часть хранится отдельно от ключей (при ключе — только ссылка на нее). Как видно, все элементы таблицы имеют одинаковую структуру, следовательно, их можно объединить в массив (вектор): Type IND = l..N;
Info = TInfo; {тип информационной части} TUKaz = ^Info; Type Zapis = Record;
Key : integer; Ukaz : TUkaz end;Type Vector = array [ind] of zapis; Var x : Vector;
Пусть компоненты массива упорядочены по возрастанию ключей.
В этом случае появляется возможность получить прямой доступ к любому элементу таблицы с помощью индексированной переменной X[i].Key. Данные обстоятельства позволяют применить эффективный метод поиска — дихотомический.
Теперь задача сводится к нахождению элемента массива с заданным значением ключа. Информационную часть получаем с помощьет конструкции x[i].Ukaz^.
Первоначальной зоной поиска является весь интервал индексов! от 1 до n. Далее берем компоненту с индексом I = [n /2]. Если1 требуемый ключ найден, то поиск закончен. Если k < x[i].Key, то в качестве правой границы поиска берем I - 1, иначе в качестве левой — I + 1. В результате на каждом шаге зона поиска становится в два раза короче. В любом случае для поиска требуется не более (1 + log2n) шагрв. Эффект дихотомии быстро растет с увеличением n.
Оформим подпрограмму в виде функции, которая в качестве побочного эффекта возвращает номер компоненты, содержащей задан ный ключ.
Function DXTM (k : integer; var m : integer): Boolean; Var L_gr, R_gr : integer; B : Boolean; i : IND; Begin
L_gr := 1; {левая граница интервала поиска}
R_gr := n; {правая граница интервала поиска}
В := false; {ключ не найден?}
M := 0; {инициализация побочного результата} Repeat
i := trunc (( L_gr + R_gr ) / 2 + 0.1); if К = x[i].key then Begin В := true; M := i 'End else iF k < x[i].Key then
R_gr := i - 1 else L_gr := i + 1 Until b or (L_gr > R_gr); DXTM := b End;

Вопрос.Двоичные деревья
Представление таблицы в виде списка с упорядоченными ключами обеспечивает быстрый поиск, но оно плохо приспособлено для реализации операций вставки и удаления записей, так как для поддержания упорядоченности компонент таблицы часть из них приходится сдвигать вправо или влево.
Организация списка в виде дерева позволяет одинаково эффективно реализовать все три основные операции над таблицей. Причем эта эффективность близка к эффективности дихотомии. Представляя таблицу в виде дерева, будем считать, что информационная часть хранится отдельно.
Элемент дерева имеет следующую структуру:
Каждую вершину дерева представляют четыре поля:
1) ключ;
2) ссылка на левую ветвь;
3) ссылка на правую ветвь;
4) ссылка на информационную часть. Опишем типы данных:
Type Info = TInfo; {тип информационной части} TUkaz = ^Info; TZveno_Ukaz = ^Zveno; Zveno = Record; Key : integer; Left : TZveno_Ukaz; Right : TZveno_Ukaz; U : TUkaz End;
Var B_Derevo : TZveno_Ukaz;
Логическая функция поиска Poisk в качестве побочного эффекта возвращает ссылку на найденную вершину (в случае успеха). Function Poisk (k : integer; var d, {d — указатель на дерево} Result : TZveno_Ukaz) : Boolean; Var b : Boolean;
P : TZveno_Ukaz; Begin
В := false; {ключ не найден?} P := d;
if d <> nil then Repeat if k = p^.Key
then b := true else
if k < p^.key then p := p^.left
else p := p^. right Until b or (p = nil); Result := p; Poisk := b End.
Для выполнения операции вставки функция Poisk непригодна так как она не фиксирует вершину, из которой была выбрана пустая ссылка nil. Функция Poiskl в качестве побочного эффекта фиксирует ссылку на вершину с заданным ключом (успешный поиск), либо ссылку на вершину, после обработки которой поиск был прекращен (неуспешный поиск).

Вопрос.РЕКУРСИВНЫЕ ДИНАМИЧЕСКИЕ ОБЪЕКТЫ. ОЧЕРЕДИ И СТЕКИ. ОПЕРАЦИИ НАД СТЕКОМ. ОПРЕДЕЛЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ
Наиболее простой способ объединить или связать некоторое множество элементов - вытянуть их в линию, т.е. организовать последовательность или список. В простейшем случае при реализации этой структуры понадобится всего одна ссылка для каждого элемента, которая будет указывать на следующий элемент списка,если он есть.
Над очередью определены две операции: а)занесение элемента в очередь (заказ на обслуживание);б)удаление элемента из очереди (обслуживание)
Различают два вида очередей, отличающихся дисциплинами обслуживания их элементов:а)при первой дисциплине на обслуживание поступает элемент, поступивший в список первым (очередь);б)при второй дисциплине первым обслуживается элемент, поступивший в список последним(стек).
В силу дисциплин обслуживания в стеке всегда известен только один элемент - поступивший в него последним.(20 лабораторка)
Известной и более сложной организацией списков являются циклические списки, двунаправленные списки и т.д.
Т.о. последовательности или списки можно определить следующим образом:а)пустой список,б)катенация элементов типа Т и некоторых последовательностий с базовым типом Т
Для определения приципов построений, а именно следования итерации, здесь использована рекурсия. Следование итерации встречаются настолько часто, что обычно их считают фундаментальными образами строения данных и проведение программ. Следует помнить, что их можно определить только с помощью рекурсии (обратное неверно), в то время как рекурсии можно с успехом использовать для построения гораздо более сложных структур данных(деревьев)

Вопрос.ПОНЯТИЕ ДЕРЕВА. УПОРЯДОЧЕННЫЕ И СИЛЬНО ВЕТВЯЩИЕСЯ ДЕРЕВЬЯ. ИДЕАЛЬНО СБАЛАНСИРОВАННЫЕ ДЕРЕВЬЯ.
Дерево с базовым типом Т - а)пустое дерево;б)некоторая вершина типа Т, соединенная с конечным числом отдельных деревьев с базовым типом Т, называемых поддеревьями.
Видно сходство определений последовательностей и деревьев.
Последовательность (список) - дерево, в котором каждая вершина имеет не более 1го поддерева.
Упорядоченное дерево - дерево, у которого все ветви (ребра) исходящие из каждой вершины упорядочены.
Вершина У, находящаяся непосредственно ниже вершины Х,называется непосредственным потомком Х. Если Х лежит на уровне i, то говорят, что вершина У лежит на уровне i+. При этом Х называют непосредственным предком У, считается, что корень дерева лежит на уровне 0.
Максимальный уровень какой-либо вершины дерева называется высотой или глубиной дерева.
Если некоторая вершина дерева не имеет непосредственных потомков, то она называется терминальной или листом, в противном случае вершина называется внутренней.
Число непосредственных потомков некоторой внутренней вершины дерева называется степенью этой вершины. Максимальная степень всех вершин дерева называется степенью дерева.
Дерево степени больше 2 называют сильно ветвящимся.
Дерево степени 2 называют двоичным (бинарным).
Можно поставить задачу построения дерева из n вершин минимальной глубины. Понятно, что этого можно достичь, если размещать на каждом уровне дерева, кроме возможно последнего, максимальное количество вершин.
Алгоритм построения идеально сбалансированного дерева:1)взять одну из вершин в качестве корня;2)тем же способом построить левое поддерево из n div 2 вершин;3)тем же способом построить правое поддерево из n-(n div 2)-1 вершин.
Дерево называется идеально сбалансированным, если число вершин в его правом и левом поддереве отличается не больше чем на 1.

Вопрос.ДВОИЧНОЕ ДЕРЕВО. ОПЕРАЦИИ С ДВОИЧНЫМИ ДЕРЕВЬЯМИ И ЗАДАЧА ОБХОДА. ДЕРЕВО ПОИСКА.
см вопрос32

Вопрос.VISUAL BASIC. ДАННЫЕ И ТИПЫ ДАННЫХ. СПОСОБЫ ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ И ОБЛАСТЬ ИХ ДЕЙСТВИЯ.
Переменная представляет собой зарезервированное место в оперативной памяти для временного хранения данных. Каждая переменная имеет собственное имя. После того как переменной присвоено значение, вы можете использовать ее в программе вместо самого значения.
В Visual Basic вы можете применять следующие типы данных:числовой (Integer, Long, Single,Double,Currency);строковый (string);типа дата (Date);байтовый (Byte);логический (Boolean);произвольный (Variant);объектный (Object).
Для хранения чисел в Visual Basic используется пять разных типов данных. Для хранения целочисленных данных предназначены типы Integer и Long. Первый из них служит для хранения целых чисел в диапазоне от -32768 до 32767 и занимает в оперативной памяти два байта. Для хранения больших целочисленных значений в диапазоне от -2147483648 до 2147483648 следует выбрать тип данных Long. В этом случае для хранения переменной выделяется 4 байта. Аналогично, для хранения десятичных чисел с плавающей точкой предназначены типы данных Single и Double. Переменная с типом данных Single занимает 4 байта и может принимать значения в диапазоне -3,438...-1,4-45 для отрицательных чисел и 1,4-45 ... 3,438 для положительных чисел. Если этого диапазона вам недостаточно, используйте десятичные числа с плавающей точкой двойной точности, определяя для них тип данных Double. В этом случае переменной выделяется 8 байтов, которых достаточно для хранения чисел в диапазоне -1,7-308 ... -4,9-324 для отрицательных чисел и 4,9-324 ... 1,7+308 для положительных чисел. Для хранения чисел с фиксированной точкой служит тип Currency. Переменная данного типа занимает в оперативной памяти 8 байт. Целая часть числа может содержать до 15 цифр, а дробная - до 4.
Используя переменные строкового типа, вы можете хранить строки как фиксированной (до 216 символов), так и переменной длины (до 231 символов). Для переменной, имеющей тип строки с фиксированной длиной, указывается максимальная длина строки. Если длина строки, присваиваемая этой переменной, меньше заданной длины строки, то оставшиеся свободные места заполняются пробелами. При присвоении переменной строки, количество символов которой превышает максимальное значение, все лишние символы отбрасываются. Количество символов, хранящихся в строке с переменной длиной, определяется длиной присваиваемых ей данных.
Для хранения двоичных данных рекомендуется использовать массив переменных типа Byte. Каждый элемент массива данного типа занимает один байт оперативной памяти.
Логический тип данных Boolean используется для хранения данных, принимающих одно из двух значений: True (Правда) или False (Ложь). По умолчанию переменной данного типа присваивается значение False. В оперативной памяти она занимает два байта.
Тип данных Date используется для хранения даты и времени. Переменная этого типа требует 8 байт в оперативной памяти.
Тип данных Variant является универсальным. Переменная этого типа может хранить любой из выше описанных типов данных. Все необходимые преобразования выполняются при присвоении переменной значения. Выделяемый переменной объем оперативной памяти зависит от типа присвоенного значения, но не может быть менее 16 байт.
Для хранения ссылок на объекты используется тип данных Object. Каждая переменная данного типа требует 4 байта.
Объявление переменных может быть явным или неявным. Для явного определения переменных существуют два способа. Первый способ предполагает использование следующего синтаксиса:
Static | Public | Private | Dim ИмяПеременной1 [As Тип1][, ИмяПеременной2 [As Тип2]]
Другим способом явного объявления переменных является указание типа с помощью суффикса. Явное объявление переменных с помощью суффикса имеет следующий синтаксис:
Static | Private | Public | Dim ИмяПеременнойСуффикс
Integer%;Long&;Single!;Double#;Currency@;String$;ByteНет;BooleanНет;DateНет;ObjectНет;VariantНет
Неявное объявление переменных осуществляется также двумя способами. Первый способ заключается в использовании оператора DefТип_Данных. Этот оператор устанавливает тип данных для переменных, параметров процедур и тип возвращаемого значения для процедур типа Function и Property Get, имена которых начинаются с определенных символов. Синтаксис оператора имеет вид:
DefТип_Данных ДиапазонБукв [, ДиапазонБукв]...
При втором способе неявного объявления переменная декларируется просто указанием ее имени, в тексте программы.
Неявное объявление переменных без необходимости применять не следует, так как в последующем могут возникнуть непредвиденные ошибки. Для того чтобы избежать неприятностей в случае ошибочной записи имени переменной, необходимо в раздел глобальных объявлений формы помещать оператор Option Explicit. В этом случае Visual Basic будет расценивать любую неявно объявленную переменную как ошибочную.
Область действия переменных
Переменная может быть доступна для всей программы либо только для одной или нескольких ее частей. Область программы, в которой может быть использована переменная, называется областью видимости переменной. Переменные могут быть видимы в одной процедуре, в любой процедуре какой-либо формы или во всей программе. Если переменная видима, то она доступна и, следовательно, существует. Переменная может существовать и быть доступной для некоторых частей программы и при этом быть недоступной ("невидимой") для других частей программы.
Dim - объявляет локальные переменные, существующие только во время вызова процедур или функций, в которых они объявлены. Если переменная объявляется в разделе глобальных объявлений модуля или формы, то она доступна для всех процедур и функций этого модуля. Для других модулей она будет не видна;
Private - не может объявлять переменную внутри процедуры или функции, при объявлении в разделе глобальных объявлений модуля Dim и Private равнозначны;
Public - объявленная таким образом переменная является глобальной на уровне приложения и доступна из всех его модулей.
Различают динамические и статические переменные. Статические переменные объявляются внутри процедуры или функции и вне их недоступны. В отличие от обычных локальных переменных они не инициализируются при входе в процедуру или функцию, где они объявлены. Для создания статической переменной необходимо при ее объявлении вместо ключевого слова Dim указать слово Static:
Static intNumber As Integer

Вопрос.VISUAL BASIC. МАССИВЫ ДАННЫХ. СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ МАССИВЫ.
Для хранения величин кроме простых переменных можно использовать массивы. Массив представляет собой набор переменных с одним именем и разными индексами. Каждая такая переменная называется элементом массива. Количество хранящихся в массиве элементов называется размером массива. Размер массива ограничен объемом оперативной памяти и типом данных элементов массива.
Все элементы массива имеют одинаковый тип. Однако если массив имеет тип variant, то отдельные элементы могут содержать данные разных типов. Например, одни элементы могут быть числами, другие - строками или объектами. Индекс элемента указывается в круглых скобках после имени массива. Например, strNames(1), strNames(2), strNames(10) являются элементами массива с именем strNames. Можно использовать каждый из элементов массива точно так же, как и простую переменную.
Объявление массива
В Visual Basic существуют массивы фиксированного размера и динамические массивы. Массив фиксированного размера имеет неизменный размер, заданный при его объявлении. Динамические массивы могут изменять размер в процессе выполнения.
Объявление массива фиксированного размера
Объявление массива фиксированного размера зависит от области его видимости и осуществляется следующим образом:
- глобальный массив объявляется с помощью оператора Public в секции Declaration модуля;
- массив уровня модуля - с помощью оператора Private в секции Declaration модуля;
- локальный массив - с помощью оператора Private процедуры.
При объявлении массива после его имени в круглых скобках указывается верхняя граница массива. По умолчанию нижней границей массива является 0. Например, в приведенном ниже коде, который вводится в секцию Declaration модуля, задается массив из 21 элемента. Индекс элементов массива изменяется от 0 до 20:
Dim intCountPar (20) As Integer
Для создания глобального массива такого же размера необходимо использовать следующий код:
Public intCountPar (20) As Integer
Можно явно задать нижнюю границу массива, используя ключевое слово To:
Dim intCountPar (1 To 20) As Integer
В этом случае задается массив из 20 элементов. Индекс элементов массива изменяется от 1 до 20.
Visual Basic позволяет использовать многомерные массивы. Например, в следующем коде объявляется двумерный массив размерностью 21x21:
Dim intCountPar (20, 20) As Integer
При использовании многомерных массивов, как и в случае одномерных, можно явно задавать нижнюю границу:
Dim intCountPar (1 To 20, 1 То 20) As Integer
Dim intCountPar (20, 1 Tо 20) As Integer
В верхней строке кода явно заданы верхняя и нижняя граница обеих размерностей. В нижней строке задана верхняя и нижняя граница только для второй размерности.
Объявление динамического массива
В случае, когда размер массива заранее неизвестен, Visual Basic позволяет использовать динамические массивы, размеры которых можно изменять во время выполнения. Применение динамических массивов позволяет эффективно управлять памятью, выделяя память под большой массив лишь на то время, когда этот массив используется, а затем освобождая ее. Создание динамического массива осуществляется следующим образом:
1. Объявляется массив с помощью ключевых слов, используемых при создании массива фиксированного размера. Список размерностей массива остается пустым. При объявлении глобального массива необходимо выбрать ключевое слово Public, при объявлении массива на уровне модуля -Dim, при объявлении массива в процедуре - Dim или Static. Например,
Dim intCountPar ( ) As Integer
2. С помощью выполняемого оператора ReDim указывается размерность массива в виде числа или выражения. Синтаксис оператора ReDim аналогичен синтаксису оператора объявления массива фиксированного размера. Например, размерность массива может быть задана любым из следующих способов:
ReDim intCountPar (x)
ReDim intCountPar (20)
ReDim intCountPar (1 To 20)
При выполнении оператора ReDim данные, размещенные в массиве ранее, теряются. Это удобно в том случае, если данные больше не нужны и вы хотите переопределить размерность массива и подготовить его для размещения новых данных. Если вы хотите изменить размер массива, не потеряв при этом данных, то необходимо воспользоваться оператором ReDim с ключевым словом Preserve. Например, приведенный ниже программный код увеличивает размер массива на единицу без потери хранящихся в массиве данных:
ReDim Preserve intCountPar (X + 1)
Замечание
Использование оператора ReDim с ключевым словом Preserve позволяет изменять только верхнюю границу последней размерности многомерных размеров.

Вопрос.VISUAL BASIC. ПОНЯТИЕ ПОДПРОГРАММЫ. ВИДЫ ПОДПРОГРАММ:ПОДПРОГРАММА-ФУНКЦИЯ, ПРОЦЕДУРА. АППАРАТ АРГУМЕНТОВ-ПАРАМЕТРОВ.
При программировании широко используются процедуры, позволяющие разбивать программные коды на небольшие логические блоки, которые, во-первых, легче отлаживать, а во-вторых, можно в свою очередь использовать при создании других процедур. В Visual Basic существуют следующие виды процедур:
- Sub
- Function
Процедуры Sub
Процедура Sub не возвращает значения и наиболее часто используется для обработки связанного с ней события. Ее можно помещать в стандартные модули, модули классов и форм. Она имеет следующий синтаксис:
[Private] [Public] [Static] Sub имяПроцедуры (аргументы);
операторы
End Sub
Между ключевыми словами Sub и End Sub в процедуре располагаются выполняемые при ее вызове операторы программного кода. Параметр аргумент можно применять для объявления передаваемых в процедуру переменных
Процедуры Sub подразделяются на общие процедуры и процедуры событий. Общие процедуры служат для размещения повторяющихся операторов, используемых процедурами по обработке событий, тем самым разгружая их и исключая дублирование часто встречающихся кодов, что в свою очередь облегчает поддержку приложения.
Процедуры обработки событий связаны с объектами, размещенными в формах Visual Basic, или с самой формой и выполняются при наступлении события, с которым они связаны. Для события, связанного с формой, процедура Sub имеет следующий синтаксис:

Private Sub Form__имяСобытия (аргументы)
операторы
End Sub
Как видно из синтаксиса, наименование процедуры обработки события для формы содержит слово Form, затем размещается символ подчеркивания (_) и имя события. Например, имя процедуры, выполняемой при загрузке формы, будет Form_Load, а процедуры, выполняемой при щелчке мыши на форме - Form_click. При формировании процедуры для формы MDI ее имя будет содержать перед словом Form приставку MDI, то есть записываться MDIForm. Для события, связанного с элементом управления формы, процедура обработки событий Sub имеет следующий синтаксис:
Private Sub имяЭлементаУправления_ имяСобытия (аргументы)
операторы
End Sub
Наименование процедуры обработки события для элемента управления формы содержит имя элемента управления, заданное в свойстве Name, затем следует символ подчеркивания (_) и имя события. Например, имя процедуры, выполняемой при щелчке мыши на кнопке управления, имеющей наименование cmdPrint будет Form_Click.
Visual Basic облегчает формирование имен создаваемых процедур. Разработчику необходимо выполнить для этого следующие действия:
1. В окне Properties с помощью свойства Name (Имя) задать имя объекта, для которого создается процедура. Если имя не будет задано, то при создании процедуры Visual Basic использует имя, присваиваемое объекту по умолчанию при его размещении в форме. При последующем изменении наименования объекта необходимо будет изменить и имя процедуры.
2. В окне редактора кода из списка Object (Объект) выбрать объект, для которого создается процедура.
3. Из списка Procedure (Процедура) выбрать событие, обработка которого будет выполняться.
Процедуры Function
Процедуры Function в отличие от процедур Sub могут возвращать значение в вызывающую процедуру. Синтаксис процедуры Function выглядит следующим образом:
[Private] [Public] [Static] Function имяПроцедуры (аргументы) [As type]
операторы
End Function
Процедуры Function, как и переменные, имеют тип, задаваемый с помощью ключевого слова AS. Если тип процедуры не задан, по умолчанию ей присваивается тип Variant. Тип процедуры определяет в свою очередь тип возвращаемого ею значения. Возвращаемое процедурой значение присваивается имени процедуры имяПроцедуры и может быть использовано в выражениях программного кода аналогично стандартным функциям Visual Basic. Рассмотрим процедуру, вычисляющую площадь квадрата:
Function Square (intA As Integer) As Integer
Square = intA^2
End Function
Для вызова этой процедуры в форме можно использовать, например, следующий код:
TxtSquare.Text = Square(TxtSide.Text)
Вызов процедур
Процедура Sub не возвращает значения, однако она может изменять значения переменных, заданных для нее в качестве параметров. Вызов процедуры Sub можно осуществлять двумя способами. Первый способ предполагает использование ключевого слова call. Например, процедуру с именем NameProc можно вызвать оператором
Call NameProc (аргумент1, аргумент2, ...аргументN)
Второй способ позволяет вызвать процедуру Sub по ее имени. Например,
NameProc аргумент1, аргумент2, ...аргументN
При вызове процедуры модуля формы из другого модуля необходимо указывать ссылку на имя модуля формы, содержащего процедуру. Например, для вызова процедуры с именем NameProc, находящейся в модуле формы Form1, оператор должен выглядеть так:
Call Form1.NameProc (аргумент1, аргумент2, ...аргументN)
Вызов процедуры Function аналогичен вызову встроенных функций Visual Basic. Кроме этого, процедуру Function можно вызывать так же, как процедуру Sub:
Call Square(Side)
Square Side
В этом случае Visual Basic игнорирует возвращаемое функцией значение.
Передача параметров
Переменные, передаваемые процедуре, называют параметрами процедуры. По умолчанию они имеют тип Variant. Visual Basic позволяет задавать тип параметров с помощью ключевого слова AS:
Function Square (intA As Integer) As Integer
Передача параметров в процедуру может осуществляться двумя способами: по значению (by value) и по ссылке (by reference). В первом случае в процедуру в качестве переменной передается не сама переменная, а ее копия. Поэтому изменение параметра в процедуре затрагивает не переменную, а ее копию. Для передачи в процедуру параметров по значению используется ключевое слово ByVal, например:
Sub NameProc (ByVal strArg As String)
тело процедуры
End Sub
Для передачи в процедуру параметров по ссылке используется ключевое слово ByRef, например:
Sub NameProc (ByRef strArg As String)
тело процедуры
End Sub
При передаче параметров по ссылке процедура получает доступ к области памяти, в которой эта переменная хранится, в результате чего при изменении в процедуре параметра происходит изменение значения переменной. Используя ключевое слово Optional, можно задавать необязательные параметры процедуры. При этом необходимо иметь в виду, что если какой-либо из параметров задан как необязательный, то и расположенные после него параметры также должны быть объявлены необязательными:
Sub NameProc (Optional strArg1 As String, Optional strArg2 As String)
тело процедуры
End Sub
Обязательные параметры процедуры должны задаваться до необязательных, например:
Sub NameProc (strArgl As String, Optional strArg2 As String)
тело процедуры
End Sub

Вопрос. ОБЕСПЕЧЕНИЕ ЭВМ. КЛАССЫ ПО. КЛАССИФИКАЦИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ. ПОНЯТИЕ ТРАНСЛЯТОРА.КОМПИЛЯТОРЫ И ИНТЕРПРЕТАТОРЫ. ОБРАБОТКА ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ КОМПИЛЯТОРА
Язык программирования - это изобразительное средство, служащее для непросредственной реализации алгоритма на ЭВМ.
Алфавит - это набор основных символов, предназначенных для построения отдельных конструкций и предложений языка в целом.
Синтаксис - множество правил написания отдельных конструкций и предложений языка в целом.
Семантика - система правил использования отдельных конструкций и целых фраз, позволяющих однозначно воспроизвести процесс обработки данных, согласно заданной программе.
Классификация языков программирования: языки программирования делятся на две большие группы:машинно-зависимые и машинно-независимые. Машинно-зависимые делятся на машинные и машинно-ориентированные. Машинно-ориентированнные делятся на мнемокоды и автокоды. Машинно-независимые делятся на проблемно-ориентированные, процедурно-ориентированные, объектно-ориентированные, непроцедурные.
Мнемокоды - символические обозначения машинных комманд.
Автокоды - символические записи целой серии комманд.

Вопрос. ОПТИМИЗАЦИЯ ПРОГРАММ.
Под оптимизацией понимается: обработка, связанная с перестановкой комманд и изменением операций в компилируемой программе с целью получения более эффективной объектной программы.
Различают две категории оптимизирующих преобразований:1)преобразование на уровне исходной программы в ее внутренней форме);2)преобразование на уровне объектной программы.
Преобразования первого вида допустимы ко многим языкам высокого уровня:1)свертка, т.е. выполнение операций, операнды которых известны во время компиляции;2)исключение лишних операций;3)вынесение из циклов операций, операнды которых внутри цикла не меняются;4)замена в циклах сложных операций на более простые.
Не все компиляторы должны производить максимально полную оптимизацию. К примеру не применяют сложные методы оптимизации в компиляторах, интенсивно используемых для отладки, т.к. сложные методы могут значительно изменить порядок операций, что затруднит поиск ошибки в исходном тексте программы.