Опубликован: 10.04.2015 | Уровень: для всех | Доступ: свободно | ВУЗ: Компания ALT Linux
Лекция 5:

Использование языка Free Pascal для обработки массивов

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

5.3 Операции над массивами

Для работы с массивом как с единым целым надо использовать имя массива (без указания индекса в квадратных скобках). Для доступа к элементу массива необходимо указать имя массива и в квадратных скобках порядковый номер элемента массива, например x[1], y[5], c[25], А[8].

В языке Free Pascal определена операция присваивания для массивов, идентичных по структуре (с одинаковыми типами индексов и компонентов).

Например, если массивы C и D описаны как

var C,D: array [ 0.. 30 ] of real;

то можно записать оператор

C:=D;

Такая операция сразу всем элементам массива C присвоит значения соответствующих им по номерам элементов массива D.

Выполнение любой другой операции над массивом надо организовывать поэлементно, для чего необходимо организовать цикл, в котором последовательно обрабатывать элементы массива; сначала обрабатываем первый элемент массива, затем второй, третий,..., n-й (см. рис. 5.15.2). Для обработки элементов массива удобно использовать цикл for..do.

5.4 Ввод-вывод элементов массива

Язык Free Pascal не имеет специальных средств ввода-вывода всего массива, поэтому данную операцию следует организовывать поэлементно. При вводе массива необходимо последовательно вводить 1-й, 2-й и 3-й и т. д. элементы массива, аналогичным образом поступить и при выводе. Следовательно, как для ввода, так и для вывода необходимо организовать стандартный цикл обработки массива (см. рис. 5.35.4). Для обращения к элементу массива необходимо указать имя массива и в квадратных скобках номер элемента, например X[5], b[2] и т. д.

Блок-схема обработки элементов массива с использованием цикла с предусловием

Рис. 5.1. Блок-схема обработки элементов массива с использованием цикла с предусловием
Блок-схема обработки элементов массива с использованием цикла for

Рис. 5.2. Блок-схема обработки элементов массива с использованием цикла for
Алгоритм ввода массива X с использованием цикла с предусловием

Рис. 5.3. Алгоритм ввода массива X с использованием цикла с предусловием
Алгоритм ввода массива X с использованием блока модификации

Рис. 5.4. Алгоритм ввода массива X с использованием блока модификации

5.4.1 Организация ввода-вывода в консольных приложениях

Рассмотрим реализацию этих алгоритмов в консольных приложениях.

//Ввод элементов массива X с помощью цикла while.
var x : array [ 1.. 100 ] of real;
i, n : integer;
begin
writeln ( ’введите размер массива ’ );
readln (N);
i : = 1;
while ( i<=N) do
begin
	write ( ’ x ( ’, i, ’ )= ’ ); readln ( x [ i ] );
i := i +1
end; end;
//Ввод элементов массива X с помощью цикла for.
var
x : array [ 1.. 1 0 0 ] of real;
i, n : integer;
begin
readln (N);
for i :=1 to N do
begin
	write ( ’ x ( ’, i, ’ )= ’ ); readln ( x [ i ] ) }
end;
end.

Цикл for..do удобнее использовать для обработки всего массива, и в дальнейшем при выполнении подобных операций с массивами мы будем применять именно его.

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

Предлагаем читателю рассмотреть несколько вариантов вывода массива вещественных чисел a=(1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8), самостоятельно разобраться, чем они отличаются друг от друга, и решить, какой из вариантов удобнее в конкретной задаче.

//Вариант 1
for i : = 1 to n do write ( a [ i ] : 3 : 1 );

Результат первого варианта вывода массива на экран представлен на рисунке 5.5. Обратите внимание, что между числами в данном варианте отсутствует пробел.

Результат первого варианта вывода массива

Рис. 5.5. Результат первого варианта вывода массива
Результат второго варианта вывода массива

Рис. 5.6. Результат второго варианта вывода массива
Результат третьего варианта вывода массива

