- •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 |
237 |
5.8 Удаление элемента из массива
Знакомство с алгоритмом удаления элемента из массива начнем со следующей простой задачи. Необходимо удалить третий элемент из массива X, состоящего из 6 элементов. Алгоритм удаления третье-
го элемента заключается в том, что на место третьего элемента следует записать четвертый, на место четвертого — пятый, а на место пято-
го — шестой.
X[3]:=X[4]; X[4]:=X[5]; X[5]:=X[6];
Таким образом, все элементы с третьего по пятый надо переместить влево на один, на место i-го элемента нужно записать (i+1)-й.
Блок-схема алгоритма представлена на рис. 5.28.
Теперь рассмотрим более общую задачу: необходимо удалить m-й элемент из массива X, состоя-
щего из n элементов. Для этого
достаточно записать (m+1)-й эле- |
|
мент на место элемента c номе- |
|
ром m, (m+2)-й элемент – на место |
|
(m+1)-го и т.д., n-й элемент – на |
|
место (n–1)-го. Процесс удале- |
Рисунок 5.28: Алгоритм |
ния элемента из массива пред- |
удаления 3-го элемента |
ставлен на рис. 5.29. |
из массива |
Рисунок 5.29: Процесс удаления элемента из массива
Алгоритм удаления из массива Х размерностью n элемента с номером m приведен на рис. 5.30.
После удаления элемента60 из массива, изменится количество элементов в массиве (уменьшается на один) и у части элементов изменяется индекс. Если элемент удален, то на место него приходит следующий, передвигаться к которому (путем увеличения индекса на один) нет необходимости. Следующий элемент сам сдвинулся влево после удаления.
60 А фактически сдвига части массива на один элемент влево.
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
238 |
Рисунок 5.30: Алгоритм удаления m-го элемента из массива из n элементов
Если обрабатывается массив, в котором часть элементов удаляется, то после удаления элемента не надо переходить к следующему (при этом уменьшается количество элементов). В качестве примера рассмотрим следующую задачу.
ЗАДАЧА 5.1. Удалить из массива X(n) отрицательные элементы.
Алгоритм решения задачи довольно прост, перебираем все элементы массива, если элемент отрицателен, то удаляем его путем сдвига всех последующих на один влево. Единственное, о чем стоит помнить, что после удаления не надо переходить к следующему для последующей обработки, он сам сдвигается на место текущего. Блоксхема решения задачи 5.1 представлена на рис. 5.31. Ниже представлен текст программы с комментариями. Результаты работы програм-
мы представлены на рис. 5.32. program upor_massiv;
var i,n,j:byte;
X: array [1..100] of real; begin
writeln ('введите размер массива '); readln (n);
{Ввод массива.} for i:=1 to n do begin
write('X[',i,']='); readln (X[i]);
end;
writeln ('массив X '); for i:=1 to n do
write (x[i]:5:2,' '); writeln;
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
239 |
Рисунок 5.31: Блок-схема решения задачи 5.1
Алексеев Е.Р., Чеснокова О.В., Кучер Т.В. Самоучитель по программированию на Free Pascal и Lazarus |
240 |
i:=1;
while(i<=n)do
{Если очередной элемент массива X[i] отрицателен, то }
if x[i]<0 then begin
{Удаляем элемент массива с номером i.} for j:=i to n-1 do x[j]:=x[j+1];
{Уменьшаем размер массива.} {Не переходим к следующему элементу массива.}
n:=n-1;
end else
{Если элемент не удалялся, то переходим к следующему элементу массива.}
i:=i+1; writeln('Измененный массив:');
for i:=1 to n do write (X[i]:5:2,' '); writeln;end.
Рисунок 5.32: Результаты работы программы решения задачи 5.1