Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу.docx
Скачиваний:
108
Добавлен:
24.02.2016
Размер:
2.8 Mб
Скачать

Лекция 7. Составление программ с использованием массивов

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

Математики для удобства записи различных операций часто использу­ют индексированные переменные: векторы, матрицы, тензоры. Так, вектор С представляется набором чисел c2r.., cn), называемых его компонентами, причем каждая компонента имеет свой номер, который принято обозначать в виде индекса. Матрица А - это таблица чисел (ац-, i=1,..m, j=1..n), где i -номер строки, j - номер столбца. Операции над матрицами и векторами обычно имеют короткую запись, которая обозначает определенные порой сложные действия над их индексными компонентами. Например, произведения двух векторов записывается как

n

c ■b= 2 сгьг

i=1

Произведение матрицы на вектор

ъ = a c, bi = 2 ац cj;

Произведение двух матриц

n k=1

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

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

Type <имя типа>=аггау[т..п] of <тип элементов>; Var b,c:<имя типа>;

Здесь m и п должны быть константами, b, c - массивы.

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

b[j]:=5; c[k]:=b[i]+c[j*2+k]; причем значение индексов не должно выходить за границы диапазона (m<j<n) указанного в описании. Чаще всего используются индексы целого типа, хотя возможны индексы порядкового типа (например, Char).

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

Const

C1:array[1..3] of real (1.5,6.8,7);

C2:array[1..2,1..3] of word ((1,2,3),(4,5,6));

type

vek=array[1..10] of real; mat1=array[-5..5] of vek; mat2=array[-5..5,1..10] of real; mas3=array[0..2] of mat2;

Var

a,z:vek; b:mat1; c:mat2; d:mas3;

Begin

a[i]:=0.2;

b[j,i]:=a[i]; c[j,i]:=5; d[kj,i]:=a[i]+b[j,i];

здесь 1< i <10, -5< j <5, 0< k <2.

Заметим, что массивы b и c имеют одинаковую структуру, хотя их типы вводятся по разному. Однотипные массивы (как целое) могут участвовать только в операциях отношения "рaвно", "не рaвно" и в операторе присваива­ния. Заметим, что из вышеприведенных однотипными являются а и z, масси­вы b и c не однотипные, хотя и имеют одинаковую структуру.

Например:

выражение ci=z возвратит значения true, если все элементы массивов а и z одинаковы и false в противном случае;

выражение a< >z возвращает значение true, если они отличаются хотя бы в одном элементе;

c:=z; всем элементам массива а присваиваются значения соответствую­щих элементов массива z.

7.2. Некоторые возможности ввода-вывода в Delphi

При вводе массивов с большим количеством элементов, обычно исход­ные данные (элементы) готовятся заранее с помощью текстового редактора в отдельном текстовом файле, и затем программа вводит их из этого файла. При необходимости изменить некоторые исходные элементы производят ре­дакцию текстового файла, после чего снова запускают программу. Проиллю­стрируем это на примере следующей задачи:

Ввести из файла и распечатать в виде таблицы в окно Memo двухмер­ный массив А размерности mxn.

Вначале с помощью встроенного текстового редактора подготовим файл исходных данных, например следующего вида:

4 5 значения m и n

0.1 0.2 0.8 1.2 5.6 - первая строка А

1.8 2.1 4.2 6.3 2.5 - вторая строка А

0.8 0.2 0.6 1.2 1.4 - третья строка А

4.1 7.3 5.8 3.2 1.5 - четвертая строка А

и запишем его под именем Prg.dat используя в меню File опцию Save as. Теперь фрагмент программы выглядит так

Type mat=array[1..10,1..10] of extended; Var a:mat;

Lr:TextFile;//описание текстового файла; St:String; begin

AssignFile(Lr,'Prg.dat'); Reset(Lr);

Readln(Lr,m,n);//чтение m и n из 1-й строки файла for i:=1 to m do begin st:='';

for j:=1 to n do begin

Read(Lr,a[i,j]); //чтение i-й строки

st:=st+FloatToStrF(a[i,j],fffixed,6,1);

end;

Readln(Lr);//перевод курсора на новую строку

файла

Memo1.Lines.Add(st);//Вывод строки в окно Memo end;

В Delphi имеется возможность более изящно организовать ввод/вывод двухмерных и одномерных массивов с отображением их на форме. Для этого используют специальный компонент TstringGrid (находится в меню Addi­tional), который предназначен для отображения информации в виде двухмер­ной (одномерной) таблицы, каждая ячейка которой представляет собой окно однострочного редактора (аналогично окну Tedit). После помещения этого компонента на форму в программе появляется возможность работать с двух­мерным массивом вида

TstringGrid1.Cells:array[0..ColCount-1,0..RowCount-1] of string;

Значения ColCount и RowCount, определяющие количество столбцов и строк в отображаемой таблице, задают с помощью инспектора объектов или вычисляют внутри программы. Каждый элемент массива Cells представляет собой строку текста, содержимое которой отображается в соответствующей ячейке на форме. Поэтому, если мы в ячейку на форме с помощью клавиату­ры наберем любой текст, он тут же помещается в ячейку Cells и наоборот, ес­ли в процессе работы программы элементу массива Cells [i, j] присвоить строку текста, то она отобразится в соответствующей ячейке на форме.

В результате задача о вводе вышеописанного массива А, и его вывода на форму после преобразований решается следующим образом:

m:=4; n:=5;

StringGrid1.ColCount:=n; StringGrid1.RowCount:=m;

Procedure Tform1.Button5Click(Sender:Tobject); Begin

for i:=1 to m do //Ввод матрицы из таблицы for j:=1 to n do //на форме в массив А a[i,j]:=StrToFloat(StringGrid1.Cells[j-1,i-1]); //используется преобразование текстовой //записи числа в его значение типа extended. // Некоторые действия с массивом А

for i:=1 to m doZ/Вывод массива А в таблицу на форме for j:=1 to n do

StriGrid1.Cells[j-1,i-1]:=FloatToStrF(a[i,j], fffixed,8,3);

// преобразование действительного числа в текст end;

Здесь в каждую ячейку будет выведено число с тремя десятичными зна­ками. Заметим, что в массиве Cells первый индекс соответствует номеру столбца в таблице отражаемой на форме, второй - номеру строки (нумерация строк и столбцов начинается с нуля), в массиве же А наоборот, первый ин­декс трактуется как номер строки, второй - номер столбца в соответствую­щей матрице.