Вопросы зачета по курсу «Языки программирования» для

advertisement
Вопросы зачета по курсу «Языки программирования» для студентов 1 курса дневного отделения
специальности: «МОАИС».
1. Понятие и состав языка программирования. Машинные и
символьные языки.
Языки программирования являются изобразительным средством, существующим для непосредственной
реализации алгоритмов на ЭВМ.
Любой ЯП представляет собой набор символов и систему правил: образования и истолкования
конструкций из этих символов используемых для записи алгоритмов.
Алгоритм решения задачи записанный на конкретном ЯП называется программой.
Программа представляет собой набор конструкций для ЭВМ, указывающих в какой
последовательности, над какими данными и какие операции должна выполнять ВМ для получения
результата.
Задания таких инструкций для ЭВМ обеспечивают операторы. Оператор - совокупность символов,
указывающая некоторые алгоритмы действия (операцию и ее операнды).
В общем случае оператор задает некоторый алгоритм действия, приводящий к изменению некоторых
значений или задающий изменения в порядке выполнения операций.
Все ЯП можно разбить на:
1. Машинные языки
2. Символьные языки
Машинный язык - ЯП операторами которого являются машинные команды.
Каждый тип ЭВМ имеет свой конкретный машинный язык и ВМ может непосредственно выполнять
программы только на ее машинном языке.
Каждая машинная команда обычно задается в цифровом коде и имеет структуру:
КОП - Адресное поле.
КОП - поле, в котором задается код операции («+», «-», …), определяющий заданные команды
действий.
Адресное поле - используется для задания значения операторов, над которыми нужно выполнить
заданную операцию.
Программы на машинном языке представляют собой совокупность указанных машинных команд.
Разработка программ на МЯ - ручное программирование и является чрезвычайно сложным процессом.
Сложность связанна с тем, что набор допустимых операций больше 100. Коды задаются числами, а в
адресное поле нужно задавать адреса ячеек памяти, где находятся обрабатываемые данные.
Поэтому МЯ для разработки программ не используется. Для этих целей используются символьные
языки.
Символьные языки были разработаны для упрощения программирования и делятся на:
1. Языки типа Ассемблер.
2. Языки высокого уровня.
Языки 1-го типа очень похожи на МЯ и отличаются только тем, что для обозначения операций и
операндов используются символьные обозначения.
Языки типа Ассемблер и МЯ являются машинно-ориентированными.
Это связанно с тем что они максимально учитывают архитектуру конкретного типа ЭВМ. На каждый
тип имеется свой язык Ассемблера.
Разработка программ на языках типа Ассемблер гораздо более простая, чем на МЯ, все равно остается
сложным процессом.
К достоинству использования языков типа Ассемблер относится возможность разработки с их помощью
высоко эффективных приложений, т.е. программа занимает минимум памяти и обладает высоким
быстродействием.
К недостаткам языков типа Ассемблер можно отнести сложность разработки программ и не
возможность использовать на различных типах ЭВМ.
Для автоматизации и упрощения программирования разработаны алгоритмические языки.
Их особенностью является возможность записи программ на языке близком к обычному языку
математики.
Это позволило максимально упростить разработку программ и сделать запись алгоритмов компактной и
наглядной.
Алгоритмические языки являются машинно-независимыми, т.е. программа записанная на конкретном
алгоритмическом языке может выполнятся на любом типе ЭВМ, где имеется система программирования
на заданном языке.
Особенностью всех символьных языков является то, что программы, записанные на них,
непосредственно ЭВМ выполнятся не могут, т.к. требуется перевод таких программ на машинные
языки.
Для языков типа Ассемблер такой перевод выполняется автоматом с помощью ЭВМ с использованием
специальных программ, называемых ассемблером.
Компилятор - программа, предназначенная для перевода с алгоритмического языка программирования
на машинный язык.
2. Особенности процедурных языков программирования.
Примеры языков.
Эти языки характеризуются тем, что решаемая задача разбивается на отдельные шаги-этапы и затем
шаги реализуются с использованием соответствующих конструкций ЯП.
Название происходит от того что каждый шаг можно реализовать как отдельную процедуру.
Процедурные ЯП получили самое широкое распространение и к ним относяцца большинство
разработанных языков.
Наиболее популярные:
- Basic; (обучение)
- Pascal; (универсальный ЯП, который является потомком языков ALGOL, обучение)
- Fortran; (предназначен для численных расчетов)
- Modula 2, 3 и Oberon; (развитие языка Паскаль предназначенные для широкого класса задач)
- С, С++. (универсальные ЯП используемые для решения прикладных задач и задач системного
программирования)
3. Общая характеристика непроцедурных языков
программирования.
Эти языки относятся к классу описательных ЯП. С их помощью описывается суть решаемой задачи и
перекладывается на компьютер сам процесс решения.
К языкам этого типа относятся:
- Функциональные ЯП (Lisp, Haskell, Schema, …)
- Логические ЯП (Prolog, RProlog, …)
4. Понятие и состав системы программирования.
Под системой программирования конкретного языка понимается комплекс программ
предназначенных для подготовки, отладки и выполнения программ записанных на этом ЯП.
Обычно в состав СП входит:
- редактор текстов;
- компилятор или интерпретатор;
- редактор внешних связей;
- загрузчик;
- отладчик;
- библиотекарь;
- профилер.
Символьный ЯП без компилятора или интерпретатора на ВМ может представлять только теоретический
интерес. Выполнение программы не возможно.
Все АЯ по методу реализации на ЭВМ делятся на:
- транслирующего типа;
Для выполнения программ, записанных на этих языках, на ЭВМ должен быть установлен транслятор,
т.е. программа, преобразующая программу переводя ее на машинный язык.
- интерпретирующего типа.
Для выполнения программ, записанных на этих языках, на ЭВМ должен быть установлен интерпретатор
с этого ЯП.
5. Компилятор. Назначение и состав.
Программы, которые выполняются на ЭВМ с использованием компиляторов обычно проходит
следующие этапы обработки:
Редактор текста => Исходный текст программы => Компиляторы => Объектный код программы =>
Обработка редактора связей (<= Библиотеки, объектные коды других модулей) => Исполняемая
программа => Загрузчик => Выполнение.
Редактор текста - программа, предназначенная для подготовки файлов, содержащих тексты программы
(любая программа, не добавляющая своих собственных команд). Например, Блокнот.
Однако предпочтительно использовать специализированные текстовые редакторы, которые
осуществляют цветовое выделение команда и могут сами проверять синтаксис конструкции.
Результатом использования редактора текстов является текстовый файл, содержащий текст программы.
Этот текст называется исходным.
Для выполнения программы на ЭВМ ее исходный код должен быть обработан компилятором.
Компилятор осуществляет перевод программы на машинный код и проверяет синтаксис.
Если обнаружены синтаксические ошибки, то выдаются диагностические сообщения и процесс
трансляции прекращается.
Если ошибки не обнаружены, то формируется объектный код программы, записываемый на магнитный
диск.
Полученный код программы для выполнения не пригоден, это связанно с тем, что объектный код
содержит ссылки на другие модули, необходимые для его выполнения.
Эти ссылки называются внешними. Для разрешения этих ссылок объектный код обрабатывается
редактором внешних связей или компоновщиком. Эта программа подключает к исходному
объектному коду, коды необходимые для выполнения модуля и тем самым разрешает внешние ссылки.
Для этого он использует имеющиеся библиотеки и объектные модули других ранее транслированных
частей программы. В результате создается исполняемая программа готовая к выполнению. Она
записывается в файл называемый исполняемым файлом программы. Этот файл с помощью программы
загрузчика может быть помещена в память ЭВМ и запустится на выполнение.
Однажды созданная исполняемая программа может быть многократно выполнена на компьютере или
перемещаться с одного компьютера на другой.
Следует отметить, что исполняемые программы обычно характеризуются быстродействием.
В систему программирования языков компилирующего типа так же входит программа отладчик
(Debugger)
Отладчик - программа, предназначенная для упрощения поиска в программе семантических ошибок.
Все ошибки делятся на:
- синтаксические
Обычно обнаруживаются компилятором или интерпретатором и связаны с синтаксическими ошибками
в исходном тексте.
- семантические
Связанны с ошибками в алгоритме решаемой задачи или с неправильной конструкцией используемого
ЯП. Они выявляются на стадии выполнения программы и выражаются в получении неверных
результатов, в зацикливании программы или возникновения аварийных ситуаций (деление на ноль,
квадратный корень из отрицательного числа и т.д.)
Поиск таких ошибок является самой сложной и трудоемкой задачей. Для упрощения используется
отладчик.
Обычно отладчик поддерживает следующие функции:
* Трассировка программы - пошаговое выполнение программы позволяющая программисту точно
отследить команды в порядке их выполнения.
* Задавать контрольные точки остановок. Позволяет приостановить программу при достижении
заданного места в ее исходном тексте. Программист может посмотреть текущее значение переменных и
продолжить выполнение программы.
* Осуществлять проверку и измерение данных. Позволяет так же приостановить программу,
просмотреть значения переменных и, при необходимости, изменить их значение.
Библиотекарь.
Объектные модули можно хранить в отдельных файлах, а можно поместить в один файл - библиотекарь.
Часто вместе с компилятором поставляются библиотекари причем каждая программа реализует часто
используемый алгоритм и программа может при необходимости из своей программы обращаться к
подпрограмме: библиотеке.
Используя библиотек позволяет автоматизировать и упростить решение задач.
Библиотекарь - это специальная программа которая позволяет из объектных модулей формировать
библиотеки и управлять ее содержимым.
Библиотекарь обычно позволяет:
- создавать библиотеку;
- просмотр содержимого;
- включить новый модуль или удалить существующий.
Профилировщик.
Профилировщик- спец. Программа, которая позволяет оценить эффективность разработанной
программы. Она отображает ориентировочное время выполнения для каждой процедуры или команды
программы, позволяет понять причину не эффективности программы.
6. Интерпретатор.
При использовании АЯ интерпретирующего типа порядок обработки программы выглядит так:
Программа => Интерпретатор => Результат.
Для выполнения программы записанной на ЯП программирования интерпретирующего типа на
компьютере должен быть установлен интерпретатор с этого языка. Интерпретатор - специальная
программа которая обеспечивает выполнение на ЭВМ исходных текстов программы или вводимых
операторов.
Использование интерпретатора имеет плюсы и минусы.
- программы выполняются намного медленнее чем исполняемые программы
+ отсутствие необходимости в системе программирования
- увеличение скорости отладки программы, т.к. человек и машина имеют дело с одним и тем же текстом
программы
7. Описание алгоритмических языков. Формулы БНФ.
Любой ЯП состоит из символов, выражений и операторов.
Символы - основные неделимые знаки с помощью которых записываються все допустимые
конструкции языка.
Слова - структура образов в соответствии с некоторыми правилами из основных символов языка и
являющихся минимальными единицами имеющих самостоятельный смысл.
Числа являются словами.
Выражения - группа слов, имеющих некоторый смысл.
В АЯ это конструкция, состоящая из слов и символов задающая правила вычисления некоторого
значения.
Оператор - конструкция, задающая полное описание некоторого действия, которые необходимо
выполнить.
Описание ЯП состоит из описания четырех указанных элементов. Это описание обычно включает:
- синтаксис
- семантику
Синтаксис позволяет определить множество допустимых конструкций определить её смысл.
Для описания синтаксиса ЯП обычно использует спец. Языки называемые метаязыками.
Формулы Бэкуса-Наура.
Этот язык характеризуется тем, что для описания синтаксиса используются спец. Формулы. Эти
формулы содержат знаки:
::= - есть по определению.
| - или.
< > - меньше, больше. В эти скобки заключаются описания конструкций языка.
[ ] - необязательные элементы.
{ } - элементы которые могут входить ноль или большее число раз.
Используемые формулы в этом языке допускают рекурсивные определения, т.е. когда в определении
кого-то понятия входит это понятии как элемент.
<целое число>::=[<знак>]<цифра>{<цифра>}
<знак>::= + / <цифра>::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
C помощью формул БНФ можно однозначно описать синтаксис любого ЯП, но эти формулы имеют
малую наглядность и достаточно громоздки.
Потому наряду с БНФ для описания синтаксиса используются другие метаязыки.
8. Описание алгоритмических языков. Синтаксические диаграммы.
СД также можно использовать для описания синтаксиса ЯП. Они состоят из овалов, кружков и
прямоугольников, соединяемых прямыми линиями со стрелками.
Кружки и овалы служат для обозначения неделимых символов языка - терминальные силы.
Прямоугольники обозначают ссылку на другую синтаксическую диаграмму.
Указанные элементы объединены в более общую структуру, которая используется для описания
синтаксиса конструкций языка.
Типовыми объединениями элементов являются след. диаграммы:
1)
А - имя диаграммы или определяемого понятия, а сама диаграмма означает, что по структуре
конструкция А может состоять из конструкций описанных диаграммой А1 или А2 или … или АN.
Знак арифметической операции:
2) A => [A1] => [A2] => … => [AN]
Конструкция А представляет собой последовательную конструкцию А1, А2, …, АN.
3)
Конструкцией А может содержать или элемент А1 или вообще не чего.
4)
Определенная конструкция А может быть пустой или может содержать одну или несколько подряд
идущих конструкций А1.
5)
Конструкция А может содержать одну или несколько подряд идущих конструкций А1.
Диаграммы являются более наглядным отображаем синтаксиса. Для изображения диаграмм требуются
спец. средства и определения сложных конструкций требуются сложные диаграммы, которые будут
слишком громоздкими.
СД используются наряду с формулами БНФ.
Для описания семантики (смысла) ЯП обычно используется неформальные пояснения на естественном
языке или также специальные метаязыки. Для изучения ЯП необходимо изучить его синтаксис и
семантику.
9. Типы ошибок в программах. Понятие отладки и отладчиков.
10. Операторы ввода из стандартного файла.
Взаимодействие устройств обработки и хранения информации с внешней средой (хотя бы с
пользователем) является совершенно необходимым. За такой интерфейс в языке Паскаль отвечают
операторы ввода-вывода информации. Эти инструкции позволяют ввести аргументы, параметры
расчетов во время выполнения программы (а не на этапе ее написания), осуществить вывод
рассчитанных данных в понятном человеку виде.
Сначала операторы ввода (форматы операторов):
Read(<Список ввода>);
Readln(<Список ввода>);
В таком формате эти команды позволяют вводить данные в переменные во время выполнения
программы с клавиатуры. Элементами списка ввода могут быть имена переменных, которые должны
быть заполнены значениями, введенными с клавиатуры.
Выполнение операторов ввода происходит так: ход программы приостанавливается, на экран выводится
курсор, компьютер ожидает от пользователя набора данных для переменных, имена которых указаны в
списке ввода. Пользователь с клавиатуры вводит необходимые значения в том порядке, в котором они
требуются списком ввода, нажимает Enter. После этого набранные данные попадают в
соответствующие им переменные и выполнение программы продолжается.
Примечание: данные при вводе разделяются пробелами.
Разница между работой процедур Read и Readln (от Read line) состоит в следующем: после
выполнения Read значение следующего данного считывается с этой же строчки, а после выполнения
Readln - с новой строки.
11. Операторы вывода в стандартный файл.
Взаимодействие устройств обработки и хранения информации с внешней средой (хотя бы с
пользователем) является совершенно необходимым. За такой интерфейс в языке Паскаль отвечают
операторы ввода-вывода информации. Эти инструкции позволяют ввести аргументы, параметры
расчетов во время выполнения программы (а не на этапе ее написания), осуществить вывод
рассчитанных данных в понятном человеку виде.
Для вывода информации в Паскале также есть две команды:
Write(<Список вывода>);
Writeln(<Список вывода>);
Такой формат использования Write и Writeln позволяет выводить на экран монитора данные из списка
вывода. Элементами списка вывода могут являться имена переменных, выражения, константы. Прежде
чем вывести на экран компьютер значения выражений сначала вычислит. Элементы списка, также как и
в операторах ввода, разделяются запятыми.
Различие между двумя операторами вывода таково: после выполнения оператора Writeln (от Write line)
происходит переход на новую строчку, а после выполнения инструкции Write, переход на новую
строчку не происходит и печать по последующим командам вывода Write или Writeln будет
происходить на той же строчке. При вызове оператора Writeln без параметров просто происходит
переход на новую строчку.
12. Целый тип данных.
Целые типы определяют константы, переменные и функции, значения которых реализуются
множеством целых чисел, допустимых в данной ЭВМ.
Над целыми операндами можно выполнять следующие арифметические операции: сложение (+),
вычитание (-), умножение(*), деление(/), деление на цело (div), получение остатка от деления (mod).
Результат арифметической операции над целыми операндами есть величина целого типа. Результат
выполнения операции деления целых величин есть целая часть частного. Результат выполнения
операции получения остатка от деления - остаток от деления целых. Например:
17 div 2 = 8, 3 div 5 = 0.
17 mod 2 = 1, 3 mod 5 = 3.
К аргументам целого типа применимы следующие стандартные (встроенные) функции, результат
выполнения которых имеет целый тип:
Abs(X), Sqr(X), Succ(X), Pred(X),
и которые определяют соответственно абсолютное значение Х, Х в квадрате, Х+1, Х-1.
Следующая группа стандартных функций для аргумента целого типа дает действительный результат:
Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X).
Эти функции вычисляют синус, косинус и арктангенс угла, заданного в радианах, логарифм
натуральный, экспоненту и корень квадратный соответственно.
Результат выполнения функции проверки целой величины на нечетность Odd(X) имеет значение
истина, если аргумент нечетный, и значение ложь, если аргумент четный:
X=5 Odd(X)=TRUE , X=4 Odd(X)=FALSE.
Для быстрой работы с целыми числами определены процедуры:
Inc(X) X:=X+1
Inc(X,N) X:=X+N
Dec(X) X:=X-1
Dec(X,N) X:=X-N
13. Вещественный тип данных.
Действительные типы определяет те данные, которые реализуются подмножеством действительных
чисел, допустимых в данной ЭВМ.
Тип Real определен в стандартном ПАСКАЛЕ и математическим сопроцессором не поддерживается.
Остальные действительные типы определены стандартом IEEE 457 и реализованы на всех современных
компьютерах.
Для их использования при наличии сопроцессора или при работе на ЭВМ типа 80486 необходимо
компилировать программу с ключом {$ N+}, а при отсутствии сопроцессора - с ключами {$N-,E+}.
Тип Comp хотя и относится к действительным типам, хранит только длинные целые значения.
Над действительными операндами можно выполнять следующие арифметические операции, дающие
действительный результат:
сложение (+), вычитание (-), умножение (*), деление (/).
К величинам действительного типа применимы все операции отношения, дающие булевский результат.
Один из операндов, участвующих в этих операциях, может быть целым.
К действительным аргументам применимы функции, дающие действительный результат:
Abs(X), Sqr(X), Sin(X), Cos(X), ArcTan(X), Ln(X), Exp(X), Sqrt(X), Frac(X), Int(X), Pi.
Функция Frac(X) возвращает дробную часть X, функция Int(X) - целую часть X.
Безаргументная функция Pi возвращает значение числа Пи действительного типа.
К аргументам действительного типа применимы также функции
Trunc(X) и Round(X), дающие целый результат. Первая из них выделяет целую часть действительного
аргумента путем отсечения дробной части, вторая округляет аргумент до ближайшего целого.
14. Булевский тип.
Логический тип (Boolean) определяет те данные, которые могут принимать логические значения TRUE и FALSE.
К булевским операндам применимы следующие логические операции:
not and or xor.
Логический тип определен таким образом, что FALSE < TRUE. Это позволяет применять к булевским операндам все
операции отношения.
В ТУРБО ПАСКАЛЬ введены еще разновидности логического типа: ByteBool, WordBool и LongBool, которые занимают в
памяти ЭВМ один, два и четыре байта соответственно.
15. Символьный тип.
Символьный тип (Char) определяет упорядоченную совокупность символов, допустимых в данной
ЭВМ. Значение символьной переменной или константы - это один символ из допустимого набора.
Символьная константа может записываться в тексте программы тремя способами:
- как один символ, заключенный в апострофы, например:
'A' 'a' 'Ю' 'ю';
- с помощью конструкции вида #K, где K - код соответствующего символа, при этом значение K должно
находиться в пределах 0..255;
- с помощью конструкции вида ^C, где C - код соответствующего управляющего символа, при этом
значение C должно быть на 64 больше кода управляющего символа.
К величинам символьного типа применимы все операции отношения.
Для величин символьного типа определены две функции преобразования
Ord(C) Chr(K).
Первая функция определяет порядковый номер символа С в наборе символов, вторая определяет по
порядковому номеру К символ, стоящий на К-ом месте в наборе символов. Порядковый номер имеет
целый тип.
К аргументам символьного типа применяются функции, которые определяют предыдущий и
последующий символы:
Pred(C) Succ(C). Pred('F') = 'E' ; Succ('Y') = 'Z' .
При отсутствии предыдущего или последующего символов значение соответствующих функций не
определено.
Для литер из интервала 'a'..'z' применима функция UpCase(C), которая переводит эти литеры в верхний
регистр 'A'..'Z'.
16. Структура программы на Паскаль. Комментарии.
Программа на языке Паскаль состоит из заголовка и тела (блока). Заголовок программы имеет
следующий синтаксис:
program <имя> (<список параметров через запятую>);
Список параметров, задаваемый, в заголовке используется для взаимосвязи программы с внешним
окружением. К этим параметрам относятся, в том числе и input и output.
Input - имя стандартного файла ввода который обычно связан с клавиатурой.
Output - стандартный файл вывода который связан с монитором.
Блок следует за заголовком программы и обязательно должен заканчиваться точкой. Эта точка
определяет для компилятора конец текста программы.
Блок состоит из шести разделов, любой из которых, кроме последнего может отсутствовать, но разделы
должны идти в указанном порядке:
- раздел меток
- раздел констант
- раздел типов
- раздел переменных
- раздел процедур и функций
- раздел операторов
Раздел операторов является обязательным и именно в нем описывается алгоритм решения задачи.
Раздел операторов имеет синтаксис:
begin
оператор1;
оператор2;
…;
end.
Текст программы может содержать комментарии, записанные на естественном языке.
Комментарии могут ставится в любое место программы, где ожжет стоять пробел.
Комментарии являются не обязательными, но считается, что их наличие упрощает понимание
программы. При трансляции комментарии не рассматриваются, но они сохраняются в листинге
программы.
Комментарии могут заключаться:
- {комментарий}
- //комментарий.
При записи текста на Паскале регистр букв не учитывается.
«;» в разделе описания используется для отделения одного оператора от другого.
17. Понятие метки. Раздел описания меток.
Перед каждым оператором программы может ставится метка. Она используется для обеспечения
возможности ссылок на этот оператор из других операторов программы. В стандартном Паскале это
целое без знака и содержащее не более четырех цифр.
Метка от оператора отделяется двоеточием.
15: х:=х+1;
Перед одним оператором может стоять несколько меток, но метки не обязательны.
Все метки, используемые в программе, должны быть описаны в разделе описания меток.
Синтаксис: label метка1, метка2, …, меткаn;
Одной и той же меткой нельзя пометить разные операторы программы, находящиеся в одном ее блоке.
В конкретных реализациях Паскаля могут использоваться идентификаторы.
18. Раздел описания констант.
Раздел констант позволяет ввести для имеющихся в программе констант альтернативные имена.
Константа - объект данных, который в процессе программы не может изменится.
Раздел констант имеет след. синтаксис:
const <имя константы>=значение;
Тип константы определяется типом ее значения. Концом раздела констант является начало
следующего раздела.
Если в разделе констант программы для некоторых констант программы заданы имена, то в тексте
программы можно использовать их имена. При трансляции программы имена констант в тексте
программы автоматически заменяются на их значение.
Считается, что использование в программе вместо констант их имен делает программу более наглядной
и легко идентифицируемой.
Если понадобится представить число pi с большим числом разрядов, чем было заданно ранее, то в
случае если константа была определена в разделе констант, то достаточно будет изменить ее только в
этом разделе.
19. Раздел описания типов.
20. Раздел описания переменных.
Этот раздел используется для описания всех переменных, которые используются в программе.
Переменная - объект данных, обозначенная именем, значение которой может изменяться при
выполнение программы.
Каждая такая переменная характеризуется ее именем и типом, а также текущим значением. Для
именования переменных используются допустимые идентификаторы. А тип переменных определяет
множество ее допустимых значений.
Раздел описания переменных имеет след. синтаксис:
var <имя1>, <имя2>, …, <имяn>:<тип>;
В разделе описания переменных нельзя одну и ту же переменную описывать дважды.
Раздел описания переменных дает информацию транслятору о числе и типе переменных, на основе
которых он распределяет память под использование в программе переменных, а так же сопоставляет
имена переменных с адресами выделенных им участков памяти.
Участок памяти, выделенный для переменной, используется для хранения ее текущего значения.
Концом раздела описания переменных является начало следующего раздела.
21. Правила записи выражений. Порядок старшинства операций.
Выражения - конструкция, задающая правила вычисления некоторого значения.
Выражения состоят из операторов, переменных, констант, операций и функций.
Выражения вычисляются в порядке его записи слева на право с учетом старшинства операций и
круглых скобок.
В Паскале принято следующее старшинство операций:
*, /, div, mod, and
Аддитивные операции.
+, -, or
Операции отношения и оператор in.
Если в выражение входит имя функции, с указанными в круглых скобках параметрами, то значение
вычисляется прежде чем оно будет использоваться.
Выражение будет называться арифметическим, если его значение - число; булевским, если - истина
или ложь; символьным - символ или строка символов.
Для булевских выражений характерно, что их значение может быть известно до конца вычисления.
Во избежание ошибок программист должен позаботиться, чтобы остальная часть выражения имела
смысл, независимо от значения булевской части.
22. Понятие оператора. Раздел оператор. Простые и сложные
операторы.
Оператором называется конструкция языка, выполняющая алгоритмические действия.
Т.е. это конструкция, при выполнении которой изменяются значения переменных или изменяется
порядок выполнения программы.
Все операторы делятся на простые и сложные. Простые операторы не содержат в качестве
составляющих частей другие операторы, сложные - содержат.
Простые операторы:
- присваивания,
- процедуры,
- пустой оператор,
- перехода.
Сложные операторы:
- составной оператор,
- операторы цикла,
- выбирающие операторы,
- операторы присоединения.
23. Оператор присваивания. Пустой оператор. Составной
оператор.
Оператор присваивания предназначен для замены значения текущей переменной новым.
Оператор имеет следующий вид:
<переменная>:=<выражение>
<имя функции>:=<выражение>
Оператор осуществляется в следующей последовательности:
1. Вычисляется значение выражения стоящее в правой части
2. Результат присваивается переменной.
Тип переменной должен совпадать с типом значения выражения.
Составной оператор представляет собой операторы, заключенные в операторные скобки begin-end.
Пустой оператор не отображается, никаких действий не выполняет, но может быть помечен.
Составной оператор предусматривает выполнение входящих в него операторов в порядке их
следования.
Он позволяет объединить несколько операторов в один.
24. Условный оператор if.
Существует две формы условного оператора:
1. if <выражение> then <операторы>.
2. if <выражение> then <операторы> else <операторы>.
Между if и then должно находится булевское выражение.
Порядок выполнения:
1. Вычисляется значение булевского выражения.
2. Если истинно, то выполняются операторы после then.
3. В противном случае переходит к следующему оператору программы либо к операторам идущим
после else.
25. Оператор вариантов.
Этот оператор имеет вид:
case <выражение> of
<список меток варианта 1> : <оператор1>;
<список меток варианта 2> : <оператор2>;
…;
<список меток варианта 3> : <оператор3>;
end;
Case - селектор выбора и может быть выражением любого скалярного типа, кроме вещественного.
Список меток варианта может содержать одну или несколько меток, в качестве которых могут
использоваться константы, тип которых совпадает с типом селектора.
Метки в списке разделяются запятыми.
Оператор выполняется в следующей последовательности:
- вычисляется значение селектора,
- в порядке сверху вниз осуществляется поиск варианта, список меток которых содержит значение
селектора,
- как только находится такой вариант, то выполнятся оператор, входящий в него,
- выход из оператора выбора
Если искомый вариант ответа не найден, то действие в стандартном Паскале не определено и зависит от
реализации.
26. Операторы цикла while и repeat.
Оператор цикла предназначен для многократного выполнения заданной последовательности
операторов.
К таким операторам относятся:
- оператор цикла с предусловием (while)
- оператор цикла с постусловием (repeat)
- оператор цикла с параметром (for)
Оператор цикла с предусловием
while <выражение булевского типа> do <оператор>;
Порядок выполнения:
- вычисляется значение <выражения булевского типа>, стоящего после while;
- если true, тогда выполняется оператор после do, после чего осуществляется переход к началу цикла;
- повторяется до тех пор, пока значение не станет false, после этого осуществляется выход из оператора.
Совокупность многократного выполнения операторов обычно называется телом цикла.
Оператор цикла с постусловием.
repeat <оператор> until < выражение булевского типа >;
Порядок выполнения:
Оператор выполняется до тех пор, пока значение выражения не станет true.
Оператор цикла с параметром.
Обеспечивает многократное выполнение операторов входящих в его тело для всех значений
управляющей переменной, значение которой изменяется по заданной прогрессии.
Существует две формы оператора цикла:
1. for <переменная>:=<начальное значение> to <конечное значение> do <оператор>;
2. for <переменная>:=<начальное значение> downto <конечное значение> do <оператор>;
где:
<переменная> - переменная любого скалярного типа кроме вещественного. Она называется параметром
цикла или управляющей переменной.
Оператор в первой форме обеспечивает многократное выполнение операторов, входящих в его тело для
всех значений параметра цикла от начального значения до конечного.
При этом значения могут задаваться выражения соответствующего типа.
Тип их результата должен совпадать с типом уравнения переменной.
Начальное (конечное) значение выполняется только один раз в начале выполнения оператора цикла.
Второй оператор выполняется аналогично, но значение управляющей переменной изменяется в сторону
уменьшения (увеличения) от начального к конечной.
При использовании цикла for следует учитывать, что значение параметра цикла изменяется
автоматически и не должно изменятся никаким оператором в теле цикла.
Оператор for обычно выполняется достаточно быстро и поэтому его рекомендуется использовать
вместо других операторов цикла.
27. Скалярный тип.
Скалярный тип является основным типом данных в Паскале.
Стандартные скалярные типы так же относятся к скалярному типу.
type <имя типа>:=(<имя>,{<имя>});
В качестве таких имен можно использовать любые допустимые идентификаторы.
type <имя типа>:=(white, red, blue, yellow, purple, green, orange, black);
Константы входящие в определение таких типов нумеруются с 0.
Поэтому:
ord (white)=0;
ord (black)=7;
К значениям перечислимого типа применимы: pred, succ.
pred (black)=orange;
succ (white)=red;
Значения перечислимого типа можно сравнивать: C>C1, если ord (C) > ord (C1);
blue>red;
В программе можно определять переменные таких типов, и между переменными одного и того же типа
допустима операция присваивания.
Переменные перечислимых типов нельзя вводить или выводить с помощью стандартных операторов
ввода/вывода.
В конкретных реализациях переменные перечислимых типов используются для задания значений
различных стандартных констант.
Считается, что использование таких типов делает программу более наглядной.
28. Ограниченный тип.
Образуется наложением ограничений на уже определенный тип или стандартный скалярный тип.
Тип, на основе которого строится ограниченный, называется базовым.
В качестве базового может использоваться любой скалярный типа за исключением базового.
Описание:
type <имя типа>=(<константа1> … <константа2>);
Ограничение задает диапазон возможных значений нового типа, который определен отрезком или
интервалом, задаваемый константой определяющей min и max значения.
В указанный интервал должно входить хотя бы одно значение.
Во множество возможных значений входят все значения с <константа1> до <константа2>
включительно. Две указанных константы должны принадлежать одному и тому же типу.
После определения типов можно использовать переменные этих типов.
Эти переменные можно использовать как соответствующие переменные базового типа.
Переменные этого типа могут сравниваться с помощью операции отношения.
При выполнении операций над некоторыми операндами типов может оказаться, что результат их будет
принадлежать соответствующему интервальному типу.
//Структурный тип.
//Характеризуется тем, что они строятся на основе других типов и состоят из компонентов.
//В паскале имеется 4 способа реализации этих типов:
//1. массивы,
//2. записи,
//3. множества,
//4. файлы.
//Массивы и записи могут быть представлены как упакованные структуры, это означает то что
компилятор должен экономить память при размещении значений указанной
//При использовании упакованных структурных типов экономится место в оперативной памяти, но
увеличивается время доступа к их компонентам.
//Структурный тип может быть упакованным или не упакованным.
29. Регулярный тип. Массивы.
Массив - это набор некоторого числа элементов (однотипные компоненты массива).
Индексы массива могут задаваться выражением, значение которого принадлежит типу индекса.
Синтаксис:
type <имя типа> = array [<тип индекса> {<тип индекса>}] of <тип элемента>;
здесь тип индекса это скалярный или ограниченный тип, который определяет множество допустимых
значений соответствующего индекса.
Тип элемента может быть любым скалярным или структурированным типом за исключением
файлового.
Количество используемых типов индексов определяет размерность соответствующих массивов. Если
тип индекса один, то переменные этого типа будут называться одномерным массивом. Если 2 типа
индексов, то - двумерные….
После определения регулярных типов в программе можно определить и использовать переменные этих
типов, которые называются массив.
Строка.
30. Понятие комбинированного типа.
Комбинированный тип является наиболее гибким механизмом построения данных.
Этот тип задает некий образ структуры каждая часть, которой может иметь совершенно разные
характеристики. Переменные комбинированного типа называются записями. Запись, как и массив,
состоит из компонентов, но эти компоненты могут иметь разные типы и для доступа к ним
используются не индексы, а имена этих компонентов.
Описание комбинированного типа имеет следующий синтаксис:
<комбинированный тип>::=record
<список полей>
end.
<список полей>::=<фиксированная часть> | <фиксированная часть>;<вариантная часть> | <вариантная
часть>
<фиксированная часть>::=<секция записей>{<секция записей>}
<секция записей>::=<имя>{<имя>}:<тип> | <пусто>
Определение комбинаторного типа имеет вид:
type <имя типа>::=record
<имя>{, <имя>}:<тип>
………
<имя>{, <имя>}:<тип>
[<вариантная часть>]
end.
Комбинаторный тип, у которого отсутствует вариантная часть, называется упрощенным, а в противном
случае типом с вариантами.
После определения таких типов в программе можно использовать переменные этих типов.
Для обозначения компонента таких записей используется последовательность из имени переменной,
точки и имени полей.
Компонентом записей можно присваивать значение и они могут участвовать в выражениях точно также
как обычные переменные соответствующего типа.
Между переменными одного и того же типа можно применять операции присваивания.
Эта операция сводится к последовательности операции присваивания между одноименными
компонентами записи.
Компоненты комбинированного типа также могут иметь комбинированный тип.
Вариантная часть всегда идет после фиксированной части имеет след. синтаксис:
case <имя поля признака> : <тип> of <вариант> … <вариант>;
Вариант:
<список меток варианта> : (:<список полей>)
Имя признака задается идентификатором и предполагается, что он может иметь любой скалярный тип
кроме вещественного. Этот признак является компонентом комбинированного типа и с ним можно
работать точно так же как и с другими компонентами этого типа.
Каждый вариант состоит из списка меток варианта затем «:», а затем в круглых скобках список полей.
Список меток варианта представляет собой последовательность констант, разделенных запятыми.
Тип этих констант может совпадать с типом поля признака. Список меток может содержать только одну
метку или любое другое количество.
В зависимости от значения в поле признака соответствующая запись будет содержать список полей
только одного варианта, в списке меток которой содержится значение поля признака.
Список меток разных вариантов содержит парные константы и значения поля признака всегда должно
содержаться в одном из указанных списков.
31. Множественный тип.
Понятие множества в языке Паскаль основывается на математическом представлении о множествах: это
ограниченная совокупность различных элементов. Для построения конкретного множественного типа
используется перечисляемый или интервальный тип данных. Тип элементов, составляющих множество,
называется базовым типом.
Множественный тип описывается с помощью служебных слов Set of, например:
type M= Set of B;
Здесь М - множественный тип, В - базовый тип.
Пример описания переменной множественного типа:
type
M= Set of 'A'..'D';
var
MS: M;
Принадлежность переменных к множественному типу может быть определена прямо в разделе описания
переменных:
var
C: Set of 0..7;
Константы множественного типа записываются в виде заключенной в квадратные скобки
последовательности элементов или интервалов базового типа, разделенных запятыми, например:
['A', 'C'] [0, 2, 7] [3, 7, 11..14].
Константа вида: [ ] означает пустое подмножество.
Множество включает в себя набор элементов базового типа, все подмножества данного множества, а
также пустое подмножество. Если базовый тип, на котором строится множество, имеет К элементов, то
число подмножеств, входящих в это множество, равно 2 в степени К. Пусть имеется переменная Р
интервального типа:
var P: 1..3;
Эта переменная может принимать три различных значения - либо 1, либо 2, либо 3. Переменная Т
множественного типа
var T: Set of 1..3;
может принимать восемь различных значений:
[ ] [1,2]
[1] [1,3]
[2] [2,3]
[3] [1,2,3]
Порядок перечисления элементов базового типа в константах безразличен.
Значение переменной множественного типа может быть задано конструкцией вида [T], где T переменная базового типа.
К переменным и константам множественного типа применимы операции присваивания(:=),
объединения(+), пересечения(*) и вычитания(-):
['A','B'] + ['A','D'] даст ['A','B','D']
['A'] * ['A','B','C'] даст ['A']
['A','B','C'] - ['A','B'] даст ['C'].
Результат выполнения этих операций есть величина множественного типа.
К множественным величинам применимы операции: тождественность (=), нетождественность (<>),
содержится в (<=), содержит (>=). Результат выполнения этих операций имеет логический тип,
например:
['A','B'] = ['A','C'] даст FALSE
['A','B'] <> ['A','C'] даст TRUE
['B'] <= ['B','C'] даст TRUE
['C','D'] >= ['A'] даст FALSE.
Кроме этих операций для работы с величинами множественного типа в языке Паскаль используется
операция in проверяющая принадлежность элемента базового типа, стоящего слева от знака операции,
множеству, стоящему справа от знака операции. Результат выполнения этой операции - булевский.
Операция проверки принадлежности элемента множеству часто используется вместо операций
отношения, например:
A in ['A', 'B'] даст TRUE,
2 in [1, 3, 6] даст FALSE.
При использовании в программах данных множественного типа выполнение операций происходит над
битовыми строками данных. Каждому значению множественного типа в памяти ЭВМ соответствует
один двоичный разряд. Например, множество
['A','B','C','D']
представлено в памяти ЭВМ битовой строкой
1 1 1 1.
Подмножества этого множества представлены строками:
['A','B','D'] 1 1 0 1
['B','C'] 0 1 1 0
['D'] 0 0 0 1
Величины множественного типа не могут быть элементами списка ввода - вывода.
В каждой конкретной реализации транслятора с языка Паскаль количество элементов базового типа, на
котором строится множество, ограничено. В Turbo Pascal количество базовых элементов не должно
превышать 256.
Инициализация величин множественного типа производится с помощью типизированных констант:
const seLit: Set of 'A'..'D'= [];
32. Файловый тип. Понятие последовательного файла и файла с
прямым доступом.
Введение файлового типа в язык Паскаль вызвано необходимостью обеспечить возможность работы с
периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения
данных.
Файловый тип данных или файл определяет упорядоченную совокупность произвольного числа
однотипных компонент.
Общее свойство массива, множества и записи заключается в том, что количество их компонент
определено на этапе написания программы, тогда как количество компонент файла в тексте программы
не определяется и может быть произвольным.
Понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт
ЭВМ, устройство печати, клавиатура или другие устройства.
При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись
данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода - это
пересылка данных из основной памяти на внешнее устройство (в выходной файл).
Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются
операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк.
Например, имя файла на диске может иметь вид:
'A:LAB1.DAT'
'c:\ABC150\pr.pas'
'lab3.pas'.
var tStory: Text;
Описание компонентных файлов имеет вид:
var fComp: File of T;
где T - тип компоненты файла. Примеры описания файловой переменной компонентного типа:
type M= array [1..500] of Longint;
var f1: File of Real;
f2: File of Integer;
fLi: File of M;
Особое место в языке Паскаль занимают текстовые файлы, компоненты которых имеют символьный
тип. Для описания текстовых файлов в языке определен стандартный тип Тext:
var TF1, TF2: Text;
Текстовые файлы представляют собой последовательность строк, а строки - последовательность
символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки.
Для операций над текстовыми файлами, кроме перечисленных, определены также операторы обращения
к процедурам:
ReadLn(T) - пропускает строку до начала следующей;
WriteLn(T) - завершает строку файла, в которую производится запись, признаком конца строки и
переходит к началу следующей.
К текстовым файлам относятся стандартные файлы INPUT, OUTPUT.
Рассмотренные ранее операторы ввода - вывода являются частным случаем операторов обмена с
текстовыми файлами, когда используются стандартные файлы ввода - вывода INPUT, OUTPUT.
Компонентный или типизированный файл - это файл с объявленным типом его компонент.
Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в
том же виде, что и память ЭВМ.
Описание величин файлового типа имеет вид:
type M= File Of T;
где М - имя файлового типа, Т - тип компоненты.
При открытии файла длина буфера устанавливается по умолчанию в 128 байт. Turbo Pascal позволяет
изменить размер буфера ввода - вывода, для чего следует открывать файл расширенной записью
процедур
Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь
одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к
компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту.
После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда
следует, что процессы формирования (записи) компонент файла и просмотра (чтения) не могут
произвольно чередоваться. Таким образом, файл вначале строится при помощи последовательного
добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.
Рассмотренные ранее средства работы с файлами обеспечивают последовательный доступ.
Структурированные типы данных, такие, как массивы, множества, записи, представляют собой
статические структуры, так как их размеры неизменны в течение всего времени выполнения программы.
Часто требуется, чтобы структуры данных меняли свои размеры в ходе решения задачи. Такие
структуры данных называются динамическими, к ним относятся стеки, очереди, списки, деревья и
другие. Описание динамических структур с помощью массивов, записей и файлов приводит к
неэкономному использованию памяти ЭВМ и увеличивает время решения задач.
Каждая компонента любой динамической структуры представляет собой запись, содержащую, по
крайней мере, два поля: одно поле типа указатель, а второе - для размещения данных. В общем случае
запись может содержать не один, а несколько указателей и несколько полей данных. Поле данных
может быть переменной, массивом, множеством или записью.
33. Текстовые файлы. Внешние и внутренние файлы.
34. Понятие подпрограммы. Процедуры. и 35. Функции. Раздел
описания процедур и функций.
При решении сложных объемных задач часто целесообразно разбивать их на более простые. Метод
последовательной детализации позволяет составить алгоритм из действий, которые, не являясь
простыми, сами представляют собой достаточно самостоятельные алгоритмы. В этом случае говорят о
вспомогательных алгоритмах или подпрограммах. Использование подпрограмм позволяет сделать
основную программу более наглядной, понятной, а в случае, когда одна и та же последовательность
команд встречается в программе несколько раз, даже более короткой и эффективной.
В языке Паскаль существует два вида подпрограмм: процедуры и функции, определяемые
программистом. Процедурой в Паскале называется именованная последовательность инструкций,
реализующая некоторое действие. Функция отличается от процедуры тем, что она должна обязательно
выработать значение определенного типа.
Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны до
первого их упоминания. Вызов процедуры или функции производится по их имени.
Подпрограммы в языке Паскаль могут иметь параметры (значения, передаваемые в процедуру или
функцию в качестве аргументов). При описании указываются так называемые формальные параметры
(имена, под которыми будут фигурировать передаваемые данные внутри подпрограммы) и их типы. При
вызове подпрограммы вместе с ее именем должны быть заданы все необходимые параметры в том
порядке, в котором они находятся в описании. Значения, указываемые при вызове подпрограммы,
называются фактическими параметрами.
Формат описания процедуры:
Procedure <Имя процедуры> (<Имя форм. параметра 1>:<Тип>; < Имя форм. параметра 2>:<Тип>);
<Раздел описаний>
begin
<Тело процедуры>
end;
Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы
(описание процедур и функций - в том числе). Однако все описанные здесь объекты "видимы" лишь в
этой процедуре. Они здесь локальны так же, как и имена формальных параметров. Объекты, описанные
ранее в разделе описаний основной программы и не переопределенные в процедуре, называются
глобальными для этой подпрограммы и доступны для использования.
Легко заметить схожесть структуры программы целиком и любой из ее процедур. Действительно, ведь и
процедура и основная программа реализуют некий алгоритм, просто процедура не дает решения всей
задачи. Отличие в заголовке и в знаке после end.
Формат описания функции:
Function <Имя функции> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>) : <Тип результата>;
<Раздел описаний>
begin
<Тело функции>
end;
В теле функции обязательно должна быть хотя бы команда присвоения такого вида: <Имя
функции>:=<Выражение>;
Указанное выражение должно приводить к значению того же типа, что и тип результата функции,
описанный выше.
Вызов процедуры представляет в программе самостоятельную инструкцию:
<Имя процедуры>(<Фактический параметр 1>, < Фактический параметр 2>);
Типы фактических параметров должны быть такими же, что и у соответствующих им формальных.
Вызов функции должен входить в выражение. При вычислении значения такого выражения функция
будет вызвана, действия, находящиеся в ее теле, будут выполнены, в выражение будет подставлено
значение результата функции.
Существует два способа передачи фактических параметров в подпрограмму: по значению и по
ссылке. В первом случае значение переменной - фактического параметра при вызове подпрограммы
присваивается локальной переменной, являющейся формальным параметром подпрограммы. Что бы
потом ни происходило с локальной переменной, это никак не отразится на соответствующей
глобальной. Для одних задач это благо, но иногда требуется произвести в подпрограмме действия над
самими переменными, указанными в качестве фактических параметров. На помощь приходит второй
способ. Происходит следующее: при обращении к подпрограмме не происходит формирования
локальной переменной - формального параметра. Просто на время выполнения подпрограммы имя этой
локальной переменной будет указывать на ту же область памяти, что и имя соответствующей
глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в
глобальной.
Передача параметров по ссылке отличается тем, что при описании подпрограммы перед именем
переменной - формального параметра ставится служебное слово Var. Теперь использование в качестве
фактических параметров выражений или непосредственных значений уже не допускается - они должны
быть именами переменных.
36. Рекурсия. Основные понятия. Прямая и косвенная рекурсия.
37. Динамические переменные. Ссылочный тип.
В отличие от таких статических переменных в программах, написанных на языке Паскаль, могут быть
созданы динамические переменные. Основное свойство динамических переменных заключается в том,
что они создаются, и память для них выделяется во время выполнения программы. Размещаются
динамические переменные в динамической области памяти (heap - области).
Динамическая переменная не указывается явно в описаниях переменных и к ней нельзя обратиться по
имени. Доступ к таким переменным осуществляется с помощью указателей и ссылок.
Работа с динамической областью памяти в Turbo Pascal реализуется с помощью процедур и функций
New, Dispose, GetMem, FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf.
Процедура New (var p: Pointer) выделяет место в динамической области памяти для размещения
динамической переменной p^ и ее адрес присваивает указателю p.
Процедура Dispose (var p: Pointer) освобождает участок памяти, выделенный для размещения
динамической переменной процедурой New, и значение указателя p становится неопределенным.
Процедура GetMem (var p: Pointer; size: Word) выделяет участок памяти в heap - области, присваивает
адрес его начала указателю p, размер участка в байтах задается параметром size.
Процедура FreeMem (var p: Pointer; size: Word) освобождает участок памяти, адрес начала которого
определен указателем p, а размер параметром size. Значение указателя p становится неопределенным.
Процедура Mark (var p: Pointer) записывает в указатель p адрес начала участка свободной
динамической памяти на момент ее вызова.
Процедура Release (var p: Pointer) освобождает участок динамической памяти, начиная с адреса,
записанного в указатель p процедурой Mark, то-есть, очищает ту динамическую память, которая была
занята после вызова процедуры Mark.
Функция MaxAvail: Longint возвращает длину в байтах самого длинного свободного участка
динамической памяти.
Функция MemAvail: Longint полный объем свободной динамической памяти в байтах.
Вспомогательная функция SizeOf( X ): Word возвращает объем в байтах, занимаемый X, причем X
может быть либо именем переменной любого типа, либо именем типа.
38. Понятие списка. Типы списков: однонаправленные и
двунаправленные.
Каждая компонента списка определяется ключом. Обычно ключ - либо число, либо строка символов.
Ключ располагается в поле данных компоненты, он может занимать как отдельное поле записи, так и
быть частью поля записи.
Основные отличия связного списка от стека и очереди следующие:
-для чтения доступна любая компонента списка;
-новые компоненты можно добавлять в любое место списка;
-при чтении компонента не удаляется из списка.
Над списками выполняются следующие операции:
-начальное формирование списка (запись первой компоненты);
-добавление компоненты в конец списка;
-чтение компоненты с заданным ключом;
-вставка компоненты в заданное место списка (обычно после компоненты с заданным ключом);
-исключение компоненты с заданным ключом из списка.
Для формирования списка и работы с ним необходимо иметь пять переменных типа указатель, первая из
которых определяет начало списка, вторая - конец списка, остальные- вспомогательные.
Описание компоненты списка и переменных типа указатель дадим следующим образом:
type
PComp= ^Comp;
Comp= record
D:T;
pNext : PComp
end;
var
pBegin, pEnd, pCKey, pPreComp, pAux: PComp;
где pBegin - указатель начала списка, pEnd - указатель конца списка, pCKey, pPreComp, pAux вспомогательные указатели.
39. Иерархические и ассоциативные списки.
Используются тогда, когда объединяют информационные записи в списки, тем самым образуя группу
записи с определенным внутренним порядком.
Эту группу можно рассмотреть как единый информационный объект и из таких групп образуются
новые списки. Полученные новые списки можно включать в другие списки и т.д.
Такие списки принято называть иерархическими.
Т.о. иерархический список представляет собой список, элементы, которых могут быть также списки и
т.д.
Иерархические списки позволяют хранить информацию в соответствии с подчинением одних данных
другим. Они также представляют возможным получать доступ и обрабатывать данные.
Ассоциативные списки.
Часто одни и те же объекты представляют интерес с различных точек зрения. И возникает потребность
включать информацию об этих объектах в различные списки.
Если в разные списки включена одна и та же информация, то возникает дублирование одних и тех же
записей. Для устранения такого дублирования используются ассоциативные списки. Они организуются
на одном и том же общем наборе записи, причем каждый из ассоциативных списков объединяют в
определенном порядке те записи из этого набора, которые обладают нужным наборов признаков. Он
организуется в виде цепочки, а каждый ассоциативный список имеет свое заглавное звено и ссылки для
объедения звеньев в соответственный список.
Каждое звено имеет для каждого ассоциативного списка свою ссылку.
40. Стеки.
Стеком называется динамическая структура данных, добавление компоненты в которую и исключение
компоненты из которой производится из одного конца, называемого вершиной стека. Стек работает по
принципу LIFO (Last-In, First-Out) поступивший последним, обслуживается первым.
Обычно над стеками выполняется три операции:
-начальное формирование стека (запись первой компоненты);
-добавление компоненты в стек;
-выборка компоненты (удаление).
41. Очереди.
Очередью называется динамическая структура данных, добавление компоненты в которую
производится в один конец, а выборка осуществляется с другого конца. Очередь работает по принципу
FIFO (First-In, First-Out) поступивший первым, обслуживается первым.
Для формирования очереди и работы с ней необходимо иметь три переменные типа указатель, первая из
которых определяет начало очереди, вторая - конец очереди, третья - вспомогательная.
Описание компоненты очереди и переменных типа указатель дадим следующим образом:
type
PComp=^Comp;
Comp=record
D:T;
pNext:PComp
end;
var
pBegin, pEnd, pAux: PComp;
где pBegin - указатель начала очереди, pEnd - указатель конца очереди, pAux - вспомогательный
указатель.
Тип Т определяет тип данных компоненты очереди.
В стеки или очереди компоненты можно добавлять только в какой либо один конец структуры данных,
это относится и к извлечению компонент.
Связный (линейный) список является структурой данных, в произвольно выбранное место которого
могут включаться данные, а также изыматься оттуда.
42. Деревья - как структуры данных. Двоичные деревья. Методы
их просмотра.
Совокупность записей, связанных между собой системой ссылок, в которой каждая запись может
содержать ссылки на несколько других называется графом.
Частным случаем графа является дерево. Подструктуры узлов не пересекаются между собой, т.е. не
содержат общих элементов.
Дерево еще называют рекурсивной структурой, т.к. его можно определить следующим образом: дерево
либо пусто, либо состоит из узла, содержащее ссылки на непересекающиеся деревья.
Частным случаем деревьев являются двоичные деревья.
Двоичным называется дерево, каждый узел которого содержит не более двух ссылок.
Над двоичным деревом определена операция просмотра его узлов. Эту операцию можно производить
рекурсивно.
43. Упорядоченные двоичные деревья. Операции поиска.
Наиболее широко в программировании используются упорядоченные двоичные деревья.
Характеризуются тем, что данные в таких деревьях размещаются в соответствии с их величиной или
величиной специального поля, называемого ключом.
Ключ может иметь любой тип, допускающий операции сравнения.
Данные - поле, предназначенное для хранения полезной информации, которая используется для
хранения дерева.
Поля левые и правые предназначены для хранения ссылок на левые и правые поддеревья. Если сами
данные используются для хранения ключа, то это поле может отсутствовать.
Над бинарным деревом определены все те же операции, что и над обычными:
1. поиск по заданному значению ключа,
2. вставка в дерево нового данного,
3. удаление из дерева значения.
Операция поиска осуществляется, начиная с корня дерева и выполняется следующие
последовательности: если ключ очереди анализирующей вершины не совпадает с ключом исходных
данных, то если ключ искомых данных больше значения ключа анализирующей вершины, то
осуществляется переход к поиску в правом поддереве этой вершины, в противном случае в левом.
При этом завершается не успехом если достигнут терминальный узел, ключ которого не совпадает с
ключом исходных данных.
Для реализации операции поиска можно использовать как рекурсивный, так и не рекурсивный
алгоритм.
44. Включения и удаления элементов из двоичного
упорядоченного дерева.
Для вставки в упорядоченное бинарное дерево также можно использовать как рекурсивные, так и не
рекурсивные алгоритмы.
Процесс вставки:
1) создается новый узел дерева, куда записывается ключ, данные, а ссылки на левые и правые
поддеревья заполняются значением Нил.
2) осуществляется поиск узла дерева, к которому можно подвесить новый узел, так, чтобы
упорядоченность дерева не было нарушено. Таковым узлом может быть только терминальный узел.
3) Если на предыдущем шаге терминальный узел найден, то остается повесить к нему новую вершину.
Если в процессе поиска будет найдена вершина, ключ которой совпадает с ключом новых данных, то
операция вставки считается невозможной.
Операции включения выполняется в следующей последовательности:
1. Осуществляется поиск исключающего звена.
2. Если звено найдено, то выполняется операция его удаления из дерева.
На этапе удаления нужной вершины дерева возможны три варианта:
а. Из исключающей вершины не выходит ни одна ветвь. Тогда исключении производиться удалением
найденной вершины и записью вместо ссылки на нее предшествующие вершины значению Нил.
б. Из исключающей вершины выходит только одна ветвь. В этом случае вместо ссылки на
исключающую вершину предшествующего звена записывается ссылка на вершину, подвешенную к
исключаемой.
в. Из исключаемой вершины выходит три ветви, тогда надо найти вершину с таким ключом, чтобы ее
можно было подставить на место исключения и упорядоченность дерева не была бы нарушена.
Составил к.ф. - м.н., доцент каф. И и ВМ /В. Сиников/
Download