Работа с массивами в 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 - номер минимального элемента. Алгоритм очень простой: сравниваем каждый следующий элемент с минимальным, если он меньше минимального, то запоминаем его номер в переменной min, и продолжаем сравнивать уже с ним.
Чтобы найти максимальный элемент, нужно изменить всего одну строку:
>>> if a[i] < a[min] then min:=i;
Надо заменить на:
if a[i] > a[min] then min:=i;
Только теперь a[min] - максимальный элемент, а min - номер максимального элемента.
Поиск заданного элемента в массиве
Поступим методом простого перебора. Для этого будем перебирать все элементы массива, пока не встретим искомый элемент, или пока не дойдем до конца массива.
Элемент, совпадение с которым нам надо найти будем хранить в текстовом поле Edit2. Обработчик события OnClick нашей кнопки будет иметь такой вид:
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;
Ну вот мы и познакомились с самыми типичными действиями с массивами. Надеюсь эта статья оказалась Вам хоть немного полезной :)
Оставить комментарий
Комментарии
В Delphi 2009+ в модуле Generics.Collections есть классы реализующая функционал поиска в массивах, сортировки, копирования массива.
TArray
TMoveArrayManager<T>
по поиску мин значения
вот я скопировала всю эту программку
дэльфи выдаёт ошибку такую
undeclaret idintifier 'GetSubSrt'
что это за GetSubSrt такой и куда его добавить чтоб его дэльфи читал??
подскажите пожалуйста(
а если можно мне к завтра осталось 2 задачи решить к экзамену
ни как в массивы не врублюсь(
№ 5.3. Дан массив действительных чисел. Найти сумму квадратов
элементов массива.
и
№5.8. Дан массив действительных чисел. Найти наименьший из
элементов массива с четными номерами.
ЗАранее спасибо, хотя бы про GetSubStr подскажите(
дан целочисленный массив размера N.Преобразовать его прибавив к четным числам первый элемент.первый и последний элементы массива не изменять
SetLength(myarr,Lemgth(myarr)+1);
нужно
SetLength(myarr,Length(myarr)+1);
опечатался..
var myarr:array of string;
procedure add;
begin
SetLength(myarr,Lemgth(myarr)+1);
myarr[Length(myarr)-1]:='Привет';
end;
procedure show(a:integer);
begin
if (a<Length(myarr))
showmessage(myarr[a]);
end;
Ну а сайт сам по себе простинький но уместный прикольный я нашёл интересующую меня инфо.
Выдает ошибки -
[Error] Unit1.pas(46): Statement expected but 'PROCEDURE' found
[Warning] Unit1.pas(57): Text after final 'END.' - ignored by compiler
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
и выделяет красным цветом строчку -
procedure TForm1.Button1Click(Sender: TObject);
Объясните пожалуйста что я не так делаю.
P.S. В Delfi работал только с базами данных, а в универе задали курсовую - "Разработка Windows приложения в среде Delphi. Поиск минимального элемента массива."
-----*-----
----**----
---***----
и так до **********
а потм на оборот по убыванию
-********-
--******--
---****---