По первому тесту выполнил дважды задания. Результат получается правильный (проверял калькулятором). Пишет, что "Задание не проверено" и предлагает повторить. |
Использование языка Free Pascal для обработки массивов
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.
Выполнение любой другой операции над массивом надо организовывать поэлементно, для чего необходимо организовать цикл, в котором последовательно обрабатывать элементы массива; сначала обрабатываем первый элемент массива, затем второй, третий,..., -й (см. рис. 5.1—5.2). Для обработки элементов массива удобно использовать цикл for..do.
5.4 Ввод-вывод элементов массива
Язык Free Pascal не имеет специальных средств ввода-вывода всего массива, поэтому данную операцию следует организовывать поэлементно. При вводе массива необходимо последовательно вводить 1-й, 2-й и 3-й и т. д. элементы массива, аналогичным образом поступить и при выводе. Следовательно, как для ввода, так и для вывода необходимо организовать стандартный цикл обработки массива (см. рис. 5.3—5.4). Для обращения к элементу массива необходимо указать имя массива и в квадратных скобках номер элемента, например X[5], b[2] и т. д.
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. Обратите внимание, что между числами в данном варианте отсутствует пробел.
//Вариант 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.
//Вариант 6 for i :=1 to n do writeln ( ’ a ( ’, i, ’ )= ’, a [ i ] : 6 : 2 );
Результат шестого варианта вывода массива на экран представлен на рисунке 5.10.
Свойство | Name1 | Text | Height | Left | Top | Width | ReadOnly |
---|---|---|---|---|---|---|---|
Значение | Edit1 | ’ ’ | 23 | 103 | 184 | 492 | True |
Свойство | 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.4—5.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.13).
После корректного ввода размера массива, последовательно будут появляться диалоговые окна для ввода очередного элемента, подобные представленному на рис. 5.14.
Для вывода массива с помощью диалогового окна можно применить функцию MessageDlg:
for i := 1 to n do MessageDlg ( ’X[ ’+IntToStr ( i )+ ’ ]= ’+FloatToStr (X[ i ] ), MtInformation, [mbOk], 0 )
которая будет открывать отдельное окно для каждого элемента (см. рис. 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.
Свойство | Описание |
---|---|
Name | Имя компонента |
ColCount | Количество столбцов таблицы |
RowCount | Количество строк таблицы |
Cells | Двумерный массив, в котором хранится содержимое таблицы. Ячейка таблицы, находящаяся на пересечении столбца номер col и строки номер row, определяется элементом Cells [col,row], строки в компоненте нумеруется от 0 до RowCount-1, столбцы от 0 до ColCount-1 |
FixedCols | Количество зафиксированных слева столбцов таблицы, которые выделяются цветом и при горизонтальной прокрутке таблицы остаются на месте |
FixedRows | Количество зафиксированных сверху строк таблицы, которые выделяются цветом и при вертикальной прокрутке таблицы остаются на месте |
ScrollBars | Параметр определяет наличие полос прокрутки, возможны следующие значения параметра:
|
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.
Свойство | 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.4 были рассмотрены различные способы ввода-вывода как в консольных, так и в визуальных приложениях. В дальнейшем мы будем использовать те из них, которые удобнее при решении конкретной задачи.
Теперь перейдём к рассмотрению основных алгоритмов обработки одномерных массивов, многие из которых аналогичны соответствующим алгоритмам обработки последовательностей (вычисление суммы, произведения, поиск элементов по определённому признаку, выборки и т. д.). Отличие заключается в том, что в массиве одновременно доступны все его компоненты, поэтому с массивами становятся возможны более сложные действия (например сортировка элементов массива, удаление и вставка элементов и т. д.).