Вторник, 28.01.2025, 23:06
AMAR Inc.
Приветствую Вас Гость | RSS
Главная Программирование Регистрация Вход
Меню сайта

Категории каталога
Разные статьи [48]
Система [62]

Главная » Статьи » 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;

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

Категория: Разные статьи | Добавил: amar-runyak (11.10.2007)
Просмотров: 3493 | Комментарии: 4 | Рейтинг: 5.0/3 |

Всего комментариев: 1
1 Алекс  
0
Ооооо... Темовая штука. Очень пригодиццо.

Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

Статистика

Copyright AMAR Inc. © 2025