- •Глава 7. Программирование циклических вычислительных процессов
- •7.1. Оператор цикла с предусловием while
- •7.2. Оператор цикла с постусловием repeat
- •2) Вычисляется логическое выражение l, результат вычисления анализируется;
- •X, y, dx, a, b : real;
- •7.3. Оператор цикла с параметром for
- •7.4. Одномерные массивы и их описание
- •7.4.1. Обращение к элементу массива
- •7.4.2. Ввод и вывод одномерных массивов
- •7.4.3. Организация циклов с использованием массивов
- •Пример 7.13
- •7.5. Вопросы для самоконтроля
7.4.1. Обращение к элементу массива
Массивы не могут обрабатываться целиком за исключением единственного случая, когда они используются в операторе присваивания, например, а:=b, если их типы эквивалентны. Для того, чтобы получить доступ к элементу массива, нужно записать обращение к нему, которое выглядит как
имя массива[индекс].
В качестве индекса можно использовать константу, переменную или выражение, соответствующие типу индексов, объявленному в описании массива.
Пример 7.7
b[100], c[k], yes[j+2]
Приведены обращения к элементам массивов с именами b, c и yes. Значения переменных k и j должны быть определены заранее.
________________________________________________________
7.4.2. Ввод и вывод одномерных массивов
Для ввода и вывода всего массива или его части используют операторы цикла, как правило, оператор for.
Пример 7.8
var
z : array [10..100] of integer;
k : integer;
begin
for k := 10 to 100 do read (z [ k ]);
for k := 21 to 30 do write (z [ k ]);
В приведенном фрагменте программы вводятся все элементы массива z целого типа, а выводятся 10 его элементов - с 21-го по 30-й.
________________________________________________________
Отдельные элементы массивов вводятся так же, как и простые переменные.
7.4.3. Организация циклов с использованием массивов
Задачи такого рода являются весьма распространёнными в вычислительной практике и программировать их можно с использованием любого из трёх описанных выше операторов цикла. Но наилучшим для этой цели часто является оператор for. Однако, каким бы оператором мы ни пользовались, всегда нужно иметь в виду следующее.
1. Существуют два варианта выхода из цикла, не противоречащих логике циклического вычислительного процесса. Выход может быть осуществлён либо после достижения параметром цикла своего предельного значения, либо до этого момента, если такая необходимость диктуется условием задачи.
Пример 7.9
Дан массив c(20), содержащий положительные и отрицательные элементы. Вывести порядковый номер первого отрицательного элемента массива.
program example79;
var
c : array [1..20]of real;
n : integer;
begin
write ('введите массив - ');
for n:=1 to 20 do read ( c [ n ]); readln;
n:=1;
{поиск первого отрицательного элемента}
while (n <= 20) and (c [ n ] > 0) do n := n + 1;
if n <= 20 then {печать номера первого отри-}
write ('n=' ,n) {цательного элемента массива}
else write ('отрицательных элементов нет');
end.
Цикл выполняется пока встречаются положительные элементы и индекс элемента на вышел за верхнюю границу массива. Поскольку выход из цикла произойдет после нарушения одного из этих условий, то в операторе if стоит проверка по какому из них был завершен цикл.
2. Вход в тело цикла извне, минуя оператор цикла, запрещён.
Ниже приведены примеры организации циклических вычислительных процессов с помощью оператора for.
Пример 7.10
Дан вектор a(50). Вычислить сумму его элементов. Алгоритм задачи приведён в первой главе (см. пример 1.14).
program example710;
var
i: integer;
s: real;
a : array [1..50] of real;
begin
write ('введите массив -');
for i:=1 to 50 do read(a[i]);
s:=0; {oбнуление ячейки s, предназначенной
для накопления суммы}
for i:=1 to 50 do s := s + a [ i ];
{накопление суммы элементов массива}
writeln ('s=', s:10:3)
end.
Пример 7.11
Дан целочисленный вектор b(100). Найти наибольший элемент этого вектора. Алгоритм задачи приведён в первой главе (см. пример 1.15).
program example711;
var max : real;
i : integer;
b : array [1..100] of real;
begin
write ('введите массив - ');
for i:=1 to 100 do read (b [ i ]); readln;
max:=b [1]; {присваивание временному максимуму
max его начального значения }
{поиск элемента вектора с наибольшим значением}
for i:=2 to 100 do
if b [ i ] > max then max := b [ i ];
writeln ('max=', max:10:3)
end.
В примерах 7.10 и 7.11 параметр цикла i выполняет роль счетчика числа повторений тела цикла и индекса элемента массива.
Пример 7.12
Вычислить произведение первых n чисел натурального ряда (произведение это носит название факториала и обозначается n!).
Схема алгоритма
program example712;
var nf, n, k : integer;
begin
write ('введите n - '); readln ( n );
nf:=1; {присваивание факториалу его
начального значения}
{вычисление значения факториала}
for k:=1 to n do nf := nf * k;
write ('n!=', nf:10:0)
end.
В программе параметр цикла k служит не только счётчиком повторений тела цикла, но и непосредственно участвует в вычислении факториала в качестве простой переменной, которая последовательно принимает значения чисел натурального ряда 1, 2, 3 и т.д.