Delphi_part2
.pdfучебных задач мы будем всегда оперировать с массивом целых чисел, максимальная длина которого будет составлять 100 элементов, и индексы будут нумероваться с 1.
7.2.1 Описание типа учебного массива
Описание этого типа массива дадим в интерфейсной части модуля. Оно может выглядеть так.
unit UnitArrayDop;
interface
type TArray100= array[1..100] of integer;
7.2.2 Процедуры создания, ввода и вывода массивов
Несмотря на различие задач, решаемых этими процедурами, у них будет две одинаковых особенности.
Первая состоит в том, что в каждую из этих процедур будет передаваться имя массива. В тех случаях, когда процедура используется для создания массива, его следует передавать через var, то есть «по имени». Если же массив передается для вывода, то его следует передавать через const.
Вторая особенность в том, что помимо массива в процедуру следует передавать количество данных в массиве, так как объявленный размер массива будет обычно значительно превышать количество данных в нем.
7.2.2.1 Процедура создания случайного массива
В этой процедуре в качестве параметров, помимо имени массива и его размера передается модуль получаемых случайных чисел, который определяет их диапазон.
procedure createRandomArray(var a:TArray100; count, modul:integer ); var i:integer;
begin randomize;
for i:=1 to count do a[i]:=random(modul); end;
7.2.2.2 Процедура ввода массива из строки текста
В эту процедуру передаются по наименованию имя массива, имя переменной целого типа, в которой будет записано количество элементов массива, и строка, которая является символьным представлением массива.
11
//Считывание массива из строки символов
procedure getArrayFromStr(var a:TArray100; var count:integer; const s:String); var wordEndPos : integer; w : String[20];
begin count := 0;
while length(Trim(s))>0 do begin
//Удаляем пробелы s:=Trim(s);
//Находим позицию конца очередного слова wordEndPos:=Pos(' ',s); // Ищем пробел
if wordEndPos = 0 // Пробела не нашли, then // значит конец слова это конц строки
wordEndPos := length(s)
else // Конец слова левее пробела wordEndPos := wordEndPos -1;
//Копируем слово в переменную w
w:= Copy (s,1,wordEndPos);
//и удаляем его из строки
Delete (s,1,wordEndPos);
//Увеличиваем счетчик слов на 1 count := count + 1;
//Преобразуем слово в число и записываем в массив a[count]:=strToInt(w);
end; // Конец цикла поиска слов и формирования массива end; // Конец цикла поиска слов и формирования массива
7.2.2.3 Процедура ввода массива из компонента TMemo
В эту процедуру передаются по наименованию имя массива, имя переменной целого типа, в которой будет записано количество элементов массива, и ссылка на компонент типа TMemo, в котором в виде последовательности строк записаны элементы массива. То есть, массив расположен вертикально.
//Считывание массива из Memo
12
procedure getArrayFromMemo(var a:TArray100; var count:integer;
mem: TMemo);
var i: integer; begin
//Узнаем количество строк count := Mem.Lines.Count;
// Поочередно обрабатываем строки
for i := 0 to count - 1 do a[i+1]:= strToInt(Mem.Lines[i]); end;
7.2.2.4 Процедура ввода массива с помощью функции InputBox
Массив можно ввести, используя функцию InputBox. В этом случае ввод будет осуществляться поэлементно, причем, вначале необходимо будет ввести количество элементов в массиве. В процедуру передаются по наименованию имя массива и имя переменной целого типа, в которой будет записано количество элементов массива.
//Считывание массива из InputBox
procedure getArrayFromInputBox(var a:TArray100; var count:integer); var i:integer; w:String;
begin
w:= InputBox('Ввод массива типа TArray100', 'Сколько элементов ввести', '5');
count := strToInt(w); for i := 1 to count do begin
w:= InputBox(format('Ввод массива из %d элементов', [count]), 'Введите элемент № '+intToStr(i), '0');
a[i]:= strToInt(w);
end;
end;
7.2.2.5 Функция преобразования массива в строку символов
Функция формирует из чисел массива строку, в которой числа разделены пробелами. Эта строка может быть выведена в showMessage, компоненты TEdit, TLabel, и другие подобные компоненты.
Для работы функции передается ссылка на массив и его размер.
13
Возвращает функция – строку.
//Преобразование массива в строку
function ArrayToStr(const a:TArray100; count:integer):string; var i: integer;
begin
result := '';
for i:=1 to count do result := result + ' ' + intToStr(a[i]); end;
7.2.2.6 Процедура вывода массива в компонент TMemo
В эту процедуру передается ссылка на массив, количество элементов массива, и ссылка на компонент типа TMemo, в котором в виде последовательности строк будут записаны элементы массива. В результате массив расположится вертикально.
//Вывод массива в MEMO
procedure showArrayInMemo(const a:TArray100; count:integer; mem:TMemo); var i:integer;
begin mem.clear;
for i := 1 to count do begin
mem.Lines.Append(intToStr(a[i]));
end; end;
7.2.3 Обработка массивов
Операции с массивами также целесообразно оформить в виде процедур и функций. Эти подпрограммы добавлены в модуль UnitArrayDop.
7.2.3.1 Функция вычисления суммы элементов массива
В функцию передается ссылка на массив и его размер. Возвращает функция сумму элементов массива.
//Вычисление суммы элементов
function sumArray(const a:TArray100; count:integer):integer;
14
var i:integer; begin
result:=0;
for i:=1 to count do result := result + a[i]; end;
7.2.3.2 Процедура определения минимального, максимального, и их индексов в массиве
В функцию передается ссылка на массив и его размер, а также по имени передаются переменные для записи максимального, минимального значений элементов массива и их индексов.
//Вычисление максимального и минимального и их индексов procedure minMax(const a:TArray100; count:integer;
var min, max, iMax, iMin: integer); var i: integer;
begin
min := a[1]; max := a[1]; for i := 1 to count do
if a[i] > max then begin max := a[i]; iMax := i; end
else if a[i] < min then begin
min := a[i]; iMin := i; end;
end;
7.2.3.3 Функция определения позиции элемента в массиве
Поиск позиции элемента производится путем последовательного перебора элементов массива и сравнения их с заданным значением. Если элемент найден - цикл прерывается и возвращается позиция найденного элемента. Если элемент не обнаружен, функция возвращает 0.
15
//Определение позиции элемента
function posInArray(element: integer; const a: TArray100; count: integer): integer;
var i: integer; begin
Result := 0;
For i := 1 to count do if a[i] = element then begin
result := i; exit;
end; end;
7.2.3.4 Процедура удаления элементов из массива
В этой процедуре элементы массива перебираются, пока не будет найден заданный элемент. После этого все оставшиеся элементы сдвигаются влево на одну позицию, занимая место удаляемого, а размер массива уменьшается на 1. После этого поиск продолжается, пока не будет достигнут конец массива.
//Удаление элемента из массива
procedure delElem(element: integer; var a: TArray100; var count: integer); var i, j: integer;
begin
i := 1;
while i <= count do begin
if a[i] = element then begin
count := count - 1;
for j := i to count do a[j] := a[j+1];
end
else i := i + 1;
end;
16
end;
7.2.3.5 Процедура переворота массива
В этой процедуре элементы массива, симметрично расположенные относительно середины, меняются местами.
//Переворот массива
procedure trans(var a: TArray100; count: integer); var tmp, i: integer;
begin
for i := 1 to count div 2 do begin
tmp := a[i];
a[i] := a[count – i + 1]; a[count – i + 1]:=tmp;
end; end;
7.2.3.6 Процедура циклического сдвига части элементов массива влево
В этой процедуре элементы массива с индексами от i1 до i2 сдвигаются влево на 1 элемент, а элементы с индексами i1 и i2 меняются местами. Если i1 =1, а i2 равно размеру массива, то сдвигается весь массив.
//Сдвиг массива влево
procedure shiftLeft(var a: TArray100; count, i1, i2: integer); var tmp, i: integer;
begin
if i2 > count then i2 := count; tmp := a[i1];
for i := i1 + 1 to i2 do a[i-1] := a[i]; a[i2] := tmp;
end;
17
7.2.3.7 Процедура формирования массива накопленных значений
Эта процедура создает новый массив, такой же длины, как и исходный, но в этом массиве каждый элемент равен сумме элементов в исходном массиве от первого до текущего элемента.
//Формирование массива накопленных значений
procedure accum(const a: TArray100; var b: TArray100; count: integer); var i: integer;
begin
b[1] := a[1];
for i := 2 to count do b[i] := b[i-1] + a[i]; end;
7.3 ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
В лабораторной работе следует создать проект, в соответствии с требованиями варианта из таблицы 7.1. Номер варианта выбирается по последней цифре номера зачетной книжки.
Главное меню проекта должно включать следующие пункты: создание массива, числовые характеристики, формирование нового массива.
На форме должны быть поля для ввода количества элементов массива и модуля для элементов массива (ограничителя величины числа).
Вывод числовых характеристик на усмотрение разработчика. Компоненты для хранения исходного массива и массива, получаемого в
результате обработки, должны соответствовать варианту задания.
Глобальные переменные для хранения массива и количества данных в нем использовать не следует.
При выполнении каждого пункта меню всю необходимую информацию считывать с формы.
При разработке проекта можно использовать процедуры и функции модуля UnitArrayDop.
7.4 СОДЕРЖАНИЕ ОТЧЕТА
–Наименование работы
–Цель работы
–Краткое описание основных понятий, связанных с массивами
–Тексты процедур и функций, написанных самостоятельно
–Контрольные примеры работы пунктов проекта
–Результаты выполнения пунктов проекта в виде копий экранов
–Выводы
18
Таблица 7.1 – Задания на лабораторную работу |
|
|
|||
|
|
|
|
|
|
№ |
Создание |
Хранение |
Числовые |
Получение нового |
Вывод |
|
исходного |
исходного |
характеристики |
массива |
нового |
|
массива |
массива |
|
|
массива |
0 |
Random |
TEdit |
Размах элементов |
Удаление четных |
TMemo |
|
|
|
(max-min) |
элементов из |
|
|
|
|
|
массива |
|
1 |
InputBox |
TMemo |
Разность сумм |
Оборот |
TEdit |
|
|
|
элементов в четных и |
массива |
|
|
|
|
нечетных позициях |
|
|
2 |
Random |
TEdit |
Определение позиций |
Вставка элемента в |
TLabel |
|
|
|
четных элементов |
заданную позицию |
|
3 |
InputBox |
TLabel |
Определение позиций |
Удаление заданного |
Show |
|
|
|
элементов, которые |
элемента из массива |
Message |
|
|
|
меньше среднего |
|
|
|
|
|
арифметического |
|
|
4 |
Random |
TMemo |
Разность сумм четных |
Заданное число |
Show |
|
|
|
и нечетных элементов |
циклических |
Message |
|
|
|
|
сдвигов влево |
|
5 |
InputBox |
TLabel |
Количество |
Вставка суммы |
TMemo |
|
|
|
четных и нечетных |
элементов в начало |
|
|
|
|
элементов |
массива |
|
6 |
Random |
TMemo |
Средние |
Заданное число |
TEdit |
|
|
|
арифметические |
циклических |
|
|
|
|
четных и нечетных |
сдвигов вправо |
|
|
|
|
Элементов |
|
|
7 |
InputBox |
TMemo |
Поиск позиции |
Вставка среднего |
TLabel |
|
|
|
заданного элемента |
арифметического |
|
|
|
|
|
значения в |
|
|
|
|
|
середину массива |
|
8 |
Random |
TLabel |
Количество элементов |
Вначале нечетные, |
Show |
|
|
|
больше и меньше |
затем четные |
Message |
|
|
|
среднего |
|
|
|
|
|
|
|
|
9 |
InputBox |
TEdit |
Сумма элементов |
Минимальный в |
TMemo |
|
|
|
больше и меньше |
начало, макси- |
|
|
|
|
среднего |
мальный в конец |
|
19
КОНТРОЛЬНЫЕ ВОПРОСЫ
–Определение понятия массив
–Объявление статических массивов
–Поиск максимального или минимального элемента в массиве
–Нахождение суммы и среднего арифметического для элементов массива
–Переворот массива
–Циклические сдвиги элементов массива вправо и влево
–Вставка элемента в массив
–Удаление элемента из массива
–Написать реализацию одного из вариантов из таблицы 7.1
20