Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_po_informatike_delphi+++++++.pdf
Скачиваний:
31
Добавлен:
29.02.2016
Размер:
872.19 Кб
Скачать

19

в теле цикла должно быть изменение величин, входящих в условие, иначе

может получиться “вечный цикл”. Пример (xk/k < a {поиск k}):

var

k : integer; x,a,p : real;

begin

a := StrToFloat(AEdit.Text); x := StrToFloat(XEdit.Text); k := 1;

p := x;

while p/k>=a do begin

p :=p*x; inc(k);

end;

KEdit.Text := IntToStr(k); end;

2.8 Одномерные массивы

Массив представляет собой фиксированное количество упорядоченных однотипных компонент, снабженных индексами. Формат определения массива:

<идентификатор1>[, <идентификатор2>…] : array [<тип индекса>] of <тип компонента>;

Компоненты массива могут быть любого типа, индексы могут быть любого порядкового типа и записываются в формате

<начальный индекс> … <конечный индекс>

В качестве начального и конечного индексов не могут использоваться переменные (но могут использоваться константы).

Для обращения к компоненту массива требуется указать идентификатор массива с указанием в квадратных скобках индекса компонента.

Все значения компонентов одного массива можно присвоить компонентам другого массива только в том случае, если эти два массива одного и того же типа.

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

Пример (для пояснения массив 3 7 2 8 1 4 9):

20

procedure TForm1.Button1Click(Sender: TObject); var

A,B : array[1..100] of integer; C : array[1..100] of integer;

n,i,j,k,TempA,MinA,MaxIndexA,SumA : integer; key : boolean;

const

D : array[1..10] of integer = (1,2,3,4,5,6,7,8,9,10); begin

n := AStringGrid.RowCount; for i := 1 to n do

A[i] := StrToInt(AStringGrid.Cells[0,i-1]);

B:= A; {Допустимо}

C:= A; {Недопустимо}

{Нахождение суммы элементов массива} SumA := 0;

for i := 1 to n do SumA := SumA+A[i];

SumEdit.Text := IntToStr(SumA); {Нахождение минимального элемента массива} MinA := A[1];

for i := 2 to n do if MinA>A[i] then

MinA := A[i];

MinEdit.Text := IntToStr(MinA);

{Нахождение индекса максимального элемента массива} MaxIndexA := 1;

for i := 2 to n do

if A[MaxIndexA]<A[i] then MaxIndexA := i;

MaxIndexEdit.Text := IntToStr(MaxIndexA);

{Нахождение минимального из положительных чисел массива} key := False;

for i := 1 to n do if A[i]>0 then

if not key then begin

MinA := A[i]; key := True;

end else

if MinA>A[i] then MinA := A[i];

if key then

MinPositiveEdit.Text := IntToStr(MinA) else

MinPositiveEdit.Text := 'Положительных элементов нет'; {Сортировка массива по возрастанию}

for i:= 1 to n-1 do begin

k := i;

for j := i+1 to n do if A[k]>A[j] then

21

k := j; TempA := A[i]; A[i] := A[k]; A[k] := TempA;

end;

for i := 1 to n do

SortUpSG.Cells[0,i-1] := IntToStr(A[i]); {Сортировка массива по убыванию}

i := 1; while i<n do

if A[i]<A[i+1] then begin

TempA := A[i];

A[i] := A[i+1];

A[i+1] := TempA; if i>1 then

dec(i) else

inc(i);

end else

inc(i);

for i := 1 to n do

SortDownSG.Cells[0,i-1] := IntToStr(A[i]);

end;

2.9 Многомерные массивы

Многомерные массивы отличаются от одномерных заданием нескольких типов индексов вместо одного, например:

A : array[1..2,1..10,1..5] of integer;

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

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

Пример 1 (нахождение минимального элемента массива, подсчет сумм элементов массива по строкам и столбцам, вывод в табличной форме):

procedure TForm1.Button1Click(Sender: TObject); var

A : array[1..10,1..10] of integer; n,m,i,j,MinA : integer;

C : array[1..3,1..3] of integer = ((1,2,3),(4,5,6),(7,8,9)); begin

n := AStringGrid.RowCount;

22

m := AStringGrid.ColCount;

for i

:= 1

to

n

do

for

j :=

1 to

m do

A[i,j]

:=

StrToInt(AStringGrid.Cells[j-1, i-1]);

{Нахождение минимального элемента массива}

MinA := A[1,1];

 

for i := 1

to

n do {Обратить внимание на начало с 1 а не с 2}

for

j :=

1 to

m do

if MinA>A[i,j] then

 

MinA :=

A[i,j];

MinEdit.Text :=

IntToStr(MinA);

{Подсчет сумм

элементов по строкам}

for i := 1

to

n do

begin

 

 

0;

 

A[i,m+1] :=

m do

for

j :=

1 to

A[i,m+1] :=

A[i,m+1]+A[i,j];

end;

 

 

элементов по столбцам}

{Подсчет сумм

for j

:= 1

to

m+1 do

begin

 

 

0;

 

A[n+1,j] :=

n do

for

i :=

1 to

A[n+1,j] :=

A[n+1,j]+A[i,j];

end;

:= 1

to

n+1 do

for i

for

j :=

1 to

m+1 do

ResStringGrid.Cells[j-1,i-1] := IntToStr(A[i,j]);

end;

Пример 2 (нахождение наиболее близко расположенных городов, заданных своими координатами):

procedure TForm1.Button1Click(Sender: TObject); var

A : array[1..100,1..2] of integer; n,i,j,n1,n2 : integer;

MinA,Temp : real; begin

n := AStringGrid.RowCount; for i := 1 to n do

for j := 1 to 2 do

A[i,j] := StrToInt(AStringGrid.Cells[j-1,i-1]); n1 := 1;

n2 := 2;

MinA := sqrt(sqr(A[n1,1]-A[n2,1])+sqr(A[n1,2]-A[n2,2])); for i := 1 to n-1 do

for j := i+1 to n do begin

Temp := sqrt(sqr(A[i,1]-A[j,1])+sqr(A[i,2]-A[j,2])); if MinA>Temp then

begin

MinA := Temp;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]