Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:
реклама
Вызов лора на дом цена.

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

Автор: Михаил Христосенко Источник: «Development и Дельфи»

Очень был удивлен когда к нам поступила просьба рассказать о массивах и о их сортировке в 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;

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
94K
03 августа 2014 года
Антон Белов
0 / / 03.08.2014
+4 / -2
Мне нравитсяМне не нравится
3 августа 2014, 23:52:18
Устарело.
В Delphi 2009+ в модуле Generics.Collections есть классы реализующая функционал поиска в массивах, сортировки, копирования массива.

TArray
TMoveArrayManager<T>
2.
67K
27 декабря 2010 года
nika123
0 / / 27.12.2010
+7 / -7
Мне нравитсяМне не нравится
27 декабря 2010, 22:54:25
точнее так ошибка " undeclared identifier 'GetSubSrt' "
3.
67K
27 декабря 2010 года
nika123
0 / / 27.12.2010
+7 / -5
Мне нравитсяМне не нравится
27 декабря 2010, 22:51:58
Добрый вечер, подскажите пожалуйста,
по поиску мин значения
вот я скопировала всю эту программку
дэльфи выдаёт ошибку такую
undeclaret idintifier 'GetSubSrt'
что это за GetSubSrt такой и куда его добавить чтоб его дэльфи читал??
подскажите пожалуйста(
а если можно мне к завтра осталось 2 задачи решить к экзамену
ни как в массивы не врублюсь(
№ 5.3. Дан массив действительных чисел. Найти сумму квадратов
элементов массива.
и
№5.8. Дан массив действительных чисел. Найти наименьший из
элементов массива с четными номерами.
ЗАранее спасибо, хотя бы про GetSubStr подскажите(
4.
66K
28 ноября 2010 года
exqvayer
0 / / 28.11.2010
+3 / -6
Мне нравитсяМне не нравится
28 ноября 2010, 15:29:58
подскажите пожалуйста как сделать чтоб в массив можно было записывать данные разных типов!например и числа и буквы!Спасибо заранее!
5.
66K
19 ноября 2010 года
Юльчан
0 / / 19.11.2010
+1 / -5
Мне нравитсяМне не нравится
19 ноября 2010, 22:06:53
помогите пожалуста решить задачу
дан целочисленный массив размера N.Преобразовать его прибавив к четным числам первый элемент.первый и последний элементы массива не изменять
6.
64K
14 октября 2010 года
Артём Сергеевич
0 / / 14.10.2010
+3 / -5
Мне нравитсяМне не нравится
14 октября 2010, 16:47:27
Пожалуйста, помогите написать програмку с одномерным массивом. Вот задача: Дан целочисленный массив размера N. Увеличить все четные числа, содержащиеся в массиве, на исходное значение первого четного числа. Если четные числа в массиве отсутствуют, то оставить массив без изменений. Заранее благодарю.
7.
42K
02 сентября 2008 года
La5erWind
0 / / 02.09.2008
+1 / -4
Мне нравитсяМне не нравится
2 сентября 2008, 15:40:05
в коде ниже, вместо

SetLength(myarr,Lemgth(myarr)+1);

нужно

SetLength(myarr,Length(myarr)+1);

опечатался..
8.
42K
02 сентября 2008 года
La5erWind
0 / / 02.09.2008
+1 / -4
Мне нравитсяМне не нравится
2 сентября 2008, 15:33:26
С динамическими все просто

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;
9.
23K
14 ноября 2006 года
Rustam17
0 / / 14.11.2006
+1 / -4
Мне нравитсяМне не нравится
14 ноября 2006, 19:31:45
Да мне всё понравилось круто. Вот только я не нашёл динамические массивы.
Ну а сайт сам по себе простинький но уместный прикольный я нашёл интересующую меня инфо.
10.
19K
08 июня 2006 года
amc
0 / / 08.06.2006
+0 / -9
Мне нравитсяМне не нравится
8 июня 2006, 20:12:57
Всё уже разобрался сам :)
11.
19K
08 июня 2006 года
amc
0 / / 08.06.2006
+1 / -6
Мне нравитсяМне не нравится
8 июня 2006, 17:51:15
Что-то я попробовал вроде как написанно но у меня ничего не получилось.
Выдает ошибки -
[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. Поиск минимального элемента массива."
12.
Аноним
+2 / -4
Мне нравитсяМне не нравится
4 декабря 2005, 11:13:27
если например массив сотоял из слобцов скажем 10X10. и нужно было сложить числа в виде пирамиды напрмер.
-----*-----
----**----
---***----
и так до **********
а потм на оборот по убыванию
-********-
--******--
---****---
13.
Аноним
+2 / -4
Мне нравитсяМне не нравится
19 августа 2005, 00:58:06
В принципе всё интересно, ну а гдеже динамические масивы?????
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог