| Тема 9. Табличные величины. Ввод и вывод табличных величин.
Существует много задач, в которых требуется обрабатывать значения достаточно большого количества переменных одного и того же типа.
Например, если надо составить программу для вычисления средней массы ста учеников 9-х классов,то очевидно нужно использовать 100 переменных типа real, значением каждой из которых будет масса соответствующего девятиклассника по данным ста учеников 9-х классов, найти сумму значений этих переменных и разделить ее на 100.
Если использовать 100 переменных типа real с произвольными именами, например,а, Ь, с, ..., z, аа, ab, ас ..., az, ba, bb, be, .... bz, ca, cb, cc, ..., cv, то команда нахождения суммы их значений будет содержать в правой части 100 слагаемых или нужно включить в текст программы такие 100 команд:
|
sum = а;
sum = sum + b;
sum = sum + с;
...
sum = sum + cv;
|
Заключение: Все это делает текст программы громоздким и неудобным
Кроме того количество учеников может быть: еще больше или вообще заранее неизвестным |
Для решения задач, в которых обрабатывается значения переменных одного типа, можно пойти таким путем:
- рассматривать все эти переменные как элементы некоторого упорядоченного набора переменных;
- этот набор переменных имеет имя, а имя каждой переменной набора состоит из имени набора и порядкового номера этой переменной в наборе.
Упорядоченный набор переменных одного типа называется массивом или табличной величиной.
- Каждая переменная, входящая в массив, называется элементом массива.
- Массив, в котором каждый элемент определяется только одним порядковым номером, называется одномерным (линейным).
- Имя элемента табличной величины состоит из имени этой табличной величины и порядкового номера этого элемента в табличной величине, который взят в квадратные скобки []
Так, для приведенного выше примера следует рассматривать табличную величину, состоящий из 100 элементов.
Если имя этой табличной величины а, то имена переменных - элементов этой табличной величины будут такие:
а [1], а [2], а [3], ..., а [100].
Каждая из этих переменных будет иметь тип real.
Тогда, чтобы найти сумму значений всех этих 100 переменных, достаточно записать следующие команды:
sum: = 0;
for i: = 1 to 100 do sum = sum + a [i];
Выполнение этого фрагмента программы будет происходить так:

В результате выполнения приведенного фрагмента программы значение переменной sum равна сумме значений всех 100 переменных - элементов табличной величины, то есть общей массе данных 100 учеников. После этого можно вычислить искомую среднюю массу.
В строке var переменная а типа табличная величина записывается так: var a: array [1..100] of real ; //англ. Array - массив, диапазон номеров элементов табличной величины от 1 до 100, тип элементов табличной величины
Описать переменную типа одномерный массив можно двумя способами: |
В разделе type интерфейсного блока программного кода описать новый тип данных, и в разделе var описать переменную нового типа:
- type <имя типа> = array [диапазон индексов] of <тип элементов>;
- var <список переменных> <имя типа>;
|
Описать переменную типа массива не вводя нового типа:
var <список переменных>: array [диапазон индексов] of <тип элементов>;
|
По этой записи:
- компилятор выделяет в памяти компьютера 100 участков под каждую из 100 переменных - элементов табличной величины;
- размер каждого участка зависит от типа элементов табличной величины.
Обращаем ваше внимание:
Иногда удобно нумеровать элементы табличной величины, начиная не с 1:
- в некоторых задачах (некоторые из них рассмотрим ниже) удобно нумеровать элементы табличной величины, начиная с 0, например, a: array [0..12] of real;
- в задаче, в которой используется ежегодная численность населения Украины в период с 1991 по 2017 год, удобно использовать табличную величину a: array [1991..2017] of integer;
Номер элемента табличной величины может задаваться как целым числом, так и значением выражения, результатом значений которого будут целые числа, например: а [2 * i - 5], где i - переменная типа integer.

Ввод и вывод табличных величин.
Замена значений всех элементов массива
Элементы массива могут принимать значения разными способами:
- присваиваться при объявлении массива,
- вводиться с клавиатуры,
- присваиваться при выполнении программы.
В визуальных приложениях среды Lazarus для формирования массивов, ввод значений его элементов с клавиатуры, а также вывода элементов чаще всего применяются :
 |
Основное предназначение компонента TMemo – работа с большим количеством строк (ввод, отображение и редактирование текстового материала).
Элементы массива Memo1.Lines имеют нумерацию от 0 до Memo1.Lines.Count - 1.
Среди свойств этого компонента много вам уже известных: Name, Color, Font, Enabled, Visible, Height, Width, Top, Left и другие.
Рассмотрим еще несколько свойств многострочного текстового поля:
Text - текст, находящийся в поле Memo, рассматривается как единое целое.
Lines - массив строк, соответствующий содержимому поля., доступ к строке осуществляется по номеру, строки нумеруются с нуля.
Lines.Count - количество строк текста в поле Memo.
WantReturns - клавиша для ввода конца строки: TRUE – клавиша ENTER; FALSE – сочетание клавиш CTRL + ENTER.
WordWrap - переход в начало следующей строки при вводе длинных строк: TRUE –производится автоматически; FALSE – не производиться, при включенной горизонтальной полосе прокрутке это свойство игнорируется.
ScrollBar - использование полосы прокрутки, если текст большой и не помещается в компоненте Memo:
ssNone – Нет полосы прокрутки;
ssHorizontal – Установлена горизонтальная прокрутка;
ssVertical – Установлена вертикальная прокрутка;
ssBoth – Установленs две полосы прокрутки.
ReadOnly - разрешает или запрещает редактирование текста. (Программно все равно текст можно добавлять).
MaxLength - максимальная длина текста в поле Мето, значение 0 снимает ограничения длины
|
Компонент Listbox (вкладка Standard на палитре компонентов) предназначен для хранения и обработки текстовых данных.
- Каждая строка Listbox сохраняет строку данных в формате String.
- .Доступ в строки предоставляет свойство Items этого компонента.
3. Для добавления строки в список программным путем назначен метод Add. Синтаксис его вызова таков: ListBox1.Items.Add ( 'Новая строка');
4.Добавить в список ListBox значение выражения 2 * х: ListBox1.ltems.Add (IntToStr (2 * x))
5. Чтобы очистить содержимое списка, для элемента управления ListBox вызывают метод Clear: ListBox1.Clear;
6. Свойство Count сохраняет количество строк, добавленных в список.
|
Методы компонента Memo:
1. Для создания новых строк служат методы:
- Add () - Memo1.Lines.Add ()
- Lines.Append - aнгл. Append - добавлять,что добавляет в многострочное текстовое поле новую строку и выводит в нее значение параметра, указанного в скобках
2. Добавления новой строки в конец списка - Insert ():
Memo1.Lines.lnsert (N, Text) - вставка строки Text перед строкой с индексом N
3. Добавить элементы в массив Memo1.Lines:
- Memo1.Lines.Add ( 'Это будет последняя строка');
- Memo1.Lines.lnsert (2, 'Эта строка будет третьей'); //Отсчет от нуля!
4. Memo имеет метод Delete () для извлечения строки: Memo1.Lines.Delete (i) // Удаление строки с индексом
5. Для очистки всего содержимого поля Memo предназначен метод Clear - Memo1.Clear;
|
Рассмотрим создание, ввод и вывод элементов одномерных массивов на конкретных примерах.
Использование компонента TMemo для ввода и компонента TListBox для вывода значений элементов одномерного массива.
Пример 1 Ввести значения элементов табличной величины из 10 чисел, находящихся в рядках Memo1, возвести в квадрат и вывести их в другое многострочное текстовое поле.(Для практики использования многострочных полей будем выводить элементы массива как в поле ListBox1 так и в поле Memo2 )
Интерфейс проекта

Ввод значений в текстовое поле Memo1 можно выполнять:
-
C клавиатуры, присвоив свойству ReadOnly значение false; (Но если закрыть окно выполнения проекта и затем еще раз запустить проект на выполнение, то нужно будет снова вводить числа в строки первого многострочного текстового поля.)
- Предварительно ввести числа в многострочное текстовое поле к запуску проекта на выполнение.. Для этого нужно:
- выбрать многострочное текстовое поле;
- в конце строки Lines окна Инспектор объектов выбрать кнопку...;
- в окне Редактор строк удалить текст первой строки и ввести 10 цифр;
- выбрать кнопку ОК.
(Тогда при сохранении проекта эти значения также сохранятся и автоматически появятся в многострочном текстовом поле после запуска проекта на выполнение.)
Выберем второй способ ввода данных в Memo1.
Определимся в следующем:
1. установим значение свойства Read Only в false для memo1:
- разрешение редактирования пользователем строк многострочного поля
2. выберем способ вывода данных в многострочное поле memo1:
или
- memo2.Lines[i]:= floattostr(a[i]);{ для вывода значений элементов массива в строки поля memo2 можно воспользоваться командой присваивания}
3. для вывод данных в многострочное поле tlistbox воспользуемся методом Add:
- ListBox1.Items.Add( floatToStr(a[i])); { вывести значение элементов массива в строки многострочного поля ListBox1 применив метод Add}
Замена значений всех элементов массива
Алгоритм решения задачи: последовательно перебрать все элементы массива и значение очередного элемента изменить по определенному правилу например,
- изменить знак элементов на противоположный
- предоставить всем элементам нулевые значения
- увеличить значение всех элементов на определенную величину
|
Программный код
procedure TForm1.Button1Click(Sender: TObject);
var a: array[0..9] of real; i:integer;
begin
for i:= 0 to 9 do a[i]:= strtofloat(memo1.Lines[i]); { данные из строк многострочного текстового поля memo1 перевести в числа и присвоить соответствующим элементам массива }
for i:= 0 to 9 do a[i]:=a[i]*a[i]; // изменение значений элементов массива, возведение в степень
memo2.Clear; // очистить второе многострочное поле
ListBox1.Clear; // очистить многострочное поле ListBox1
for i:= 0 to 9 do
begin
memo2.Lines.Append(floattostr(a[i]));{для вывода значений элементов массива в строки поля memo2 применяем метод Append или метод Add}
ListBox1.Items.Add( floatToStr(a[i])); { вывести значение элементов массива в строки многострочного поля ListBox1 применив метод Add}
end;
end;
|
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear; memo2.Clear;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
form1.Close;
end;
|
Замена значений элементов массива с проверкой условия
Алгоритм решения задачи:
- последовательно перебрать все элементы массива;
- если очередной элемент соответствует некоторому условию, его значение изменить по определенному правилу.
Как условие может проверяться:
- значение элемента массива на кратность некоторому числу, положительность, равенство нулю и тому подобное.
- также и значение индекса элемента массива (например, меняются элементы, стоящие на четных местах).
Например,
1. Отрицательные элементы массива А заменить числом 25:
For i: = 1 to N do If A [i] <0 Then A [i]: = 25;
2. Элементы массива А, имеющие четные индексы, заменить нулем:
For i: = 1 to N do If i mod 2 = 0 Then A [i]: = 0;
|
Поиск элементов массива с заданными свойствами
| |