Рис. 5.7. Результат третьего варианта вывода массива
//Вариант 2
for i : = 1 to n do write ( a [ i ] : 6 : 2 );

Результат второго варианта вывода массива на экран представлен на рисунке 5.6.

//Вариант 3
for i : = 1 to n do write ( a [ i ] : 3 : 1, ’   ’ );

Результат третьего варианта вывода массива на экран представлен на рисунке 5.7.

//Вариант 4
writeln ( ’массив A ’ );
for i :=1 to n do
writeln ( a [ i ] : 6 : 2 );

Результат четвёртого варианта вывода массива на экран представлен на рисунке 5.8.

//Вариант 5
for i :=1 to n do write ( ’ a ( ’, i, ’ )= ’, a [ i ] : 3 : 1, ’   ’ ); }

Результат пятого варианта вывода массива на экран представлен на рисунке 5.9.

Результат четвёртого варианта вывода массива

Рис. 5.8. Результат четвёртого варианта вывода массива
Результат пятого варианта вывода массива

Рис. 5.9. Результат пятого варианта вывода массива
Результат шестого варианта вывода массива

Рис. 5.10. Результат шестого варианта вывода массива
//Вариант 6
for i :=1 to n do writeln ( ’ a ( ’, i, ’ )=  ’, a [ i ] : 6 : 2 );

Результат шестого варианта вывода массива на экран представлен на рисунке 5.10.

Форма для задачи вывода массива вещественных чисел

увеличить изображение
Рис. 5.11. Форма для задачи вывода массива вещественных чисел
Таблица 5.4. Свойства компонента Edit1
Свойство Name1 Text Height Left Top Width ReadOnly
Значение Edit1 ’ ’ 23 103 184 492 True
Таблица 5.5. Свойства компонента Button1
Свойство Name1 Caption Height Left Top Width
Значение label1 Button1 25 177 392 239

5.4.2 Организация ввода-вывода в визуальных приложениях

Рассмотрим возможности организации ввода-вывода массивов в визуальных приложениях, для вывода массивов можно использовать стандартный компонент типа TEdit.

Рассмотрим эти возможности на примере стандартной задачи вывода массива вещественных чисел a=(1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8).

Расположим на форме кнопку (компонент типа TButton) и компонент типа TEdit (см. рис. 5.11).

В табл. 5.45.5 приведены свойства компонентов типа TButton и TEdit.

Наше приложение по щелчку по кнопке Вывод массива будет выводить массив a в поле ввода Edit1. Алгоритм вывода массива заключается в следующем: каждое число переводится в строку с помощью функции FloatToStr, после чего полученная строка добавляется к полю вывода. Текст обработчика события Button1Click с комментариями приведен ниже.

procedure TForm1. Button1Click ( Sender : TObject );
var
//Исходный массив a.
a : array [ 1.. 8 ] of real = ( 1. 1, 2. 2, 3. 3, 4. 4, 5. 5, 6. 6, 7. 7, 8. 8 );
	i : integer;
//В переменной n хранится количество элементов в массиве
//вещественных чисел.
	n : integer =8;
	S : string= ’ ’;
begin
	Edit1. Text := ’ ’;
//Цикл for для последовательной обработки всех элементов
//массива a.
	for i :=1 to n do
//Добавление в поле ввода Edit1 строки, которая получена из
//элемента массива a[i].
	Edit1. Text := Edit1. Text+FloatToStr ( a [ i ])+ ’   ’;
end;

После щелчка по кнопке Вывод массива окно приложения станет подобным тому, которое представлено на рис. 5.12.

Для ввода массивов в Lazarus в простейшем случае можно воспользоваться функцией InputBox. В качестве примера рассмотрим проект, в котором будет осуществляться ввод массива при щелчке по кнопке. На форме расположим единственную кнопку. Текст обработчик события Button1Click с комментариями приведен ниже.

