Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования в Delphi. Учебно-методическое пособие
.pdf
Основы программирования в Delphi
Рис. 5.1 Сумма элементов арифметической прогрессии
Обработчик нажатия на кнопке Вычислить имеет вид:
procedure TForm1.Button1Click(Sender: TObject);
var A_0, A_N, d, Summa: real;
N, i: integer;
begin
A_0:= StrToFloat(Edit1.Text);
d:= StrToFloat(Edit2.Text);
N:= StrToInt(Edit3.Text);
Summa:= 0;
for i := 1 to N do
begin
A_N:= A_0 + d*(i-1);
Summa:= Summa + A_N;
end;
Edit4.Text:= FloatToStr(Summa);
end;
41

Основы программирования в Delphi
5.2 Цикл с предусловием while
Оператор for удобно применять, когда заранее известно, сколько раз тре-
буется выполнить тело цикла. Но в большом количестве задач цикл приходится
выполнять неизвестное число раз. Например, вычисление значения функции
итерационным методом, пока не достигается заданная точность. В таких случа-
ях правильнее использовать условный оператор цикла while, который имеет
следующий формат записи:
while условие do
тело_цикла;
Примечание. Если в теле цикла два и более операторов, то их необходимо
заключить в операторные скобки. Роль операторных скобок в языке Delphi играет конструкция begin…end.
Тело цикла будет выполняться, пока истинно условие. В качестве примера
рассмотрим расчет суммы десяти значений массива М:
var i: integer;
sum: real;
M: array [1 .. 10] of real;
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
i := 1; sum := 0;
while i <= 10 do
begin
sum := sum + M [i];
i := i +1;
end;
5.3 Цикл с постусловием repeat-until
Иногда циклическая часть ложна, но должна выполняться хотя бы один
раз. Для этого условие выхода из цикла надо проверить в конце циклической
части. Именно так устроен оператор repeat … until, имеющий формат:
repeat
тело_цикла
until условие;
42

Основы программирования в Delphi
Циклическая часть выполняется до тех пор, пока логическое выражение
условие не примет значение True, то есть тело цикла повторяется при значении
условия, равном False.
Примечание. Если в теле цикла два и более операторов, то их необходимо
заключить в операторные скобки. Роль операторных скобок в языке Delphi играет конструкция begin…end.
Команда прерывания цикла
Иногда, в теле цикла при выполнении некоторого условия бывает необхо-
димо немедленное завершение цикла. Для этого можно использовать оператор
break. Например, если в строке S требуется найти номер первого пробела, мож-
но применить следующие операторы:
N := 0;
for i := 1 to Length (S) do
if S [i] = „ „ then
begin
N := i;
Break;
end;
if N > 0 then . . . //тогда в строке существует пробел
Команда продолжения цикла
В Pascal имеется команда, по своему действию противоположная команде
прерывания цикла (оператор continue). Она позволяет немедленно продолжить
выполнение цикла начиная с первого оператора циклического участка, пропу-
стив все оставшиеся операторы в теле цикла.
C помощью оператора continue предыдущий пример можно записать следующим образом:
N:= 0;
for i:= 1 to Length (S) do
begin
if S [i] <> „ „ then Continue;
N:= i;
Break;
end;
if N > 0 then . . . //тогда в строке существует пробел
43

Основы программирования в Delphi
При очередном выполнении тела цикла сначала произойдет проверка те-
кущего символа на равенство пробелу, и если это не пробел, то выполнится команда продолжения цикла – все последующие операторы будут пропущены, а
счетчик примет новое значение.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. В чем особенность оператора цикла for?
2. Чем отличается цикл с предусловием от цикла с постусловием?
3. Назовите команды прерывания и продолжения цикла.
4. Приведите примеры циклических вычислений.
5. В каком случае удобно использовать цикл for?
ВИДЕО-УРОК 4
https://youtu.be/KDsr1411FnY
44

