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

Программирование на языке высокого уровня Паскаль. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Если в программе описана величина с тем же именем, что и в модуле, для обращения к величине из модуля требуется перед ее именем указать через точку имя модуля.
ПРИМЕЧАНИЕ К любой программе автоматически подключается стандартный модуль System, который содержит библиотеку исполняющей системы Паскаля.
Пример использования модуля из пример 4.6 приведен в пример 4.7. Программа находит разность средних арифметических значений двух вещественных массивов.
program dif_average; uses Average; var a, b : mas; i : integer; dif, av_a, av_b : real; begin for i := 1 to n do read(a[i]); for i := 1 to n do read(b[i]); average(a, av_a); average(b, av_b); dif := av_a – av_b; writeln('Разность значений ', dif:6:2); end.
Листинг 4.7. Разность средних арифметических значений массивов (модуль)
Стандартные модули Паскаля
В Паскале имеется ряд стандартных модулей, в которых описано большое количество встроенных констант, типов, переменных и подпрограмм. Каждый модуль содержит связанные между собой ресурсы. Ниже приводится краткая характеристика модулей Паскаля.
Модуль System
Программирование на языке высокого уровня ПаскальТ.А. Павловская
91
Модуль System содержит базовые средства языка, которые поддерживают ввод-вывод, работу со строками, операции с плавающей точкой и динамическое распределение памяти. Этот модуль автоматически используется во всех программах, его не требуется указывать в операторе uses. Он содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля.
Модуль Crt
Модуль Crt предназначен для организации эффективной работы с экраном, клавиатурой и встроенным динамиком. При подключении модуля выводимая информация посылается в базовую систему ввода­вывода (ВIОS) или непосредственно в видеопамять. При этом ввод­вывод выполняется быстрее, кроме того, появляется возможность управлять цветом и размещением на экране.
В текстовом режиме экран представляется как совокупность строк и столбцов. Каждый символ располагается на так называемом знакоместе на пересечении строки и столбца. Символы хранятся в специальной части оперативной памяти, называемой видеопамятью. Ее содержимое отображается на экране.
Модуль Crt позволяет:
выполнять вывод в заданное место экрана заданным цветом символа и фона; открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон; очищать экран, окно, строку и ее часть; обрабатывать ввод с клавиатуры; управлять встроенным динамиком.
Пример. Программа "Угадай число" (пример 4.8).
program luck; uses crt; const max = 10; var i, k, n : integer;
Программирование на языке высокого уровня ПаскальТ.А. Павловская
92
begin clrscr; { очистить экран } randomize; i := random(max); { загадать число } window(20, 5, 60, 20); { определить окно } TextBackGround(Blue); { цвет фона – синий } clrscr; { залить окно фоном } TextColor(LightGray); { цвет символов – серый } k := –1; { счетчик попыток } GotoXY(12, 5); writeln(' Введите число : '); repeat { цикл ввода ответа } GotoXY(20, 9); { установить курсор } readln(n); { ввести число } inc(k); until i = n; window(20, 22, 60, 24); { определить окно результата } TextAttr := 2 shl 4 + 14; { желтые символы за зеленом фоне } clrscr; { залить окно фоном } GotoXY(6, 2); { установить курсор } writeln(' Коэффициент невезучести : ', k / max :5:1); readkey; { ждать нажатия любой клавиши } TextAttr := 15; { белые символы на черном фоне } clrscr; { очистить после себя экран } end.
Листинг 4.8. Пример использования модуля Crt
Генератор случайных чисел формирует число, находящееся в диапазоне от нуля до max – 1. Пользователь вводит числа в одну и ту же позицию на экране до тех пор, пока не угадает это число. При угадывании с первого раза коэффициент невезучести равен нулю.
Модули Dos и WinDos
Модули Dos и WinDos содержат подпрограммы, реализующие возможности операционной системы MS-DOS, такие как переименование, поиск и удаление файлов, получение и установка системного времени, выполнение программных прерываний и т. д. Эти
Программирование на языке высокого уровня ПаскальТ.А. Павловская
93
подпрограммы в стандартном Паскале не определены. Для поддержки подпрограмм в модулях определены константы и типы данных.
Модуль Dos использует строки Паскаля, а WinDos — строки с завершающим нулем.
Модуль Graph
Модуль обеспечивает работу с экраном в графическом режиме.
Экран в графическом режиме представляется в виде совокупности точек — пикселов (pixel, сокращение от picture element ). Цвет каждого пиксела можно задавать отдельно. Начало координат находится в левом верхнем углу экрана и имеет координаты (0, 0). Количество точек по горизонтали и вертикали ( разрешение экрана ) и количество доступных цветов зависят от графического режима. Графический режим устанавливается с помощью служебной программы — графического драйвера.
В состав оболочки входят несколько драйверов, каждый из которых может работать в нескольких режимах. Режим устанавливается при инициализации графики либо автоматически, либо программистом. Самый "мощный" режим, поддерживаемый модулем Graph, — 640 480 точек, 16 цветов. Модуль Graph обеспечивает:
вывод линий и геометрических фигур заданным цветом и стилем; закрашивание областей заданным цветом и шаблоном; вывод текста различным шрифтом, заданного размера и направления; определение окон и отсечение по их границе; использование графических спрайтов и работу с графическими страницами.
Модуль Strings
Модуль Strings предназначен для работы со строками, заканчивающимися нуль-символом, то есть символом с кодом 0 (их часто называют ASCIIZ-строки). Этот вид строк введен в Паскаль
Программирование на языке высокого уровня ПаскальТ.А. Павловская
94
специально для работы с длинными строками и программирования под Windows. Модуль Strings содержит функции копирования, сравнения, слияния строк, преобразования их в строки типа string, поиска подстрок и символов.
Программирование на языке высокого уровня ПаскальТ.А. Павловская
95
Работа с динамической памятью
Указатели: виды, описание, использование. Динамические переменные. Динамические структуры данных: стек, очередь, линейный список, бинарное дерево.
Презентацию к данной работе Вы можете скачать здесь скачать: http://old.intuit.ru/department/pl/prinpas/5/Pascal_5.zip.
В PC-совместимых компьютерах память условно разделена на сегменты. Компилятор формирует сегменты кода, данных и стека, а остальная доступная программе память называется динамической (хипом, кучей ). Ее можно использовать во время выполнения программы.
В программах, приведенных ранее, для хранения данных использовались простые переменные, массивы или записи. По их описаниям в разделе var компилятор определяет, сколько места в памяти необходимо для хранения каждой величины. Такие переменные можно назвать статическими. Распределением памяти под них занимается компилятор, а обращение к этим переменным выполняется по имени. Динамические переменные создаются в хипе во время выполнения программы. Обращение к ним осуществляется через указатели.
С помощью динамических переменных можно обрабатывать данные, объем которых до начала выполнения программы не известен. Память под такие данные выделяется порциями, или блоками, которые связываются друг с другом. Такой способ хранения данных называется динамическими структурами, поскольку их размеры изменяются в процессе выполнения программы.
Указатели
Имя переменной служит для обращения к области памяти, которую занимает ее значение. Программист может определить собственные переменные для хранения адресов областей памяти. Такие переменные называются указателями. В указателе можно хранить адрес данных или программного кода (например, адрес точки входа в процедуру). Адрес
Программирование на языке высокого уровня ПаскальТ.А. Павловская
96
занимает четыре байта и хранится в виде двух слов, одно из которых определяет сегмент, второе — смещение.
Указатели в Паскале можно разделить на два вида: стандартные и определяемые программистом. Величины стандартного типа pointer предназначены для хранения адресов данных произвольного типа, например:
var p : pointer;
Программист может определить указатель на данные или подпрограмму конкретного типа. Как и для других нестандартных типов, это делается в разделе type:
type pword = ^word; { читается как 'указатель на word' } ... var pw : pword;
Здесь определяется тип pword как указатель на величины типа word. В переменной pw можно хранить только адреса величин указанного типа. Такие указатели называются типизированными. Можно описать указатель на любой тип данных, кроме файловых.
Аналогично другим типам, тип указателя на данные можно описать и непосредственно при описании переменной, например:
var pw : ^word;
Операции с указателями
Для указателей определены только операции присваивания и проверки на равенство и неравенство. В Паскале, в отличие от других языков, запрещаются любые арифметические операции с указателями, их ввод­вывод и сравнение на больше-меньше. Рассмотрим правила присваивания указателей.
Любому указателю можно присвоить стандартную константу nil, которая означает, что указатель не ссылается на какую-либо
Программирование на языке высокого уровня ПаскальТ.А. Павловская
97
конкретную ячейку памяти. Указатели стандартного типа pointer совместимы с
указателями любого типа. Указателю на конкретный тип данных можно присвоить только значение указателя того же или стандартного типа.
Операция @ и функция addr позволяют получить адрес переменной, например:
var x : word; { переменная } pw : ^word; { указатель на величины типа word } ... pw := @w; { или pw := addr(w); }
Для обращения к значению переменной, адрес которой хранится в указателе, примеряется операция разадресации ( разыменования ), обозначаемая с помощью символа ^ справа от имени указателя, например:
pw^ := 2; inc(pw^); writeln(pw^);
В первом операторе в ячейку памяти, адрес которой хранится в переменной pw, заносится число 2. При выполнении оператора вывода на экране появится число 3.
С величинами, адрес которых хранится в указателе, можно выполнять любые действия, допустимые для значений этого типа. Для простоты восприятия можно считать имя указателя со следующей за ним "крышкой" просто именем переменной, на которую он указывает, хотя на самом деле это, конечно, не так.
ПРИМЕЧАНИЕ Указатели стандартного типа разыменовывать нельзя.
Указатели можно сравнивать на равенство и неравенство, например:
if p1 = p2 then ... if p <> nil then ...
Программирование на языке высокого уровня ПаскальТ.А. Павловская
98
Динамические переменные
Динамические переменные создаются в хипе во время выполнения программы с помощью подпрограмм new или getmem. Динамические переменные не имеют собственных имен — к ним обращаются через указатели.
Процедура new (var p : тип_указателя) выделяет в динамической памяти участок размера, достаточного для размещения переменной того типа, на который ссылается указатель p, и заносит в него адрес начала этого участка.
Функция new(тип_указателя) : pointer выделяет в динамической памяти участок размера, достаточного для размещения переменной базового типа для заданного типа указателя, и возвращает адрес начала этого участка.
Если в new использовать указатель стандартного типа
pointer, память фактически не выделяется, а при попытке
работать с ней выдается ошибка. Поэтому процедура и функция
new обычно применяются для типизированных указателей.
Процедура getmem (var p : pointer; size : word) выделяет в динамической памяти участок размером в size байт и присваивает адрес его начала указателю p. Эту процедуру можно применять и для указателей типа pointer, поскольку количество выделяемой памяти задается в явном виде.
Если выделить требуемый объем памяти не удалось, программа аварийно завершается.
Рассмотрим пример работы с динамическими переменными. Определим в разделе описания переменных главной программы три указателя p1, p2 и p3.
type rec = record d : word; s : string;
Программирование на языке высокого уровня ПаскальТ.А. Павловская
99
end; pword = ^word; var p1, p2 : pword; p3 : ^rec;
Это — обычные статические переменные, компилятор выделяет под них в сегменте данных по четыре байта и обнуляет их (рис. 5.1).
Рис. 5.1. Размещение указателей в памяти
В разделе исполняемых операторов программы запишем операторы:
new(p1); p2 := new(pword); new(p3);
В результате выполнения процедуры new(p1) в хипе выделяется объем памяти, достаточный для размещения переменной типа word, и адрес начала этого участка памяти записывается в переменную p1. Второй оператор выполняет аналогичные действия, но используется функция new. При вызове процедуры new с параметром p3 в динамической памяти будет выделено количество байтов, достаточное для размещения записи типа rec.
Доступ к выделенным областям осуществляется с помощью операции разадресации:
p1^ := 2; p2^ := 4; p3^.d := p1^; p3^.s := 'Вася';
В этих операторах в выделенную память заносятся значения (рис. 5.2).
Программирование на языке высокого уровня ПаскальТ.А. Павловская
100
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]