Глава 3 Более сложные элементы языка
____________________________________________________________________
day[2]:= 0.34;
Другими словами, каждый элемент массива определяется именем массива и номером элемента в квадратных скобках. Говорят еще индекс массива. При-
чем в качестве индекса можно использовать арифметическое выражение целого типа.
В описании массива после имени в квадратных скобках указывается ми-
нимальное значение индекса, затем две точки без пробелов и максимальное значение индекса. В нашем случае массив day состоит из 365 элементов, ну-
мерация идет от 1 до 365 т.е. шаг нумерации по умолчанию всегда равен 1.
При использовании массивов запись программы становится намного коро-
че и наглядней.
Пусть, например, в начале, все элементы массива day должны быть при-
равнены 0.
Вместо того, чтобы писать
day[1]:= 0; day[2]:= 0;
и т.д.
day[365]:= 0;
мы можем поступить следующим образом:
var
day: array[1..365] of real; k: integer;
begin
for k:= 1 to 365 do day[k]:= 0;
Пример.
Пусть имеются 2 массива типа string. В одном массиве содержатся фа-
милии людей, а в другом номера их домашних телефонов. Написать программу,
191
3.4 Массивы
____________________________________________________________________
которая в цикле по номеру телефона выводит на экран фамилию этого абонен-
та.
program phone_1; {$mode objfpc}{$H+} uses
CRT, FileUtil, SysUtils; var
name: array[1..50] of string[30]; tel: array[1..50] of string[3]; k: integer;
phone: string[3]; begin
for k:=1 to 50 do begin
writeln(UTF8ToConsole('Введите фамилию')); readln(name[k]); writeln(UTF8ToConsole('Введите номер телефона')); readln(tel[k]);
{Удаляем ведущие и ведомые ("хвостовые") пробелы}
tel[k]:= Trim(tel[k]);
end;
writeln(UTF8ToConsole('Ввод данных закончен')); writeln(UTF8ToConsole('Для поиска абонента введите')); writeln(UTF8ToConsole('номер его телефона')); writeln(UTF8ToConsole('Для выхода из программы')); writeln(UTF8ToConsole('введите ''***'''));
phone:= '';
while phone <> '***' do
192
Глава 3 Более сложные элементы языка
____________________________________________________________________
begin
writeln(UTF8ToConsole('Введите номер телефона'));
readln(phone);
for k:= 1 to 50 do
if tel[k] = phone then
writeln(UTF8ToConsole('Фамилия этого абонента '),
name[k]);
end;
end.
Недостаток этой программы в том, что если указанный номер телефона в массиве не существует, то никаких сообщений на этот счет на экран не выво-
дится. Кроме того, после того как найден абонент, например для k=2, програм-
ма ещѐ 48 раз прокрутит цикл. Как модифицировать программу?
program phone_2; {$mode objfpc}{$H+} uses
CRT, FileUtil, SysUtils; var
name: array[1..50] of string[30]; tel: array[1..50] of string[7]; k: integer;
phone: string[7]; found: boolean;
begin
for k:= 1 to 50 do begin
writeln(UTF8ToConsole('Введите фамилию'));
193
3.4 Массивы
____________________________________________________________________
readln (name[k]);
writeln(UTF8ToConsole('Введите номер телефона'));
readln(tel[k]);
{Удаляем ведущие и ведомые ("хвостовые") пробелы}
tel[k]:= Trim(tel[k]);
end;
writeln(UTF8ToConsole('Ввод данных закончен')); writeln(UTF8ToConsole('Для поиска абонента введите')); writeln(UTF8ToConsole('номер его телефона')); writeln(UTF8ToConsole('Для выхода из программы')); writeln(UTF8ToConsole('введите ''***'''));
phone:= '';
while phone <> '***' do begin
found:= false;
writeln(UTF8ToConsole('Введите номер телефона')); readln(phone);
for k:= 1 to 50 do
if tel[k]= phone then begin
writeln(UTF8ToConsole('Фамилия этого абонента '), name[k]);
found:= true; break;
end;
if not found then
writeln(UTF8ToConsole('Абонента с таким номером нет')); end;
end.
194
Глава 3 Более сложные элементы языка
____________________________________________________________________
Здесь мы ввели булевую переменную found, которой присваиваем значе-
ние true, если абонент с указанным номером найден. Затем мы "досрочно"
выходим из цикла for командой break. Во внешнем цикле, если абонент не найден, выводим соответствующее сообщение на экран.
Если вы несколько раз запускали программу, то могли видеть, что каждый раз приходится заново вводить фамилии и телефоны. Вводить их при каждом новом прогоне программы явно неудобно. Единственный выход – сохранить введенные данные в файле. Но, поскольку, мы еще использование файлов в Паскале не изучали, введем признак окончания ввода. Договоримся, что если вместо очередной фамилии мы введем строку '***', то это означает, что ввод данных закончен. Теперь мы можем вводить лишь несколько фамилий и теле-
фонов только для того, чтобы убедиться в работоспособности программы.
program phone_3; {$mode objfpc}{$H+} uses
CRT, FileUtil, SysUtils; var
name: array[1..50] of string[30]; tel: array[1..50] of string[7]; fam: string[30];
k, n: integer; phone: string[7]; found: boolean;
begin n:= 0;
writeln(UTF8ToConsole('Введите фамилию')); writeln(UTF8ToConsole('Чтобы закончить ввод введите "***"'));
for k:= 1 to 50 do
195