- •Ответственный за выпуск: Бивойно п.Г. , декан факультета электронных и информационных технологий, канд. Техн. Наук, доцент
- •Содержание
- •Лабораторная работа № 7. Одномерные массивы
- •Краткие теоретические сведения о массивах
- •Понятие массив
- •Объявление массива
- •Передача массивов в процедуры и функции
- •Операции с массивами
- •Типовые процедуры и функции для работы с массивами
- •Описание типа учебного массива
- •Процедуры создания, ввода и вывода массивов
- •Процедура создания случайного массива
- •Процедура ввода массива из строки текста
- •Процедура ввода массива из компонента tMemo
- •Процедура ввода массива с помощью функции InputBox
- •Функция преобразования массива в строку символов
- •Процедура вывода массива в компонент tMemo
- •Обработка массивов
- •Функция вычисления суммы элементов массива
- •Процедура определения минимального, максимального, и их индексов в массиве
- •Функция определения позиции элемента в массиве
- •Процедура удаления элементов из массива
- •Процедура переворота массива
- •Процедура циклического сдвига части элементов массива влево
- •Процедура формирования массива накопленных значений
- •Задание для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 8. Сортировка массивов
- •Методы сортировки массивов
- •Сортировка выбором
- •Пример сортировки массива по возрастанию методом выбора
- •Процедура сортировки массива методом выбора
- •Сортировка обменом (метод пузырька)
- •Пример сортировки массива по возрастанию методом обмена
- •Процедура сортировки массива методом обмена
- •Сортировка вставкой или включением
- •Пример сортировки массива по возрастанию методом вставки
- •Процедура сортировки методом вставки
- •Сортировка по усложненным правилам
- •Обработка упорядоченных массивов
- •Вставка элемента в отсортированный массив
- •Слияние двух отсортированных массивов в один
- •Поиск позиции элемента в отсортированном массиве
- •Удаление элемента из отсортированного массива
- •Задание для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 9. Работа с двумерными массивами (матрицами)
- •Краткие теоретические сведения
- •Описание матриц
- •Использование компонента StringGrid для ввода-вывода матриц
- •Тотальная обработка данных в матрицах
- •Выборочная обработка матрицы
- •Перестановки элементов матрицы
- •Удаление и вставка элементов матрицы
- •Сортировка элементов матрицы
- •Задание для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 10. Работа с записями
- •Краткие теоретические сведения
- •Объявление типа для записи
- •Массивы записей
- •Поля записей как массивы
- •Сортировка массивов записей
- •Ввод-вывод записей
- •Создание проекта «Результаты аттестации»
- •Интерфейс пользователя для проекта
- •Определение типов данных
- •Инициализация интерфейса
- •Добавление строки в таблицу
- •Удаление строки из таблицы
- •Процедура создания массива записей по содержимому StringGrid
- •Процедура отображения массива в компоненте StringGrid
- •Процедура сортировки массива записей по группе и фамилии
- •Сортировка записей по количеству неудовлетворительных оценок и среднему баллу
- •Выборка студентов какой-нибудь группы, имеющих средний балл выше 4
- •Подсчет числа студентов, имеющих более 2-х неудовлетворительных оценок и вывод упорядоченного списка этих студентов
- •Задание для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 11. Работа с типизироваными файлами
- •Краткие теоретические сведения
- •Объявление файловой переменной
- •Назначение файла файловой переменной
- •Открытие файла
- •Текущая позиция файла
- •Чтение данных из файла
- •Запись данных в файл
- •Обрезка “хвоста” файла
- •Закрытие и удаление файлов
- •Перечень основных процедур и функций для работы с типизированными файлами
- •Создание проекта «Результаты аттестации»
- •Требования к проекту
- •Интерфейс пользователя для проекта
- •Определение типов данных
- •Настройка интерфейса пользователя
- •Вспомогательные процедуры для работы с файлом Процедура выбора имени файла
- •Процедура открытия файла
- •Процедура вывода файла в StringGrid
- •Процедуры работы со StringGrid1
- •Процедуры реализации пунктов меню fileMenu Добавление данных из StringGrid1 в файл
- •Поиск записи по фамилии
- •Удаление записи по фамилии
- •Сохранение файла под другим именем
- •Процедуры для работы с упорядоченными файлами Процедура сортировки файла
- •Поиск записи в отсортированном файле
- •Добавление записи в отсортированный файл
- •Удаление записи из отсортированного файла
- •Процедуры реализации пунктов меню sortMenu Реализация пункта меню «Сортировка файла по фамилиям»
- •Реализация пункта меню «Поиск студента по фамилии»
- •Реализация пункта меню «Добавление в упорядоченный файл из StringGrid1»
- •Реализация пункта меню «Удаление записи из отсортированного файла»
- •Задание для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа № 12. Работа с текстовыми файлами
- •Краткие теоретические сведения
- •Объявление файловой переменной для текстового файла
- •Связывание файловой переменной с конкретным файлом
- •Открытие файла
- •Создание нового файла
- •Открытие файла для чтения
- •Открытие файла для дополнения
- •Текущая позиция файла
- •Записи данных в файл.
- •Чтение данных из файла
- •Особенности чтения чисел из текстового файла
- •Особенности чтения данных типа String
- •Особенности чтения и записи символов
- •Закрытие и удаление файлов
- •Перечень основных процедур для работы с текстовыми файлами
- •Общая схема работы с текстовым файлом
- •Примеры работы с текстовыми файлами
- •Пример ввода-вывода при решении простейшей задачи
- •Пример добавления данных из одного файла к другому
- •Пример чтение из файла в поле Memo
- •Пример ввода-вывода при работе с массивом
- •Пример ввода-вывода при работе с матрицей
- •Пример ввода-вывода при работе с записями
- •Задания для самостоятельной работы
- •Содержание отчета
- •Контрольные вопросы
- •РекомендоваНная литература
-
Удаление и вставка элементов матрицы
Здесь подразумевается удаление столбца или стоки матрицы, так как удалять отдельный элемент матрицы мы не можем, не нарушив прямоугольную структуру.
Удаление или вставка строки или столбца подобно удалению или вставке элемента массива. При удалении нужно сдвинуть последующие строки влево или столбцы вверх, на место удаляемого компонента, и уменьшить соответствующий размер. При вставке нужно сдвинуть последующие строки вправо или столбцы вниз, освободив место для вставляемого компонента, и увеличить соответствующую границу матрицы.
-
Сортировка элементов матрицы
Есть две разновидности задачи сортировки матриц
Первая из них заключается в том, что сортируются отдельные части матрицы, независимо от других частей. К этой разновидности можно отнести следующие задачи.
-
Сортировка каждой строки или каждого столбца независимо от других.
-
Сортировка одной из диагоналей матрицы.
-
Сортировка строк или столбцов матрицы по значению первого элемента.
-
Сортировка строк матрицы по сумме элементов строки.
-
Сортировка столбцов по сумме элементов столбца.
Решение этих задач не намного сложнее сортировки массива.
Для решения первой задачи списка, сортировку массива следует применить последовательно для каждой строки или столбца.
Во второй задаче диагональ рассматривается как одномерный массив, и важно только не запутаться в индексах, если требуется отсортировать вспомогательную диагональ.
При решении третей задачи дополнительная проблема возникает только в том, что нужно менять местами целые строки или столбцы. Для этого целесообразно написать отдельную процедуру.
Для решения последней задачи потребуется еще функция вычисления суммы элементов столбца или строки.
Вторая разновидность задач сортировки матрицы заключается в том, что в одной процедуре сортировки участвуют все элементы матрицы.
Такая сортировка обеспечивает расположение элементов матрицы по возрастанию или убыванию в направлении заданного способа обхода матрицы.
Варианты обхода элементов матрицы могут быть самые разные. Некоторые из них приведены ниже.
-
По строкам сверху вниз и слева направо, или снизу вверх и справа налево, или змейкой.
-
То же самое по столбцам.
-
То же самое по линиям параллельным главной или вспомогательной диагоналям.
-
Углом, вершина которого находится на главной или вспомогательной диагонали.
Каким бы не был способ обхода элементов матрицы, саму сортировку всегда можно свести к сортировке массива. Для этого следует переписать элементы матрицы в массив. Затем массив отсортировать одним из известных способов. После этого элементы массива нужно снова переписать в матрицу, обходя ее по требуемому маршруту.
Написать процедуру переписывания матрицы в массив не составляет труда.
//Допоміжна процедура для переписування матриці у одновимірний масив
Procedure MatrToArray(m:TMatrInt10x10; nRow,nCol:integer; var a:TArray100);
var n, i, j: integer;
begin
n := 0;
for i := 1 to nRow do
for j := 1 to nCol do
begin
n := n + 1;
a[n] := m[i,j];
end;
end;
Проблема сортировки массива нами тоже уже решена. Можно использовать любой из ранее рассмотренных методов.
Таким образом, проблема сортировки матрицы сводится к написанию процедуры, обеспечивающей обхода элементов матрицы в соответствии с требуемым маршрутом.
Подходы к созданию процедур маршрутизации могут быть разными.
Для простых вариантов сортировки, когда направление сортировки совпадает со столбцами или строками, можно использовать расчетный способ определения координат требуемого элемента.
В качестве примера использования расчетного способа, рассмотрим маршрут обхода матрицы по строкам сверху вниз и справа налево для всех строк.
Предположим, что матрица имеет 3 строки и 4 столбца, и обход матрицы совершается по строкам слева направо. Тогда элементы матрицы условно следует перенумеровать так, как показано на рисунке 9.2.
Рисунок 9.2 – Схема маршрута обхода матрицы при сортировке по строкам
Пусть номер элемента в массиве равен 7. Координаты этого элемента в матрице будут такими.
Номер строки будет (7-1) div 4 + 1 = 2.
Номер столбца будет (7-1) mod 4 + 1 = 3.
При расчете предполагается, что нумерация элементов во всех последовательностях начинается с единицы.
Ниже приведена процедура, реализующая запись элементов массива в матрицу, использующая приведенные расчетные формулы.
Исходными данными для процедуры являются
-
m – матрица, которую нужно заполнить по строкам;
-
nCol – количество столбцов матрицы;
-
nRow – количество строк матрицы;
-
аr – упорядоченный массив, из которого берутся данные для заполнения матрицы;
В процедуре вычисляются номер строки и номер столбца в матрице, соответствующие номеру i элемента в массиве, и в соответствии со значениями этих координат элемент массива переписывается в матрицу.
//Допоміжна процедура типу TcalcPos для сортування горизонтальною змією
procedure fillHrzLine(var m: TMatrInt10x10; nRow, nCol: integer; ar: TArray100);
var i, row,col:integer;
begin
for i := 1 to nRow*nCol do
begin
// Вычисляем координаты точки в матрице по значению i
row:=(i-1) div nCol+1;
col:=(i-1) mod nCol +1;
//Записываем в матрицу элемент массива
m[row,col] := ar[i];
end;
end;
end;
В тех случаях, когда маршрут сортировки сложный, расчетный способ непригоден.
Для реализации сложных маршрутов сортировки можно рекомендовать метод моделирования маршрута. Суть этого метода, заключается в создании алгоритма, который для определения номера строки и столбца моделирует прохождение маршрута сортировки от начала до последнего элемента.
Рисунок 9.3 – Схема маршрута обхода матрицы уголком вниз и налево, в направлении главной диагонали
Создаваемый алгоритм на каждом шаге должен оценивать положение текущего элемента и определять, исходя из этого, координаты следующего. Таким образом, в процессе работы алгоритма последовательно вычисляются координаты всех элементов маршрута, пока не будет достигнут последний.
В качестве примера можно привести процедуру маршрутизации для сортировки квадратной матрицы «Уголком, сверху – вниз – налево, от начала главной диагонали». Схема маршрута реализованного в процедуре приведена на рисунке 9.3.
Маршрут имеет два особых участка. Если текущий элемент находится на первой колонке, то следующий элемент попадает на первую строку. Второй особый участок, это главная диагональ. При переходе через нее меняется правило изменения координат элементов матрицы.
Указанные особенности маршрута учитываются в приводимом ниже алгоритме.
//Процедура переписування масиву за маршрутом кутом Зверху-ліворуч
procedure fillCornerTopLeft(var m: TMatrInt10x10; nRow, nCol: integer;
ar: TArray100);
var i, row, col: integer;
begin
//Переписываем массив в матрицу по маршруту кутом Зверху-ліворуч
row:=1;col:=1; // Координаты начала маршрута
// Цикл по элементам массива
for i:=1 to nRow*nCol do
begin
// Записываем в матрицу элемент массива
m[row,col] := ar[i];
// Определяем координаты в матрице для следующего элемента
if col = 1 then begin col := row + 1;row := 1; end
else if row < col then row := row + 1
else col := col - 1;
end;
end;
Названия формальных параметров в этой процедуре такие же, как и в предыдущем примере. В теле процедуры организован цикл последовательного формирования номеров столбца и строки для элементов отсортированного массива.
При каждом повторении цикла вычисляются координаты очередной точки маршрута. Способ вычисления координат следующей точки изменяется при достижении левого края матрицы или главной диагонали.
Задача сортировки матрицы, при наличии рассмотренных выше процедур, решается очень легко. Например, отсортировать некоторую матрицу, расположенную в компоненте StringGrid1, уголком вдоль главной диагонали сверху и налево можно так, как показано ниже. Конечно, если процедуры, к которым производятся обращения, написаны.
procedure TfrmSortMatr.btnCornerTopLeftClick(Sender: TObject);
var m: TMatrInt10x10; nRow, nCol: integer; ar: TArray100;
begin
//Читаем матрицу с экрана
getMatrFromGrid(m, nRow, nCol, StringGrid1);
//Переписываем в массив
MatrToArray(m,nRow,nCol,ar);
//Сортируем массив
SortArray(ar,nRow*nCol);
//Переписываем упорядоченный массив в матрицу по заданному маршруту
fillCornerTopLeft(m,nRow, nCol, ar);
// Выводим матрицу на экран
showMatrInGrid( m,nRow,nCol,StringGrid2);
end;