Основы программирования в Delphi
6. ПРОГРАММИРОВАНИЕ МАССИВОВ В DELPHI
Массив – это упорядоченный набор однотипных элементов, объединенных
под общим именем. Массивы используются практически во всех языках программирования, в том числе и в Delphi. Для обращения к элементу массива используется имя массива, за которым в квадратных скобках указывается один
или несколько индексов, разделенных запятыми, например a[1] или b[7]. В
качестве индекса элемента массива можно использовать любые порядковые ти-
пы языка за исключением типа LongInt. Можно сказать, что массив является
аналогом векторов и матриц из курса линейной алгебры. Все элементы в масси-
ве имеют одинаковый тип. Доступ к элементам массива осуществляется по ин-
дексу (порядковому номеру). В зависимости от количества индексов массивы
подразделяют на одномерные, двумерные, трехмерные и т.д. Необходимо отме-
тить, что на практике чаще всего используются одномерные массивы и двумер-
ные массивы, которые представляют из себя таблицы.
6.1 Одномерные массивы
Объявление массива в Delphi 7 можно организовать двумя способами.
1-й способ. Массив объявляется в разделе описания переменных.
Например:
var
MyArray: array [5 .. 100] of integer;
Слова array (массив) и of – ключевые. Диапазон определяет нижнюю и
верхнюю границы индекса массива и, соответственно, число элементов в нем.
Заметим, что в Pascal индекс массивов может находиться в любом диапазоне.
Например, в нашем примере индекс меняется с 5 до 100 (всего 96 элементов).
При обращении к массиву индекс должен лежать в этом диапазоне. Индекс массива указывается после имени массива в квадратных скобках. Например, работа с вышеобъявленным массивом выглядит так:
var
MyArray: array [5..100] of integer
begin
MyArray [5]:= 200;
MyArray [87]:= 13 div 4;
45

Основы программирования в Delphi
2-й способ. Новый тип-массив объявляется в разделе объявления типов
(после ключевого слова type). Затем, в разделе объявления переменных объявляется переменная этого типа.
Например:
type
TMyArray: array [0 .. 100] of integer;
var
MyArray, A1: TMyArray; // Обьявлены два массива
Такое объявление особенно удобно в случае, если необходимо копировать
значения элементов одного массива к элементам другого массива. Например,
type
TMyArray: array [0 .. 100] of integer;
var
MyArray, A1: TMyArray; // Обьявлены два массива
begin
. . . . . . . . . . . . . . . . // Здесь определяются элементы массива А1
MyArray := A1;
Элементы массива могут использоваться в программах так же, как и обычные переменные. Например:
var
a: array [1 .. 50] of integer
begin
f:=2*a[3]+a[s[4]+1]*3;
a[n]:=1+sqrt(abs(a[n-1]));
end;
Строковые данные формально представляют собой одномерные массивы
символов, и к элементам строк можно обращаться с помощью индексов. Это
позволяет выделить конкретные символы и менять их значения. Отсчет симво-
лов для переменных типа string начинается с единицы.
var
S: string;
begin
S:=„54321‟ ;
S [5]:= „0‟; // в строке окажется значение „54320‟
46

Основы программирования в Delphi
6.2 Компонент TStringGrid
При работе с массивами ввод и вывод информации на экран удобно орга-
низовывать в виде таблиц. В Delphi имеется компонент TStringGrid, который
предназначен для отображения информации в виде двумерной таблицы, каждая
ячейка которой представляет собой окно однострочного редактора. Доступ к
информации осуществляется с помощью свойства Cells[ACol:Integer;
ARow:Integer]: String, где ACol, ARow - индексы элемента двумерного массива.
Свойства ColCount и RowCount позволяют установить количество столбцов и
строк в таблице, а свойства FixedCols и FixedRows задают количество столбцов
и строк фиксированной зоны компонента. Фиксированная зона компонента
TStringGrid выделяется другим цветом, и в нее знельзя вводить информацию
пользователем. Для установки компонента TStringGrid на форму необходимо на
странице Additional меню компонентов щелкнуть мышью по пиктограмме. После этого щелкните мышью на нужном месте формы. По умолчанию в компонент TStringGrid запрещен ввод информации с клавиатуры, поэтому необходимо в инспекторе объектов на вкладке Properties раскрыть раздел Options (нажав
на знак “+”, стоящий слева от Options) и свойство goEditing установить в положение True. Рассмотрим небольшой пример с использованием компонента
TStringGrid.
Пример. Ввод и обработка элементов одномерного массива.
На форме установим компонент StringGrid для ввода элементов масси-
ва, командную кнопку и поля меток для вывода результата обработки (рис.
6.1).
47