procedure TForm1. Button1Click ( Sender : TObject );
var i, n : byte; X: array [ 1.. 20 ] of real;
begin
//Количество элементов массива.
n:= StrToInt ( InputBox ( ’Ввод элементов массива ’, ’ n= ’, ’ 7 ’ ) );
for i := 1 to n do //Поэлементный ввод.
//Ввод очередного элемента массива.
X[ i ] : = StrToFloat ( InputBox ( ’Ввод элементов массива ’,
’Введите  ’+IntToStr ( i )+ ’элемент ’, ’ 0,00 ’ ) );
end;
Вывод массива в поле ввода

увеличить изображение
Рис. 5.12. Вывод массива в поле ввода
Ввод размера массива

Рис. 5.13. Ввод размера массива
Ввод второго элемента массива

Рис. 5.14. Ввод второго элемента массива

При щелчке по кнопке на экране появится окно для ввода размера массива (см. рис. 5.13).

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

Для вывода массива с помощью диалогового окна можно применить функцию MessageDlg:

for i := 1 to n do
MessageDlg ( ’X[ ’+IntToStr ( i )+ ’ ]= ’+FloatToStr (X[ i ] ),
MtInformation, [mbOk], 0 )

которая будет открывать отдельное окно для каждого элемента (см. рис. 5.15).

Вывод третьего элемента массива

Рис. 5.15. Вывод третьего элемента массива

Чтобы у пользователя была возможность просматривать элементы массива одновременно, можно сформировать из них строку, а затем вывести её, например, на форму в виде метки или в окне сообщения:

var i, n : byte; X: array [ 1.. 2 0 ] of real; S : string;
begin
//В переменную строкового типа записывается пустая строка.
S:= ’ ’;
for i :=1 to n do
//Выполняется слияние элементов массива, преобразованных в
//строки, и символов пробела; результат - строка, в которой
//элементы массива перечислены через пробел.
S:=S+FloatToStrF (X[ i ], ffFixed,5,2)+ ’   ’;
//Полученную строку можно вывести в виде метки
Label2. Caption :=S; //Вывод строки на форму в виде метки.
//Аналогично строку можно вывести в виде сообщения, используя
//функцию MessageDlg(S,MtInformation,[mbOk],0);

Наиболее универсальным способом ввода-вывода как одномерных, так и двумерных массивов является компонент типа TStringGrid ("таблица строк"). Ознакомимся с этим компонентом подробнее.

На рис. 5.16 представлен проект формы, на которой расположен компонент типа TStringGrid1Компонент типа TStringGrid расположен на странице Additional. (таблица строк). Ячейки таблицы строк предназначены для чтения или редактирования данных. Этот компонент может служить как для ввода, так и для вывода массива.

Основные свойства этого компонента представлены в таблице 5.6.

Форма с компонентом "таблица"

увеличить изображение
Рис. 5.16. Форма с компонентом "таблица"
Таблица 5.6. Основные свойства компонента типа TStringGrid
Свойство Описание
Name Имя компонента
ColCount Количество столбцов таблицы
RowCount Количество строк таблицы
Cells Двумерный массив, в котором хранится содержимое таблицы. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row, определяется элементом Cells [col,row], строки в компоненте нумеруется от 0 до RowCount-1, столбцы от 0 до ColCount-1
FixedCols Количество зафиксированных слева столбцов таблицы, которые выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте
FixedRows Количество зафиксированных сверху строк таблицы, которые выделяются цветом и при вертикальной прокрутке таблицы остаются на месте
ScrollBars Параметр определяет наличие полос прокрутки, возможны следующие значения параметра:
  • ssNone — отсутствие полос прокрутки (в этом случае пользователь может перемещаться по таблице только с помощью курсора);
  • ssHorizontal, ssVertical или ssBoth — наличие горизонтальной, вертикальной или обеих полос прокрутки;
  • ssAutoHorizontal, ssAutoVertical или ssAutoBoth — появление горизонтальной, вертикальной или обеих полос прокрутки по мере необходимости
