Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИНФ_ЛЕКЦИИ_(1 С)_2011.doc
Скачиваний:
5
Добавлен:
16.04.2019
Размер:
898.56 Кб
Скачать

Имя массива [ индекс ]

В качестве индекса можно использовать константу, переменную или выражение, соответствующие типу индексов, объявленному в опи­сании массива.

Пример 5.3

b[100], c[k], yes[j+2]

Приведены обращения к элементам массивов с именами b, c и yes. Значения переменных k и j должны быть определены заранее.

Ввод и вывод одномерных массивов. Для ввода и вывода всего массива или его части используют операторы цикла, как правило, оператор for.

Пример 5.4

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-й.

Отдельные элементы массивов вводятся так же, как и простые переменные.

5.2. Организация циклов с использованием массивов

Задачи такого рода являются весьма распространёнными в вы­числительной практике, и программировать их можно с использованием любого из трёх описанных выше операторов цикла. Но наилучшим для этой цели часто является оператор for. Ниже приведены примеры организации циклических вычислитель­ных процессов с помощью оператора for.

Пример 5.5. Дан вектор a, содержащий 50 компонент. Вычислить сумму его элементов.

Вначале надо ввести массив в компьютер, затем – вычислить сумму элементов. Как и любая сумма нескольких чисел, данная сумма вычисляется методом накопления.

var

I: integer;

s: real;

a : array [1..50] of real;

begin

write ('введите массив ');

for i:=1 to 50 do read(a[i]);

s:=0; { обнуление ячейки s, предназна­ченной

для накопления суммы }

for i:=1 to 50 do s := s + a[i];

{ накопление суммы элементов массива }

writeln ('s=', s:10:3)

end.

Пример 5.6. Дан вектор b, содержащий 100 компонент. Найти наибольший элемент этого вектора.

Суть алгоритма задачи в следующем. Используется переменная с именем мах, в которой в каждый момент выполнения программы содержится максимум из уже просмотренных элементов (текущий максимум). Вначале мах равна первому элементу b[1]. Перебираются все элементы массива, и если встречается элемент больше мах, то его значение присваивается мах.

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.

Пример 5.7. Дан массив вещественных чисел A(10). Упорядочить этот массив по возрастанию его элементов, т.е. сделать так, чтобы каждый следующий элемент массива оказался бы больше предыдущего.

Рассмотрим один из наиболее простых алгоритмов, разработанных для задач такого рода, так называемый “метод пузырька”. Идея этого алгоритма заключается в том, что сравниваются два соседних элемента исходного массива – сначала a1 c a2, потом a2 c a3, далее a3 с a4 и т.д. Если первый элемент в паре больше второго, то меняют их численные значения, в результате чего первый элемент получает значение второго, а второй – первого. В противном случае никаких замен в паре не производят, а переходят к сравнению элементов второй пары. Каждая перестановка элементов фиксируется, т.е. при перестановке увеличивается значение специальной переменной kP.

Как поменять местами содержимое a[i] и a[i+1]? Задача кажется достаточно простой – надо записать два оператора

a[i] := a[i+1]; a[i+1] := a[i];

Однако, предположим, что значение a[i] равно 1, а a[i+1] – 10. Тогда при выполнении первого присваивания a[i] станет равным 10, так же, как и a[i+1], а старое значение a[i] потеряется. Значит, это вариант выполнения не годится.

Вспомним известную головоломку о двух стаканах: один стакан наполнен водой, другой – вином. Как поменять местами их содержимое. Наверняка все знают, что для решения задачи нужен третий, пустой стакан. Сначала из стакана с вином выливают содержимое в третий стакан, освобождая первый стакан, затем воду из второго стакана выливают в свободный первый стакан, и, наконец, из третьего стакана выливают вино в освободившийся второй. Аналогично решается задача и с элементами массива. Роль «третьего стакана» сыграет вспомогательная переменная b, а решение сведется к следующей последовательности операторов:

b := a[i]; { «освобождаем» первый элемент, сохраняя его

содержимое в «третьем стакане»}

a[i]:= a[i+1]; { переписываем значение 2-го элемента в 1-й }

a[i+1]:=b; { восстанавливаем сохраненное содержимое }

Вернёмся к алгоритму упорядочивания. В результате выполнения всего алгоритма происходит как бы постепенное «проталкивание» наибольшего элемента в конец массива (как пузырек воздуха в воде всплывает наверх – отсюда название метода), причем функцию «толкача» в алгоритме выполняет внутренний цикл. Как только наибольший элемент массива займет предназначенное ему последнее 10-е место, описанную процедуру повторяют с оставшимися неупорядоченными 9-ю элементами, в результате чего наибольший из оставшихся элемент займет последнее место в массиве и т.д.

Для получения нужного результата такую процедуру повторяют до тех пор, пока после очередного просмотра массива не получим число перестановок kP = 0. Это означает, что весь массив упорядочен, и надо заканчивать выполнение программы.

const n = 10;