
- •Введение
- •Начальные сведения о программах на языке Pascal
- •Структура Pascal-программы
- •Внешний вид исходного текста программы
- •Простейшие операторы
- •Ввод и вывод: консоль
- •Типы данных и операции
- •Операции и выражения
- •Приведение типов данных
- •Операции
- •Составной оператор
- •Инструкции выбора
- •Процедуры и функции
- •Множества
- •Сортировки массивов
- •Улучшенные сортировки
- •Рекурсия
- •Модуль GraphAbc
- •Указатели в Паскале
- •Динамически распределяемая память
- •Динамические структуры данных
- •Списочные структуры
- •Текстовые файлы
- •Бинарные файлы
- •Типизированные файлы
- •Нетипизированные файлы
- •Элементы комбинаторики
- •Матрица смежности.
- •2. Массив ребер.
- •3. Списки инцидентности.
- •4. Списки смежности.
- •Части графа.
- •Методы обхода графа.
- •Поиск в глубину.
- •Поиск в ширину.
- •Поиск кратчайших путей.(Алгоритм Дейкстры).
- •Основы ооп
- •Классы объектов
- •Принципы ооп
- •Создание и уничтожение объектов
- •Полиморфизм и наследование в Delphi
- •Наследование
- •Полиморфизм
- •Статическое замещение методов.
- •2) Перегрузка
- •Интегрированная среда разработки Delphi 7
- •Стандартные компоненты Delphi
- •Дополнительные компоненты
- •Другие дополнительные компоненты
- •Компоненты 32-разрядного интерфейса
- •Коллекция картинок
- •2 Индикатор выполнения
- •3 Ползунок
- •Реверсивный счетчик UpDown
- •Редактор горячих клавиш
- •Компоненты для работы с датами
- •Строка состояния
- •8 Панель инструментов
- •9 Элементы с вкладками
- •10 Компонент RichEdit
- •Компоненты вкладки Dialogs Страница Dialogs
- •Диалог выбора шрифта — компонент FontDialog
- •Диалог выбора цвета — компонент ColorDialog
- •Диалоги печати и установки принтера — компоненты PrintDialog и PrinterSetupDialog
- •Диалоги поиска и замены текста — компоненты FindDialog и ReplaceDialog
- •Страница Samples
- •Графические возможности Delphi 7
- •Формирование изображений программным способом
- •Мультимедиа-возможности Delphi
- •Компонент Animate
- •Компонент MediaPlayer
- •Воспроизведение звука
- •Просмотр видеороликов и анимации
- •Компоненты доступа к базам данных. Компоненты представленя данных.
Процедуры и функции
При решении сложных объемных задач часто целесообразно разбивать их на более простые. Метод последовательной детализации позволяет составить алгоритм из действий, которые, не являясь простыми, сами представляют собой достаточно самостоятельные алгоритмы. В этом случае говорят о вспомогательных алгоритмах или подпрограммах. Использование подпрограмм позволяет сделать основную программу более наглядной, понятной, а в случае, когда одна и та же последовательность команд встречается в программе несколько раз, даже более короткой и эффективной.
В языке Паскаль существует два вида подпрограмм: процедуры и функции, определяемые программистом.
Процедурой в Паскале называется именованная последовательность инструкций, реализующая некоторое действие.
Функция отличается от процедуры тем, что она должна обязательно выработать значение определенного типа.
Процедуры и функции, используемые в программе, должны быть соответствующим образом описаны до первого их упоминания. Вызов процедуры или функции производится по их имени.
Подпрограммы в языке Паскаль могут иметь параметры (значения, передаваемые в процедуру или функцию в качестве аргументов).
При описании указываются так называемые формальные параметры (имена, под которыми будут фигурировать передаваемые данные внутри подпрограммы) и их типы. При вызове подпрограммы вместе с ее именем должны быть заданы все необходимые параметры в том порядке, в котором они находятся в описании. Значения, указываемые при вызове подпрограммы, называются фактическими параметрами.
Формат описания процедуры:
Procedure <Имя процедуры> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>?);
<Раздел описаний>
Begin <Тело процедуры>
End;
Раздел описаний может иметь такие же подразделы, как и раздел описаний основной программы (описание процедур и функций - в том числе). Однако все описанные здесь объекты "видимы" лишь в этой процедуре. Они здесь локальны также, как и имена формальных параметров. Объекты, описанные ранее в разделе описаний основной программы и не переопределенные в процедуре, называются глобальными для этой подпрограммы и доступны для использования.
Легко заметить схожесть структуры программы целиком и любой из ее процедур. Действительно, ведь и процедура и основная программа реализуют некий алгоритм, просто процедура не дает решения всей задачи. Отличие в заголовке и в знаке после End.
Формат описания функции:
Function <Имя функции> (<Имя форм. параметра 1>:<Тип>;
< Имя форм. параметра 2>:<Тип>?) : <Тип результата>;
<Раздел описаний>
Begin <Тело функции>
End;
В теле функции обязательно должна быть хотя бы команда присвоения такого вида: <Имя функции>:=<Выражение>;
Указанное выражение должно приводить к значению того же типа, что и тип результата функции, описанный выше.
Вызов процедуры представляет в программе самостоятельную инструкцию: <Имя процедуры>(<Фактический параметр 1>, < Фактический параметр 2>?);
Типы фактических параметров должны быть такими же, что и у соответсвующих им формальных.
Вызов функции должен входить в выражение. При вычислении значения такого выражения функция будет вызвана, действия, находящиеся в ее теле, будут выполнены, в выражение будет подставлено значение результата функции.
Приведем простейший пример использования подпрограммы.
Задача: "Найти максимальное из трех введенных чисел". Для решения воспользуемся описанием функции, принимающей значение максимального из двух чисел, которые передаются в нее в виде параметров.
Program Fn;
Var A,B,C :Real;
Function Max(A,B:Real):Real; {Описываем функцию Max с формальными}
Begin {параметрами A и B, которая принимает }
If A>B Then Max:=A {значение максимального из них }
Else Max:=B {Здесь A и B - локальные переменные }
End; Begin
Writeln('Введите три числа');
Readln(A,B,C); Writeln('Максимальным из всех является ', Max(Max(A,B),C))
End.
Обратите внимание на краткость тела основной программы и на прозрачность действий внутри функции. Формальные параметры A и B, используемые в подпрограмме, не имеют никакого отношения переменным A и B, описанным в основной программе.
Существует два способа передачи фактических параметров в подпрограмму: по значению и по ссылке. В первом случае значение переменной-фактического параметра при вызове подпрограммы присваивается локальной переменной, являющейся формальным параметром подпрограммы. Что бы потом ни происходило с локальной переменной, это никак не отразится на соответствующей глобальной. Для одних задач это благо, но иногда требуется произвести в подпрограмме действия над самими переменными, указанными в качестве фактических параметров. На помощь приходит второй способ. Происходит следующее: при обращении к подпрограмме не происходит формирования локальной переменной-формального параметра. Просто на время выполнения подпрограммы имя этой локальной переменной будет указывать на ту же область памяти, что и имя соответствующей глобальной переменной. Если в этом случае изменить локальную переменную, изменятся данные и в глобальной.
Передача параметров по ссылке отличается тем, что при описании подпрограммы перед именем переменной-формального параметра ставится служебное слово Var. Теперь использование в качестве фактических параметров выражений или непосредственных значений уже не допускается - они должны быть именами переменных.
Еще один классический пример. Задача: "Расположить в порядке неубывания три целых числа".
Program Pr;
Var S1,S2,S3 :Integer;
Procedure Swap(Var A,B: Integer);{Процедура Swap с параметрами-переменными}
Var C : Integer; {C - независимая локальная переменная}
Begin C:=A; A:=B; B:=C {Меняем местами содержимое A и B}
End; Begin
Writeln('Введите три числа');
Readln(S1,S2,S3); If S1>S2 Then Swap(S1,S2);
If S2>S3 Then Swap(S2,S3);
If S1>S2 Then Swap(S1,S2);
Writeln('Числа в порядке неубывания:V',S1,S2,S3)
End.
Модули
|
Модуль - это подключаемая к программе библиотека ресурсов. Он может содержать описания типов, констант, переменных и подпрограмм. В модуль обычно объединяют связанные между собой ресурсы: например, в составе оболочки есть модуль Graph для работы с экраном в графическом режиме.
Модули применяются либо как библиотеки, которые могут использоваться различными программами, либо для разбиения сложной программы на составные части.
Использование модулей позволяет преодолеть ограничение в один сегмент на объем кода исполняемой программы, поскольку код каждого подключаемого к программе модуля содержится в отдельном сегменте.
Модули можно разделить на стандартные, которые входят в состав системы программирования, и пользовательские, то есть создаваемые программистом. Чтобы подключить модуль к программе, его требуется предварительно скомпилировать. Результат компиляции каждого модуля хранится на диске в отдельном файле с расширением .tpu.
Описание модулей
Исходный текст каждого модуля хранится в отдельном файле с расширением .pas. Общая структура модуля:
unit имя; { заголовок модуля }
interface { интерфейсная секция модуля }
{ описание глобальных элементов модуля (видимых извне) }
implementation { секция реализации модуля }
{ описание локальных (внутренних) элементов модуля }
begin { секция инициализации }
{ может отсутствовать }
end.
ВНИМАНИЕ Имя файла, в котором хранится модуль, должно совпадать с именем, заданным после ключевого слова unit.
Модуль может использовать другие модули, для этого их надо перечислить в операторе uses, который может находиться только непосредственно после ключевых слов interface или implementation.
В интерфейсной секции модуля определяют константы, типы данных, переменные, а также заголовки процедур и функций.
В секции реализации описываются подпрограммы, заголовки которых приведены в интерфейсной части. Заголовок подпрограммы должен быть или идентичным указанному в секции интерфейса, или состоять только из ключевого слова procedure или function и имени подпрограммы. Для функции также указывается ее тип.
Кроме того, в этой секции можно определять константы, типы данных, переменные и внутренние подпрограммы.
Секция инициализации предназначена для присваивания начальных значений переменным, которые используются в модуле. Операторы, расположенные в секции инициализации модуля, выполняются перед операторами основной программы.
Для сохранения скомпилированного модуля на диске требуется установить значение пункта Destination меню Compile в значение Disk. Компилятор создаст файл с расширением .tpu.
Пример №1.
Пример описания модуля. Оформим в виде модуля подпрограмму вычисления среднего арифметического значения элементов массива.
unit Average;
interface
const n = 10;
type mas = array[1 .. n] of real;
procedure average(x : mas; var av : real);
implementation
procedure average(x : mas; var av : real);
var i : integer;
begin
av := 0;
for i := 1 to n do av := av + x[i];
av := av / n;
end;
end.
Использование модулей
Для использования в программе величин, описанных в интерфейсной части модуля, имя модуля указывается в разделе uses. Можно записать несколько имен модулей через запятую, например:
program example;
uses Average, Graph, Crt;
Поиск модулей выполняется сначала в библиотеке исполняющей системы, затем в текущем каталоге, а после этого - в каталогах, заданных в диалоговом окне Options/Directories.
Если в программе описана величина с тем же именем, что и в модуле, для обращения к величине из модуля требуется перед ее именем указать через точку имя модуля.
Стандартные модули Паскаля
В Паскале имеется ряд стандартных модулей, в которых описано большое количество встроенных констант, типов, переменных и подпрограмм. Каждый модуль содержит связанные между собой ресурсы.
Модуль System
Модуль содержит базовые средства языка, которые поддерживают ввод-вывод, работу со строками, операции с плавающей точкой и динамическое распределение памяти. Этот модуль автоматически используется во всех программах, и его не требуется указывать в операторе uses. Он содержит все стандартные и встроенные процедуры, функции, константы и переменные Паскаля.
Модуль Crt
Модуль предназначен для организации эффективной работы с экраном, клавиатурой и встроенным динамиком. При подключении модуля Crt выводимая информация посылается в базовую систему ввода-вывода (ВIОS) или непосредственно в видеопамять.
В текстовом режиме экран представляется как совокупность строк и столбцов. Каждый символ располагается на так называемом знакоместе на пересечении строки и столбца. Символы хранятся в специальной части оперативной памяти, называемой видеопамятью. Ее содержимое отображается на экране.
Под каждый символ отводится два байта: один байт занимает ASCII-код символа, другой байт хранит атрибуты символа: его цвет, цвет фона и признак мерцания. Можно получить восемь различных цветов фона и 16 цветов символов.
Модуль Crt позволяет:
выполнять вывод в заданное место экрана заданным цветом символа и фона;
открывать на экране окна прямоугольной формы и выполнять вывод в пределах этих окон;
очищать экран, окно, строку и ее часть;
обрабатывать ввод с клавиатуры;
управлять встроенным динамиком.
Работа с экраном
Текущие цвета символа и фона задаются с помощью процедур TextColor и TextBackGround и действуют на следующие за ними процедуры вывода. Вывод выполняется в текущую позицию курсора. Для ее изменения служит процедура GotoXY.
Окно определяется с помощью процедуры Window. Оно задается координатами левого верхнего и правого нижнего угла.
Очистка текущего окна выполняется с помощью процедуры ClrScr, которая заполняет его пробелами с текущим цветом фона и устанавливает курсор в левый верхний угол.
Пример №1.
Программа "угадай число".
program luck;
uses crt;
const max = 10;
var
i, k, n : integer;
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.
Работа с клавиатурой
Модуль Crt позволяет работать с управляющими клавишами и комбинациями клавиш. Нажатие каждой клавиши преобразуется либо в ее ASCII-код, либо в так называемый расширенный код (scan-код) и записывается в буфер клавиатуры, из которого затем и выбирается процедурами ввода. Под каждый код отводится два байта. Если нажатие клавиш соответствует символу из набора ASCII, в первый байт заносится код символа. Если нажата, к примеру, клавиша курсора, функциональная клавиша или комбинация клавиш с CTRL или ALT, то первый байт равен нулю, а во втором находится расширенный код, соответствующий этой комбинации.
Для работы с клавиатурой модуль Crt содержит функции ReadKey и KeyPressed.
Модули Dos и WinDos
Модули Dos и WinDos содержат подпрограммы, реализующие возможности операционной системы MS-DOS - например, переименование, поиск и удаление файлов, получение и установку системного времени, выполнение программных прерываний и так далее. Эти подпрограммы в стандартном Паскале не определены. Для поддержки подпрограмм в модулях определены константы и типы данных.
Модуль Dos использует строки Паскаля, а WinDos - строки с завершающим нулем.
Модуль Graph
Модуль обеспечивает работу с экраном в графическом режиме.
Экран в графическом режиме представляется в виде совокупности точек - пикселов. Цвет каждого пиксела можно задавать отдельно. Начало координат находится в левом верхнем углу экрана и имеет координаты (0, 0). Количество точек по горизонтали и вертикали (разрешение экрана) и количество доступных цветов зависят от графического режима. Графический режим устанавливается с помощью служебной программы - графического драйвера.
В состав оболочки входит несколько драйверов, каждый из может работать в нескольких режимах. Режим устанавливается при инициализации графики либо автоматически, либо программистом.
Модуль Graph обеспечивает:
вывод линий и геометрических фигур заданным цветом и стилем;
закрашивание областей заданным цветом и шаблоном;
вывод текста различным шрифтом, заданного размера и направления;
определение окон и отсечение по их границе;
использование графических спрайтов и работу с графическими страницами.
В отличие от текстового режима, в графическом курсор невидим.
Перед выводом изображения необходимо определить его стиль, то есть задать цвет фона, цвет линий и контуров, тип линий, шаблон заполнения, вид и размер шрифта, и так далее.
Эти параметры устанавливаются с помощью соответствующих процедур. Возможные значения параметров определены в модуле Graph в виде многочисленных констант.
Модуль Strings
Модуль предназначен для работы со строками, заканчивающимися нуль-символом, то есть символом с кодом 0 (их часто называют ASCIIZ-строки). Модуль содержит функции копирования, сравнения, слияния строк, преобразования их в строки типа string, поиска подстрок и символов.
В модуле System определен тип pChar, представляющий собой указатель на символ (^Char). Этот тип можно использовать для работы со строками, заканчивающимися #0. Эти строки располагаются в динамической памяти, и программист должен сам заниматься ее распределением.
Кроме того, для хранения ASCIIZ-строк используются массивы символов с нулевой базой, например:
var str : array[0 .. 4000] of char;
p: pChar;
Массивы символов с нулевой базой и указатели на символы совместимы.
Строки |
|
Все языки программирования высокого уровня имеют средства работы с литерными величинами. Паскаль - не исключение. Как вам уже известно, в стандарте языка описаны два типа переменных для литерных величин. Это - String и Char. S : String[30]; Переменным строкового типа можно присваивать строковые величины (внутри программы они заключаются в апострофы), значения выражений, которые приводят к строковым величинам. Значения можно также вводить с клавиатуры. При этом апострофы не используются. Как вам известно, в числовую переменную нельзя ввести строковую величину. Сделать наоборот - возможно, однако число, находящееся в строковой переменной представляет собой просто последовательность символов (цифр), поэтому в арифметических выражениях участвовать не может. При использовании строковой переменной, к каждому ее символу можно обратиться отдельно. Необходимо только знать номер нужного символа от начала строки. Его достаточно поставить после имени переменной типа String в квадратных скобках. Пример: S[5] - пятый символ строки S. С отдельным символом строки можно производить все действия, которые можно производить с любой символьной переменной (ввод, присвоение, вывод на экран, участие в выражениях и т.д.). Обратите внимание на то, что нумерация символов в строке начинается с единицы. Внутри квадратных скобок вместо числа может находиться выражение, результатом которого является целое число. Главное чтобы символ с таким номером в строке существовал. Но как же узнать, сколько символов в данный момент находится в строковой переменной? Для этого существует специальная функция, которая возвращает длину строковой переменной в символах. Это функция Length. Ее формат: Length(S) Здесь S - либо строковая величина, либо строковая переменная. Приведенная далее программа выводит на экран длину введенной пользователем строки. Program Str1; Var S String; Begin Writeln('Введите последовательность символов'); Readln(S); Writeln('Вы ввели строку из ',Length(S), ' символов') End. Введенную строку вывести на экран по одному символу в строке экрана. Program Str2; Var S : String; I : integer; Begin Writeln('Введите строку'); Readln(S); For I:=1 to Length(S) do {организуем цикл, начиная с первого символа} Writeln(S[I]); End. Две строковые величины можно состыковывать. Эта операция называется конкатенацией и обозначается знаком "+". Например, результатом выполнения следующих команд: R:= 'kadabra'; H:= 'abra'; S:=H+R; в переменной S будет значение 'abrakadabra'. Строковые величины можно сравнивать между собой. Если начало строк совпадает, а одна из них кончается раньше, то вторая автоматически называется большей. Код символа в Паскале можно определить при помощи функции Ord. Ее формат: Ord(C), где С - либо непосредственно указанный символ, либо переменная символьного типа, либо один символ строковой переменной. Есть и обратная функция, которая возвращает символ по известному коду. Это функция Chr(N), где N - выражение, приводящее к целому числу в интервале от 0 до 255 (возможные значения кода символа). Очевидно, что Chr(Ord(C))=C, Ord(Chr(N))=N. Следующая маленькая программа выводит на экран кодовую таблицу: Program Str3; Var I : integer; Begin For I:=32 to 255 do Write(I:4, '-',Chr(I)) End. Цикл в программе начинается с 32 потому, что символы с кодами от 0 до 31 являются управляющими и не имеют соответствующего графического представления. Задача: "Определить, является ли введенная строка "перевертышем". Перевертышем называется такая строка, которая одинаково читается с начала и с конца. Поступим следующим образом: из введенной строки сформируем другую строку из символов первой, записанных в обратном порядке, затем сравним первую строку со второй; если они окажутся равны, то ответ положительный, иначе - отрицательный. Program Str4; Var S,B : String; I : integer; Begin Writeln('Введите строку'); Readln(S); B:=''; {Переменной B присваиваем значение "пустая строка"} For I:=1 to Length(S) do B:=S[I]+B; {Конкатенация. Символы строки S пристыковываются к} {переменной B слева. Самым левым окажется последний.} If B=S Then Writeln('Перевертыш') Else Writeln('Не перевертыш') End. Число, записанное в строковую переменную, естественно числом не является, но очень часто требуется его все же использовать в качестве числа. Для этого нужно произвести преобразование типа. Перевод строкового представления числа в числовое выполняет в Паскале оператор Val. Его формат: Val(S,X,C); Здесь S - строка, содержащая число, X - числовая переменная, в которую будет помещен результат, С - переменная целочисленного типа, в которую помещается первого встреченного в S отличного от цифры символа. Если после выполнения оператора Val переменная С имеет значение 0, то это означает, что преобразование типа прошло совершенно успешно и в строке нецифровых символов не встретилось. Противоположное действие осуществляет оператор Str. Формат оператора: Str(X,S); X - число (либо арифметическое выражение), S - строковая переменная. В переменную S попадает строковое представление числа X. Теперь рассмотрим еще несколько действий над строками:
Пример "Во введенной строке заменить все вхождения подстроки 'ABC' на подстроки 'KLMNO'". Program Str6; Var S : String; A : Byte; Begin Writeln('Введите строку'); Readln(S); While Pos('ABC',S)<>0 Do Begin A:= Pos('ABC',S); Delete(S,A,3); Insert('KLMNO',S,A) End; Writeln(S) End. |