Работа с массивами в Delphi

Очень был удивлен когда к нам поступила просьба рассказать о массивах и о их сортировке в Delphi. Но раз уж поступила просьба, а сайт наш призван помочь в освоении Delphi, то я решил написать эту статью, в которой расскажу Вам о возможных действиях с массивами в Delphi. При этом мы напишем несколько пользовательских функций, которые будут помогать нам в дальнейшем при работе с массивами.

Ввод массива
Для того чтобы работать с массивом, его надо с начала получить от пользователя. Попробуем осуществить ввод одномерного массива всего в одно поле редактирования. Каждый элемент массива будет отделяться от предыдущего разделителем. После щелчка на кнопке программа выделит из строки, содержащей массив, первую подстроку, затем выделит вторую подстроку и т.д.

Давайте сейчас этим и займемся. Поставьте на Вашу форму кнопку Button и пооле редактирования Edit.

Заголовок нашей функции будет такой:


function GetSubStr(st:string; expl:string; n:integer):string;  

где

st - строка, содержащая массив
expl - строка разделитель
n - номер подстроки


function TForm1.GetSubStr(st:string; expl:string ;n:integer):string;  
Var p,i:integer;  
Begin  
for i:= 1 to n-1 do  
begin  
p:=pos(expl,st);  
st:=copy(st,p+1,Length(st)-p);  
while (pos(expl,st)=1) and (length(st)>0) do  
delete(st,1,1);  
end;  
p:=pos(expl,st);  
if p<>0 then result:=copy(st,1,p-1)  
else result:=st;  
End;  

Для получения n-ой подстроки (элемента массива) из полученной в качестве аргумента строки функция сначала удаляет предшествующую ей n-1 подстроку (цикл for), затем находит разделитель, который обозначает конец нужной подстроки, выделяет подстроку и возвращает ее в качестве значения функции (через свое имя).

Не забудьте добавить заголовок нашей функции в раздел Public модуля программы.

Теперь для проверки работы нашей функции напишем обработчик события OnClick, для нашей кнопки. В начале мы с помощью нашей функции получим массив из Edit1, а потом выведем его:


procedure TForm1.Button1Click(Sender: TObject);  
var i:integer;  
a:array[1..10] of string[10];  
st:string;  
begin  
for i:=1 to 10 do  
a[i]:=GetSubStr(Edit1.text,' ',i);//используем пробел в качестве разделителя  
  
for i:=1 to 10 do  
st:=st+IntTostr(i)+' '+a[i]+#13;  
ShowMessage(st);  
end;  

Поиск минимального (максимального) элемента массива
Будем искать минимальный элемент в целочисленном массиве. Для этого немного изменим обработчик события OnClick для кнопки:


procedure TForm1.Button1Click(Sender: TObject);  
var i:integer;//номер элемента, сравниваемого с минимальным  
a:array[1..10] of integer;   
min:integer;//номер минимального элемента  
  
begin  
//Введем массив  
for i:=1 to 10 do  
//Преобразуем полученные подстроки в числа  
a[i]:=StrToInt(GetSubStr(Edit1.text,' ',i));//используем пробел в качестве разделителя  
//Найдем минимальный элемент  
min:=1; //пусть номер минимального элемента = 1  
for i:= 2 to 10 do // начнем искать со следующего   
if a[i] < a[min] then min:=i;  
Form1.caption:=IntToStr(a[min]); // выводим в заголовок формы минимальный элемент  
end;  

В этом примере a
 минимальный элемент массива, а min - номер минимального элемента. Алгоритм очень простой: сравниваем каждый следующий элемент с минимальным, если он меньше минимального, то запоминаем его номер в переменной min, и продолжаем сравнивать уже с ним. 

Чтобы найти максимальный элемент, нужно изменить всего одну строку:


[DELPHI]>>> if a[i] < a[min] then min:=i;  

Надо заменить на:


if a[i] > a[min] then min:=i;  

Только теперь a
 - максимальный элемент, а min  - номер максимального элемента.

Поиск заданного элемента в массиве
Поступим методом простого перебора. Для этого будем перебирать все элементы массива, пока не встретим искомый элемент, или пока не дойдем до конца массива.

Элемент, совпадение с которым нам надо найти будем хранить в текстовом поле Edit2. Обработчик события OnClick нашей кнопки будет иметь такой вид:


[DELPHI]procedure TForm1.Button1Click(Sender: TObject);  
var i:integer;  
a:array[1..10] of integer;  
n:integer;//образец  
found:boolean;  
  
begin  
//Введем массив  
for i:=1 to 10 do  
//Преобразуем полученные подстроки в числа  
a[i]:=StrToInt(GetSubStr(Edit1.text,' ',i));//используем пробел в качестве разделителя  
  
  
n:=StrToInt(Edit2.text);  
found:=false;  
i:=1;  
REPEAT  
if a[i] = n then found:=true  
else i:=i+1;  
UNTIL (i > 10) or (found = true);  
if found then showmessage('Совпадение с элементом номер '+IntToStr(i));  
end;  

Сортировка массива
Вот мы и дошли до самого интересного - до сортировки массива. Рассмотрим алгоритм т.н. прямого выбора. Смысл его заключается в следующем:

Просматривая массив от первого элемента, найдем минимальный элемент и поместим его на место первого элемента, а первый элемент - на место минимального.

Затем будем просматривать массив, начиная со второго элемента, и далее поступим, как поступили перед этим шагом.

Алгоритм ясен, теперь приступим к написанию кода. Все тот же обработчик события OnClick принимает теперь такой вид:


procedure TForm1.Button1Click(Sender: TObject);  
var i,k,j,min:integer;  
buf:integer; // буфер для обмена  
a:array[1..10] of integer;  
st:string;  
begin  
//введем массив  
for i:=1 to 10 do  
a[i]:=StrToInt(GetSubStr(Edit1.text,' ',i));//используем пробел в качестве разделителя  
  
for i:=1 to 10 - 1 do // кол-во элементов минус один  
begin  
//поищем минимальный элемент  
min:=i;  
for j:=i+1 to 10 do  
if a[j] < a[min] then min:=j;  
//поменяем местами  
buf:=a[i];  
a[i]:=a[min];  
a[min]:=buf;  
end;  
  
for k:=1 to 10 do  
Form1.Caption:=Form1.caption + ' '+ IntToStr(a[k]);  
end;  

Ну вот мы и познакомились с самыми типичными действиями с массивами. Надеюсь эта статья оказалась Вам хоть немного полезной :)

Автор: Михаил Христосенко
Теги:
массив
Добавлено: 07 Августа 2018 21:28:08 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...