- •1 Средства разработки программ на языке Free Pascal
- •1.1 Процесс разработки программы
- •1.2 Среда программирования Free Pascal
- •1.2.1 Работа в текстовом редакторе Free Pascal
- •1.2.2 Запуск программы в среде Free Pascal и просмотр результатов
- •1.3 Текстовый редактор Geany
- •1.4 Среда визуального программирования Lazarus
- •1.4.1 Установка Lazarus в ОС Linux
- •1.4.2 Установка Lazarus под управлением ОС Windows
- •1.4.3 Среда Lazarus
- •1.4.4 Главное меню Lazarus
- •1.4.5 Окно формы
- •1.4.6 Окно редактора Lazarus
- •1.4.7 Панель компонентов
- •1.4.8 Инспектор объектов
- •1.4.9 Первая программа в Lazarus
- •1.4.10 Полезная программа
- •1.4.11 Консольное приложение среды Lazarus
- •1.4.12 Операторы ввода - вывода данных
- •2 Общие сведения о языке программирования Free Pascal
- •2.1 Структура проекта Lazarus
- •2.2 Структура консольного приложения
- •2.3 Элементы языка
- •2.4 Данные в языке Free Pascal
- •2.4.1 Символьный тип данных
- •2.4.2 Целочисленный тип данных
- •2.4.3 Вещественный тип данных
- •2.4.4 Тип дата-время
- •2.4.5 Логический тип данных
- •2.4.6 Создание новых типов данных
- •2.4.7 Перечислимый тип данных
- •2.4.8 Интервальный тип
- •2.4.9 Структурированные типы
- •2.4.10 Указатели
- •2.5 Операции и выражения
- •2.5.1 Арифметические операции
- •2.5.2 Операции отношения
- •2.5.3 Логические операции
- •2.5.4 Операции над указателями
- •2.6 Стандартные функции
- •2.7 Задачи для самостоятельного решения
- •3 Операторы управления
- •3.1 Основные конструкции алгоритма
- •3.2 Оператор присваивания
- •3.3 Составной оператор
- •3.4 Условные операторы
- •3.4.1 Условный оператор if…then…else
- •3.4.2 Оператор варианта case
- •3.5 Обработка ошибок. Вывод сообщений в среде Lazarus
- •3.6 Операторы цикла
- •3.6.1 Оператор цикла с предусловием while .. do
- •3.6.2 Оператор цикла с постусловием repeat … until
- •3.6.3 Оператор цикла for … do
- •3.7 Операторы передачи управления
- •3.8 Решение задач с использованием циклов
- •3.9 Ввод данных из диалогового окна в среде Lazarus
- •3.10 Задачи для самостоятельного решения
- •3.10.1 Разветвляющийся процесс
- •3.10.2 Циклический процесс
- •4 Подпрограммы
- •4.2 Формальные и фактические параметры. Передача параметров в подпрограмму
- •4.3 Процедуры
- •4.4 Функции
- •4.5 Решение задач с использованием подпрограмм
- •4.6 Рекурсивные функции
- •4.7 Особенности работы с подпрограммами
- •4.7.1 Параметры-константы
- •4.7.2 Процедурные типы
- •4.8 Разработка модулей
- •4.9 Задачи для самостоятельного решения
- •5 Использование языка Free Pascal для обработки массивов
- •5.1 Общие сведения о массивах
- •5.2 Описание массивов
- •5.3 Операции над массивами
- •5.4 Ввод-вывод элементов массива
- •5.4.2 Ввод-вывод данных в визуальных приложениях
- •5.5 Вычисление суммы и произведения элементов массива
- •5.6 Поиск максимального элемента в массиве и его номера
- •5.7 Сортировка элементов в массиве
- •5.7.1 Сортировка методом «пузырька»
- •5.7.2 Сортировка выбором
- •5.8 Удаление элемента из массива
- •5.9 Вставка элемента в массив
- •5.10 Использование подпрограмм для работы с массивами
- •5.11 Использование указателей для работы с динамическими массивами
- •5.11.1 Работа с динамическими переменными и указателями
- •5.11.2 Работа с динамическими массивами с помощью процедур getmem и freemem
- •5.12 Примеры программ
- •5.13 Задачи для самостоятельного решения
- •6 Обработка матриц во Free Pascal
- •6.1 Ввод-вывод матриц
- •6.2 Алгоритмы и программы работы с матрицами
- •6.3 Динамические матрицы
- •6.4 Задачи для самостоятельного решения
- •7 Обработка файлов средствами Free Pascal
- •7.1 Типы файлов
- •7.2 Работа с типизированными файлами
- •7.2.1 Процедура AssignFile
- •7.2.2 Процедуры reset, rewrite
- •7.2.3 Процедура СloseFile
- •7.2.4 Процедура rename
- •7.2.5 Процедура erase
- •7.2.6 Функция eof
- •7.2.7 Чтение и запись данных в файл
- •7.3 Бестиповые файлы в языке Free Pascal
- •7.4 Обработка текстовых файлов в языке Free Pascal
- •7.5 Задачи для самостоятельного решения
- •8 Работа со строками и записями
- •8. 1 Обработка текста
- •8.2 Работа с записями
- •8.3 Задачи для самостоятельного решения по теме «Строки»
- •8.4 Задачи для самостоятельного решения по теме «Записи»
- •9.1 Основные понятия
- •9.2 Инкапсуляция
- •9.3 Наследование и полиформизм
- •9.4 Перегрузка операций
- •9.5 Задачи для самостоятельного решения
- •10 Графика во Free Pascal
- •10.1 Средства рисования в Lazarus
- •10.2 Построение графиков
- •10.3 Задачи для самостоятельного решения
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
202 |
else fibonachi:=fibonachi(n-1)+fibonachi(n-2); end;
var x:word; begin
write('Введите номер числа Фибоначчи x='); readln(x);
writeln(x,' -е число Фибоначчи = ', fibonachi(x));
end.
4.7 Особенности работы с подпрограммами
Рассмотрим еще несколько способов передачи параметров в подпрограмму.
4.7.1 Параметры-константы
Параметр-константа указывается в заголовке подпрограммы подобно параметру-значению, но перед его именем записывается зарезервированное слово const, действие которого распространяется
до ближайшей точки с запятой. Параметр-константа передается в подпрограмму как параметр-переменная, но компилятор блокирует любые присваивания параметру-константе нового значения в теле подпрограммы.
В языке Free Pascal можно использовать параметры-переменные и параметры-константы без указания типа, и тогда фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.
4.7.2 Процедурные типы
Процедурные типы были разработаны как средство передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям. Для объявления процедурного типа используется заголовок подпрограммы, в котором пропущено ее имя.
Существует два процедурных типа: тип-процедура и тип-функция: type
тип_процедура=procedure (формальные_параметры); тип_функция=function (формальные_параметры):тип;
Кроме того, в программе могут быть объявлены переменные процедурного типа:
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
203 |
var
имя_переменной_1: тип_процедура; имя_переменной_2: тип_функция;
Например: type
Fun1=function (x,y:real):real; Fun2=function:string;
Proc1=procedure (x,y:real; var c,z:real); Proc2=procedure ();
Var
F1,f2: Fun1; p1,p2: Proc1;
mass:array [1..5] of Proc2;
Обращаться к переменным процедурного типа следует по их ад-
ресу54:
@имя_переменной
Рассмотрим механизм передачи подпрограмм в качестве параметра на примере следующей задачи.
ЗАДАЧА 4.10. Создать программу, которая выводит на экран таблицу значений функций f(x) и g(x).
Вычисление и вывод значений осуществляются с помощью функции VivodFunc. Ее параметры:
•a и b — границы интервала изменения аргумента функции;
•n — количество точек, на которые будет разбит интервал (a, b);
•ff — имя функции.
type {Описание процедурного типа func.} func=function(x:real):real;
function VivodFunc (a,b:real; N:word;ff:func):integer;
var
x,y,hx:real;
f:text; begin
{Шаг изменения переменной x.} hx:=(b-a)/N;
x:=a;
54 Операция взятия адреса (п. 2.4.4)
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
204 |
while(x<=b) do begin
y:=ff(x);
writeln('x=',x:5:2,' y=',y:7:2); x:=x+hx;
end;
end;
{Определение функций f и g с описателем far.} function f(x:real):real;far;
begin f:=exp(sin(x))*cos(x);
end;
function g(x:real):real;far; begin
g:=exp(cos(x))*sin(x);
end; begin
{Вызов Vivodfunc с функцией f в качестве параметра.}
VivodFunc(0,1,7,@f);
writeln;
{Вызов Vivodfunc с функцией g в качестве параметра.}
VivodFunc(0,2,8,@g);
end.
В языке Free Pascal есть возможность использования в качестве формальных параметров массивов функций.
Модифицируем задачу 4.10. Программа, представленная далее, выводит на экран таблицу значений нескольких функций с помощью функции VivodFunc. Здесь в роли параметров функции выступают:
•интервал (a, b);
•количество узлов n интервал (a, b);
•массив функций ff, в которых необходимо вычислить значения;
•количество функций m в массиве ff. type func=function(x:real):real;
{В процедуру VivodFunc передается} {входной параметр ff –
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
205 |
открытый массив функций55.} function VivodFunc(a,b:real;N:word;
ff:array of func; m:word):integer;
var
x,y,hx:real;
i:integer; begin
hx:=(b-a)/N;
{Цикл по всем функциям.} for i:=0 to m-1 do
begin x:=a;
while(x<=b) do begin
{Вычисление значения i-й функции в точке x.} y:=ff[i](x); writeln('x=',x:5:2,' y=',y:7:2); x:=x+hx;
end;
writeln;
end;
end;
function f(x:real):real;far; begin
f:=exp(sin(x))*cos(x);
end;
function g(x:real):real;far; begin
g:=exp(cos(x))*sin(x);
end;
{Описание массива восьми функций fff.} var fff:array[1..8] of func;
begin
{Запись реальных функций в массив fff.} fff[1]:=@f; fff[2]:=@g; VivodFunc(0,1,7,fff,2);{Вызов процедуры.}
end.
55 Подробнее о передаче массива в подпрограмму см. п. 5.10