Основы программирования в Delphi
Рис. 6.1 Вычисление среднего арифметического в массиве
Необходимо установить следующие значения свойств компонента StringGrid:
1) ColCount=5 и RowCount=1 - определяют количество столбцов и строк таб-
лицы;
2) FixedCols=0 и FixedRows=0 - определяют число фиксированных, не прокру-
чиваемых столбцов и строк. Эти строки и столбцы оформлены в виде заголовка таблицы.
3) Свойство Options является множеством, определяющим многие свойства
таблицы. Для возможности редактирования содержимого таблицы присвойте элементу goEditing значение True.
4) Свойство Cells[номер столбца, номер строки] позволяет ссылаться на
нужную ячейку таблицы.
При нажатии на кнопке Вычислить в поле меток должна отражаться
сумма и среднее значение элементов массива. Для этого обработчик события
щелчок на кнопке должен иметь вид:
procedure TForm1.Button1Click(Sender: TObject);
var
a: array[1..5] of integer; // массив
sum: integer; // сумма элементов
sr: real; // среднее арифметическое
i: integer; // индекс
begin
// ввод массива, считаем, что если ячейка пустая,
// то соответствующий ей элемент массива равен нулю
for i:= 1 to 5 do
if Length (StringGrid1.Cells [i-1, 0]) < > 0
then a[i] := StrToInt(StringGrid1.Cells[i-1,0])
else a[i] := 0;
// обработка массива
sum:= 0;
for i:=1 to 5 do
sum := sum + a[i];
sr:= sum / 5;
48

Основы программирования в Delphi
// вывод результата
Label1.Caption:=
'Сумма элементов: ' + IntToStr(sum) + #13+
'Среднее арифметическое: ' + FloatToStr(sr);
end;
При вводе элементов массива должны обрабатываться только нажатия на
цифровых клавишах. Для этого удобно использовать обработчик события
OnKeyPressed для компонента StringGrid1.
Событие OnKeyPressed происходит при нажатии клавиши клавиатуры.
ASCII-код нажатой клавиши передается в виде переменной Key. Обработчик
этого события должен обрабатывать этот код, как этого желает программист. В
приведенном ниже обработчике исключается ошибки ввода: если вводятся не
цифры, то коды этих символов заменяется на невидимый символ ASCII 0.
procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
begin
case Key of
#8,'0'..'9' : ; //цифры и <Back Space> остаются без изменений
#13: // <Enter> - если возможно, то переход на следующую ячейку
if StringGrid1.Col < StringGrid1.ColCount - 1
then StringGrid1.Col := StringGrid1.Col + 1;
'.',',': Key := DecimalSeparator;
else key := Char(0); // остальные символы
end; //end of case
end;
6.3 Многомерные (двумерные) массивы
Объявление многомерного массива также можно определить двумя спосо-
бами: в разделе var или в разделе type и затем в разделе var. Например, объявление переменной – двумерного массива выглядит следующим образом:
var
MyArray = array [5 .. 40, 0 .. 20 ] of integer;
49

Основы программирования в Delphi
Как видно, пределы изменения каждого измерения задаются через запятую. При доступе к элементам массива значения индексов также перечисляют-
ся через запятую:
var
MyArray = array [5 .. 40, 0 .. 20 ] of integer;
begin
A2 [2, 5]:= 45; // 2-я строка, 5-й столбец
A2 [30, 0]:= 27;
Пример. Ввод и обработка элементов двумерного массива. Нахождение
суммы модулей элементов двумерного массива. Как обычно используем
компонент StringGrid (рис. 6.2).
Рис. 6.2 Вычисление суммы модулей элементов
двумерного массива
Программный код кнопки Вычислить выглядит следующим образом:
procedure TForm1.Button1Click(Sender: TObject);
var a:array[1..5,1..5] of Integer;
i,j,S:Integer;
begin
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
