Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Конспект лекции по Теме 2.
Обработка данных с использованием динамических массивов
Динамические массивы отличаются от обычных статических тем, что для них не
объявляется заранее длина - число элементов. Объявление такого массива содержит
только имя и тип элементов.
Var
<имя_массива>:
array of <тип_данных>.
При объявлении динамического массива место под него не отводится. Прежде чем
использовать такой массив, надо задать в программе его размер процедурой
SetLength. Параметры данной процедуры - количество элементов по каждой
размерности. Например, SetLength(10,20) - для двумерного массива.
Линейный (одномерный) массив - это просто список элементов данных.
Примеры описания одномерных массивов:
var B
:
array [0..5] of real
R : array [1..34]
of char;
N : array ['A'..'Z'] of integer;
M : array of integer;
{динамический массив}
Для доступа к элементу массива следует указать имя массива с последующим числом
(индексом), заключенном в квадратные скобки.
Элементы массива можно использовать в любом выражении точно также как и значение
константы или переменной.
Например, a[0]=11.2;
Y = a[0]
a[1]=10.2;
* 2 - a[1];
a[3]=22.1; a[4]=1.1;
Формирование массива, вычисление суммы, произведения, количества элементов,
среднего арифметического элементов массива, максимального и минимального
элемента массива.
Пример.
Приложение предлагает пользователю задать размер линейного массива, заполняет
этот массив случайными целыми числами в диапазоне от -10 до 10, выводит список
элементов массива, затем по выбору пользователя определяет: сумму всех
элементов массива, количество положительных элементов массива, наименьший
элемент массива и среднее арифметическое элементов массива кратных пяти.
Компоненты
приложения
Окно формы приложения
Edit
Label
CheckBox
Button
GroupBox
Краткая характеристика компоненты GroupBox
П
Панель GroupBox УШ группы Standard - это контейнер с рамкой и надписью,
объединяющий группу связанных органов управления, таких как переключатели
RadioButton , флажки CheckBox и т.д.
Свойства панели GroupBox
Caption
Задает надпись для рамки, выделяющей группу объединенных компонент.
Если компоненты, размещаемые на панели, оказываются под панелью и не отображаются,
то следует выделить панель и выбрать в контекстном меню команду Control — Send to
Back (Порядок — На задний план).
Программный код приложения
Обратите внимание, что размер массива N и сам массив M описаны в разделе объявления
типов, констант, переменных, функций и процедур, доступном для всех модулей
приложения, т.к. эти переменные будут использоваться в разных событийных процедурах:
в процедуре заполнения массива случайными числами TForm1.Button1Click и
процедуре обработки массива TForm1.Button2Click.
Все подзадачи решаются за один просмотр элементов массива.
Например, поиск минимального элемента в массиве. Вначале устанавливается текущий
минимум по нулевому элементу массива min:=M[0]. Затем начинается просмотр
элементов массива: выбирается очередной элемент M[i] и сравнивается с min. Если
элемент M[i] меньше текущего min, то выполняется переприсваивание min:=M[i]
.
var
Focml: TFocml;
Ы: integer;
H:
array of integer;
{Описание динамического массива, целик чисел! implement
at i on {$R *.dfm}
procedure TFocml.ButtonlClick(Sendee: TObject); var
i: integec;
begin
Randomize;
N:=StcToInt(Editl.Text);
{Число элементов массива}
SetLength(Н,Ы);
{Задать массиву М длину N}
Edit:2 . Text.: = ' 1 ;
{Очистить окно Edit2}
For i:=0 to Ы-l do
(Заполнить массив случайными значениями
целых чисел}
begin
Н[i]:=Round(Sin(Random(10))"10);
{Присвоить элементу массива
случайное число из отрезка [-10,10]}
1
Edit2.Text:=Edit2.Text+'
+IntToStc(H[i]);
{Вывести элементы массива} end;
end;
j
procedure TFocml.ButtonZ С licit (Sendee: TObject);
Var
i: integec;
Sum, Hin, CountP, Suml, Kol : integec;
begin
if СпескВохЗ.Checked Then Hin:=H[0] ;{Пусть минимальным элементом
будет первый элемент массива}
Edit3.Text:=11;
Edit4.Text:=11;
Edit5.Text:=11;
Edit6.Text:=11;
Sum:=0; Suml:=0;
CountP:=0; Kol:=0;
for i :=0 to N - l do
begin
if CheckBox1.Checked Then {Определить сумму всех элементов}
Sum:=Sum+H[i] ;
if CheckBox2.Checked Then {Определить количество положительных чисел}
if H[i]
>= 0 Then CountP:=CountP+l; if CheckBox3 . Checked Then
{Определить минимальный элемент массива.}
if Hin > M[i]
Then Hin:=H[i]; if CheckBox4.Checked Then {Определить
количество и сумму элементов
массива кратных 5} if
(H[i] mod 5 = 0)
and (H[i]<>0) Then begin
Sunil:=Sunil+H[i] ; Kol:=Kol+l; end;
end;
{Вывести результаты обработки массива}
if CheckBoxl.Checked Then Edit3.Text:=IntToStr(Sum);
if CheckBox2.Checked Then Edit4.Text:=IntToStr(CountP);
if CheckBox3.Checked Then E d i t s .Text:=IntToStr(Hin);
if CheckBox4 . Checked Then E d i t s . Text: =FloatTo5tr (Sutnl/Kol) ;
end;
end.
Сортировка выбором
Суть этого метода очень проста и может быть описана так:
1. В
последовательности
(наибольший) элемент;
2.
3.
из
n
элементов
выбирается
наименьший
Меняется местом с первым;
Далее процесс повторяется с оставшимися n-1 элементами, затем с оставшимися n2 элементами и т.д., до тех пор пока не останется один самый большой (маленький)
элемент.
Для реализации этого алгоритма необходимо использовать два вложенных цикла с
параметром For. Внешний цикл (по i) предназначен для последовательного
фиксирования элементов массива, внутренний (по j) -осуществляет поиск минимального
(максимального) и его позиции в неотсортированной части массива. После выхода из
внутреннего цикла следует перестановка элементов. Последний элемент во внешнем
цикле не рассматривается: он сам встанет на свое место.
Окно формы приложения
Программный код процедуры сортировки выбором
procedure iTorrnl. buttons И) Then
{Сортировка по возрастанию}
begin И := a[j]; fcjn : - it end; end;
P :■ a[i];
{Перестановка элементов}
a [ i ]
: = a [
k_rn] ; a[fc_m]
:■
p; End;
{Вывод элементов отсортированного массива} For
i:=0 to N-1 do Edit3.Text:=Edit3.Text+'
'+IntToStr(A[i] ) ; end;
Сортировка методом пузырька
Метод основан на сравнении соседних элементов. «Неправильно» расположенные по
отношению друг к другу элементы меняются местами. Во вложенных циклах поочередно
фиксируется пара соседних элементов массива. В результате первого прохода элемент с
минимальным значением оказывается в первой позиции массива (всплывает).
Фрагмент программного кода сортировки методом пузырька
For | := О То п - 2 do
For j
:= n-1 DownTo i+1 do
If a[j-l]
< a[j] Then
begin
p : = a[ j-1] ;
a[j-l]
:= a[j] ;■
a[j]
:= p; End;
Уплотнение массива
Уплотнение массива - это удаление из него элементов, отвечающих тем или иным
условиям. Образующиеся пустоты заполняются за счет сдвига всех оставшихся элементов.
Так как массив укорачивается, при обработке массива необходимо использовать не цикл с
параметром, а цикл с условием.
Пример. Удалить из сформированного массива числа, кратные трем.
Фрагмент программного кода уплотнения массива
Обратите внимание: на место удаленного i-го элемента переписывается ый элемент, на
место i+1-го элемента переписывается i+2-ой элемент и т.д.
i:=0;
while i<=N do
begin
if
[a[i] mod 3 О □)
then i:=i+l
{Цикл последовательного перебора имеющихся
в массиве элементов. Изначально их N штук}
or
(a[i]=0)
{Проверка кратности 3}
{Увеличение параметра цикла,
если элемент не кратен 3}
else
begin
{Цикл для удаление из массива элемента кратного 3,
т.е. на его место записывается значение элемента
с индексом
на его место следующего и т.д.}
for j:=i to N-1 do
a[j] :=a[j+l] ;
{Уменьшение на единицу количества элементов массива} N:=N-1;
end;
end;
{Конец цикла While}
Вставка элемента в массив
Вставка элемента в массив - задача обратная предыдущей. Прием используется тот же смещение группы элементов на одну позицию. Только при уплотнении сдвиг
производится влево, при вставке - вправо. При вставке возникает проблема, что делать с
последними элементами? Если в дальнейшей работе с массивом участвуют только
заявленные элементы, то «хвост» придется вытеснить, последние значения при этом будут
утрачены. Иначе, нужно создавать дополнительный массив, размерность которого будет
больше исходного на количество вставленных элементов. Выбор типа цикла для работы с
массивом зависит от конкретного случая.
Пример. В заданный упорядоченный по возрастанию массив вставить заданное число, не
нарушая его упорядоченности. Последний элемент вытеснить.
Можно использовать цикл с параметром, так как хвост вытеснению, и число
элементов в массиве остается неизменным
подлежит
Фрагмент программного кода
Изменение положения элементов массива на некотором отрезке
При решении задач такого типа очень важен контроль за границами диапазона изменения
индексов: они должны быть целыми, не выходить за пределы диапазона, кроме того,
нижняя граница диапазона должна быть меньше верхней.
Пример. В одномерном массиве, состоящем из n элементов, изменить порядок следования
значений элементов на обратный от позиции n1 до позиции n2 (n10 then sdvig:=k:
{Формирование переменной sdvig;}
else sdvig:=п+к;
{Дополнение до положительного значения}
for i:=l to sdvig do begin
trap: =a[n-l] ; for j:=n-2
downto 0 do a[j+l] :=a[j] ;
a[0] : =tinp; end;
{for
1} end; {if}
{Кольцевое смешение осуществляется} {на
1 позицию sdvig; раз}
{Смещение начинается с последнего элемента,}
{который помещают во вспомогательную переменную}
{tiap, чтобы его значение не потерялось, } {откуда
извлекают и отправляют в первую позицию} {после
выхода из внутреннего цикла}
Ошибки при использовании массивов
При использовании массивов наиболее распространенной ошибкой является выход
значения индексного выражения за допустимые границы, указанные при
объявлении массива.
Если в качестве индекса используется константа, и ее значение выходит за
допустимые границы, то такая ошибка обнаруживается на этапе компиляции.
Например:
Если при обращении к элементу массива в качестве индекса используется
переменная или выражение, то возможно возникновение ошибки времени
выполнения программы.
В программы, в которых возможны ошибки времени выполнения вследствие
неправильного ввода исходных данных, следует добавлять инструкции проверки
вводимых данных. Например так:
var
temper: array[1..12,1..31]
of real;
month,day: integer; t: real; begin
day:=strtoint(editl.Text
) ;
month:=strtoint(edit2.Te
xt) ;
t:=strtofloat(edit3.Text
); if
(day > 3 1)
or
(day <1) or
(month > 12)
or
(month < 1) then
1
ShowHessage
( Неверные данные 1 )
else temper[month,day]:=t;
edit4.Text:=floattostr(temper[month,day]);
end;