Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
delfi__Osnovy_programmirovania.doc
Скачиваний:
279
Добавлен:
12.04.2015
Размер:
8.98 Mб
Скачать

6. Программирование с использованием двумерных массивов в системе Delphi

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

Понятие о массиве

Массив– это структурированный тип данных, состоящий из фиксированного числа упорядоченных по индексу элементов, имеющих один и тот же тип.

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

Пример

const n=3; m=5;

type

vec = array [0..m-1] of integer;

mas = array [0..n-1] of vec;

var

massiv:mas;

В данном примере объявлен двумерный массив massiv.Massivпредставляет матрицу, состоящую из 3 строк и 5 столбцов.

Возможны и другие способы описания двумерных массивов:

var

massiv : array [1..3,1..5] of integer;

Так же, как и одномерные массивы, двумерные массивы можно описывать как типизированные константы:

соnst

massiv : array [1..2,1..3] of integer = ((5,8,1),(3,1,9));

Двумерные массивы объявляются так же, как и одномерные, за исключением того, что в квадратных скобках после зарезервированного слова arrayстоят два разделенных запятыми определения индексов, относящихся к двум размерностям массива. Каждое определение индекса независимо одно от другого. Индексы могут быть порядкового типа. Типы первого и второго индексов могут различаться.

По такому же принципу можно объявить не только двумерные, но и многомерные массивы. Размерность массивов ограничивает только объем памяти конкретной ЭВМ.

Пример описания трехмерных массивов aиb

type

vec = array [1..3] of integer;

mas = array [1..5] of vec;

tmas = array [1..8] of mas;

var

a: tmas;

b: array [1..3,1..5,1..8] of integer;

Над многомерными массивами как единым целым можно выполнить три действия: операции отношения =, < >; оператор присваивания. Эти действия выполняются аналогично, как и с одномерными массивами.

В многомерных массивах последний индекс возрастает первым, например:

var

A: array [1..2,1..3] of real;

A[1,1]

A[1,2]

A[1,3]

A[2,1]

A[2,2]

A[2,3]

Первый индекс обозначает номер строки в матрице, второй индекс – номер столбца. Например, запись А[2,3] делает доступным для обработки значение элемента, находящегося во второй строке третьего столбца массива А.

Для работы с двумерными массивами обычно используются вложенные циклы. Часто применяется структура алгоритма вложенных циклов со счетчиками (рис. 6.1).

Рис. 6.1. Схема алгоритма вложенных циклов

Обнуление элементов двумерного массива можно выполнить, используя вложенные операторы for:

for K:=1 to 3 do

for L:=1 to 5 do

A[K,L]:=0;

Ввод значений элементов двумерного массива с клавиатуры и вывод на форму приложения можно осуществить с помощью компоненты TStringGridстраницыAdditional, предназначенной для создания таблиц, в ячейках которых располагаются произвольные текстовые строки. С помощью компонентыEdit, представляющей собой однострочный редактор текста, можно вводить и (или) отображать длинные текстовые строки на форме приложения.

Пример

{i– номер столбца;j– номер строки таблицыStringGrid1.}

Edit1.text:=StringGrid1.Cells[i,j];

После выполнения этого оператора присваивания в поле Edit1.Textбудет содержаться текст из ячейки таблицыStringGrid1.

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

Описание двумерного динамического массива целых чисел:

var

mas: array of array of integer;

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

SetLength(mas,n1,n2);

Параметрами этой процедуры являются: mas– имя массива;n1 – количество строк;n2 – количество столбцов.

Нумерация элементов динамического массива начинается с нуля.

Пример.Обнулить элементы динамического двумерного массива, имеющего 5 строк и 5 столбцов:

var mas: array of array of real;

i,j: integer;

begin

SetLength(mas,5,5);

for i:=0 to 4 do

for j:=0 to 4 do

mas[i,j]:=0;

end;

Пример программирования с использованием двумерного массива

Задание. Подсчитать сумму всех элементов в двумерном массиве А [4,5].

1. Разработка алгоритма (рис. 6.2):

а) входные данные: A – массив, состоящий из вещественных чисел;

б) выходные данные: sum– вещественная переменная, сумма всех элементов массива;

в) промежуточные данные: i, j– счетчики циклов.

При вычислении суммы элементов массива в начале алгоритма переменную, хранящую сумму, необходимо обнулить.

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

Рис.6.2. Схема алгоритма вычисления суммы элементов массива

2. Разработка формы (рис. 6.3, табл. 6.1):

Рис.6.3. Внешний вид формы

Таблица 6.1

Используемые компоненты

Имя компонента

Страница палитры компонент

Настраиваемые свойства

Значение

1. Form1

Caption

Лабораторная работа №6

2. Label1

Standard

Caption

Введите элементы матрицы

3. Label2

Standard

Caption

Сумма элементов равна

4. Label3

Standard

Caption

5. Button1

Standard

Caption

Рассчет

6. StringGrid1

Additional

FixedCols

0

RowCount

4

FixedRows

0

Options

[goEditing, goTabs]

3. Текст программы:

unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Label1: TLabel;

Button1: TButton;

Label2: TLabel;

Label3: TLabel;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

const m=4; n=5;

type

mas=array [0..m-1,0..n-1] of real;

var

i,j:integer;

a:mas; sum:real;

begin

//ввод массива

for i:=0 to m–1 do

for j:=0 to n–1 do

a[i,j]:=StrToFloat(StringGrid1.Cells[j,i]);

sum:=0;

for i:=0 to m-1 do

for j:=0 to n-1 do

sum:=sum+a[i,j];

//вывод результата

Label3.Caption:=FloatToStr(sum);

end;

end.

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