Options.goEditing Логическая переменная, которая определяет, может пользователь (True) или нет (False) редактировать содержимое ячеек таблицы
Options.goTab Логическая переменная, которая разрешает (True) или запрещает (False) использование клавиши Таb для перемещения курсора в следующую ячейку таблицы
DefaultColWidth Ширина колонок таблицы
DefaultRowHeight Высота строк таблицы
GridLineWidth Ширина разграничительных линий между ячейками таблицы
Left Расстояние от таблицы до левой границы формы
Top Расстояние от таблицы до верхней границы формы
DefaultColWidth Ширина столбцов таблицы
DefaultRowHeight Высота строк таблицы
Height Высота компонента типа TStringGrid
Width Ширина компонента типа TStringGrid
Font Шрифт, которым отображается содержимое ячеек таблицы

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

Разместим на форме две метки, два компонента типа TStringGrid и одну кнопку. Свойства компонентов StringGrid1 и StringGrid2 можно задать такими же, как показано в табл. 5.7.

Таблица 5.7. Основные свойства компонента типа TStringGrid
Свойство StringGrid1 StringGrid2 Описание
ColCount 8 8 Количество столбцов таблицы
RowCount 1 1 Количество строк таблицы
FixedCols 0 0 Количество зафиксированных слева столбцов таблицы
FixedRows 0 0 Количество зафиксированных сверху строк таблицы
Options.goEditing True False Логическая переменная, которая определяет возможность редактирования содержимого ячеек таблицы пользователем
Left 186 186 Расстояние от таблицы до левой границы формы
Top 72 216 Расстояние от таблицы до верхней границы формы
Height 24 24 Высота компонента
Width 518 518 Ширина компонента

Окно формы приложения ввода-вывода массива будет подобно представленному на рис. 5.17.

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

procedure TForm1. Button1Click ( Sender : TObject );
var n, i : integer; a : array [ 0.. 7 ] of real;
begin
for i :=0 to 7 do //Ввод массива.
//Из поля таблицы считывается элемент,
//преобразовывается в число и присваивается элементу массива.
a [ i ] : = StrToFloat ( StringGrid1.Cells [ i, 0 ] );
for i :=0 to 7 do //Вывод массива.
//Элемент массива преобразовывается в строку и помещается в
//поле таблицы.
StringGrid2.Cells [ i, 0 ] : = FloatToStrF ( a[7 - i ], ffFixed, 5, 2 );
end;
Окно формы задачи ввода-вывода массива

увеличить изображение
Рис. 5.17. Окно формы задачи ввода-вывода массива
Окно программы ввода-вывода массива

увеличить изображение
Рис. 5.18. Окно программы ввода-вывода массива

При запуске программы на выполнение появляется окно приложения, подобное представленному на рис. 5.17, пользователь вводит исходный массив, щёлкает по кнопке Выполнить, после чего окно приложения принимает вид, как на рис. 5.18.

В параграфе 5.4 были рассмотрены различные способы ввода-вывода как в консольных, так и в визуальных приложениях. В дальнейшем мы будем использовать те из них, которые удобнее при решении конкретной задачи.

Теперь перейдём к рассмотрению основных алгоритмов обработки одномерных массивов, многие из которых аналогичны соответствующим алгоритмам обработки последовательностей (вычисление суммы, произведения, поиск элементов по определённому признаку, выборки и т. д.). Отличие заключается в том, что в массиве одновременно доступны все его компоненты, поэтому с массивами становятся возможны более сложные действия (например сортировка элементов массива, удаление и вставка элементов и т. д.).

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >
Юрий Шутиков
Юрий Шутиков

По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. 
 

Евгений Силуков
Евгений Силуков

Еще в декабре выполнил тест №1, а его все так и не проверили.

Юрий Макушин
Юрий Макушин
Россия, Москва, РЭА им. Плеханова, 2004